+
+ public function testDefaults()
+ {
+ $container = new ContainerBuilder();
+ $loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml'));
+ $loader->load('services28.xml');
+
+ $this->assertFalse($container->getDefinition('with_defaults')->isPublic());
+ $this->assertSame(array('foo' => array(array())), $container->getDefinition('with_defaults')->getTags());
+ $this->assertTrue($container->getDefinition('with_defaults')->isAutowired());
+ $this->assertArrayNotHasKey('public', $container->getDefinition('with_defaults')->getChanges());
+ $this->assertArrayNotHasKey('autowire', $container->getDefinition('with_defaults')->getChanges());
+
+ $container->compile();
+
+ $this->assertTrue($container->getDefinition('no_defaults')->isPublic());
+
+ $this->assertSame(array('foo' => array(array())), $container->getDefinition('no_defaults')->getTags());
+
+ $this->assertFalse($container->getDefinition('no_defaults')->isAutowired());
+
+ $this->assertTrue($container->getDefinition('child_def')->isPublic());
+ $this->assertSame(array('foo' => array(array())), $container->getDefinition('child_def')->getTags());
+ $this->assertFalse($container->getDefinition('child_def')->isAutowired());
+
+ $definitions = $container->getDefinitions();
+ $this->assertSame('service_container', key($definitions));
+
+ array_shift($definitions);
+ $anonymous = current($definitions);
+ $this->assertSame('bar', key($definitions));
+ $this->assertTrue($anonymous->isPublic());
+ $this->assertTrue($anonymous->isAutowired());
+ $this->assertSame(array('foo' => array(array())), $anonymous->getTags());
+ }
+
+ public function testNamedArguments()
+ {
+ $container = new ContainerBuilder();
+ $loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml'));
+ $loader->load('services_named_args.xml');
+
+ $this->assertEquals(array('$apiKey' => 'ABCD', CaseSensitiveClass::class => null), $container->getDefinition(NamedArgumentsDummy::class)->getArguments());
+
+ $container->compile();
+
+ $this->assertEquals(array(null, 'ABCD'), $container->getDefinition(NamedArgumentsDummy::class)->getArguments());
+ $this->assertEquals(array(array('setApiKey', array('123'))), $container->getDefinition(NamedArgumentsDummy::class)->getMethodCalls());
+ }
+
+ public function testInstanceof()
+ {
+ $container = new ContainerBuilder();
+ $loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml'));
+ $loader->load('services_instanceof.xml');
+ $container->compile();
+
+ $definition = $container->getDefinition(Bar::class);
+ $this->assertTrue($definition->isAutowired());
+ $this->assertTrue($definition->isLazy());
+ $this->assertSame(array('foo' => array(array()), 'bar' => array(array())), $definition->getTags());
+ }
+
+ /**
+ * @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
+ * @expectedExceptionMessage The service "child_service" cannot use the "parent" option in the same file where "instanceof" configuration is defined as using both is not supported. Move your child definitions to a separate file.
+ */
+ public function testInstanceOfAndChildDefinitionNotAllowed()
+ {
+ $container = new ContainerBuilder();
+ $loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml'));
+ $loader->load('services_instanceof_with_parent.xml');
+ $container->compile();
+ }
+
+ /**
+ * @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
+ * @expectedExceptionMessage The service "child_service" cannot have a "parent" and also have "autoconfigure". Try setting autoconfigure="false" for the service.
+ */
+ public function testAutoConfigureAndChildDefinitionNotAllowed()
+ {
+ $container = new ContainerBuilder();
+ $loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml'));
+ $loader->load('services_autoconfigure_with_parent.xml');
+ $container->compile();
+ }
+
+ /**
+ * @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
+ * @expectedExceptionMessage Attribute "autowire" on service "child_service" cannot be inherited from "defaults" when a "parent" is set. Move your child definitions to a separate file or define this attribute explicitly.
+ */
+ public function testDefaultsAndChildDefinitionNotAllowed()
+ {
+ $container = new ContainerBuilder();
+ $loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml'));
+ $loader->load('services_defaults_with_parent.xml');
+ $container->compile();
+ }
+
+ public function testAutoConfigureInstanceof()
+ {
+ $container = new ContainerBuilder();
+ $loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml'));
+ $loader->load('services_autoconfigure.xml');
+
+ $this->assertTrue($container->getDefinition('use_defaults_settings')->isAutoconfigured());
+ $this->assertFalse($container->getDefinition('override_defaults_settings_to_false')->isAutoconfigured());
+ }
+
+ public function testBindings()
+ {
+ $container = new ContainerBuilder();
+ $loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml'));
+ $loader->load('services_bindings.xml');
+ $container->compile();
+
+ $definition = $container->getDefinition('bar');
+ $this->assertEquals(array(
+ 'NonExistent' => null,
+ BarInterface::class => new Reference(Bar::class),
+ '$foo' => array(null),
+ '$quz' => 'quz',
+ '$factory' => 'factory',
+ ), array_map(function ($v) { return $v->getValues()[0]; }, $definition->getBindings()));
+ $this->assertEquals(array(
+ 'quz',
+ null,
+ new Reference(Bar::class),
+ array(null),
+ ), $definition->getArguments());
+
+ $definition = $container->getDefinition(Bar::class);
+ $this->assertEquals(array(
+ null,
+ 'factory',
+ ), $definition->getArguments());
+ $this->assertEquals(array(
+ 'NonExistent' => null,
+ '$quz' => 'quz',
+ '$factory' => 'factory',
+ ), array_map(function ($v) { return $v->getValues()[0]; }, $definition->getBindings()));
+ }