EventManagerTest.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789
  1. <?php
  2. declare(strict_types=1);
  3. /**
  4. * CakePHP : Rapid Development Framework (https://cakephp.org)
  5. * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
  6. *
  7. * Licensed under The MIT License
  8. * For full copyright and license information, please see the LICENSE.txt
  9. * Redistributions of files must retain the above copyright notice.
  10. *
  11. * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
  12. * @link https://cakephp.org CakePHP Project
  13. * @since 2.1.0
  14. * @license https://opensource.org/licenses/mit-license.php MIT License
  15. */
  16. namespace Cake\Test\TestCase\Event;
  17. use Cake\Event\Event;
  18. use Cake\Event\EventInterface;
  19. use Cake\Event\EventList;
  20. use Cake\Event\EventListenerInterface;
  21. use Cake\Event\EventManager;
  22. use Cake\TestSuite\TestCase;
  23. use TestApp\TestCase\Event\CustomTestEventListenerInterface;
  24. use TestApp\TestCase\Event\EventTestListener;
  25. /**
  26. * Tests the Cake\Event\EventManager class functionality
  27. */
  28. class EventManagerTest extends TestCase
  29. {
  30. /**
  31. * Test attach() with a listener interface.
  32. */
  33. public function testAttachListener(): void
  34. {
  35. $manager = new EventManager();
  36. $listener = new CustomTestEventListenerInterface();
  37. $manager->on($listener);
  38. $expected = [
  39. ['callable' => [$listener, 'listenerFunction']],
  40. ];
  41. $this->assertEquals($expected, $manager->listeners('fake.event'));
  42. }
  43. /**
  44. * Tests attached event listeners for matching key pattern
  45. */
  46. public function testMatchingListeners(): void
  47. {
  48. $manager = new EventManager();
  49. $manager->on('fake.event', 'fakeFunction1');
  50. $manager->on('real.event', 'fakeFunction2');
  51. $manager->on('test.event', 'fakeFunction3');
  52. $manager->on('event.test', 'fakeFunction4');
  53. $this->assertArrayHasKey('fake.event', $manager->matchingListeners('fake.event'));
  54. $this->assertArrayHasKey('real.event', $manager->matchingListeners('real.event'));
  55. $this->assertArrayHasKey('test.event', $manager->matchingListeners('test.event'));
  56. $this->assertArrayHasKey('event.test', $manager->matchingListeners('event.test'));
  57. $this->assertArrayHasKey('fake.event', $manager->matchingListeners('fake'));
  58. $this->assertArrayHasKey('real.event', $manager->matchingListeners('real'));
  59. $this->assertArrayHasKey('test.event', $manager->matchingListeners('test'));
  60. $this->assertArrayHasKey('event.test', $manager->matchingListeners('test'));
  61. $this->assertArrayHasKey('fake.event', $manager->matchingListeners('event'));
  62. $this->assertArrayHasKey('real.event', $manager->matchingListeners('event'));
  63. $this->assertArrayHasKey('test.event', $manager->matchingListeners('event'));
  64. $this->assertArrayHasKey('event.test', $manager->matchingListeners('event'));
  65. $this->assertArrayHasKey('fake.event', $manager->matchingListeners('.event'));
  66. $this->assertArrayHasKey('real.event', $manager->matchingListeners('.event'));
  67. $this->assertArrayHasKey('test.event', $manager->matchingListeners('.event'));
  68. $this->assertArrayHasKey('test.event', $manager->matchingListeners('test.'));
  69. $this->assertArrayHasKey('event.test', $manager->matchingListeners('.test'));
  70. $this->assertEmpty($manager->matchingListeners('/test'));
  71. $this->assertEmpty($manager->matchingListeners('test/'));
  72. $this->assertEmpty($manager->matchingListeners('/test/'));
  73. $this->assertEmpty($manager->matchingListeners('test$'));
  74. $this->assertEmpty($manager->matchingListeners('ev.nt'));
  75. $this->assertEmpty($manager->matchingListeners('^test'));
  76. $this->assertEmpty($manager->matchingListeners('^event'));
  77. $this->assertEmpty($manager->matchingListeners('*event'));
  78. $this->assertEmpty($manager->matchingListeners('event*'));
  79. $this->assertEmpty($manager->matchingListeners('foo'));
  80. $expected = ['fake.event', 'real.event', 'test.event', 'event.test'];
  81. $result = $manager->matchingListeners('event');
  82. $this->assertNotEmpty($result);
  83. $this->assertSame($expected, array_keys($result));
  84. $expected = ['fake.event', 'real.event', 'test.event'];
  85. $result = $manager->matchingListeners('.event');
  86. $this->assertNotEmpty($result);
  87. $this->assertSame($expected, array_keys($result));
  88. $expected = ['test.event', 'event.test'];
  89. $result = $manager->matchingListeners('test');
  90. $this->assertNotEmpty($result);
  91. $this->assertSame($expected, array_keys($result));
  92. $expected = ['test.event'];
  93. $result = $manager->matchingListeners('test.');
  94. $this->assertNotEmpty($result);
  95. $this->assertSame($expected, array_keys($result));
  96. $expected = ['event.test'];
  97. $result = $manager->matchingListeners('.test');
  98. $this->assertNotEmpty($result);
  99. $this->assertSame($expected, array_keys($result));
  100. }
  101. /**
  102. * Test the on() method for basic callable types.
  103. */
  104. public function testOn(): void
  105. {
  106. $count = 1;
  107. $manager = new EventManager();
  108. $manager->on('my.event', 'substr');
  109. $expected = [
  110. ['callable' => 'substr'],
  111. ];
  112. $this->assertSame($expected, $manager->listeners('my.event'));
  113. $manager->on('my.event', ['priority' => 1], 'strpos');
  114. $expected = [
  115. ['callable' => 'strpos'],
  116. ['callable' => 'substr'],
  117. ];
  118. $this->assertSame($expected, $manager->listeners('my.event'));
  119. $listener = new CustomTestEventListenerInterface();
  120. $manager->on($listener);
  121. $expected = [
  122. ['callable' => [$listener, 'listenerFunction']],
  123. ];
  124. $this->assertEquals($expected, $manager->listeners('fake.event'));
  125. }
  126. /**
  127. * Tests off'ing an event from a event key queue
  128. */
  129. public function testOff(): void
  130. {
  131. $manager = new EventManager();
  132. $manager->on('fake.event', ['AClass', 'aMethod']);
  133. $manager->on('another.event', ['AClass', 'anotherMethod']);
  134. $manager->on('another.event', ['priority' => 1], 'substr');
  135. $manager->off('fake.event', ['AClass', 'aMethod']);
  136. $this->assertEquals([], $manager->listeners('fake.event'));
  137. $manager->off('another.event', ['AClass', 'anotherMethod']);
  138. $expected = [
  139. ['callable' => 'substr'],
  140. ];
  141. $this->assertEquals($expected, $manager->listeners('another.event'));
  142. $manager->off('another.event', 'substr');
  143. $this->assertEquals([], $manager->listeners('another.event'));
  144. }
  145. /**
  146. * Tests off'ing an event from all event queues
  147. */
  148. public function testOffFromAll(): void
  149. {
  150. $manager = new EventManager();
  151. $callable = function (): void {
  152. };
  153. $manager->on('fake.event', $callable);
  154. $manager->on('another.event', $callable);
  155. $manager->on('another.event', ['priority' => 1], 'substr');
  156. $manager->off($callable);
  157. $expected = [
  158. ['callable' => 'substr'],
  159. ];
  160. $this->assertEquals($expected, $manager->listeners('another.event'));
  161. $this->assertEquals([], $manager->listeners('fake.event'));
  162. }
  163. /**
  164. * Tests off'ing all listeners for an event
  165. */
  166. public function testRemoveAllListeners(): void
  167. {
  168. $manager = new EventManager();
  169. $manager->on('fake.event', ['AClass', 'aMethod']);
  170. $manager->on('another.event', ['priority' => 1], 'substr');
  171. $manager->off('fake.event');
  172. $expected = [
  173. ['callable' => 'substr'],
  174. ];
  175. $this->assertEquals($expected, $manager->listeners('another.event'));
  176. $this->assertEquals([], $manager->listeners('fake.event'));
  177. }
  178. /**
  179. * Tests event dispatching
  180. *
  181. * @triggers fake.event
  182. */
  183. public function testDispatch(): void
  184. {
  185. $manager = new EventManager();
  186. $listener = $this->getMockBuilder(EventTestListener::class)
  187. ->getMock();
  188. $anotherListener = $this->getMockBuilder(EventTestListener::class)
  189. ->getMock();
  190. $manager->on('fake.event', [$listener, 'listenerFunction']);
  191. $manager->on('fake.event', [$anotherListener, 'listenerFunction']);
  192. $event = new Event('fake.event');
  193. $listener->expects($this->once())->method('listenerFunction')->with($event);
  194. $anotherListener->expects($this->once())->method('listenerFunction')->with($event);
  195. $manager->dispatch($event);
  196. }
  197. /**
  198. * Tests event dispatching using event key name
  199. */
  200. public function testDispatchWithKeyName(): void
  201. {
  202. $manager = new EventManager();
  203. $listener = new EventTestListener();
  204. $manager->on('fake.event', [$listener, 'listenerFunction']);
  205. $event = 'fake.event';
  206. $manager->dispatch($event);
  207. $expected = ['listenerFunction'];
  208. $this->assertEquals($expected, $listener->callList);
  209. }
  210. /**
  211. * Tests event dispatching with a return value
  212. *
  213. * @triggers fake.event
  214. */
  215. public function testDispatchReturnValue(): void
  216. {
  217. $manager = new EventManager();
  218. $listener = $this->getMockBuilder(EventTestListener::class)
  219. ->getMock();
  220. $anotherListener = $this->getMockBuilder(EventTestListener::class)
  221. ->getMock();
  222. $manager->on('fake.event', [$listener, 'listenerFunction']);
  223. $manager->on('fake.event', [$anotherListener, 'listenerFunction']);
  224. $event = new Event('fake.event');
  225. $listener->expects($this->once())
  226. ->method('listenerFunction')
  227. ->with($event)
  228. ->will($this->returnValue('something special'));
  229. $anotherListener->expects($this->once())
  230. ->method('listenerFunction')
  231. ->with($event);
  232. $manager->dispatch($event);
  233. $this->assertSame('something special', $event->getResult());
  234. }
  235. /**
  236. * Tests that returning false in a callback stops the event
  237. *
  238. * @triggers fake.event
  239. */
  240. public function testDispatchFalseStopsEvent(): void
  241. {
  242. $manager = new EventManager();
  243. $listener = $this->getMockBuilder(EventTestListener::class)
  244. ->getMock();
  245. $anotherListener = $this->getMockBuilder(EventTestListener::class)
  246. ->getMock();
  247. $manager->on('fake.event', [$listener, 'listenerFunction']);
  248. $manager->on('fake.event', [$anotherListener, 'listenerFunction']);
  249. $event = new Event('fake.event');
  250. $listener->expects($this->once())->method('listenerFunction')
  251. ->with($event)
  252. ->will($this->returnValue(false));
  253. $anotherListener->expects($this->never())
  254. ->method('listenerFunction');
  255. $manager->dispatch($event);
  256. $this->assertTrue($event->isStopped());
  257. }
  258. /**
  259. * Tests event dispatching using priorities
  260. *
  261. * @triggers fake.event
  262. */
  263. public function testDispatchPrioritized(): void
  264. {
  265. $manager = new EventManager();
  266. $listener = new EventTestListener();
  267. $manager->on('fake.event', [$listener, 'listenerFunction']);
  268. $manager->on('fake.event', ['priority' => 5], [$listener, 'secondListenerFunction']);
  269. $event = new Event('fake.event');
  270. $manager->dispatch($event);
  271. $expected = ['secondListenerFunction', 'listenerFunction'];
  272. $this->assertEquals($expected, $listener->callList);
  273. }
  274. /**
  275. * Tests subscribing a listener object and firing the events it subscribed to
  276. *
  277. * @triggers fake.event
  278. * @triggers another.event $this, array(some => data)
  279. */
  280. public function testOnSubscriber(): void
  281. {
  282. $manager = new EventManager();
  283. /** @var \TestApp\TestCase\Event\CustomTestEventListenerInterface|\PHPUnit\Framework\MockObject\MockObject $listener */
  284. $listener = $this->getMockBuilder(CustomTestEventListenerInterface::class)
  285. ->onlyMethods(['secondListenerFunction'])
  286. ->getMock();
  287. $manager->on($listener);
  288. $event = new Event('fake.event');
  289. $manager->dispatch($event);
  290. $expected = ['listenerFunction'];
  291. $this->assertEquals($expected, $listener->callList);
  292. $event = new Event('another.event', $this, ['some' => 'data']);
  293. $listener->expects($this->once())
  294. ->method('secondListenerFunction')
  295. ->with($event, 'data');
  296. $manager->dispatch($event);
  297. }
  298. /**
  299. * Test implementedEvents binding multiple callbacks to the same event name.
  300. *
  301. * @triggers multiple.handlers
  302. */
  303. public function testOnSubscriberMultiple(): void
  304. {
  305. $manager = new EventManager();
  306. $listener = $this->getMockBuilder(CustomTestEventListenerInterface::class)
  307. ->onlyMethods(['listenerFunction', 'thirdListenerFunction'])
  308. ->getMock();
  309. $manager->on($listener);
  310. $event = new Event('multiple.handlers');
  311. $listener->expects($this->once())
  312. ->method('listenerFunction')
  313. ->with($event);
  314. $listener->expects($this->once())
  315. ->method('thirdListenerFunction')
  316. ->with($event);
  317. $manager->dispatch($event);
  318. }
  319. /**
  320. * Tests subscribing a listener object and firing the events it subscribed to
  321. */
  322. public function testDetachSubscriber(): void
  323. {
  324. $manager = new EventManager();
  325. $listener = $this->getMockBuilder(CustomTestEventListenerInterface::class)
  326. ->onlyMethods(['secondListenerFunction'])
  327. ->getMock();
  328. $manager->on($listener);
  329. $expected = [
  330. ['callable' => [$listener, 'secondListenerFunction']],
  331. ];
  332. $this->assertEquals($expected, $manager->listeners('another.event'));
  333. $expected = [
  334. ['callable' => [$listener, 'listenerFunction']],
  335. ];
  336. $this->assertEquals($expected, $manager->listeners('fake.event'));
  337. $manager->off($listener);
  338. $this->assertEquals([], $manager->listeners('fake.event'));
  339. $this->assertEquals([], $manager->listeners('another.event'));
  340. }
  341. /**
  342. * Tests that it is possible to get/set the manager singleton
  343. */
  344. public function testGlobalDispatcherGetter(): void
  345. {
  346. $this->assertInstanceOf('Cake\Event\EventManager', EventManager::instance());
  347. $manager = new EventManager();
  348. EventManager::instance($manager);
  349. $this->assertSame($manager, EventManager::instance());
  350. }
  351. /**
  352. * Tests that the global event manager gets the event too from any other manager
  353. *
  354. * @triggers fake.event
  355. */
  356. public function testDispatchWithGlobal(): void
  357. {
  358. $generalManager = $this->getMockBuilder('Cake\Event\EventManager')
  359. ->onlyMethods(['prioritisedListeners'])
  360. ->getMock();
  361. $manager = new EventManager();
  362. $event = new Event('fake.event');
  363. EventManager::instance($generalManager);
  364. $generalManager->expects($this->once())->method('prioritisedListeners')->with('fake.event');
  365. $manager->dispatch($event);
  366. EventManager::instance(new EventManager());
  367. }
  368. /**
  369. * Tests that stopping an event will not notify the rest of the listeners
  370. *
  371. * @triggers fake.event
  372. */
  373. public function testStopPropagation(): void
  374. {
  375. $generalManager = $this->getMockBuilder('Cake\Event\EventManager')->getMock();
  376. $manager = new EventManager();
  377. $listener = new EventTestListener();
  378. EventManager::instance($generalManager);
  379. $generalManager->expects($this->any())
  380. ->method('prioritisedListeners')
  381. ->with('fake.event')
  382. ->will($this->returnValue([]));
  383. $manager->on('fake.event', [$listener, 'listenerFunction']);
  384. $manager->on('fake.event', ['priority' => 8], [$listener, 'stopListener']);
  385. $manager->on('fake.event', ['priority' => 5], [$listener, 'secondListenerFunction']);
  386. $event = new Event('fake.event');
  387. $manager->dispatch($event);
  388. $expected = ['secondListenerFunction'];
  389. $this->assertEquals($expected, $listener->callList);
  390. EventManager::instance(new EventManager());
  391. }
  392. /**
  393. * Tests event dispatching using priorities
  394. *
  395. * @triggers fake.event
  396. */
  397. public function testDispatchPrioritizedWithGlobal(): void
  398. {
  399. $generalManager = $this->getMockBuilder('Cake\Event\EventManager')->getMock();
  400. $manager = new EventManager();
  401. $listener = new CustomTestEventListenerInterface();
  402. $event = new Event('fake.event');
  403. EventManager::instance($generalManager);
  404. $generalManager->expects($this->any())
  405. ->method('prioritisedListeners')
  406. ->with('fake.event')
  407. ->will($this->returnValue(
  408. [11 => [
  409. ['callable' => [$listener, 'secondListenerFunction']],
  410. ]]
  411. ));
  412. $manager->on('fake.event', [$listener, 'listenerFunction']);
  413. $manager->on('fake.event', ['priority' => 15], [$listener, 'thirdListenerFunction']);
  414. $manager->dispatch($event);
  415. $expected = ['listenerFunction', 'secondListenerFunction', 'thirdListenerFunction'];
  416. $this->assertEquals($expected, $listener->callList);
  417. EventManager::instance(new EventManager());
  418. }
  419. /**
  420. * Tests event dispatching using priorities
  421. *
  422. * @triggers fake.event
  423. */
  424. public function testDispatchGlobalBeforeLocal(): void
  425. {
  426. $generalManager = $this->getMockBuilder('Cake\Event\EventManager')->getMock();
  427. $manager = new EventManager();
  428. $listener = new CustomTestEventListenerInterface();
  429. $event = new Event('fake.event');
  430. EventManager::instance($generalManager);
  431. $generalManager->expects($this->any())
  432. ->method('prioritisedListeners')
  433. ->with('fake.event')
  434. ->will($this->returnValue(
  435. [10 => [
  436. ['callable' => [$listener, 'listenerFunction']],
  437. ]]
  438. ));
  439. $manager->on('fake.event', [$listener, 'secondListenerFunction']);
  440. $manager->dispatch($event);
  441. $expected = ['listenerFunction', 'secondListenerFunction'];
  442. $this->assertEquals($expected, $listener->callList);
  443. EventManager::instance(new EventManager());
  444. }
  445. /**
  446. * test callback
  447. */
  448. public function onMyEvent(EventInterface $event): void
  449. {
  450. $event->setData('callback', 'ok');
  451. }
  452. /**
  453. * Tests events dispatched by a local manager can be handled by
  454. * handler registered in the global event manager
  455. *
  456. * @triggers my_event $manager
  457. */
  458. public function testDispatchLocalHandledByGlobal(): void
  459. {
  460. $callback = [$this, 'onMyEvent'];
  461. EventManager::instance()->on('my_event', $callback);
  462. $manager = new EventManager();
  463. $event = new Event('my_event', $manager);
  464. $manager->dispatch($event);
  465. $this->assertSame('ok', $event->getData('callback'));
  466. }
  467. /**
  468. * Test that events are dispatched properly when there are global and local
  469. * listeners at the same priority.
  470. *
  471. * @triggers fake.event $this
  472. */
  473. public function testDispatchWithGlobalAndLocalEvents(): void
  474. {
  475. $listener = new CustomTestEventListenerInterface();
  476. EventManager::instance()->on($listener);
  477. $listener2 = new EventTestListener();
  478. $manager = new EventManager();
  479. $manager->on('fake.event', [$listener2, 'listenerFunction']);
  480. $manager->dispatch(new Event('fake.event', $this));
  481. $this->assertEquals(['listenerFunction'], $listener->callList);
  482. $this->assertEquals(['listenerFunction'], $listener2->callList);
  483. }
  484. /**
  485. * Test getting a list of dispatched events from the manager.
  486. *
  487. * @triggers my_event $this
  488. * @triggers my_second_event $this
  489. */
  490. public function testGetDispatchedEvents(): void
  491. {
  492. $eventList = new EventList();
  493. $event = new Event('my_event', $this);
  494. $event2 = new Event('my_second_event', $this);
  495. $manager = new EventManager();
  496. $manager->setEventList($eventList);
  497. $manager->dispatch($event);
  498. $manager->dispatch($event2);
  499. $result = $manager->getEventList();
  500. $this->assertInstanceOf('Cake\Event\EventList', $result);
  501. $this->assertCount(2, $result);
  502. $this->assertEquals($result[0], $event);
  503. $this->assertEquals($result[1], $event2);
  504. $manager->getEventList()->flush();
  505. $result = $manager->getEventList();
  506. $this->assertCount(0, $result);
  507. $manager->unsetEventList();
  508. $manager->dispatch($event);
  509. $manager->dispatch($event2);
  510. $result = $manager->getEventList();
  511. $this->assertNull($result);
  512. }
  513. /**
  514. * Test that locally dispatched events are also added to the global manager's event list
  515. *
  516. * @triggers Event $this
  517. */
  518. public function testGetLocallyDispatchedEventsFromGlobal(): void
  519. {
  520. $localList = new EventList();
  521. $globalList = new EventList();
  522. $globalManager = EventManager::instance();
  523. $globalManager->setEventList($globalList);
  524. $localManager = new EventManager();
  525. $localManager->setEventList($localList);
  526. $globalEvent = new Event('GlobalEvent', $this);
  527. $globalManager->dispatch($globalEvent);
  528. $localEvent = new Event('LocalEvent', $this);
  529. $localManager->dispatch($localEvent);
  530. $this->assertTrue($globalList->hasEvent('GlobalEvent'));
  531. $this->assertFalse($localList->hasEvent('GlobalEvent'));
  532. $this->assertTrue($localList->hasEvent('LocalEvent'));
  533. $this->assertTrue($globalList->hasEvent('LocalEvent'));
  534. }
  535. /**
  536. * Test isTrackingEvents
  537. */
  538. public function testIsTrackingEvents(): void
  539. {
  540. $this->assertFalse(EventManager::instance()->isTrackingEvents());
  541. $manager = new EventManager();
  542. $manager->setEventList(new EventList());
  543. $this->assertTrue($manager->isTrackingEvents());
  544. $manager->trackEvents(false);
  545. $this->assertFalse($manager->isTrackingEvents());
  546. }
  547. public function testDebugInfo(): void
  548. {
  549. $eventManager = new EventManager();
  550. $this->assertSame(
  551. [
  552. '_listeners' => [],
  553. '_isGlobal' => false,
  554. '_trackEvents' => false,
  555. '_generalManager' => '(object) EventManager',
  556. '_dispatchedEvents' => null,
  557. ],
  558. $eventManager->__debugInfo()
  559. );
  560. $eventManager->setEventList(new EventList());
  561. $eventManager->addEventToList(new Event('Foo', $this));
  562. $this->assertSame(
  563. [
  564. '_listeners' => [],
  565. '_isGlobal' => false,
  566. '_trackEvents' => true,
  567. '_generalManager' => '(object) EventManager',
  568. '_dispatchedEvents' => [
  569. 'Foo with subject Cake\Test\TestCase\Event\EventManagerTest',
  570. ],
  571. ],
  572. $eventManager->__debugInfo()
  573. );
  574. $eventManager->unsetEventList();
  575. $func = function (): void {
  576. };
  577. $eventManager->on('foo', $func);
  578. $this->assertSame(
  579. [
  580. '_listeners' => [
  581. 'foo' => '1 listener(s)',
  582. ],
  583. '_isGlobal' => false,
  584. '_trackEvents' => false,
  585. '_generalManager' => '(object) EventManager',
  586. '_dispatchedEvents' => null,
  587. ],
  588. $eventManager->__debugInfo()
  589. );
  590. $eventManager->off('foo', $func);
  591. $this->assertSame(
  592. [
  593. '_listeners' => [
  594. 'foo' => '0 listener(s)',
  595. ],
  596. '_isGlobal' => false,
  597. '_trackEvents' => false,
  598. '_generalManager' => '(object) EventManager',
  599. '_dispatchedEvents' => null,
  600. ],
  601. $eventManager->__debugInfo()
  602. );
  603. $eventManager->on('bar', function (): void {
  604. });
  605. $eventManager->on('bar', function (): void {
  606. });
  607. $eventManager->on('bar', function (): void {
  608. });
  609. $eventManager->on('baz', function (): void {
  610. });
  611. $this->assertSame(
  612. [
  613. '_listeners' => [
  614. 'foo' => '0 listener(s)',
  615. 'bar' => '3 listener(s)',
  616. 'baz' => '1 listener(s)',
  617. ],
  618. '_isGlobal' => false,
  619. '_trackEvents' => false,
  620. '_generalManager' => '(object) EventManager',
  621. '_dispatchedEvents' => null,
  622. ],
  623. $eventManager->__debugInfo()
  624. );
  625. }
  626. /**
  627. * test debugInfo with an event list.
  628. */
  629. public function testDebugInfoEventList(): void
  630. {
  631. $eventList = new EventList();
  632. $eventManager = new EventManager();
  633. $eventManager->setEventList($eventList);
  634. $eventManager->on('example', function (): void {
  635. });
  636. $eventManager->dispatch('example');
  637. $this->assertSame(
  638. [
  639. '_listeners' => [
  640. 'example' => '1 listener(s)',
  641. ],
  642. '_isGlobal' => false,
  643. '_trackEvents' => true,
  644. '_generalManager' => '(object) EventManager',
  645. '_dispatchedEvents' => [
  646. 'example with no subject',
  647. ],
  648. ],
  649. $eventManager->__debugInfo()
  650. );
  651. }
  652. /**
  653. * Test that chainable methods return correct values.
  654. */
  655. public function testChainableMethods(): void
  656. {
  657. $eventManager = new EventManager();
  658. $listener = $this->createMock(EventListenerInterface::class);
  659. $callable = function (): void {
  660. };
  661. $returnValue = $eventManager->on($listener);
  662. $this->assertSame($eventManager, $returnValue);
  663. $returnValue = $eventManager->on('foo', $callable);
  664. $this->assertSame($eventManager, $returnValue);
  665. $returnValue = $eventManager->on('foo', [], $callable);
  666. $this->assertSame($eventManager, $returnValue);
  667. $returnValue = $eventManager->off($listener);
  668. $this->assertSame($eventManager, $returnValue);
  669. $returnValue = $eventManager->off('foo', $listener);
  670. $this->assertSame($eventManager, $returnValue);
  671. $returnValue = $eventManager->off('foo', $callable);
  672. $this->assertSame($eventManager, $returnValue);
  673. $returnValue = $eventManager->off('foo');
  674. $this->assertSame($eventManager, $returnValue);
  675. $returnValue = $eventManager->setEventList(new EventList());
  676. $this->assertSame($eventManager, $returnValue);
  677. $returnValue = $eventManager->addEventToList(new Event('foo'));
  678. $this->assertSame($eventManager, $returnValue);
  679. $returnValue = $eventManager->trackEvents(true);
  680. $this->assertSame($eventManager, $returnValue);
  681. $returnValue = $eventManager->unsetEventList();
  682. $this->assertSame($eventManager, $returnValue);
  683. }
  684. }