using System; using System.Collections.Generic; using System.IO; using System.Linq; using UnitTestSharp; namespace Vellum.UnitTests { public class SortedSetConverterTests : TestFixture { public static SaveSession Session() { return SaveConvertersTests.TestConverters().CreateSession(); } public class WriteTests : TestFixture { public void Set_IsATableOfItsItemsInOrder() { SaveNode node = Session().ToNode(new SortedSet { 3, 1, 2 }, typeof(SortedSet)); CheckEqual(SaveNode.Kinds.Table, node.Kind); CheckEqual(new[] { "1", "2", "3" }, node.RequireEntry("items").Items.Select(item => item.Text).ToArray()); } public void DefaultOrdering_IsLeftOut() { SaveNode node = Session().ToNode(new SortedSet { "a" }, typeof(SortedSet)); CheckEqual(new[] { "items" }, node.Entries.Keys.ToArray()); } public void NamedOrdering_IsSavedBesideTheItems() { var value = new SortedSet(StringComparer.OrdinalIgnoreCase) { "a" }; SaveNode node = Session().ToNode(value, typeof(SortedSet)); CheckEqual("OrdinalIgnoreCase", node.RequireEntry("comparer").Text); } public void OrderingThatCantBeSaved_Throws() { var value = new SortedSet(StringComparer.CurrentCulture) { "a" }; CheckThrow(typeof(NotSupportedException)); Session().ToNode(value, typeof(SortedSet)); } public void NullSet_IsNull() { CheckEqual(SaveNode.Kinds.Null, Session().ToNode(null, typeof(SortedSet)).Kind); } } public class ReadTests : TestFixture { public void SetHoldingItself_ReadsAsASetHoldingItself() { SaveNode node = SaveNode.NewTable(); SaveNode items = SaveNode.NewList(); items.Items.Add(node); node.Entries[HashSetConverter.ItemsKey] = items; var loaded = (SortedSet)new SaveConverters(new SaveConverter[0]) .CreateSession() .FromNode(node, typeof(SortedSet)); CheckTrue(ReferenceEquals(loaded, loaded.Min)); } public void Set_RoundTrips() { SaveSession session = Session(); SaveNode node = session.ToNode(new SortedSet { 3, 1, 2 }, typeof(SortedSet)); var loaded = (SortedSet)session.FromNode(node, typeof(SortedSet)); CheckEqual(new[] { 1, 2, 3 }, loaded.ToArray()); } public void Ordering_RoundTrips() { SaveSession session = Session(); var value = new SortedSet(StringComparer.OrdinalIgnoreCase) { "b", "A" }; SaveNode node = session.ToNode(value, typeof(SortedSet)); var loaded = (SortedSet)session.FromNode(node, typeof(SortedSet)); CheckEqual(new[] { "A", "b" }, loaded.ToArray()); CheckTrue(loaded.Contains("B")); } public void SetThroughLuaText_RoundTrips() { SaveSession session = Session(); var value = new SortedSet { "b", "a" }; SaveNode node = SaveConvertersTests.ThroughLuaText(session.ToNode(value, typeof(SortedSet))); var loaded = (SortedSet)session.FromNode(node, typeof(SortedSet)); CheckEqual(new[] { "a", "b" }, loaded.ToArray()); } public void NullForASet_IsNull() { CheckNull(Session().FromNode(SaveNode.Null, typeof(SortedSet))); } public void SameItemTwice_RecordsTheSecond() { SaveNode node = SaveNode.NewTable(); node.Entries["items"] = SavedItems.ToNode(new[] { 1, 2, 1 }, Session()); SaveSession session = Session(); var loaded = (SortedSet)session.FromNode(node, typeof(SortedSet)); CheckEqual(2, loaded.Count); CheckEqual(1, session.Sandbox.Issues.Count); } public void MissingItems_Throws() { CheckThrow(typeof(InvalidDataException)); Session().FromNode(SaveNode.NewTable(), typeof(SortedSet)); } } public class TryListChildrenTests : TestFixture { public void EachItem_IsListedAsTheItemType() { SaveNode node = Session().ToNode(new SortedSet { "b", "a" }, typeof(SortedSet)); var children = new ChildList(); CheckTrue(new SortedSetConverter().TryListChildren(node, children)); CheckEqual(2, children.Count); CheckTrue(ReferenceEquals(node.RequireEntry("items").Items[0], children.NodeAt(0))); CheckEqual(typeof(string), children.TypeAt(1)); } public void MissingItems_ReturnsFalse() { CheckFalse(new SortedSetConverter().TryListChildren(SaveNode.NewTable(), new ChildList())); } public void ItemsThatAreNotAList_ReturnsFalse() { SaveNode node = SaveNode.NewTable(); node.Entries["items"] = SaveNode.OfText("3"); CheckFalse(new SortedSetConverter().TryListChildren(node, new ChildList())); } } public class AllocateTests : TestFixture { public void SavedValue_GivesAnEmptyCollection() { SaveSession session = SaveConvertersTests.Session(); SaveNode node = session.ToNode(new SortedSet { 3, 1, 2 }); CheckEqual(0, new SortedSetConverter().Allocate(node, session).Count); } public void NodeOfTheWrongShape_Throws() { CheckThrow(typeof(InvalidDataException)); new SortedSetConverter().Allocate(SaveNode.OfText("3"), SaveConvertersTests.Session()); } } public class FillTests : TestFixture { public void SavedValue_AddsWhatReadLoads() { SaveSession session = SaveConvertersTests.Session(); SaveNode node = session.ToNode(new SortedSet { 3, 1, 2 }); var converter = new SortedSetConverter(); SortedSet 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 SortedSetConverter().FillNeedsFilledPart(typeof(int))); } public void AnotherType_IsFalse() { CheckFalse(new SortedSetConverter().FillNeedsFilledPart(typeof(string))); } } } }