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_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_CreateAndCommitEmpty()
 {
     using (MemoryBoundary mem = new MemoryBoundary())
     {
         mem.MarkComplete();
     }
 }