public void UndoNestedChanges()
        {
            BindableWrapper<ComplexBusinessObject> bindableObj =
            new BindableWrapper<ComplexBusinessObject>(new ComplexBusinessObject());

            SimpleBusinessObject sbo1 = new SimpleBusinessObject();
            sbo1.Name = "sbo1";
            SimpleBusinessObject sbo2 = new SimpleBusinessObject();
            sbo2.Name = "sbo2";

            bindableObj.Data.BusinessObj.NestedObject = sbo1;
            Assert.AreEqual(bindableObj.Data.BusinessObj.NestedObject.Name, sbo1.Name);

            bindableObj.Data.BusinessObj.NestedObject = sbo2;
            Assert.AreEqual(bindableObj.Data.BusinessObj.NestedObject.Name, sbo2.Name);

            bindableObj.Undo();

            // As the nested object is not intercepted undo does not have any effect
            Assert.AreEqual(bindableObj.Data.BusinessObj.NestedObject.Name, sbo2.Name);

            // the nested object is not IBindableWrapper so changes on its internal properties are not intercepted
            bindableObj.Data.BusinessObj.NestedObject.Name = "whatever";
            bindableObj.Data.BusinessObj.NestedObject.Name = "somethingelse";
        }
        public void UndoRedoNestedChanges()
        {
            BindableWrapper<ComplexBusinessObject> bindableObj =
            new BindableWrapper<ComplexBusinessObject>(new ComplexBusinessObject());

            SimpleBusinessObject sbo1 = new SimpleBusinessObject();
            sbo1.Name = "sbo1";
            SimpleBusinessObject sbo2 = new SimpleBusinessObject();
            sbo2.Name = "sbo2";

            bindableObj.Data.BusinessObj.NestedObject = sbo1;
            Assert.AreEqual(bindableObj.Data.BusinessObj.NestedObject.Name, sbo1.Name);

            bindableObj.Data.BusinessObj.NestedObject = sbo2;
            Assert.AreEqual(bindableObj.Data.BusinessObj.NestedObject.Name, sbo2.Name);

            bindableObj.Undo();

            Assert.AreEqual(bindableObj.Data.BusinessObj.NestedObject.Name, sbo2.Name);

            bindableObj.Redo();
            Assert.AreEqual(bindableObj.Data.BusinessObj.NestedObject.Name, sbo2.Name);
        }
        public void UndoRedoChangesSIC()
        {
            BindableWrapper<SimpleIndexedClass> bindableObj =
            new BindableWrapper<SimpleIndexedClass>(new SimpleIndexedClass());

            bindableObj.Data.BusinessObj["test"] = 1;

            bindableObj.Data.BusinessObj["test"] = 2;

            bindableObj.Data.BusinessObj.Code = "asdf";
            bindableObj.Data.BusinessObj.Code = "12345";

            bindableObj.Undo();

            Assert.AreEqual(bindableObj.Data.BusinessObj["test"], 2);
            Assert.AreEqual(bindableObj.Data.BusinessObj.Code, "asdf");

            bindableObj.Redo();

            Assert.AreEqual(bindableObj.Data.BusinessObj["test"], 2);
            Assert.AreEqual(bindableObj.Data.BusinessObj.Code, "12345");
        }
        public void UndoRedoChangesSOBCP()
        {
            BindableWrapper<SimpleObjectComplexProperties> bindableObj =
            new BindableWrapper<SimpleObjectComplexProperties>(new SimpleObjectComplexProperties());
            bindableObj.Data.BusinessObj.Code = "asdf";
            bindableObj.Data.BusinessObj.Ages[1]  = 0;
            bindableObj.Data.BusinessObj.Names = new System.Collections.Generic.List<string>();
            bindableObj.Data.BusinessObj.Names.Add("test");

            bindableObj.Data.BusinessObj.Ages[1] = 80;
            Assert.AreEqual(bindableObj.Data.BusinessObj.Ages[1], 80);

            bindableObj.Undo();

            Assert.AreEqual(bindableObj.Data.BusinessObj.Ages[1], 80);

            bindableObj.Redo();

            Assert.AreEqual(bindableObj.Data.BusinessObj.Ages[1], 80);
        }
        public void UndoChangesSOVT()
        {
            BindableWrapper<SimpleObjectValueTypes> bindableObj =
            new BindableWrapper<SimpleObjectValueTypes>(new SimpleObjectValueTypes());

            bindableObj.Data.BusinessObj.Boolean = false;
            bindableObj.Data.BusinessObj.Char = 'a';
            bindableObj.Data.BusinessObj.Double = 100;
            bindableObj.Data.BusinessObj.Float = 100;
            bindableObj.Data.BusinessObj.Enum = SimpleEnum.line1;
            bindableObj.Data.BusinessObj.Integer = 5;
            bindableObj.Data.BusinessObj.Struct = new SimpleStruct();

            Assert.AreEqual(bindableObj.Data.BusinessObj.Boolean, false);
            Assert.AreEqual(bindableObj.Data.BusinessObj.Char, 'a');
            Assert.AreEqual(bindableObj.Data.BusinessObj.Double, 100);
            Assert.AreEqual(bindableObj.Data.BusinessObj.Float, 100);
            Assert.AreEqual(bindableObj.Data.BusinessObj.Enum, SimpleEnum.line1);
            Assert.AreEqual(bindableObj.Data.BusinessObj.Integer, 5);
            //Assert.AreEqual(bindableObj.Data.BusinessObj.Struct._int1, 1);

            bindableObj.Data.BusinessObj.Boolean = true;
            bindableObj.Undo();
            Assert.AreEqual(bindableObj.Data.BusinessObj.Boolean, false);

            bindableObj.Data.BusinessObj.Char = 'b';
            bindableObj.Undo();
            Assert.AreEqual(bindableObj.Data.BusinessObj.Char, 'a');

            bindableObj.Data.BusinessObj.Double = 200;
            bindableObj.Undo();
            Assert.AreEqual(bindableObj.Data.BusinessObj.Double, 100);

            bindableObj.Data.BusinessObj.Float = 200;
            bindableObj.Undo();
            Assert.AreEqual(bindableObj.Data.BusinessObj.Float, 100);

            bindableObj.Data.BusinessObj.Enum = SimpleEnum.line2;
            bindableObj.Undo();
            Assert.AreEqual(bindableObj.Data.BusinessObj.Enum, SimpleEnum.line1);

            bindableObj.Data.BusinessObj.Integer = 7;
            bindableObj.Undo();
            Assert.AreEqual(bindableObj.Data.BusinessObj.Integer, 5);
        }
        public void UndoRedoChangesSBO()
        {
            BindableWrapper<SimpleBusinessObject> bindableObj =
            new BindableWrapper<SimpleBusinessObject>(new SimpleBusinessObject());
            bindableObj.Data.BusinessObj.Name = "asdf";
            bindableObj.Data.BusinessObj.Description = "asdfsdf";
            bindableObj.Data.BusinessObj.Age = 25;

            bindableObj.Data.BusinessObj.Name = "qwerty";
            Assert.AreEqual(bindableObj.Data.BusinessObj.Name, "qwerty");

            bindableObj.Undo();
            Assert.AreEqual(bindableObj.Data.BusinessObj.Name, "asdf");

            bindableObj.Redo();
            Assert.AreEqual(bindableObj.Data.BusinessObj.Name, "qwerty");
        }
        public void UndoChangesSOCP()
        {
            BindableWrapper<SimpleObjectComplexProperties> bindableObj =
            new BindableWrapper<SimpleObjectComplexProperties>(new SimpleObjectComplexProperties());
            bindableObj.Data.BusinessObj.Code = "asdf";
            bindableObj.Data.BusinessObj.Ages[3] = 777;
            bindableObj.Data.BusinessObj.Names = new System.Collections.Generic.List<string>();
            bindableObj.Data.BusinessObj.Names.Add("test");

            bindableObj.Data.BusinessObj.Code = "change";
            bindableObj.Data.BusinessObj.Ages[3] = 22;
            Assert.AreEqual(bindableObj.Data.BusinessObj.Code, "change");
            Assert.AreEqual(bindableObj.Data.BusinessObj.Ages[3], 22);
            bindableObj.Undo();
            Assert.AreEqual(bindableObj.Data.BusinessObj.Code, "asdf");
            // array is not intercepted so it does not change
            Assert.AreEqual(bindableObj.Data.BusinessObj.Ages[3], 22);
            Assert.IsTrue(bindableObj.Data.BusinessObj.Names.Contains("test")); // no undo for this as it is not intercepted

            bindableObj.Data.BusinessObj.Ages[3] = 22;
            bindableObj.Data.BusinessObj.Ages[3] = 25;
            bindableObj.Undo();
            Assert.AreEqual(bindableObj.Data.BusinessObj.Ages[3], 25); // not intercepted so nothing to undo
        }
        public void UndoChangesSIC()
        {
            BindableWrapper<SimpleIndexedClass> bindableObj =
            new BindableWrapper<SimpleIndexedClass>(new SimpleIndexedClass());

            bindableObj.Data.BusinessObj["test"] = 1;

            bindableObj.Data.BusinessObj["test"] = 2;

            Assert.AreEqual(bindableObj.Data.BusinessObj["test"], 2);

            bindableObj.Undo();

            // changes in the objects within the collection are not intercepted so no undo changes
            Assert.AreEqual(bindableObj.Data.BusinessObj["test"], 2);
        }
        public void UndoChangesSGO()
        {
            BindableWrapper<SimpleGenericObject<string>> bindableObj =
            new BindableWrapper<SimpleGenericObject<string>>(new SimpleGenericObject<string>());

            bindableObj.Data.BusinessObj.GenericArray = new string[] { "test1", "test2" };
            bindableObj.Data.BusinessObj.GenericArray[0] = "test3";
            bindableObj.Data.BusinessObj.Code = "code1";
            bindableObj.Data.BusinessObj.Code = "code2";
            Assert.AreEqual(bindableObj.Data.BusinessObj.Code, "code2");
            bindableObj.Undo();
            Assert.AreEqual(bindableObj.Data.BusinessObj.Code, "code1");
            // changes in array elements are not intercepted
            Assert.AreEqual(bindableObj.Data.BusinessObj.GenericArray[0], "test3");
        }
        public void UndoChangesSBONoInterception()
        {
            BindableWrapper<SimpleBusinessObject> bindableObj =
            new BindableWrapper<SimpleBusinessObject>(new SimpleBusinessObject(), true);
            bindableObj.Data.BusinessObj.Name = "asdf";
            bindableObj.Data.BusinessObj.Description = "asdfsdf";
            bindableObj.Data.BusinessObj.Age = 25;

            bindableObj.Data.BusinessObj.Name = "qwerty";
            Assert.AreEqual(bindableObj.Data.BusinessObj.Name, "qwerty");

            bindableObj.Undo();
            Assert.AreEqual(bindableObj.Data.BusinessObj.Name, "qwerty"); // no changes, no interception
        }
        public void ObjectReferencesOnUndo()
        {
            BindableWrapper<SimpleBusinessObject> bindableReference;
            SimpleBusinessObject businessObjReference;

            SimpleBusinessObject businessObj = new SimpleBusinessObject();
            businessObjReference = businessObj;

            BindableWrapper<SimpleBusinessObject> bindableObj =
            new BindableWrapper<SimpleBusinessObject>(businessObj);
            bindableReference = bindableObj;

            bindableObj.Data.BusinessObj.Name = "asdf";
            bindableObj.Data.BusinessObj.Description = "asdfsdf";
            bindableObj.Data.BusinessObj.Age = 25;

            bindableObj.Data.BusinessObj.Name = "qwerty";

            Assert.AreEqual(bindableObj.Data.BusinessObj.Name, "qwerty");
            Assert.AreEqual(bindableReference.Data.BusinessObj.Name, "qwerty");
            Assert.IsNull(businessObjReference.Name);

            bindableObj.Undo();

            Assert.AreEqual(bindableObj.Data.BusinessObj.Name, "asdf");
            Assert.AreEqual(bindableReference.Data.BusinessObj.Name, "asdf");
            Assert.IsNull(businessObjReference.Name);
        }