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.
204 lines
5.2 KiB
204 lines
5.2 KiB
<?php |
|
|
|
namespace React\Promise; |
|
|
|
use React\Promise\Exception\LengthException; |
|
|
|
class FunctionAnyTest extends TestCase |
|
{ |
|
/** @test */ |
|
public function shouldRejectWithLengthExceptionWithEmptyInputArray() |
|
{ |
|
$mock = $this->createCallableMock(); |
|
$mock |
|
->expects($this->once()) |
|
->method('__invoke') |
|
->with( |
|
$this->callback(function($exception){ |
|
return $exception instanceof LengthException && |
|
'Input array must contain at least 1 item but contains only 0 items.' === $exception->getMessage(); |
|
}) |
|
); |
|
|
|
any([]) |
|
->then($this->expectCallableNever(), $mock); |
|
} |
|
|
|
/** @test */ |
|
public function shouldResolveToNullWithNonArrayInput() |
|
{ |
|
$mock = $this->createCallableMock(); |
|
$mock |
|
->expects($this->once()) |
|
->method('__invoke') |
|
->with($this->identicalTo(null)); |
|
|
|
any(null) |
|
->then($mock); |
|
} |
|
|
|
/** @test */ |
|
public function shouldResolveWithAnInputValue() |
|
{ |
|
$mock = $this->createCallableMock(); |
|
$mock |
|
->expects($this->once()) |
|
->method('__invoke') |
|
->with($this->identicalTo(1)); |
|
|
|
any([1, 2, 3]) |
|
->then($mock); |
|
} |
|
|
|
/** @test */ |
|
public function shouldResolveWithAPromisedInputValue() |
|
{ |
|
$mock = $this->createCallableMock(); |
|
$mock |
|
->expects($this->once()) |
|
->method('__invoke') |
|
->with($this->identicalTo(1)); |
|
|
|
any([resolve(1), resolve(2), resolve(3)]) |
|
->then($mock); |
|
} |
|
|
|
/** @test */ |
|
public function shouldRejectWithAllRejectedInputValuesIfAllInputsAreRejected() |
|
{ |
|
$mock = $this->createCallableMock(); |
|
$mock |
|
->expects($this->once()) |
|
->method('__invoke') |
|
->with($this->identicalTo([0 => 1, 1 => 2, 2 => 3])); |
|
|
|
any([reject(1), reject(2), reject(3)]) |
|
->then($this->expectCallableNever(), $mock); |
|
} |
|
|
|
/** @test */ |
|
public function shouldResolveWhenFirstInputPromiseResolves() |
|
{ |
|
$mock = $this->createCallableMock(); |
|
$mock |
|
->expects($this->once()) |
|
->method('__invoke') |
|
->with($this->identicalTo(1)); |
|
|
|
any([resolve(1), reject(2), reject(3)]) |
|
->then($mock); |
|
} |
|
|
|
/** @test */ |
|
public function shouldAcceptAPromiseForAnArray() |
|
{ |
|
$mock = $this->createCallableMock(); |
|
$mock |
|
->expects($this->once()) |
|
->method('__invoke') |
|
->with($this->identicalTo(1)); |
|
|
|
any(resolve([1, 2, 3])) |
|
->then($mock); |
|
} |
|
|
|
/** @test */ |
|
public function shouldResolveToNullArrayWhenInputPromiseDoesNotResolveToArray() |
|
{ |
|
$mock = $this->createCallableMock(); |
|
$mock |
|
->expects($this->once()) |
|
->method('__invoke') |
|
->with($this->identicalTo(null)); |
|
|
|
any(resolve(1)) |
|
->then($mock); |
|
} |
|
|
|
/** @test */ |
|
public function shouldNotRelyOnArryIndexesWhenUnwrappingToASingleResolutionValue() |
|
{ |
|
$mock = $this->createCallableMock(); |
|
$mock |
|
->expects($this->once()) |
|
->method('__invoke') |
|
->with($this->identicalTo(2)); |
|
|
|
$d1 = new Deferred(); |
|
$d2 = new Deferred(); |
|
|
|
any(['abc' => $d1->promise(), 1 => $d2->promise()]) |
|
->then($mock); |
|
|
|
$d2->resolve(2); |
|
$d1->resolve(1); |
|
} |
|
|
|
/** @test */ |
|
public function shouldRejectWhenInputPromiseRejects() |
|
{ |
|
$mock = $this->createCallableMock(); |
|
$mock |
|
->expects($this->once()) |
|
->method('__invoke') |
|
->with($this->identicalTo(null)); |
|
|
|
any(reject()) |
|
->then($this->expectCallableNever(), $mock); |
|
} |
|
|
|
/** @test */ |
|
public function shouldCancelInputPromise() |
|
{ |
|
$mock = $this |
|
->getMockBuilder('React\Promise\CancellablePromiseInterface') |
|
->getMock(); |
|
$mock |
|
->expects($this->once()) |
|
->method('cancel'); |
|
|
|
any($mock)->cancel(); |
|
} |
|
|
|
/** @test */ |
|
public function shouldCancelInputArrayPromises() |
|
{ |
|
$mock1 = $this |
|
->getMockBuilder('React\Promise\CancellablePromiseInterface') |
|
->getMock(); |
|
$mock1 |
|
->expects($this->once()) |
|
->method('cancel'); |
|
|
|
$mock2 = $this |
|
->getMockBuilder('React\Promise\CancellablePromiseInterface') |
|
->getMock(); |
|
$mock2 |
|
->expects($this->once()) |
|
->method('cancel'); |
|
|
|
any([$mock1, $mock2])->cancel(); |
|
} |
|
|
|
/** @test */ |
|
public function shouldNotCancelOtherPendingInputArrayPromisesIfOnePromiseFulfills() |
|
{ |
|
$mock = $this->createCallableMock(); |
|
$mock |
|
->expects($this->never()) |
|
->method('__invoke'); |
|
|
|
|
|
$deferred = New Deferred($mock); |
|
$deferred->resolve(); |
|
|
|
$mock2 = $this |
|
->getMockBuilder('React\Promise\CancellablePromiseInterface') |
|
->getMock(); |
|
$mock2 |
|
->expects($this->never()) |
|
->method('cancel'); |
|
|
|
some([$deferred->promise(), $mock2], 1)->cancel(); |
|
} |
|
}
|
|
|