public function testUsesTheFirstSuitableDenormalizer()
{
$fixtureProphecy = $this->prophesize(FixtureInterface::class);
$fixtureProphecy->getId()->willReturn('dummy');
/** @var FixtureInterface $fixture */
$fixture = $fixtureProphecy->reveal();
$builtFixtures = new FixtureBag();
$className = 'Nelmio\\Alice\\Entity\\User';
$reference = 'user0';
$specs = ['username' => '<name()>'];
$flags = new FlagBag('');
$expected = (new FixtureBag())->with($fixture);
$flagParserProphecy = $this->prophesize(FlagParserInterface::class);
$flagParserProphecy->parse(Argument::any())->shouldNotBeCalled();
/** @var FlagParserInterface $flagParser */
$flagParser = $flagParserProphecy->reveal();
$chainableDenormalizer1Prophecy = $this->prophesize(ChainableFixtureDenormalizerInterface::class);
$chainableDenormalizer1Prophecy->canDenormalize($reference)->willReturn(false);
/** @var ChainableFixtureDenormalizerInterface $chainableDenormalizer1 */
$chainableDenormalizer1 = $chainableDenormalizer1Prophecy->reveal();
$chainableDenormalizer2Prophecy = $this->prophesize(ChainableFixtureDenormalizerInterface::class);
$chainableDenormalizer2Prophecy->canDenormalize($reference)->willReturn(true);
$chainableDenormalizer2Prophecy->denormalize($builtFixtures, $className, $reference, $specs, $flags)->willReturn($expected);
/** @var ChainableFixtureDenormalizerInterface $chainableDenormalizer2 */
$chainableDenormalizer2 = $chainableDenormalizer2Prophecy->reveal();
$chainableDenormalizer3Prophecy = $this->prophesize(ChainableFixtureDenormalizerInterface::class);
$chainableDenormalizer3Prophecy->canDenormalize(Argument::any())->shouldNotBeCalled();
/** @var ChainableFixtureDenormalizerInterface $chainableDenormalizer3 */
$chainableDenormalizer3 = $chainableDenormalizer3Prophecy->reveal();
$denormalizer = new FixtureDenormalizerRegistry($flagParser, [$chainableDenormalizer1, $chainableDenormalizer2, $chainableDenormalizer3]);
$actual = $denormalizer->denormalize($builtFixtures, $className, $reference, $specs, $flags);
$this->assertSame($expected, $actual);
$chainableDenormalizer1Prophecy->canDenormalize(Argument::any())->shouldHaveBeenCalledTimes(1);
$chainableDenormalizer2Prophecy->canDenormalize(Argument::any())->shouldHaveBeenCalledTimes(1);
$chainableDenormalizer2Prophecy->denormalize(Argument::cetera())->shouldHaveBeenCalledTimes(1);
}