using System;
using System.Linq;
using Ariadne.Vellum.UnitTests.Library;
using UnitTestSharp;
using Vellum;
namespace Ariadne.Vellum.UnitTests
{
///
/// Saves arcs paused inside passages that were built into another assembly.
///
public class LibrarySaveTests : TestFixture
{
public static ArcType Tick(ArcType arc, Vault vault, int ticks) where ArcType : Arc
{
for (int i = 0; i < ticks; ++i)
{
arc.Tick(vault, 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 BasePassageTests : TestFixture
{
public void PausedInside_SavesItsLocalsUnderThePassagesKeys()
{
SaveSession session = ArcConverterTests.Session();
var script = Tick(new VaultSteppingScript(), new Vault(), ticks: 2);
SaveNode locals = session.ToNode(script, typeof(VaultSteppingScript))
.RequireEntry(ArcRecord.LocalsKey);
CheckEqual(new[] { "Hold.bonus", "Hold.seen" },
locals.Entries.Keys.OrderBy(key => key, StringComparer.Ordinal).ToArray());
CheckEqual("2", locals.RequireEntry("Hold.seen").Text);
CheckEqual("10", locals.RequireEntry("Hold.bonus").Text);
}
public void Reloaded_ResumesThePassageWithItsLocals()
{
var vault = new Vault();
var loaded = Reloaded(Tick(new VaultSteppingScript(), vault, ticks: 2));
vault.Open.Add("go");
Tick(loaded, vault, ticks: 1);
CheckEqual("held 12", loaded.Note);
CheckEqual(2, loaded.Stage);
CheckTrue(loaded.Finished);
}
public void ReturnedValueInsideAnExpression_SurvivesAReload()
{
var vault = new Vault();
var loaded = Reloaded(Tick(new VaultCountingScript(), vault, ticks: 2));
vault.Open.Add("go");
Tick(loaded, vault, ticks: 1);
CheckEqual(102, loaded.Total);
CheckTrue(loaded.Finished);
}
}
public class GenericAndRecursiveBasePassageTests : TestFixture
{
public void InheritedGenericPassage_ResumesWithItsTypedLocalAfterAReload()
{
var vault = new Vault();
var loaded = Reloaded(Tick(new VaultWeighingScript(), vault, ticks: 2));
vault.Open.Add("go");
Tick(loaded, vault, ticks: 1);
CheckEqual("weighed ore", loaded.Note);
CheckTrue(loaded.Finished);
}
public void InheritedRecursivePassage_ResumesEveryLevelAfterAReload()
{
var vault = new Vault();
var loaded = Reloaded(Tick(new VaultDescendingScript(), vault, ticks: 2));
vault.Open.Add("go");
Tick(loaded, vault, ticks: 1);
CheckEqual("idlelevel0;level1;level2;", loaded.Note);
CheckTrue(loaded.Finished);
}
public void PassagesOfAGenericBase_ResumeAfterAReloadAtEachPause()
{
var vault = new Vault();
var loaded = Reloaded(Tick(new VaultTaggedScript(), vault, ticks: 2));
vault.Open.Add("go");
Tick(loaded, vault, ticks: 1);
loaded = Reloaded(loaded);
vault.Open.Add("held");
Tick(loaded, vault, ticks: 1);
CheckEqual(4, loaded.Last);
CheckEqual("a;", loaded.Log);
CheckTrue(loaded.Finished);
}
}
public class BaseRunTests : TestFixture
{
public void BaseRunOfAnotherAssembly_ResumesBothRunsLocalsAfterAReload()
{
var vault = new Vault();
var loaded = Reloaded(Tick(new VaultTemplateScript(), vault, ticks: 1));
vault.Open.Add("go");
Tick(loaded, vault, ticks: 1);
CheckEqual("template 1", loaded.TemplateNote);
CheckEqual("derived a", loaded.Note);
CheckTrue(loaded.Finished);
}
}
public class OtherArcPassageTests : TestFixture
{
public void PausedInside_SavesTheCalleesLocalsInATableNamedForTheCall()
{
SaveSession session = ArcConverterTests.Session();
var script = Tick(new VaultOperator { Plant = new VaultPlant() }, new Vault(), ticks: 2);
SaveNode locals = session.ToNode(script, typeof(VaultOperator)).RequireEntry(ArcRecord.LocalsKey);
CheckEqual(new[] { "Run.before", "Run.update/" },
locals.Entries.Keys.OrderBy(key => key, StringComparer.Ordinal).ToArray());
SaveNode call = locals.RequireEntry("Run.update/");
CheckEqual(new[] { "Update.bonus", "Update.waited", "receiver" },
call.Entries.Keys.OrderBy(key => key, StringComparer.Ordinal).ToArray());
CheckEqual("2", call.RequireEntry("Update.waited").Text);
}
public void Reloaded_ResumesTheCallOnTheSameArc()
{
var vault = new Vault();
var loaded = Reloaded(Tick(new VaultOperator { Plant = new VaultPlant() }, vault, ticks: 2));
vault.Open.Add("go");
Tick(loaded, vault, ticks: 1);
CheckEqual("done 7", loaded.Result);
CheckEqual("updated after 2", loaded.Plant.Note);
CheckEqual(7, loaded.Plant.Updates);
CheckTrue(loaded.Finished);
}
public void GenericPassage_ResumesWithItsTypedLocalAfterAReload()
{
var vault = new Vault();
var loaded = Reloaded(Tick(new VaultPonderer { Plant = new VaultPlant() }, vault, ticks: 2));
vault.Open.Add("go");
Tick(loaded, vault, ticks: 1);
CheckEqual("pondered stone", loaded.Plant.Note);
CheckTrue(loaded.Finished);
}
public void PassagesOfAGenericArcClass_ResumeAfterAReloadAtEachPause()
{
var vault = new Vault();
var loaded = Reloaded(Tick(new VaultShopkeeper { Shelf = new VaultShelf() }, vault, ticks: 2));
vault.Open.Add("go");
Tick(loaded, vault, ticks: 1);
CheckEqual("stocked jar", loaded.Shelf.Note);
loaded = Reloaded(loaded);
vault.Open.Add("labeled");
Tick(loaded, vault, ticks: 1);
CheckEqual("labeled lid5", loaded.Shelf.Note);
CheckTrue(loaded.Finished);
}
public void RecursivePassage_ResumesEveryLevelAfterAReload()
{
var vault = new Vault();
var loaded = Reloaded(Tick(new VaultDigger { Plant = new VaultPlant() }, vault, ticks: 2));
vault.Open.Add("go");
Tick(loaded, vault, ticks: 1);
CheckEqual(3, loaded.Plant.Updates);
CheckTrue(loaded.Finished);
}
public void ReturnedValueInsideAnExpression_SurvivesAReload()
{
var vault = new Vault();
var loaded = Reloaded(Tick(new VaultMeasurer { Plant = new VaultPlant() }, vault, ticks: 2));
vault.Open.Add("go");
Tick(loaded, vault, ticks: 1);
CheckEqual(9, loaded.Total);
CheckTrue(loaded.Finished);
}
}
}
}