2 declare(strict_types = 1);
26 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
43 protected function setUp()
45 $accessibleClassName = $this->getAccessibleMock(Dispatcher::class, [
'dummy']);
46 $this->signalSlotDispatcher =
new $accessibleClassName();
54 $mockSignal = $this->getMockBuilder(
'ClassA')
55 ->setMethods([
'emitSomeSignal'])
57 $mockSlot = $this->getMockBuilder(
'ClassB')
58 ->setMethods([
'someSlotMethod'])
60 $this->signalSlotDispatcher->connect(get_class($mockSignal),
'emitSomeSignal', get_class($mockSlot),
'someSlotMethod',
true);
62 [
'class' => get_class($mockSlot),
'method' =>
'someSlotMethod',
'object' =>
null,
'passSignalInformation' =>
true]
64 $this->assertSame($expectedSlots, $this->signalSlotDispatcher->getSlots(get_class($mockSignal),
'emitSomeSignal'));
72 $mockSignal = $this->getMockBuilder(
'ClassA')
73 ->setMethods([
'emitSomeSignal'])
75 $mockSlot = $this->getMockBuilder(
'ClassB')
76 ->setMethods([
'someSlotMethod'])
78 $this->signalSlotDispatcher->connect(get_class($mockSignal),
'emitSomeSignal', $mockSlot,
'someSlotMethod',
true);
80 [
'class' =>
null,
'method' =>
'someSlotMethod',
'object' => $mockSlot,
'passSignalInformation' =>
true]
82 $this->assertSame($expectedSlots, $this->signalSlotDispatcher->getSlots(get_class($mockSignal),
'emitSomeSignal'));
90 $mockSignal = $this->getMockBuilder(
'ClassA')
91 ->setMethods([
'emitSomeSignal'])
93 $mockSlot =
function () {
95 $this->signalSlotDispatcher->connect(get_class($mockSignal),
'emitSomeSignal', $mockSlot,
'foo',
true);
97 [
'class' =>
null,
'method' =>
'__invoke',
'object' => $mockSlot,
'passSignalInformation' =>
true]
99 $this->assertSame($expectedSlots, $this->signalSlotDispatcher->getSlots(get_class($mockSignal),
'emitSomeSignal'));
108 $mockSlot =
function () use (&$arguments) {
109 $arguments = func_get_args();
111 $this->signalSlotDispatcher->connect(
'Foo',
'bar', $mockSlot,
null,
false);
112 $this->signalSlotDispatcher->dispatch(
'Foo',
'bar', [
'bar',
'quux']);
113 $this->assertSame([
'bar',
'quux'], $arguments);
121 $slotClassName = OnlyClassNameSpecifiedFixture::class;
122 $mockSlot =
new OnlyClassNameSpecifiedFixture();
123 $mockObjectManager = $this->createMock(ObjectManagerInterface::class);
124 $mockObjectManager->expects($this->once())->method(
'isRegistered')->with($slotClassName)->will($this->returnValue(
true));
125 $mockObjectManager->expects($this->once())->method(
'get')->with($slotClassName)->will($this->returnValue($mockSlot));
126 $mockLogger = $this->createMock(Logger::class);
127 $this->signalSlotDispatcher->_set(
'objectManager', $mockObjectManager);
128 $this->signalSlotDispatcher->_set(
'isInitialized',
true);
129 $this->signalSlotDispatcher->_set(
'logger', $mockLogger);
130 $this->signalSlotDispatcher->connect(
'Foo',
'emitBar', $slotClassName,
'slot',
false);
131 $this->signalSlotDispatcher->dispatch(
'Foo',
'emitBar', [
'bar',
'quux']);
132 $this->assertSame($mockSlot->arguments, [
'bar',
'quux']);
140 $this->signalSlotDispatcher->_set(
'isInitialized',
true);
141 $mockLogger = $this->createMock(Logger::class);
142 $this->signalSlotDispatcher->_set(
'logger', $mockLogger);
144 $firstMockSlot = $this->createMock(SlotFixture::class);
145 $firstMockSlot->expects($this->once())
147 ->will($this->returnCallback(
148 function ($foo, $baz) {
149 return [
'modified_' . $foo,
'modified_' . $baz];
153 $secondMockSlot = $this->createMock(SlotFixture::class);
154 $secondMockSlot->expects($this->once())
156 ->with(
'modified_bar',
'modified_quux');
158 $this->signalSlotDispatcher->connect(
'Foo',
'emitBar', $firstMockSlot,
'slot',
false);
159 $this->signalSlotDispatcher->connect(
'Foo',
'emitBar', $secondMockSlot,
'slot',
false);
161 $this->signalSlotDispatcher->dispatch(
'Foo',
'emitBar', [
'bar',
'quux']);
169 $this->signalSlotDispatcher->_set(
'isInitialized',
true);
170 $mockLogger = $this->createMock(Logger::class);
171 $this->signalSlotDispatcher->_set(
'logger', $mockLogger);
173 $firstMockSlot = $this->createMock(SlotFixture::class);
174 $firstMockSlot->expects($this->once())
176 ->will($this->returnCallback(
177 function ($foo, $baz) {
178 return [
'modified_' . $foo,
'modified_' . $baz];
182 $secondMockSlot = $this->createMock(SlotFixture::class);
183 $secondMockSlot->expects($this->once())
185 ->with(
'modified_bar',
'modified_quux');
187 $this->signalSlotDispatcher->connect(
'Foo',
'emitBar', $firstMockSlot,
'slot');
188 $this->signalSlotDispatcher->connect(
'Foo',
'emitBar', $secondMockSlot,
'slot');
190 $this->signalSlotDispatcher->dispatch(
'Foo',
'emitBar', [
'bar',
'quux']);
198 $this->signalSlotDispatcher->_set(
'isInitialized',
true);
199 $mockLogger = $this->createMock(Logger::class);
200 $this->signalSlotDispatcher->_set(
'logger', $mockLogger);
202 $firstMockSlot = $this->createMock(SlotFixture::class);
203 $firstMockSlot->expects($this->once())
205 ->will($this->returnCallback(
206 function ($foo, $baz) {
207 return [
'modified_' . $foo,
'modified_' . $baz];
211 $secondMockSlot = $this->createMock(SlotFixture::class);
212 $secondMockSlot->expects($this->once())
215 $thirdMockSlot = $this->createMock(SlotFixture::class);
216 $thirdMockSlot->expects($this->once())
218 ->with(
'modified_bar',
'modified_quux');
220 $this->signalSlotDispatcher->connect(
'Foo',
'emitBar', $firstMockSlot,
'slot');
221 $this->signalSlotDispatcher->connect(
'Foo',
'emitBar', $secondMockSlot,
'slot');
222 $this->signalSlotDispatcher->connect(
'Foo',
'emitBar', $thirdMockSlot,
'slot');
224 $this->signalSlotDispatcher->dispatch(
'Foo',
'emitBar', [
'bar',
'quux']);
232 $this->expectException(InvalidSlotReturnException::class);
233 $this->expectExceptionCode(1376683067);
234 $this->signalSlotDispatcher->_set(
'isInitialized',
true);
235 $mockLogger = $this->createMock(Logger::class);
236 $this->signalSlotDispatcher->_set(
'logger', $mockLogger);
238 $mockSlot = $this->createMock(SlotFixture::class);
239 $mockSlot->expects($this->once())
241 ->will($this->returnCallback(
247 $this->signalSlotDispatcher->connect(
'Foo',
'emitBar', $mockSlot,
'slot',
false);
248 $this->signalSlotDispatcher->dispatch(
'Foo',
'emitBar', [
'bar',
'quux']);
256 $this->expectException(InvalidSlotReturnException::class);
257 $this->expectExceptionCode(1376683066);
258 $this->signalSlotDispatcher->_set(
'isInitialized',
true);
259 $mockLogger = $this->createMock(Logger::class);
260 $this->signalSlotDispatcher->_set(
'logger', $mockLogger);
262 $mockSlot = $this->createMock(SlotFixture::class);
263 $mockSlot->expects($this->once())
265 ->will($this->returnCallback(
271 $this->signalSlotDispatcher->connect(
'Foo',
'emitBar', $mockSlot,
'slot',
false);
272 $this->signalSlotDispatcher->dispatch(
'Foo',
'emitBar', [
'bar',
'quux']);
280 $this->expectException(InvalidSlotException::class);
281 $this->expectExceptionCode(1245673367);
282 $mockObjectManager = $this->createMock(ObjectManagerInterface::class);
283 $mockObjectManager->expects($this->once())->method(
'isRegistered')->with(
'NonExistingClassName')->will($this->returnValue(
false));
284 $this->signalSlotDispatcher->_set(
'objectManager', $mockObjectManager);
285 $this->signalSlotDispatcher->_set(
'isInitialized',
true);
286 $mockLogger = $this->createMock(Logger::class);
287 $this->signalSlotDispatcher->_set(
'logger', $mockLogger);
288 $this->signalSlotDispatcher->connect(
'Foo',
'emitBar',
'NonExistingClassName',
'slot',
true);
289 $this->signalSlotDispatcher->dispatch(
'Foo',
'emitBar', []);
297 $this->expectException(InvalidSlotException::class);
298 $this->expectExceptionCode(1245673368);
299 $slotClassName = SlotMethodDoesNotExistFixture::class;
300 $mockSlot =
new SlotMethodDoesNotExistFixture();
301 $mockObjectManager = $this->createMock(ObjectManagerInterface::class);
302 $mockObjectManager->expects($this->once())->method(
'isRegistered')->with($slotClassName)->will($this->returnValue(
true));
303 $mockObjectManager->expects($this->once())->method(
'get')->with($slotClassName)->will($this->returnValue($mockSlot));
304 $this->signalSlotDispatcher->_set(
'objectManager', $mockObjectManager);
305 $this->signalSlotDispatcher->_set(
'isInitialized',
true);
306 $mockLogger = $this->createMock(Logger::class);
307 $this->signalSlotDispatcher->_set(
'logger', $mockLogger);
308 $this->signalSlotDispatcher->connect(
'Foo',
'emitBar', $slotClassName,
'unknownMethodName',
true);
309 $this->signalSlotDispatcher->dispatch(
'Foo',
'emitBar', [
'bar',
'quux']);
310 $this->assertSame($mockSlot->arguments, [
'bar',
'quux']);
319 $mockSlot =
function () use (&$arguments) {
320 $arguments = func_get_args();
322 $mockObjectManager = $this->createMock(ObjectManagerInterface::class);
323 $this->signalSlotDispatcher->connect(
'SignalClassName',
'methodName', $mockSlot,
null,
true);
324 $this->signalSlotDispatcher->_set(
'objectManager', $mockObjectManager);
325 $this->signalSlotDispatcher->_set(
'isInitialized',
true);
326 $mockLogger = $this->createMock(Logger::class);
327 $this->signalSlotDispatcher->_set(
'logger', $mockLogger);
328 $this->signalSlotDispatcher->dispatch(
'SignalClassName',
'methodName', [
'bar',
'quux']);
329 $this->assertSame([
'bar',
'quux',
'SignalClassName::methodName'], $arguments);
337 $this->expectException(\InvalidArgumentException::class);
338 $this->expectExceptionCode(1229531659);
339 $this->signalSlotDispatcher->connect(
'ClassA',
'emitSomeSignal',
'ClassB',
'');
347 $this->assertSame([], $this->signalSlotDispatcher->dispatch(
'ClassA',
'someNotRegisteredSignalName'));
355 $this->assertSame([], $this->signalSlotDispatcher->dispatch(
'ClassA',
'emitSomeSignal'));
368 $this->assertSame($arguments, $this->signalSlotDispatcher->dispatch(
'ClassA',
'emitSomeSignal', $arguments));
376 $this->expectException(InvalidSlotException::class);
377 $this->expectExceptionCode(1298113624);
378 $this->signalSlotDispatcher->_set(
'isInitialized',
true);
379 $mockLogger = $this->createMock(Logger::class);
380 $this->signalSlotDispatcher->_set(
'logger', $mockLogger);
381 $this->signalSlotDispatcher->_set(
'objectManager',
null);
382 $this->signalSlotDispatcher->_set(
'slots', [
'ClassA' => [
'emitSomeSignal' => [[]]]]);
384 $this->assertSame(
null, $this->signalSlotDispatcher->dispatch(
'ClassA',
'emitSomeSignal'));