| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * 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)
- {
- }
- }
|