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.
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"],
+43
View File
@@ -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();