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; } = ""; /// /// Whether to print the inputs as they are executed. This is primarily a debugging aid. /// 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."); } }