File: EventManagerTest.php

package info (click to toggle)
php-doctrine-event-manager 2.0.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 200 kB
  • sloc: php: 161; xml: 26; makefile: 21
file content (119 lines) | stat: -rw-r--r-- 3,947 bytes parent folder | download
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
<?php

declare(strict_types=1);

namespace Doctrine\Tests\Common;

use Doctrine\Common\EventArgs;
use Doctrine\Common\EventManager;
use Doctrine\Common\EventSubscriber;
use PHPUnit\Framework\TestCase;
use ReflectionProperty;

use function array_keys;

class EventManagerTest extends TestCase
{
    /* Some pseudo events */
    private const PRE_FOO  = 'preFoo';
    private const POST_FOO = 'postFoo';
    private const PRE_BAR  = 'preBar';

    private bool $preFooInvoked  = false;
    private bool $postFooInvoked = false;
    private EventManager $eventManager;

    protected function setUp(): void
    {
        $this->eventManager   = new EventManager();
        $this->preFooInvoked  = false;
        $this->postFooInvoked = false;
    }

    public function testInitialState(): void
    {
        self::assertEquals([], $this->eventManager->getAllListeners());
        self::assertFalse($this->eventManager->hasListeners(self::PRE_FOO));
        self::assertFalse($this->eventManager->hasListeners(self::POST_FOO));
    }

    public function testAddEventListener(): void
    {
        $this->eventManager->addEventListener(['preFoo', 'postFoo'], $this);
        self::assertTrue($this->eventManager->hasListeners(self::PRE_FOO));
        self::assertTrue($this->eventManager->hasListeners(self::POST_FOO));
        self::assertCount(1, $this->eventManager->getListeners(self::PRE_FOO));
        self::assertCount(1, $this->eventManager->getListeners(self::POST_FOO));
        self::assertCount(2, $this->eventManager->getAllListeners());
        self::assertSame(['preFoo', 'postFoo'], array_keys($this->eventManager->getAllListeners()));
    }

    public function testDispatchEvent(): void
    {
        $this->eventManager->addEventListener(['preFoo', 'postFoo'], $this);
        $this->eventManager->dispatchEvent(self::PRE_FOO);
        self::assertTrue($this->preFooInvoked);
        self::assertFalse($this->postFooInvoked);
    }

    public function testRemoveEventListener(): void
    {
        $this->eventManager->addEventListener(['preBar'], $this);
        self::assertTrue($this->eventManager->hasListeners(self::PRE_BAR));
        $this->eventManager->removeEventListener(['preBar'], $this);
        self::assertFalse($this->eventManager->hasListeners(self::PRE_BAR));
    }

    public function testAddEventSubscriber(): void
    {
        $eventSubscriber = new TestEventSubscriber();
        $this->eventManager->addEventSubscriber($eventSubscriber);
        self::assertTrue($this->eventManager->hasListeners(self::PRE_FOO));
        self::assertTrue($this->eventManager->hasListeners(self::POST_FOO));
    }

    public function testRemoveEventSubscriber(): void
    {
        $eventSubscriber = new TestEventSubscriber();
        $this->eventManager->addEventSubscriber($eventSubscriber);
        $this->eventManager->removeEventSubscriber($eventSubscriber);
        self::assertFalse($this->eventManager->hasListeners(self::PRE_FOO));
        self::assertFalse($this->eventManager->hasListeners(self::POST_FOO));
    }

    public function testNoDispatchingForUnregisteredEvent(): void
    {
        $reflection = new ReflectionProperty(EventArgs::class, 'emptyEventArgsInstance');
        $reflection->setValue(null, null);

        $this->eventManager->dispatchEvent('unknown');

        self::assertNull($reflection->getValue(null));
    }

    public function testEmptyListenersListForUnregisteredEvent(): void
    {
        self::assertSame([], $this->eventManager->getListeners('unknown'));
    }

    /* Listener methods */

    public function preFoo(EventArgs $e): void
    {
        $this->preFooInvoked = true;
    }

    public function postFoo(EventArgs $e): void
    {
        $this->postFooInvoked = true;
    }
}

class TestEventSubscriber implements EventSubscriber
{
    /** @return string[] */
    public function getSubscribedEvents(): array
    {
        return ['preFoo', 'postFoo'];
    }
}