Exemple #1
0
    public static void RunCollectionApplyTest()
    {
        var start = new CollectionHolder();

        start.dict["foo1"] = "bar1";
        start.dict["foo2"] = "bar2";
        start.list         = new List <int> {
            1, 2
        };
        start.arr = new[] { true, false };

        var end = new CollectionHolder();

        end.dict["foo1"] = "baz";
        end.list         = new List <int> {
            1, 3, 4
        };
        end.arr = new bool[] { };

        // Compute in-memory representation.
        var startModel = new SavedObject(start);
        var endModel   = new SavedObject(end);

        // Compute differental.
        var delta = new SavedObjectDelta(startModel, endModel);

        // Apply differental.
        delta.ApplyChanges(ref end);

        // Compare.
        CollectionAssert.AreEqual(start.dict, end.dict);
        CollectionAssert.AreEqual(start.list, end.list);
        CollectionAssert.AreEqual(start.arr, end.arr);
    }
Exemple #2
0
    public static void RunSimpleApplyTest()
    {
        var start = new SimpleObject {
            a      = 1,
            b      = 2,
            nested = new SimpleObject {
                a = 3,
                b = 4
            }
        };

        var end = new SimpleObject {
            a = 2,
            b = 2
        };

        var startModel = new SavedObject(start);
        var endModel   = new SavedObject(end);
        var delta      = new SavedObjectDelta(startModel, endModel);

        delta.ApplyChanges(ref end);

        Assert.AreEqual(end.a, start.a);
        Assert.AreEqual(end.b, start.b);
        Assert.AreEqual(end.nested.a, start.nested.a);
        Assert.AreEqual(end.nested.b, start.nested.b);
        Assert.AreEqual(end.nested.nested, start.nested.nested);
    }
    public static void ChangeInstanceType()
    {
        var start = new HostObject {
            nested = new DerivedObject {
                c = 5
            }
        };

        var end = new HostObject {
            nested = new SimpleObject {
                a = 1,
                b = 2
            }
        };

        var startModel = new SavedObject(start);
        var endModel = new SavedObject(end);

        var delta = new SavedObjectDelta(startModel, endModel);
        delta.ApplyChanges(ref end);

        Assert.AreEqual(start.nested.GetType(), end.nested.GetType());
        Assert.AreEqual(start.nested.a, end.nested.a);
        Assert.AreEqual(start.nested.b, end.nested.b);
        Assert.AreEqual(((DerivedObject)start.nested).c, ((DerivedObject)end.nested).c);
    }
Exemple #4
0
    public static void ChangeInstanceType()
    {
        var start = new HostObject {
            nested = new DerivedObject {
                c = 5
            }
        };

        var end = new HostObject {
            nested = new SimpleObject {
                a = 1,
                b = 2
            }
        };

        var startModel = new SavedObject(start);
        var endModel   = new SavedObject(end);

        var delta = new SavedObjectDelta(startModel, endModel);

        delta.ApplyChanges(ref end);

        Assert.AreEqual(start.nested.GetType(), end.nested.GetType());
        Assert.AreEqual(start.nested.a, end.nested.a);
        Assert.AreEqual(start.nested.b, end.nested.b);
        Assert.AreEqual(((DerivedObject)start.nested).c, ((DerivedObject)end.nested).c);
    }
