public function testIteratesOverEveryResolverAndUsesTheFirstValidOne()
{
$parameter = new Parameter('foo', null);
$expected = new ParameterBag(['foo' => 'bar']);
$resolver1Prophecy = $this->prophesize(ChainableParameterResolverInterface::class);
$resolver1Prophecy->canResolve($parameter)->willReturn(false);
/* @var ChainableParameterResolverInterface $resolver1 */
$resolver1 = $resolver1Prophecy->reveal();
$resolver2Prophecy = $this->prophesize(ChainableParameterResolverInterface::class);
$resolver2Prophecy->canResolve($parameter)->willReturn(true);
$resolver2Prophecy->resolve(Argument::cetera())->willReturn($expected);
/* @var ChainableParameterResolverInterface $resolver2 */
$resolver2 = $resolver2Prophecy->reveal();
$resolver3Prophecy = $this->prophesize(ChainableParameterResolverInterface::class);
$resolver3Prophecy->canResolve(Argument::any())->shouldNotBeCalled();
/* @var ChainableParameterResolverInterface $resolver */
$resolver = $resolver3Prophecy->reveal();
$registry = new ParameterResolverRegistry([$resolver1, $resolver2, $resolver]);
$actual = $registry->resolve($parameter, new ParameterBag(), new ParameterBag());
$this->assertSame($expected, $actual);
$resolver1Prophecy->canResolve(Argument::any())->shouldHaveBeenCalledTimes(1);
$resolver2Prophecy->canResolve(Argument::any())->shouldHaveBeenCalledTimes(1);
$resolver2Prophecy->resolve(Argument::cetera())->shouldHaveBeenCalledTimes(1);
}