You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
171 lines
4.0 KiB
171 lines
4.0 KiB
<?php |
|
|
|
namespace React\Promise; |
|
|
|
class FunctionResolveTest extends TestCase |
|
{ |
|
/** @test */ |
|
public function shouldResolveAnImmediateValue() |
|
{ |
|
$expected = 123; |
|
|
|
$mock = $this->createCallableMock(); |
|
$mock |
|
->expects($this->once()) |
|
->method('__invoke') |
|
->with($this->identicalTo($expected)); |
|
|
|
resolve($expected) |
|
->then( |
|
$mock, |
|
$this->expectCallableNever() |
|
); |
|
} |
|
|
|
/** @test */ |
|
public function shouldResolveAFulfilledPromise() |
|
{ |
|
$expected = 123; |
|
|
|
$resolved = new FulfilledPromise($expected); |
|
|
|
$mock = $this->createCallableMock(); |
|
$mock |
|
->expects($this->once()) |
|
->method('__invoke') |
|
->with($this->identicalTo($expected)); |
|
|
|
resolve($resolved) |
|
->then( |
|
$mock, |
|
$this->expectCallableNever() |
|
); |
|
} |
|
|
|
/** @test */ |
|
public function shouldResolveAThenable() |
|
{ |
|
$thenable = new SimpleFulfilledTestThenable(); |
|
|
|
$mock = $this->createCallableMock(); |
|
$mock |
|
->expects($this->once()) |
|
->method('__invoke') |
|
->with($this->identicalTo('foo')); |
|
|
|
resolve($thenable) |
|
->then( |
|
$mock, |
|
$this->expectCallableNever() |
|
); |
|
} |
|
|
|
/** @test */ |
|
public function shouldResolveACancellableThenable() |
|
{ |
|
$thenable = new SimpleTestCancellableThenable(); |
|
|
|
$promise = resolve($thenable); |
|
$promise->cancel(); |
|
|
|
$this->assertTrue($thenable->cancelCalled); |
|
} |
|
|
|
/** @test */ |
|
public function shouldRejectARejectedPromise() |
|
{ |
|
$expected = 123; |
|
|
|
$resolved = new RejectedPromise($expected); |
|
|
|
$mock = $this->createCallableMock(); |
|
$mock |
|
->expects($this->once()) |
|
->method('__invoke') |
|
->with($this->identicalTo($expected)); |
|
|
|
resolve($resolved) |
|
->then( |
|
$this->expectCallableNever(), |
|
$mock |
|
); |
|
} |
|
|
|
/** @test */ |
|
public function shouldSupportDeepNestingInPromiseChains() |
|
{ |
|
$d = new Deferred(); |
|
$d->resolve(false); |
|
|
|
$result = resolve(resolve($d->promise()->then(function ($val) { |
|
$d = new Deferred(); |
|
$d->resolve($val); |
|
|
|
$identity = function ($val) { |
|
return $val; |
|
}; |
|
|
|
return resolve($d->promise()->then($identity))->then( |
|
function ($val) { |
|
return !$val; |
|
} |
|
); |
|
}))); |
|
|
|
$mock = $this->createCallableMock(); |
|
$mock |
|
->expects($this->once()) |
|
->method('__invoke') |
|
->with($this->identicalTo(true)); |
|
|
|
$result->then($mock); |
|
} |
|
|
|
/** @test */ |
|
public function shouldSupportVeryDeepNestedPromises() |
|
{ |
|
$deferreds = []; |
|
|
|
// @TODO Increase count once global-queue is merged |
|
for ($i = 0; $i < 10; $i++) { |
|
$deferreds[] = $d = new Deferred(); |
|
$p = $d->promise(); |
|
|
|
$last = $p; |
|
for ($j = 0; $j < 10; $j++) { |
|
$last = $last->then(function($result) { |
|
return $result; |
|
}); |
|
} |
|
} |
|
|
|
$p = null; |
|
foreach ($deferreds as $d) { |
|
if ($p) { |
|
$d->resolve($p); |
|
} |
|
|
|
$p = $d->promise(); |
|
} |
|
|
|
$deferreds[0]->resolve(true); |
|
|
|
$mock = $this->createCallableMock(); |
|
$mock |
|
->expects($this->once()) |
|
->method('__invoke') |
|
->with($this->identicalTo(true)); |
|
|
|
$deferreds[0]->promise()->then($mock); |
|
} |
|
|
|
/** @test */ |
|
public function returnsExtendePromiseForSimplePromise() |
|
{ |
|
$promise = $this |
|
->getMockBuilder('React\Promise\PromiseInterface') |
|
->getMock(); |
|
|
|
$this->assertInstanceOf('React\Promise\ExtendedPromiseInterface', resolve($promise)); |
|
} |
|
}
|
|
|