3 namespace Drupal\Tests\Core\DependencyInjection;
5 use Drupal\Core\DependencyInjection\ContainerBuilder;
6 use Drupal\Tests\UnitTestCase;
7 use Drupal\Tests\Core\DependencyInjection\Fixture\BarClass;
8 use Symfony\Component\DependencyInjection\Definition;
11 * @coversDefaultClass \Drupal\Core\DependencyInjection\ContainerBuilder
12 * @group DependencyInjection
14 class ContainerBuilderTest extends UnitTestCase {
19 public function testGet() {
20 $container = new ContainerBuilder();
21 $container->register('bar', 'Drupal\Tests\Core\DependencyInjection\Fixture\BarClass');
23 $result = $container->get('bar');
24 $this->assertTrue($result instanceof BarClass);
30 public function testSet() {
31 $container = new ContainerBuilder();
32 $class = new BarClass();
33 $container->set('bar', $class);
34 $this->assertEquals('bar', $class->_serviceId);
40 public function testSetException() {
41 $container = new ContainerBuilder();
42 $class = new BarClass();
43 $this->setExpectedException(\InvalidArgumentException::class, 'Service ID names must be lowercase: Bar');
44 $container->set('Bar', $class);
48 * @covers ::setParameter
50 public function testSetParameterException() {
51 $container = new ContainerBuilder();
52 $this->setExpectedException(\InvalidArgumentException::class, 'Parameter names must be lowercase: Buzz');
53 $container->setParameter('Buzz', 'buzz');
59 public function testRegisterException() {
60 $container = new ContainerBuilder();
61 $this->setExpectedException(\InvalidArgumentException::class, 'Service ID names must be lowercase: Bar');
62 $container->register('Bar');
68 public function testRegister() {
69 $container = new ContainerBuilder();
70 $service = $container->register('bar');
71 $this->assertTrue($service->isPublic());
75 * @covers ::setDefinition
77 public function testSetDefinition() {
78 // Test a service with defaults.
79 $container = new ContainerBuilder();
80 $definition = new Definition();
81 $service = $container->setDefinition('foo', $definition);
82 $this->assertTrue($service->isPublic());
83 $this->assertFalse($service->isPrivate());
85 // Test a service with public set to false.
86 $definition = new Definition();
87 $definition->setPublic(FALSE);
88 $service = $container->setDefinition('foo', $definition);
89 $this->assertFalse($service->isPublic());
90 $this->assertFalse($service->isPrivate());
92 // Test a service with private set to true. Drupal does not support this.
93 // We only support using setPublic() to make things not available outside
95 $definition = new Definition();
96 $definition->setPrivate(TRUE);
97 $service = $container->setDefinition('foo', $definition);
98 $this->assertTrue($service->isPublic());
99 $this->assertFalse($service->isPrivate());
105 public function testSetAlias() {
106 $container = new ContainerBuilder();
107 $container->register('bar');
108 $alias = $container->setAlias('foo', 'bar');
109 $this->assertTrue($alias->isPublic());
113 * Tests serialization.
115 public function testSerialize() {
116 $container = new ContainerBuilder();
117 $this->setExpectedException(\AssertionError::class);
118 serialize($container);
122 * Tests constructor and resource tracking disabling.
124 * This test runs in a separate process to ensure the aliased class does not
125 * affect any other tests.
127 * @runInSeparateProcess
128 * @preserveGlobalState disabled
130 public function testConstructor() {
131 class_alias(testInterface::class, 'Symfony\Component\Config\Resource\ResourceInterface');
132 $container = new ContainerBuilder();
133 $this->assertFalse($container->isTrackingResources());
139 * A test interface for testing ContainerBuilder::__construct().
141 * @see \Drupal\Tests\Core\DependencyInjection\ContainerBuilderTest::testConstructor()
143 interface testInterface {