using System.Collections.Generic; using System.IO; using System.Linq; using UnitTestSharp; namespace Vellum.UnitTests { public class StackConverterTests : TestFixture { public static SaveSession Session() { return SaveConvertersTests.TestConverters().CreateSession(); } public static Stack PushedInOrder(params ItemType[] items) { var returnMe = new Stack(); foreach (ItemType item in items) { returnMe.Push(item); } return returnMe; } public class WriteTests : TestFixture { public void Stack_IsAListOfItsItemsInTheOrderTheyWerePushed() { SaveNode node = Session().ToNode(PushedInOrder(3, 1, 2), typeof(Stack)); CheckEqual(SaveNode.Kinds.List, node.Kind); CheckEqual(new[] { "3", "1", "2" }, node.Items.Select(item => item.Text).ToArray()); } public void Writing_LeavesTheStackAsItWas() { Stack value = PushedInOrder(3, 1, 2); Session().ToNode(value, typeof(Stack)); CheckEqual(new[] { 2, 1, 3 }, value.ToArray()); } public void NullStack_IsNull() { CheckEqual(SaveNode.Kinds.Null, Session().ToNode(null, typeof(Stack)).Kind); } } public class ReadTests : TestFixture { public void StackHoldingItself_ReadsAsAStackHoldingItself() { SaveNode node = SaveNode.NewList(); node.Items.Add(node); var loaded = (Stack)new SaveConverters(new SaveConverter[0]) .CreateSession() .FromNode(node, typeof(Stack)); CheckTrue(ReferenceEquals(loaded, loaded.Peek())); } public void Stack_RoundTripsWithTheSameTopAndOrder() { SaveSession session = Session(); SaveNode node = session.ToNode(PushedInOrder("b", "a", "c"), typeof(Stack)); var loaded = (Stack)session.FromNode(node, typeof(Stack)); CheckEqual("c", loaded.Peek()); CheckEqual(new[] { "c", "a", "b" }, loaded.ToArray()); } public void StackThroughLuaText_RoundTrips() { SaveSession session = Session(); SaveNode saved = session.ToNode(PushedInOrder(new Point(1.5, 0), new Point(0, -2)), typeof(Stack)); var loaded = (Stack)session.FromNode(SaveConvertersTests.ThroughLuaText(saved), typeof(Stack)); CheckEqual(-2.0, loaded.Pop().Y); CheckEqual(1.5, loaded.Pop().X); } public void EmptyStackThroughLuaText_RoundTrips() { SaveSession session = Session(); SaveNode node = SaveConvertersTests.ThroughLuaText( session.ToNode(new Stack(), typeof(Stack))); CheckEqual(0, ((Stack)session.FromNode(node, typeof(Stack))).Count); } public void NullForAStack_IsNull() { CheckNull(Session().FromNode(SaveNode.Null, typeof(Stack))); } public void NodeThatIsNotAList_Throws() { CheckThrow(typeof(InvalidDataException)); Session().FromNode(SaveNode.OfText("3"), typeof(Stack)); } } public class TryListChildrenTests : TestFixture { public void EachItem_IsListedAsTheItemType() { var value = new Stack(); value.Push(new Waypoint { Name = "a" }); value.Push(null); SaveNode node = Session().ToNode(value, typeof(Stack)); var children = new ChildList(); CheckTrue(new StackConverter().TryListChildren(node, children)); CheckEqual(2, children.Count); CheckTrue(ReferenceEquals(node.Items[0], children.NodeAt(0))); CheckTrue(ReferenceEquals(node.Items[1], children.NodeAt(1))); CheckEqual(typeof(Waypoint), children.TypeAt(0)); } public void EmptyStack_ListsNothingAndSucceeds() { var children = new ChildList(); CheckTrue(new StackConverter().TryListChildren(SaveNode.NewList(), children)); CheckEqual(0, children.Count); } public void NodeThatIsNotAList_ReturnsFalse() { CheckFalse(new StackConverter().TryListChildren(SaveNode.OfText("3"), new ChildList())); } } public class AllocateTests : TestFixture { public void SavedValue_GivesAnEmptyCollection() { SaveSession session = SaveConvertersTests.Session(); SaveNode node = session.ToNode(new Stack(new[] { 3, 1, 2 })); CheckEqual(0, new StackConverter().Allocate(node, session).Count); } public void NodeOfTheWrongShape_Throws() { CheckThrow(typeof(InvalidDataException)); new StackConverter().Allocate(SaveNode.OfText("3"), SaveConvertersTests.Session()); } } public class FillTests : TestFixture { public void SavedValue_AddsWhatReadLoads() { SaveSession session = SaveConvertersTests.Session(); SaveNode node = session.ToNode(new Stack(new[] { 3, 1, 2 })); var converter = new StackConverter(); Stack filled = converter.Allocate(node, session); converter.Fill(filled, node, session); CheckTrue(converter.Read(node, SaveConvertersTests.Session()).SequenceEqual(filled)); } } public class FillNeedsFilledPartTests : TestFixture { public void AnyType_IsFalse() { CheckFalse(new StackConverter().FillNeedsFilledPart(typeof(int))); } } } }