Skip to content

Commit

Permalink
Added more tests to the FactoryDefinitionResolver + better error hand…
Browse files Browse the repository at this point in the history
…ling
  • Loading branch information
mnapoli committed Nov 27, 2014
1 parent cbf775b commit 6d732b5
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 4 deletions.
3 changes: 3 additions & 0 deletions src/DI/Definition/Resolver/DefinitionResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
namespace DI\Definition\Resolver;

use DI\Definition\Definition;
use DI\Definition\Exception\DefinitionException;

/**
* Resolves a definition to a value.
Expand All @@ -25,6 +26,8 @@ interface DefinitionResolver
* @param Definition $definition Object that defines how the value should be obtained.
* @param array $parameters Optional parameters to use to build the entry.
*
* @throws DefinitionException If the definition cannot be resolved.
*
* @return mixed Value obtained from the definition.
*/
public function resolve(Definition $definition, array $parameters = array());
Expand Down
8 changes: 8 additions & 0 deletions src/DI/Definition/Resolver/FactoryDefinitionResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

namespace DI\Definition\Resolver;

use DI\Definition\Exception\DefinitionException;
use DI\Definition\FactoryDefinition;
use DI\Definition\Definition;
use Interop\Container\ContainerInterface;
Expand Down Expand Up @@ -52,6 +53,13 @@ public function resolve(Definition $definition, array $parameters = array())

$callable = $definition->getCallable();

if (! is_callable($callable)) {
throw new DefinitionException(sprintf(
'The factory definition "%s" is not callable',
$definition->getName()
));
}

return $callable($this->container);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,21 +27,47 @@ public function testGetContainer()
$this->assertSame($container, $resolver->getContainer());
}

public function testResolve()
public function provideCallables()
{
return array(
'closure' => array(function () { return 'bar'; }),
'string' => array(__NAMESPACE__ . '\FactoryDefinitionResolver_test'),
'array' => array(array(new FactoryDefinitionResolverTestClass(), 'foo')),
'invokableClass' => array(new FactoryDefinitionResolverCallableClass()),
);
}

/**
* @dataProvider provideCallables
*/
public function testResolve($callable)
{
/** @var \DI\Container $container */
$container = $this->getMock('DI\Container', array(), array(), '', false);

$definition = new FactoryDefinition('foo', function () {
return 'bar';
});
$definition = new FactoryDefinition('foo', $callable);
$resolver = new FactoryDefinitionResolver($container);

$value = $resolver->resolve($definition);

$this->assertEquals('bar', $value);
}

/**
* @expectedException \DI\Definition\Exception\DefinitionException
* @expectedExceptionMessage The factory definition "foo" is not callable
*/
public function testNotCallable()
{
/** @var \DI\Container $container */
$container = $this->getMock('DI\Container', array(), array(), '', false);

$definition = new FactoryDefinition('foo', 'Hello world');
$resolver = new FactoryDefinitionResolver($container);

$resolver->resolve($definition);
}

/**
* @expectedException \InvalidArgumentException
* @expectedExceptionMessage This definition resolver is only compatible with FactoryDefinition objects, DI\Definition\ValueDefinition given
Expand All @@ -57,3 +83,24 @@ public function testInvalidDefinitionType()
$resolver->resolve($definition);
}
}

class FactoryDefinitionResolverTestClass
{
public function foo()
{
return 'bar';
}
}

class FactoryDefinitionResolverCallableClass
{
public function __invoke()
{
return 'bar';
}
}

function FactoryDefinitionResolver_test()
{
return 'bar';
}

0 comments on commit 6d732b5

Please sign in to comment.