using System;
using System.Linq;
using UnitTestSharp;
using Vellum;
namespace Ariadne.Vellum.UnitTests
{
///
/// Saves an arc paused inside a passage its base class declares, whose locals the arc's frame holds.
///
public class InheritedPassageSaveTests : TestFixture
{
public static SteppingScript PausedInside(Gates gates, int ticks)
{
var returnMe = new SteppingScript();
for (int i = 0; i < ticks; ++i)
{
returnMe.Tick(gates, TestTicks.Fresh());
}
return returnMe;
}
public class ToNodeTests : TestFixture
{
public void BasesLocals_AreSavedUnderTheirOwnKeys()
{
SaveSession session = ArcConverterTests.Session();
SaveNode node = session.ToNode(PausedInside(new Gates(), ticks: 2), typeof(SteppingScript));
CheckEqual(new[] { "Hold.seen" },
node.RequireEntry(ArcRecord.LocalsKey).Entries.Keys
.OrderBy(key => key, StringComparer.Ordinal).ToArray());
CheckEqual("2", node.RequireEntry(ArcRecord.LocalsKey).RequireEntry("Hold.seen").Text);
}
}
public class FromNodeTests : TestFixture
{
public void Reloaded_ResumesTheInheritedPassageWithItsLocals()
{
SaveSession session = ArcConverterTests.Session();
var gates = new Gates();
SteppingScript paused = PausedInside(gates, ticks: 2);
var loaded = (SteppingScript)session.FromNode(
session.ToNode(paused, typeof(SteppingScript)), typeof(SteppingScript));
gates.Open.Add("go");
loaded.Tick(gates, TestTicks.Fresh());
CheckEqual("held 2", loaded.Note);
CheckEqual(2, loaded.Stage);
CheckTrue(loaded.Finished);
}
public void ListedParts_IncludeTheBasesLocals()
{
SaveSession session = ArcConverterTests.Session();
SaveNode node = session.ToNode(PausedInside(new Gates(), ticks: 2), typeof(SteppingScript));
var children = new ChildList();
CheckTrue(new ArcConverter().TryListChildren(node, children));
CheckTrue(ArcConverterTests.IndexOfNode(children, node.RequireEntry(ArcRecord.LocalsKey).RequireEntry("Hold.seen")) >= 0);
}
}
}
}