1
0
mirror of https://github.com/danog/amp.git synced 2024-12-11 17:09:40 +01:00
amp/test/FunctionsTest.php

277 lines
8.8 KiB
PHP
Raw Normal View History

2014-12-04 19:34:42 +01:00
<?php
namespace Amp\Test;
2015-03-16 20:04:01 +01:00
use Amp\NativeReactor;
use Amp\Success;
use Amp\Failure;
2015-05-19 06:21:33 +02:00
use Amp\Deferred;
use Amp\PromiseStream;
2015-03-16 20:04:01 +01:00
2014-12-04 19:34:42 +01:00
class FunctionsTest extends \PHPUnit_Framework_TestCase {
public function testPipe() {
$invoked = 0;
$promise = \Amp\pipe(21, function($r) { return $r * 2; });
$promise->when(function($e, $r) use (&$invoked) {
$invoked++;
$this->assertSame(42, $r);
});
$this->assertSame(1, $invoked);
}
public function testPipeAbortsIfOriginalPromiseFails() {
$invoked = 0;
$failure = new Failure(new \RuntimeException);
$promise = \Amp\pipe($failure, function(){});
$promise->when(function($e, $r) use (&$invoked) {
$invoked++;
$this->assertInstanceOf("RuntimeException", $e);
});
$this->assertSame(1, $invoked);
}
public function testPipeAbortsIfFunctorThrows() {
$invoked = 0;
$promise = \Amp\pipe(42, function(){ throw new \RuntimeException; });
$promise->when(function($e, $r) use (&$invoked) {
$invoked++;
$this->assertInstanceOf("RuntimeException", $e);
});
$this->assertSame(1, $invoked);
}
2014-12-04 19:34:42 +01:00
public function testAllResolutionWhenNoPromiseInstancesCombined() {
$promises = [null, 1, 2, true];
2015-04-30 19:41:14 +02:00
\Amp\all($promises)->when(function($e, $r) {
2014-12-04 19:34:42 +01:00
list($a, $b, $c, $d) = $r;
$this->assertNull($a);
$this->assertSame(1, $b);
$this->assertSame(2, $c);
$this->assertSame(true, $d);
});
}
public function testSomeResolutionWhenNoPromiseInstancesCombined() {
$promises = [null, 1, 2, true];
2015-04-30 19:41:14 +02:00
\Amp\some($promises)->when(function($e, $r) {
2014-12-04 19:34:42 +01:00
list($errors, $results) = $r;
list($a, $b, $c, $d) = $results;
$this->assertNull($a);
$this->assertSame(1, $b);
$this->assertSame(2, $c);
$this->assertSame(true, $d);
});
}
public function testAnyResolutionWhenNoPromiseInstancesCombined() {
$promises = [null, 1, 2, true];
2015-04-30 19:41:14 +02:00
\Amp\any($promises)->when(function($e, $r) {
2014-12-04 19:34:42 +01:00
list($errors, $results) = $r;
list($a, $b, $c, $d) = $results;
$this->assertNull($a);
$this->assertSame(1, $b);
$this->assertSame(2, $c);
$this->assertSame(true, $d);
});
}
2015-03-16 20:04:01 +01:00
2015-07-21 18:25:34 +02:00
public function testAnyReturnsImmediatelyOnEmptyPromiseArray() {
$promise = \Amp\any([]);
$this->assertInstanceOf("Amp\Success", $promise);
$error = null;
$result = null;
$promise->when(function($e, $r) use (&$error, &$result) {
$error = $e;
$result = $r;
});
$this->assertNull($error);
$this->assertSame([[], []], $result);
}
2015-03-16 20:04:01 +01:00
public function testAllResolvesWithArrayOfResults() {
2015-04-30 19:41:14 +02:00
\Amp\all(['r1' => 42, 'r2' => new Success(41)])->when(function($error, $result) {
2015-03-16 20:04:01 +01:00
$expected = ['r1' => 42, 'r2' => 41];
$this->assertSame($expected, $result);
});
}
2015-07-21 18:25:34 +02:00
public function testAllReturnsImmediatelyOnEmptyPromiseArray() {
$promise = \Amp\all([]);
$this->assertInstanceOf("Amp\Success", $promise);
$error = null;
$result = null;
$promise->when(function($e, $r) use (&$error, &$result) {
$error = $e;
$result = $r;
});
$this->assertNull($error);
$this->assertSame([], $result);
}
2015-03-16 20:04:01 +01:00
/**
* @expectedException \RuntimeException
* @expectedExceptionMessage zanzibar
*/
public function testAllThrowsIfAnyIndividualPromiseFails() {
$exception = new \RuntimeException('zanzibar');
2015-04-30 19:41:14 +02:00
\Amp\all([
2015-03-16 20:04:01 +01:00
'r1' => new Success(42),
'r2' => new Failure($exception),
'r3' => new Success(40),
])->when(function(\Exception $error) {
2015-03-16 20:04:01 +01:00
throw $error;
});
}
public function testSomeReturnsArrayOfErrorsAndResults() {
$exception = new \RuntimeException('zanzibar');
2015-04-30 19:41:14 +02:00
\Amp\some([
2015-03-16 20:04:01 +01:00
'r1' => new Success(42),
'r2' => new Failure($exception),
'r3' => new Success(40),
])->when(function($error, $result) use ($exception) {
2015-04-30 19:41:14 +02:00
list($errors, $results) = (yield \Amp\some($promises));
2015-03-16 20:04:01 +01:00
$this->assertSame(['r2' => $exception], $errors);
$this->assertSame(['r1' => 42, 'r3' => 40], $results);
});
}
2015-07-21 18:25:34 +02:00
public function testSomeFailsImmediatelyOnEmptyPromiseArrayInput() {
$promise = \Amp\some([]);
$this->assertInstanceOf("Amp\Failure", $promise);
$error = null;
$result = null;
$promise->when(function($e, $r) use (&$error, &$result) {
$error = $e;
$result = $r;
});
$this->assertNull($result);
$this->assertInstanceOf("\LogicException", $error);
$this->assertSame("No promises or values provided for resolution", $error->getMessage());
}
2015-03-16 20:04:01 +01:00
/**
* @expectedException \RuntimeException
*/
public function testSomeThrowsIfNoPromisesResolveSuccessfully() {
2015-04-30 19:41:14 +02:00
\Amp\some([
2015-03-16 20:04:01 +01:00
'r1' => new Failure(new \RuntimeException),
'r2' => new Failure(new \RuntimeException),
])->when(function($error) {
throw $error;
});
}
2015-06-01 02:13:39 +02:00
/**
* @expectedException \RuntimeException
* @expectedExceptionMessage Promise resolution timed out
*/
public function testTimeout() {
2015-06-01 02:18:42 +02:00
(new NativeReactor)->run(function($reactor) {
2015-06-01 02:13:39 +02:00
$pause = new \Amp\Pause(1000, $reactor);
yield \Amp\timeout($pause, 10, $reactor);
});
}
2015-03-16 20:04:01 +01:00
public function testAllCombinatorResolution() {
$invoked = 0;
(new NativeReactor)->run(function($reactor) use (&$invoked) {
2015-04-30 19:41:14 +02:00
list($a, $b) = (yield \Amp\all([
2015-03-16 20:04:01 +01:00
new Success(21),
new Success(2),
2015-04-30 19:41:14 +02:00
]));
2015-03-16 20:04:01 +01:00
2015-03-23 16:07:40 +01:00
$result = ($a * $b);
2015-03-16 20:04:01 +01:00
$this->assertSame(42, $result);
$invoked++;
2015-03-16 20:04:01 +01:00
});
$this->assertSame(1, $invoked);
2015-03-16 20:04:01 +01:00
}
public function testAllCombinatorResolutionWithNonPromises() {
$invoked = 0;
(new NativeReactor)->run(function($reactor) use (&$invoked) {
2015-04-30 19:41:14 +02:00
list($a, $b, $c) = (yield \Amp\all([new Success(21), new Success(2), 10]));
2015-03-23 16:07:40 +01:00
$result = ($a * $b * $c);
2015-03-16 20:04:01 +01:00
$this->assertSame(420, $result);
$invoked++;
2015-03-16 20:04:01 +01:00
});
$this->assertSame(1, $invoked);
2015-03-16 20:04:01 +01:00
}
/**
* @expectedException \Exception
* @expectedExceptionMessage When in the chronicle of wasted time
*/
public function testAllCombinatorResolutionThrowsIfAnyOnePromiseFails() {
(new NativeReactor)->run(function($reactor) {
2015-04-30 19:41:14 +02:00
list($a, $b) = (yield \Amp\all([
2015-03-23 16:07:40 +01:00
new Success(21),
new Failure(new \Exception('When in the chronicle of wasted time')),
2015-04-30 19:41:14 +02:00
]));
2015-03-16 20:04:01 +01:00
});
}
public function testExplicitAllCombinatorResolution() {
$invoked = 0;
(new NativeReactor)->run(function($reactor) use (&$invoked) {
2015-04-30 19:41:14 +02:00
list($a, $b, $c) = (yield \Amp\all([
2015-03-23 16:07:40 +01:00
new Success(21),
new Success(2),
10
2015-04-30 19:41:14 +02:00
]));
2015-03-16 20:04:01 +01:00
2015-03-23 16:07:40 +01:00
$this->assertSame(420, ($a * $b * $c));
$invoked++;
2015-03-16 20:04:01 +01:00
});
$this->assertSame(1, $invoked);
2015-03-16 20:04:01 +01:00
}
public function testExplicitAnyCombinatorResolution() {
$invoked = 0;
(new NativeReactor)->run(function($reactor) use (&$invoked) {
2015-04-30 19:41:14 +02:00
list($errors, $results) = (yield \Amp\any([
2015-03-23 16:07:40 +01:00
'a' => new Success(21),
'b' => new Failure(new \Exception('test')),
2015-04-30 19:41:14 +02:00
]));
2015-03-16 20:04:01 +01:00
$this->assertSame('test', $errors['b']->getMessage());
$this->assertSame(21, $results['a']);
$invoked++;
2015-03-16 20:04:01 +01:00
});
$this->assertSame(1, $invoked);
2015-03-16 20:04:01 +01:00
}
/**
* @expectedException \RuntimeException
*/
public function testExplicitSomeCombinatorResolutionFailsOnError() {
(new NativeReactor)->run(function($reactor) {
2015-04-30 19:41:14 +02:00
yield \Amp\some([
2015-03-23 16:07:40 +01:00
'r1' => new Failure(new \RuntimeException),
'r2' => new Failure(new \RuntimeException),
]);
2015-03-16 20:04:01 +01:00
});
}
public function testPromisesNormalization() {
$completed = false;
(new NativeReactor)->run(function($reactor) use (&$completed) {
$promisor = new Deferred;
$promisor->succeed(41);
$values = [
$promisor,
42,
new Success(43),
];
list($a, $b, $c) = (yield \Amp\all(\Amp\promises($values)));
$this->assertSame(41, $a);
$this->assertSame(42, $b);
$this->assertSame(43, $c);
$completed = true;
});
$this->assertTrue($completed);
}
2014-12-04 19:34:42 +01:00
}