using System.Linq; using Ariadne.UnitTests; using UnitTestSharp; using Vellum; namespace Ariadne.Vellum.UnitTests { /// /// Saves arcs paused inside a virtual passage, or an override of one. /// public class VirtualPassageSaveTests : TestFixture { public class ToNodeTests : TestFixture { public void OverridesLocal_IsSavedUnderItsClassSoTheBasesLocalOfTheSameNameIsLeftAlone() { SaveSession session = ArcConverterTests.Session(); var script = new LoudestGreeter(); script.Tick(new ArcTests.Gates(), TestTicks.Fresh()); SaveNode locals = session.ToNode(script, typeof(LoudestGreeter)).RequireEntry(ArcRecord.LocalsKey); CheckEqual(new[] { "LoudestGreeter.Greet.volume" }, locals.Entries.Keys.ToArray()); CheckEqual("max", locals.RequireEntry("LoudestGreeter.Greet.volume").Text); } } public class FromNodeTests : TestFixture { private static ScriptType Reloaded(ScriptType script, SaveSession session) where ScriptType : Arc { return (ScriptType)session.FromNode(session.ToNode(script, typeof(ScriptType)), typeof(ScriptType)); } public void OverrideOfAnOverrideWithAnotherLocalType_ReloadsWithoutAnIssue() { var gates = new ArcTests.Gates(); var script = new LoudestGreeter(); script.Tick(gates, TestTicks.Fresh()); SaveSession session = ArcConverterTests.Session(); LoudestGreeter loaded = Reloaded(script, session); gates.Open.Add("bellow"); loaded.Tick(gates, TestTicks.Fresh()); CheckEqual(0, session.Sandbox.Issues.Count); CheckEqual("LOUDEST max;done;", loaded.Log); } public void OverrideReloadedAsItsBaseClass_RunsTheOverride() { var gates = new ArcTests.Gates(); var script = new LoudGreeter(); script.Tick(gates, TestTicks.Fresh()); SaveSession session = ArcConverterTests.Session(); var loaded = (Greeter)session.FromNode(session.ToNode(script, typeof(Greeter)), typeof(Greeter)); gates.Open.Add("shout"); loaded.Tick(gates, TestTicks.Fresh()); CheckEqual(0, session.Sandbox.Issues.Count); CheckEqual("LOUD3;done;", loaded.Log); } public void AbstractPassageReloadedWhilePaused_ResumesInTheOverride() { var gates = new ArcTests.Gates(); var script = new Stubborn(); script.Tick(gates, TestTicks.Fresh()); SaveSession session = ArcConverterTests.Session(); Stubborn loaded = Reloaded(script, session); gates.Open.Add("deal"); loaded.Tick(gates, TestTicks.Fresh()); CheckEqual(0, session.Sandbox.Issues.Count); CheckEqual("asked 14;closed;", loaded.Log); } public void OverrideCalledOnAnotherArcReloadedWhilePaused_ResumesInTheOverride() { var gates = new Gates(); var script = new Visitor { Entrance = new CreakyDoor() }; script.Tick(gates, TestTicks.Fresh()); SaveSession session = ArcConverterTests.Session(); Visitor loaded = (Visitor)session.FromNode(session.ToNode(script, typeof(Visitor)), typeof(Visitor)); gates.Open.Add("swing"); loaded.Tick(gates, TestTicks.Fresh()); CheckEqual(0, session.Sandbox.Issues.Count); CheckEqual("creak", loaded.Result); CheckTrue(loaded.Entrance is CreakyDoor); } public void BaseVersionCalledOnAnotherArcReloadedWhilePaused_ResumesInTheBase() { var gates = new Gates(); var script = new Visitor { Entrance = new Door() }; script.Tick(gates, TestTicks.Fresh()); SaveSession session = ArcConverterTests.Session(); Visitor loaded = (Visitor)session.FromNode(session.ToNode(script, typeof(Visitor)), typeof(Visitor)); gates.Open.Add("swing"); loaded.Tick(gates, TestTicks.Fresh()); CheckEqual(0, session.Sandbox.Issues.Count); CheckEqual("swung 2", loaded.Result); } public void OverridePausedInsideItsBaseCall_ReloadsBothLocalsWithoutAnIssue() { var gates = new Gates(); var script = new Escalator(); script.Tick(gates, TestTicks.Fresh()); gates.Open.Add("before"); script.Tick(gates, TestTicks.Fresh()); SaveSession session = ArcConverterTests.Session(); Escalator loaded = Reloaded(script, session); gates.Open.Add("hello"); loaded.Tick(gates, TestTicks.Fresh()); CheckEqual(0, session.Sandbox.Issues.Count); CheckEqual("hello;after 5;done;", loaded.Log); } public void ReloadedTwice_KeepsTheLocalAcrossBothSaves() { var gates = new ArcTests.Gates(); var script = new LoudGreeter(); script.Tick(gates, TestTicks.Fresh()); LoudGreeter loaded = Reloaded(script, ArcConverterTests.Session()); loaded = Reloaded(loaded, ArcConverterTests.Session()); gates.Open.Add("shout"); loaded.Tick(gates, TestTicks.Fresh()); CheckEqual("LOUD3;done;", loaded.Log); } } } }