123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294 |
- <?php
- namespace Illuminate\Tests\Container;
- use Closure;
- use Error;
- use Illuminate\Container\Container;
- use Illuminate\Contracts\Container\BindingResolutionException;
- use PHPUnit\Framework\TestCase;
- use stdClass;
- class ContainerCallTest extends TestCase
- {
- public function testCallWithAtSignBasedClassReferencesWithoutMethodThrowsException()
- {
- $this->expectException(Error::class);
- $this->expectExceptionMessage('Call to undefined function ContainerTestCallStub()');
- $container = new Container;
- $container->call('ContainerTestCallStub');
- }
- public function testCallWithAtSignBasedClassReferences()
- {
- $container = new Container;
- $result = $container->call(ContainerTestCallStub::class.'@work', ['foo', 'bar']);
- $this->assertEquals(['foo', 'bar'], $result);
- $container = new Container;
- $result = $container->call(ContainerTestCallStub::class.'@inject');
- $this->assertInstanceOf(ContainerCallConcreteStub::class, $result[0]);
- $this->assertSame('taylor', $result[1]);
- $container = new Container;
- $result = $container->call(ContainerTestCallStub::class.'@inject', ['default' => 'foo']);
- $this->assertInstanceOf(ContainerCallConcreteStub::class, $result[0]);
- $this->assertSame('foo', $result[1]);
- $container = new Container;
- $result = $container->call(ContainerTestCallStub::class, ['foo', 'bar'], 'work');
- $this->assertEquals(['foo', 'bar'], $result);
- }
- public function testCallWithCallableArray()
- {
- $container = new Container;
- $stub = new ContainerTestCallStub;
- $result = $container->call([$stub, 'work'], ['foo', 'bar']);
- $this->assertEquals(['foo', 'bar'], $result);
- }
- public function testCallWithStaticMethodNameString()
- {
- $container = new Container;
- $result = $container->call('Illuminate\Tests\Container\ContainerStaticMethodStub::inject');
- $this->assertInstanceOf(ContainerCallConcreteStub::class, $result[0]);
- $this->assertSame('taylor', $result[1]);
- }
- public function testCallWithGlobalMethodName()
- {
- $container = new Container;
- $result = $container->call('Illuminate\Tests\Container\containerTestInject');
- $this->assertInstanceOf(ContainerCallConcreteStub::class, $result[0]);
- $this->assertSame('taylor', $result[1]);
- }
- public function testCallWithBoundMethod()
- {
- $container = new Container;
- $container->bindMethod(ContainerTestCallStub::class.'@unresolvable', function ($stub) {
- return $stub->unresolvable('foo', 'bar');
- });
- $result = $container->call(ContainerTestCallStub::class.'@unresolvable');
- $this->assertEquals(['foo', 'bar'], $result);
- $container = new Container;
- $container->bindMethod(ContainerTestCallStub::class.'@unresolvable', function ($stub) {
- return $stub->unresolvable('foo', 'bar');
- });
- $result = $container->call([new ContainerTestCallStub, 'unresolvable']);
- $this->assertEquals(['foo', 'bar'], $result);
- $container = new Container;
- $result = $container->call([new ContainerTestCallStub, 'inject'], ['_stub' => 'foo', 'default' => 'bar']);
- $this->assertInstanceOf(ContainerCallConcreteStub::class, $result[0]);
- $this->assertSame('bar', $result[1]);
- $container = new Container;
- $result = $container->call([new ContainerTestCallStub, 'inject'], ['_stub' => 'foo']);
- $this->assertInstanceOf(ContainerCallConcreteStub::class, $result[0]);
- $this->assertSame('taylor', $result[1]);
- }
- public function testBindMethodAcceptsAnArray()
- {
- $container = new Container;
- $container->bindMethod([ContainerTestCallStub::class, 'unresolvable'], function ($stub) {
- return $stub->unresolvable('foo', 'bar');
- });
- $result = $container->call(ContainerTestCallStub::class.'@unresolvable');
- $this->assertEquals(['foo', 'bar'], $result);
- $container = new Container;
- $container->bindMethod([ContainerTestCallStub::class, 'unresolvable'], function ($stub) {
- return $stub->unresolvable('foo', 'bar');
- });
- $result = $container->call([new ContainerTestCallStub, 'unresolvable']);
- $this->assertEquals(['foo', 'bar'], $result);
- }
- public function testClosureCallWithInjectedDependency()
- {
- $container = new Container;
- $container->call(function (ContainerCallConcreteStub $stub) {
- //
- }, ['foo' => 'bar']);
- $container->call(function (ContainerCallConcreteStub $stub) {
- //
- }, ['foo' => 'bar', 'stub' => new ContainerCallConcreteStub]);
- }
- public function testCallWithDependencies()
- {
- $container = new Container;
- $result = $container->call(function (stdClass $foo, $bar = []) {
- return func_get_args();
- });
- $this->assertInstanceOf(stdClass::class, $result[0]);
- $this->assertEquals([], $result[1]);
- $result = $container->call(function (stdClass $foo, $bar = []) {
- return func_get_args();
- }, ['bar' => 'taylor']);
- $this->assertInstanceOf(stdClass::class, $result[0]);
- $this->assertSame('taylor', $result[1]);
- $stub = new ContainerCallConcreteStub;
- $result = $container->call(function (stdClass $foo, ContainerCallConcreteStub $bar) {
- return func_get_args();
- }, [ContainerCallConcreteStub::class => $stub]);
- $this->assertInstanceOf(stdClass::class, $result[0]);
- $this->assertSame($stub, $result[1]);
- /*
- * Wrap a function...
- */
- $result = $container->wrap(function (stdClass $foo, $bar = []) {
- return func_get_args();
- }, ['bar' => 'taylor']);
- $this->assertInstanceOf(Closure::class, $result);
- $result = $result();
- $this->assertInstanceOf(stdClass::class, $result[0]);
- $this->assertSame('taylor', $result[1]);
- }
- public function testCallWithVariadicDependency()
- {
- $stub1 = new ContainerCallConcreteStub;
- $stub2 = new ContainerCallConcreteStub;
- $container = new Container;
- $container->bind(ContainerCallConcreteStub::class, function () use ($stub1, $stub2) {
- return [
- $stub1,
- $stub2,
- ];
- });
- $result = $container->call(function (stdClass $foo, ContainerCallConcreteStub ...$bar) {
- return func_get_args();
- });
- $this->assertInstanceOf(stdClass::class, $result[0]);
- $this->assertInstanceOf(ContainerCallConcreteStub::class, $result[1]);
- $this->assertSame($stub1, $result[1]);
- $this->assertSame($stub2, $result[2]);
- }
- public function testCallWithCallableObject()
- {
- $container = new Container;
- $callable = new ContainerCallCallableStub;
- $result = $container->call($callable);
- $this->assertInstanceOf(ContainerCallConcreteStub::class, $result[0]);
- $this->assertSame('jeffrey', $result[1]);
- }
- public function testCallWithCallableClassString()
- {
- $container = new Container;
- $result = $container->call(ContainerCallCallableClassStringStub::class);
- $this->assertInstanceOf(ContainerCallConcreteStub::class, $result[0]);
- $this->assertSame('jeffrey', $result[1]);
- $this->assertInstanceOf(ContainerTestCallStub::class, $result[2]);
- }
- public function testCallWithoutRequiredParamsThrowsException()
- {
- $this->expectException(BindingResolutionException::class);
- $this->expectExceptionMessage('Unable to resolve dependency [Parameter #0 [ <required> $foo ]] in class Illuminate\Tests\Container\ContainerTestCallStub');
- $container = new Container;
- $container->call(ContainerTestCallStub::class.'@unresolvable');
- }
- public function testCallWithUnnamedParametersThrowsException()
- {
- $this->expectException(BindingResolutionException::class);
- $this->expectExceptionMessage('Unable to resolve dependency [Parameter #0 [ <required> $foo ]] in class Illuminate\Tests\Container\ContainerTestCallStub');
- $container = new Container;
- $container->call([new ContainerTestCallStub, 'unresolvable'], ['foo', 'bar']);
- }
- public function testCallWithoutRequiredParamsOnClosureThrowsException()
- {
- $this->expectException(BindingResolutionException::class);
- $this->expectExceptionMessage('Unable to resolve dependency [Parameter #0 [ <required> $foo ]] in class Illuminate\Tests\Container\ContainerCallTest');
- $container = new Container;
- $container->call(function ($foo, $bar = 'default') {
- return $foo;
- });
- }
- }
- class ContainerTestCallStub
- {
- public function work()
- {
- return func_get_args();
- }
- public function inject(ContainerCallConcreteStub $stub, $default = 'taylor')
- {
- return func_get_args();
- }
- public function unresolvable($foo, $bar)
- {
- return func_get_args();
- }
- }
- class ContainerCallConcreteStub
- {
- //
- }
- function containerTestInject(ContainerCallConcreteStub $stub, $default = 'taylor')
- {
- return func_get_args();
- }
- class ContainerStaticMethodStub
- {
- public static function inject(ContainerCallConcreteStub $stub, $default = 'taylor')
- {
- return func_get_args();
- }
- }
- class ContainerCallCallableStub
- {
- public function __invoke(ContainerCallConcreteStub $stub, $default = 'jeffrey')
- {
- return func_get_args();
- }
- }
- class ContainerCallCallableClassStringStub
- {
- public $stub;
- public $default;
- public function __construct(ContainerCallConcreteStub $stub, $default = 'jeffrey')
- {
- $this->stub = $stub;
- $this->default = $default;
- }
- public function __invoke(ContainerTestCallStub $dependency)
- {
- return [$this->stub, $this->default, $dependency];
- }
- }
|