using System.Collections.Generic; using System.IO; using System.Linq; using UnitTestSharp; namespace Vellum.UnitTests { public class ListConverterTests : TestFixture { public static SaveSession Session() { return SaveConvertersTests.TestConverters().CreateSession(); } public class WriteTests : TestFixture { public void List_IsAListOfItsItems() { SaveNode node = Session().ToNode(new List { 3, 1, 2 }, typeof(List)); CheckEqual(SaveNode.Kinds.List, node.Kind); CheckEqual(new[] { "3", "1", "2" }, node.Items.Select(item => item.Text).ToArray()); } public void ListOfLists_IsAListOfLists() { var value = new List> { new List { "a" }, new List { "b", "c" } }; SaveNode node = Session().ToNode(value, typeof(List>)); CheckEqual("c", node.Items[1].Items[1].Text); } public void NullList_IsNull() { CheckEqual(SaveNode.Kinds.Null, Session().ToNode(null, typeof(List)).Kind); } } public class ReadTests : TestFixture { public void ListHoldingItself_ReadsAsAListHoldingItself() { SaveNode node = SaveNode.NewList(); node.Items.Add(node); var loaded = (List)new SaveConverters(new SaveConverter[0]).CreateSession() .FromNode(node, typeof(List)); CheckTrue(ReferenceEquals(loaded, loaded[0])); } public void ListHoldingItselfThroughLuaText_ReadsAsAListHoldingItself() { SaveNode list = SaveNode.NewList(); list.Items.Add(list); SaveNode save = SaveNode.NewTable(); save.Entries["list"] = list; SaveNode read = LuaSaveFormat.Parse(LuaSaveFormat.Format(save)); var loaded = (List)new SaveConverters(new SaveConverter[0]).CreateSession() .FromNode(read.RequireEntry("list"), typeof(List)); CheckTrue(ReferenceEquals(loaded, loaded[0])); } public void List_RoundTrips() { SaveSession session = Session(); SaveNode node = session.ToNode(new List { 3, 1, 2 }, typeof(List)); CheckEqual(new[] { 3, 1, 2 }, (List)session.FromNode(node, typeof(List))); } public void ListOfConvertedValues_RoundTrips() { SaveSession session = Session(); var value = new List { new Waypoint { Name = "end", At = new Point(1.5, -2) }, null }; SaveNode node = session.ToNode(value, typeof(List)); var loaded = (List)session.FromNode(node, typeof(List)); CheckEqual("end", loaded[0].Name); CheckEqual(-2.0, loaded[0].At.Y); CheckNull(loaded[1]); } public void ListThroughLuaText_RoundTrips() { SaveSession session = Session(); var value = new List { "a", null, "c d" }; SaveNode node = SaveConvertersTests.ThroughLuaText(session.ToNode(value, typeof(List))); CheckEqual(value, (List)session.FromNode(node, typeof(List))); } public void EmptyListThroughLuaText_RoundTrips() { SaveSession session = Session(); SaveNode node = SaveConvertersTests.ThroughLuaText( session.ToNode(new List(), typeof(List))); CheckEqual(0, ((List)session.FromNode(node, typeof(List))).Count); } public void NullForAList_IsNull() { CheckNull(Session().FromNode(SaveNode.Null, typeof(List))); } public void NodeThatIsNotAList_Throws() { CheckThrow(typeof(InvalidDataException)); Session().FromNode(SaveNode.OfText("3"), typeof(List)); } } public class TryListChildrenTests : TestFixture { public void EachItem_IsListedAsTheItemType() { var value = new List { new Waypoint { Name = "a" }, null }; SaveNode node = Session().ToNode(value, typeof(List)); var children = new ChildList(); CheckTrue(new ListConverter().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)); CheckEqual(typeof(Waypoint), children.TypeAt(1)); } public void EmptyList_ListsNothingAndSucceeds() { var children = new ChildList(); CheckTrue(new ListConverter().TryListChildren(SaveNode.NewList(), children)); CheckEqual(0, children.Count); } public void NodeThatIsNotAList_ReturnsFalse() { CheckFalse(new ListConverter().TryListChildren(SaveNode.OfText("3"), new ChildList())); } } public class AllocateTests : TestFixture { public void SavedValue_GivesAnEmptyCollection() { SaveSession session = SaveConvertersTests.Session(); SaveNode node = session.ToNode(new List { 3, 1, 2 }); CheckEqual(0, new ListConverter().Allocate(node, session).Count); } public void NodeOfTheWrongShape_Throws() { CheckThrow(typeof(InvalidDataException)); new ListConverter().Allocate(SaveNode.OfText("3"), SaveConvertersTests.Session()); } } public class FillTests : TestFixture { public void SavedValue_AddsWhatReadLoads() { SaveSession session = SaveConvertersTests.Session(); SaveNode node = session.ToNode(new List { 3, 1, 2 }); var converter = new ListConverter(); List 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 ListConverter().FillNeedsFilledPart(typeof(int))); } } } }