49 lines
1.6 KiB
C#
49 lines
1.6 KiB
C#
using NUnit.Framework;
|
|
|
|
using MultiversalDiplomacy.Script;
|
|
|
|
namespace MultiversalDiplomacyTests;
|
|
|
|
public class ReplDriver(IScriptHandler initialHandler, bool echo = false)
|
|
{
|
|
public IScriptHandler? Handler { get; private set; } = initialHandler;
|
|
|
|
private string? LastInput { get; set; } = "";
|
|
|
|
/// <summary>
|
|
/// Whether to print the inputs as they are executed. This is primarily a debugging aid.
|
|
/// </summary>
|
|
bool Echo { get; } = echo;
|
|
|
|
public ReplDriver ExecuteAll(string multiline)
|
|
{
|
|
var lines = multiline.Split('\n', StringSplitOptions.TrimEntries);
|
|
return lines.Aggregate(this, (repl, line) => repl.Execute(line));
|
|
}
|
|
|
|
public ReplDriver Execute(string inputLine)
|
|
{
|
|
if (Handler is null) throw new AssertionException(
|
|
$"Cannot execute \"{inputLine}\", handler quit. Last input was \"{LastInput}\"");
|
|
if (Echo) Console.WriteLine($"{Handler.Prompt}{inputLine}");
|
|
|
|
var result = Handler.HandleInput(inputLine);
|
|
if (!result.Success) Assert.Fail($"Script failed at \"{inputLine}\": {result.Message}");
|
|
|
|
Handler = result.NextHandler;
|
|
LastInput = inputLine;
|
|
|
|
return this;
|
|
}
|
|
|
|
public void AssertFails(string inputLine)
|
|
{
|
|
if (Handler is null) throw new AssertionException(
|
|
$"Cannot execute \"{inputLine}\", handler quit. Last input was \"{LastInput}\"");
|
|
if (Echo) Console.WriteLine($"{Handler.Prompt}{inputLine}");
|
|
|
|
var result = Handler.HandleInput(inputLine);
|
|
if (result.Success) Assert.Fail($"Expected \"{inputLine}\" to fail, but it succeeded.");
|
|
}
|
|
}
|