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\ContainerInterface;
16 use Symfony\Component\DependencyInjection\DefinitionDecorator;
17 use Symfony\Component\DependencyInjection\Compiler\ResolveDefinitionTemplatesPass;
18 use Symfony\Component\DependencyInjection\ContainerBuilder;
20 class ResolveDefinitionTemplatesPassTest extends TestCase
22 public function testProcess()
24 $container = new ContainerBuilder();
25 $container->register('parent', 'foo')->setArguments(array('moo', 'b'))->setProperty('foo', 'moo');
26 $container->setDefinition('child', new DefinitionDecorator('parent'))
27 ->replaceArgument(0, 'a')
28 ->setProperty('foo', 'bar')
32 $this->process($container);
34 $def = $container->getDefinition('child');
35 $this->assertNotInstanceOf('Symfony\Component\DependencyInjection\DefinitionDecorator', $def);
36 $this->assertEquals('bar', $def->getClass());
37 $this->assertEquals(array('a', 'b'), $def->getArguments());
38 $this->assertEquals(array('foo' => 'bar'), $def->getProperties());
41 public function testProcessAppendsMethodCallsAlways()
43 $container = new ContainerBuilder();
47 ->addMethodCall('foo', array('bar'))
51 ->setDefinition('child', new DefinitionDecorator('parent'))
52 ->addMethodCall('bar', array('foo'))
55 $this->process($container);
57 $def = $container->getDefinition('child');
58 $this->assertEquals(array(
59 array('foo', array('bar')),
60 array('bar', array('foo')),
61 ), $def->getMethodCalls());
64 public function testProcessDoesNotCopyAbstract()
66 $container = new ContainerBuilder();
74 ->setDefinition('child', new DefinitionDecorator('parent'))
77 $this->process($container);
79 $def = $container->getDefinition('child');
80 $this->assertFalse($def->isAbstract());
86 public function testProcessDoesNotCopyScope()
88 $container = new ContainerBuilder();
96 ->setDefinition('child', new DefinitionDecorator('parent'))
99 $this->process($container);
101 $def = $container->getDefinition('child');
102 $this->assertEquals(ContainerInterface::SCOPE_CONTAINER, $def->getScope());
105 public function testProcessDoesNotCopyShared()
107 $container = new ContainerBuilder();
115 ->setDefinition('child', new DefinitionDecorator('parent'))
118 $this->process($container);
120 $def = $container->getDefinition('child');
121 $this->assertTrue($def->isShared());
124 public function testProcessDoesNotCopyTags()
126 $container = new ContainerBuilder();
134 ->setDefinition('child', new DefinitionDecorator('parent'))
137 $this->process($container);
139 $def = $container->getDefinition('child');
140 $this->assertEquals(array(), $def->getTags());
143 public function testProcessDoesNotCopyDecoratedService()
145 $container = new ContainerBuilder();
149 ->setDecoratedService('foo')
153 ->setDefinition('child', new DefinitionDecorator('parent'))
156 $this->process($container);
158 $def = $container->getDefinition('child');
159 $this->assertNull($def->getDecoratedService());
162 public function testProcessDoesNotDropShared()
164 $container = new ContainerBuilder();
171 ->setDefinition('child', new DefinitionDecorator('parent'))
175 $this->process($container);
177 $def = $container->getDefinition('child');
178 $this->assertFalse($def->isShared());
181 public function testProcessHandlesMultipleInheritance()
183 $container = new ContainerBuilder();
186 ->register('parent', 'foo')
187 ->setArguments(array('foo', 'bar', 'c'))
191 ->setDefinition('child2', new DefinitionDecorator('child1'))
192 ->replaceArgument(1, 'b')
196 ->setDefinition('child1', new DefinitionDecorator('parent'))
197 ->replaceArgument(0, 'a')
200 $this->process($container);
202 $def = $container->getDefinition('child2');
203 $this->assertEquals(array('a', 'b', 'c'), $def->getArguments());
204 $this->assertEquals('foo', $def->getClass());
207 public function testSetLazyOnServiceHasParent()
209 $container = new ContainerBuilder();
211 $container->register('parent', 'stdClass');
213 $container->setDefinition('child1', new DefinitionDecorator('parent'))
217 $this->process($container);
219 $this->assertTrue($container->getDefinition('child1')->isLazy());
222 public function testSetLazyOnServiceIsParent()
224 $container = new ContainerBuilder();
226 $container->register('parent', 'stdClass')
230 $container->setDefinition('child1', new DefinitionDecorator('parent'));
232 $this->process($container);
234 $this->assertTrue($container->getDefinition('child1')->isLazy());
237 public function testSetAutowiredOnServiceHasParent()
239 $container = new ContainerBuilder();
241 $container->register('parent', 'stdClass');
243 $container->setDefinition('child1', new DefinitionDecorator('parent'))
247 $this->process($container);
249 $this->assertTrue($container->getDefinition('child1')->isAutowired());
252 public function testSetAutowiredOnServiceIsParent()
254 $container = new ContainerBuilder();
256 $container->register('parent', 'stdClass')
260 $container->setDefinition('child1', new DefinitionDecorator('parent'));
262 $this->process($container);
264 $this->assertTrue($container->getDefinition('child1')->isAutowired());
267 public function testDeepDefinitionsResolving()
269 $container = new ContainerBuilder();
271 $container->register('parent', 'parentClass');
272 $container->register('sibling', 'siblingClass')
273 ->setConfigurator(new DefinitionDecorator('parent'), 'foo')
274 ->setFactory(array(new DefinitionDecorator('parent'), 'foo'))
275 ->addArgument(new DefinitionDecorator('parent'))
276 ->setProperty('prop', new DefinitionDecorator('parent'))
277 ->addMethodCall('meth', array(new DefinitionDecorator('parent')))
280 $this->process($container);
282 $configurator = $container->getDefinition('sibling')->getConfigurator();
283 $this->assertSame('Symfony\Component\DependencyInjection\Definition', get_class($configurator));
284 $this->assertSame('parentClass', $configurator->getClass());
286 $factory = $container->getDefinition('sibling')->getFactory();
287 $this->assertSame('Symfony\Component\DependencyInjection\Definition', get_class($factory[0]));
288 $this->assertSame('parentClass', $factory[0]->getClass());
290 $argument = $container->getDefinition('sibling')->getArgument(0);
291 $this->assertSame('Symfony\Component\DependencyInjection\Definition', get_class($argument));
292 $this->assertSame('parentClass', $argument->getClass());
294 $properties = $container->getDefinition('sibling')->getProperties();
295 $this->assertSame('Symfony\Component\DependencyInjection\Definition', get_class($properties['prop']));
296 $this->assertSame('parentClass', $properties['prop']->getClass());
298 $methodCalls = $container->getDefinition('sibling')->getMethodCalls();
299 $this->assertSame('Symfony\Component\DependencyInjection\Definition', get_class($methodCalls[0][1][0]));
300 $this->assertSame('parentClass', $methodCalls[0][1][0]->getClass());
303 public function testSetDecoratedServiceOnServiceHasParent()
305 $container = new ContainerBuilder();
307 $container->register('parent', 'stdClass');
309 $container->setDefinition('child1', new DefinitionDecorator('parent'))
310 ->setDecoratedService('foo', 'foo_inner', 5)
313 $this->process($container);
315 $this->assertEquals(array('foo', 'foo_inner', 5), $container->getDefinition('child1')->getDecoratedService());
318 public function testDecoratedServiceCopiesDeprecatedStatusFromParent()
320 $container = new ContainerBuilder();
321 $container->register('deprecated_parent')
322 ->setDeprecated(true)
325 $container->setDefinition('decorated_deprecated_parent', new DefinitionDecorator('deprecated_parent'));
327 $this->process($container);
329 $this->assertTrue($container->getDefinition('decorated_deprecated_parent')->isDeprecated());
332 public function testDecoratedServiceCanOverwriteDeprecatedParentStatus()
334 $container = new ContainerBuilder();
335 $container->register('deprecated_parent')
336 ->setDeprecated(true)
339 $container->setDefinition('decorated_deprecated_parent', new DefinitionDecorator('deprecated_parent'))
340 ->setDeprecated(false)
343 $this->process($container);
345 $this->assertFalse($container->getDefinition('decorated_deprecated_parent')->isDeprecated());
348 public function testProcessMergeAutowiringTypes()
350 $container = new ContainerBuilder();
354 ->addAutowiringType('Foo')
358 ->setDefinition('child', new DefinitionDecorator('parent'))
359 ->addAutowiringType('Bar')
362 $this->process($container);
364 $childDef = $container->getDefinition('child');
365 $this->assertEquals(array('Foo', 'Bar'), $childDef->getAutowiringTypes());
367 $parentDef = $container->getDefinition('parent');
368 $this->assertSame(array('Foo'), $parentDef->getAutowiringTypes());
371 protected function process(ContainerBuilder $container)
373 $pass = new ResolveDefinitionTemplatesPass();
374 $pass->process($container);