Passed
Push — main ( 3aac92...a55f78 )
by
unknown
49s queued 13s
created

test_resolve_object_from_classname()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 4
c 1
b 0
f 0
dl 0
loc 8
rs 10
cc 1
nc 1
nop 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace GacelaTest\Unit;
6
7
use Gacela\Resolver\Container;
8
use GacelaTest\Fake\ClassWithInterfaceDependencies;
9
use GacelaTest\Fake\ClassWithObjectDependencies;
10
use GacelaTest\Fake\ClassWithoutDependencies;
11
use GacelaTest\Fake\Person;
12
use GacelaTest\Fake\PersonInterface;
13
use PHPUnit\Framework\TestCase;
14
15
final class ContainerTest extends TestCase
16
{
17
    public function test_static_create_without_dependencies(): void
18
    {
19
        $actual = Container::create(ClassWithoutDependencies::class);
20
21
        self::assertEquals(new ClassWithoutDependencies(), $actual);
22
    }
23
24
    public function test_static_create_with_dependencies(): void
25
    {
26
        $actual = Container::create(ClassWithObjectDependencies::class);
27
28
        self::assertEquals(new ClassWithObjectDependencies(new Person()), $actual);
29
    }
30
31
    public function test_without_dependencies(): void
32
    {
33
        $container = new Container();
34
        $actual = $container->get(ClassWithoutDependencies::class);
35
36
        self::assertEquals(new ClassWithoutDependencies(), $actual);
37
    }
38
39
    public function test_object_with_resolvable_dependencies(): void
40
    {
41
        $container = new Container();
42
        $actual = $container->get(ClassWithObjectDependencies::class);
43
44
        self::assertEquals(new ClassWithObjectDependencies(new Person()), $actual);
45
    }
46
47
    public function test_interface_dependency(): void
48
    {
49
        $container = new Container([
50
            PersonInterface::class => Person::class,
51
        ]);
52
        $actual = $container->get(ClassWithObjectDependencies::class);
53
54
        self::assertEquals(new ClassWithObjectDependencies(new Person()), $actual);
55
    }
56
57
    public function test_use_mapped_interface_dependency(): void
58
    {
59
        $person = new Person();
60
        $person->name = 'anything';
61
62
        $container = new Container([
63
            PersonInterface::class => $person,
64
        ]);
65
        $actual = $container->get(ClassWithInterfaceDependencies::class);
66
67
        self::assertEquals(new ClassWithInterfaceDependencies($person), $actual);
68
    }
69
70
    public function test_has_not_existing_class(): void
71
    {
72
        $container = new Container();
73
        $actual = $container->has(InexistentClass::class);
74
75
        self::assertFalse($actual);
76
    }
77
78
    public function test_container_has_class(): void
79
    {
80
        $container = new Container();
81
        $actual = $container->has(Person::class);
82
83
        self::assertTrue($actual);
84
    }
85
86
    public function test_resolve_object_from_interface(): void
87
    {
88
        $person = new Person();
89
        $person->name = 'person-name';
90
91
        $container = new Container([
92
            PersonInterface::class => $person,
93
        ]);
94
        $resolvedPerson = $container->get(PersonInterface::class);
95
96
        self::assertSame($resolvedPerson, $person);
97
    }
98
99
    public function test_resolve_new_object(): void
100
    {
101
        // We are registering 'PersonInterface::class', but 'Person::class' was not.
102
        // As result, a 'new Person()' will be resolved.
103
        $person = new Person();
104
        $person->name = 'person-name';
105
106
        $container = new Container([
107
            PersonInterface::class => $person,
108
        ]);
109
        $resolvedPerson = $container->get(Person::class);
110
111
        self::assertEquals($resolvedPerson, new Person()); // different objects!
112
    }
113
114
    public function test_interface_not_registered_returns_null(): void
115
    {
116
        $container = new Container([
117
            Person::class => new Person(),
118
        ]);
119
        $resolvedPerson = $container->get(PersonInterface::class);
120
121
        self::assertNull($resolvedPerson);
122
    }
123
124
    public function test_resolve_object_from_classname(): void
125
    {
126
        $container = new Container([
127
            PersonInterface::class => Person::class,
128
        ]);
129
        $resolvedPerson = $container->get(PersonInterface::class);
130
131
        self::assertEquals($resolvedPerson, new Person());
132
    }
133
134
    public function test_resolve_object_from_instance_in_a_callable(): void
135
    {
136
        $person = new Person();
137
        $person->name = 'person-name';
138
139
        $container = new Container([
140
            PersonInterface::class => static fn () => $person,
141
        ]);
142
        $resolvedPerson = $container->get(PersonInterface::class);
143
144
        self::assertEquals($resolvedPerson, $person);
145
    }
146
147
    public function test_resolve_object_from_callable_classname_in_a_callable(): void
148
    {
149
        $container = new Container([
150
            PersonInterface::class => static fn () => Person::class,
151
        ]);
152
        $resolvedPerson = $container->get(PersonInterface::class);
153
154
        self::assertEquals($resolvedPerson, new Person());
155
    }
156
}
157