fe1334e91a0ddef46c6515da0aae16c74f49d976
[yaffs-website] / vendor / symfony / dependency-injection / Tests / Compiler / DecoratorServicePassTest.php
1 <?php
2
3 /*
4  * This file is part of the Symfony package.
5  *
6  * (c) Fabien Potencier <fabien@symfony.com>
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11
12 namespace Symfony\Component\DependencyInjection\Tests\Compiler;
13
14 use PHPUnit\Framework\TestCase;
15 use Symfony\Component\DependencyInjection\Alias;
16 use Symfony\Component\DependencyInjection\Compiler\DecoratorServicePass;
17 use Symfony\Component\DependencyInjection\ContainerBuilder;
18
19 class DecoratorServicePassTest extends TestCase
20 {
21     public function testProcessWithoutAlias()
22     {
23         $container = new ContainerBuilder();
24         $fooDefinition = $container
25             ->register('foo')
26             ->setPublic(false)
27         ;
28         $fooExtendedDefinition = $container
29             ->register('foo.extended')
30             ->setPublic(true)
31             ->setDecoratedService('foo')
32         ;
33         $barDefinition = $container
34             ->register('bar')
35             ->setPublic(true)
36         ;
37         $barExtendedDefinition = $container
38             ->register('bar.extended')
39             ->setPublic(true)
40             ->setDecoratedService('bar', 'bar.yoo')
41         ;
42
43         $this->process($container);
44
45         $this->assertEquals('foo.extended', $container->getAlias('foo'));
46         $this->assertFalse($container->getAlias('foo')->isPublic());
47
48         $this->assertEquals('bar.extended', $container->getAlias('bar'));
49         $this->assertTrue($container->getAlias('bar')->isPublic());
50
51         $this->assertSame($fooDefinition, $container->getDefinition('foo.extended.inner'));
52         $this->assertFalse($container->getDefinition('foo.extended.inner')->isPublic());
53
54         $this->assertSame($barDefinition, $container->getDefinition('bar.yoo'));
55         $this->assertFalse($container->getDefinition('bar.yoo')->isPublic());
56
57         $this->assertNull($fooExtendedDefinition->getDecoratedService());
58         $this->assertNull($barExtendedDefinition->getDecoratedService());
59     }
60
61     public function testProcessWithAlias()
62     {
63         $container = new ContainerBuilder();
64         $container
65             ->register('foo')
66             ->setPublic(true)
67         ;
68         $container->setAlias('foo.alias', new Alias('foo', false));
69         $fooExtendedDefinition = $container
70             ->register('foo.extended')
71             ->setPublic(true)
72             ->setDecoratedService('foo.alias')
73         ;
74
75         $this->process($container);
76
77         $this->assertEquals('foo.extended', $container->getAlias('foo.alias'));
78         $this->assertFalse($container->getAlias('foo.alias')->isPublic());
79
80         $this->assertEquals('foo', $container->getAlias('foo.extended.inner'));
81         $this->assertFalse($container->getAlias('foo.extended.inner')->isPublic());
82
83         $this->assertNull($fooExtendedDefinition->getDecoratedService());
84     }
85
86     public function testProcessWithPriority()
87     {
88         $container = new ContainerBuilder();
89         $fooDefinition = $container
90             ->register('foo')
91             ->setPublic(false)
92         ;
93         $barDefinition = $container
94             ->register('bar')
95             ->setPublic(true)
96             ->setDecoratedService('foo')
97         ;
98         $bazDefinition = $container
99             ->register('baz')
100             ->setPublic(true)
101             ->setDecoratedService('foo', null, 5)
102         ;
103         $quxDefinition = $container
104             ->register('qux')
105             ->setPublic(true)
106             ->setDecoratedService('foo', null, 3)
107         ;
108
109         $this->process($container);
110
111         $this->assertEquals('bar', $container->getAlias('foo'));
112         $this->assertFalse($container->getAlias('foo')->isPublic());
113
114         $this->assertSame($fooDefinition, $container->getDefinition('baz.inner'));
115         $this->assertFalse($container->getDefinition('baz.inner')->isPublic());
116
117         $this->assertEquals('qux', $container->getAlias('bar.inner'));
118         $this->assertFalse($container->getAlias('bar.inner')->isPublic());
119
120         $this->assertEquals('baz', $container->getAlias('qux.inner'));
121         $this->assertFalse($container->getAlias('qux.inner')->isPublic());
122
123         $this->assertNull($barDefinition->getDecoratedService());
124         $this->assertNull($bazDefinition->getDecoratedService());
125         $this->assertNull($quxDefinition->getDecoratedService());
126     }
127
128     public function testProcessMovesTagsFromDecoratedDefinitionToDecoratingDefinition()
129     {
130         $container = new ContainerBuilder();
131         $container
132             ->register('foo')
133             ->setTags(array('bar' => array('attr' => 'baz')))
134         ;
135         $container
136             ->register('baz')
137             ->setTags(array('foobar' => array('attr' => 'bar')))
138             ->setDecoratedService('foo')
139         ;
140
141         $this->process($container);
142
143         $this->assertEmpty($container->getDefinition('baz.inner')->getTags());
144         $this->assertEquals(array('bar' => array('attr' => 'baz'), 'foobar' => array('attr' => 'bar')), $container->getDefinition('baz')->getTags());
145     }
146
147     /**
148      * @group legacy
149      */
150     public function testProcessMergesAutowiringTypesInDecoratingDefinitionAndRemoveThemFromDecoratedDefinition()
151     {
152         $container = new ContainerBuilder();
153
154         $container
155             ->register('parent')
156             ->addAutowiringType('Bar')
157         ;
158
159         $container
160             ->register('child')
161             ->setDecoratedService('parent')
162             ->addAutowiringType('Foo')
163         ;
164
165         $this->process($container);
166
167         $this->assertEquals(array('Bar', 'Foo'), $container->getDefinition('child')->getAutowiringTypes());
168         $this->assertEmpty($container->getDefinition('child.inner')->getAutowiringTypes());
169     }
170
171     public function testProcessMovesTagsFromDecoratedDefinitionToDecoratingDefinitionMultipleTimes()
172     {
173         $container = new ContainerBuilder();
174         $container
175             ->register('foo')
176             ->setPublic(true)
177             ->setTags(array('bar' => array('attr' => 'baz')))
178         ;
179         $container
180             ->register('deco1')
181             ->setDecoratedService('foo', null, 50)
182         ;
183         $container
184             ->register('deco2')
185             ->setDecoratedService('foo', null, 2)
186         ;
187
188         $this->process($container);
189
190         $this->assertEmpty($container->getDefinition('deco1')->getTags());
191         $this->assertEquals(array('bar' => array('attr' => 'baz')), $container->getDefinition('deco2')->getTags());
192     }
193
194     protected function process(ContainerBuilder $container)
195     {
196         $repeatedPass = new DecoratorServicePass();
197         $repeatedPass->process($container);
198     }
199 }