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);
}
}
}
}