public void messing_around_with_autoamppers_cloneing_functionality()
        {
            var firstChild = new FlatPropertyBag()
            {
                IntProperty = 4, StringProperty = "I remember this C#..."
            };
            var secondChild = new FlatPropertyBag()
            {
                IntProperty    = 5,
                StringProperty = "deeply nested object initializer nonsense"
            };
            var childList = new List <FlatPropertyBag>()
            {
                firstChild, secondChild
            };

            var sample = new DeepPropertyBag()
            {
                ChildBags = childList,
                DeepChild =
                    new DeepPropertyBag()
                {
                    DeepStringProperty = "Sigh, I wish there were a better way"
                },
                DeepStringProperty = "Newed"
            };

            var clonedViaAutomapper = (DeepPropertyBag)sample.Clone();

            clonedViaAutomapper.Should().NotBeNull();

            //ahh, so automapper doesnt actually perform a deep copy for me unless I create make maps for each child property type.
            clonedViaAutomapper.Should().NotBeSameAs(sample);
            clonedViaAutomapper.DeepChild.Should().NotBeSameAs(sample.DeepChild);
            clonedViaAutomapper.ChildBags.First().Should().BeSameAs(firstChild);
        }
        public void when_undoing_assignment_to_grandchild()
        {
            //setup
            var baseObject = new DeepPropertyBag();
            var childObject = A.Fake<DeepPropertyBag>();
            var targetSite = baseObject.PropertyInfoFor(x => x.DeepChild).GetSetMethod();

            var controller = new PropertyBagVersionController<DeepPropertyBag>(baseObject,
                                                                               _testHelper.MakeConfiguredCloneFactoryFor<DeepPropertyBag>(),
                                                                               TestHelper.ChangeSet(childObject, targetSite, 1),
                                                                               _testHelper.MakeConfiguredVisitorFactory(),
                                                                               _testHelper.MakeConfiguredProxyFactory());
            //act
            TestDelegate act = () => controller.UndoLastAssignmentTo(self => self.DeepChild.DeepStringProperty);

            //assert
            Assert.Throws<UntrackedObjectException>(act);
            A.CallTo(() => childObject.DeepStringProperty).MustNotHaveHappened();
        }
        private IVersionControlledObject MakeChildAndAssociativeMutationTo(DeepPropertyBag parent)
        {
            if (parent == null || ! parent.IsUnderVersionCommand())
                throw new ArgumentException("Must be not null and versioning object.", "parent");

            var existingNode = parent.GetVersionControlNode();
            var child = _testHelper.MakeVersioning<DeepPropertyBag>(existingNode);
            var addChildToParent = new TimestampedPropertyVersionDelta(child, TestHelper.DeepNestedVersioner.SetMethod, _lastVersionNumber++);
            parent.GetVersionControlNode().Mutations.Add(addChildToParent);
            return child;
        }