4 * This file is part of the Symfony package.
6 * (c) Fabien Potencier <fabien@symfony.com>
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
12 namespace Symfony\Component\DependencyInjection\Tests\Compiler;
14 use PHPUnit\Framework\TestCase;
15 use Symfony\Component\DependencyInjection\ChildDefinition;
16 use Symfony\Component\DependencyInjection\Compiler\ResolveDefinitionTemplatesPass;
17 use Symfony\Component\DependencyInjection\ContainerBuilder;
22 class ResolveDefinitionTemplatesPassTest extends TestCase
24 public function testProcess()
26 $container = new ContainerBuilder();
27 $container->register('parent', 'foo')->setArguments(array('moo', 'b'))->setProperty('foo', 'moo');
28 $container->setDefinition('child', new ChildDefinition('parent'))
29 ->replaceArgument(0, 'a')
30 ->setProperty('foo', 'bar')
34 $this->process($container);
36 $def = $container->getDefinition('child');
37 $this->assertNotInstanceOf(ChildDefinition::class, $def);
38 $this->assertEquals('bar', $def->getClass());
39 $this->assertEquals(array('a', 'b'), $def->getArguments());
40 $this->assertEquals(array('foo' => 'bar'), $def->getProperties());
43 public function testProcessAppendsMethodCallsAlways()
45 $container = new ContainerBuilder();
49 ->addMethodCall('foo', array('bar'))
53 ->setDefinition('child', new ChildDefinition('parent'))
54 ->addMethodCall('bar', array('foo'))
57 $this->process($container);
59 $def = $container->getDefinition('child');
60 $this->assertEquals(array(
61 array('foo', array('bar')),
62 array('bar', array('foo')),
63 ), $def->getMethodCalls());
66 public function testProcessDoesNotCopyAbstract()
68 $container = new ContainerBuilder();
76 ->setDefinition('child', new ChildDefinition('parent'))
79 $this->process($container);
81 $def = $container->getDefinition('child');
82 $this->assertFalse($def->isAbstract());
85 public function testProcessDoesNotCopyShared()
87 $container = new ContainerBuilder();
95 ->setDefinition('child', new ChildDefinition('parent'))
98 $this->process($container);
100 $def = $container->getDefinition('child');
101 $this->assertTrue($def->isShared());
104 public function testProcessDoesNotCopyTags()
106 $container = new ContainerBuilder();
114 ->setDefinition('child', new ChildDefinition('parent'))
117 $this->process($container);
119 $def = $container->getDefinition('child');
120 $this->assertEquals(array(), $def->getTags());
123 public function testProcessDoesNotCopyDecoratedService()
125 $container = new ContainerBuilder();
129 ->setDecoratedService('foo')
133 ->setDefinition('child', new ChildDefinition('parent'))
136 $this->process($container);
138 $def = $container->getDefinition('child');
139 $this->assertNull($def->getDecoratedService());
142 public function testProcessDoesNotDropShared()
144 $container = new ContainerBuilder();
151 ->setDefinition('child', new ChildDefinition('parent'))
155 $this->process($container);
157 $def = $container->getDefinition('child');
158 $this->assertFalse($def->isShared());
161 public function testProcessHandlesMultipleInheritance()
163 $container = new ContainerBuilder();
166 ->register('parent', 'foo')
167 ->setArguments(array('foo', 'bar', 'c'))
171 ->setDefinition('child2', new ChildDefinition('child1'))
172 ->replaceArgument(1, 'b')
176 ->setDefinition('child1', new ChildDefinition('parent'))
177 ->replaceArgument(0, 'a')
180 $this->process($container);
182 $def = $container->getDefinition('child2');
183 $this->assertEquals(array('a', 'b', 'c'), $def->getArguments());
184 $this->assertEquals('foo', $def->getClass());
187 public function testSetLazyOnServiceHasParent()
189 $container = new ContainerBuilder();
191 $container->register('parent', 'stdClass');
193 $container->setDefinition('child1', new ChildDefinition('parent'))
197 $this->process($container);
199 $this->assertTrue($container->getDefinition('child1')->isLazy());
202 public function testSetLazyOnServiceIsParent()
204 $container = new ContainerBuilder();
206 $container->register('parent', 'stdClass')
210 $container->setDefinition('child1', new ChildDefinition('parent'));
212 $this->process($container);
214 $this->assertTrue($container->getDefinition('child1')->isLazy());
217 public function testSetAutowiredOnServiceHasParent()
219 $container = new ContainerBuilder();
221 $container->register('parent', 'stdClass')
225 $container->setDefinition('child1', new ChildDefinition('parent'))
226 ->setAutowired(false)
229 $this->process($container);
231 $this->assertFalse($container->getDefinition('child1')->isAutowired());
234 public function testSetAutowiredOnServiceIsParent()
236 $container = new ContainerBuilder();
238 $container->register('parent', 'stdClass')
242 $container->setDefinition('child1', new ChildDefinition('parent'));
244 $this->process($container);
246 $this->assertTrue($container->getDefinition('child1')->isAutowired());
249 public function testDeepDefinitionsResolving()
251 $container = new ContainerBuilder();
253 $container->register('parent', 'parentClass');
254 $container->register('sibling', 'siblingClass')
255 ->setConfigurator(new ChildDefinition('parent'), 'foo')
256 ->setFactory(array(new ChildDefinition('parent'), 'foo'))
257 ->addArgument(new ChildDefinition('parent'))
258 ->setProperty('prop', new ChildDefinition('parent'))
259 ->addMethodCall('meth', array(new ChildDefinition('parent')))
262 $this->process($container);
264 $configurator = $container->getDefinition('sibling')->getConfigurator();
265 $this->assertInstanceOf('Symfony\Component\DependencyInjection\Definition', $configurator);
266 $this->assertSame('parentClass', $configurator->getClass());
268 $factory = $container->getDefinition('sibling')->getFactory();
269 $this->assertInstanceOf('Symfony\Component\DependencyInjection\Definition', $factory[0]);
270 $this->assertSame('parentClass', $factory[0]->getClass());
272 $argument = $container->getDefinition('sibling')->getArgument(0);
273 $this->assertInstanceOf('Symfony\Component\DependencyInjection\Definition', $argument);
274 $this->assertSame('parentClass', $argument->getClass());
276 $properties = $container->getDefinition('sibling')->getProperties();
277 $this->assertInstanceOf('Symfony\Component\DependencyInjection\Definition', $properties['prop']);
278 $this->assertSame('parentClass', $properties['prop']->getClass());
280 $methodCalls = $container->getDefinition('sibling')->getMethodCalls();
281 $this->assertInstanceOf('Symfony\Component\DependencyInjection\Definition', $methodCalls[0][1][0]);
282 $this->assertSame('parentClass', $methodCalls[0][1][0]->getClass());
285 public function testSetDecoratedServiceOnServiceHasParent()
287 $container = new ContainerBuilder();
289 $container->register('parent', 'stdClass');
291 $container->setDefinition('child1', new ChildDefinition('parent'))
292 ->setDecoratedService('foo', 'foo_inner', 5)
295 $this->process($container);
297 $this->assertEquals(array('foo', 'foo_inner', 5), $container->getDefinition('child1')->getDecoratedService());
300 public function testDecoratedServiceCopiesDeprecatedStatusFromParent()
302 $container = new ContainerBuilder();
303 $container->register('deprecated_parent')
304 ->setDeprecated(true)
307 $container->setDefinition('decorated_deprecated_parent', new ChildDefinition('deprecated_parent'));
309 $this->process($container);
311 $this->assertTrue($container->getDefinition('decorated_deprecated_parent')->isDeprecated());
314 public function testDecoratedServiceCanOverwriteDeprecatedParentStatus()
316 $container = new ContainerBuilder();
317 $container->register('deprecated_parent')
318 ->setDeprecated(true)
321 $container->setDefinition('decorated_deprecated_parent', new ChildDefinition('deprecated_parent'))
322 ->setDeprecated(false)
325 $this->process($container);
327 $this->assertFalse($container->getDefinition('decorated_deprecated_parent')->isDeprecated());
333 public function testProcessMergeAutowiringTypes()
335 $container = new ContainerBuilder();
339 ->addAutowiringType('Foo')
343 ->setDefinition('child', new ChildDefinition('parent'))
344 ->addAutowiringType('Bar')
347 $this->process($container);
349 $childDef = $container->getDefinition('child');
350 $this->assertEquals(array('Foo', 'Bar'), $childDef->getAutowiringTypes());
352 $parentDef = $container->getDefinition('parent');
353 $this->assertSame(array('Foo'), $parentDef->getAutowiringTypes());
356 public function testProcessResolvesAliases()
358 $container = new ContainerBuilder();
360 $container->register('parent', 'ParentClass');
361 $container->setAlias('parent_alias', 'parent');
362 $container->setDefinition('child', new ChildDefinition('parent_alias'));
364 $this->process($container);
366 $def = $container->getDefinition('child');
367 $this->assertSame('ParentClass', $def->getClass());
370 public function testProcessSetsArguments()
372 $container = new ContainerBuilder();
374 $container->register('parent', 'ParentClass')->setArguments(array(0));
375 $container->setDefinition('child', (new ChildDefinition('parent'))->setArguments(array(
381 $this->process($container);
383 $def = $container->getDefinition('child');
384 $this->assertSame(array(2, 1, 'foo' => 3), $def->getArguments());
387 public function testSetAutoconfiguredOnServiceIsParent()
389 $container = new ContainerBuilder();
391 $container->register('parent', 'stdClass')
392 ->setAutoconfigured(true)
395 $container->setDefinition('child1', new ChildDefinition('parent'));
397 $this->process($container);
399 $this->assertFalse($container->getDefinition('child1')->isAutoconfigured());
402 protected function process(ContainerBuilder $container)
404 $pass = new ResolveDefinitionTemplatesPass();
405 $pass->process($container);