public void SerializeDeserialize()
        {
            var formatter = new CloudFormatter();

            using (var stream = new MemoryStream())
            {
                var test = "hello!";
                formatter.Serialize(test, stream, typeof(string));
                stream.Seek(0, SeekOrigin.Begin);
                Assert.AreEqual(test, formatter.Deserialize(stream, typeof(string)));
                //Console.WriteLine(stream.CanSeek);
            }

            using (var stream = new MemoryStream())
            {
                var test = 123;
                formatter.Serialize(test, stream, typeof(int));
                stream.Seek(0, SeekOrigin.Begin);
                Assert.AreEqual(test, formatter.Deserialize(stream, typeof(int)));
            }

            using (var stream = new MemoryStream())
            {
                var test = new byte[] { 1, 2, 3 };
                formatter.Serialize(test, stream, typeof(int));
                stream.Seek(0, SeekOrigin.Begin);
                CollectionAssert.AreEquivalent(test, (byte[])formatter.Deserialize(stream, typeof(byte[])));
            }

            using (var stream = new MemoryStream())
            {
                var items = new MockComplex[3];

                items[0] = new MockComplex
                {
                    Prop1 = "0",
                    Prop2 = 0,
                    Flags = new List <MockEnum> {
                        MockEnum.Item1
                    },
                    Ignored   = "hi!",
                    InvoiceId = "700",
                    Field     = 0.0F
                };

                items[1] = new MockComplex
                {
                    Prop1 = "1",
                    Prop2 = 1,
                    Flags = new List <MockEnum> {
                        MockEnum.Item2
                    },
                    Ignored   = "hi!",
                    InvoiceId = "800",
                    Field     = 1.0F
                };

                items[2] = new MockComplex
                {
                    Prop1 = "2",
                    Prop2 = 2,
                    Flags = new List <MockEnum> {
                        MockEnum.Item3, MockEnum.Item1
                    },
                    Ignored = "hi!",
                    Field   = 2.0F
                };

                formatter.Serialize(items, stream, items.GetType());
                stream.Seek(0, SeekOrigin.Begin);

                var output = (MockComplex[])formatter.Deserialize(stream, typeof(MockComplex[]));

                Assert.AreEqual(items.Length, output.Length);
                for (int i = 0; i < items.Length; i++)
                {
                    Assert.AreEqual(items[i].Field, output[i].Field);
                    Assert.AreEqual(items[i].Prop1, output[i].Prop1);
                    Assert.AreEqual(items[i].Prop2, output[i].Prop2);
                    CollectionAssert.AreEquivalent(items[i].Flags, output[i].Flags);
                    Assert.IsNull(output[i].Ignored);
                    Assert.AreEqual(items[i].InvoiceId, output[i].InvoiceId);
                }
            }

            using (var stream = new MemoryStream())
            {
                var item = new MockComplex2
                {
                    Prop1 = "0",
                    Prop2 = 0,
                    Flags = new List <MockEnum> {
                        MockEnum.Item1
                    },
                };

                formatter.Serialize(item, stream, item.GetType());
                stream.Seek(0, SeekOrigin.Begin);

                var output = (MockComplex2)formatter.Deserialize(stream, typeof(MockComplex2));

                Assert.AreEqual(item.Prop1, output.Prop1);
                Assert.AreEqual(item.Prop2, output.Prop2);
                Assert.AreEqual(item.Flags.Count, output.Flags.Count);
            }

            // Test "big" object
            using (var stream = new MemoryStream())
            {
                var hugeArray = new double[10000];
                for (int i = 0; i < hugeArray.Length; i++)
                {
                    hugeArray[i] = i;
                }

                formatter.Serialize(hugeArray, stream, hugeArray.GetType());

                stream.Seek(0, SeekOrigin.Begin);
                var output = (double[])formatter.Deserialize(stream, typeof(double[]));

                CollectionAssert.AreEquivalent(hugeArray, output);
            }
        }
        public void UnpackRepack()
        {
            var formatter = new CloudFormatter();

            // STRING
            foreach (var result in ApplyUnpackRepackXml(formatter, "test!"))
            {
                Assert.AreEqual("test!", result, "string");
            }

            // INTEGER
            foreach (var result in ApplyUnpackRepackXml(formatter, 123))
            {
                Assert.AreEqual(123, result, "integer");
            }

            // BYTE ARRAY
            var byteArray = new byte[] { 1, 2, 3 };

            foreach (var result in ApplyUnpackRepackXml(formatter, byteArray))
            {
                CollectionAssert.AreEquivalent(byteArray, result, "byte array");
            }

            // COMPLEX DATA
            var complexInput = new[]
            {
                new MockComplex
                {
                    Prop1 = "0",
                    Prop2 = 0,
                    Flags = new List <MockEnum> {
                        MockEnum.Item1
                    },
                    Ignored   = "hi!",
                    InvoiceId = "700",
                    Field     = 0.0F
                },
                new MockComplex
                {
                    Prop1 = "1",
                    Prop2 = 1,
                    Flags = new List <MockEnum> {
                        MockEnum.Item2
                    },
                    Ignored   = "hi!",
                    InvoiceId = "800",
                    Field     = 1.0F
                },
                new MockComplex
                {
                    Prop1 = "2",
                    Prop2 = 2,
                    Flags = new List <MockEnum> {
                        MockEnum.Item3, MockEnum.Item1
                    },
                    Ignored = "hi!",
                    Field   = 2.0F
                }
            };

            foreach (var result in ApplyUnpackRepackXml(formatter, complexInput))
            {
                Assert.AreEqual(complexInput.Length, result.Length);
                for (int i = 0; i < complexInput.Length; i++)
                {
                    Assert.AreEqual(complexInput[i].Field, result[i].Field);
                    Assert.AreEqual(complexInput[i].Prop1, result[i].Prop1);
                    Assert.AreEqual(complexInput[i].Prop2, result[i].Prop2);
                    CollectionAssert.AreEquivalent(complexInput[i].Flags, result[i].Flags);
                    Assert.IsNull(result[i].Ignored);
                    Assert.AreEqual(complexInput[i].InvoiceId, result[i].InvoiceId);
                }
            }

            // SERIALIZABLE INSTEAD OF DATA CONTRACT
            var serializableInput = new MockComplex2
            {
                Prop1 = "0",
                Prop2 = 0,
                Flags = new List <MockEnum> {
                    MockEnum.Item1
                },
            };

            foreach (var result in ApplyUnpackRepackXml(formatter, serializableInput))
            {
                Assert.AreEqual(serializableInput.Prop1, result.Prop1);
                Assert.AreEqual(serializableInput.Prop2, result.Prop2);
                Assert.AreEqual(serializableInput.Flags.Count, result.Flags.Count);
            }

            // UNTYPED DATA
            var unknownInput = new MockWithObject {
                Generic = DateTime.UtcNow.Second > 30 ? (object)100 : "hello"
            };

            foreach (var result in ApplyUnpackRepackXml(formatter, unknownInput))
            {
                Assert.AreEqual(unknownInput.Generic, result.Generic);
            }
        }