4 * This file is part of the Symfony package.
6 * (c) Fabien Potencier <fabien@symfony.com>
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
12 namespace Symfony\Component\DependencyInjection\Tests\Compiler;
14 use PHPUnit\Framework\TestCase;
15 use Symfony\Component\DependencyInjection\Argument\BoundArgument;
16 use Symfony\Component\DependencyInjection\Compiler\AutowireRequiredMethodsPass;
17 use Symfony\Component\DependencyInjection\Compiler\ResolveBindingsPass;
18 use Symfony\Component\DependencyInjection\ContainerBuilder;
19 use Symfony\Component\DependencyInjection\Reference;
20 use Symfony\Component\DependencyInjection\Tests\Fixtures\CaseSensitiveClass;
21 use Symfony\Component\DependencyInjection\Tests\Fixtures\NamedArgumentsDummy;
22 use Symfony\Component\DependencyInjection\Tests\Fixtures\ParentNotExists;
23 use Symfony\Component\DependencyInjection\TypedReference;
25 require_once __DIR__.'/../Fixtures/includes/autowiring_classes.php';
27 class ResolveBindingsPassTest extends TestCase
29 public function testProcess()
31 $container = new ContainerBuilder();
33 $bindings = array(CaseSensitiveClass::class => new BoundArgument(new Reference('foo')));
35 $definition = $container->register(NamedArgumentsDummy::class, NamedArgumentsDummy::class);
36 $definition->setArguments(array(1 => '123'));
37 $definition->addMethodCall('setSensitiveClass');
38 $definition->setBindings($bindings);
40 $container->register('foo', CaseSensitiveClass::class)
41 ->setBindings($bindings);
43 $pass = new ResolveBindingsPass();
44 $pass->process($container);
46 $this->assertEquals(array(new Reference('foo'), '123'), $definition->getArguments());
47 $this->assertEquals(array(array('setSensitiveClass', array(new Reference('foo')))), $definition->getMethodCalls());
51 * @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
52 * @expectedExceptionMessage Unused binding "$quz" in service "Symfony\Component\DependencyInjection\Tests\Fixtures\NamedArgumentsDummy".
54 public function testUnusedBinding()
56 $container = new ContainerBuilder();
58 $definition = $container->register(NamedArgumentsDummy::class, NamedArgumentsDummy::class);
59 $definition->setBindings(array('$quz' => '123'));
61 $pass = new ResolveBindingsPass();
62 $pass->process($container);
66 * @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
67 * @expectedExceptionMessageRegexp Unused binding "$quz" in service [\s\S]+ Invalid service ".*\\ParentNotExists": class NotExists not found\.
69 public function testMissingParent()
71 $container = new ContainerBuilder();
73 $definition = $container->register(ParentNotExists::class, ParentNotExists::class);
74 $definition->setBindings(array('$quz' => '123'));
76 $pass = new ResolveBindingsPass();
77 $pass->process($container);
80 public function testTypedReferenceSupport()
82 $container = new ContainerBuilder();
84 $bindings = array(CaseSensitiveClass::class => new BoundArgument(new Reference('foo')));
86 // Explicit service id
87 $definition1 = $container->register('def1', NamedArgumentsDummy::class);
88 $definition1->addArgument($typedRef = new TypedReference('bar', CaseSensitiveClass::class));
89 $definition1->setBindings($bindings);
91 $definition2 = $container->register('def2', NamedArgumentsDummy::class);
92 $definition2->addArgument(new TypedReference(CaseSensitiveClass::class, CaseSensitiveClass::class));
93 $definition2->setBindings($bindings);
95 $pass = new ResolveBindingsPass();
96 $pass->process($container);
98 $this->assertEquals(array($typedRef), $container->getDefinition('def1')->getArguments());
99 $this->assertEquals(array(new Reference('foo')), $container->getDefinition('def2')->getArguments());
102 public function testScalarSetter()
104 $container = new ContainerBuilder();
106 $definition = $container->autowire('foo', ScalarSetter::class);
107 $definition->setBindings(array('$defaultLocale' => 'fr'));
109 (new AutowireRequiredMethodsPass())->process($container);
110 (new ResolveBindingsPass())->process($container);
112 $this->assertEquals(array(array('setDefaultLocale', array('fr'))), $definition->getMethodCalls());