using System; using System.Linq; using Ariadne.UnitTests; using UnitTestSharp; using Vellum; namespace Ariadne.Vellum.UnitTests { /// /// Saves a script declared inside another type. /// public class NestedScriptSaveTests : TestFixture { public void Reloaded_ResumesWithItsLocal() { SaveSession session = ArcConverterTests.Session(); var gates = new Gates(); var paused = new Squad.Scout(); paused.Tick(gates, TestTicks.Fresh()); paused.Tick(gates, TestTicks.Fresh()); var loaded = (Squad.Scout)session.FromNode( session.ToNode(paused, typeof(Squad.Scout)), typeof(Squad.Scout)); gates.Open.Add("go"); loaded.Tick(gates, TestTicks.Fresh()); CheckEqual(2, loaded.Reported); CheckTrue(loaded.Finished); } } /// /// Saves scripts whose classes have type parameters. /// public class GenericScriptSaveTests : TestFixture { public void EachInstantiation_ReloadsWithItsOwnTypedLocal() { SaveSession session = ArcConverterTests.Session(); var gates = new Gates(); var numbers = new Relay { Source = 4 }; var words = new Relay { Source = "four" }; numbers.Tick(gates, TestTicks.Fresh()); words.Tick(gates, TestTicks.Fresh()); var loadedNumbers = (Relay)session.FromNode( session.ToNode(numbers, typeof(Relay)), typeof(Relay)); var loadedWords = (Relay)session.FromNode( session.ToNode(words, typeof(Relay)), typeof(Relay)); gates.Open.Add("go"); loadedNumbers.Tick(gates, TestTicks.Fresh()); loadedWords.Tick(gates, TestTicks.Fresh()); CheckEqual(4, loadedNumbers.Delivered); CheckEqual("four", loadedWords.Delivered); } public void PassageRunOnAnArcOfAGenericClass_ReloadsWithTheCallersFrame() { SaveSession session = ArcConverterTests.Session(); var gates = new Gates(); var paused = new RelayTender { Relay = new Relay() }; paused.Tick(gates, TestTicks.Fresh()); var loaded = (RelayTender)session.FromNode( session.ToNode(paused, typeof(RelayTender)), typeof(RelayTender)); gates.Open.Add("go"); loaded.Tick(gates, TestTicks.Fresh()); CheckEqual("mail", loaded.Relay.Delivered); CheckTrue(loaded.Finished); } } /// /// Saves an arc paused inside a generic passage, whose locals live in a frame made for the call. /// public class GenericPassageSaveTests : TestFixture { public void Locals_AreSavedBehindTheCallSiteWithTheirOwnTypes() { SaveSession session = ArcConverterTests.Session(); var gates = new Gates(); var paused = new PassageHolder(); paused.Tick(gates, TestTicks.Fresh()); gates.Open.Add("go1"); paused.Tick(gates, TestTicks.Fresh()); SaveNode locals = session.ToNode(paused, typeof(PassageHolder)).RequireEntry(ArcRecord.LocalsKey); CheckEqual("five", locals.RequireEntry("Run.second/").RequireEntry("Hold.held").Text); } public void ReloadedInEachInstantiation_ResumesWithItsLocal() { SaveSession session = ArcConverterTests.Session(); var gates = new Gates(); var first = new PassageHolder(); first.Tick(gates, TestTicks.Fresh()); var loadedFirst = (PassageHolder)session.FromNode( session.ToNode(first, typeof(PassageHolder)), typeof(PassageHolder)); gates.Open.Add("go1"); loadedFirst.Tick(gates, TestTicks.Fresh()); var loadedSecond = (PassageHolder)session.FromNode( session.ToNode(loadedFirst, typeof(PassageHolder)), typeof(PassageHolder)); gates.Open.Add("go2"); loadedSecond.Tick(gates, TestTicks.Fresh()); CheckEqual("5;five;", loadedSecond.Report); CheckTrue(loadedSecond.Finished); } public void CallsMadeInsideAGenericPassage_SaveTheirLocalsWhereTheyLive() { SaveSession session = ArcConverterTests.Session(); var gates = new Gates(); var paused = new NestedRelay(); paused.Tick(gates, TestTicks.Fresh()); SaveNode locals = session.ToNode(paused, typeof(NestedRelay)).RequireEntry(ArcRecord.LocalsKey); CheckEqual(new[] { "Run.start/", "Step.gate", "Step.spins" }, locals.Entries.Keys.OrderBy(key => key, StringComparer.Ordinal).ToArray()); CheckEqual(new[] { "Outer.held" }, locals.RequireEntry("Run.start/").Entries.Keys.ToArray()); } public void ReloadedAtEachPause_ResumesTheNestedCalls() { SaveSession session = ArcConverterTests.Session(); var gates = new Gates(); var relay = new NestedRelay(); relay.Tick(gates, TestTicks.Fresh()); foreach (string gate in new[] { "a", "b" }) { relay = (NestedRelay)session.FromNode(session.ToNode(relay, typeof(NestedRelay)), typeof(NestedRelay)); gates.Open.Add(gate); relay.Tick(gates, TestTicks.Fresh()); } CheckEqual("step1;inner9;", relay.Report); CheckTrue(relay.Finished); } public void PassageOfAnotherArc_SavesTheGenericFrameBesideTheArcFrame() { SaveSession session = ArcConverterTests.Session(); var gates = new Gates(); var paused = new Farmer { House = new Greenhouse() }; paused.Tick(gates, TestTicks.Fresh()); SaveNode locals = session.ToNode(paused, typeof(Farmer)).RequireEntry(ArcRecord.LocalsKey); CheckEqual(new[] { "Run.first/" }, locals.Entries.Keys.ToArray()); CheckEqual(new[] { "Grow.gate", "Grow.kept", "Step.gate", "Step.spins", "receiver" }, locals.RequireEntry("Run.first/").Entries.Keys.OrderBy(key => key, StringComparer.Ordinal).ToArray()); } public void ReloadedAtEachPause_ResumesThePassageOfAnotherArc() { SaveSession session = ArcConverterTests.Session(); var gates = new Gates(); var farmer = new Farmer { House = new Greenhouse() }; farmer.Tick(gates, TestTicks.Fresh()); foreach (string gate in new[] { "s", "g1" }) { farmer = (Farmer)session.FromNode(session.ToNode(farmer, typeof(Farmer)), typeof(Farmer)); gates.Open.Add(gate); farmer.Tick(gates, TestTicks.Fresh()); } CheckEqual("step1;grew4;", farmer.House.Note); CheckTrue(farmer.Finished); } public void InheritedGenericPassageOfAGenericBase_SurvivesAReload() { SaveSession session = ArcConverterTests.Session(); var gates = new Gates(); var steps = new IntSteps(); steps.Tick(gates, TestTicks.Fresh()); var loaded = (IntSteps)session.FromNode(session.ToNode(steps, typeof(IntSteps)), typeof(IntSteps)); gates.Open.Add("go"); loaded.Tick(gates, TestTicks.Fresh()); CheckEqual("a;7;", loaded.Log); CheckEqual(4, loaded.Last); } public void RefAndOutArgumentsOfAGenericPassage_ComeBackAfterAReload() { SaveSession session = ArcConverterTests.Session(); var gates = new Gates(); var swapper = new Swapper(); swapper.Tick(gates, TestTicks.Fresh()); var loaded = (Swapper)session.FromNode(session.ToNode(swapper, typeof(Swapper)), typeof(Swapper)); gates.Open.Add("go"); loaded.Tick(gates, TestTicks.Fresh()); CheckEqual(10, loaded.Total); } } }