public void VerifyParamDelegates()
        {
            bool getCalled = false;
            bool setCalled = false;
            var  cset      = new MockConfigSet();

            cset.GetParamDelegate = (int key, out object value) =>
            {
                Assert.AreEqual(42, key);
                getCalled = true;
                value     = null;
                return(false);
            };
            cset.SetParamDelegate = (int key, object value) =>
            {
                Assert.AreEqual(42, key);
                Assert.AreEqual(value, "test");
                setCalled = true;
            };

            Assert.AreEqual(default(string), cset.Param1);
            cset.Param1 = "test";
            Assert.IsTrue(getCalled);
            Assert.IsTrue(setCalled);

            // Test the indexer
            getCalled = false;
            Assert.AreEqual(default(string), cset[42]);
            Assert.IsTrue(getCalled);
        }
        public void MergeBasic()
        {
            var cset1 = new MockConfigSet()
            {
                Param1 = "1",
            };
            var cset2 = new MockConfigSet()
            {
                Param2 = 2,
            };

            // Basic merge
            cset1.Merge(cset2); // no conflicst, different params are defined
            Assert.AreEqual(2, cset1.Param2);
            cset1.Merge(cset2); // no conflicts, params have same values
        }
        public void MergeKeepExisting()
        {
            var cset1 = new MockConfigSet()
            {
                Param2 = 1,
            };
            var cset2 = new MockConfigSet()
            {
                Param1 = "2",
                Param2 = 2,
            };

            cset1.Merge(cset2, MergeRules.KeepExisting);
            Assert.AreEqual("2", cset1.Param1);
            Assert.AreEqual(1, cset1.Param2);
        }
        public void MergeOverwrite()
        {
            var cset1 = new MockConfigSet()
            {
                Param2 = 1,
            };
            var cset2 = new MockConfigSet()
            {
                Param1 = "2",
                Param2 = 2,
            };

            cset1.Merge(cset2, MergeRules.Overwrite);
            Assert.AreEqual("2", cset1.Param1);
            Assert.AreEqual(2, cset1.Param2);
        }
        public void MergeDifferentTypes()
        {
            var cset1 = new MockConfigSet()
            {
                Param1 = "1",
                Param2 = 1,
            };
            var cset2 = new AnotherMockConfigSet()
            {
                Param1 = "1",
                Param2 = 2,
            };

            cset1.Merge(cset2); // Param1 shouldn't conflict, Param2 shouldn't be overwritten
            cset1.Merge(cset2, MergeRules.Overwrite);
            Assert.AreEqual(1, cset1.Param2);
        }
        public void MergeConflicting()
        {
            var cset1 = new MockConfigSet()
            {
                Param2 = 1,
            };
            var cset2 = new MockConfigSet()
            {
                Param1 = "2",
                Param2 = 2,
            };

            try
            {
                cset1.Merge(cset2);
                Assert.Fail("ConfigSetMergeException expected !");
            }
            catch (ConfigSetMergeException)
            {
                // Esnure that cset1 isn't modified in a conflicting merge
                Assert.IsNull(cset1.Param1);
            }
        }