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);
}
}
}
}