using System;
using UnitTestSharp;
using Vellum;
namespace Ariadne.Vellum.UnitTests
{
///
/// Saves an arc whose Run overrides a base class's Run, and both keep a local of the same name across a pause.
///
public class RunCollisionSaveTests : TestFixture
{
public static ArcType Ticked(ArcType arc, Gates gates, int ticks) where ArcType : Arc
{
for (int i = 0; i < ticks; ++i)
{
arc.Tick(gates, TestTicks.Fresh());
}
return arc;
}
public static ArcType Reloaded(ArcType arc)
{
SaveSession session = ArcConverterTests.Session();
return (ArcType)session.FromNode(session.ToNode(arc, typeof(ArcType)), typeof(ArcType));
}
public class BaseRunCallTests : TestFixture
{
public void PausedBeforeTheCall_RunsTheBaseRunAfterAReload()
{
var gates = new Gates();
CollisionCaller loaded = Reloaded(Ticked(new CollisionCaller(), gates, ticks: 1));
gates.Open.Add("start");
gates.Open.Add("go");
loaded.Tick(gates, TestTicks.Fresh());
CheckEqual("base 1", loaded.BaseNote);
CheckEqual("derived a", loaded.Note);
CheckTrue(loaded.Finished);
}
public void PausedInsideTheCall_ResumesBothRunsLocalsAfterAReload()
{
var gates = new Gates();
gates.Open.Add("start");
CollisionCaller loaded = Reloaded(Ticked(new CollisionCaller(), gates, ticks: 1));
gates.Open.Add("go");
loaded.Tick(gates, TestTicks.Fresh());
CheckEqual("base 1", loaded.BaseNote);
CheckEqual("derived a", loaded.Note);
CheckTrue(loaded.Finished);
}
public void PausedInsideTheCall_SavesTheBasesLocalsInATableNamedForTheCall()
{
SaveSession session = ArcConverterTests.Session();
var gates = new Gates();
gates.Open.Add("start");
CollisionCaller script = Ticked(new CollisionCaller(), gates, ticks: 1);
SaveNode locals = session.ToNode(script, typeof(CollisionCaller)).RequireEntry(ArcRecord.LocalsKey);
CheckEqual("a", locals.RequireEntry("Run.count").Text);
CheckEqual("1", locals.RequireEntry("Run.Run/").RequireEntry("Run.count").Text);
}
public void ReloadedAndSavedAgainBeforeTicking_KeepsBothRunsLocals()
{
var gates = new Gates();
gates.Open.Add("start");
CollisionCaller loaded = Reloaded(Reloaded(Ticked(new CollisionCaller(), gates, ticks: 1)));
gates.Open.Add("go");
loaded.Tick(gates, TestTicks.Fresh());
CheckEqual("base 1", loaded.BaseNote);
CheckEqual("derived a", loaded.Note);
}
public void LabelledCall_SavesTheBasesLocalsUnderTheLabel()
{
SaveSession session = ArcConverterTests.Session();
var gates = new Gates();
CollisionLabelled script = Ticked(new CollisionLabelled(), gates, ticks: 1);
SaveNode locals = session.ToNode(script, typeof(CollisionLabelled)).RequireEntry(ArcRecord.LocalsKey);
CheckEqual("1", locals.RequireEntry("Run.again/").RequireEntry("Run.count").Text);
}
public void CallFromAnotherPassage_ResumesBothLocalsAfterAReload()
{
var gates = new Gates();
CollisionHelper loaded = Reloaded(Ticked(new CollisionHelper(), gates, ticks: 1));
gates.Open.Add("go");
loaded.Tick(gates, TestTicks.Fresh());
CheckEqual("base 1", loaded.BaseNote);
CheckEqual("prepared p", loaded.Note);
CheckTrue(loaded.Finished);
}
public void WaitInTheBaseRun_KeepsItsDeadlineAcrossAReload()
{
var gates = new Gates();
var script = new CollisionWaitDerived();
script.Tick(gates, TestTicks.At(TimeSpan.Zero, TimeSpan.Zero));
CollisionWaitDerived loaded = Reloaded(script);
loaded.Tick(gates, TestTicks.At(TimeSpan.Zero, TimeSpan.FromSeconds(0.5)));
CheckFalse(loaded.Finished);
loaded.Tick(gates, TestTicks.At(TimeSpan.Zero, TimeSpan.FromSeconds(2)));
CheckEqual("rested 3", loaded.WaitNote);
CheckEqual("derived x", loaded.Note);
CheckTrue(loaded.Finished);
}
public void ListedParts_IncludeTheBasesLocalsInTheCallsTable()
{
SaveSession session = ArcConverterTests.Session();
var gates = new Gates();
gates.Open.Add("start");
SaveNode node = session.ToNode(Ticked(new CollisionCaller(), gates, ticks: 1),
typeof(CollisionCaller));
var children = new ChildList();
CheckTrue(new ArcConverter().TryListChildren(node, children));
CheckTrue(ArcConverterTests.IndexOfNode(children,
node.RequireEntry(ArcRecord.LocalsKey).RequireEntry("Run.Run/").RequireEntry("Run.count")) >= 0);
}
public void ChainOfThreeClasses_ResumesEachRunsLocalsAfterAReload()
{
var gates = new Gates();
gates.Open.Add("start");
gates.Open.Add("middle");
CollisionLeaf loaded = Reloaded(Ticked(new CollisionLeaf(), gates, ticks: 1));
gates.Open.Add("go");
loaded.Tick(gates, TestTicks.Fresh());
CheckEqual("base 1", loaded.BaseNote);
CheckEqual("middle 2.5", loaded.MiddleNote);
CheckEqual("leaf leaf", loaded.Note);
CheckTrue(loaded.Finished);
}
}
public class FromNodeTests : TestFixture
{
public void DerivedLocalOfAnotherType_SurvivesAReload()
{
var gates = new Gates();
var script = new CollisionDerived();
script.Tick(gates, TestTicks.Fresh());
CollisionDerived loaded = Reloaded(script);
gates.Open.Add("go");
loaded.Tick(gates, TestTicks.Fresh());
CheckEqual("derived a", loaded.Note);
}
public void DerivedLocalOfTheSameType_SurvivesAReload()
{
var gates = new Gates();
var script = new CollisionSameType();
script.Tick(gates, TestTicks.Fresh());
CollisionSameType loaded = Reloaded(script);
gates.Open.Add("go");
loaded.Tick(gates, TestTicks.Fresh());
CheckEqual("derived 5", loaded.Note);
}
}
}
}