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.
198 lines
4.6 KiB
198 lines
4.6 KiB
<?php |
|
|
|
namespace React\Promise; |
|
|
|
class FunctionMapTest extends TestCase |
|
{ |
|
protected function mapper() |
|
{ |
|
return function ($val) { |
|
return $val * 2; |
|
}; |
|
} |
|
|
|
protected function promiseMapper() |
|
{ |
|
return function ($val) { |
|
return resolve($val * 2); |
|
}; |
|
} |
|
|
|
/** @test */ |
|
public function shouldMapInputValuesArray() |
|
{ |
|
$mock = $this->createCallableMock(); |
|
$mock |
|
->expects($this->once()) |
|
->method('__invoke') |
|
->with($this->identicalTo([2, 4, 6])); |
|
|
|
map( |
|
[1, 2, 3], |
|
$this->mapper() |
|
)->then($mock); |
|
} |
|
|
|
/** @test */ |
|
public function shouldMapInputPromisesArray() |
|
{ |
|
$mock = $this->createCallableMock(); |
|
$mock |
|
->expects($this->once()) |
|
->method('__invoke') |
|
->with($this->identicalTo([2, 4, 6])); |
|
|
|
map( |
|
[resolve(1), resolve(2), resolve(3)], |
|
$this->mapper() |
|
)->then($mock); |
|
} |
|
|
|
/** @test */ |
|
public function shouldMapMixedInputArray() |
|
{ |
|
$mock = $this->createCallableMock(); |
|
$mock |
|
->expects($this->once()) |
|
->method('__invoke') |
|
->with($this->identicalTo([2, 4, 6])); |
|
|
|
map( |
|
[1, resolve(2), 3], |
|
$this->mapper() |
|
)->then($mock); |
|
} |
|
|
|
/** @test */ |
|
public function shouldMapInputWhenMapperReturnsAPromise() |
|
{ |
|
$mock = $this->createCallableMock(); |
|
$mock |
|
->expects($this->once()) |
|
->method('__invoke') |
|
->with($this->identicalTo([2, 4, 6])); |
|
|
|
map( |
|
[1, 2, 3], |
|
$this->promiseMapper() |
|
)->then($mock); |
|
} |
|
|
|
/** @test */ |
|
public function shouldAcceptAPromiseForAnArray() |
|
{ |
|
$mock = $this->createCallableMock(); |
|
$mock |
|
->expects($this->once()) |
|
->method('__invoke') |
|
->with($this->identicalTo([2, 4, 6])); |
|
|
|
map( |
|
resolve([1, resolve(2), 3]), |
|
$this->mapper() |
|
)->then($mock); |
|
} |
|
|
|
/** @test */ |
|
public function shouldResolveToEmptyArrayWhenInputPromiseDoesNotResolveToArray() |
|
{ |
|
$mock = $this->createCallableMock(); |
|
$mock |
|
->expects($this->once()) |
|
->method('__invoke') |
|
->with($this->identicalTo([])); |
|
|
|
map( |
|
resolve(1), |
|
$this->mapper() |
|
)->then($mock); |
|
} |
|
|
|
/** @test */ |
|
public function shouldPreserveTheOrderOfArrayWhenResolvingAsyncPromises() |
|
{ |
|
$mock = $this->createCallableMock(); |
|
$mock |
|
->expects($this->once()) |
|
->method('__invoke') |
|
->with($this->identicalTo([2, 4, 6])); |
|
|
|
$deferred = new Deferred(); |
|
|
|
map( |
|
[resolve(1), $deferred->promise(), resolve(3)], |
|
$this->mapper() |
|
)->then($mock); |
|
|
|
$deferred->resolve(2); |
|
} |
|
|
|
/** @test */ |
|
public function shouldRejectWhenInputContainsRejection() |
|
{ |
|
$mock = $this->createCallableMock(); |
|
$mock |
|
->expects($this->once()) |
|
->method('__invoke') |
|
->with($this->identicalTo(2)); |
|
|
|
map( |
|
[resolve(1), reject(2), resolve(3)], |
|
$this->mapper() |
|
)->then($this->expectCallableNever(), $mock); |
|
} |
|
|
|
/** @test */ |
|
public function shouldRejectWhenInputPromiseRejects() |
|
{ |
|
$mock = $this->createCallableMock(); |
|
$mock |
|
->expects($this->once()) |
|
->method('__invoke') |
|
->with($this->identicalTo(null)); |
|
|
|
map( |
|
reject(), |
|
$this->mapper() |
|
)->then($this->expectCallableNever(), $mock); |
|
} |
|
|
|
/** @test */ |
|
public function shouldCancelInputPromise() |
|
{ |
|
$mock = $this |
|
->getMockBuilder('React\Promise\CancellablePromiseInterface') |
|
->getMock(); |
|
$mock |
|
->expects($this->once()) |
|
->method('cancel'); |
|
|
|
map( |
|
$mock, |
|
$this->mapper() |
|
)->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'); |
|
|
|
map( |
|
[$mock1, $mock2], |
|
$this->mapper() |
|
)->cancel(); |
|
} |
|
}
|
|
|