Completed
Push — master ( 2e5bdd...9e2471 )
by Ryuichi
05:26
created

ContainerTest   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 177
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
wmc 10
cbo 3
dl 0
loc 177
ccs 0
cts 96
cp 0
rs 10
c 0
b 0
f 0
lcom 1
1
<?php
2
namespace WebStream\Container\Test;
3
4
require_once dirname(__FILE__) . '/../Container.php';
5
require_once dirname(__FILE__) . '/../ValueProxy.php';
6
require_once dirname(__FILE__) . '/../Test/Providers/ContainerProvider.php';
7
require_once dirname(__FILE__) . '/../Test/Modules/InvalidArgumentException.php';
8
9
use WebStream\Container\Container;
10
use WebStream\Container\ValueProxy;
11
use WebStream\Container\Test\Providers\ContainerProvider;
12
13
/**
14
 * ContainerTest
15
 * @author Ryuichi TANAKA.
16
 * @since 2016/08/20
17
 * @version 0.7
18
 */
19
class ContainerTest extends \PHPUnit_Framework_TestCase
20
{
21
    use ContainerProvider;
22
23
    /**
24
     * 正常系
25
     * 値を格納して取り出せること
26
     * @test
27
     * @dataProvider valueLazyProvider
28
     */
29
    public function okContainer($value, $result)
30
    {
31
        $container = new Container();
32
        $container->test = $value;
33
        $this->assertEquals($container->test, $result);
34
    }
35
36
    /**
37
     * 正常系
38
     * 設定した値のカウントが取得できること
39
     * @test
40
     */
41
    public function okLength()
42
    {
43
        $container = new Container();
44
        $container->test1 = 1;
45
        $container->test2 = 2;
46
        $this->assertEquals($container->length(), 2);
47
    }
48
49
    /**
50
     * 正常系
51
     * 値を削除できること
52
     * 削除後の要素にアクセスすると例外が発生すること
53
     * @test
54
     * @expectedException WebStream\Exception\Extend\InvalidArgumentException
55
     */
56
    public function okRemove()
57
    {
58
        $container = new Container();
59
        $container->test1 = 1;
60
        $container->remove("test1");
61
        $this->assertNull($container->test1);
62
    }
63
64
    /**
65
     * 正常系
66
     * プリミティブ値を登録できること
67
     * 値はそのまま保存される
68
     * @test
69
     * @dataProvider valueDynamicProvider
70
     */
71
    public function okRegisterPrimitive($value, $result)
72
    {
73
        $container = new Container();
74
        $container->register("test", $value);
75
        $this->assertEquals($container->test, $result);
76
    }
77
78
    /**
79
     * 正常系
80
     * クロージャを登録できること
81
     * 値はそのまま保存される
82
     * @test
83
     */
84
    public function okRegisterClosure()
85
    {
86
        $func = function() {
87
            return "test";
88
        };
89
        $container = new Container();
90
        $container->register("test", $func);
91
        $this->assertInternalType("object", $container->test);
92
        $result = $container->test;
93
        $this->assertEquals($result(), "test");
94
    }
95
96
    /**
97
     * 正常系
98
     * 即時実行状態で登録されること
99
     * @test
100
     */
101
    public function okRegisterAsDynamic()
102
    {
103
        $func = function() {
104
            echo "evaluated";
105
            return "test";
106
        };
107
        $container = new Container();
108
        $container->registerAsDynamic("test", $func);
109
        $this->expectOutputString("evaluated");
110
        $this->assertEquals($container->test, "test");
111
    }
112
113
    /**
114
     * 正常系
115
     * 遅延実行状態で登録されること
116
     * @test
117
     */
118
    public function okRegisterAsLazy()
119
    {
120
        $func = function() {
121
            echo "evaluated";
122
            return "test";
123
        };
124
        $container = new Container();
125
        $container->registerAsLazy("test", $func);
126
        $this->expectOutputString(null);
127
        $this->assertEquals($container->test, "test");
128
        $this->expectOutputString("evaluated");
129
    }
130
131
    /**
132
     * 正常系
133
     * コンテナから取得するとき、値はキャッシュされていること
134
     * @test
135
     */
136
    public function okRegisterCached()
137
    {
138
        $func = function() {
139
            echo "evaluated";
140
            return "test";
141
        };
142
143
        $container = new Container();
144
        // $container->registerAsLazyUnCached("test", $func);
145
146
        ob_start();
147
        $container->registerAsDynamic("test", $func);
148
        $actual = ob_get_clean();
149
        $this->assertEquals($actual, "evaluated");
150
        $this->assertEquals($container->test, "test");
151
152
        ob_start();
153
        $container->registerAsLazy("test", $func);
154
        $this->assertEquals($container->test, "test");
155
        $actual = ob_get_clean();
156
        $this->assertEquals($actual, "evaluated"); // uncached
157
    }
158
159
    /**
160
     * 正常系
161
     * コンテナから取得するとき、値はキャッシュされていないこと
162
     * @test
163
     */
164
    public function okRegisterUnCached()
165
    {
166
        $func = function() {
167
            echo "evaluated";
168
            return "test";
169
        };
170
171
        $container = new Container();
172
        $container->registerAsLazyUnCached("test", $func);
173
174
        ob_start();
175
        $this->assertEquals($container->test, "test");
176
        $actual = ob_get_clean();
177
        $this->assertEquals($actual, "evaluated");
178
179
        ob_start();
180
        $this->assertEquals($container->test, "test");
181
        $actual = ob_get_clean();
182
        $this->assertEquals($actual, "evaluated"); // uncached
183
    }
184
185
    /**
186
     * 正常系
187
     * 未定義の値にアクセスしても例外が発生しないこと
188
     * @test
189
     */
190
    public function okUnStrictContainer()
191
    {
192
        $container = new Container(false);
193
        $this->assertNull($container->undefined);
194
    }
195
}
196