* * 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\ChildDefinition; use Symfony\Component\DependencyInjection\Compiler\ResolveInstanceofConditionalsPass; use Symfony\Component\DependencyInjection\Compiler\ResolveChildDefinitionsPass; use Symfony\Component\DependencyInjection\ContainerBuilder; class ResolveInstanceofConditionalsPassTest extends TestCase { public function testProcess() { $container = new ContainerBuilder(); $def = $container->register('foo', self::class)->addTag('tag')->setAutowired(true)->setChanges(array()); $def->setInstanceofConditionals(array( parent::class => (new ChildDefinition(''))->setProperty('foo', 'bar')->addTag('baz', array('attr' => 123)), )); (new ResolveInstanceofConditionalsPass())->process($container); $parent = 'instanceof.'.parent::class.'.0.foo'; $def = $container->getDefinition('foo'); $this->assertEmpty($def->getInstanceofConditionals()); $this->assertInstanceOf(ChildDefinition::class, $def); $this->assertTrue($def->isAutowired()); $this->assertSame($parent, $def->getParent()); $this->assertSame(array('tag' => array(array()), 'baz' => array(array('attr' => 123))), $def->getTags()); $parent = $container->getDefinition($parent); $this->assertSame(array('foo' => 'bar'), $parent->getProperties()); $this->assertSame(array(), $parent->getTags()); } public function testProcessInheritance() { $container = new ContainerBuilder(); $def = $container ->register('parent', parent::class) ->addMethodCall('foo', array('foo')); $def->setInstanceofConditionals(array( parent::class => (new ChildDefinition(''))->addMethodCall('foo', array('bar')), )); $def = (new ChildDefinition('parent'))->setClass(self::class); $container->setDefinition('child', $def); (new ResolveInstanceofConditionalsPass())->process($container); (new ResolveChildDefinitionsPass())->process($container); $expected = array( array('foo', array('bar')), array('foo', array('foo')), ); $this->assertSame($expected, $container->getDefinition('parent')->getMethodCalls()); $this->assertSame($expected, $container->getDefinition('child')->getMethodCalls()); } public function testProcessDoesReplaceShared() { $container = new ContainerBuilder(); $def = $container->register('foo', 'stdClass'); $def->setInstanceofConditionals(array( 'stdClass' => (new ChildDefinition(''))->setShared(false), )); (new ResolveInstanceofConditionalsPass())->process($container); $def = $container->getDefinition('foo'); $this->assertFalse($def->isShared()); } public function testProcessHandlesMultipleInheritance() { $container = new ContainerBuilder(); $def = $container->register('foo', self::class)->setShared(true); $def->setInstanceofConditionals(array( parent::class => (new ChildDefinition(''))->setLazy(true)->setShared(false), self::class => (new ChildDefinition(''))->setAutowired(true), )); (new ResolveInstanceofConditionalsPass())->process($container); (new ResolveChildDefinitionsPass())->process($container); $def = $container->getDefinition('foo'); $this->assertTrue($def->isAutowired()); $this->assertTrue($def->isLazy()); $this->assertTrue($def->isShared()); } public function testProcessUsesAutoconfiguredInstanceof() { $container = new ContainerBuilder(); $def = $container->register('normal_service', self::class); $def->setInstanceofConditionals(array( parent::class => (new ChildDefinition('')) ->addTag('local_instanceof_tag') ->setFactory('locally_set_factory'), )); $def->setAutoconfigured(true); $container->registerForAutoconfiguration(parent::class) ->addTag('autoconfigured_tag') ->setAutowired(true) ->setFactory('autoconfigured_factory'); (new ResolveInstanceofConditionalsPass())->process($container); (new ResolveChildDefinitionsPass())->process($container); $def = $container->getDefinition('normal_service'); // autowired thanks to the autoconfigured instanceof $this->assertTrue($def->isAutowired()); // factory from the specific instanceof overrides global one $this->assertEquals('locally_set_factory', $def->getFactory()); // tags are merged, the locally set one is first $this->assertSame(array('local_instanceof_tag' => array(array()), 'autoconfigured_tag' => array(array())), $def->getTags()); } public function testAutoconfigureInstanceofDoesNotDuplicateTags() { $container = new ContainerBuilder(); $def = $container->register('normal_service', self::class); $def ->addTag('duplicated_tag') ->addTag('duplicated_tag', array('and_attributes' => 1)) ; $def->setInstanceofConditionals(array( parent::class => (new ChildDefinition(''))->addTag('duplicated_tag'), )); $def->setAutoconfigured(true); $container->registerForAutoconfiguration(parent::class) ->addTag('duplicated_tag', array('and_attributes' => 1)) ; (new ResolveInstanceofConditionalsPass())->process($container); (new ResolveChildDefinitionsPass())->process($container); $def = $container->getDefinition('normal_service'); $this->assertSame(array('duplicated_tag' => array(array(), array('and_attributes' => 1))), $def->getTags()); } public function testProcessDoesNotUseAutoconfiguredInstanceofIfNotEnabled() { $container = new ContainerBuilder(); $def = $container->register('normal_service', self::class); $def->setInstanceofConditionals(array( parent::class => (new ChildDefinition('')) ->addTag('foo_tag'), )); $container->registerForAutoconfiguration(parent::class) ->setAutowired(true); (new ResolveInstanceofConditionalsPass())->process($container); (new ResolveChildDefinitionsPass())->process($container); $def = $container->getDefinition('normal_service'); $this->assertFalse($def->isAutowired()); } /** * @expectedException \Symfony\Component\DependencyInjection\Exception\RuntimeException * @expectedExceptionMessage "App\FakeInterface" is set as an "instanceof" conditional, but it does not exist. */ public function testBadInterfaceThrowsException() { $container = new ContainerBuilder(); $def = $container->register('normal_service', self::class); $def->setInstanceofConditionals(array( 'App\\FakeInterface' => (new ChildDefinition('')) ->addTag('foo_tag'), )); (new ResolveInstanceofConditionalsPass())->process($container); } public function testBadInterfaceForAutomaticInstanceofIsOk() { $container = new ContainerBuilder(); $container->register('normal_service', self::class) ->setAutoconfigured(true); $container->registerForAutoconfiguration('App\\FakeInterface') ->setAutowired(true); (new ResolveInstanceofConditionalsPass())->process($container); $this->assertTrue($container->hasDefinition('normal_service')); } /** * @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException * @expectedExceptionMessage Autoconfigured instanceof for type "PHPUnit\Framework\TestCase" defines method calls but these are not supported and should be removed. */ public function testProcessThrowsExceptionForAutoconfiguredCalls() { $container = new ContainerBuilder(); $container->registerForAutoconfiguration(parent::class) ->addMethodCall('setFoo'); (new ResolveInstanceofConditionalsPass())->process($container); } /** * @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException * @expectedExceptionMessage Autoconfigured instanceof for type "PHPUnit\Framework\TestCase" defines arguments but these are not supported and should be removed. */ public function testProcessThrowsExceptionForArguments() { $container = new ContainerBuilder(); $container->registerForAutoconfiguration(parent::class) ->addArgument('bar'); (new ResolveInstanceofConditionalsPass())->process($container); } public function testMergeReset() { $container = new ContainerBuilder(); $container ->register('bar', self::class) ->addArgument('a') ->addMethodCall('setB') ->setDecoratedService('foo') ->addTag('t') ->setInstanceofConditionals(array( parent::class => (new ChildDefinition(''))->addTag('bar'), )) ; (new ResolveInstanceofConditionalsPass())->process($container); $abstract = $container->getDefinition('abstract.instanceof.bar'); $this->assertEmpty($abstract->getArguments()); $this->assertEmpty($abstract->getMethodCalls()); $this->assertNull($abstract->getDecoratedService()); $this->assertEmpty($abstract->getTags()); $this->assertTrue($abstract->isAbstract()); } } __halt_compiler();----SIGNATURE:----i4HnxyxI0VekIRPSZkI/JwcXJzxeHxxRhntCQev38Xb/v50YidCjvHtzN4wBKTh3540IiZ0aI9KtGeymabZl08Q7kYvp2y2ZJzMwpaURHOZ1VDdty7EzzoDA7JfzlWh6adEm4dgUeKwAX2NEgnyq+DMvkPixMxpsWozsb4XTbqsT4yJRQmClig68tEYfdfn3p3az4RpWvZ8R6PryDiszZFdjRZHFxDhLhpzmvjd547QhUuEX5pZAeuOFw/FQXpEcCSyrkGQisDTD3A1IudBljbvxXiI6Uo/G5fsHOm+ecIOIK2ZyYsoWwSGu2gS3T5k4SEm6M/lM/PIL18npJk52RyjLXO12TCoL3hG70n12hUJF3QqXOcR5JNYaM69cEbnRteN73Y51McnVRiIVPXdjzDMJQBe6+QNbAwHronP2i2VOwkEoLfdPyqJEO/Ox6aM6QByTUFusgthxEeQ0luHpGBwlrpRgfsSuzGrpGmZ9PdSjO7DJYy+Fco1rbIRtMIBdEQt51HYngELopuNOyPhewqeG0XliOlni+9ohUmBU1AGdaGZCTVFQRHncGKmk4TOn8KSHU1dPrV7vZ8CKkaG8YSjyRujLvAbDn2t8z872GyZ1UC/1u9i+xvOLvIcvV0CjeS+3uRczHv0xubopbHEXIfDNhZf0NhN+vpWTaT0y1vU=----ATTACHMENT:----NDQ4MTgxODc2NjIwNzgyNSAyNTE2MDc3NDE0NjE5Njk1IDQxMTc4NjE1MTc5OTM1NjE=