1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
<?php
declare(strict_types=1);
namespace LaminasTest\EventManager;
use Laminas\EventManager\Exception\InvalidArgumentException;
use Laminas\EventManager\Filter\FilterIterator;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\TestCase;
final class FilterIteratorTest extends TestCase
{
public function testNextReturnsNullOnEmptyChain(): void
{
$filterIterator = new FilterIterator();
self::assertNull($filterIterator->next([]));
}
public function testNextReturnsNullWithEmptyHeap(): void
{
$filterIterator = new FilterIterator();
self::assertNull($filterIterator->next([0, 1, 2]));
}
public function testContainsReturnsFalseForInvalidElement(): void
{
$filterIterator = new FilterIterator();
self::assertFalse($filterIterator->contains('foo'));
}
public function testContainsReturnsTrueForValidElement(): void
{
$callback = function () {
};
$filterIterator = new FilterIterator();
$filterIterator->insert($callback, 1);
self::assertTrue($filterIterator->contains($callback));
}
public function testRemoveFromEmptyQueueReturnsFalse(): void
{
$filterIterator = new FilterIterator();
self::assertFalse($filterIterator->remove('foo'));
}
public function testRemoveUnrecognizedItemFromQueueReturnsFalse(): void
{
$callback = function () {
};
$filterIterator = new FilterIterator();
$filterIterator->insert($callback, 1);
self::assertFalse($filterIterator->remove(clone $callback));
}
public function testRemoveValidItemFromQueueReturnsTrue(): void
{
$callback = function () {
};
$filterIterator = new FilterIterator();
$filterIterator->insert($callback, 1);
self::assertTrue($filterIterator->remove($callback));
}
public function testNextReturnsNullWhenFilterChainIsEmpty(): void
{
$filterIterator = new FilterIterator();
$chain = new FilterIterator();
self::assertNull($filterIterator->next([0, 1, 2], ['foo', 'bar'], $chain));
}
/** @psalm-return array<string, array{0: mixed}> */
public static function invalidFilters(): array
{
return [
'null' => [null],
'true' => [true],
'false' => [false],
'zero' => [0],
'int' => [1],
'zero-float' => [0.0],
'float' => [1.1],
'non-callable-string' => ['not a function'],
'non-callable-array' => [['not a function']],
'non-invokable-object' => [(object) ['__invoke' => 'not a function']],
];
}
/**
* @param mixed $filter
*/
#[DataProvider('invalidFilters')]
public function testInsertShouldRaiseExceptionOnNonCallableDatum($filter)
{
$iterator = new FilterIterator();
$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('callables');
$iterator->insert($filter, 1);
}
}
|