public void DoNotMerge()
        {
            Dictionary <string, object> responseA = GetResponseA();
            Dictionary <string, object> responseB = GetResponseB();

            ResponseMergeUtil merger = new ResponseMergeUtil();

            merger.AddFieldMerger("fieldInBoth", ResponseMergeUtil.DoNotMergeIfExists);

            Dictionary <string, object> merged = merger.Merge(responseA, responseB);

            Assert.AreEqual("i am a", merged["fieldInBoth"], "Did not merge when existed");
            Assert.AreEqual(33, merged["fieldOnlyInB"], "Merged when did not exist");
        }
        public void MergeListsConcat()
        {
            Dictionary <string, object> responseA = GetResponseA();
            Dictionary <string, object> responseB = GetResponseB();

            ResponseMergeUtil merger = new ResponseMergeUtil();

            merger.AddFieldMerger("fieldHasList", ResponseMergeUtil.MergeListsConcat);

            Dictionary <string, object> merged = merger.Merge(responseA, responseB);

            Assert.AreEqual(2, ((List <object>)merged["fieldHasList"]).Count, "Has two elements");
            Assert.AreEqual(0, ((List <object>)merged["fieldHasList"])[0], "First value was correct");
            Assert.AreEqual(1, ((List <object>)merged["fieldHasList"])[1], "Second value was correct");
        }
        public void CustomFieldMerger()
        {
            Dictionary <string, object> responseA = GetResponseA();
            Dictionary <string, object> responseB = GetResponseB();

            ResponseMergeUtil merger = new ResponseMergeUtil();

            merger.AddFieldMerger("fieldInBoth", (string field, Dictionary <string, object> into, Dictionary <string, object> dataA, Dictionary <string, object> dataB) => {
                into[field] = (string)dataA[field] + (string)dataB[field];
            });

            Dictionary <string, object> merged = merger.Merge(responseA, responseB);

            Assert.AreEqual("i am ai am b", merged["fieldInBoth"], "Custom merger worked");
        }
        public void TestNestedMerge()
        {
            Dictionary <string, object> responseA = GetResponseA();
            Dictionary <string, object> responseB = GetResponseB();

            ResponseMergeUtil merger = new ResponseMergeUtil();

            merger.AddObjectMerger("fieldHasDictionary", new ResponseMergeUtil());

            Dictionary <string, object> merged = merger.Merge(responseA, responseB);

            Assert.AreEqual(3, merged["fieldOnlyInA"], "Brought in field from A");
            Assert.AreEqual("i am b", merged["fieldInBoth"], "Overwrote field in A from B");
            Assert.IsFalse(Object.ReferenceEquals(responseA["fieldHasDictionary"], merged["fieldHasDictionary"]), "Created a new nested object that was not responseA");
            Assert.IsFalse(Object.ReferenceEquals(responseB["fieldHasDictionary"], merged["fieldHasDictionary"]), "Created a new nested object that was not responseB");
        }
        public void TestDefaultMerge()
        {
            Dictionary <string, object> responseA = GetResponseA();
            Dictionary <string, object> responseB = GetResponseB();

            ResponseMergeUtil merger = new ResponseMergeUtil();

            Dictionary <string, object> merged = merger.Merge(responseA, responseB);

            Assert.IsFalse(Object.ReferenceEquals(responseA, merged));
            Assert.IsFalse(Object.ReferenceEquals(responseB, merged));
            Assert.AreNotEqual(responseA, merged, "The merged dictionary is not responseA");
            Assert.AreNotEqual(responseB, merged, "The merged dictionary is not responseB");
            Assert.AreEqual(3, merged["fieldOnlyInA"], "Brought in field from A");
            Assert.AreEqual("i am b", merged["fieldInBoth"], "Overwrote field in A from B");
            Assert.AreEqual(1, ((List <int>)merged["fieldHasList"])[0], "Overwrote field in A from B that is a list");
            Assert.AreEqual("monkey", ((Dictionary <string, object>)merged["fieldHasDictionary"])["keyA"], "Overwrote field in A from B that is a list");
            Assert.IsTrue(Object.ReferenceEquals(responseB["fieldHasDictionary"], merged["fieldHasDictionary"]));
        }