using System;
using System.IO;
using UnitTestSharp;
using Vellum;
namespace Ariadne.Vellum.UnitTests
{
public class ArcLoaderTests : TestFixture
{
///
/// Writes its own __Resume, so Ariadne.Generator leaves it alone and it has no loading constructor.
///
public class LoaderlessArc : Arc
{
protected override bool __Resume(Gates context, TickTime time)
{
return true;
}
protected override void Run(Gates context)
{
}
}
public static ArcRecord ReadRecord(SaveNode fields)
{
SaveNode root = SaveNode.NewTable();
root.Entries[ArcRecord.FieldsKey] = fields;
return ArcRecord.FromNode(root, ArcRecordTests.Session());
}
public class FindConstructorTests : TestFixture
{
public void GeneratedLoader_IsFound()
{
CheckNotNull(ArcLoader.FindConstructor(typeof(CountingScript)));
}
public void ClassWithoutOne_Throws()
{
CheckThrow(typeof(InvalidOperationException));
ArcLoader.FindConstructor(typeof(LoaderlessArc));
}
}
public class TryListPartsTests : TestFixture
{
public void GeneratedClass_ListsItsFieldsThenItsLocals()
{
var parts = new ArcPartList();
CheckTrue(ArcLoader.TryListParts(typeof(CountingScript), parts));
CheckEqual(new[] { "Count", "Note", "Run.waits" }, parts.Keys);
CheckEqual(new[] { typeof(int), typeof(string), typeof(int) }, parts.Types);
CheckEqual(new[] { false, false, true }, parts.IsLocal);
}
public void DerivedClass_ListsItsBaseClassFirst()
{
var parts = new ArcPartList();
CheckTrue(ArcLoader.TryListParts(typeof(ReliefScript), parts));
CheckEqual(new[] { "Stage", "Crates" }, parts.Keys);
}
public void ClassWritingItsOwnSaveFields_ReturnsFalse()
{
CheckFalse(ArcLoader.TryListParts(typeof(HandBuiltScript), new ArcPartList()));
}
public void ClassWithoutAListing_ReturnsFalse()
{
CheckFalse(ArcLoader.TryListParts(typeof(LoaderlessArc), new ArcPartList()));
}
public void HandBuiltClassUnderAGeneratedOne_ReturnsFalse()
{
CheckFalse(ArcLoader.TryListParts(typeof(HandBuiltUnderMission), new ArcPartList()));
}
}
public class CreateTests : TestFixture
{
public void BuildsTheArcFromTheRecord()
{
var record = ArcRecord.FromNode(ArcRecordTests.SampleRecord().ToNode(), ArcRecordTests.Session());
var arc = (CountingScript)ArcLoader.Create(typeof(CountingScript), record);
CheckEqual(new[] { "act2", "build" }, arc.Cursor);
CheckTrue(arc.Finished);
}
public void ConstructorFoundEarlier_BuildsTheArcToo()
{
var record = ArcRecord.FromNode(ArcRecordTests.SampleRecord().ToNode(), ArcRecordTests.Session());
var arc = (CountingScript)ArcLoader.Create(ArcLoader.FindConstructor(typeof(CountingScript)), record);
CheckEqual(new[] { "act2", "build" }, arc.Cursor);
}
public void FieldThatCannotBeRead_KeepsItsInitialValue()
{
SaveNode fields = SaveNode.NewTable();
fields.Entries["Count"] = SaveNode.OfText("many");
var arc = (CountingScript)ArcLoader.Create(typeof(CountingScript), ReadRecord(fields));
CheckEqual(0, arc.Count);
}
public void ClassWithoutALoader_Throws()
{
CheckThrow(typeof(InvalidOperationException));
ArcLoader.Create(typeof(LoaderlessArc), ReadRecord(SaveNode.NewTable()));
}
}
}
}