public void Merge_WithComplexPriority_ShouldWork()
        {
            var opt1 = new FlexibleOptions();

            opt1.Set("k1", "v1");
            opt1.Set("k2", "v2");
            opt1.Set("k3", "v3");

            opt1.SetAlias("k3", "3", "key3");

            var opt2 = new FlexibleOptions();

            opt2.Set("k2", "v2.2");

            var opt3 = new FlexibleOptions();

            opt3.Set("k3", "v3.3");

            // opt1 has lower priority
            var merge = FlexibleOptions.Merge(opt1, opt2, opt3);

            Assert.NotNull(merge);
            Assert.Equal(opt1.Get("k1"), merge.Get("k1"));
            Assert.Equal(opt2.Get("k2"), merge.Get("k2"));
            Assert.Equal(opt3.Get("k3"), merge.Get("k3"));
            // alias
            Assert.Equal(opt3.Get("k3"), merge.Get("key3"));
            Assert.Equal(opt3.Get("k3"), merge.Get("3"));

            // opt1 has higher priority
            merge = FlexibleOptions.Merge(opt2, opt3, opt1);
            Assert.NotNull(merge);
            Assert.Equal(opt1.Get("k1"), merge.Get("k1"));
            Assert.NotEqual(opt2.Get("k2"), merge.Get("k2"));
            Assert.NotEqual(opt3.Get("k3"), merge.Get("k3"));
            Assert.Equal(opt1.Get("k2"), merge.Get("k2"));
            Assert.Equal(opt1.Get("k3"), merge.Get("k3"));
            // alias
            Assert.Equal(opt1.Get("k3"), merge.Get("key3"));
            Assert.Equal(opt1.Get("k3"), merge.Get("3"));

            // opt1 has higher priority but with null options
            merge = FlexibleOptions.Merge(null, opt2, null, opt3, opt1, null);
            Assert.NotNull(merge);
            Assert.Equal(opt1.Get("k1"), merge.Get("k1"));
            Assert.NotEqual(opt2.Get("k2"), merge.Get("k2"));
            Assert.NotEqual(opt3.Get("k3"), merge.Get("k3"));
            Assert.Equal(opt1.Get("k2"), merge.Get("k2"));
            Assert.Equal(opt1.Get("k3"), merge.Get("k3"));
            // alias
            Assert.Equal(opt1.Get("k3"), merge.Get("key3"));
            Assert.Equal(opt1.Get("k3"), merge.Get("3"));
        }
        public void SetAlias_AllowCaseInsensitiveGet_ShouldWork()
        {
            var expected = "v3";

            var opt1 = new FlexibleOptions();

            opt1.Set("k3", expected);

            opt1.SetAlias("k3", "3", "key3");

            Assert.Equal(expected, opt1.Get("K3"));
            Assert.Equal(expected, opt1.Get("KEY3"));
        }
        public void SetAlias_AllowGet_ShouldWork()
        {
            var expected = "v3";

            var opt1 = new FlexibleOptions ();
            opt1.Set ("k3", expected);
            
            opt1.SetAlias ("k3", "3", "key3");

            Assert.Equal (expected, opt1.Get ("k3"));
            Assert.Equal (expected, opt1.Get ("key3"));
            Assert.Equal (expected, opt1.Get ("3"));
            Assert.True (String.IsNullOrEmpty (opt1.Get ("KEY")));
        }
        public void SetAlias_AllowGet_ShouldWork()
        {
            var expected = "v3";

            var opt1 = new FlexibleOptions();

            opt1.Set("k3", expected);

            opt1.SetAlias("k3", "3", "key3");

            Assert.Equal(expected, opt1.Get("k3"));
            Assert.Equal(expected, opt1.Get("key3"));
            Assert.Equal(expected, opt1.Get("3"));
            Assert.True(String.IsNullOrEmpty(opt1.Get("KEY")));
        }
        public void Merge_WithComplexPriority_ShouldWork ()
        {
            var opt1 = new FlexibleOptions ();
            opt1.Set ("k1", "v1");
            opt1.Set ("k2", "v2");
            opt1.Set ("k3", "v3");

            opt1.SetAlias ("k3", "3", "key3");

            var opt2 = new FlexibleOptions ();
            opt2.Set ("k2", "v2.2");

            var opt3 = new FlexibleOptions ();
            opt3.Set ("k3", "v3.3");

            // opt1 has lower priority
            var merge = FlexibleOptions.Merge (opt1, opt2, opt3);
            Assert.NotNull (merge);
            Assert.Equal (opt1.Get ("k1"), merge.Get ("k1"));
            Assert.Equal (opt2.Get ("k2"), merge.Get ("k2"));
            Assert.Equal (opt3.Get ("k3"), merge.Get ("k3"));
            // alias
            Assert.Equal (opt3.Get ("k3"), merge.Get ("key3"));
            Assert.Equal (opt3.Get ("k3"), merge.Get ("3"));

            // opt1 has higher priority
            merge = FlexibleOptions.Merge (opt2, opt3, opt1);
            Assert.NotNull (merge);
            Assert.Equal (opt1.Get ("k1"), merge.Get ("k1"));
            Assert.NotEqual (opt2.Get ("k2"), merge.Get ("k2"));
            Assert.NotEqual (opt3.Get ("k3"), merge.Get ("k3"));
            Assert.Equal (opt1.Get ("k2"), merge.Get ("k2"));
            Assert.Equal (opt1.Get ("k3"), merge.Get ("k3"));
            // alias
            Assert.Equal (opt1.Get ("k3"), merge.Get ("key3"));
            Assert.Equal (opt1.Get ("k3"), merge.Get ("3"));

            // opt1 has higher priority but with null options
            merge = FlexibleOptions.Merge (null, opt2, null, opt3, opt1, null);
            Assert.NotNull (merge);
            Assert.Equal (opt1.Get ("k1"), merge.Get ("k1"));
            Assert.NotEqual (opt2.Get ("k2"), merge.Get ("k2"));
            Assert.NotEqual (opt3.Get ("k3"), merge.Get ("k3"));
            Assert.Equal (opt1.Get ("k2"), merge.Get ("k2"));
            Assert.Equal (opt1.Get ("k3"), merge.Get ("k3"));
            // alias
            Assert.Equal (opt1.Get ("k3"), merge.Get ("key3"));
            Assert.Equal (opt1.Get ("k3"), merge.Get ("3"));
        }
        public void SetAlias_AllowCaseInsensitiveGet_ShouldWork ()
        {
            var expected = "v3";

            var opt1 = new FlexibleOptions ();
            opt1.Set ("k3", expected);

            opt1.SetAlias ("k3", "3", "key3");

            Assert.Equal (expected, opt1.Get ("K3"));
            Assert.Equal (expected, opt1.Get ("KEY3"));            
        }