* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\DependencyInjection\Tests\Compiler; use PHPUnit\Framework\TestCase; use Symfony\Component\DependencyInjection\Argument\IteratorArgument; use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Compiler\AnalyzeServiceReferencesPass; use Symfony\Component\DependencyInjection\Compiler\RepeatedPass; use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\DependencyInjection\ContainerBuilder; class AnalyzeServiceReferencesPassTest extends TestCase { public function testProcess() { $container = new ContainerBuilder(); $a = $container ->register('a') ->addArgument($ref1 = new Reference('b')) ; $b = $container ->register('b') ->addMethodCall('setA', array($ref2 = new Reference('a'))) ; $c = $container ->register('c') ->addArgument($ref3 = new Reference('a')) ->addArgument($ref4 = new Reference('b')) ; $d = $container ->register('d') ->setProperty('foo', $ref5 = new Reference('b')) ; $e = $container ->register('e') ->setConfigurator(array($ref6 = new Reference('b'), 'methodName')) ; $graph = $this->process($container); $this->assertCount(4, $edges = $graph->getNode('b')->getInEdges()); $this->assertSame($ref1, $edges[0]->getValue()); $this->assertSame($ref4, $edges[1]->getValue()); $this->assertSame($ref5, $edges[2]->getValue()); $this->assertSame($ref6, $edges[3]->getValue()); } public function testProcessMarksEdgesLazyWhenReferencedServiceIsLazy() { $container = new ContainerBuilder(); $container ->register('a') ->setLazy(true) ->addArgument($ref1 = new Reference('b')) ; $container ->register('b') ->addArgument($ref2 = new Reference('a')) ; $graph = $this->process($container); $this->assertCount(1, $graph->getNode('b')->getInEdges()); $this->assertCount(1, $edges = $graph->getNode('a')->getInEdges()); $this->assertSame($ref2, $edges[0]->getValue()); $this->assertTrue($edges[0]->isLazy()); } public function testProcessMarksEdgesLazyWhenReferencedFromIteratorArgument() { $container = new ContainerBuilder(); $container->register('a'); $container->register('b'); $container ->register('c') ->addArgument($ref1 = new Reference('a')) ->addArgument(new IteratorArgument(array($ref2 = new Reference('b')))) ; $graph = $this->process($container); $this->assertCount(1, $graph->getNode('a')->getInEdges()); $this->assertCount(1, $graph->getNode('b')->getInEdges()); $this->assertCount(2, $edges = $graph->getNode('c')->getOutEdges()); $this->assertSame($ref1, $edges[0]->getValue()); $this->assertFalse($edges[0]->isLazy()); $this->assertSame($ref2, $edges[1]->getValue()); $this->assertTrue($edges[1]->isLazy()); } public function testProcessDetectsReferencesFromInlinedDefinitions() { $container = new ContainerBuilder(); $container ->register('a') ; $container ->register('b') ->addArgument(new Definition(null, array($ref = new Reference('a')))) ; $graph = $this->process($container); $this->assertCount(1, $refs = $graph->getNode('a')->getInEdges()); $this->assertSame($ref, $refs[0]->getValue()); } public function testProcessDetectsReferencesFromIteratorArguments() { $container = new ContainerBuilder(); $container ->register('a') ; $container ->register('b') ->addArgument(new IteratorArgument(array($ref = new Reference('a')))) ; $graph = $this->process($container); $this->assertCount(1, $refs = $graph->getNode('a')->getInEdges()); $this->assertSame($ref, $refs[0]->getValue()); } public function testProcessDetectsReferencesFromInlinedFactoryDefinitions() { $container = new ContainerBuilder(); $container ->register('a') ; $factory = new Definition(); $factory->setFactory(array(new Reference('a'), 'a')); $container ->register('b') ->addArgument($factory) ; $graph = $this->process($container); $this->assertTrue($graph->hasNode('a')); $this->assertCount(1, $refs = $graph->getNode('a')->getInEdges()); } public function testProcessDoesNotSaveDuplicateReferences() { $container = new ContainerBuilder(); $container ->register('a') ; $container ->register('b') ->addArgument(new Definition(null, array($ref1 = new Reference('a')))) ->addArgument(new Definition(null, array($ref2 = new Reference('a')))) ; $graph = $this->process($container); $this->assertCount(2, $graph->getNode('a')->getInEdges()); } public function testProcessDetectsFactoryReferences() { $container = new ContainerBuilder(); $container ->register('foo', 'stdClass') ->setFactory(array('stdClass', 'getInstance')); $container ->register('bar', 'stdClass') ->setFactory(array(new Reference('foo'), 'getInstance')); $graph = $this->process($container); $this->assertTrue($graph->hasNode('foo')); $this->assertCount(1, $graph->getNode('foo')->getInEdges()); } protected function process(ContainerBuilder $container) { $pass = new RepeatedPass(array(new AnalyzeServiceReferencesPass())); $pass->process($container); return $container->getCompiler()->getServiceReferenceGraph(); } } __halt_compiler();----SIGNATURE:----RfHRWoigercX+JM1Dy9VOJ0U0xaKzZXH3FpJGwYadkkg3us0YNV+xEWYAla5XHzAqJu/znRNjLUxfOnvG8RFf6lhpD+fegw9QDAV6M7hDr8tYUuR9ABVwcAGb8avWCBSuzavztXlumsi8Q1GcUgUB8tDp7jyqlWL1c+PktHlOTM5wF/rWxNM8/D2p6vsNOag917U2e7VbGpDjZ8CQLSHODsiqVUlGRFRvEBFORb6jv/am7qXRVye8MFUoLiB50Ay8C1/iTH08iU4P7JjRrbwdGCFTYHwwQJ49Y8v+AYZEZWJpYcgb56holS0lzFm7JYRTaZTMmYc4oEabKnNPQz/Iw7JqM9rb7Hos0Ph0HzwGMi25pSx2whar5foLf6nDylCXRIWbFM1XhDidZVT780bz0jvRMto+me6hjTvPZ50AuWfnd8pA3QBiyA16SSbxtwvUJQiPq0wIIFebTWP6ec/uHsv9FY+Zcno2ibQndU1y/mwMqWYtUhA1cFgiv4U2L3hbMDnIhy/SfhFTFem6Acl+meEm/7O7eT8HoPEAmUbTGhnHYSU4JpPT1XbWG2wgjgeBaH/GaIWDIq41DpXytEMGyBKW2fY5v+bg5mXUQ6+YSD7BJ01hLNnskmEzjt5epTM7lYNBlt7fGqg8101Mn2eKMloztAv2fvguWtiyCNzkyw=----ATTACHMENT:----NzM2MDM1MDU5NjgxNzk1MiA0OTI5OTc5MjAxNzgxMjYzIDY3NTQ3NDQ1Mzk3MzI2ODg=