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
|
<?php
declare(strict_types=1);
namespace LaminasTest\EventManager;
use Laminas\EventManager\EventManager;
use Laminas\EventManager\SharedEventManager;
use LaminasTest\EventManager\TestAsset\CountingListener;
use PHPUnit\Framework\TestCase;
use function array_rand;
use function range;
use function sprintf;
final class SharedListenerIntegrationTest extends TestCase
{
/** @var string[] */
private array $identifiers;
private SharedEventManager $sharedEvents;
private EventManager $events;
protected function setUp(): void
{
$this->identifiers = ['Foo', 'Bar', 'Baz'];
$this->sharedEvents = new SharedEventManager();
$this->events = new EventManager($this->sharedEvents, $this->identifiers);
}
public function testCanTriggerTheSameSharedListenerMultipleTimes(): void
{
$listener = new CountingListener();
$this->sharedEvents->attach('Foo', 'foo', $listener);
$iterations = array_rand(range(5, 100));
for ($i = 0; $i < $iterations; $i += 1) {
$this->events->trigger('foo');
}
self::assertSame($iterations, $listener->count);
}
public function testTriggeringSameEventMultipleTimesTriggersNewSharedListeners(): void
{
$listeners = [];
for ($i = 0; $i < 5; $i += 1) {
$listeners[$i] = $listener = new CountingListener();
$this->sharedEvents->attach('Foo', 'foo', $listener);
$this->events->trigger('foo');
}
for ($i = 0; $i < 5; $i += 1) {
$expected = 5 - $i;
$listener = $listeners[$i];
self::assertSame(
$expected,
$listener->count,
sprintf('Listener %s was not triggered expected %d times; instead %d', $i, $expected, $listener->count)
);
}
}
public function testTriggeringSameEventMultipleTimesDoesNotTriggersDetachedSharedListeners(): void
{
/** @var array<int, CountingListener> $listeners */
$listeners = [];
$identifiers = ['Foo', 'Bar', 'Baz'];
$sharedEvents = new SharedEventManager();
$events = new EventManager($sharedEvents, $identifiers);
for ($i = 0; $i < 5; $i += 1) {
$listeners[$i] = $listener = new CountingListener();
$listener->index = $i;
$sharedEvents->attach('Foo', 'foo', $listener);
}
for ($i = 0; $i < 5; $i += 1) {
$sharedEvents->detach($listeners[$i], 'Foo', 'foo');
$events->trigger('foo');
}
for ($i = 0; $i < 5; $i += 1) {
$listener = $listeners[$i];
self::assertEquals($i, $listener->count);
}
}
}
|