public void RollbackValueTypes2()
        {
            var viewModel = new TestViewModel();

            Assert.IsNull(viewModel.Name);
            Assert.IsNull(viewModel.Description);
            Assert.AreEqual(0, viewModel.Age);
            Assert.IsFalse(viewModel.IsChanged);
            Assert.IsFalse(viewModel.IsDirty);

            viewModel.Name        = "Kain";
            viewModel.Description = "Refuses sacrifices.";
            viewModel.Age         = 2000;
            Assert.AreEqual("Kain", viewModel.Name);
            Assert.AreEqual("Refuses sacrifices.", viewModel.Description);
            Assert.AreEqual(2000, viewModel.Age);
            Assert.IsTrue(viewModel.IsChanged);
            Assert.IsTrue(viewModel.IsDirty);
            viewModel.AcceptChanges();
            Assert.IsFalse(viewModel.IsChanged);
            Assert.IsTrue(viewModel.IsDirty);

            viewModel.Description = "Does not speak of conscience.";
            viewModel.Age         = 3000;
            Assert.IsTrue(viewModel.IsChanged);
            Assert.IsTrue(viewModel.IsDirty);

            viewModel.RejectChanges();
            Assert.AreEqual("Kain", viewModel.Name);
            Assert.AreEqual("Refuses sacrifices.", viewModel.Description);
            Assert.AreEqual(3000, viewModel.Age);
            Assert.IsFalse(viewModel.IsChanged);
            Assert.IsTrue(viewModel.IsDirty);
        }
        public void RollbackReferenceTypes2()
        {
            var dummy     = new object();
            var viewModel = new TestViewModel();

            Assert.IsNull(viewModel.Dummy);
            Assert.IsFalse(viewModel.IsChanged);
            Assert.IsFalse(viewModel.IsDirty);

            viewModel.Dummy = dummy;
            Assert.AreEqual(dummy, viewModel.Dummy);
            Assert.IsTrue(viewModel.IsChanged);
            Assert.IsTrue(viewModel.IsDirty);
            viewModel.AcceptChanges();
            Assert.IsFalse(viewModel.IsChanged);
            Assert.IsTrue(viewModel.IsDirty);

            viewModel.Dummy = new object();
            Assert.AreNotEqual(dummy, viewModel.Dummy);
            Assert.IsTrue(viewModel.IsChanged);
            Assert.IsTrue(viewModel.IsDirty);

            viewModel.RejectChanges();
            Assert.AreEqual(dummy, viewModel.Dummy);
            Assert.IsFalse(viewModel.IsChanged);
            Assert.IsTrue(viewModel.IsDirty);
        }
        public void RollbackCollection2()
        {
            var kain = new TestViewModel();

            Assert.IsNull(kain.Name);
            Assert.IsNotNull(kain.Children);
            Assert.IsFalse(kain.IsChanged);
            Assert.IsFalse(kain.IsDirty);

            var turel = new TestViewModel {
                Name = "Turel"
            };
            var dumah = new TestViewModel {
                Name = "Dumah"
            };
            var rahab = new TestViewModel {
                Name = "Rahab"
            };
            var zephon = new TestViewModel {
                Name = "Zephon"
            };
            var melchiah = new TestViewModel {
                Name = "Melchiah"
            };

            kain.Name        = "Kain";
            kain.Description = "Traps the essence of life in his abominations.";
            kain.Children.AddRange(new[] { turel, dumah, rahab, zephon, melchiah });

            kain.AcceptChanges();
            Assert.IsFalse(kain.IsChanged);
            Assert.IsTrue(kain.IsDirty);
            Assert.AreEqual(kain, kain.Children[0].ParentViewModel);
            Assert.AreEqual(kain, kain.Children[1].ParentViewModel);
            Assert.AreEqual(kain, kain.Children[2].ParentViewModel);
            Assert.AreEqual(kain, kain.Children[3].ParentViewModel);
            Assert.AreEqual(kain, kain.Children[4].ParentViewModel);
            Assert.IsFalse(kain.Children[0].IsChanged);
            Assert.IsFalse(kain.Children[1].IsChanged);
            Assert.IsFalse(kain.Children[2].IsChanged);
            Assert.IsFalse(kain.Children[3].IsChanged);
            Assert.IsFalse(kain.Children[4].IsChanged);

            kain.Children.Remove(zephon);
            Assert.IsNotNull(kain.Children);
            Assert.AreEqual(4, kain.Children.Count);
            Assert.IsNull(zephon.ParentViewModel);

            kain.RejectChanges();
            Assert.IsNotNull(kain.Children);
            Assert.AreEqual(5, kain.Children.Count);
            Assert.AreEqual(kain, zephon.ParentViewModel);
        }
        public void RollbackChildViewModel2()
        {
            var child = new TestViewModel
            {
                Name        = "Raziel",
                Description = "Is a Time spanned soul."
            };
            var viewModel = new TestViewModel
            {
                Name        = "Kain",
                Description = "Felt the full gravity of choice.",
                Child       = child
            };

            viewModel.Name        = "Kain";
            viewModel.Description = "Felt the full gravity of choice.";
            viewModel.Child       = child;
            Assert.AreEqual(child, viewModel.Child);
            Assert.AreEqual(viewModel, child.ParentViewModel);
            Assert.IsTrue(child.IsChanged);
            Assert.IsTrue(child.IsDirty);
            Assert.IsTrue(viewModel.IsChanged);
            Assert.IsTrue(viewModel.IsDirty);

            viewModel.RejectChanges();
            Assert.IsNull(child.Name);
            Assert.IsNull(child.Description);
            Assert.IsNull(viewModel.Child);
            Assert.IsNull(child.ParentViewModel);
            Assert.IsNull(viewModel.Name);
            Assert.IsNull(viewModel.Description);
            Assert.IsFalse(child.IsChanged);
            Assert.IsTrue(child.IsDirty);
            Assert.IsFalse(viewModel.IsChanged);
            Assert.IsTrue(viewModel.IsDirty);

            child.Name        = "Raziel";
            child.Description = "Is a Time spanned soul.";
            viewModel.Child   = child;
            child.AcceptChanges();
            Assert.IsFalse(child.IsChanged);
            Assert.IsTrue(child.IsDirty);

            viewModel.RejectChanges();
            Assert.AreEqual("Raziel", child.Name);
            Assert.AreEqual("Is a Time spanned soul.", child.Description);
            Assert.IsNull(viewModel.Child);
            Assert.IsNull(child.ParentViewModel);
            Assert.IsFalse(child.IsChanged);
            Assert.IsTrue(child.IsDirty);
        }
        public void SaveRedoCommands()
        {
            var raziel = new TestViewModel
            {
                Name        = "Raziel",
                Description = "Has a dispute to settle."
            };

            raziel.AcceptChanges();
            Assert.IsFalse(raziel.IsChanged);
            Assert.IsTrue(raziel.IsDirty);

            Assert.IsFalse(raziel.Commands[typeof(SaveCommand)].CanExecute(raziel));
            Assert.IsFalse(raziel.Commands[typeof(UndoCommand)].CanExecute(raziel));

            raziel.Name = "Raziel Sarafan";
            Assert.IsTrue(raziel.Commands[typeof(SaveCommand)].CanExecute(raziel));
            Assert.IsTrue(raziel.Commands[typeof(UndoCommand)].CanExecute(raziel));

            raziel.Commands[typeof(UndoCommand)].Execute(raziel);
            Assert.AreEqual("Raziel", raziel.Name);
            Assert.IsFalse(raziel.IsChanged);
            Assert.IsTrue(raziel.IsDirty);
            Assert.IsFalse(raziel.Commands[typeof(SaveCommand)].CanExecute(raziel));
            Assert.IsFalse(raziel.Commands[typeof(UndoCommand)].CanExecute(raziel));

            raziel.Description = "Was spared from total dissolution.";
            Assert.IsTrue(raziel.IsChanged);
            Assert.IsTrue(raziel.IsDirty);
            Assert.IsTrue(raziel.Commands[typeof(SaveCommand)].CanExecute(raziel));
            Assert.IsTrue(raziel.Commands[typeof(UndoCommand)].CanExecute(raziel));

            raziel.Commands[typeof(SaveCommand)].Execute(raziel);
            Assert.AreEqual("Was spared from total dissolution.", raziel.Description);
            Assert.IsFalse(raziel.IsChanged);
            Assert.IsTrue(raziel.IsDirty);
            Assert.IsFalse(raziel.Commands[typeof(SaveCommand)].CanExecute(raziel));
            Assert.IsFalse(raziel.Commands[typeof(UndoCommand)].CanExecute(raziel));
        }
        public void EndEdit()
        {
            var dummy  = new object();
            var raziel = new TestViewModel
            {
                Name = "Raziel",
            };

            raziel.AcceptChanges();
            raziel.Dummy = dummy;

            raziel.BeginEdit();
            Assert.IsTrue(raziel.IsEditing);
            Assert.IsTrue(raziel.IsChanged);
            Assert.IsTrue(raziel.IsDirty);

            raziel.EndEdit();
            Assert.AreEqual("Raziel", raziel.Name);
            Assert.AreEqual(dummy, raziel.Dummy);
            Assert.IsFalse(raziel.IsEditing);
            Assert.IsFalse(raziel.IsChanged);
            Assert.IsTrue(raziel.IsDirty);
        }
        public void BeginEdit()
        {
            var raziel = new TestViewModel
            {
                Name = "Raziel",
            };

            raziel.AcceptChanges();

            Assert.IsFalse(raziel.IsEditing);
            Assert.IsFalse(raziel.IsChanged);
            Assert.IsTrue(raziel.IsDirty);

            raziel.Dummy = new object();
            Assert.IsFalse(raziel.IsEditing);
            Assert.IsTrue(raziel.IsChanged);
            Assert.IsTrue(raziel.IsDirty);

            raziel.BeginEdit();
            Assert.IsTrue(raziel.IsEditing);
            Assert.IsTrue(raziel.IsChanged);
            Assert.IsTrue(raziel.IsDirty);
        }
        public void RollbackCollection3()
        {
            var kain = new TestViewModel();

            Assert.IsNull(kain.Name);
            Assert.IsNotNull(kain.Children);
            Assert.IsFalse(kain.IsChanged);
            Assert.IsFalse(kain.IsDirty);

            var turel = new TestViewModel {
                Name = "Turel"
            };
            var dumah = new TestViewModel {
                Name = "Dumah"
            };
            var rahab = new TestViewModel {
                Name = "Rahab"
            };
            var zephon = new TestViewModel {
                Name = "Zephon"
            };
            var melchiah = new TestViewModel {
                Name = "Melchiah"
            };

            kain.Name        = "Kain";
            kain.Description = "Does not like transgressions.";
            kain.Children.AddRange(new[] { turel, dumah, rahab, zephon, melchiah });

            turel.AcceptChanges();
            Assert.IsTrue(kain.IsChanged);
            Assert.IsTrue(kain.IsDirty);
            Assert.AreEqual(kain, kain.Children[0].ParentViewModel);
            Assert.AreEqual(kain, kain.Children[1].ParentViewModel);
            Assert.AreEqual(kain, kain.Children[2].ParentViewModel);
            Assert.AreEqual(kain, kain.Children[3].ParentViewModel);
            Assert.AreEqual(kain, kain.Children[4].ParentViewModel);
            Assert.IsFalse(kain.Children[0].IsChanged);
            Assert.IsTrue(kain.Children[1].IsChanged);
            Assert.IsTrue(kain.Children[2].IsChanged);
            Assert.IsTrue(kain.Children[3].IsChanged);
            Assert.IsTrue(kain.Children[4].IsChanged);

            turel.Name = "Turel Sarafan";
            Assert.IsTrue(turel.IsChanged);
            Assert.IsTrue(turel.IsDirty);

            kain.RejectChanges();
            Assert.IsNull(kain.Name);
            Assert.IsNull(kain.Children);
            Assert.IsNull(dumah.Name);
            Assert.IsNull(dumah.ParentViewModel);
            Assert.IsNull(rahab.Name);
            Assert.IsNull(rahab.ParentViewModel);
            Assert.IsNull(zephon.Name);
            Assert.IsNull(zephon.ParentViewModel);
            Assert.IsNull(melchiah.Name);
            Assert.IsNull(melchiah.ParentViewModel);

            Assert.AreEqual("Turel", turel.Name);
            Assert.AreEqual(kain, turel.ParentViewModel);
            Assert.IsFalse(turel.IsChanged);
            Assert.IsTrue(turel.IsDirty);
        }