using System.Collections.Generic; using System.IO; using System.Linq; using UnitTestSharp; namespace Vellum.UnitTests { public class ItemsConverterTests : TestFixture { public class Tray : List { public int Reserved; } public class TrayConverter : ItemsConverter, ItemType> { public override Tray CreateEmpty(int capacity) { return new Tray { Reserved = capacity }; } public override void AddItem(Tray collection, ItemType item) { collection.Add(item); } } public class BackwardTray : List { } public class BackwardTrayConverter : ItemsConverter, ItemType> { public override BackwardTray CreateEmpty(int capacity) { return new BackwardTray(); } public override void AddItem(BackwardTray collection, ItemType item) { collection.Add(item); } public override IEnumerable ItemsInSaveOrder(BackwardTray value) { return value.AsEnumerable().Reverse(); } } public static SaveSession Session() { return SaveConvertersTests.SessionWith(typeof(TrayConverter<>)); } public class WriteTests : TestFixture { public void Items_AreAListOfThemInEnumerationOrder() { SaveNode node = Session().ToNode(new Tray { 3, 1, 2 }, typeof(Tray)); CheckEqual(SaveNode.Kinds.List, node.Kind); CheckEqual(new[] { "3", "1", "2" }, node.Items.Select(item => item.Text).ToArray()); } public void NoItems_IsAnEmptyList() { SaveNode node = Session().ToNode(new Tray(), typeof(Tray)); CheckEqual(SaveNode.Kinds.List, node.Kind); CheckEqual(0, node.Items.Count); } public void ConverterThatChoosesTheOrder_IsFollowed() { SaveNode node = SaveConvertersTests.SessionWith(typeof(BackwardTrayConverter<>)) .ToNode(new BackwardTray { 3, 1, 2 }, typeof(BackwardTray)); CheckEqual(new[] { "2", "1", "3" }, node.Items.Select(item => item.Text).ToArray()); } public void NullCollection_IsNull() { CheckEqual(SaveNode.Kinds.Null, Session().ToNode(null, typeof(Tray)).Kind); } } public class ReadTests : TestFixture { private static SaveNode ListOf(params string[] texts) { SaveNode returnMe = SaveNode.NewList(); foreach (string text in texts) { returnMe.Items.Add(SaveNode.OfText(text)); } return returnMe; } public void List_IsAddedItemByItemInOrder() { var loaded = (Tray)Session().FromNode(ListOf("3", "1", "2"), typeof(Tray)); CheckEqual(new[] { 3, 1, 2 }, loaded.ToArray()); } public void List_MakesTheCollectionWithRoomForEveryItem() { var loaded = (Tray)Session().FromNode(ListOf("3", "1", "2"), typeof(Tray)); CheckEqual(3, loaded.Reserved); } public void EmptyList_IsAnEmptyCollection() { var loaded = (Tray)Session().FromNode(ListOf(), typeof(Tray)); CheckEqual(0, loaded.Count); } public void CollectionHoldingItself_ReadsAsOneHoldingItself() { SaveNode node = SaveNode.NewList(); node.Items.Add(node); var loaded = (Tray)SaveConvertersTests.SessionWith(typeof(TrayConverter<>)) .FromNode(node, typeof(Tray)); CheckTrue(ReferenceEquals(loaded, loaded[0])); } public void NodeThatIsNotAList_Throws() { CheckThrow(typeof(InvalidDataException)); Session().FromNode(SaveNode.OfText("3"), typeof(Tray)); } public void ItemOfTheWrongKind_IsLeftOutAndRecordedAtItsIndex() { SaveNode node = SaveNode.NewList(); node.Items.Add(SaveNode.OfText("1")); node.Items.Add(SaveNode.NewList()); node.Items.Add(SaveNode.OfText("3")); SaveSession session = Session(); CheckEqual(new[] { 1, 3 }, ((Tray)session.FromNode(node, typeof(Tray))).ToArray()); CheckEqual(new[] { "[1]" }, SaveConvertersTests.IssuePaths(session)); } } public class TryListChildrenTests : TestFixture { public void List_ListsEachItemAsTheItemType() { SaveNode node = SaveNode.NewList(); node.Items.Add(SaveNode.OfText("a")); node.Items.Add(SaveNode.OfText("b")); var children = new ChildList(); bool listed = new TrayConverter().TryListChildren(node, children); CheckTrue(listed); CheckEqual(2, children.Count); CheckEqual("b", children.NodeAt(1).Text); CheckEqual(typeof(string), children.TypeAt(1)); } public void NodeThatIsNotAList_ReturnsFalseAndListsNothing() { var children = new ChildList(); CheckFalse(new TrayConverter().TryListChildren(SaveNode.OfText("a"), children)); CheckEqual(0, children.Count); } } } }