From 5718f57c9153e1c99a5d25bf909b48644e10dbf9 Mon Sep 17 00:00:00 2001 From: Vassyli Date: Sat, 28 Aug 2021 12:44:14 +0200 Subject: [PATCH] Twig accepts abs filter, added 2 more tests. --- src/Services/TwigSceneRenderer.php | 16 ++++++--- tests/Services/TwigSceneRendererTest.php | 43 ++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/src/Services/TwigSceneRenderer.php b/src/Services/TwigSceneRenderer.php index 859c130..823a2af 100644 --- a/src/Services/TwigSceneRenderer.php +++ b/src/Services/TwigSceneRenderer.php @@ -69,11 +69,15 @@ class TwigSceneRenderer // throwing an exception. try { $template = $this->twig->createTemplate($string); - } catch (SecurityError $e) { + } catch (SecurityError | SyntaxError $e) { if ($ignoreErrors) { return $string; } else { - throw new InsecureTwigTemplateError("Template contains illegal calls: {$e->getMessage()}"); + if ($e instanceof SecurityError) { + throw new InsecureTwigTemplateError("Template contains illegal calls: {$e->getMessage()}"); + } else { + throw $e; + } } } @@ -94,7 +98,11 @@ class TwigSceneRenderer if ($ignoreErrors) { return $string; } else { - throw new InsecureTwigTemplateError("Template contains illegal calls: {$e->getMessage()}"); + if ($e instanceof SecurityError) { + throw new InsecureTwigTemplateError("Template contains illegal calls: {$e->getMessage()}"); + } else { + throw $e; + } } } @@ -109,7 +117,7 @@ class TwigSceneRenderer public function getSecurityPolicy(): SecurityPolicy { $tags = ["if"]; - $filters = ["lower", "upper", "escape", "round"]; + $filters = ["lower", "upper", "escape", "round", "abs"]; $functions = ["range"]; $methods = [ Character::class => ["getDisplayName", "getLevel", "isAlive", "getHealth", "getMaxHealth", "getProperty"], diff --git a/tests/Services/TwigSceneRendererTest.php b/tests/Services/TwigSceneRendererTest.php index c0407e0..d1b1edc 100644 --- a/tests/Services/TwigSceneRendererTest.php +++ b/tests/Services/TwigSceneRendererTest.php @@ -26,6 +26,9 @@ class TwigSceneRendererTest extends LotGDTestCase $character->method("getHealth")->willReturn(10); $character->method("getMaxHealth")->willReturn(100); $character->method("isAlive")->willReturn(true); + $character->method("getProperty")->willReturnCallback(function ($name, $default=null) { + return $default; + }); # Get mock game $game = $this->getMockBuilder(Game::class) @@ -104,6 +107,46 @@ class TwigSceneRendererTest extends LotGDTestCase $this->assertSame($result, $renderResult); } + public function testIfTwigSceneRendererParsesStringsWithCharacterProperty() + { + [$game, $viewpoint, $character, $eventManager] = $this->getMockeries(); + $eventManager->method("publish")->willReturnArgument(1); + + # Get renderer + $renderer = new TwigSceneRenderer($game); + + # Prepare the template string. + $template = "Character has {{ Character.getProperty('a/goldiNBank', -10) }} gold in bank."; + + $result = "Character has -10 gold in bank."; + + # Create the result + $renderResult = $renderer->render($template, $viewpoint); + + # Assert result + $this->assertSame($result, $renderResult); + } + + public function testIfTwigSceneRendererAccepsAbsFIlter() + { + [$game, $viewpoint, $character, $eventManager] = $this->getMockeries(); + $eventManager->method("publish")->willReturnArgument(1); + + # Get renderer + $renderer = new TwigSceneRenderer($game); + + # Prepare the template string. + $template = "Character has a debt of {{ Character.getProperty('a/goldiNBank', -10)|abs }} gold."; + + $result = "Character has a debt of 10 gold."; + + # Create the result + $renderResult = $renderer->render($template, $viewpoint); + + # Assert result + $this->assertSame($result, $renderResult); + } + public function testIfViewpointDataCanBeAccessed() { [$game, $viewpoint, $character, $eventManager] = $this->getMockeries();