Exemple #5
0
    public static void RunCollectionTest()
    {
        var obj = new CollectionHolder();

        obj.dict["foo1"] = "bar1";
        obj.dict["foo2"] = "bar2";
        obj.list.Add(1);
        obj.list.Add(2);
        obj.arr    = new[] { true, false };
        obj.nested = new CollectionHolder();
        obj.nested.dict["nested1"] = "ack1";
        obj.nested.arr             = new[] { true };

        Dictionary <ObjectDataPath[], object> model         = new SavedObject(obj).state;
        Dictionary <string, object>           readableModel = SavedObjectDelta.ReadableModel(model);

        // TODO: If list is null, we will include it, but if it is empty we will
        //       not

        Assert.AreEqual(11, readableModel.Count);
        Assert.AreEqual(obj.GetType(), readableModel["GetType()"]);
        Assert.AreEqual("bar1", readableModel["dict.foo1"]);
        Assert.AreEqual("bar2", readableModel["dict.foo2"]);
        Assert.AreEqual(1, readableModel["list.0"]);
        Assert.AreEqual(2, readableModel["list.1"]);
        Assert.AreEqual(true, readableModel["arr.0"]);
        Assert.AreEqual(false, readableModel["arr.1"]);
        Assert.AreEqual(obj.nested.GetType(), readableModel["nested:GetType()"]);
        Assert.AreEqual("ack1", readableModel["nested:dict.nested1"]);
        Assert.AreEqual(true, readableModel["nested:arr.0"]);
        Assert.AreEqual(null, readableModel["nested:nested"]);
    }
    public static void ApplyEnum()
    {
        var before = new EnumHolder { enumValue = EnumHolder.EnumValue.A };
        var after = new EnumHolder { enumValue = EnumHolder.EnumValue.B };

        var delta = new SavedObjectDelta(new SavedObject(after),
                                         new SavedObject(before));
        delta.ApplyChanges(ref before);

        Assert.AreEqual(after.enumValue, before.enumValue);
    }
Exemple #7
0
    public static void ApplyVector3()
    {
        var previous = Vector3.zero;
        var current  = Vector3.one;

        var delta = SavedObjectDelta.FromObjects(current, previous);

        delta.ApplyChanges(ref previous);

        Assert.AreEqual(current, previous);
    }
Exemple #8
0
    public static void ChangeInstanceTypeToNull()
    {
        var before = new HostObject()
        {
            nested = new DerivedObject()
        };
        var after = new HostObject();

        var delta = SavedObjectDelta.FromObjects(after, before);

        delta.ApplyChanges(ref before);

        Assert.AreEqual(after.nested, before.nested);
    }
Exemple #9
0
        public static void ShowInspectorForSerializedObject(UnityObject[] targets)
        {
            CheckForNewBaseBehaviorType(targets[0].GetType());
            DrawOpenScriptButton(targets[0]);

            // TODO: How do we show a mixed value?
            // TODO: We could have a global call of some sort?
            // TODO: We have the edit path w.r.t. metadata, so we can compute the
            //       deltas at the start and then export it as a list which
            //       property editors can check against.

            // Capture object state if we are doing multi-object editing.
            var preeditState = new SavedObject();

            if (fiSettings.EnableMultiEdit && targets.Length > 1)
            {
                preeditState = new SavedObject(targets[0]);
            }

            // Run the editor
            BehaviorEditor.Get(targets[0].GetType()).EditWithGUILayout(targets[0]);

            // Inspector for the serialized state
            var inspectedObject = targets[0] as ISerializedObject;

            if (inspectedObject != null)
            {
                EditorGUI.BeginChangeCheck();
                DrawSerializedState(inspectedObject);
                if (EditorGUI.EndChangeCheck())
                {
                    EditorUtility.SetDirty(targets[0]);
                    inspectedObject.RestoreState();
                }
            }

            // Apply changes to other objects that are being edited.
            if (fiSettings.EnableMultiEdit && targets.Length > 1)
            {
                var posteditState = new SavedObject(targets[0]);
                var delta         = new SavedObjectDelta(posteditState, preeditState);
                for (int i = 1; i < targets.Length; ++i)
                {
                    UnityObject obj = targets[i];
                    delta.ApplyChanges(ref obj);
                }
            }
        }
Exemple #10
0
    public static void ApplyEnum()
    {
        var before = new EnumHolder {
            enumValue = EnumHolder.EnumValue.A
        };
        var after = new EnumHolder {
            enumValue = EnumHolder.EnumValue.B
        };

        var delta = new SavedObjectDelta(new SavedObject(after),
                                         new SavedObject(before));

        delta.ApplyChanges(ref before);

        Assert.AreEqual(after.enumValue, before.enumValue);
    }
