public void Alter()
        {
            //var dict2 = new Dictionary<string, object>();
            //var x = dict2["abc"];

            var testObj = new TypedObject();
            var dict = new PropertyDictionaryAdapter(testObj);
            dict.Options.CanAlterProperties = false;

            Assert.Throws<InvalidOperationException>(() =>
            {
                dict["newprop"] = "newdata";
            }, "Can't add a prop");

            Assert.Throws<InvalidOperationException>(() =>
            {
                dict.Remove("Stringprop");
            }, "Can't add a prop");

            // These are OK to do
            dict["stringprop"] = "stringdata";

            dict.Options.CanAlterProperties = true;

            dict["newprop"] = "newdata";
            Assert.AreEqual("newdata",dict["Newprop"]);

            Assert.IsTrue(dict.ContainsKey("stringprop"));
            dict.Remove("Stringprop");
            Assert.IsFalse(dict.ContainsKey("stringprop"));
        }
        public void Contains()
        {
            var testObj = new TypedObject();
            var dict = new PropertyDictionaryAdapter(testObj);

            var intArray = new int[] {1,2,3};
            testObj.IntArray = intArray;
            Assert.IsTrue(dict.Contains(new KeyValuePair<string,object>("IntArray",intArray)));
            Assert.IsFalse(dict.Contains(new KeyValuePair<string,object>("IntArray",new int[] {1,2,3})));
        }
        public void Clear()
        {
            var testObj = new TypedObject();
            var dict = new PropertyDictionaryAdapter(testObj);
            testObj.StringField = "changed";

            Assert.AreEqual("changed", dict["stringfield"],"Propert of underlying object affected by a change to dict");

            dict.Clear();
            Assert.AreEqual(0, dict.Count);
            dict["stringfield"] = "string data";

            Assert.AreEqual("changed", testObj.StringField,"Same-named property no longer affects object after a clear");
            Assert.AreEqual("string data", dict["stringfield"], "Same-named property no longer affects object after a clear");
        }
        public void Add()
        {
            var testObj = new TypedObject();
            var dict = new PropertyDictionaryAdapter(testObj);

            Assert.AreEqual(13, dict.Count);

            dict["stringfield"] = "New string data";
            Assert.AreEqual(13, dict.Count);
            Assert.AreEqual("New string data", dict["Stringfield"]);
            Assert.AreEqual("New string data", testObj.StringField);

            dict["MyNewProp"] = "added data";
            Assert.AreEqual(14, dict.Count);
            Assert.AreEqual("added data", dict["mynewprop"]);
        }
        public void WrapperBasic()
        {
            var testObj = new TypedObject
            {
                StringProp="quick brown fox",
                IntArray =new int[] { 1, 2, 4, 8 },
                DoubleProp = 3.14,
                StringList =  new List<string> { "a","b","c" }

            };
            var dict = new PropertyDictionaryAdapter(testObj);

            Assert.AreEqual("quick brown fox", dict["StringProp"]);
            Assert.AreEqual(4, ((int[])dict["IntArray"])[2]);
            Assert.AreEqual(3.14, dict["DoubleProp"]);
            Assert.AreEqual("b", ((IList<string>)dict["StringList"])[1]);
        }
        public void Updating()
        {
            var testObj = new TypedObject();
            var dict = new PropertyDictionaryAdapter(testObj);

            Assert.AreEqual(0d, testObj.DoubleProp);
            dict["doubleprop"] = 3.14;
            Assert.AreEqual(3.14, testObj.DoubleProp);

            Assert.Throws<InvalidCastException>(() =>
            {
                dict["doubleprop"] = "abc";
            }, "Can't assign bad data type");
        }
        public void Parse()
        {
            var testObj = new TypedObject();
            var dict = new PropertyDictionaryAdapter(testObj);
            dict.Options.ParseValues = true;

            dict["doubleprop"] = "3.14";
            Assert.AreEqual(3.14d, testObj.DoubleProp);
            dict["boolprop"] = "false";
            Assert.AreEqual(false, testObj.BoolProp);
        }
        public void ContainsKey()
        {
            var testObj = new TypedObject();
            var dict = new PropertyDictionaryAdapter(testObj);

            Assert.IsTrue(dict.ContainsKey("stringprop"));
            Assert.IsFalse(dict.ContainsKey("random"));

            dict["random"] = "12adkla";
            Assert.IsTrue(dict.ContainsKey("random"));
            Assert.IsTrue(dict.Keys.Contains("random"));
        }