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\NamedArgumentsDummy;
21 use Symfony\Component\DependencyInjection\Tests\Fixtures\CaseSensitiveClass;
22 use Symfony\Component\DependencyInjection\TypedReference;
24 require_once __DIR__.'/../Fixtures/includes/autowiring_classes.php';
26 class ResolveBindingsPassTest extends TestCase
28 public function testProcess()
30 $container = new ContainerBuilder();
32 $bindings = array(CaseSensitiveClass::class => new BoundArgument(new Reference('foo')));
34 $definition = $container->register(NamedArgumentsDummy::class, NamedArgumentsDummy::class);
35 $definition->setArguments(array(1 => '123'));
36 $definition->addMethodCall('setSensitiveClass');
37 $definition->setBindings($bindings);
39 $container->register('foo', CaseSensitiveClass::class)
40 ->setBindings($bindings);
42 $pass = new ResolveBindingsPass();
43 $pass->process($container);
45 $this->assertEquals(array(new Reference('foo'), '123'), $definition->getArguments());
46 $this->assertEquals(array(array('setSensitiveClass', array(new Reference('foo')))), $definition->getMethodCalls());
50 * @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
51 * @expectedExceptionMessage Unused binding "$quz" in service "Symfony\Component\DependencyInjection\Tests\Fixtures\NamedArgumentsDummy".
53 public function testUnusedBinding()
55 $container = new ContainerBuilder();
57 $definition = $container->register(NamedArgumentsDummy::class, NamedArgumentsDummy::class);
58 $definition->setBindings(array('$quz' => '123'));
60 $pass = new ResolveBindingsPass();
61 $pass->process($container);
64 public function testTypedReferenceSupport()
66 $container = new ContainerBuilder();
68 $bindings = array(CaseSensitiveClass::class => new BoundArgument(new Reference('foo')));
70 // Explicit service id
71 $definition1 = $container->register('def1', NamedArgumentsDummy::class);
72 $definition1->addArgument($typedRef = new TypedReference('bar', CaseSensitiveClass::class));
73 $definition1->setBindings($bindings);
75 $definition2 = $container->register('def2', NamedArgumentsDummy::class);
76 $definition2->addArgument(new TypedReference(CaseSensitiveClass::class, CaseSensitiveClass::class));
77 $definition2->setBindings($bindings);
79 $pass = new ResolveBindingsPass();
80 $pass->process($container);
82 $this->assertEquals(array($typedRef), $container->getDefinition('def1')->getArguments());
83 $this->assertEquals(array(new Reference('foo')), $container->getDefinition('def2')->getArguments());
86 public function testScalarSetter()
88 $container = new ContainerBuilder();
90 $definition = $container->autowire('foo', ScalarSetter::class);
91 $definition->setBindings(array('$defaultLocale' => 'fr'));
93 (new AutowireRequiredMethodsPass())->process($container);
94 (new ResolveBindingsPass())->process($container);
96 $this->assertEquals(array(array('setDefaultLocale', array('fr'))), $definition->getMethodCalls());