public function testThrowsAnExceptionWhenRecursionLimitIsReached()
{
$parameter = new Parameter('foo', null);
$unresolvedParameters = new ParameterBag();
$resolvedParameters = new ParameterBag();
$context = new ResolvingContext('foo');
$decoratedResolverProphecy = $this->prophesize(ChainableParameterResolverInterface::class);
$decoratedResolverProphecy->resolve(Argument::cetera())->will(function ($args) {
$hash = spl_object_hash($args[0]);
return new ParameterBag(['foo' => uniqid($hash)]);
});
/* @var ChainableParameterResolverInterface $decoratedResolver */
$decoratedResolver = $decoratedResolverProphecy->reveal();
$resolver = new RecursiveParameterResolver($decoratedResolver);
try {
$resolver->resolve($parameter, $unresolvedParameters, $resolvedParameters, $context);
$this->fail('Expected exception to be thrown.');
} catch (RecursionLimitReachedException $exception) {
$this->assertEquals('Recursion limit (5 tries) reached while resolving the parameter "foo"', $exception->getMessage());
$decoratedResolverProphecy->resolve(Argument::cetera())->shouldHaveBeenCalledTimes(5);
}
$resolver = new RecursiveParameterResolver($decoratedResolver, 10);
try {
$resolver->resolve($parameter, $unresolvedParameters, $resolvedParameters, $context);
$this->fail('Expected exception to be thrown.');
} catch (RecursionLimitReachedException $exception) {
$this->assertEquals('Recursion limit (10 tries) reached while resolving the parameter "foo"', $exception->getMessage());
$decoratedResolverProphecy->resolve(Argument::cetera())->shouldHaveBeenCalledTimes(15);
}
}