From 85b47078323cfffd659acb5b49595c8c2e8b0494 Mon Sep 17 00:00:00 2001 From: Niklas Keller Date: Sun, 17 May 2020 21:41:42 +0200 Subject: [PATCH] Use AsyncTestCase for stream tests --- test/Stream/ConcatTest.php | 61 +++++++-------- test/Stream/FilterTest.php | 105 ++++++++++--------------- test/Stream/FromIterableTest.php | 128 ++++++++++++++----------------- test/Stream/MapTest.php | 109 ++++++++++---------------- test/Stream/MergeTest.php | 99 ++++++++++++------------ test/Stream/ToArrayTest.php | 13 ++-- 6 files changed, 226 insertions(+), 289 deletions(-) diff --git a/test/Stream/ConcatTest.php b/test/Stream/ConcatTest.php index d7641de..13c31b5 100644 --- a/test/Stream/ConcatTest.php +++ b/test/Stream/ConcatTest.php @@ -3,14 +3,13 @@ namespace Amp\Test\Stream; use Amp\AsyncGenerator; -use Amp\Loop; +use Amp\PHPUnit\AsyncTestCase; use Amp\PHPUnit\TestException; use Amp\Stream; -use Amp\Test\BaseTest; -class ConcatTest extends BaseTest +class ConcatTest extends AsyncTestCase { - public function getArrays() + public function getArrays(): array { return [ [[\range(1, 3), \range(4, 6)], \range(1, 6)], @@ -27,17 +26,15 @@ class ConcatTest extends BaseTest */ public function testConcat(array $iterators, array $expected) { - Loop::run(function () use ($iterators, $expected) { - $iterators = \array_map(function (array $iterator): Stream { - return Stream\fromIterable($iterator); - }, $iterators); + $iterators = \array_map(static function (array $iterator): Stream { + return Stream\fromIterable($iterator); + }, $iterators); - $iterator = Stream\concat($iterators); + $stream = Stream\concat($iterators); - while (list($value) = yield $iterator->continue()) { - $this->assertSame(\array_shift($expected), $value); - } - }); + while (list($value) = yield $stream->continue()) { + $this->assertSame(\array_shift($expected), $value); + } } /** @@ -45,33 +42,37 @@ class ConcatTest extends BaseTest */ public function testConcatWithFailedStream() { - Loop::run(function () { - $exception = new TestException; - $expected = \range(1, 6); - $generator = new AsyncGenerator(function (callable $yield) use ($exception) { - yield $yield(6); // Emit once before failing. - throw $exception; - }); + $exception = new TestException; + $expected = \range(1, 6); + $generator = new AsyncGenerator(static function (callable $yield) use ($exception) { + yield $yield(6); // Emit once before failing. + throw $exception; + }); - $iterator = Stream\concat([Stream\fromIterable(\range(1, 5)), $generator, Stream\fromIterable(\range(7, 10))]); + $stream = Stream\concat([ + Stream\fromIterable(\range(1, 5)), + $generator, + Stream\fromIterable(\range(7, 10)), + ]); - try { - while (list($value) = yield $iterator->continue()) { - $this->assertSame(\array_shift($expected), $value); - } - $this->fail("The exception used to fail the iterator should be thrown from advance()"); - } catch (TestException $reason) { - $this->assertSame($exception, $reason); + try { + while (list($value) = yield $stream->continue()) { + $this->assertSame(\array_shift($expected), $value); } - $this->assertEmpty($expected); - }); + $this->fail("The exception used to fail the stream should be thrown from continue()"); + } catch (TestException $reason) { + $this->assertSame($exception, $reason); + } + + $this->assertEmpty($expected); } public function testNonStream() { $this->expectException(\TypeError::class); + /** @noinspection PhpParamsInspection */ Stream\concat([1]); } } diff --git a/test/Stream/FilterTest.php b/test/Stream/FilterTest.php index d02e3b5..dd6dfbd 100644 --- a/test/Stream/FilterTest.php +++ b/test/Stream/FilterTest.php @@ -3,7 +3,6 @@ namespace Amp\Test\Stream; use Amp\AsyncGenerator; -use Amp\Loop; use Amp\PHPUnit\TestException; use Amp\Stream; use Amp\StreamSource; @@ -13,44 +12,37 @@ class FilterTest extends BaseTest { public function testNoValuesEmitted() { - $invoked = false; - Loop::run(function () use (&$invoked) { - $source = new StreamSource; + $source = new StreamSource; - $iterator = Stream\filter($source->stream(), function ($value) use (&$invoked) { - $invoked = true; - }); + $stream = Stream\filter($source->stream(), $this->createCallback(0)); - $this->assertInstanceOf(Stream::class, $iterator); + $source->complete(); - $source->complete(); - }); - - $this->assertFalse($invoked); + yield Stream\discard($stream); } public function testValuesEmitted() { - Loop::run(function () { - $count = 0; - $values = [1, 2, 3]; - $expected = [1, 3]; - $generator = new AsyncGenerator(function (callable $yield) use ($values) { - foreach ($values as $value) { - yield $yield($value); - } - }); - - $iterator = Stream\filter($generator, function ($value) use (&$count) { - ++$count; - return $value & 1; - }); - - while (list($value) = yield $iterator->continue()) { - $this->assertSame(\array_shift($expected), $value); + $count = 0; + $values = [1, 2, 3]; + $expected = [1, 3]; + $generator = new AsyncGenerator(static function (callable $yield) use ($values) { + foreach ($values as $value) { + yield $yield($value); } - $this->assertSame(3, $count); }); + + $iterator = Stream\filter($generator, static function ($value) use (&$count) { + ++$count; + + return $value & 1; + }); + + while (list($value) = yield $iterator->continue()) { + $this->assertSame(\array_shift($expected), $value); + } + + $this->assertSame(3, $count); } /** @@ -58,49 +50,34 @@ class FilterTest extends BaseTest */ public function testCallbackThrows() { - Loop::run(function () { - $values = [1, 2, 3]; - $exception = new TestException; - $generator = new AsyncGenerator(function (callable $yield) use ($values) { - foreach ($values as $value) { - yield $yield($value); - } - }); - - $iterator = Stream\filter($generator, function () use ($exception) { - throw $exception; - }); - - try { - yield $iterator->continue(); - $this->fail("The exception thrown from the filter callback should be thrown from continue()"); - } catch (TestException $reason) { - $this->assertSame($reason, $exception); + $values = [1, 2, 3]; + $exception = new TestException; + $generator = new AsyncGenerator(static function (callable $yield) use ($values) { + foreach ($values as $value) { + yield $yield($value); } }); + + $stream = Stream\filter($generator, static function () use ($exception) { + throw $exception; + }); + + $this->expectExceptionObject($exception); + + yield $stream->continue(); } public function testStreamFails() { - Loop::run(function () { - $invoked = false; - $exception = new TestException; - $source = new StreamSource; + $exception = new TestException; + $source = new StreamSource; - $stream = Stream\filter($source->stream(), function ($value) use (&$invoked) { - $invoked = true; - }); + $stream = Stream\filter($source->stream(), $this->createCallback(0)); - $source->fail($exception); + $source->fail($exception); - try { - yield $stream->continue(); - $this->fail("The exception used to fail the iterator should be thrown from continue()"); - } catch (TestException $reason) { - $this->assertSame($reason, $exception); - } + $this->expectExceptionObject($exception); - $this->assertFalse($invoked); - }); + yield $stream->continue(); } } diff --git a/test/Stream/FromIterableTest.php b/test/Stream/FromIterableTest.php index 30cac26..0b5a462 100644 --- a/test/Stream/FromIterableTest.php +++ b/test/Stream/FromIterableTest.php @@ -4,92 +4,84 @@ namespace Amp\Test\Stream; use Amp\Delayed; use Amp\Failure; -use Amp\Loop; +use Amp\PHPUnit\AsyncTestCase; use Amp\PHPUnit\TestException; use Amp\Stream; use Amp\Success; -use Amp\Test\BaseTest; -class FromIterableTest extends BaseTest +class FromIterableTest extends AsyncTestCase { const TIMEOUT = 10; public function testSuccessfulPromises() { - Loop::run(function () { - $expected = \range(1, 3); - $iterator = Stream\fromIterable([new Success(1), new Success(2), new Success(3)]); + $expected = \range(1, 3); + $stream = Stream\fromIterable([new Success(1), new Success(2), new Success(3)]); - while (list($value) = yield $iterator->continue()) { - $this->assertSame(\array_shift($expected), $value); - } - }); + while (list($value) = yield $stream->continue()) { + $this->assertSame(\array_shift($expected), $value); + } } public function testFailedPromises() { - Loop::run(function () { - $exception = new \Exception; - $iterator = Stream\fromIterable([new Failure($exception), new Failure($exception)]); + $exception = new \Exception; + $iterator = Stream\fromIterable([new Failure($exception), new Failure($exception)]); - try { - yield $iterator->continue(); - } catch (\Exception $reason) { - $this->assertSame($exception, $reason); - } - }); + $this->expectExceptionObject($exception); + + yield $iterator->continue(); } public function testMixedPromises() { - Loop::run(function () { - $exception = new TestException; - $expected = \range(1, 2); - $iterator = Stream\fromIterable([new Success(1), new Success(2), new Failure($exception), new Success(4)]); + $exception = new TestException; + $expected = \range(1, 2); + $stream = Stream\fromIterable([new Success(1), new Success(2), new Failure($exception), new Success(4)]); - try { - while (list($value) = yield $iterator->continue()) { - $this->assertSame(\array_shift($expected), $value); - } - $this->fail("A failed promise in the iterable should fail the iterator and be thrown from advance()"); - } catch (TestException $reason) { - $this->assertSame($exception, $reason); + try { + while (list($value) = yield $stream->continue()) { + $this->assertSame(\array_shift($expected), $value); } + $this->fail("A failed promise in the iterable should fail the stream and be thrown from continue()"); + } catch (TestException $reason) { + $this->assertSame($exception, $reason); + } - $this->assertEmpty($expected); - }); + $this->assertEmpty($expected); } public function testPendingPromises() { - Loop::run(function () { - $expected = \range(1, 4); - $iterator = Stream\fromIterable([new Delayed(30, 1), new Delayed(10, 2), new Delayed(20, 3), new Success(4)]); + $expected = \range(1, 4); + $stream = Stream\fromIterable([ + new Delayed(30, 1), + new Delayed(10, 2), + new Delayed(20, 3), + new Success(4), + ]); - while (list($value) = yield $iterator->continue()) { - $this->assertSame(\array_shift($expected), $value); - } - }); + while (list($value) = yield $stream->continue()) { + $this->assertSame(\array_shift($expected), $value); + } } public function testTraversable() { - Loop::run(function () { - $expected = \range(1, 4); - $generator = (function () { - foreach (\range(1, 4) as $value) { - yield $value; - } - })(); - - $iterator = Stream\fromIterable($generator); - - while (list($value) = yield $iterator->continue()) { - $this->assertSame(\array_shift($expected), $value); + $expected = \range(1, 4); + $generator = (static function () { + foreach (\range(1, 4) as $value) { + yield $value; } + })(); - $this->assertEmpty($expected); - }); + $stream = Stream\fromIterable($generator); + + while (list($value) = yield $stream->continue()) { + $this->assertSame(\array_shift($expected), $value); + } + + $this->assertEmpty($expected); } /** @@ -102,7 +94,7 @@ class FromIterableTest extends BaseTest Stream\fromIterable($arg); } - public function provideInvalidIteratorArguments() + public function provideInvalidIteratorArguments(): array { return [ [null], @@ -116,17 +108,15 @@ class FromIterableTest extends BaseTest public function testInterval() { - Loop::run(function () { - $count = 3; - $iterator = Stream\fromIterable(\range(1, $count), self::TIMEOUT); + $count = 3; + $stream = Stream\fromIterable(\range(1, $count), self::TIMEOUT); - $i = 0; - while (list($value) = yield $iterator->continue()) { - $this->assertSame(++$i, $value); - } + $i = 0; + while (list($value) = yield $stream->continue()) { + $this->assertSame(++$i, $value); + } - $this->assertSame($count, $i); - }); + $this->assertSame($count, $i); } /** @@ -135,14 +125,12 @@ class FromIterableTest extends BaseTest public function testSlowConsumer() { $count = 5; - Loop::run(function () use ($count) { - $iterator = Stream\fromIterable(\range(1, $count), self::TIMEOUT); + $stream = Stream\fromIterable(\range(1, $count), self::TIMEOUT); - for ($i = 0; list($value) = yield $iterator->continue(); ++$i) { - yield new Delayed(self::TIMEOUT * 2); - } + for ($i = 0; list($value) = yield $stream->continue(); ++$i) { + yield new Delayed(self::TIMEOUT * 2); + } - $this->assertSame($count, $i); - }); + $this->assertSame($count, $i); } } diff --git a/test/Stream/MapTest.php b/test/Stream/MapTest.php index 05df530..d6ded43 100644 --- a/test/Stream/MapTest.php +++ b/test/Stream/MapTest.php @@ -3,54 +3,44 @@ namespace Amp\Test\Stream; use Amp\AsyncGenerator; -use Amp\Loop; +use Amp\PHPUnit\AsyncTestCase; use Amp\PHPUnit\TestException; use Amp\Stream; use Amp\StreamSource; -use Amp\Test\BaseTest; -class MapTest extends BaseTest +class MapTest extends AsyncTestCase { public function testNoValuesEmitted() { - $invoked = false; - Loop::run(function () use (&$invoked) { - $source = new StreamSource; + $source = new StreamSource; - $iterator = Stream\map($source->stream(), function ($value) use (&$invoked) { - $invoked = true; - }); + /** @noinspection PhpUnusedLocalVariableInspection */ + $stream = Stream\map($source->stream(), $this->createCallback(0)); - $this->assertInstanceOf(Stream::class, $iterator); - - $source->complete(); - }); - - $this->assertFalse($invoked); + $source->complete(); } public function testValuesEmitted() { - Loop::run(function () { - $count = 0; - $values = [1, 2, 3]; - $generator = new AsyncGenerator(function (callable $yield) use ($values) { - foreach ($values as $value) { - yield $yield($value); - } - }); - - $iterator = Stream\map($generator, function ($value) use (&$count) { - ++$count; - return $value + 1; - }); - - while (list($value) = yield $iterator->continue()) { - $this->assertSame(\array_shift($values) + 1, $value); + $count = 0; + $values = [1, 2, 3]; + $generator = new AsyncGenerator(static function (callable $yield) use ($values) { + foreach ($values as $value) { + yield $yield($value); } - - $this->assertSame(3, $count); }); + + $stream = Stream\map($generator, static function ($value) use (&$count) { + ++$count; + + return $value + 1; + }); + + while (list($value) = yield $stream->continue()) { + $this->assertSame(\array_shift($values) + 1, $value); + } + + $this->assertSame(3, $count); } /** @@ -58,50 +48,35 @@ class MapTest extends BaseTest */ public function testOnNextCallbackThrows() { - Loop::run(function () { - $values = [1, 2, 3]; - $exception = new TestException; + $values = [1, 2, 3]; + $exception = new TestException; - $generator = new AsyncGenerator(function (callable $yield) use ($values) { - foreach ($values as $value) { - yield $yield($value); - } - }); - - $iterator = Stream\map($generator, function () use ($exception) { - throw $exception; - }); - - try { - yield $iterator->continue(); - $this->fail("The exception thrown from the map callback should be thrown from advance()"); - } catch (TestException $reason) { - $this->assertSame($reason, $exception); + $generator = new AsyncGenerator(static function (callable $yield) use ($values) { + foreach ($values as $value) { + yield $yield($value); } }); + + $stream = Stream\map($generator, static function () use ($exception) { + throw $exception; + }); + + $this->expectExceptionObject($exception); + + yield $stream->continue(); } public function testStreamFails() { - Loop::run(function () { - $invoked = false; - $exception = new TestException; - $source = new StreamSource; + $exception = new TestException; + $source = new StreamSource; - $iterator = Stream\map($source->stream(), function ($value) use (&$invoked) { - $invoked = true; - }); + $iterator = Stream\map($source->stream(), $this->createCallback(0)); - $source->fail($exception); + $source->fail($exception); - try { - yield $iterator->continue(); - $this->fail("The exception used to fail the iterator should be thrown from advance()"); - } catch (TestException $reason) { - $this->assertSame($reason, $exception); - } + $this->expectExceptionObject($exception); - $this->assertFalse($invoked); - }); + yield $iterator->continue(); } } diff --git a/test/Stream/MergeTest.php b/test/Stream/MergeTest.php index a218aa2..cddb69e 100644 --- a/test/Stream/MergeTest.php +++ b/test/Stream/MergeTest.php @@ -4,14 +4,13 @@ namespace Amp\Test\Stream; use Amp\AsyncGenerator; use Amp\Delayed; -use Amp\Loop; +use Amp\PHPUnit\AsyncTestCase; use Amp\PHPUnit\TestException; use Amp\Stream; -use Amp\Test\BaseTest; -class MergeTest extends BaseTest +class MergeTest extends AsyncTestCase { - public function getArrays() + public function getArrays(): array { return [ [[\range(1, 3), \range(4, 6)], [1, 4, 2, 5, 3, 6]], @@ -23,22 +22,20 @@ class MergeTest extends BaseTest /** * @dataProvider getArrays * - * @param array $iterators + * @param array $streams * @param array $expected */ - public function testMerge(array $iterators, array $expected) + public function testMerge(array $streams, array $expected) { - Loop::run(function () use ($iterators, $expected) { - $iterators = \array_map(function (array $iterator): Stream { - return Stream\fromIterable($iterator); - }, $iterators); + $streams = \array_map(static function (array $iterator): Stream { + return Stream\fromIterable($iterator); + }, $streams); - $iterator = Stream\merge($iterators); + $stream = Stream\merge($streams); - while (list($value) = yield $iterator->continue()) { - $this->assertSame(\array_shift($expected), $value); - } - }); + while (list($value) = yield $stream->continue()) { + $this->assertSame(\array_shift($expected), $value); + } } /** @@ -46,30 +43,28 @@ class MergeTest extends BaseTest */ public function testMergeWithDelayedYields() { - Loop::run(function () { - $iterators = []; - $values1 = [new Delayed(10, 1), new Delayed(50, 2), new Delayed(70, 3)]; - $values2 = [new Delayed(20, 4), new Delayed(40, 5), new Delayed(60, 6)]; - $expected = [1, 4, 5, 2, 6, 3]; + $streams = []; + $values1 = [new Delayed(10, 1), new Delayed(50, 2), new Delayed(70, 3)]; + $values2 = [new Delayed(20, 4), new Delayed(40, 5), new Delayed(60, 6)]; + $expected = [1, 4, 5, 2, 6, 3]; - $iterators[] = new AsyncGenerator(function (callable $yield) use ($values1) { - foreach ($values1 as $value) { - yield $yield(yield $value); - } - }); - - $iterators[] = new AsyncGenerator(function (callable $yield) use ($values2) { - foreach ($values2 as $value) { - yield $yield(yield $value); - } - }); - - $iterator = Stream\merge($iterators); - - while (list($value) = yield $iterator->continue()) { - $this->assertSame(\array_shift($expected), $value); + $streams[] = new AsyncGenerator(function (callable $yield) use ($values1) { + foreach ($values1 as $value) { + yield $yield(yield $value); } }); + + $streams[] = new AsyncGenerator(function (callable $yield) use ($values2) { + foreach ($values2 as $value) { + yield $yield(yield $value); + } + }); + + $stream = Stream\merge($streams); + + while (list($value) = yield $stream->continue()) { + $this->assertSame(\array_shift($expected), $value); + } } /** @@ -77,28 +72,30 @@ class MergeTest extends BaseTest */ public function testMergeWithFailedStream() { - Loop::run(function () { - $exception = new TestException; - $generator = new AsyncGenerator(function (callable $yield) use ($exception) { - yield $yield(1); // Emit once before failing. - throw $exception; - }); - - $iterator = Stream\merge([$generator, Stream\fromIterable(\range(1, 5))]); - - try { - while (yield $iterator->continue()) ; - $this->fail("The exception used to fail the iterator should be thrown from advance()"); - } catch (TestException $reason) { - $this->assertSame($exception, $reason); - } + $exception = new TestException; + $generator = new AsyncGenerator(static function (callable $yield) use ($exception) { + yield $yield(1); // Emit once before failing. + throw $exception; }); + + $stream = Stream\merge([$generator, Stream\fromIterable(\range(1, 5))]); + + try { + /** @noinspection PhpStatementHasEmptyBodyInspection */ + while (yield $stream->continue()) { + ; + } + $this->fail("The exception used to fail the stream should be thrown from continue()"); + } catch (TestException $reason) { + $this->assertSame($exception, $reason); + } } public function testNonStream() { $this->expectException(\TypeError::class); + /** @noinspection PhpParamsInspection */ Stream\merge([1]); } } diff --git a/test/Stream/ToArrayTest.php b/test/Stream/ToArrayTest.php index c4e94af..5578823 100644 --- a/test/Stream/ToArrayTest.php +++ b/test/Stream/ToArrayTest.php @@ -2,21 +2,20 @@ namespace Amp\Test\Stream; +use Amp\PHPUnit\AsyncTestCase; use Amp\Stream; -use Amp\Test\BaseTest; -use function Amp\Promise\wait; -class ToArrayTest extends BaseTest +class ToArrayTest extends AsyncTestCase { public function testNonEmpty() { - $iterator = Stream\fromIterable(["abc", "foo", "bar"], 5); - $this->assertSame(["abc", "foo", "bar"], wait(Stream\toArray($iterator))); + $stream = Stream\fromIterable(["abc", "foo", "bar"], 5); + $this->assertSame(["abc", "foo", "bar"], yield Stream\toArray($stream)); } public function testEmpty() { - $iterator = Stream\fromIterable([], 5); - $this->assertSame([], wait(Stream\toArray($iterator))); + $stream = Stream\fromIterable([], 5); + $this->assertSame([], yield Stream\toArray($stream)); } }