mirror of
https://github.com/danog/amp.git
synced 2024-12-12 17:37:34 +01:00
c12828081f
This has been an edge case potentially hiding some exceptions. The tests have been refactored to error if the loop has watchers leaking from one test to another test.
106 lines
2.9 KiB
PHP
106 lines
2.9 KiB
PHP
<?php
|
|
|
|
namespace Amp\Test;
|
|
|
|
use Amp\Emitter;
|
|
use Amp\Iterator;
|
|
use Amp\Loop;
|
|
use Amp\PHPUnit\TestException;
|
|
use Amp\Producer;
|
|
|
|
class FilterTest extends BaseTest
|
|
{
|
|
public function testNoValuesEmitted()
|
|
{
|
|
$invoked = false;
|
|
Loop::run(function () use (&$invoked) {
|
|
$emitter = new Emitter;
|
|
|
|
$iterator = Iterator\filter($emitter->iterate(), function ($value) use (&$invoked) {
|
|
$invoked = true;
|
|
});
|
|
|
|
$this->assertInstanceOf(Iterator::class, $iterator);
|
|
|
|
$emitter->complete();
|
|
});
|
|
|
|
$this->assertFalse($invoked);
|
|
}
|
|
|
|
public function testValuesEmitted()
|
|
{
|
|
Loop::run(function () {
|
|
$count = 0;
|
|
$values = [1, 2, 3];
|
|
$expected = [1, 3];
|
|
$producer = new Producer(function (callable $emit) use ($values) {
|
|
foreach ($values as $value) {
|
|
yield $emit($value);
|
|
}
|
|
});
|
|
|
|
$iterator = Iterator\filter($producer, function ($value) use (&$count) {
|
|
++$count;
|
|
return $value & 1;
|
|
});
|
|
|
|
while (yield $iterator->advance()) {
|
|
$this->assertSame(\array_shift($expected), $iterator->getCurrent());
|
|
}
|
|
$this->assertSame(3, $count);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* @depends testValuesEmitted
|
|
*/
|
|
public function testCallbackThrows()
|
|
{
|
|
Loop::run(function () {
|
|
$values = [1, 2, 3];
|
|
$exception = new TestException;
|
|
$producer = new Producer(function (callable $emit) use ($values) {
|
|
foreach ($values as $value) {
|
|
yield $emit($value);
|
|
}
|
|
});
|
|
|
|
$iterator = Iterator\filter($producer, function () use ($exception) {
|
|
throw $exception;
|
|
});
|
|
|
|
try {
|
|
yield $iterator->advance();
|
|
$this->fail("The exception thrown from the filter callback should be thrown from advance()");
|
|
} catch (TestException $reason) {
|
|
$this->assertSame($reason, $exception);
|
|
}
|
|
});
|
|
}
|
|
|
|
public function testIteratorFails()
|
|
{
|
|
Loop::run(function () {
|
|
$invoked = false;
|
|
$exception = new TestException;
|
|
$emitter = new Emitter;
|
|
|
|
$iterator = Iterator\filter($emitter->iterate(), function ($value) use (&$invoked) {
|
|
$invoked = true;
|
|
});
|
|
|
|
$emitter->fail($exception);
|
|
|
|
try {
|
|
yield $iterator->advance();
|
|
$this->fail("The exception used to fail the iterator should be thrown from advance()");
|
|
} catch (TestException $reason) {
|
|
$this->assertSame($reason, $exception);
|
|
}
|
|
|
|
$this->assertFalse($invoked);
|
|
});
|
|
}
|
|
}
|