Adds SceneRenderer class based on twig to convert some logic and variables from Scenes, allowing them to be more flexible.

This commit is contained in:
Vassyli
2021-01-16 14:05:10 +01:00
committed by Basilius Sauter
parent 1a0b6dbe3e
commit 1fb2eb023e
7 changed files with 416 additions and 59 deletions
@@ -1,7 +1,7 @@
<?php
declare(strict_types=1);
namespace LotGD\Core\Tests\Managers;
namespace LotGD\Core\Tests\Services;
use Doctrine\ORM\EntityManagerInterface;
+164
View File
@@ -0,0 +1,164 @@
<?php
declare(strict_types=1);
namespace LotGD\Core\Tests\Services;
use LotGD\Core\Exceptions\InsecureTwigTemplateError;
use LotGD\Core\Game;
use LotGD\Core\Models\Character;
use LotGD\Core\Models\Scene;
use LotGD\Core\PHPUnit\LotGDTestCase;
use LotGD\Core\Services\TwigSceneRenderer;
class TwigSceneRendererTest extends LotGDTestCase
{
protected function getGameMock(): Game
{
$game = $this->getMockBuilder(Game::class)
->disableOriginalConstructor()
->getMock();
return $game;
}
public function testIfSceneRendererCanBeConstructed()
{
$renderer = new TwigSceneRenderer($this->getGameMock());
$this->assertInstanceOf(TwigSceneRenderer::class, $renderer);
}
public function testIfTwigSceneRendererReturnsANonTemplateStringUnmodified()
{
# Get renderer
$renderer = new TwigSceneRenderer($this->getGameMock());
# Get mock scene
$scene = $this->getMockBuilder(Scene::class)
->disableOriginalConstructor()
->getMock();
# Prepare the template string.
$template = "You enter a new location.\n\nA new location.";
# Create the result
$renderResult = $renderer->render($template, $scene);
# Assert result
$this->assertSame($template, $renderResult);
}
public function testIfTwigSceneRendererParsesStringsWithCharacters()
{
# Get mock character
$character = $this->getMockBuilder(Character::class)
->disableOriginalConstructor()
->getMock();
$character->method("getDisplayName")->willReturn("Frodo");
$character->method("getLevel")->willReturn(5);
$character->method("getHealth")->willReturn(10);
$character->method("getMaxHealth")->willReturn(100);
$character->method("isAlive")->willReturn(true);
# Get mock game
$game = $this->getMockBuilder(Game::class)
->disableOriginalConstructor()
->getMock();
$game->method("getCharacter")->willReturn($character);
# Get mock scene
$scene = $this->getMockBuilder(Scene::class)
->disableOriginalConstructor()
->getMock();
# Get renderer
$renderer = new TwigSceneRenderer($game);
# Prepare the template string.
$template = "Hi {{ Character.getDisplayName }}! How are you today? Your level is {{ Character.level}}, and you have "
."{{ Character.health }} out of {{ Character.maxHealth }} health points."
."{% if Character.isAlive %} You are alive.{% endif %}";
$result = "Hi Frodo! How are you today? Your level is 5, and you have "
."10 out of 100 health points. "
."You are alive.";
# Create the result
$renderResult = $renderer->render($template, $scene);
# Assert result
$this->assertSame($result, $renderResult);
}
public function testIfRawTemplateGetsReturnedIfTemplateContainsIllegalTokens()
{
# Get mock character
$character = $this->getMockBuilder(Character::class)
->disableOriginalConstructor()
->getMock();
$character->method("getDisplayName")->willReturn("Frodo");
$character->method("getLevel")->willReturn(5);
$character->method("getHealth")->willReturn(10);
$character->method("getMaxHealth")->willReturn(100);
$character->method("isAlive")->willReturn(true);
# Get mock game
$game = $this->getMockBuilder(Game::class)
->disableOriginalConstructor()
->getMock();
$game->method("getCharacter")->willReturn($character);
# Get mock scene
$scene = $this->getMockBuilder(Scene::class)
->disableOriginalConstructor()
->getMock();
# Get renderer
$renderer = new TwigSceneRenderer($game);
# Prepare the template string.
$template = "Viewpoint: {{ Character.viewpoint }}";
# Try to parse the result
$renderResult = $renderer->render($template, $scene, true);
# If there was an error, it should have gotten ignored, giving back the raw template.
$this->assertSame($template, $renderResult);
}
public function testIfExceptionGetsRaisedIfTemplateContainsIllegalTokens()
{
# Get mock character
$character = $this->getMockBuilder(Character::class)
->disableOriginalConstructor()
->getMock();
$character->method("getDisplayName")->willReturn("Frodo");
$character->method("getLevel")->willReturn(5);
$character->method("getHealth")->willReturn(10);
$character->method("getMaxHealth")->willReturn(100);
$character->method("isAlive")->willReturn(true);
# Get mock game
$game = $this->getMockBuilder(Game::class)
->disableOriginalConstructor()
->getMock();
$game->method("getCharacter")->willReturn($character);
# Get mock scene
$scene = $this->getMockBuilder(Scene::class)
->disableOriginalConstructor()
->getMock();
# Get renderer
$renderer = new TwigSceneRenderer($game);
# Prepare the template string.
$template = "Viewpoint: {{ Character.viewpoint }}";
# Prepare the exception expectation
$this->expectException(InsecureTwigTemplateError::class);
# Try to parse the result
$renderResult = $renderer->render($template, $scene, false);
}
}