2021-08-29 18:47:21 +02:00
< ? php
2021-09-06 06:47:06 +02:00
namespace Amp\Future ;
2021-08-29 18:47:21 +02:00
2021-08-30 06:28:25 +02:00
use Amp\CancelledException ;
2021-08-29 18:47:21 +02:00
use Amp\CompositeException ;
2021-12-02 22:29:45 +01:00
use Amp\DeferredFuture ;
2021-08-29 18:47:21 +02:00
use Amp\Future ;
2021-12-02 22:24:56 +01:00
use Amp\TimeoutCancellation ;
2021-08-29 18:47:21 +02:00
use PHPUnit\Framework\TestCase ;
2021-10-15 00:50:40 +02:00
use Revolt\EventLoop ;
2021-08-29 18:47:21 +02:00
2022-01-16 17:39:04 +01:00
class AwaitAnyTest extends TestCase
2021-08-29 18:47:21 +02:00
{
public function testSingleComplete () : void
{
2022-01-16 17:39:04 +01:00
self :: assertSame ( 42 , awaitAny ([ Future :: complete ( 42 )]));
2021-08-29 18:47:21 +02:00
}
public function testTwoComplete () : void
{
2022-01-16 17:39:04 +01:00
self :: assertSame ( 1 , awaitAny ([ Future :: complete ( 1 ), Future :: complete ( 2 )]));
2021-08-29 18:47:21 +02:00
}
public function testTwoFirstPending () : void
{
2021-12-02 22:29:45 +01:00
$deferred = new DeferredFuture ();
2021-08-29 18:47:21 +02:00
2022-01-16 17:39:04 +01:00
self :: assertSame ( 2 , awaitAny ([ $deferred -> getFuture (), Future :: complete ( 2 )]));
2021-08-29 18:47:21 +02:00
}
public function testTwoFirstThrowing () : void
{
2022-01-16 17:39:04 +01:00
self :: assertSame ( 2 , awaitAny ([ Future :: error ( new \Exception ( 'foo' )), Future :: complete ( 2 )]));
2021-08-29 18:47:21 +02:00
}
public function testTwoBothThrowing () : void
{
$this -> expectException ( CompositeException :: class );
2022-01-16 17:39:04 +01:00
$this -> expectExceptionMessage ( 'Multiple exceptions encountered (2); use "Amp\CompositeException::getReasons()" to retrieve the array of exceptions thrown:' );
2021-08-29 18:47:21 +02:00
2022-01-16 17:39:04 +01:00
Future\awaitAny ([ Future :: error ( new \Exception ( 'foo' )), Future :: error ( new \RuntimeException ( 'bar' ))]);
2021-08-29 18:47:21 +02:00
}
public function testTwoGeneratorThrows () : void
{
2022-01-16 17:39:04 +01:00
self :: assertSame ( 2 , awaitAny (( static function () {
2021-08-29 18:47:21 +02:00
yield Future :: error ( new \Exception ( 'foo' ));
yield Future :: complete ( 2 );
})()));
}
2021-08-30 06:28:25 +02:00
public function testCancellation () : void
{
$this -> expectException ( CancelledException :: class );
$deferreds = \array_map ( function ( int $value ) {
2021-12-02 22:29:45 +01:00
$deferred = new DeferredFuture ;
2021-11-14 18:35:07 +01:00
EventLoop :: delay ( $value / 10 , fn () => $deferred -> complete ( $value ));
2021-08-30 06:28:25 +02:00
return $deferred ;
}, \range ( 1 , 3 ));
2022-01-16 17:39:04 +01:00
awaitAny ( \array_map (
2021-12-02 22:29:45 +01:00
fn ( DeferredFuture $deferred ) => $deferred -> getFuture (),
2021-08-30 06:28:25 +02:00
$deferreds
2021-12-02 22:24:56 +01:00
), new TimeoutCancellation ( 0.05 ));
2021-08-30 06:28:25 +02:00
}
public function testCompleteBeforeCancellation () : void
{
$deferreds = \array_map ( function ( int $value ) {
2021-12-02 22:29:45 +01:00
$deferred = new DeferredFuture ;
2021-11-14 18:35:07 +01:00
EventLoop :: delay ( $value / 10 , fn () => $deferred -> complete ( $value ));
2021-08-30 06:28:25 +02:00
return $deferred ;
}, \range ( 1 , 3 ));
2021-12-02 22:29:45 +01:00
$deferred = new DeferredFuture ;
2021-08-30 06:28:25 +02:00
$deferred -> error ( new \Exception ( 'foo' ));
\array_unshift ( $deferreds , $deferred );
2022-01-16 17:39:04 +01:00
self :: assertSame ( 1 , awaitAny ( \array_map (
2021-12-02 22:29:45 +01:00
fn ( DeferredFuture $deferred ) => $deferred -> getFuture (),
2021-08-30 06:28:25 +02:00
$deferreds
2021-12-02 22:24:56 +01:00
), new TimeoutCancellation ( 0.2 )));
2021-08-30 06:28:25 +02:00
}
2021-08-29 18:47:21 +02:00
}