* * 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\Config\FileLocator; use Symfony\Component\DependencyInjection\Alias; use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\DependencyInjection\ContainerBuilder; /** * This class tests the integration of the different compiler passes. */ class IntegrationTest extends TestCase { /** * This tests that dependencies are correctly processed. * * We're checking that: * * * A is public, B/C are private * * A -> C * * B -> C */ public function testProcessRemovesAndInlinesRecursively() { $container = new ContainerBuilder(); $container->setResourceTracking(false); $a = $container ->register('a', '\stdClass') ->addArgument(new Reference('c')) ; $b = $container ->register('b', '\stdClass') ->addArgument(new Reference('c')) ->setPublic(false) ; $c = $container ->register('c', '\stdClass') ->setPublic(false) ; $container->compile(); $this->assertTrue($container->hasDefinition('a')); $arguments = $a->getArguments(); $this->assertSame($c, $arguments[0]); $this->assertFalse($container->hasDefinition('b')); $this->assertFalse($container->hasDefinition('c')); } public function testProcessInlinesReferencesToAliases() { $container = new ContainerBuilder(); $container->setResourceTracking(false); $a = $container ->register('a', '\stdClass') ->addArgument(new Reference('b')) ; $container->setAlias('b', new Alias('c', false)); $c = $container ->register('c', '\stdClass') ->setPublic(false) ; $container->compile(); $this->assertTrue($container->hasDefinition('a')); $arguments = $a->getArguments(); $this->assertSame($c, $arguments[0]); $this->assertFalse($container->hasAlias('b')); $this->assertFalse($container->hasDefinition('c')); } public function testProcessInlinesWhenThereAreMultipleReferencesButFromTheSameDefinition() { $container = new ContainerBuilder(); $container->setResourceTracking(false); $container ->register('a', '\stdClass') ->addArgument(new Reference('b')) ->addMethodCall('setC', array(new Reference('c'))) ; $container ->register('b', '\stdClass') ->addArgument(new Reference('c')) ->setPublic(false) ; $container ->register('c', '\stdClass') ->setPublic(false) ; $container->compile(); $this->assertTrue($container->hasDefinition('a')); $this->assertFalse($container->hasDefinition('b')); $this->assertFalse($container->hasDefinition('c'), 'Service C was not inlined.'); } /** * @dataProvider getYamlCompileTests */ public function testYamlContainerCompiles($directory, $actualServiceId, $expectedServiceId, ContainerBuilder $mainContainer = null) { // allow a container to be passed in, which might have autoconfigure settings $container = $mainContainer ? $mainContainer : new ContainerBuilder(); $container->setResourceTracking(false); $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Fixtures/yaml/integration/'.$directory)); $loader->load('main.yml'); $container->compile(); $actualService = $container->getDefinition($actualServiceId); // create a fresh ContainerBuilder, to avoid autoconfigure stuff $container = new ContainerBuilder(); $container->setResourceTracking(false); $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Fixtures/yaml/integration/'.$directory)); $loader->load('expected.yml'); $container->compile(); $expectedService = $container->getDefinition($expectedServiceId); // reset changes, we don't care if these differ $actualService->setChanges(array()); $expectedService->setChanges(array()); $this->assertEquals($expectedService, $actualService); } public function getYamlCompileTests() { $container = new ContainerBuilder(); $container->registerForAutoconfiguration(IntegrationTestStub::class); yield array( 'autoconfigure_child_not_applied', 'child_service', 'child_service_expected', $container, ); $container = new ContainerBuilder(); $container->registerForAutoconfiguration(IntegrationTestStub::class); yield array( 'autoconfigure_parent_child', 'child_service', 'child_service_expected', $container, ); $container = new ContainerBuilder(); $container->registerForAutoconfiguration(IntegrationTestStub::class) ->addTag('from_autoconfigure'); yield array( 'autoconfigure_parent_child_tags', 'child_service', 'child_service_expected', $container, ); yield array( 'child_parent', 'child_service', 'child_service_expected', ); yield array( 'defaults_child_tags', 'child_service', 'child_service_expected', ); yield array( 'defaults_instanceof_importance', 'main_service', 'main_service_expected', ); yield array( 'defaults_parent_child', 'child_service', 'child_service_expected', ); yield array( 'instanceof_parent_child', 'child_service', 'child_service_expected', ); } } class IntegrationTestStub extends IntegrationTestStubParent { } class IntegrationTestStubParent { public function enableSummer($enable) { // methods used in calls - added here to prevent errors for not existing } public function setSunshine($type) { } } __halt_compiler();----SIGNATURE:----dmSw8o5Sk2iizM6mkVImLpPN593x04wR97uHS72Vf7wGpGsOoquj92fgsp+ytpcqSgfdH6iP69AzEqzuosQRlQDLdVXEdIPvw3vAWdzVlVjXs1Pan4eQDFPU89Nkf1Z+a5JlNywXrTL7Gz1S3F9OPHLSJbbfzxgilWo5WocK6MqGmFM1AvZlX48wDM0eMzsjYeI8MNhS/J2wnJLbsnri3gtjM0s4q4Kt5NQ8sZvvXdnpf+m5FvsZub/7pVD/WHr7L0qUl43L2JNH/F0W5sPQVKqxPNpFYksuaMu1hnZyp6/kGo34zR/o2zkPUU8bmrFIjFrzatWzNP2/TvrAeHSqlbw8c59lVvYCMEkm0LTwQAqxevf23GeOjj/2VpY4YOOgu865vQClqoJHWQbVkBuZjFUzLEYTJNMI2MKsnQKW1XDvtKWKxJ+nFkKvobrrnDeZ43Tdqm1rIKWfv8us+L304XX8U/rWGNTd8reO/8zCZMEK7+GeedIjbt1yRlCs4YIrTphnvRCNd56mmhH9zkV1mUT6+gghmlWgRU3XSDfmgIjyH5kOcLYbw8yZoE+xABtvzNTv4Y7sCHGE2/2PMH7BS9yOd1OiVw8+DCSQkTQtu2wDA6zxXXRixW3X1oJvCIqz1xqLQOryvv88er7QukkqiB1qQJCNBihOoX2ZlF4XOfY=----ATTACHMENT:----NjU4ODA0MzIwMzQwMDExMyA1MzE1Njk2NTk5MzQzOTA2IDUyMjc1ODAwMjM2NDc2NTA=