Skip to content

Commit b15adcb

Browse files
committed
Added Unit tests for php 8 union types.
1 parent 10d379a commit b15adcb

File tree

3 files changed

+96
-0
lines changed

3 files changed

+96
-0
lines changed

Tests/Compiler/AutowirePassTest.php

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,25 @@ public function testTypeNotGuessableNoServicesFound()
254254
$pass->process($container);
255255
}
256256

257+
/**
258+
* @requires PHP 8
259+
*/
260+
public function testTypeNotGuessableUnionType()
261+
{
262+
$this->expectException('Symfony\Component\DependencyInjection\Exception\AutowiringFailedException');
263+
$this->expectExceptionMessage('Cannot autowire service "a": argument "$collision" of method "Symfony\Component\DependencyInjection\Tests\Compiler\UnionClasses::__construct()" has type "Symfony\Component\DependencyInjection\Tests\Compiler\CollisionA|Symfony\Component\DependencyInjection\Tests\Compiler\CollisionB" but this class was not found.');
264+
$container = new ContainerBuilder();
265+
266+
$container->register(CollisionA::class);
267+
$container->register(CollisionB::class);
268+
269+
$aDefinition = $container->register('a', UnionClasses::class);
270+
$aDefinition->setAutowired(true);
271+
272+
$pass = new AutowirePass();
273+
$pass->process($container);
274+
}
275+
257276
public function testTypeNotGuessableWithTypeSet()
258277
{
259278
$container = new ContainerBuilder();
@@ -350,6 +369,40 @@ public function testOptionalParameter()
350369
$this->assertEquals(Foo::class, $definition->getArgument(2));
351370
}
352371

372+
/**
373+
* @requires PHP 8
374+
*/
375+
public function testParameterWithNullUnionIsSkipped()
376+
{
377+
$container = new ContainerBuilder();
378+
379+
$optDefinition = $container->register('opt', UnionNull::class);
380+
$optDefinition->setAutowired(true);
381+
382+
(new AutowirePass())->process($container);
383+
384+
$definition = $container->getDefinition('opt');
385+
$this->assertNull($definition->getArgument(0));
386+
}
387+
388+
/**
389+
* @requires PHP 8
390+
*/
391+
public function testParameterWithNullUnionIsAutowired()
392+
{
393+
$container = new ContainerBuilder();
394+
395+
$container->register(CollisionInterface::class, CollisionA::class);
396+
397+
$optDefinition = $container->register('opt', UnionNull::class);
398+
$optDefinition->setAutowired(true);
399+
400+
(new AutowirePass())->process($container);
401+
402+
$definition = $container->getDefinition('opt');
403+
$this->assertEquals(CollisionInterface::class, $definition->getArgument(0));
404+
}
405+
353406
public function testDontTriggerAutowiring()
354407
{
355408
$container = new ContainerBuilder();
@@ -459,6 +512,21 @@ public function testScalarArgsCannotBeAutowired()
459512
(new AutowirePass())->process($container);
460513
}
461514

515+
/**
516+
* @requires PHP 8
517+
*/
518+
public function testUnionScalarArgsCannotBeAutowired()
519+
{
520+
$this->expectException('Symfony\Component\DependencyInjection\Exception\AutowiringFailedException');
521+
$this->expectExceptionMessage('Cannot autowire service "union_scalars": argument "$timeout" of method "Symfony\Component\DependencyInjection\Tests\Compiler\UnionScalars::__construct()" is type-hinted "int|float", you should configure its value explicitly.');
522+
$container = new ContainerBuilder();
523+
524+
$container->register('union_scalars', UnionScalars::class)
525+
->setAutowired(true);
526+
527+
(new AutowirePass())->process($container);
528+
}
529+
462530
public function testNoTypeArgsCannotBeAutowired()
463531
{
464532
$this->expectException('Symfony\Component\DependencyInjection\Exception\AutowiringFailedException');

Tests/Fixtures/includes/autowiring_classes.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
namespace Symfony\Component\DependencyInjection\Tests\Compiler;
44

5+
if (PHP_VERSION_ID >= 80000) {
6+
require __DIR__.'/uniontype_classes.php';
7+
}
8+
59
class Foo
610
{
711
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
namespace Symfony\Component\DependencyInjection\Tests\Compiler;
4+
5+
class UnionScalars
6+
{
7+
public function __construct(int|float $timeout)
8+
{
9+
}
10+
}
11+
12+
class UnionClasses
13+
{
14+
public function __construct(CollisionA|CollisionB $collision)
15+
{
16+
}
17+
}
18+
19+
class UnionNull
20+
{
21+
public function __construct(CollisionInterface|null $c)
22+
{
23+
}
24+
}

0 commit comments

Comments
 (0)