* * 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:----k3ppWvnueHkqPHr2G2s473pNBU9UkHBDMVQaNbbPtp8oRhzWdmTEqzbTBLa1fVaBSsdJ38om+7yIvYYAJZMxh116v+BVTKWXYd+3kBDhrEQS78A6/hJoaPZJ3neCl6zax8vsE8QI8Qe4DQHiOzmcMH6KmOXoPklt84ePY/ZIrjMd0uHc+02e9FumT6Y1QZ09eUDzyHBVLxJR26W2GoSsm7P4k/Oo2StPHuDy/1WtMkizn0Hp8X/993A+eiUpeR5wWi67YD4tpmdbZpdt6V65fqC+E9ekePDM7OCvwELFwK3S83VcpDX1d1vjQX8lEBpDokUkR/71A5qFf7KQbNCUBhnJq+AFaEeR2niWZh3YMjbgmJTKJr8ktSCBpSOge7CoMy3CnbmDicMv0dSpI5W2MSZ/JI6KL6Nm7k0b8DLGvxiSF0+wBTrVEWNWkeDAO22G5jCyaYTZLUsAHI8YTsI8cDVOaHlfl1xEK5OMFO01t3rE6t9JZI1oisAVNSIWvuIwdVwW7GVN/xpLTtSUYRJzM1hQznoVSxpSvsblZPS04cOTu/JP6AR6Zet51xW1SgG+qLxkJIN+7aafWk5hwpFahq6IQioAS2HuAgx9I1HgfGtMxqbWlfPxbWl7YBsqAfisa5M9lMvBsOk0ovZdy6Z3LT0UAq0yst8gdmaZSm1Opv4=----ATTACHMENT:----NzQxNzc2Nzg4OTExNTg5OCA2NTI3ODMyMTI3Nzk0MjQyIDI0MzUxMDgzMTE3OTE4NA==