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\Definition;
16 use Symfony\Component\DependencyInjection\Compiler\AnalyzeServiceReferencesPass;
17 use Symfony\Component\DependencyInjection\Compiler\RepeatedPass;
18 use Symfony\Component\DependencyInjection\Compiler\InlineServiceDefinitionsPass;
19 use Symfony\Component\DependencyInjection\Reference;
20 use Symfony\Component\DependencyInjection\ContainerBuilder;
22 class InlineServiceDefinitionsPassTest extends TestCase
24 public function testProcess()
26 $container = new ContainerBuilder();
28 ->register('inlinable.service')
34 ->setArguments(array(new Reference('inlinable.service')))
37 $this->process($container);
39 $arguments = $container->getDefinition('service')->getArguments();
40 $this->assertInstanceOf('Symfony\Component\DependencyInjection\Definition', $arguments[0]);
41 $this->assertSame($container->getDefinition('inlinable.service'), $arguments[0]);
44 public function testProcessDoesNotInlinesWhenAliasedServiceIsShared()
46 $container = new ContainerBuilder();
51 $container->setAlias('moo', 'foo');
55 ->setArguments(array($ref = new Reference('foo')))
58 $this->process($container);
60 $arguments = $container->getDefinition('service')->getArguments();
61 $this->assertSame($ref, $arguments[0]);
64 public function testProcessDoesInlineNonSharedService()
66 $container = new ContainerBuilder();
76 $container->setAlias('moo', 'bar');
80 ->setArguments(array(new Reference('foo'), $ref = new Reference('moo'), new Reference('bar')))
83 $this->process($container);
85 $arguments = $container->getDefinition('service')->getArguments();
86 $this->assertEquals($container->getDefinition('foo'), $arguments[0]);
87 $this->assertNotSame($container->getDefinition('foo'), $arguments[0]);
88 $this->assertSame($ref, $arguments[1]);
89 $this->assertEquals($container->getDefinition('bar'), $arguments[2]);
90 $this->assertNotSame($container->getDefinition('bar'), $arguments[2]);
93 public function testProcessInlinesIfMultipleReferencesButAllFromTheSameDefinition()
95 $container = new ContainerBuilder();
97 $a = $container->register('a')->setPublic(false);
100 ->addArgument(new Reference('a'))
101 ->addArgument(new Definition(null, array(new Reference('a'))))
104 $this->process($container);
106 $arguments = $b->getArguments();
107 $this->assertSame($a, $arguments[0]);
109 $inlinedArguments = $arguments[1]->getArguments();
110 $this->assertSame($a, $inlinedArguments[0]);
113 public function testProcessInlinesPrivateFactoryReference()
115 $container = new ContainerBuilder();
117 $container->register('a')->setPublic(false);
121 ->setFactory(array(new Reference('a'), 'a'))
126 ->setArguments(array(
127 $ref = new Reference('b'),
130 $this->process($container);
132 $inlinedArguments = $container->getDefinition('foo')->getArguments();
133 $this->assertSame($b, $inlinedArguments[0]);
136 public function testProcessDoesNotInlinePrivateFactoryIfReferencedMultipleTimesWithinTheSameDefinition()
138 $container = new ContainerBuilder();
145 ->setFactory(array(new Reference('a'), 'a'))
150 ->setArguments(array(
151 $ref1 = new Reference('b'),
152 $ref2 = new Reference('b'),
155 $this->process($container);
157 $args = $container->getDefinition('foo')->getArguments();
158 $this->assertSame($ref1, $args[0]);
159 $this->assertSame($ref2, $args[1]);
162 public function testProcessDoesNotInlineReferenceWhenUsedByInlineFactory()
164 $container = new ContainerBuilder();
171 ->setFactory(array(new Reference('a'), 'a'))
174 $inlineFactory = new Definition();
175 $inlineFactory->setPublic(false);
176 $inlineFactory->setFactory(array(new Reference('b'), 'b'));
180 ->setArguments(array(
181 $ref = new Reference('b'),
185 $this->process($container);
187 $args = $container->getDefinition('foo')->getArguments();
188 $this->assertSame($ref, $args[0]);
191 public function testProcessDoesNotInlineWhenServiceIsPrivateButLazy()
193 $container = new ContainerBuilder();
201 ->register('service')
202 ->setArguments(array($ref = new Reference('foo')))
205 $this->process($container);
207 $arguments = $container->getDefinition('service')->getArguments();
208 $this->assertSame($ref, $arguments[0]);
211 public function testProcessDoesNotInlineWhenServiceReferencesItself()
213 $container = new ContainerBuilder();
217 ->addMethodCall('foo', array($ref = new Reference('foo')))
220 $this->process($container);
222 $calls = $container->getDefinition('foo')->getMethodCalls();
223 $this->assertSame($ref, $calls[0][1][0]);
226 protected function process(ContainerBuilder $container)
228 $repeatedPass = new RepeatedPass(array(new AnalyzeServiceReferencesPass(), new InlineServiceDefinitionsPass()));
229 $repeatedPass->process($container);