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\Alias;
16 use Symfony\Component\DependencyInjection\Compiler\DecoratorServicePass;
17 use Symfony\Component\DependencyInjection\ContainerBuilder;
19 class DecoratorServicePassTest extends TestCase
21 public function testProcessWithoutAlias()
23 $container = new ContainerBuilder();
24 $fooDefinition = $container
28 $fooExtendedDefinition = $container
29 ->register('foo.extended')
31 ->setDecoratedService('foo')
33 $barDefinition = $container
37 $barExtendedDefinition = $container
38 ->register('bar.extended')
40 ->setDecoratedService('bar', 'bar.yoo')
43 $this->process($container);
45 $this->assertEquals('foo.extended', $container->getAlias('foo'));
46 $this->assertFalse($container->getAlias('foo')->isPublic());
48 $this->assertEquals('bar.extended', $container->getAlias('bar'));
49 $this->assertTrue($container->getAlias('bar')->isPublic());
51 $this->assertSame($fooDefinition, $container->getDefinition('foo.extended.inner'));
52 $this->assertFalse($container->getDefinition('foo.extended.inner')->isPublic());
54 $this->assertSame($barDefinition, $container->getDefinition('bar.yoo'));
55 $this->assertFalse($container->getDefinition('bar.yoo')->isPublic());
57 $this->assertNull($fooExtendedDefinition->getDecoratedService());
58 $this->assertNull($barExtendedDefinition->getDecoratedService());
61 public function testProcessWithAlias()
63 $container = new ContainerBuilder();
68 $container->setAlias('foo.alias', new Alias('foo', false));
69 $fooExtendedDefinition = $container
70 ->register('foo.extended')
72 ->setDecoratedService('foo.alias')
75 $this->process($container);
77 $this->assertEquals('foo.extended', $container->getAlias('foo.alias'));
78 $this->assertFalse($container->getAlias('foo.alias')->isPublic());
80 $this->assertEquals('foo', $container->getAlias('foo.extended.inner'));
81 $this->assertFalse($container->getAlias('foo.extended.inner')->isPublic());
83 $this->assertNull($fooExtendedDefinition->getDecoratedService());
86 public function testProcessWithPriority()
88 $container = new ContainerBuilder();
89 $fooDefinition = $container
93 $barDefinition = $container
96 ->setDecoratedService('foo')
98 $bazDefinition = $container
101 ->setDecoratedService('foo', null, 5)
103 $quxDefinition = $container
106 ->setDecoratedService('foo', null, 3)
109 $this->process($container);
111 $this->assertEquals('bar', $container->getAlias('foo'));
112 $this->assertFalse($container->getAlias('foo')->isPublic());
114 $this->assertSame($fooDefinition, $container->getDefinition('baz.inner'));
115 $this->assertFalse($container->getDefinition('baz.inner')->isPublic());
117 $this->assertEquals('qux', $container->getAlias('bar.inner'));
118 $this->assertFalse($container->getAlias('bar.inner')->isPublic());
120 $this->assertEquals('baz', $container->getAlias('qux.inner'));
121 $this->assertFalse($container->getAlias('qux.inner')->isPublic());
123 $this->assertNull($barDefinition->getDecoratedService());
124 $this->assertNull($bazDefinition->getDecoratedService());
125 $this->assertNull($quxDefinition->getDecoratedService());
128 public function testProcessMovesTagsFromDecoratedDefinitionToDecoratingDefinition()
130 $container = new ContainerBuilder();
133 ->setTags(array('bar' => array('attr' => 'baz')))
137 ->setTags(array('foobar' => array('attr' => 'bar')))
138 ->setDecoratedService('foo')
141 $this->process($container);
143 $this->assertEmpty($container->getDefinition('baz.inner')->getTags());
144 $this->assertEquals(array('bar' => array('attr' => 'baz'), 'foobar' => array('attr' => 'bar')), $container->getDefinition('baz')->getTags());
150 public function testProcessMergesAutowiringTypesInDecoratingDefinitionAndRemoveThemFromDecoratedDefinition()
152 $container = new ContainerBuilder();
156 ->addAutowiringType('Bar')
161 ->setDecoratedService('parent')
162 ->addAutowiringType('Foo')
165 $this->process($container);
167 $this->assertEquals(array('Bar', 'Foo'), $container->getDefinition('child')->getAutowiringTypes());
168 $this->assertEmpty($container->getDefinition('child.inner')->getAutowiringTypes());
171 public function testProcessMovesTagsFromDecoratedDefinitionToDecoratingDefinitionMultipleTimes()
173 $container = new ContainerBuilder();
177 ->setTags(array('bar' => array('attr' => 'baz')))
181 ->setDecoratedService('foo', null, 50)
185 ->setDecoratedService('foo', null, 2)
188 $this->process($container);
190 $this->assertEmpty($container->getDefinition('deco1')->getTags());
191 $this->assertEquals(array('bar' => array('attr' => 'baz')), $container->getDefinition('deco2')->getTags());
194 protected function process(ContainerBuilder $container)
196 $repeatedPass = new DecoratorServicePass();
197 $repeatedPass->process($container);