public void ResourceReferenceExpressionBaseTest()
        {
            FrameworkElement root = new FrameworkElement();
            FrameworkElement child1 = new FrameworkElement();
            FrameworkElement child2 = new FrameworkElement();

            child1.AddVisualChild(child2);

            int testValueChanged = 0;
            child2.PropertyChanged += (sender, e) => testValueChanged += e.Property == TestValueProperty ? 1 : 0;

            child2.SetValue(TestValueProperty, new ResourceReferenceExpressionProvider("key1"));

            Assert.AreEqual("default", child2.GetValue(TestValueProperty));
            Assert.AreEqual(0, testValueChanged);

            root.Resources = new ResourceDictionary();
            root.Resources.Add("key1", "value1");
            root.AddVisualChild(child1);

            Assert.AreEqual("value1", child2.GetValue(TestValueProperty));
            Assert.AreEqual(1, testValueChanged);

            root.Resources.Remove("key1");

            Assert.AreEqual("default", child2.GetValue(TestValueProperty));
            Assert.AreEqual(2, testValueChanged);

            ResourceDictionary dictionary = new ResourceDictionary();
            dictionary.Add("key1", "value2");

            root.Resources.MergedDictionaries.Add(dictionary);

            Assert.AreEqual("value2", child2.GetValue(TestValueProperty));
            Assert.AreEqual(3, testValueChanged);

            child1.Resources = new ResourceDictionary();
            child1.Resources.Add("key1", "value3");

            Assert.AreEqual("value3", child2.GetValue(TestValueProperty));
            Assert.AreEqual(4, testValueChanged);

            child1.Resources.Remove("key1");

            Assert.AreEqual("value2", child2.GetValue(TestValueProperty));
            Assert.AreEqual(5, testValueChanged);
        }
        public void ResourceInheritanceTest()
        {
            object value;

            FrameworkElement root = new FrameworkElement();
            root.Resources = new ResourceDictionary();
            root.Resources.Add("key1", "value1");

            Assert.IsTrue(root.TryGetResource("key1", out value));
            Assert.AreEqual("value1", value);

            FrameworkElement child1 = new FrameworkElement();
            root.AddVisualChild(child1);
            root.AddLogicalChild(child1);

            Assert.IsTrue(child1.TryGetResource("key1", out value));
            Assert.AreEqual("value1", value);

            child1.Resources = new ResourceDictionary();
            child1.Resources.Add("key1", "value2");

            FrameworkElement child2 = new FrameworkElement();
            child1.AddVisualChild(child2);

            Assert.IsTrue(child2.TryGetResource("key1", out value));
            Assert.AreEqual("value2", value);

            root.AddLogicalChild(child2);

            Assert.IsTrue(child2.TryGetResource("key1", out value));
            Assert.AreEqual("value1", value);
        }