public function testIfATokenIsParsedIntoANestedValueThenItsValuesAreMerged()
{
$value = 'foo';
$lexerProphecy = $this->prophesize(LexerInterface::class);
$lexerProphecy->lex($value)->willReturn([$token1 = new Token('foo', new TokenType(TokenType::STRING_TYPE)), $token2 = new Token('bar', new TokenType(TokenType::VARIABLE_TYPE)), $token3 = new Token('baz', new TokenType(TokenType::FUNCTION_TYPE))]);
/** @var LexerInterface $lexer */
$lexer = $lexerProphecy->reveal();
$tokenParserProphecy = $this->prophesize(TokenParserInterface::class);
$tokenParserProphecy->parse($token1)->willReturn('parsed_foo');
$tokenParserProphecy->parse($token2)->willReturn(new NestedValue(['first', 'second']));
$tokenParserProphecy->parse($token3)->willReturn('parsed_baz');
/** @var TokenParserInterface $tokenParser */
$tokenParser = $tokenParserProphecy->reveal();
$expected = new ListValue(['parsed_foo', 'first', 'second', 'parsed_baz']);
$parser = new SimpleParser($lexer, $tokenParser);
$actual = $parser->parse($value);
$this->assertEquals($expected, $actual);
$lexerProphecy->lex(Argument::any())->shouldHaveBeenCalledTimes(1);
$tokenParserProphecy->parse(Argument::any())->shouldHaveBeenCalledTimes(3);
}