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
|
|
|
|
The PSR-1: Basic Coding Standard recommends that a file should either introduce new symbols, that is classes, functions, constants or similar, or have side effects. Side effects are anything that executes logic, like for example printing output, changing ini settings or writing to a file.
The idea behind this recommendation is that merely auto-loading a class should not change the state of an application. It also promotes a cleaner style of programming and makes your code less prone to errors, because the logic is not spread out all over the place.
To learn more about the PSR-1, please see the PHP-FIG site on the PSR-1.