Exemple #11
0
    public static void ApplyNestedStruct()
    {
        var current = new StructA {
            a = 2, structB = new StructB {
                b = 3
            }
        };
        var previous = new StructA {
            a = 1, structB = new StructB {
                b = 1
            }
        };

        var delta = SavedObjectDelta.FromObjects(current, previous);

        delta.ApplyChanges(ref previous);

        Assert.AreEqual(current, previous);
    }
        public static void ShowInspectorForSerializedObject(UnityObject[] targets)
        {
            CheckForNewBaseBehaviorType(targets[0].GetType());
            DrawOpenScriptButton(targets[0]);

            // TODO: How do we show a mixed value?
            // TODO: We could have a global call of some sort?
            // TODO: We have the edit path w.r.t. metadata, so we can compute the
            //       deltas at the start and then export it as a list which
            //       property editors can check against.

            // Capture object state if we are doing multi-object editing.
            var preeditState = new SavedObject();
            if (fiSettings.EnableMultiEdit && targets.Length > 1)
                preeditState = new SavedObject(targets[0]);

            // Run the editor
            BehaviorEditor.Get(targets[0].GetType()).EditWithGUILayout(targets[0]);

            // Inspector for the serialized state
            var inspectedObject = targets[0] as ISerializedObject;
            if (inspectedObject != null) {
                EditorGUI.BeginChangeCheck();
                DrawSerializedState(inspectedObject);
                if (EditorGUI.EndChangeCheck()) {
                    EditorUtility.SetDirty(targets[0]);
                    inspectedObject.RestoreState();
                }
            }

            // Apply changes to other objects that are being edited.
            if (fiSettings.EnableMultiEdit && targets.Length > 1) {
                var posteditState = new SavedObject(targets[0]);
                var delta = new SavedObjectDelta(posteditState, preeditState);
                for (int i = 1; i < targets.Length; ++i) {
                    UnityObject obj = targets[i];
                    delta.ApplyChanges(ref obj);
                }
            }
        }
Exemple #13
0
    public static void SimpleIntegrationExample()
    {
        var inspected = new SimpleObject()
        {
            a = 1,
            b = 2
        };
        var previousState = new SavedObject(inspected);

        inspected.a = 5;

        var currentState = new SavedObject(inspected);

        var delta = new SavedObjectDelta(currentState, previousState);

        var hello = new SimpleObject();

        delta.ApplyChanges(ref hello);

        Assert.AreEqual(5, hello.a);
        Assert.AreEqual(0, hello.b);
    }
Exemple #14
0
    public static void CheckReadableModelIncludesInstances()
    {
        var model = new SimpleObject {
            a      = 1,
            b      = 2,
            nested = new SimpleObject {
                a = 3,
                b = 4
            }
        };

        Dictionary <string, object> readable = SavedObjectDelta.ReadableModel(new SavedObject(model).state);

        Assert.AreEqual(7, readable.Count);
        Assert.AreEqual(model.GetType(), readable["GetType()"]);
        Assert.AreEqual(model.a, readable["a"]);
        Assert.AreEqual(model.b, readable["b"]);
        Assert.AreEqual(model.nested.GetType(), readable["nested:GetType()"]);
        Assert.AreEqual(model.nested.a, readable["nested:a"]);
        Assert.AreEqual(model.nested.b, readable["nested:b"]);
        Assert.AreEqual(model.nested.nested, readable["nested:nested"]);
    }
Exemple #15
0
    public static void RunFieldPropertyTest()
    {
        var obj = new SimpleObject {
            a      = 1,
            b      = 2,
            nested = new SimpleObject {
                a = 3,
                b = 4
            }
        };
        Dictionary <ObjectDataPath[], object> model         = new SavedObject(obj).state;
        Dictionary <string, object>           readableModel = SavedObjectDelta.ReadableModel(model);

        Assert.AreEqual(7, readableModel.Count);
        Assert.AreEqual(obj.GetType(), readableModel["GetType()"]);
        Assert.AreEqual(1, readableModel["a"]);
        Assert.AreEqual(2, readableModel["b"]);
        Assert.AreEqual(obj.nested.GetType(), readableModel["nested:GetType()"]);
        Assert.AreEqual(3, readableModel["nested:a"]);
        Assert.AreEqual(4, readableModel["nested:b"]);
        Assert.AreEqual(null, readableModel["nested:nested"]);
    }
