RegisterTest   A
last analyzed

Complexity

Total Complexity 30

Size/Duplication

Total Lines 503
Duplicated Lines 0 %

Importance

Changes 8
Bugs 0 Features 1
Metric Value
eloc 262
dl 0
loc 503
rs 10
c 8
b 0
f 1
wmc 30

24 Methods

Rating   Name   Duplication   Size   Complexity  
A testLogMessages() 0 61 3
A testSingletonFactory() 0 20 1
A testFactoryWithOverride() 0 43 2
A testFactoryWithNoneExistingOverride() 0 11 1
A testFactoryWithOverrideOnlyOnce() 0 15 1
A testCreateEventInstanceFromIncorrectObject() 0 8 1
A setUp() 0 5 1
A testIncorrectLogObject() 0 9 1
A testSystemEventWithKill() 0 25 2
A testFactoryForSimpleObject() 0 15 1
A testSingletonFactoryWithNames() 0 29 1
A testIncorrectLogObjectFromNoneExistingClass() 0 8 1
A testSetAndGetConfig() 0 27 1
A testInitRegisterWithGivenObjects() 0 10 1
A testFactoryWithException() 0 11 1
A clearLog() 0 4 2
A testIncorrectEventObjectFromNoneExistingClass() 0 8 1
A logFile() 0 3 1
A testFactoryForSimpleObjectWithParameters() 0 8 1
A testCreateLogInstanceFromIncorrectObject() 0 8 1
A tearDown() 0 3 1
A testIncorrectEventObject() 0 7 1
A testUnsetAllOverriders() 0 14 1
A testFactoryEvents() 0 74 2
1
<?php
2
3
namespace Test;
4
5
use PHPUnit\Framework\TestCase;
6
use SimpleLog\Log;
7
use BlueRegister\Register;
8
use BlueRegister\Events\RegisterException;
9
use BlueEvent\Event\Base\EventDispatcher;
10
use BlueRegister\Events\RegisterEvent;
11
12
class RegisterTest extends TestCase
13
{
14
    /**
15
     * name of test event log file
16
     */
17
    const REGISTER_LOG_NAME = '/debug.log';
18
19
    /**
20
     * @var string
21
     */
22
    protected $logPath;
23
24
    /**
25
     * actions launched before test starts
26
     */
27
    protected function setUp(): void
28
    {
29
        $this->logPath = __DIR__ . '/log';
30
31
        $this->clearLog();
32
    }
33
34
    public function testSetAndGetConfig()
35
    {
36
        $register = new Register();
37
38
        $this->assertFalse($register->getConfig('log'));
39
        $this->assertFalse($register->getConfig('events'));
40
41
        $register = new Register([
42
            'log' => true,
43
            'events' => true,
44
        ]);
45
46
        $this->assertTrue($register->getConfig('log'));
47
        $this->assertTrue($register->getConfig('events'));
48
        $this->assertEquals(
49
            [
50
                'log' => true,
51
                'events' => true,
52
                'log_object' => Log::class,
53
                'event_object' => EventDispatcher::class,
54
                'event_config' => []
55
            ],
56
            $register->getConfig()
57
        );
58
59
        $register->setConfig('log', false);
60
        $this->assertFalse($register->getConfig('log'));
61
    }
62
63
    public function testIncorrectLogObject()
64
    {
65
        $this->expectExceptionMessage("Log should be instance of SimpleLog\LogInterface: Test\TestClass\SimpleClass");
66
        $this->expectException(\LogicException::class);
67
68
        new Register(
69
            [
70
                'log' => true,
71
                'log_object' => TestClass\SimpleClass::class,
72
            ]
73
        );
74
    }
75
76
    public function testIncorrectLogObjectFromNoneExistingClass()
77
    {
78
        $this->expectExceptionMessage("Class don't exists: SomeClass");
79
        $this->expectException(\LogicException::class);
80
81
        new Register([
82
            'log' => true,
83
            'log_object' => 'SomeClass',
84
        ]);
85
    }
86
87
    public function testCreateLogInstanceFromIncorrectObject()
88
    {
89
        $this->expectExceptionMessage("Cannot create Log instance: Test\TestClass\SimpleClass");
90
        $this->expectException(\LogicException::class);
91
92
        new Register([
93
            'log' => true,
94
            'log_object' => new \Test\TestClass\SimpleClass,
95
        ]);
96
    }
97
98
    public function testIncorrectEventObject()
99
    {
100
        $this->expectException(\LogicException::class);
101
102
        new Register([
103
            'events' => true,
104
            'event_object' => TestClass\SimpleClass::class,
105
        ]);
106
    }
107
108
    public function testIncorrectEventObjectFromNoneExistingClass()
109
    {
110
        $this->expectExceptionMessage("Class don't exists: SomeClass");
111
        $this->expectException(\LogicException::class);
112
113
        new Register([
114
            'events' => true,
115
            'event_object' => 'SomeClass',
116
        ]);
117
    }
118
119
    public function testCreateEventInstanceFromIncorrectObject()
120
    {
121
        $this->expectExceptionMessage("Cannot create Event instance: Test\TestClass\SimpleClass");
122
        $this->expectException(\LogicException::class);
123
124
        new Register([
125
            'events' => true,
126
            'event_object' => new \Test\TestClass\SimpleClass,
127
        ]);
128
    }
129
130
    public function testInitRegisterWithGivenObjects()
131
    {
132
        $register = new Register([
133
            'events' => true,
134
            'event_object' => new \BlueEvent\Event\Base\EventDispatcher,
135
            'log' => true,
136
            'log_object' => new \SimpleLog\Log,
137
        ]);
138
139
        $this->assertInstanceOf(Register::class, $register);
140
    }
141
142
    public function testFactoryWithException()
143
    {
144
        $this->expectExceptionMessage("Test exception.");
145
        $this->expectException(\BlueRegister\RegisterException::class);
146
147
        $register = new Register;
148
149
        $this->assertEquals($register->getClassCounter(), []);
150
        $this->assertEquals($register->getRegisteredObjects(), []);
151
152
        $register->factory(TestClass\SimpleClass::class, [0, 0, true]);
153
    }
154
155
    public function testFactoryForSimpleObject()
156
    {
157
        $register = new Register;
158
159
        $this->assertEquals($register->getClassCounter(), []);
160
        $this->assertEquals($register->getRegisteredObjects(), []);
161
162
        /** @var \Test\TestClass\SimpleClass $simpleClass */
163
        $simpleClass = $register->factory(TestClass\SimpleClass::class);
164
165
        $this->assertEquals($register->getClassCounter(), [TestClass\SimpleClass::class => 1]);
166
        $this->assertEquals(1, $simpleClass->testMe());
167
        $this->assertEquals(
168
            $register->getRegisteredObjects(),
169
            [TestClass\SimpleClass::class => TestClass\SimpleClass::class]
170
        );
171
    }
172
173
    public function testFactoryForSimpleObjectWithParameters()
174
    {
175
        $register = new Register();
176
177
        /** @var \Test\TestClass\SimpleClass $simpleClass */
178
        $simpleClass = $register->factory(TestClass\SimpleClass::class, [1, 2]);
179
180
        $this->assertEquals([1, 2], $simpleClass->constructorArgs);
181
    }
182
183
    public function testFactoryWithNoneExistingOverride()
184
    {
185
        $this->expectExceptionMessage("Class don't exists: SomeClass");
186
        $this->expectException(\LogicException::class);
187
188
        $register = new Register;
189
190
        $register
191
            ->enableOverride()
192
            ->setOverrider(TestClass\SimpleClass::class, 'SomeClass')
193
            ->factory(TestClass\SimpleClass::class);
194
    }
195
196
    public function testFactoryWithOverrideOnlyOnce()
197
    {
198
        $register = new Register;
199
200
        $simpleClass = $register
201
            ->enableOverride()
202
            ->setOverrider(TestClass\SimpleClass::class, TestClass\OverrideClass::class, true)
203
            ->factory(TestClass\SimpleClass::class);
204
205
        $this->assertEquals(2, $simpleClass->testMe());
206
207
        /** @var \Test\TestClass\SimpleClass $simpleClass */
208
        $simpleClass2 = $register->factory(TestClass\SimpleClass::class);
209
210
        $this->assertEquals(1, $simpleClass2->testMe());
211
    }
212
213
    public function testSingletonFactory()
214
    {
215
        $register = new Register();
216
217
        $this->assertEquals($register->getClassCounter(), []);
218
        $this->assertEquals($register->getRegisteredObjects(), []);
219
220
        /** @var \Test\TestClass\SimpleClass $simpleClass */
221
        $simpleClass = $register->singletonFactory(TestClass\SimpleClass::class, [1, 2]);
222
        $this->assertEquals([1, 2], $simpleClass->constructorArgs);
223
224
        $simpleClass = $register->singletonFactory(TestClass\SimpleClass::class, [3, 4]);
225
        $this->assertEquals([1, 2], $simpleClass->constructorArgs);
226
227
        $simpleClass = $register->getSingleton(TestClass\SimpleClass::class);
228
        $this->assertEquals([1, 2], $simpleClass->constructorArgs);
229
230
        $register->destroySingleton(TestClass\SimpleClass::class);
231
        $simpleClass = $register->getSingleton(TestClass\SimpleClass::class);
232
        $this->assertEquals([0, 0], $simpleClass->constructorArgs);
233
    }
234
235
    public function testSingletonFactoryWithNames()
236
    {
237
        $this->expectExceptionMessage("Class don't exists: singleton");
238
        $this->expectException(\LogicException::class);
239
        
240
        $register = new Register();
241
242
        $this->assertEquals($register->getClassCounter(), []);
243
        $this->assertEquals($register->getRegisteredObjects(), []);
244
245
        /** @var \Test\TestClass\SimpleClass $simpleClass */
246
        $simpleClass = $register->singletonFactory(TestClass\SimpleClass::class, [1, 2], 'singleton');
247
        $this->assertEquals([1, 2], $simpleClass->constructorArgs);
248
249
        $simpleClass = $register->singletonFactory('singleton');
250
        $this->assertEquals([1, 2], $simpleClass->constructorArgs);
251
252
        $simpleClass = $register->getSingleton('singleton');
253
        $this->assertEquals([1, 2], $simpleClass->constructorArgs);
254
255
        $simpleClass = $register->singletonFactory(TestClass\SimpleClass::class, [3, 4]);
256
        $this->assertEquals([3, 4], $simpleClass->constructorArgs);
257
258
        $register->destroySingleton();
259
        $simpleClass = $register->singletonFactory(TestClass\SimpleClass::class);
260
        $this->assertEquals([0, 0], $simpleClass->constructorArgs);
261
262
        //exception
263
        $register->getSingleton('singleton');
264
    }
265
266
    public function testFactoryEvents()
267
    {
268
        $testData = [];
269
270
        $register = new Register([
271
            'events' => true,
272
            'event_config' => [
273
                'events' => [
274
                    'register_before_create' => [
275
                        'object' => RegisterEvent::class,
276
                        'listeners' => [
277
                            function ($event) use (&$testData) {
278
                                /** @var $event \BlueRegister\Events\RegisterEvent */
279
                                $testData['register_before_create'] = $event->getEventParameters();
280
                            }
281
                        ]
282
                    ],
283
                    'register_after_create' => [
284
                        'object' => RegisterEvent::class,
285
                        'listeners' => [
286
                            function ($event) use (&$testData) {
287
                                /** @var $event \BlueRegister\Events\RegisterEvent */
288
                                $testData['register_after_create'] = $event->getEventParameters();
289
                            }
290
                        ]
291
                    ],
292
                    'register_before_return_singleton' => [
293
                        'object' => RegisterEvent::class,
294
                        'listeners' => [
295
                            function ($event) use (&$testData) {
296
                                /** @var $event \BlueRegister\Events\RegisterEvent */
297
                                $testData['register_before_return_singleton'] = $event->getEventParameters();
298
                            }
299
                        ]
300
                    ],
301
                    'register_class_dont_exists' => [
302
                        'object' => RegisterException::class,
303
                        'listeners' => [
304
                            function ($event) use (&$testData) {
305
                                /** @var $event RegisterException */
306
                                $testData['register_class_dont_exists'] = $event->getEventParameters();
307
                            }
308
                        ]
309
                    ],
310
                ],
311
            ]
312
        ]);
313
314
        $register->factory(TestClass\SimpleClass::class, [1, 2]);
315
316
        $this->assertArrayHasKey('register_before_create', $testData);
317
        $this->assertEquals(
318
            [TestClass\SimpleClass::class, [1, 2]],
319
            $testData['register_before_create']
320
        );
321
322
        $this->assertArrayHasKey('register_after_create', $testData);
323
        $this->assertInstanceOf(\Test\TestClass\SimpleClass::class, $testData['register_after_create'][0]);
324
325
        $register->singletonFactory(TestClass\SimpleClass::class, [1, 2]);
326
327
        $this->assertArrayHasKey('register_before_return_singleton', $testData);
328
        $this->assertInstanceOf(\Test\TestClass\SimpleClass::class, $testData['register_before_return_singleton'][0]);
329
        $this->assertEquals([1, 2], $testData['register_before_return_singleton'][1]);
330
        $this->assertEquals(TestClass\SimpleClass::class, $testData['register_before_return_singleton'][2]);
331
332
        try {
333
            $register->factory('SomeClass', [1, 2]);
334
        } catch (\InvalidArgumentException $exception) {
335
            $this->assertEquals('Class don\'t exists: SomeClass', $exception->getMessage());
336
        }
337
338
        $this->assertArrayHasKey('register_class_dont_exists', $testData);
339
        $this->assertEquals('SomeClass', $testData['register_class_dont_exists'][0]);
340
    }
341
342
    public function testSystemEventWithKill()
343
    {
344
        $this->expectExceptionMessage("System killed by Register Exception. Unknown class: SomeClass");
345
        $this->expectException(\RuntimeException::class);
346
        
347
        RegisterException::allowKill(true);
348
349
        $this->assertTrue(RegisterException::isKillingAllowed());
350
351
        $register = new Register([
352
            'events' => true,
353
            'event_config' => [
354
                'events' => [
355
                    'register_class_dont_exists' => [
356
                        'object' => RegisterException::class,
357
                        'listeners' => []
358
                    ],
359
                ],
360
            ]
361
        ]);
362
363
        try {
364
            $register->factory('SomeClass');
365
        } catch (\InvalidArgumentException $exception) {
366
            $this->assertEquals('Class don\'t exists: SomeClass', $exception->getMessage());
367
        }
368
    }
369
370
    public function testLogMessages()
371
    {
372
        $log = new Log;
373
        $log->setOption('log_path', $this->logPath);
374
        $log->setOption('level', 'debug');
375
376
        $register = new Register([
377
            'log' => true,
378
            'log_object' => $log,
379
        ]);
380
381
        $register->factory(TestClass\SimpleClass::class);
382
        $this->assertFileExists($this->logFile());
383
        $this->clearLog();
384
385
        try {
386
            new Register(
387
                [
388
                    'log'          => true,
389
                    'log_object'   => $log,
390
                    'events'       => true,
391
                    'event_object' => TestClass\SimpleClass::class
392
                ]
393
            );
394
        } catch (\LogicException $exception) {
395
            $message = 'Event should be instance of BlueEvent\Event\Base\Interfaces\EventDispatcherInterface:'
396
                . ' Test\TestClass\SimpleClass';
397
            $this->assertEquals($message, $exception->getMessage());
398
        }
399
        $this->assertFileExists($this->logFile());
400
        $this->clearLog();
401
402
        try {
403
            new Register(
404
                [
405
                    'log'          => true,
406
                    'log_object'   => $log,
407
                    'events'       => true,
408
                    'event_object' => new TestClass\SimpleClass
409
                ]
410
            );
411
        } catch (\LogicException $exception) {
412
            $this->assertEquals('Cannot create Event instance: Test\TestClass\SimpleClass', $exception->getMessage());
413
        }
414
        $this->assertFileExists($this->logFile());
415
        $this->clearLog();
416
417
        new Register(
418
            [
419
                'log'          => true,
420
                'log_object'   => $log,
421
                'events'       => true,
422
            ]
423
        );
424
        $register->singletonFactory(TestClass\SimpleClass::class);
425
        $this->assertFileExists($this->logFile());
426
        $this->clearLog();
427
428
        $register->destroySingleton();
429
        $this->assertFileExists($this->logFile());
430
        $this->clearLog();
431
    }
432
433
    public function testFactoryWithOverride()
434
    {
435
        $log = new Log;
436
        $log->setOption('log_path', $this->logPath);
437
        $log->setOption('level', 'debug');
438
439
        $register = new Register([
440
            'log' => true,
441
            'log_object' => $log,
442
        ]);
443
444
        $this->assertFalse($register->isOverrideEnable());
445
446
        $register->enableOverride();
447
        $this->assertTrue($register->isOverrideEnable());
448
449
        for ($i = 0; $i < 3; $i++) {
450
            $simpleClass = $register
451
                ->setOverrider(TestClass\SimpleClass::class, TestClass\OverrideClass::class)
452
                ->factory(TestClass\SimpleClass::class);
453
454
            $this->assertFileExists($this->logFile());
455
            $this->clearLog();
456
457
            $this->assertEquals(2, $simpleClass->testMe());
458
        }
459
460
        $register->disableOverride();
461
        $this->assertFalse($register->isOverrideEnable());
462
        $simpleClass = $register->factory(TestClass\SimpleClass::class);
463
        $this->assertEquals(1, $simpleClass->testMe());
464
465
        $simpleClass = $register
466
            ->enableOverride()
467
            ->factory(TestClass\SimpleClass::class);
468
        $this->assertEquals(2, $simpleClass->testMe());
469
470
        $simpleClass = $register
471
            ->unsetOverrider(TestClass\SimpleClass::class)
472
            ->factory(TestClass\SimpleClass::class);
473
        $this->assertEquals(1, $simpleClass->testMe());
474
        $this->assertFileExists($this->logFile());
475
        $this->clearLog();
476
    }
477
478
    public function testUnsetAllOverriders()
479
    {
480
        $register = new Register();
481
482
        $simpleClass = $register
483
            ->enableOverride()
484
            ->setOverrider(TestClass\SimpleClass::class, TestClass\OverrideClass::class)
485
            ->factory(TestClass\SimpleClass::class);
486
        $this->assertEquals(2, $simpleClass->testMe());
487
488
        $simpleClass = $register
489
            ->unsetOverrider()
490
            ->factory(TestClass\SimpleClass::class);
491
        $this->assertEquals(1, $simpleClass->testMe());
492
    }
493
494
    /**
495
     * @return string
496
     */
497
    protected function logFile()
498
    {
499
        return $this->logPath . self::REGISTER_LOG_NAME;
500
    }
501
502
    protected function clearLog()
503
    {
504
        if (file_exists($this->logFile())) {
505
            unlink($this->logFile());
506
        }
507
    }
508
509
    /**
510
     * actions launched after test was finished
511
     */
512
    protected function tearDown(): void
513
    {
514
        $this->clearLog();
515
    }
516
}
517