/** @test */ public function shouldForwardValueWhenCallbackIsNull() { $mock = $this->createCallableMock(); $mock->expects($this->once())->method('__invoke')->with($this->identicalTo(1)); $d = new Deferred(); $d->then(null, $this->expectCallableNever())->then($mock, $this->expectCallableNever()); $d->resolve(1); }
/** * @test * @dataProvider invalidCallbackDataProvider **/ public function shouldIgnoreNonFunctionsAndTriggerPhpNotice($var) { $errorCollector = new ErrorCollector(); $errorCollector->register(); $mock = $this->createCallableMock(); $mock->expects($this->once())->method('__invoke')->with($this->identicalTo(1)); $d = new Deferred(); $d->then(null, $var)->then($this->expectCallableNever(), $mock); $d->reject(1); $errorCollector->assertCollectedError('Invalid $errorHandler argument passed to then(), must be null or callable.', E_USER_NOTICE); $errorCollector->unregister(); }
public static function some($promisesOrValues, $howMany, $fulfilledHandler = null, $errorHandler = null, $progressHandler = null) { return When::resolve($promisesOrValues)->then(function ($array) use($howMany, $fulfilledHandler, $errorHandler, $progressHandler) { if (!is_array($array)) { $array = array(); } $len = count($array); $toResolve = max(0, min($howMany, $len)); $values = array(); $deferred = new Deferred(); if (!$toResolve) { $deferred->resolve($values); } else { $toReject = $len - $toResolve + 1; $reasons = array(); $progress = array($deferred, 'progress'); $fulfillOne = function ($val, $i) use(&$values, &$toResolve, $deferred) { $values[$i] = $val; if (0 === --$toResolve) { $deferred->resolve($values); return true; } }; $rejectOne = function ($reason, $i) use(&$reasons, &$toReject, $deferred) { $reasons[$i] = $reason; if (0 === --$toReject) { $deferred->reject($reasons); return true; } }; foreach ($array as $i => $promiseOrValue) { $fulfiller = function ($val) use($i, &$fulfillOne, &$rejectOne) { $reset = $fulfillOne($val, $i); if (true === $reset) { $fulfillOne = $rejectOne = function () { }; } }; $rejecter = function ($val) use($i, &$fulfillOne, &$rejectOne) { $reset = $rejectOne($val, $i); if (true === $reset) { $fulfillOne = $rejectOne = function () { }; } }; When::resolve($promiseOrValue)->then($fulfiller, $rejecter, $progress); } } return $deferred->then($fulfilledHandler, $errorHandler, $progressHandler); }); }
/** @test */ public function shouldSupportDeepNestingInPromiseChains() { $d = new Deferred(); $d->resolve(false); $result = When::resolve(When::resolve($d->then(function ($val) { $d = new Deferred(); $d->resolve($val); $identity = function ($val) { return $val; }; return When::resolve($d->then($identity))->then(function ($val) { return !$val; }); }))); $mock = $this->createCallableMock(); $mock->expects($this->once())->method('__invoke')->with($this->identicalTo(true)); $result->then($mock); }