1<?php
2
3declare(strict_types=1);
4
5namespace JMS\Serializer\Tests\Expression;
6
7use JMS\Serializer\Expression\Expression;
8use JMS\Serializer\Expression\ExpressionEvaluator;
9use PHPUnit\Framework\TestCase;
10use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
11
12class ExpressionEvaluatorTest extends TestCase
13{
14    /**
15     * @var ExpressionEvaluator
16     */
17    private $evaluator;
18
19    public function setUp()
20    {
21        $this->evaluator = new ExpressionEvaluator(new ExpressionLanguage());
22    }
23
24    public function testEvaluate()
25    {
26        self::assertSame(3, $this->evaluator->evaluate('a + b', ['a' => 1, 'b' => 2]));
27    }
28
29    public function testParse()
30    {
31        $parsed = $this->evaluator->parse('a + b', ['a', 'b' ]);
32        self::assertInstanceOf(Expression::class, $parsed);
33
34        $evaluated = $this->evaluator->evaluateParsed($parsed, ['a' => 1, 'b' => 2]);
35        self::assertSame(3, $evaluated);
36    }
37
38    public function testParseWitPeSetVars()
39    {
40        $this->evaluator->setContextVariable('a', 1);
41        $parsed = $this->evaluator->parse('a + b', ['b']);
42
43        $evaluated = $this->evaluator->evaluateParsed($parsed, ['b' => 2]);
44        self::assertSame(3, $evaluated);
45    }
46
47    public function testParseWitPeSetVarsOverride()
48    {
49        $this->evaluator->setContextVariable('a', 1);
50        $parsed = $this->evaluator->parse('a + b', ['b']);
51
52        $evaluated = $this->evaluator->evaluateParsed($parsed, ['b' => 2, 'a' => 4]);
53        self::assertSame(6, $evaluated);
54    }
55
56    public function testCanBeSerialized()
57    {
58        $this->evaluator->setContextVariable('a', 1);
59        $parsed = $this->evaluator->parse('a + b', ['b']);
60
61        $serializedExpression = unserialize(serialize($parsed));
62
63        $evaluated = $this->evaluator->evaluateParsed($serializedExpression, ['b' => 2]);
64        self::assertSame(3, $evaluated);
65    }
66}
67