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\Reference;
19 use Symfony\Component\DependencyInjection\ContainerBuilder;
21 class AnalyzeServiceReferencesPassTest extends TestCase
23 public function testProcess()
25 $container = new ContainerBuilder();
29 ->addArgument($ref1 = new Reference('b'))
34 ->addMethodCall('setA', array($ref2 = new Reference('a')))
39 ->addArgument($ref3 = new Reference('a'))
40 ->addArgument($ref4 = new Reference('b'))
45 ->setProperty('foo', $ref5 = new Reference('b'))
50 ->setConfigurator(array($ref6 = new Reference('b'), 'methodName'))
53 $graph = $this->process($container);
55 $this->assertCount(4, $edges = $graph->getNode('b')->getInEdges());
57 $this->assertSame($ref1, $edges[0]->getValue());
58 $this->assertSame($ref4, $edges[1]->getValue());
59 $this->assertSame($ref5, $edges[2]->getValue());
60 $this->assertSame($ref6, $edges[3]->getValue());
63 public function testProcessDetectsReferencesFromInlinedDefinitions()
65 $container = new ContainerBuilder();
73 ->addArgument(new Definition(null, array($ref = new Reference('a'))))
76 $graph = $this->process($container);
78 $this->assertCount(1, $refs = $graph->getNode('a')->getInEdges());
79 $this->assertSame($ref, $refs[0]->getValue());
82 public function testProcessDetectsReferencesFromInlinedFactoryDefinitions()
84 $container = new ContainerBuilder();
90 $factory = new Definition();
91 $factory->setFactory(array(new Reference('a'), 'a'));
95 ->addArgument($factory)
98 $graph = $this->process($container);
100 $this->assertTrue($graph->hasNode('a'));
101 $this->assertCount(1, $refs = $graph->getNode('a')->getInEdges());
104 public function testProcessDoesNotSaveDuplicateReferences()
106 $container = new ContainerBuilder();
113 ->addArgument(new Definition(null, array($ref1 = new Reference('a'))))
114 ->addArgument(new Definition(null, array($ref2 = new Reference('a'))))
117 $graph = $this->process($container);
119 $this->assertCount(2, $graph->getNode('a')->getInEdges());
122 public function testProcessDetectsFactoryReferences()
124 $container = new ContainerBuilder();
127 ->register('foo', 'stdClass')
128 ->setFactory(array('stdClass', 'getInstance'));
131 ->register('bar', 'stdClass')
132 ->setFactory(array(new Reference('foo'), 'getInstance'));
134 $graph = $this->process($container);
136 $this->assertTrue($graph->hasNode('foo'));
137 $this->assertCount(1, $graph->getNode('foo')->getInEdges());
140 protected function process(ContainerBuilder $container)
142 $pass = new RepeatedPass(array(new AnalyzeServiceReferencesPass()));
143 $pass->process($container);
145 return $container->getCompiler()->getServiceReferenceGraph();