public void DeepMerger_MergeCollections_RemoveCollection()
        {
            DeepMergerTestSection testSection = GetMergedConfig();

            var coll  = testSection.RemoveCollection;
            var test1 = coll.FirstOrDefault(x => x.Name == "removeSame");
            var test2 = coll.FirstOrDefault(x => x.Name == "fullRemove");
            var test3 = coll.FirstOrDefault(x => x.Name == "fullRemoveLower");
            var test4 = coll.FirstOrDefault(x => x.Name == "removedLower");
            var test5 = coll.FirstOrDefault(x => x.Name == "removedLowerWithSpace");

            Assert.IsNotNull(testSection);
            Assert.IsNotNull(coll);
            Assert.AreEqual(3, coll.Count);

            Assert.IsNotNull(test1);
            Assert.AreEqual("test", test1.Value);

            Assert.IsNull(test2);
            Assert.IsNull(test3);

            Assert.IsNotNull(test4);
            Assert.AreEqual("test", test4.Value);

            Assert.IsNotNull(test5);
            Assert.AreEqual("test", test5.Value);
        }
        public void DeepMerger_MergeCollections_ClearCollection()
        {
            DeepMergerTestSection testSection = GetMergedConfig();

            var coll  = testSection.ClearCollection;
            var test1 = coll.FirstOrDefault(x => x.Name == "test1");
            var test2 = coll.FirstOrDefault(x => x.Name == "test2");
            var test3 = coll.FirstOrDefault(x => x.Name == "test3");
            var test4 = coll.FirstOrDefault(x => x.Name == "test4");

            Assert.IsNotNull(testSection);
            Assert.IsNotNull(coll);
            Assert.AreEqual(3, coll.Count);

            Assert.IsNotNull(test1);
            Assert.AreEqual("test", test1.Value);

            Assert.IsNotNull(test2);
            Assert.AreEqual("", test2.Value); // interestingly not null

            Assert.IsNull(test3);

            Assert.IsNotNull(test4);
            Assert.AreEqual("test", test4.Value);
        }
        public void DeepMerger_MergeCollections_SubCollection_NoSideEffects()
        {
            DeepMergerTestSection testSection = GetMergedConfig();

            var coll      = testSection.SubCollection;
            var test1Coll = coll.FirstOrDefault(x => x.Name == "test1");
            var test2Coll = coll.FirstOrDefault(x => x.Name == "test2");
            var test3Coll = coll.FirstOrDefault(x => x.Name == "test3");

            var test2T1 = test2Coll.SubCollection.FirstOrDefault(x => x.Name == "t1");
            var test2T2 = test2Coll.SubCollection.FirstOrDefault(x => x.Name == "t2");
            var test2T4 = test2Coll.SubCollection.FirstOrDefault(x => x.Name == "removed");


            // The collections are all there
            Assert.IsNotNull(testSection);
            Assert.IsNotNull(coll);
            Assert.IsNotNull(test1Coll);
            Assert.IsNotNull(test2Coll);
            Assert.IsNotNull(test3Coll);

            Assert.IsNotNull(test2T1);
            Assert.AreEqual("test2", test2T1.Value);

            Assert.IsNull(test2T2);

            Assert.IsNull(test2T4);
        }
        public void DeepMerger_MergeProperties()
        {
            DeepMergerTestSection testSection = GetMergedConfig();

            Assert.IsNotNull(testSection);
            Assert.AreEqual("override2", testSection.OverriddenProperty.Value);
            Assert.AreEqual("override", testSection.JumpOverProperty.Value);
            Assert.AreEqual("", testSection.NewEmptyProperty.Value);
            Assert.AreEqual("test", testSection.NewNullProperty.Value);
        }
        public void DeepMerger_MergeCollections_SubCollection_Hopping()
        {
            DeepMergerTestSection testSection = GetMergedConfig();

            var coll      = testSection.SubCollection;
            var test3Coll = coll.FirstOrDefault(x => x.Name == "test3");
            var test3T1   = test3Coll.SubCollection.FirstOrDefault(x => x.Name == "t1");

            // The collections are all there
            Assert.IsNotNull(testSection);
            Assert.IsNotNull(coll);
            Assert.IsNotNull(test3Coll);

            Assert.IsNotNull(test3T1);
            Assert.AreEqual("test4", test3T1.Value);
        }