using System; using System.Collections.Generic; using System.IO; using System.Linq; using UnitTestSharp; namespace Vellum.UnitTests { public class SortedListConverterTests : TestFixture { public static SaveSession Session() { return SaveConvertersTests.TestConverters().CreateSession(); } public static SortedList ThroughLuaText( SortedList value) { SaveSession session = Session(); Type type = typeof(SortedList); SaveNode node = SaveConvertersTests.ThroughLuaText(session.ToNode(value, type)); return (SortedList)session.FromNode(node, type); } public class WriteTests : TestFixture { public void Entries_AreAMapUnderEntries() { var value = new SortedList { { "b", 2 }, { "a", 1 } }; SaveNode node = Session().ToNode(value, typeof(SortedList)); CheckEqual(new[] { "a", "b" }, node.RequireEntry("entries").RequireMap().Select(entry => entry.Key.Text).ToArray()); } public void DefaultOrdering_IsLeftOut() { SaveNode node = Session().ToNode(new SortedList(), typeof(SortedList)); CheckEqual(new[] { "entries" }, node.Entries.Keys.ToArray()); } public void NamedOrdering_IsSavedBesideTheEntries() { var value = new SortedList(StringComparer.InvariantCulture); SaveNode node = Session().ToNode(value, typeof(SortedList)); CheckEqual("InvariantCulture", node.RequireEntry("comparer").Text); } public void NullList_IsNull() { CheckEqual(SaveNode.Kinds.Null, Session().ToNode(null, typeof(SortedList)).Kind); } } public class ReadTests : TestFixture { public void ListHoldingItself_ReadsAsAListHoldingItself() { var loaded = (SortedList)new SaveConverters(new SaveConverter[0]) .CreateSession() .FromNode(DictionaryConverterTests.ReadTests.NodeHoldingItself(), typeof(SortedList)); CheckTrue(ReferenceEquals(loaded, loaded["self"])); } public void TextKeys_RoundTrip() { var value = new SortedList { { "b", 2 }, { "a", 1 } }; SortedList loaded = ThroughLuaText(value); CheckEqual(new[] { "a", "b" }, loaded.Keys.ToArray()); CheckEqual(2, loaded["b"]); } public void ConvertedKeys_RoundTrip() { var value = new SortedList { { 5, new Point(1.5, 0) }, { -3, new Point(0, 2) } }; SortedList loaded = ThroughLuaText(value); CheckEqual(new[] { -3, 5 }, loaded.Keys.ToArray()); CheckEqual(1.5, loaded[5].X); } public void Ordering_RoundTrips() { var value = new SortedList(StringComparer.InvariantCultureIgnoreCase) { { "a", 1 } }; SortedList loaded = ThroughLuaText(value); CheckTrue(loaded.Comparer == StringComparer.InvariantCultureIgnoreCase); CheckEqual(1, loaded["A"]); } public void NullForAList_IsNull() { CheckNull(Session().FromNode(SaveNode.Null, typeof(SortedList))); } public void SameKeyTwice_RecordsTheSecond() { SaveNode node = SaveNode.NewTable(); node.Entries["comparer"] = SaveNode.OfText("OrdinalIgnoreCase"); node.Entries["entries"] = SaveNode.NewTable(); node.Entries["entries"].Entries["a"] = SaveNode.OfText("1"); node.Entries["entries"].Entries["A"] = SaveNode.OfText("2"); SaveSession session = Session(); var loaded = (SortedList)session.FromNode(node, typeof(SortedList)); CheckEqual(1, loaded.Count); CheckEqual(1, session.Sandbox.Issues.Count); } } public class TryListChildrenTests : TestFixture { public void EachKeyAndValue_AreListedInPairsAsTheirTypes() { var value = new SortedList { { "a", new Waypoint { Name = "x" } } }; SaveNode node = Session().ToNode(value, typeof(SortedList)); var children = new ChildList(); CheckTrue(new SortedListConverter().TryListChildren(node, children)); IReadOnlyList> pairs = node.RequireEntry("entries").RequireMap(); CheckEqual(2, children.Count); CheckTrue(ReferenceEquals(pairs[0].Key, children.NodeAt(0))); CheckTrue(ReferenceEquals(pairs[0].Value, children.NodeAt(1))); CheckEqual(typeof(Waypoint), children.TypeAt(1)); } public void MissingEntries_ReturnsFalse() { CheckFalse(new SortedListConverter().TryListChildren( SaveNode.NewTable(), new ChildList())); } public void EntriesThatAreNotAMap_ReturnsFalse() { SaveNode node = SaveNode.NewTable(); node.Entries["entries"] = SaveNode.OfText("3"); CheckFalse(new SortedListConverter().TryListChildren(node, new ChildList())); } } public class AllocateTests : TestFixture { public void SavedValue_GivesAnEmptyCollection() { SaveSession session = SaveConvertersTests.Session(); SaveNode node = session.ToNode(new SortedList { { 3, "c" }, { 1, "a" } }); CheckEqual(0, new SortedListConverter().Allocate(node, session).Count); } public void NodeOfTheWrongShape_Throws() { CheckThrow(typeof(InvalidDataException)); new SortedListConverter().Allocate(SaveNode.OfText("3"), SaveConvertersTests.Session()); } } public class FillTests : TestFixture { public void SavedValue_AddsWhatReadLoads() { SaveSession session = SaveConvertersTests.Session(); SaveNode node = session.ToNode(new SortedList { { 3, "c" }, { 1, "a" } }); var converter = new SortedListConverter(); SortedList filled = converter.Allocate(node, session); converter.Fill(filled, node, session); CheckTrue(converter.Read(node, SaveConvertersTests.Session()).SequenceEqual(filled)); } } public class FillNeedsFilledPartTests : TestFixture { public void TheHashedOrSortedType_IsTrue() { CheckTrue(new SortedListConverter().FillNeedsFilledPart(typeof(int))); } public void AnotherType_IsFalse() { CheckFalse(new SortedListConverter().FillNeedsFilledPart(typeof(string))); } } } }