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