/** * Resolves a given fixture. The resolution of a fixture may result in the resolution of several fixtures. * * @param TemplatingFixture|FixtureInterface $fixture Fixture to resolve * @param FixtureBag $unresolvedFixtures * @param TemplatingFixtureBag $resolvedFixtures * @param ResolvingContext $context * * @throws FixtureNotFoundException * * @return TemplatingFixtureBag */ public function resolve(TemplatingFixture $fixture, FixtureBag $unresolvedFixtures, TemplatingFixtureBag $resolvedFixtures, ResolvingContext $context) : TemplatingFixtureBag { $context->checkForCircularReference($fixture->getId()); if (false === $fixture->extendsFixtures()) { return $resolvedFixtures->with($fixture); } /** * @var FixtureBag $extendedFixtures * @var TemplatingFixtureBag $resolvedFixtures */ list($extendedFixtures, $resolvedFixtures) = $this->resolveExtendedFixtures($fixture, $fixture->getExtendedFixturesReferences(), $unresolvedFixtures, $resolvedFixtures, $context); $fixture = $this->getExtendedFixture($fixture, $extendedFixtures); return $resolvedFixtures->with($fixture); }
public function testThrowsAnExceptionWhenACircularReferenceIsDetected() { $context = new ResolvingContext('bar'); $context->checkForCircularReference('foo'); $context->add('foo'); $context->checkForCircularReference('foo'); $context->add('foo'); try { $context->checkForCircularReference('foo'); $this->fail('Expected exception to be thrown.'); } catch (CircularReferenceException $exception) { $this->assertEquals('Circular reference detected for the parameter "foo" while resolving ["bar", "foo"].', $exception->getMessage()); } $context = new ResolvingContext('foo'); $context->checkForCircularReference('foo'); $context->add('foo'); try { $context->checkForCircularReference('foo'); $this->fail('Expected exception to be thrown.'); } catch (CircularReferenceException $exception) { $this->assertEquals('Circular reference detected for the parameter "foo" while resolving ["foo"].', $exception->getMessage()); } }
/** * @param string $id * * @throws CircularReferenceException */ public function markIsResolvingFixture(string $id) { $this->resolving->add($id); $this->resolving->checkForCircularReference($id); }
/** * @param ParameterResolverInterface $resolver * @param Parameter $parameter Parameter being resolved * @param string $key Key of the parameter that need to be resolved to resolve $parameter * @param ParameterBag $unresolvedParameters * @param ParameterBag $resolvedParameters * @param ResolvingContext $context * * @return ParameterBag */ private function resolveStringKey(ParameterResolverInterface $resolver = null, Parameter $parameter, string $key, ParameterBag $unresolvedParameters, ParameterBag $resolvedParameters, ResolvingContext $context) : ParameterBag { if ($resolvedParameters->has($key)) { return $resolvedParameters; } if (false === $unresolvedParameters->has($key)) { throw ParameterNotFoundExceptionFactory::createForWhenResolvingParameter($key, $parameter); } $context->checkForCircularReference($key); $context->add($key); if (null === $resolver) { throw ResolverNotFoundExceptionFactory::createUnexpectedCall(__METHOD__); } return $resolver->resolve(new Parameter($key, $unresolvedParameters->get($key)), $unresolvedParameters, $resolvedParameters, $context); }