Completed
Push — master ( bf8f9b...649baf )
by Kirill
32s queued 23s
created

src/Core/tests/SingletonsTest.php (3 issues)

Labels
Severity
1
<?php
2
3
/**
4
 * Spiral Framework.
5
 *
6
 * @license   MIT
7
 * @author    Anton Titov (Wolfy-J)
8
 */
9
10
declare(strict_types=1);
11
12
namespace Spiral\Tests\Core;
13
14
use PHPUnit\Framework\TestCase;
15
use Spiral\Core\Container;
16
use Spiral\Tests\Core\Fixtures\DeclarativeSingleton;
17
use Spiral\Tests\Core\Fixtures\SampleClass;
18
19
class SingletonsTest extends TestCase
20
{
21
    public function testSingletonInstance(): void
22
    {
23
        $container = new Container();
24
        $container->bindSingleton('sampleClass', $instance = new SampleClass());
0 ignored issues
show
$instance = new Spiral\T...\Fixtures\SampleClass() of type Spiral\Tests\Core\Fixtures\SampleClass is incompatible with the type array|callable|string expected by parameter $resolver of Spiral\Core\Container::bindSingleton(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

24
        $container->bindSingleton('sampleClass', /** @scrutinizer ignore-type */ $instance = new SampleClass());
Loading history...
25
        $this->assertSame($instance, $container->get('sampleClass'));
26
    }
27
28
    public function testSingletonToItself(): void
29
    {
30
        $container = new Container();
31
        $container->bindSingleton(SampleClass::class, SampleClass::class);
32
33
        $sc = $container->get(SampleClass::class);
34
        $this->assertTrue($container->hasInstance(SampleClass::class));
35
        $this->assertSame($sc, $container->get(SampleClass::class));
36
    }
37
38
    public function testSingletonInstanceWithBinding(): void
39
    {
40
        $container = new Container();
41
        $container->bindSingleton('sampleClass', $instance = new SampleClass());
0 ignored issues
show
$instance = new Spiral\T...\Fixtures\SampleClass() of type Spiral\Tests\Core\Fixtures\SampleClass is incompatible with the type array|callable|string expected by parameter $resolver of Spiral\Core\Container::bindSingleton(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

41
        $container->bindSingleton('sampleClass', /** @scrutinizer ignore-type */ $instance = new SampleClass());
Loading history...
42
        $container->bind('binding', 'sampleClass');
43
44
        $this->assertSame($instance, $container->get('sampleClass'));
45
        $this->assertSame($instance, $container->get('binding'));
46
    }
47
48
    public function testHasInstance(): void
49
    {
50
        $container = new Container();
51
        $container->bindSingleton('sampleClass', $instance = new SampleClass());
0 ignored issues
show
$instance = new Spiral\T...\Fixtures\SampleClass() of type Spiral\Tests\Core\Fixtures\SampleClass is incompatible with the type array|callable|string expected by parameter $resolver of Spiral\Core\Container::bindSingleton(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

51
        $container->bindSingleton('sampleClass', /** @scrutinizer ignore-type */ $instance = new SampleClass());
Loading history...
52
53
        $this->assertTrue($container->hasInstance('sampleClass'));
54
        $this->assertFalse($container->hasInstance('otherClass'));
55
    }
56
57
    public function testSingletonClosure(): void
58
    {
59
        $container = new Container();
60
61
        $instance = new SampleClass();
62
63
        $container->bindSingleton('sampleClass', function () use ($instance) {
64
            return $instance;
65
        });
66
67
        $this->assertSame($instance, $container->get('sampleClass'));
68
    }
69
70
    public function testSingletonClosureTwice(): void
71
    {
72
        $container = new Container();
73
74
        $container->bindSingleton('sampleClass', function () {
75
            return new SampleClass();
76
        });
77
78
        $instance = $container->get('sampleClass');
79
80
        $this->assertInstanceOf(SampleClass::class, $instance);
81
        $this->assertSame($instance, $container->get('sampleClass'));
82
    }
83
84
    public function testSingletonFactory(): void
85
    {
86
        $container = new Container();
87
88
        $container->bindSingleton('sampleClass', [self::class, 'sampleClass']);
89
90
        $instance = $container->get('sampleClass');
91
92
        $this->assertInstanceOf(SampleClass::class, $instance);
93
        $this->assertSame($instance, $container->get('sampleClass'));
94
    }
95
96
    public function testDelayedSingleton(): void
97
    {
98
        $container = new Container();
99
        $container->bindSingleton('singleton', 'sampleClass');
100
101
        $container->bind('sampleClass', function () {
102
            return new SampleClass();
103
        });
104
105
        $instance = $container->get('singleton');
106
107
        $this->assertInstanceOf(SampleClass::class, $instance);
108
        $this->assertSame($instance, $container->get('singleton'));
109
        $this->assertNotSame($instance, $container->get('sampleClass'));
110
    }
111
112
    public function testDeclarativeSingleton(): void
113
    {
114
        $container = new Container();
115
116
        $instance = $container->get(DeclarativeSingleton::class);
117
118
        $this->assertInstanceOf(DeclarativeSingleton::class, $instance);
119
        $this->assertSame($instance, $container->get(DeclarativeSingleton::class));
120
    }
121
122
    /**
123
     * @return SampleClass
124
     */
125
    private function sampleClass()
126
    {
127
        return new SampleClass();
128
    }
129
}
130