Example #1
0
 /** @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();
 }
Example #3
0
 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);
     });
 }
Example #4
0
 /** @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);
 }