* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\ExpressionLanguage\Tests; use Symfony\Component\ExpressionLanguage\ExpressionFunction; use PHPUnit\Framework\TestCase; use Symfony\Component\ExpressionLanguage\ExpressionLanguage; use Symfony\Component\ExpressionLanguage\ParsedExpression; use Symfony\Component\ExpressionLanguage\Tests\Fixtures\TestProvider; class ExpressionLanguageTest extends TestCase { public function testCachedParse() { $cacheMock = $this->getMockBuilder('Psr\Cache\CacheItemPoolInterface')->getMock(); $cacheItemMock = $this->getMockBuilder('Psr\Cache\CacheItemInterface')->getMock(); $savedParsedExpression = null; $expressionLanguage = new ExpressionLanguage($cacheMock); $cacheMock ->expects($this->exactly(2)) ->method('getItem') ->with('1%20%2B%201%2F%2F') ->willReturn($cacheItemMock) ; $cacheItemMock ->expects($this->exactly(2)) ->method('get') ->will($this->returnCallback(function () use (&$savedParsedExpression) { return $savedParsedExpression; })) ; $cacheItemMock ->expects($this->exactly(1)) ->method('set') ->with($this->isInstanceOf(ParsedExpression::class)) ->will($this->returnCallback(function ($parsedExpression) use (&$savedParsedExpression) { $savedParsedExpression = $parsedExpression; })) ; $cacheMock ->expects($this->exactly(1)) ->method('save') ->with($cacheItemMock) ; $parsedExpression = $expressionLanguage->parse('1 + 1', array()); $this->assertSame($savedParsedExpression, $parsedExpression); $parsedExpression = $expressionLanguage->parse('1 + 1', array()); $this->assertSame($savedParsedExpression, $parsedExpression); } /** * @group legacy */ public function testCachedParseWithDeprecatedParserCacheInterface() { $cacheMock = $this->getMockBuilder('Symfony\Component\ExpressionLanguage\ParserCache\ParserCacheInterface')->getMock(); $cacheItemMock = $this->getMockBuilder('Psr\Cache\CacheItemInterface')->getMock(); $savedParsedExpression = null; $expressionLanguage = new ExpressionLanguage($cacheMock); $cacheMock ->expects($this->exactly(1)) ->method('fetch') ->with('1%20%2B%201%2F%2F') ->willReturn($savedParsedExpression) ; $cacheMock ->expects($this->exactly(1)) ->method('save') ->with('1%20%2B%201%2F%2F', $this->isInstanceOf(ParsedExpression::class)) ->will($this->returnCallback(function ($key, $expression) use (&$savedParsedExpression) { $savedParsedExpression = $expression; })) ; $parsedExpression = $expressionLanguage->parse('1 + 1', array()); $this->assertSame($savedParsedExpression, $parsedExpression); } /** * @expectedException \InvalidArgumentException * @expectedExceptionMessage Cache argument has to implement Psr\Cache\CacheItemPoolInterface. */ public function testWrongCacheImplementation() { $cacheMock = $this->getMockBuilder('Psr\Cache\CacheItemSpoolInterface')->getMock(); $expressionLanguage = new ExpressionLanguage($cacheMock); } public function testConstantFunction() { $expressionLanguage = new ExpressionLanguage(); $this->assertEquals(PHP_VERSION, $expressionLanguage->evaluate('constant("PHP_VERSION")')); $expressionLanguage = new ExpressionLanguage(); $this->assertEquals('\constant("PHP_VERSION")', $expressionLanguage->compile('constant("PHP_VERSION")')); } public function testProviders() { $expressionLanguage = new ExpressionLanguage(null, array(new TestProvider())); $this->assertEquals('foo', $expressionLanguage->evaluate('identity("foo")')); $this->assertEquals('"foo"', $expressionLanguage->compile('identity("foo")')); $this->assertEquals('FOO', $expressionLanguage->evaluate('strtoupper("foo")')); $this->assertEquals('\strtoupper("foo")', $expressionLanguage->compile('strtoupper("foo")')); $this->assertEquals('foo', $expressionLanguage->evaluate('strtolower("FOO")')); $this->assertEquals('\strtolower("FOO")', $expressionLanguage->compile('strtolower("FOO")')); $this->assertTrue($expressionLanguage->evaluate('fn_namespaced()')); $this->assertEquals('\Symfony\Component\ExpressionLanguage\Tests\Fixtures\fn_namespaced()', $expressionLanguage->compile('fn_namespaced()')); } /** * @dataProvider shortCircuitProviderEvaluate */ public function testShortCircuitOperatorsEvaluate($expression, array $values, $expected) { $expressionLanguage = new ExpressionLanguage(); $this->assertEquals($expected, $expressionLanguage->evaluate($expression, $values)); } /** * @dataProvider shortCircuitProviderCompile */ public function testShortCircuitOperatorsCompile($expression, array $names, $expected) { $result = null; $expressionLanguage = new ExpressionLanguage(); eval(sprintf('$result = %s;', $expressionLanguage->compile($expression, $names))); $this->assertSame($expected, $result); } /** * @expectedException \Symfony\Component\ExpressionLanguage\SyntaxError * @expectedExceptionMessage Unexpected end of expression around position 6 for expression `node.`. */ public function testParseThrowsInsteadOfNotice() { $expressionLanguage = new ExpressionLanguage(); $expressionLanguage->parse('node.', array('node')); } public function shortCircuitProviderEvaluate() { $object = $this->getMockBuilder('stdClass')->setMethods(array('foo'))->getMock(); $object->expects($this->never())->method('foo'); return array( array('false and object.foo()', array('object' => $object), false), array('false && object.foo()', array('object' => $object), false), array('true || object.foo()', array('object' => $object), true), array('true or object.foo()', array('object' => $object), true), ); } public function shortCircuitProviderCompile() { return array( array('false and foo', array('foo' => 'foo'), false), array('false && foo', array('foo' => 'foo'), false), array('true || foo', array('foo' => 'foo'), true), array('true or foo', array('foo' => 'foo'), true), ); } public function testCachingForOverriddenVariableNames() { $expressionLanguage = new ExpressionLanguage(); $expression = 'a + b'; $expressionLanguage->evaluate($expression, array('a' => 1, 'b' => 1)); $result = $expressionLanguage->compile($expression, array('a', 'B' => 'b')); $this->assertSame('($a + $B)', $result); } public function testStrictEquality() { $expressionLanguage = new ExpressionLanguage(); $expression = '123 === a'; $result = $expressionLanguage->compile($expression, array('a')); $this->assertSame('(123 === $a)', $result); } public function testCachingWithDifferentNamesOrder() { $cacheMock = $this->getMockBuilder('Psr\Cache\CacheItemPoolInterface')->getMock(); $cacheItemMock = $this->getMockBuilder('Psr\Cache\CacheItemInterface')->getMock(); $expressionLanguage = new ExpressionLanguage($cacheMock); $savedParsedExpressions = array(); $cacheMock ->expects($this->exactly(2)) ->method('getItem') ->with('a%20%2B%20b%2F%2Fa%7CB%3Ab') ->willReturn($cacheItemMock) ; $cacheItemMock ->expects($this->exactly(2)) ->method('get') ->will($this->returnCallback(function () use (&$savedParsedExpression) { return $savedParsedExpression; })) ; $cacheItemMock ->expects($this->exactly(1)) ->method('set') ->with($this->isInstanceOf(ParsedExpression::class)) ->will($this->returnCallback(function ($parsedExpression) use (&$savedParsedExpression) { $savedParsedExpression = $parsedExpression; })) ; $cacheMock ->expects($this->exactly(1)) ->method('save') ->with($cacheItemMock) ; $expression = 'a + b'; $expressionLanguage->compile($expression, array('a', 'B' => 'b')); $expressionLanguage->compile($expression, array('B' => 'b', 'a')); } /** * @dataProvider getRegisterCallbacks * @expectedException \LogicException */ public function testRegisterAfterParse($registerCallback) { $el = new ExpressionLanguage(); $el->parse('1 + 1', array()); $registerCallback($el); } /** * @dataProvider getRegisterCallbacks * @expectedException \LogicException */ public function testRegisterAfterEval($registerCallback) { $el = new ExpressionLanguage(); $el->evaluate('1 + 1'); $registerCallback($el); } /** * @expectedException \RuntimeException * @expectedExceptionMessageRegExp /Unable to call method "\w+" of object "\w+"./ */ public function testCallBadCallable() { $el = new ExpressionLanguage(); $el->evaluate('foo.myfunction()', array('foo' => new \stdClass())); } /** * @dataProvider getRegisterCallbacks * @expectedException \LogicException */ public function testRegisterAfterCompile($registerCallback) { $el = new ExpressionLanguage(); $el->compile('1 + 1'); $registerCallback($el); } public function getRegisterCallbacks() { return array( array( function (ExpressionLanguage $el) { $el->register('fn', function () {}, function () {}); }, ), array( function (ExpressionLanguage $el) { $el->addFunction(new ExpressionFunction('fn', function () {}, function () {})); }, ), array( function (ExpressionLanguage $el) { $el->registerProvider(new TestProvider()); }, ), ); } } __halt_compiler();----SIGNATURE:----rHRVc18D4+SdsFmaXKj1VBVfxdacJLuFyGCgqbPA1RDC3MdA6Awpcvg2MTASG3DOGjRh2wPt5ih02ESsG5w+IIbu5oFPHHTKhxFii2DpihUuejO3QPtKc8CQMdTDoMjSAkRvqhhD4Pk25sudL3lc5z2jOzOqh97HT6jaMkiEv8yy00KPfaG/bQKbBGbVaQd8OppkXbg7HiW2dd48geL1sxjr6R/W4tIimdBxgBHnw0lwPVhyx0lbMF+OEheEulkGYdgnVyjWVnYTVE+nhpkm0tH8I3vR4pqLqA6vgPAbs8oll2oQipILJXbKmwbbl5ZSl93sk4Sk6L+Ou/a0HN/BJTruLhDPRWFlkRnuyT5LkjM6r2Z8GS66GJITlYZYHO+3dLo91qsd0f2N9RimXOeSInqFXEzfoxkcR8OvucBetQlCpsV4PsyxaJzH2OaUSnm1ivowVxpStVJwFI65AObGk6WRwTsqtkh06yVqSK3oTWMmTehLO4WgtcXLcEijGZtC7iOEpCB28Oj9Bf+rThmq/tepiOJ2ziYLCzG4qgU9bSO7F6tRyuGhrKyhemezeh8SE8078Ubd8A/gjwxsIKywjWIFTH/Xd+ezUFeiLhSxd8m1dCfboGP3msCuDqyfBVET0qS1u/k/lz0I42z4Q1yQZpcP3GMQqe0KUoaTi7DXyh0=----ATTACHMENT:----MTk5MDUyNjA5NzM5MzE0NSA1MjMxNzYzMzg0NTA3ODA2IDk5MDIxMTE4NjAzOTEzNTk=