Initial commit

This commit is contained in:
2025-08-30 23:12:22 +02:00
commit c63206aa71
16 changed files with 923 additions and 0 deletions

12
tests/classes/ClassA.php Normal file
View File

@@ -0,0 +1,12 @@
<?php
#[NoccyLabs\Hotwire\Attributes\AsService]
class ClassA
{
public function __construct(
public readonly ClassB $classB,
public readonly ClassC $classC,
)
{
}
}

11
tests/classes/ClassB.php Normal file
View File

@@ -0,0 +1,11 @@
<?php
#[NoccyLabs\Hotwire\Attributes\AsService]
class ClassB
{
public function __construct(
public readonly ClassC $classC,
)
{
}
}

10
tests/classes/ClassC.php Normal file
View File

@@ -0,0 +1,10 @@
<?php
#[NoccyLabs\Hotwire\Attributes\AsService]
class ClassC
{
public function __construct()
{
}
}

View File

@@ -0,0 +1,92 @@
<?php
namespace NoccyLabs\Hotwire;
use ClassA;
use PHPUnit\Framework\Attributes\CoversClass;
#[CoversClass(DependencyResolver::class)]
class DependencyResolverTest extends \PHPUnit\Framework\TestCase
{
public function testAutowiringArguments(): void
{
$container = new Container();
$container->add(\ClassA::class);
$container->add(\ClassB::class);
$container->add(\ClassC::class);
$resolver = new DependencyResolver();
$args = $resolver->autowireArguments($container, function (\ClassC $a, string $b, string $c = "42") { });
$this->assertInstanceOf(\ClassC::class, $args['a']);
$this->assertNull($args['b']);
$this->assertEquals("42", $args['c']);
}
public function testAutowiringCallback(): void
{
$container = new Container();
$container->add(\ClassA::class);
$container->add(\ClassB::class);
$container->add(\ClassC::class);
$resolver = new DependencyResolver();
$hit = false;
$cb = $resolver->autowire($container, function (\ClassC $a, string $b, string $c = "42") use (&$hit) {
$hit = true;
$this->assertEquals('hello', $b);
$this->assertEquals('42', $c);
return true;
});
$result = $cb(b: 'hello');
$this->assertTrue($hit);
$this->assertTrue($result);
}
public function testAutowiringConstructor(): void
{
$container = new Container();
$container->add(\ClassA::class);
$container->add(\ClassB::class);
$container->add(\ClassC::class);
$container->setParameter("b", "bazinga");
$resolver = new DependencyResolver();
$args = $resolver->autowireConstructorArguments($container, TestClass::class);
$this->assertInstanceOf(\ClassC::class, $args['a']);
$this->assertEquals("bazinga", $args['b']);
$this->assertEquals("42", $args['c']);
}
public function testAutowiringConstructorWithParameters(): void
{
$container = new Container();
$container->add(\ClassA::class);
$container->add(\ClassB::class);
$container->add(\ClassC::class);
$resolver = new DependencyResolver();
$args = $resolver->autowireConstructorArguments($container, TestClass::class);
$this->assertInstanceOf(\ClassC::class, $args['a']);
$this->assertEquals(null, $args['b']);
$this->assertEquals("42", $args['c']);
$this->assertInstanceOf(\ClassA::class, $args['d']);
}
}
class TestClass {
public function __construct(\ClassC $a, string $b, string $c = "42", \ClassA $d) {
}
}