Passed
Push — main ( a46516...08d8b4 )
by Chema
53s queued 14s
created

test_interface_dependency()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 5
nc 1
nop 0
dl 0
loc 10
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace GacelaTest\Unit;
6
7
use Gacela\Container\DependencyResolver;
8
use Gacela\Container\Exception\DependencyInvalidArgumentException;
9
use Gacela\Container\Exception\DependencyNotFoundException;
10
use GacelaTest\Fake\ClassWithInterfaceDependencies;
11
use GacelaTest\Fake\ClassWithObjectDependencies;
12
use GacelaTest\Fake\ClassWithoutDependencies;
13
use GacelaTest\Fake\Person;
14
use GacelaTest\Fake\PersonInterface;
15
use GacelaTest\Fake\PersonWithoutDefaultValues;
16
use GacelaTest\Fake\PersonWithoutParamType;
17
use PHPUnit\Framework\TestCase;
18
19
final class ClassDependencyResolverTest extends TestCase
20
{
21
    public function test_without_dependencies(): void
22
    {
23
        $resolver = new DependencyResolver();
24
        $actual = $resolver->resolveDependencies(ClassWithoutDependencies::class);
25
26
        self::assertSame([], $actual);
27
    }
28
29
    public function test_object_dependencies(): void
30
    {
31
        $resolver = new DependencyResolver();
32
        $actual = $resolver->resolveDependencies(ClassWithObjectDependencies::class);
33
34
        $expected = [new Person()];
35
36
        self::assertEquals($expected, $actual);
37
    }
38
39
    public function test_interface_dependency(): void
40
    {
41
        $resolver = new DependencyResolver([
42
            PersonInterface::class => Person::class,
43
        ]);
44
        $actual = $resolver->resolveDependencies(ClassWithInterfaceDependencies::class);
45
46
        $expected = [new Person()];
47
48
        self::assertEquals($expected, $actual);
49
    }
50
51
    public function test_use_mapped_interface_dependency(): void
52
    {
53
        $person = new Person();
54
        $person->name = 'anything';
55
56
        $resolver = new DependencyResolver([
57
            PersonInterface::class => $person,
58
        ]);
59
        $actual = $resolver->resolveDependencies(ClassWithInterfaceDependencies::class);
60
61
        $expected = [$person];
62
63
        self::assertSame($expected, $actual);
64
    }
65
66
    public function test_missing_interface_dependency(): void
67
    {
68
        $this->expectExceptionObject(DependencyNotFoundException::mapNotFoundForClassName(PersonInterface::class));
69
70
        $resolver = new DependencyResolver();
71
        $resolver->resolveDependencies(ClassWithInterfaceDependencies::class);
72
    }
73
74
    public function test_missing_default_raw_dependency_value(): void
75
    {
76
        $this->expectExceptionObject(DependencyInvalidArgumentException::unableToResolve('string', PersonWithoutDefaultValues::class));
77
78
        $resolver = new DependencyResolver();
79
        $resolver->resolveDependencies(PersonWithoutDefaultValues::class);
80
    }
81
82
    public function test_missing_param_types_on_dependency_value(): void
83
    {
84
        $this->expectExceptionObject(DependencyInvalidArgumentException::noParameterTypeFor('name'));
85
86
        $resolver = new DependencyResolver();
87
        $resolver->resolveDependencies(PersonWithoutParamType::class);
88
    }
89
}
90