Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 586a9469cb |
@@ -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"],
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user