1 Commits

Author SHA1 Message Date
Vassyli 586a9469cb Twig accepts abs filter, added 2 more tests. 2021-08-28 12:44:14 +02:00
2 changed files with 55 additions and 4 deletions
+12 -4
View File
@@ -69,11 +69,15 @@ class TwigSceneRenderer
// throwing an exception. // throwing an exception.
try { try {
$template = $this->twig->createTemplate($string); $template = $this->twig->createTemplate($string);
} catch (SecurityError $e) { } catch (SecurityError | SyntaxError $e) {
if ($ignoreErrors) { if ($ignoreErrors) {
return $string; return $string;
} else { } 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) { if ($ignoreErrors) {
return $string; return $string;
} else { } 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 public function getSecurityPolicy(): SecurityPolicy
{ {
$tags = ["if"]; $tags = ["if"];
$filters = ["lower", "upper", "escape", "round"]; $filters = ["lower", "upper", "escape", "round", "abs"];
$functions = ["range"]; $functions = ["range"];
$methods = [ $methods = [
Character::class => ["getDisplayName", "getLevel", "isAlive", "getHealth", "getMaxHealth", "getProperty"], Character::class => ["getDisplayName", "getLevel", "isAlive", "getHealth", "getMaxHealth", "getProperty"],
+43
View File
@@ -26,6 +26,9 @@ class TwigSceneRendererTest extends LotGDTestCase
$character->method("getHealth")->willReturn(10); $character->method("getHealth")->willReturn(10);
$character->method("getMaxHealth")->willReturn(100); $character->method("getMaxHealth")->willReturn(100);
$character->method("isAlive")->willReturn(true); $character->method("isAlive")->willReturn(true);
$character->method("getProperty")->willReturnCallback(function ($name, $default=null) {
return $default;
});
# Get mock game # Get mock game
$game = $this->getMockBuilder(Game::class) $game = $this->getMockBuilder(Game::class)
@@ -104,6 +107,46 @@ class TwigSceneRendererTest extends LotGDTestCase
$this->assertSame($result, $renderResult); $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() public function testIfViewpointDataCanBeAccessed()
{ {
[$game, $viewpoint, $character, $eventManager] = $this->getMockeries(); [$game, $viewpoint, $character, $eventManager] = $this->getMockeries();