Exemple #16
0
    public static void TestApplyMissingProperty()
    {
        var start = new DerivedObject {
            a = 1,
            b = 2,
            c = 3
        };
        var end = new DerivedObject {
            a = 2,
            b = 2,
            c = 5
        };
        var delta = new SavedObjectDelta(new SavedObject(start), new SavedObject(end));

        var simpleObj = new SimpleObject()
        {
            b = 20
        };

        delta.ApplyChanges(ref simpleObj);

        Assert.AreEqual(start.a, simpleObj.a);
        Assert.AreEqual(20, simpleObj.b);
    }
Exemple #17
0
    public static void CycleTest()
    {
        // TODO: This needs to be fixed. The cyclic object should appear in the
        //       dict.
        Debug.LogError("Fix CycleTest to include cycled object");

        var obj = new SimpleObject();

        obj.a      = 1;
        obj.b      = 2;
        obj.nested = obj;

        Dictionary <ObjectDataPath[], object> model         = new SavedObject(obj).state;
        Dictionary <string, object>           readableModel = SavedObjectDelta.ReadableModel(model);

        Assert.AreEqual(3, readableModel.Count);
        Assert.AreEqual(obj.GetType(), readableModel["GetType()"]);
        Assert.AreEqual(obj.a, readableModel["a"]);
        Assert.AreEqual(obj.b, readableModel["b"]);
        //Assert.AreEqual(obj.nested, readableModel["nested"]);

        // Also test vectors, which are cyclic on normalized
        new SavedObject(new Vector3(1, 1, 1));
    }
    public static void RunSimpleApplyTest()
    {
        var start = new SimpleObject {
            a = 1,
            b = 2,
            nested = new SimpleObject {
                a = 3,
                b = 4
            }
        };

        var end = new SimpleObject {
            a = 2,
            b = 2
        };

        var startModel = new SavedObject(start);
        var endModel = new SavedObject(end);
        var delta = new SavedObjectDelta(startModel, endModel);

        delta.ApplyChanges(ref end);

        Assert.AreEqual(end.a, start.a);
        Assert.AreEqual(end.b, start.b);
        Assert.AreEqual(end.nested.a, start.nested.a);
        Assert.AreEqual(end.nested.b, start.nested.b);
        Assert.AreEqual(end.nested.nested, start.nested.nested);
    }
    public static void SimpleIntegrationExample()
    {
        var inspected = new SimpleObject() {
            a = 1,
            b = 2
        };
        var previousState = new SavedObject(inspected);

        inspected.a = 5;

        var currentState = new SavedObject(inspected);

        var delta = new SavedObjectDelta(currentState, previousState);

        var hello = new SimpleObject();
        delta.ApplyChanges(ref hello);

        Assert.AreEqual(5, hello.a);
        Assert.AreEqual(0, hello.b);
    }
    public static void TestApplyMissingProperty()
    {
        var start = new DerivedObject {
            a = 1,
            b = 2,
            c = 3
        };
        var end = new DerivedObject {
            a = 2,
            b = 2,
            c = 5
        };
        var delta = new SavedObjectDelta(new SavedObject(start), new SavedObject(end));

        var simpleObj = new SimpleObject() {
            b = 20
        };
        delta.ApplyChanges(ref simpleObj);

        Assert.AreEqual(start.a, simpleObj.a);
        Assert.AreEqual(20, simpleObj.b);
    }
    public static void RunCollectionApplyTest()
    {
        var start = new CollectionHolder();
        start.dict["foo1"] = "bar1";
        start.dict["foo2"] = "bar2";
        start.list = new List<int> { 1, 2 };
        start.arr = new[] { true, false };

        var end = new CollectionHolder();
        end.dict["foo1"] = "baz";
        end.list = new List<int> { 1, 3, 4 };
        end.arr = new bool[] { };

        // Compute in-memory representation.
        var startModel = new SavedObject(start);
        var endModel = new SavedObject(end);

        // Compute differental.
        var delta = new SavedObjectDelta(startModel, endModel);

        // Apply differental.
        delta.ApplyChanges(ref end);

        // Compare.
        CollectionAssert.AreEqual(start.dict, end.dict);
        CollectionAssert.AreEqual(start.list, end.list);
        CollectionAssert.AreEqual(start.arr, end.arr);
    }