1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
|
<?php declare(strict_types=1);
namespace Invoker\Test;
use Invoker\CallableResolver;
use Invoker\Exception\NotCallableException;
use Invoker\Test\Mock\ArrayContainer;
use Invoker\Test\Mock\CallableSpy;
use PHPUnit\Framework\TestCase;
use stdClass;
class CallableResolverTest extends TestCase
{
/** @var CallableResolver */
private $resolver;
/** @var ArrayContainer */
private $container;
public function setUp(): void
{
parent::setUp();
$this->container = new ArrayContainer;
$this->resolver = new CallableResolver($this->container);
}
/**
* @test
*/
#[\PHPUnit\Framework\Attributes\Test]
public function resolves_function()
{
$result = $this->resolver->resolve('strlen');
$this->assertSame(strlen('Hello world!'), $result('Hello world!'));
}
/**
* @test
*/
#[\PHPUnit\Framework\Attributes\Test]
public function resolves_namespaced_function()
{
$result = $this->resolver->resolve(__NAMESPACE__ . '\foo');
$this->assertEquals('bar', $result());
}
/**
* @test
*/
#[\PHPUnit\Framework\Attributes\Test]
public function resolves_callable_from_container()
{
$callable = function () {
};
$this->container->set('thing-to-call', $callable);
$this->assertSame($callable, $this->resolver->resolve('thing-to-call'));
}
/**
* @test
*/
#[\PHPUnit\Framework\Attributes\Test]
public function resolves_invokable_class()
{
$callable = new CallableSpy;
$this->container->set(CallableSpy::class, $callable);
$this->assertSame($callable, $this->resolver->resolve(CallableSpy::class));
}
/**
* @test
*/
#[\PHPUnit\Framework\Attributes\Test]
public function resolve_array_method_call()
{
$fixture = new InvokerTestFixture;
$this->container->set(InvokerTestFixture::class, $fixture);
$result = $this->resolver->resolve([InvokerTestFixture::class, 'foo']);
$result();
$this->assertTrue($fixture->wasCalled);
}
/**
* @test
*/
#[\PHPUnit\Framework\Attributes\Test]
public function resolve_string_method_call()
{
$fixture = new InvokerTestFixture;
$this->container->set(InvokerTestFixture::class, $fixture);
$result = $this->resolver->resolve('Invoker\Test\InvokerTestFixture::foo');
$result();
$this->assertTrue($fixture->wasCalled);
}
/**
* @test
*/
#[\PHPUnit\Framework\Attributes\Test]
public function resolves_array_method_call_with_service()
{
$fixture = new InvokerTestFixture;
$this->container->set('thing-to-call', $fixture);
$result = $this->resolver->resolve(['thing-to-call', 'foo']);
$result();
$this->assertTrue($fixture->wasCalled);
}
/**
* @test
*/
#[\PHPUnit\Framework\Attributes\Test]
public function resolves_string_method_call_with_service()
{
$fixture = new InvokerTestFixture;
$this->container->set('thing-to-call', $fixture);
$result = $this->resolver->resolve('thing-to-call::foo');
$result();
$this->assertTrue($fixture->wasCalled);
}
/**
* @test
*/
#[\PHPUnit\Framework\Attributes\Test]
public function throws_resolving_non_callable_from_container()
{
$this->expectExceptionMessage("'foo' is neither a callable nor a valid container entry");
$this->expectException(NotCallableException::class);
$resolver = new CallableResolver(new ArrayContainer);
$resolver->resolve('foo');
}
/**
* @test
*/
#[\PHPUnit\Framework\Attributes\Test]
public function handles_objects_correctly_in_exception_message()
{
$this->expectExceptionMessage('Instance of stdClass is not a callable');
$this->expectException(NotCallableException::class);
$resolver = new CallableResolver(new ArrayContainer);
$resolver->resolve(new stdClass);
}
/**
* @test
*/
#[\PHPUnit\Framework\Attributes\Test]
public function handles_method_calls_correctly_in_exception_message()
{
$this->expectExceptionMessage('stdClass::test() is not a callable');
$this->expectException(NotCallableException::class);
$resolver = new CallableResolver(new ArrayContainer);
$resolver->resolve([new stdClass, 'test']);
}
}
function foo()
{
return 'bar';
}
|