/
ContainerBuilderTest.php
196 lines (160 loc) · 6.34 KB
/
ContainerBuilderTest.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
<?php
namespace DI\Test\UnitTest;
use DI\Container;
use DI\ContainerBuilder;
use DI\Definition\Source\CachedDefinitionSource;
use DI\Definition\Source\DefinitionArray;
use DI\Definition\ValueDefinition;
use DI\Test\UnitTest\Fixtures\FakeContainer;
use EasyMock\EasyMock;
use Psr\Container\ContainerInterface;
use Psr\SimpleCache\CacheInterface;
/**
* @covers \DI\ContainerBuilder
*/
class ContainerBuilderTest extends \PHPUnit_Framework_TestCase
{
use EasyMock;
/**
* @test
*/
public function should_configure_for_development_by_default()
{
// Make the ContainerBuilder use our fake class to catch constructor parameters
$builder = new ContainerBuilder(FakeContainer::class);
/** @var FakeContainer $container */
$container = $builder->build();
// No cache
$this->assertFalse($container->definitionSource instanceof CachedDefinitionSource);
// Proxies evaluated in memory
$this->assertFalse($this->getObjectAttribute($container->proxyFactory, 'writeProxiesToFile'));
}
/**
* @test
*/
public function the_container_should_not_be_wrapped_by_default()
{
$builder = new ContainerBuilder(FakeContainer::class);
/** @var FakeContainer $container */
$container = $builder->build();
$this->assertNull($container->wrapperContainer);
}
/**
* @test
*/
public function should_allow_to_set_a_wrapper_container()
{
$otherContainer = $this->easyMock(ContainerInterface::class);
$builder = new ContainerBuilder(FakeContainer::class);
$builder->wrapContainer($otherContainer);
/** @var FakeContainer $container */
$container = $builder->build();
$this->assertSame($otherContainer, $container->wrapperContainer);
}
/**
* @test
*/
public function should_allow_to_add_custom_definition_sources()
{
$builder = new ContainerBuilder(FakeContainer::class);
// Custom definition sources should be chained correctly
$builder->addDefinitions(new DefinitionArray(['foo' => 'bar']));
$builder->addDefinitions(new DefinitionArray(['foofoo' => 'barbar']));
/** @var FakeContainer $container */
$container = $builder->build();
// We should be able to get entries from our custom definition sources
/** @var ValueDefinition $definition */
$definition = $container->definitionSource->getDefinition('foo');
$this->assertInstanceOf(ValueDefinition::class, $definition);
$this->assertSame('bar', $definition->getValue());
$definition = $container->definitionSource->getDefinition('foofoo');
$this->assertInstanceOf(ValueDefinition::class, $definition);
$this->assertSame('barbar', $definition->getValue());
}
/**
* @test
*/
public function should_chain_definition_sources_in_reverse_order()
{
$builder = new ContainerBuilder(FakeContainer::class);
$builder->addDefinitions(new DefinitionArray(['foo' => 'bar']));
$builder->addDefinitions(new DefinitionArray(['foo' => 'bim']));
/** @var FakeContainer $container */
$container = $builder->build();
/** @var ValueDefinition $definition */
$definition = $container->definitionSource->getDefinition('foo');
$this->assertSame('bim', $definition->getValue());
}
/**
* @test
*/
public function should_allow_to_add_definitions_in_an_array()
{
$builder = new ContainerBuilder(FakeContainer::class);
// Custom definition sources should be chained correctly
$builder->addDefinitions(['foo' => 'bar']);
$builder->addDefinitions(['foofoo' => 'barbar']);
/** @var FakeContainer $container */
$container = $builder->build();
/** @var ValueDefinition $definition */
$definition = $container->definitionSource->getDefinition('foo');
$this->assertInstanceOf(ValueDefinition::class, $definition);
$this->assertSame('bar', $definition->getValue());
$definition = $container->definitionSource->getDefinition('foofoo');
$this->assertInstanceOf(ValueDefinition::class, $definition);
$this->assertSame('barbar', $definition->getValue());
}
/**
* @test
* @expectedException \InvalidArgumentException
* @expectedExceptionMessage ContainerBuilder::addDefinitions() parameter must be a string, an array or a DefinitionSource object, integer given
*/
public function errors_when_adding_invalid_definitions()
{
$builder = new ContainerBuilder(FakeContainer::class);
$builder->addDefinitions(123);
}
/**
* @test
*/
public function should_have_a_fluent_interface()
{
$builder = new ContainerBuilder();
$result = $builder->useAnnotations(false);
$this->assertSame($builder, $result);
$result = $builder->useAnnotations(true);
$this->assertSame($builder, $result);
$result = $builder->useAutowiring(false);
$this->assertSame($builder, $result);
$result = $builder->useAutowiring(true);
$this->assertSame($builder, $result);
$result = $builder->writeProxiesToFile(true, 'somedir');
$this->assertSame($builder, $result);
$result = $builder->writeProxiesToFile(false);
$this->assertSame($builder, $result);
$mockCache = $this->easyMock(CacheInterface::class);
$result = $builder->setDefinitionCache($mockCache);
$this->assertSame($builder, $result);
$result = $builder->wrapContainer($this->easyMock(ContainerInterface::class));
$this->assertSame($builder, $result);
}
/**
* Ensure the ContainerBuilder cannot be modified after the container has been built.
* @test
* @expectedException \LogicException
* @expectedExceptionMessage The ContainerBuilder cannot be modified after the container has been built
*/
public function should_throw_if_modified_after_building_a_container()
{
$builder = new ContainerBuilder();
$builder->build();
$builder->addDefinitions([]);
}
/**
* @test
*/
public function dev_container_configuration_should_be_identical_to_creating_a_new_container_from_defaults()
{
self::assertEquals(new Container, ContainerBuilder::buildDevContainer());
}
}