public void MemoryBoundary_CaptureAndRestore_Dictionary()
        {
            var test = new
            {
                Item1 = new ATTi.Core.Collections.KeyValuePair<string, Obj>("Item 1", new Obj(1, "1.1", 1.1)),
                Item2 = new ATTi.Core.Collections.KeyValuePair<string, Obj>("Item 2", new Obj(2, "2.2", 2.2)),
                Item3 = new ATTi.Core.Collections.KeyValuePair<string, Obj>("Item 3", new Obj(3, "3.3", 3.3)),
                Item4 = new ATTi.Core.Collections.KeyValuePair<string, Obj>("Item 1", new Obj(4, "4.4", 4.4)),
                Item5 = new ATTi.Core.Collections.KeyValuePair<string, Obj>("Item 2", new Obj(5, "5.5", 5.5)),
                Item6 = new ATTi.Core.Collections.KeyValuePair<string, Obj>("Item 3", new Obj(6, "6.6", 6.6)),
            };

            Dictionary<string, Obj> items = new Dictionary<string, Obj>();
            items.Add(test.Item1.Key, test.Item1.Value);
            items.Add(test.Item2.Key, test.Item2.Value);
            items.Add(test.Item3.Key, test.Item3.Value);

            using (MemoryBoundary mem = new MemoryBoundary())
            {
                mem.Capture(items);

                Assert.AreEqual(items[test.Item1.Key], test.Item1.Value);
                Assert.AreEqual(items[test.Item2.Key], test.Item2.Value);
                Assert.AreEqual(items[test.Item3.Key], test.Item3.Value);

                items[test.Item4.Key] = test.Item4.Value;
                items[test.Item5.Key] = test.Item5.Value;
                items[test.Item6.Key] = test.Item6.Value;

                Assert.AreNotEqual(items[test.Item1.Key], test.Item1.Value);
                Assert.AreNotEqual(items[test.Item2.Key], test.Item2.Value);
                Assert.AreNotEqual(items[test.Item3.Key], test.Item3.Value);

                Assert.IsTrue(items.Count == 3);
                // Not committed so the dictionary's content will be rolled back.
            }

            Assert.IsTrue(items.Count == 3);

            Assert.AreEqual(items[test.Item1.Key], test.Item1.Value);
            Assert.AreEqual(items[test.Item2.Key], test.Item2.Value);
            Assert.AreEqual(items[test.Item3.Key], test.Item3.Value);
        }
        public void MemoryBoundary_CaptureAndRestore_NoGraph()
        {
            var test = new
            {
                Obj = new Obj(1, "the obj", 2.3d),
                Sub = new Sub(2, "the sub.base", 6.4d, 3, "the sub", null),
                Sub2 = new Sub(4, "the sub.base", 9.4d, 5, "the sub", null),
            };

            Obj obj = test.Obj.Clone();

            using (MemoryBoundary mem = new MemoryBoundary())
            {
                mem.Capture(obj);

                obj.F = test.Sub2.F;
                obj.F1 = test.Sub2.F1;
                obj.F2 = test.Sub2.F2;

                // Assert the object changed...
                Assert.AreEqual(test.Sub2.F, obj.F);
                Assert.AreEqual(test.Sub2.F1, obj.F1);
                Assert.AreEqual(test.Sub2.F2, obj.F2);
                Assert.AreNotEqual(test.Obj.F, obj.F);
                Assert.AreNotEqual(test.Obj.F1, obj.F1);
                Assert.AreNotEqual(test.Obj.F2, obj.F2);

                // Not marking complete, this will cause
                // a rollback of all captured objects...
            }

            // Assert the objects were rolled back...
            Assert.AreEqual(test.Obj.F, obj.F);
            Assert.AreEqual(test.Obj.F1, obj.F1);
            Assert.AreEqual(test.Obj.F2, obj.F2);
        }
        public void MemoryBoundary_CreateAndCommit_WithShallowGraph()
        {
            var test = new
            {
                Obj = new Obj(1, "the obj", 2.3d),
                Sub = new Sub(2, "the sub.base", 6.4d, 3, "the sub", null),
                Sub2 = new Sub(4, "the sub2.base", 9.4d, 5, "the sub2", null),
            };

            Obj obj = test.Obj.Clone();
            Sub sub = (Sub)test.Sub.Clone();
            Sub sub2 = (Sub)test.Sub2.Clone();
            sub2.Owner = test.Obj;

            using (MemoryBoundary mem = new MemoryBoundary())
            {
                mem.Capture(sub2);

                sub2.F = sub.F;
                sub2.F1 = sub.F1;
                sub2.F2 = sub.F2;
                sub2.S = sub.S;
                sub2.S1 = sub.S1;

                // Assert the object changed...
                Assert.AreEqual(test.Sub.F, sub2.F);
                Assert.AreEqual(test.Sub.F1, sub2.F1);
                Assert.AreEqual(test.Sub.F2, sub2.F2);
                Assert.AreEqual(test.Sub.S, sub2.S);
                Assert.AreEqual(test.Sub.S1, sub2.S1);
                Assert.AreNotEqual(test.Sub.Owner, sub2.Owner);

                mem.MarkComplete();
            }

            // Assert the change survived the memory boundary.
            Assert.AreEqual(test.Sub.F, sub2.F);
            Assert.AreEqual(test.Sub.F1, sub2.F1);
            Assert.AreEqual(test.Sub.F2, sub2.F2);
            Assert.AreEqual(test.Sub.S, sub2.S);
            Assert.AreEqual(test.Sub.S1, sub2.S1);
            Assert.AreNotEqual(test.Sub.Owner, sub2.Owner);
        }
        public void MemoryBoundary_CreateAndCommit_NoGraph()
        {
            var test = new
                {
                    Obj = new Obj(1, "the obj", 2.3d),
                    Sub = new Sub(2, "the sub.base", 6.4d, 3, "the sub", null),
                    Sub2 = new Sub(4, "the sub.base 2", 9.4d, 5, "the sub 2", null),
                };

            Obj obj = test.Obj.Clone();

            using (MemoryBoundary mem = new MemoryBoundary())
            {
                mem.Capture(obj);

                obj.F = test.Sub2.F;
                obj.F1 = test.Sub2.F1;
                obj.F2 = test.Sub2.F2;

                mem.MarkComplete();
            }

            Assert.AreEqual(test.Sub2.F, obj.F);
            Assert.AreEqual(test.Sub2.F1, obj.F1);
            Assert.AreEqual(test.Sub2.F2, obj.F2);
        }
 public void MemoryBoundary_CreateAndCommitEmpty()
 {
     using (MemoryBoundary mem = new MemoryBoundary())
     {
         mem.MarkComplete();
     }
 }
        public void MemoryBoundary_CaptureAndRestore_WithShallowRecursiveGraph()
        {
            var test = new
            {
                Obj = new Obj(1, "the obj", 2.3d),
                Sub = new Sub(2, "the sub.base", 6.4d, 3, "the sub", null),
                Sub2 = new Sub(4, "the sub2.base", 9.4d, 5, "the sub2", null),
            };

            Obj obj = test.Obj.Clone();
            Sub sub = (Sub)test.Sub.Clone();
            Sub sub2 = (Sub)test.Sub2.Clone();
            sub.Owner = obj;
            sub2.Owner = sub;

            using (MemoryBoundary mem = new MemoryBoundary())
            {
                mem.Capture(sub2);

                sub2.F = sub.F;
                sub2.F1 = sub.F1;
                sub2.F2 = sub.F2;
                sub2.S = sub.S;
                sub2.S1 = sub.S1;
                sub2.Owner = obj;

                Assert.AreEqual(test.Sub.F, sub2.F);
                Assert.AreEqual(test.Sub.F1, sub2.F1);
                Assert.AreEqual(test.Sub.F2, sub2.F2);
                Assert.AreEqual(test.Sub.S, sub2.S);
                Assert.AreEqual(test.Sub.S1, sub2.S1);
                Assert.AreNotEqual(test.Sub.Owner, sub2.Owner);
                Assert.AreEqual(obj, sub2.Owner);
            }

            Assert.AreNotEqual(test.Sub.F, sub2.F);
            Assert.AreNotEqual(test.Sub.F1, sub2.F1);
            Assert.AreNotEqual(test.Sub.F2, sub2.F2);
            Assert.AreNotEqual(test.Sub.S, sub2.S);
            Assert.AreNotEqual(test.Sub.S1, sub2.S1);
            Assert.AreNotEqual(test.Sub.Owner, sub2.Owner);
            Assert.AreSame(sub, sub2.Owner);
        }
        public void MemoryBoundary_CaptureAndRestore_WithGraphAndPrimitiveArray()
        {
            var test = new
            {
                Obj = new Obj(1, "the obj", 2.3d),
                Sub = new Sub(2, "the sub.base", 6.4d, 3, "the sub", null),
                SubSub = new SubWithPrimitiveArray(4, "the sub2.base", 9.4d, 5, "the sub2", null, 13),
            };

            Obj obj = test.Obj.Clone();
            Sub sub = (Sub)test.Sub.Clone();
            SubWithPrimitiveArray sub2 = (SubWithPrimitiveArray)test.SubSub.Clone();
            sub.Owner = obj;
            sub2.Owner = sub;
            sub2.AddValue(1);
            sub2.AddValue(2);
            sub2.AddValue(3);

            using (MemoryBoundary mem = new MemoryBoundary())
            {
                mem.Capture(sub2);

                sub2.F = sub.F;
                sub2.F1 = sub.F1;
                sub2.F2 = sub.F2;
                sub2.S = sub.S;
                sub2.S1 = sub.S1;
                sub2.Owner = obj;
                sub2.AddValue(4);
                sub2.AddValue(5);

                Assert.AreEqual(test.Sub.F, sub2.F);
                Assert.AreEqual(test.Sub.F1, sub2.F1);
                Assert.AreEqual(test.Sub.F2, sub2.F2);
                Assert.AreEqual(test.Sub.S, sub2.S);
                Assert.AreEqual(test.Sub.S1, sub2.S1);
                Assert.AreNotEqual(test.Sub.Owner, sub2.Owner);
                Assert.AreEqual(5, sub2.Values.Count);
                Assert.AreEqual(1, sub2.Values[0]);
                Assert.AreEqual(2, sub2.Values[1]);
                Assert.AreEqual(3, sub2.Values[2]);
                Assert.AreEqual(4, sub2.Values[3]);
                Assert.AreEqual(5, sub2.Values[4]);
                Assert.AreEqual(obj, sub2.Owner);
            }

            Assert.AreNotEqual(test.Sub.F, sub2.F);
            Assert.AreNotEqual(test.Sub.F1, sub2.F1);
            Assert.AreNotEqual(test.Sub.F2, sub2.F2);
            Assert.AreNotEqual(test.Sub.S, sub2.S);
            Assert.AreNotEqual(test.Sub.S1, sub2.S1);
            Assert.AreEqual(3, sub2.Values.Count);
            Assert.AreEqual(1, sub2.Values[0]);
            Assert.AreEqual(2, sub2.Values[1]);
            Assert.AreEqual(3, sub2.Values[2]);
            Assert.AreNotEqual(test.Sub.Owner, sub2.Owner);
        }
        public void MemoryBoundary_CaptureAndRestore_WithGraphAndListOfObject()
        {
            var test = new
            {
                Obj = new Obj(1, "the obj", 2.3d),
                Sub = new Sub(2, "the sub.base", 6.4d, 3, "the sub", null),
                SubSub = new SubWithListField(4, "the sub2.base", 9.4d, 5, "the sub2", null, 13),
                o = new Obj(),
                o1 = new Obj(),
                o2 = new Obj(),
                o3 = new Obj(),
                o4 = new Obj(),
                o5 = new Obj(),
            };

            Obj obj = test.Obj.Clone();
            Sub sub = (Sub)test.Sub.Clone();
            SubWithListField sub2 = (SubWithListField)test.SubSub.Clone();
            sub.Owner = obj;
            sub2.Owner = sub;
            sub2.Values.Add(test.o1);
            sub2.Values.Add(test.o2);
            sub2.Values.Add(test.o3);

            using (MemoryBoundary mem = new MemoryBoundary())
            {
                mem.Capture(sub2);

                sub2.F = sub.F;
                sub2.F1 = sub.F1;
                sub2.F2 = sub.F2;
                sub2.S = sub.S;
                sub2.S1 = sub.S1;
                sub2.Owner = obj;
                sub2.Values.Add(test.o4);
                sub2.Values.Add(test.o5);

                Assert.AreEqual(test.Sub.F, sub2.F);
                Assert.AreEqual(test.Sub.F1, sub2.F1);
                Assert.AreEqual(test.Sub.F2, sub2.F2);
                Assert.AreEqual(test.Sub.S, sub2.S);
                Assert.AreEqual(test.Sub.S1, sub2.S1);
                Assert.AreNotEqual(test.Sub.Owner, sub2.Owner);
                Assert.AreEqual(5, sub2.Values.Count);
                Assert.AreEqual(test.o1, sub2.Values[0]);
                Assert.AreEqual(test.o2, sub2.Values[1]);
                Assert.AreEqual(test.o3, sub2.Values[2]);
                Assert.AreEqual(test.o4, sub2.Values[3]);
                Assert.AreEqual(test.o5, sub2.Values[4]);
                Assert.AreEqual(obj, sub2.Owner);
            }

            Assert.AreNotEqual(test.Sub.F, sub2.F);
            Assert.AreNotEqual(test.Sub.F1, sub2.F1);
            Assert.AreNotEqual(test.Sub.F2, sub2.F2);
            Assert.AreNotEqual(test.Sub.S, sub2.S);
            Assert.AreNotEqual(test.Sub.S1, sub2.S1);
            Assert.AreEqual(3, sub2.Values.Count);
            Assert.AreEqual(test.o1, sub2.Values[0]);
            Assert.AreEqual(test.o2, sub2.Values[1]);
            Assert.AreEqual(test.o3, sub2.Values[2]);
            Assert.AreNotEqual(test.Sub.Owner, sub2.Owner);
        }