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\Argument\IteratorArgument;
16 use Symfony\Component\DependencyInjection\Compiler\AnalyzeServiceReferencesPass;
17 use Symfony\Component\DependencyInjection\Compiler\RepeatedPass;
18 use Symfony\Component\DependencyInjection\ContainerBuilder;
19 use Symfony\Component\DependencyInjection\Definition;
20 use Symfony\Component\DependencyInjection\Reference;
22 class AnalyzeServiceReferencesPassTest extends TestCase
24 public function testProcess()
26 $container = new ContainerBuilder();
30 ->addArgument($ref1 = new Reference('b'))
35 ->addMethodCall('setA', array($ref2 = new Reference('a')))
40 ->addArgument($ref3 = new Reference('a'))
41 ->addArgument($ref4 = new Reference('b'))
46 ->setProperty('foo', $ref5 = new Reference('b'))
51 ->setConfigurator(array($ref6 = new Reference('b'), 'methodName'))
54 $graph = $this->process($container);
56 $this->assertCount(4, $edges = $graph->getNode('b')->getInEdges());
58 $this->assertSame($ref1, $edges[0]->getValue());
59 $this->assertSame($ref4, $edges[1]->getValue());
60 $this->assertSame($ref5, $edges[2]->getValue());
61 $this->assertSame($ref6, $edges[3]->getValue());
64 public function testProcessMarksEdgesLazyWhenReferencedServiceIsLazy()
66 $container = new ContainerBuilder();
71 ->addArgument($ref1 = new Reference('b'))
76 ->addArgument($ref2 = new Reference('a'))
79 $graph = $this->process($container);
81 $this->assertCount(1, $graph->getNode('b')->getInEdges());
82 $this->assertCount(1, $edges = $graph->getNode('a')->getInEdges());
84 $this->assertSame($ref2, $edges[0]->getValue());
85 $this->assertTrue($edges[0]->isLazy());
88 public function testProcessMarksEdgesLazyWhenReferencedFromIteratorArgument()
90 $container = new ContainerBuilder();
91 $container->register('a');
92 $container->register('b');
96 ->addArgument($ref1 = new Reference('a'))
97 ->addArgument(new IteratorArgument(array($ref2 = new Reference('b'))))
100 $graph = $this->process($container);
102 $this->assertCount(1, $graph->getNode('a')->getInEdges());
103 $this->assertCount(1, $graph->getNode('b')->getInEdges());
104 $this->assertCount(2, $edges = $graph->getNode('c')->getOutEdges());
106 $this->assertSame($ref1, $edges[0]->getValue());
107 $this->assertFalse($edges[0]->isLazy());
108 $this->assertSame($ref2, $edges[1]->getValue());
109 $this->assertTrue($edges[1]->isLazy());
112 public function testProcessDetectsReferencesFromInlinedDefinitions()
114 $container = new ContainerBuilder();
122 ->addArgument(new Definition(null, array($ref = new Reference('a'))))
125 $graph = $this->process($container);
127 $this->assertCount(1, $refs = $graph->getNode('a')->getInEdges());
128 $this->assertSame($ref, $refs[0]->getValue());
131 public function testProcessDetectsReferencesFromIteratorArguments()
133 $container = new ContainerBuilder();
141 ->addArgument(new IteratorArgument(array($ref = new Reference('a'))))
144 $graph = $this->process($container);
146 $this->assertCount(1, $refs = $graph->getNode('a')->getInEdges());
147 $this->assertSame($ref, $refs[0]->getValue());
150 public function testProcessDetectsReferencesFromInlinedFactoryDefinitions()
152 $container = new ContainerBuilder();
158 $factory = new Definition();
159 $factory->setFactory(array(new Reference('a'), 'a'));
163 ->addArgument($factory)
166 $graph = $this->process($container);
168 $this->assertTrue($graph->hasNode('a'));
169 $this->assertCount(1, $refs = $graph->getNode('a')->getInEdges());
172 public function testProcessDoesNotSaveDuplicateReferences()
174 $container = new ContainerBuilder();
181 ->addArgument(new Definition(null, array($ref1 = new Reference('a'))))
182 ->addArgument(new Definition(null, array($ref2 = new Reference('a'))))
185 $graph = $this->process($container);
187 $this->assertCount(2, $graph->getNode('a')->getInEdges());
190 public function testProcessDetectsFactoryReferences()
192 $container = new ContainerBuilder();
195 ->register('foo', 'stdClass')
196 ->setFactory(array('stdClass', 'getInstance'));
199 ->register('bar', 'stdClass')
200 ->setFactory(array(new Reference('foo'), 'getInstance'));
202 $graph = $this->process($container);
204 $this->assertTrue($graph->hasNode('foo'));
205 $this->assertCount(1, $graph->getNode('foo')->getInEdges());
208 protected function process(ContainerBuilder $container)
210 $pass = new RepeatedPass(array(new AnalyzeServiceReferencesPass()));
211 $pass->process($container);
213 return $container->getCompiler()->getServiceReferenceGraph();