using System.Collections.Generic; using System.Linq; namespace Vellum.UnitTests { public partial class DictionaryObjectKeyTests : UnitTestSharp.TestFixture { [Saveable] public partial class Link { public Link Previous; public Holder Owner; } [Saveable] public partial class Holder { public Dictionary Numbers = new Dictionary(); } public static Holder HolderOfAChain(int length) { var holder = new Holder(); Link previous = null; for (int i = 0; i < length; ++i) { previous = new Link { Previous = previous, Owner = holder }; holder.Numbers.Add(previous, i); } return holder; } public static SaveSession NewSession() { return SaveConverters.For(typeof(DictionaryObjectKeyTests).Assembly).CreateSession(); } public static Holder ThroughText(Holder holder) { SaveNode save = SaveNode.NewTable(); save.Entries["holder"] = NewSession().ToNode(holder); SaveNode parsed = LuaSaveFormat.Parse(LuaSaveFormat.Format(save)); return NewSession().FromNode(parsed.RequireEntry("holder")); } public class TextRoundTripTests : UnitTestSharp.TestFixture { public void KeysLinkedInAChainFarPastTheNestingLimit_SurviveTheText() { Holder loaded = ThroughText(HolderOfAChain(100)); CheckEqual(100, loaded.Numbers.Count); CheckEqual(Enumerable.Range(0, 100).ToArray(), loaded.Numbers.Values.ToArray()); } public void KeysKeepTheirLinks() { Holder loaded = ThroughText(HolderOfAChain(3)); List keys = loaded.Numbers.Keys.ToList(); CheckNull(keys[0].Previous); CheckTrue(ReferenceEquals(keys[0], keys[1].Previous)); CheckTrue(ReferenceEquals(keys[1], keys[2].Previous)); CheckTrue(ReferenceEquals(loaded, keys[2].Owner)); } public void NoEntries_StaysEmpty() { CheckEqual(0, ThroughText(new Holder()).Numbers.Count); } } } }