MAJ Librarys
This commit is contained in:
parent
1d3ed3af6d
commit
03ef74d0cf
17 changed files with 347 additions and 194 deletions
|
@ -39,8 +39,8 @@ class EachPromiseTest extends \PHPUnit_Framework_TestCase
|
|||
|
||||
public function testIsWaitable()
|
||||
{
|
||||
$a = new Promise(function () use (&$a) { $a->resolve('a'); });
|
||||
$b = new Promise(function () use (&$b) { $b->resolve('b'); });
|
||||
$a = $this->createSelfResolvingPromise('a');
|
||||
$b = $this->createSelfResolvingPromise('b');
|
||||
$called = [];
|
||||
$each = new EachPromise([$a, $b], [
|
||||
'fulfilled' => function ($value) use (&$called) { $called[] = $value; }
|
||||
|
@ -54,7 +54,7 @@ class EachPromiseTest extends \PHPUnit_Framework_TestCase
|
|||
public function testCanResolveBeforeConsumingAll()
|
||||
{
|
||||
$called = 0;
|
||||
$a = new Promise(function () use (&$a) { $a->resolve('a'); });
|
||||
$a = $this->createSelfResolvingPromise('a');
|
||||
$b = new Promise(function () { $this->fail(); });
|
||||
$each = new EachPromise([$a, $b], [
|
||||
'fulfilled' => function ($value, $idx, Promise $aggregate) use (&$called) {
|
||||
|
@ -291,4 +291,46 @@ class EachPromiseTest extends \PHPUnit_Framework_TestCase
|
|||
}
|
||||
$this->assertEquals(range(0, 9), $results);
|
||||
}
|
||||
|
||||
private function createSelfResolvingPromise($value)
|
||||
{
|
||||
$p = new Promise(function () use (&$p, $value) {
|
||||
$p->resolve($value);
|
||||
});
|
||||
|
||||
return $p;
|
||||
}
|
||||
|
||||
public function testMutexPreventsGeneratorRecursion()
|
||||
{
|
||||
$results = $promises = [];
|
||||
for ($i = 0; $i < 20; $i++) {
|
||||
$p = $this->createSelfResolvingPromise($i);
|
||||
$pending[] = $p;
|
||||
$promises[] = $p;
|
||||
}
|
||||
|
||||
$iter = function () use (&$promises, &$pending) {
|
||||
foreach ($promises as $promise) {
|
||||
// Resolve a promises, which will trigger the then() function,
|
||||
// which would cause the EachPromise to try to add more
|
||||
// promises to the queue. Without a lock, this would trigger
|
||||
// a "Cannot resume an already running generator" fatal error.
|
||||
if ($p = array_pop($pending)) {
|
||||
$p->wait();
|
||||
}
|
||||
yield $promise;
|
||||
}
|
||||
};
|
||||
|
||||
$each = new EachPromise($iter(), [
|
||||
'concurrency' => 5,
|
||||
'fulfilled' => function ($r) use (&$results, &$pending) {
|
||||
$results[] = $r;
|
||||
}
|
||||
]);
|
||||
|
||||
$each->promise()->wait();
|
||||
$this->assertCount(20, $results);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -172,6 +172,18 @@ class PromiseTest extends \PHPUnit_Framework_TestCase
|
|||
$this->assertEquals('Whoop', $p->wait());
|
||||
}
|
||||
|
||||
public function testWaitsOnAPromiseChainEvenWhenNotUnwrapped()
|
||||
{
|
||||
$p2 = new Promise(function () use (&$p2) {
|
||||
$p2->reject('Fail');
|
||||
});
|
||||
$p = new Promise(function () use ($p2, &$p) {
|
||||
$p->resolve($p2);
|
||||
});
|
||||
$p->wait(false);
|
||||
$this->assertSame(Promise::REJECTED, $p2->getState());
|
||||
}
|
||||
|
||||
public function testCannotCancelNonPending()
|
||||
{
|
||||
$p = new Promise();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue