Test Failed
Branch master (bc31a1)
by Koldo
02:16
created

php$0 ➔ testItShouldThrowExceptionWhenAreNotConfiguredInstancesOrCallablesWithOutAutowiringEnabled()   A

Complexity

Conditions 1

Size

Total Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 11
c 0
b 0
f 0
cc 1
rs 9.9
1
<?php
2
3
declare(strict_types=1);
4
5
namespace AntidotTest\Container;
6
7
use Antidot\Container\AutowiringException;
8
use Antidot\Container\Container;
9
use InvalidArgumentException;
10
use PHPUnit\Framework\TestCase;
11
use Psr\Container\ContainerInterface;
12
use Psr\Container\NotFoundExceptionInterface;
13
use SplObjectStorage;
14
use SplQueue;
15
use SplStack;
16
17
class ContainerTest extends TestCase
18
{
19
    public function testItShouldHaveConfiguredInstancesWithAutowiringEnabled(): void
20
    {
21
        $container = new Container([
22
            'config' => [],
23
            'parameters' => [],
24
            'some.service' => SplObjectStorage::class,
25
            'some.other.service' => SplQueue::class,
26
        ], true);
27
28
        $this->assertEquals([], $container->get('config'));
29
        $testService = $container->get('some.service');
30
        $this->assertInstanceOf(SplObjectStorage::class, $testService);
31
        $this->assertEquals($testService, $container->get('some.service'));
32
        $this->assertInstanceOf(SplQueue::class, $container->get('some.other.service'));
33
    }
34
35
    public function testItShouldHaveConfiguredInstancesFromCallablesWithOutAutowiringEnabled(): void
36
    {
37
        $container = new Container([
38
            'config' => [],
39
            'parameters' => [],
40
            'some.service' => function (ContainerInterface $container) {
41
                $this->assertInstanceOf(Container::class, $container);
42
                return new SplObjectStorage();
43
            },
44
            'some.other.service' => new SplQueue(),
45
            'some.other.type.service' => new class
46
            {
47
                public function __invoke(ContainerInterface $container)
48
                {
49
                    return new SplStack();
50
                }
51
52
            },
53
        ], false);
54
55
        $this->assertEquals([], $container->get('config'));
56
        $this->assertInstanceOf(SplObjectStorage::class, $container->get('some.service'));
57
        $this->assertInstanceOf(SplQueue::class, $container->get('some.other.service'));
58
        $this->assertInstanceOf(SplStack::class, $container->get('some.other.type.service'));
59
    }
60
61
    public function testItShouldKnowAllConfiguredAndLoadedServices(): void
62
    {
63
        $container = new Container([
64
            'config' => [],
65
            'parameters' => [],
66
            'some.service' => function (ContainerInterface $container) {
67
                $this->assertInstanceOf(Container::class, $container);
68
                return new SplObjectStorage();
69
            },
70
        ], false);
71
72
        $this->assertEquals([], $container->get('config'));
73
        $this->assertTrue($container->has('some.service'));
74
        $this->assertFalse($container->has('some.other.service'));
75
    }
76
77
    public function testItShouldDistinctBetweenFactoryAndService(): void
78
    {
79
        $container = new Container([
80
            'config' => [],
81
            'parameters' => [
82
                'some.other.service' => [
83
                    'queue' => 'some.other.type.service',
84
                    'bar' => 'buzz',
85
                    'bazz' => ['Hello World']
86
                ],
87
            ],
88
            'some.service' => function (ContainerInterface $container) {
89
                $this->assertInstanceOf(Container::class, $container);
90
                return new SplObjectStorage();
91
            },
92
            'some.other.service' => SomeTestClass::class,
93
            'some.other.type.service' => SplQueue::class,
94
            'some.other.service.class' => SplQueue::class,
95
            'some.alias' => 'some.other.type.service',
96
            SplStack::class => SplStack::class,
97
        ], true);
98
99
        $container->get('some.alias');
100
        $this->assertEquals([], $container->get('config'));
101
        $this->assertInstanceOf(SplObjectStorage::class, $container->get('some.service'));
102
        $this->assertInstanceOf(SplQueue::class, $container->get('some.other.type.service'));
103
        $testService = $container->get('some.other.service');
104
        $this->assertInstanceOf(SomeTestClass::class, $testService);
105
        $this->assertInstanceOf(SplQueue::class, $testService->getQueue());
106
        $this->assertInstanceOf(SplStack::class, $testService->getStack());
107
        $this->assertSame($testService->getQueue(), $container->get('some.other.type.service'));
108
        $this->assertSame($testService->getQueue(), $container->get('some.alias'));
109
        $this->assertNotSame($testService->getQueue(), $container->get('some.other.service.class'));
110
        $someTestClass2 = $container->get(SomeTestClass::class);
111
        $this->assertNotSame($testService, $someTestClass2);
112
        $this->assertSame($testService->getStack(), $someTestClass2->getStack());
113
    }
114
115
    public function testItShouldThrowExceptionWhenAreNotConfiguredInstancesOrCallablesWithOutAutowiringEnabled(): void
116
    {
117
        $this->expectException(NotFoundExceptionInterface::class);
118
119
        $container = new Container([
120
            'config' => [],
121
            'parameters' => [],
122
            'some.service' => SplObjectStorage::class,
123
        ], false);
124
125
        $container->get('some.service');
126
    }
127
128
    public function testItShouldThrowExceptionWhenWithAutowiringEnabled(): void
129
    {
130
        $this->expectException(AutowiringException::class);
131
132
        $container = new Container([
133
            'config' => [],
134
            'parameters' => [],
135
        ], true);
136
137
        $container->get(InvalidArgumentException::class);
138
    }
139
}
140