123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- <?php
- namespace GuzzleHttp\Promise\Tests;
- use GuzzleHttp\Promise\Coroutine;
- use GuzzleHttp\Promise\Promise;
- use GuzzleHttp\Promise\PromiseInterface;
- use PHPUnit\Framework\TestCase;
- use ReflectionClass;
- class CoroutineTest extends TestCase
- {
- /**
- * @dataProvider promiseInterfaceMethodProvider
- *
- * @param string $method
- * @param array $args
- */
- public function testShouldProxyPromiseMethodsToResultPromise($method, $args = [])
- {
- $coroutine = new Coroutine(function () { yield 0; });
- $mockPromise = $this->getMockForAbstractClass(PromiseInterface::class);
- call_user_func_array([$mockPromise->expects($this->once())->method($method), 'with'], $args);
- $resultPromiseProp = (new ReflectionClass(Coroutine::class))->getProperty('result');
- $resultPromiseProp->setAccessible(true);
- $resultPromiseProp->setValue($coroutine, $mockPromise);
- call_user_func_array([$coroutine, $method], $args);
- }
- public function promiseInterfaceMethodProvider()
- {
- return [
- ['then', [null, null]],
- ['otherwise', [function () {}]],
- ['wait', [true]],
- ['getState', []],
- ['resolve', [null]],
- ['reject', [null]],
- ];
- }
- public function testShouldCancelResultPromiseAndOutsideCurrentPromise()
- {
- $coroutine = new Coroutine(function () { yield 0; });
- $mockPromises = [
- 'result' => $this->getMockForAbstractClass(PromiseInterface::class),
- 'currentPromise' => $this->getMockForAbstractClass(PromiseInterface::class),
- ];
- foreach ($mockPromises as $propName => $mockPromise) {
- /**
- * @var $mockPromise \PHPUnit_Framework_MockObject_MockObject
- */
- $mockPromise->expects($this->once())
- ->method('cancel')
- ->with();
- $promiseProp = (new ReflectionClass(Coroutine::class))->getProperty($propName);
- $promiseProp->setAccessible(true);
- $promiseProp->setValue($coroutine, $mockPromise);
- }
- $coroutine->cancel();
- }
- public function testWaitShouldResolveChainedCoroutines()
- {
- $promisor = function () {
- return \GuzzleHttp\Promise\coroutine(function () {
- yield $promise = new Promise(function () use (&$promise) {
- $promise->resolve(1);
- });
- });
- };
- $promise = $promisor()->then($promisor)->then($promisor);
- $this->assertSame(1, $promise->wait());
- }
- public function testWaitShouldHandleIntermediateErrors()
- {
- $promise = \GuzzleHttp\Promise\coroutine(function () {
- yield $promise = new Promise(function () use (&$promise) {
- $promise->resolve(1);
- });
- })
- ->then(function () {
- return \GuzzleHttp\Promise\coroutine(function () {
- yield $promise = new Promise(function () use (&$promise) {
- $promise->reject(new \Exception);
- });
- });
- })
- ->otherwise(function (\Exception $error = null) {
- if (!$error) {
- self::fail('Error did not propagate.');
- }
- return 3;
- });
- $this->assertSame(3, $promise->wait());
- }
- }
|