Nelmio\Alice\Generator\Resolver\Value\Chainable\DynamicArrayValueResolver::resolve PHP Method

resolve() public method

public resolve ( Nelmio\Alice\Definition\ValueInterface $value, Nelmio\Alice\FixtureInterface $fixture, ResolvedFixtureSet $fixtureSet, array $scope, GenerationContext $context ) : ResolvedValueWithFixtureSet
$value Nelmio\Alice\Definition\ValueInterface
$fixture Nelmio\Alice\FixtureInterface
$fixtureSet Nelmio\Alice\Generator\ResolvedFixtureSet
$scope array
$context Nelmio\Alice\Generator\GenerationContext
return Nelmio\Alice\Generator\ResolvedValueWithFixtureSet
    public function resolve(ValueInterface $value, FixtureInterface $fixture, ResolvedFixtureSet $fixtureSet, array $scope, GenerationContext $context) : ResolvedValueWithFixtureSet
    {
        $this->checkResolver(__METHOD__);
        $quantifier = $value->getQuantifier();
        if ($quantifier instanceof ValueInterface) {
            $result = $this->resolver->resolve($quantifier, $fixture, $fixtureSet, $scope, $context);
            list($quantifier, $fixtureSet) = [$result->getValue(), $result->getSet()];
        }
        if ($quantifier < 0) {
            throw InvalidArgumentExceptionFactory::createForInvalidDynamicArrayQuantifier($fixture, $quantifier);
        }
        $element = $value->getElement();
        if (false === $element instanceof ValueInterface) {
            $array = array_fill(0, $quantifier, $element);
            return new ResolvedValueWithFixtureSet($array, $fixtureSet);
        }
        $array = [];
        for ($i = 0; $i < $quantifier; $i++) {
            $result = $this->resolver->resolve($element, $fixture, $fixtureSet, $scope, $context);
            $array[] = $result->getValue();
            $fixtureSet = $result->getSet();
        }
        return new ResolvedValueWithFixtureSet($array, $fixtureSet);
    }

Usage Example

 public function testResolvesElementAsManyTimeAsNecessaryIfItIsAValue()
 {
     $quantifier = 2;
     $element = new FakeValue();
     $value = new DynamicArrayValue($quantifier, $element);
     $fixture = new DummyFixture('dummy');
     $set = ResolvedFixtureSetFactory::create();
     $scope = ['injected' => true];
     $context = new GenerationContext();
     $context->markIsResolvingFixture('bar');
     $decoratedResolverProphecy = $this->prophesize(ValueResolverInterface::class);
     $setAfterFirstResolution = ResolvedFixtureSetFactory::create(new ParameterBag(['iteration' => 0]));
     $decoratedResolverProphecy->resolve($element, $fixture, $set, $scope, $context)->willReturn(new ResolvedValueWithFixtureSet(10, $setAfterFirstResolution));
     $setAfterSecondResolution = ResolvedFixtureSetFactory::create(new ParameterBag(['iteration' => 1]));
     $decoratedResolverProphecy->resolve($element, $fixture, $setAfterFirstResolution, $scope, $context)->willReturn(new ResolvedValueWithFixtureSet(100, $setAfterSecondResolution));
     /** @var ValueResolverInterface $decoratedResolver */
     $decoratedResolver = $decoratedResolverProphecy->reveal();
     $resolver = new DynamicArrayValueResolver($decoratedResolver);
     $result = $resolver->resolve($value, $fixture, $set, $scope, $context);
     $this->assertSame([10, 100], $result->getValue());
     $this->assertEquals($setAfterSecondResolution, $result->getSet());
 }