public void when_using_explicit_setter_on_new_object()
        {
            //setup
            var baseObject = TestHelper.CreateWithNonDefaultProperties<FlatPropertyBag>();
            var controller = new PropertyBagVersionController<FlatPropertyBag>(baseObject,
                                                                            _testHelper.MakeConfiguredCloneFactoryFor<FlatPropertyBag>(),
                                                                            _testHelper.EmptyChangeSet(),
                                                                            _testHelper.MakeConfiguredVisitorFactory(),
                                                                            _testHelper.MakeConfiguredProxyFactory());
            const string changedValue = "Change!";

            //act
            controller.Set(baseObject.PropertyInfoFor(x => x.StringProperty), changedValue, 1);

            //assert
            controller.Mutations.Should().ContainSingle(mutation => mutation.Arguments.Single().Equals(changedValue));
        }
        public void when_using_explicit_setter_on_object_with_history()
        {
            //setup
            var baseObject = TestHelper.CreateWithNonDefaultProperties<FlatPropertyBag>();
            var targetSite = baseObject.PropertyInfoFor(x => x.StringProperty).GetSetMethod();
            var changeSet = TestHelper.ChangeSet("Original", targetSite, 1L, isActive:false);
            var controller = new PropertyBagVersionController<FlatPropertyBag>(baseObject,
                                                                            _testHelper.MakeConfiguredCloneFactoryFor<FlatPropertyBag>(),
                                                                            changeSet,
                                                                            _testHelper.MakeConfiguredVisitorFactory(),
                                                                            _testHelper.MakeConfiguredProxyFactory());
            const string changedValue = "Change!";

            //act
            controller.Set(targetSite.GetParentProperty(), changedValue, 2L);

            //assert
            controller.Mutations.Should().ContainSingle(mutation => mutation.Arguments.Single().Equals(changedValue));
            controller.Mutations.Should().HaveCount(1);
        }
        public void when_redoing_delta_thats_been_trashed()
        {
            var baseObject = TestHelper.CreateWithNonDefaultProperties<FlatPropertyBag>();
            var targetSite = baseObject.PropertyInfoFor(x => x.StringProperty).GetSetMethod();

            var controller = new PropertyBagVersionController<FlatPropertyBag>(baseObject,
                                                                               _testHelper.MakeConfiguredCloneFactoryFor<FlatPropertyBag>(),
                                                                               TestHelper.ChangeSet("undone value", targetSite, 1L, isActive: false),
                                                                               _testHelper.MakeConfiguredVisitorFactory(),
                                                                               _testHelper.MakeConfiguredProxyFactory());
            //act
            controller.Set(targetSite.GetParentProperty(), "New Value", 2L);
            TestDelegate act = () => controller.RedoLastAssignmentTo(x => x.StringProperty);

            //assert
            Assert.Throws<VersionDeltaNotFoundException>(act);
            A.CallTo(() => _testHelper.ProvidedVisitorFactory.MakeDeltaApplicationVisitor(ChangeType.Unknown, false, null))
             .WithAnyArguments()
             .MustNotHaveHappened();
        }