public void FormatProviderTest(string cultureName)
        {
            // Arrange
            var formatProvider = new CultureInfo(cultureName);
            var serialization  = new DefaultSerialization {
                FormatProvider = formatProvider
            };

            var dummy = new DummyClass
            {
                Number      = 1001,
                SingleClass = new SubClass {
                    Foo = 1.1234f
                }
            };

            // Act
            var encoded      = EntryConvert.EncodeObject(dummy, serialization);
            var dummyDecoded = EntryConvert.CreateInstance <DummyClass>(encoded, serialization);

            // Assert
            Assert.AreEqual(1001.ToString(formatProvider), encoded.SubEntries[0].Value.Current);
            Assert.AreEqual(1.1234f.ToString(formatProvider), encoded.SubEntries[3].SubEntries[0].Value.Current);

            Assert.AreEqual(1001, dummyDecoded.Number);
            Assert.AreEqual(1.1234f, dummyDecoded.SingleClass.Foo);
        }
        public void UpdatePrimitiveList()
        {
            // Arrange
            var defaultSerialization = new DefaultSerialization {
                FormatProvider = new CultureInfo("en-US")
            };

            var dummy = new ListDummy
            {
                Number     = 0,
                DoubleList = new List <double> {
                    1.7, 2.5, 3
                },
                EnumList = new List <DummyEnum> {
                    DummyEnum.ValueA, DummyEnum.Unset, DummyEnum.ValueB
                }
            };

            var encoded = EntryConvert.EncodeObject(dummy, defaultSerialization);
            var ent     = encoded.SubEntries[1];
            var ent2    = encoded.SubEntries[2];

            // Act
            encoded.SubEntries[0].Value.Current = "5";
            ent.SubEntries[1].Value.Current     = 12.34d.ToString(defaultSerialization.FormatProvider);
            var newInstance = ent.Prototypes[0].Instantiate();

            newInstance.Value.Current = 133.7d.ToString(defaultSerialization.FormatProvider);
            ent.SubEntries.Add(newInstance);

            ent2.SubEntries[1].Value.Current = "ValueB";
            newInstance = ent2.Prototypes[0].Instantiate();
            newInstance.Value.Current = "ValueA";
            ent2.SubEntries.Add(newInstance);

            EntryConvert.UpdateInstance(dummy, encoded, defaultSerialization);

            // Assert
            Assert.AreEqual(5, dummy.Number);
            Assert.AreEqual(4, dummy.DoubleList.Count);
            Assert.AreEqual(1.7, dummy.DoubleList[0]);
            Assert.AreEqual(12.34, dummy.DoubleList[1]);
            Assert.AreEqual(3.0, dummy.DoubleList[2]);
            Assert.AreEqual(133.7, dummy.DoubleList[3]);

            Assert.AreEqual(4, dummy.EnumList.Count);
            Assert.AreEqual(DummyEnum.ValueA, dummy.EnumList[0]);
            Assert.AreEqual(DummyEnum.ValueB, dummy.EnumList[1]);
            Assert.AreEqual(DummyEnum.ValueB, dummy.EnumList[2]);
            Assert.AreEqual(DummyEnum.ValueA, dummy.EnumList[3]);
        }
        public void CreateInstance()
        {
            // Arrange
            var defaultSerialization = new DefaultSerialization();
            var encoded = EntryConvert.EncodeClass(typeof(DummyClass), defaultSerialization);

            // Act
            encoded.SubEntries[0].Value.Current = "10";
            encoded.SubEntries[1].Value.Current = "Thomas";
            encoded.SubEntries[3].SubEntries[1].Value.Current = encoded.SubEntries[3].SubEntries[1].Value.Possible[2];
            for (var i = 4; i < 7; i++)
            {
                var colEntry = encoded.SubEntries[i];
                for (var j = 0; j < i; j++)
                {
                    var newInstance = colEntry.Prototypes[0].Instantiate();
                    newInstance.SubEntries[0].Value.Current = j.ToString("F2", defaultSerialization.FormatProvider);
                    newInstance.SubEntries[1].Value.Current = newInstance.SubEntries[1].Value.Possible[1];
                    colEntry.SubEntries.Add(newInstance);
                }
            }
            var obj = EntryConvert.CreateInstance <DummyClass>(encoded);

            // Assert
            Assert.AreEqual(10, obj.Number);
            Assert.AreEqual("Thomas", obj.Name);
            Assert.AreEqual(DummyEnum.ValueB, obj.SingleClass.Enum);
            var colAssert = new[] { CollectionType.Array, CollectionType.List, CollectionType.Enumerable };

            for (var i = 0; i < colAssert.Length; i++)
            {
                var length     = 4 + i;
                var collection = ExtractCollection(colAssert[i], obj);
                Assert.AreEqual(length, collection.Count);

                if (colAssert[i] == CollectionType.Dictionary)
                {
                }
                else
                {
                    var array = (collection as IEnumerable <SubClass>).ToArray();
                    for (var j = 0; j < length; j++)
                    {
                        Assert.AreEqual((float)j, array[j].Foo);
                        Assert.AreEqual(DummyEnum.ValueA, array[j].Enum);
                    }
                }
            }
        }
        public void AddEntry(CollectionType type, int prefill, int newValues)
        {
            // Arrange
            var defaultSerialization = new DefaultSerialization();
            var obj     = Prebuild(type, prefill);
            var encoded = EntryConvert.EncodeObject(obj, defaultSerialization);

            // Act
            var colEntry = CollectionEntry(encoded.SubEntries, type);

            if (type == CollectionType.Dictionary)
            {
                for (var i = 1; i <= newValues; i++)
                {
                    var newInstance = colEntry.Prototypes[0].Instantiate();
                    // change "Key" + 10
                    newInstance.DisplayName = (prefill + i).ToString();
                    // change "Value"
                    newInstance.SubEntries[0].Value.Current = (prefill + i).ToString("F2", defaultSerialization.FormatProvider);
                    newInstance.SubEntries[1].Value.Current = newInstance.SubEntries[1].Value.Possible[2];

                    colEntry.SubEntries.Add(newInstance);
                }
            }
            else
            {
                for (var i = 1; i <= newValues; i++)
                {
                    var newInstance = colEntry.Prototypes[0].Instantiate();
                    newInstance.SubEntries[0].Value.Current = (prefill + i).ToString();
                    newInstance.SubEntries[1].Value.Current = newInstance.SubEntries[1].Value.Possible[2];
                    colEntry.SubEntries.Add(newInstance);
                }
            }

            EntryConvert.UpdateInstance(obj, encoded);

            // Assert
            var collection = ExtractCollection(type, obj);
            var totalSize  = prefill + newValues;

            Assert.AreEqual(totalSize, collection.Count, "New size invalid");

            if (type == CollectionType.Dictionary)
            {
                var array = (collection as IEnumerable <KeyValuePair <int, SubClass> >).ToArray();
                for (var i = 0; i < totalSize; i++)
                {
                    Assert.AreEqual((float)i + 1, array[i].Key, "Key not set!");
                    Assert.AreEqual((float)i + 1, array[i].Value.Foo, "Value not set!");
                    var expectedEnum = i < prefill ? DummyEnum.ValueA : DummyEnum.ValueB;
                    Assert.AreEqual(expectedEnum, array[i].Value.Enum, "Enum not set");
                }
            }
            else
            {
                var array = (collection as IEnumerable <SubClass>).ToArray();
                for (var i = 0; i < totalSize; i++)
                {
                    Assert.AreEqual((float)i + 1, array[i].Foo, "Value not set!");
                    var expectedEnum = i < prefill ? DummyEnum.ValueA : DummyEnum.ValueB;
                    Assert.AreEqual(expectedEnum, array[i].Enum, "Enum not set");
                }
            }
        }