Attachable property setter was not working with XamlObjectWriter.
[mono.git] / mcs / class / System.Xaml / Test / System.Xaml / XamlReaderTestBase.cs
index 1afc25c13f0683979786f4c6bef8e723f4dcb143..740fce481c9cdc9f5120f4b5bc96fca796c9192f 100644 (file)
@@ -2573,6 +2573,636 @@ namespace MonoTests.System.Xaml
                        Assert.IsFalse (r.Read (), "end");
                }
 
+               #region ambient property test
+               protected void Read_AmbientPropertyContainer (XamlReader r, bool extensionBased)
+               {
+                       Assert.IsTrue (r.Read (), "ns#1-1");
+                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#1-2");
+                       Assert.IsNotNull (r.Namespace, "ns#1-3");
+                       Assert.AreEqual ("", r.Namespace.Prefix, "ns#1-4");
+                       Assert.AreEqual ("http://www.domain.com/path", r.Namespace.Namespace, "ns#1-5");
+
+                       Assert.IsTrue (r.Read (), "ns#2-1");
+                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#2-2");
+                       Assert.IsNotNull (r.Namespace, "ns#2-3");
+                       Assert.AreEqual ("x", r.Namespace.Prefix, "ns#2-4");
+                       Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns#2-5");
+
+                       // t:AmbientPropertyContainer
+                       Assert.IsTrue (r.Read (), "so#1-1");
+                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#1-2");
+                       var xt = new XamlType (typeof (SecondTest.ResourcesDict), r.SchemaContext);
+                       Assert.AreEqual (xt, r.Type, "so#1-3");
+
+                       if (r is XamlXmlReader)
+                               ReadBase (r);
+
+                       // m:Items
+                       Assert.IsTrue (r.Read (), "sm#1-1");
+                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm#1-2");
+                       Assert.AreEqual (XamlLanguage.Items, r.Member, "sm#1-3");
+
+                       xt = new XamlType (typeof (SecondTest.TestObject), r.SchemaContext);
+                       for (int i = 0; i < 2; i++) {
+
+                               if (i == 1 && r is XamlObjectReader && extensionBased) {
+                                       ReadReasourceExtension_AmbientPropertyContainer (r, i, extensionBased);
+                                       continue;
+                               }
+
+                               // t:TestObject
+                               Assert.IsTrue (r.Read (), "so#2-1." + i);
+                               Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2-2." + i);
+                               Assert.AreEqual (xt, r.Type, "so#2-3." + i);
+
+                               if (!extensionBased) {
+                                       if (i == 0 && r is XamlXmlReader) // order difference between XamlObjectReader and XamlXmlReader ...
+                                               ReadName_AmbientPropertyContainer (r, i);
+
+                                       ReadTestProperty_AmbientPropertyContainer (r, i, extensionBased);
+
+                                       if (i == 0 && r is XamlObjectReader) // order difference between XamlObjectReader and XamlXmlReader ...
+                                               ReadName_AmbientPropertyContainer (r, i);
+                               }
+
+                               if (r is XamlObjectReader && extensionBased) { 
+                                       ReadTestProperty_AmbientPropertyContainer (r, i, extensionBased);
+                                       ReadName_AmbientPropertyContainer (r, i);
+                               }
+
+                               ReadKey_AmbientPropertyContainer (r, i, extensionBased);
+
+                               if (extensionBased && i == 1)
+                                        ReadTestProperty_AmbientPropertyContainer (r, i, extensionBased);
+
+                               // /t:TestObject
+                               Assert.IsTrue (r.Read (), "eo#2-1." + i);
+                               Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2-2." + i);
+                       }
+
+                       // /m:Items
+                       Assert.IsTrue (r.Read (), "em#1-1");
+                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "em#1-2");
+
+                       // /t:AmbientPropertyContainer
+                       Assert.IsTrue (r.Read (), "eo#1-1");
+                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#1-2");
+
+                       Assert.IsFalse (r.Read (), "end");
+               }
+
+               void ReadKey_AmbientPropertyContainer (XamlReader r, int i, bool extensionBased)
+               {
+                       // m:Key
+                       Assert.IsTrue (r.Read (), "sm#4-1." + i);
+                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm#4-2." + i);
+                       Assert.AreEqual (XamlLanguage.Key, r.Member, "sm#4-3." + i);
+
+                       if (!extensionBased || r is XamlObjectReader) {
+                               // t:String (as it is specific derived type as compared to the key object type in Dictionary<object,object>)
+                               Assert.IsTrue (r.Read (), "so#5-1." + i);
+                               Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#5-2." + i);
+                               Assert.AreEqual (XamlLanguage.String, r.Type, "so#5-3." + i);
+
+                               Assert.IsTrue (r.Read (), "sm#5-1." + i);
+                               Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm#5-2." + i);
+                               Assert.AreEqual (XamlLanguage.Initialization, r.Member, "sm#5-3." + i);
+
+                               Assert.IsTrue (r.Read (), "v#5-1." + i);
+                               Assert.AreEqual (XamlNodeType.Value, r.NodeType, "v#5-2." + i);
+
+                               Assert.IsTrue (r.Read (), "em#5-1." + i);
+                               Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "em#5-2." + i);
+
+                               // /t:String
+                               Assert.IsTrue (r.Read (), "eo#5-1." + i);
+                               Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#5-2." + i);
+                       } else {
+                               // it is in attribute string without type in xml.
+                               Assert.IsTrue (r.Read (), "v#y-1." + i);
+                               Assert.AreEqual (XamlNodeType.Value, r.NodeType, "v#y-2." + i);
+                               Assert.AreEqual (i == 0 ? "TestDictItem" : "okay", r.Value, "v#y-3." + i);
+                       }
+
+                       // /m:Key
+                       Assert.IsTrue (r.Read (), "em#4-1." + i);
+                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "em#4-2." + i);
+               }
+
+               void ReadName_AmbientPropertyContainer (XamlReader r, int i)
+               {
+                       // m:Name
+                       Assert.IsTrue (r.Read (), "sm#3-1." + i);
+                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm#3-2." + i);
+                       Assert.AreEqual (XamlLanguage.Name, r.Member, "sm#3-3." + i);
+
+                       Assert.IsTrue (r.Read (), "v#3-1." + i);
+                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "v#3-2." + i);
+                       Assert.AreEqual ("__ReferenceID0", r.Value, "v#3-3." + i);
+
+                       // /m:Name
+                       Assert.IsTrue (r.Read (), "em#3-1." + i);
+                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "em#3-2." + i);
+               }
+
+               void ReadTestProperty_AmbientPropertyContainer (XamlReader r, int i, bool extensionBased)
+               {
+                       var xt = new XamlType (typeof (SecondTest.TestObject), r.SchemaContext);
+
+                       // m:TestProperty
+                       Assert.IsTrue (r.Read (), "sm#2-1." + i);
+                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm#2-2." + i);
+                       Assert.AreEqual (xt.GetMember ("TestProperty"), r.Member, "sm#2-3." + i);
+
+                       if (i == 0) {
+                               // t:TestObject={x:Null}
+                               Assert.IsTrue (r.Read (), "so#3-1." + i);
+                               Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#3-2." + i);
+                               Assert.AreEqual (XamlLanguage.Null, r.Type, "so#3-3." + i);
+                               Assert.IsTrue (r.Read (), "eo#3-1." + i);
+                               Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#3-2." + i);
+                       } else if (extensionBased) {
+                               ReadReasourceExtension_AmbientPropertyContainer (r, i, extensionBased);
+                       } else {
+                               ReadReference_AmbientPropertyContainer (r, i, extensionBased);
+                       }
+
+                       // /m:TestProperty
+                       Assert.IsTrue (r.Read (), "em#2-1." + i);
+                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "em#2-2." + i);
+               }
+
+               void ReadReasourceExtension_AmbientPropertyContainer (XamlReader r, int i, bool extensionBased)
+               {
+                       // t:ResourceExtension
+                       var xt = r.SchemaContext.GetXamlType (typeof (SecondTest.ResourceExtension));
+                       Assert.IsTrue (r.Read (), "so#z-1." + i);
+                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#z-2." + i);
+                       Assert.AreEqual (xt, r.Type, "so#z-2." + i);
+
+                       if (r is XamlObjectReader) {
+
+                               // m:Arguments
+                               Assert.IsTrue (r.Read (), "sm#zz-1." + i);
+                               Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm#zz-2." + i);
+                               Assert.AreEqual (XamlLanguage.Arguments, r.Member, "sm#zz-3." + i);
+
+                               ReadReference_AmbientPropertyContainer (r, i, extensionBased);
+
+                               // /m:Arguments
+                               Assert.IsTrue (r.Read (), "em#zz-1." + i);
+                               Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "em#zz-2." + i);
+
+                               ReadKey_AmbientPropertyContainer (r, i, extensionBased);
+
+                       } else {
+
+                               // m:PositionalParameters
+                               Assert.IsTrue (r.Read (), "sm#z-1." + i);
+                               Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm#z-2." + i);
+                               Assert.AreEqual (XamlLanguage.PositionalParameters, r.Member, "sm#z-3." + i);
+
+                               Assert.IsTrue (r.Read (), "v#z-1." + i);
+                               Assert.AreEqual (XamlNodeType.Value, r.NodeType, "v#z-2." + i);
+
+                               // /m:PositionalParameters
+                               Assert.IsTrue (r.Read (), "em#z-1." + i);
+                               Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "em#z-2." + i);
+                       }
+                       
+                       // /t:ResourceExtension
+                       Assert.IsTrue (r.Read (), "eo#z-1." + i);
+                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#z-2." + i);
+               }
+
+               void ReadReference_AmbientPropertyContainer (XamlReader r, int i, bool extensionBased)
+               {
+                       // x:Reference
+                       Assert.IsTrue (r.Read (), "so#zz2-1." + i);
+                       Assert.AreEqual (XamlLanguage.Reference, r.Type, "so#zz2-2." + i);
+
+                       // posparm
+                       Assert.IsTrue (r.Read (), "sm#zz2-1." + i);
+                       Assert.AreEqual (XamlLanguage.PositionalParameters, r.Member, "sm#zz2-3." + i);
+                       // value
+                       Assert.IsTrue (r.Read (), "v#zz2-1." + i);
+                       Assert.AreEqual ("__ReferenceID0", r.Value, "v#zz2-2." + i);
+                       // /posparm
+                       Assert.IsTrue (r.Read (), "em#zz2-1." + i);
+                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "em#zz2-2." + i);
+                       // /x:Reference
+                       Assert.IsTrue (r.Read (), "eo#zz2-1." + i);
+                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#zz2-2." + i);
+               }
+               #endregion
+
+               protected void Read_NullableContainer (XamlReader r)
+               {
+                       Assert.IsTrue (r.Read (), "ns#1-1");
+                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#1-2");
+                       Assert.IsNotNull (r.Namespace, "ns#1-3");
+                       Assert.AreEqual ("", r.Namespace.Prefix, "ns#1-4");
+                       var assns = "clr-namespace:MonoTests.System.Xaml;assembly=" + GetType ().Assembly.GetName ().Name;
+                       Assert.AreEqual (assns, r.Namespace.Namespace, "ns#1-5");
+
+                       // t:NullableContainer
+                       Assert.IsTrue (r.Read (), "so#1-1");
+                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#1-2");
+                       var xt = new XamlType (typeof (NullableContainer), r.SchemaContext);
+                       Assert.AreEqual (xt, r.Type, "so#1-3");
+
+                       if (r is XamlXmlReader)
+                               ReadBase (r);
+
+                       // m:TestProp
+                       Assert.IsTrue (r.Read (), "sm1#1");
+                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm1#2");
+                       Assert.AreEqual (xt.GetMember ("TestProp"), r.Member, "sm1#3");
+
+                       // x:Value
+                       Assert.IsTrue (r.Read (), "v#1-1");
+                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "v#1-2");
+                       Assert.AreEqual ("5", r.Value, "v#1-3");
+
+                       // /m:TestProp
+                       Assert.IsTrue (r.Read (), "em#1-1");
+                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "em#1-2");
+
+                       // /t:NullableContainer
+                       Assert.IsTrue (r.Read (), "eo#1-1");
+                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#1-2");
+
+                       Assert.IsFalse (r.Read (), "end");
+               }
+
+               protected void Read_DirectListContainer (XamlReader r)
+               {
+                       var assns1 = "clr-namespace:MonoTests.System.Xaml;assembly=" + GetType ().Assembly.GetName ().Name;
+                       var assns2 = "clr-namespace:System.Collections.Generic;assembly=" + typeof (IList<>).Assembly.GetName ().Name;
+                       ReadNamespace (r, String.Empty, assns1, "ns#1");
+                       ReadNamespace (r, "scg", assns2, "ns#2");
+                       ReadNamespace (r, "x", XamlLanguage.Xaml2006Namespace, "ns#3");
+
+                       // t:DirectListContainer
+                       Assert.IsTrue (r.Read (), "so#1-1");
+                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#1-2");
+                       var xt = new XamlType (typeof (DirectListContainer), r.SchemaContext);
+                       Assert.AreEqual (xt, r.Type, "so#1-3");
+
+                       if (r is XamlXmlReader)
+                               ReadBase (r);
+
+                       // m:Items
+                       Assert.IsTrue (r.Read (), "sm1#1");
+                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm1#2");
+                       Assert.AreEqual (xt.GetMember ("Items"), r.Member, "sm1#3");
+
+                       // GetObject
+                       Assert.IsTrue (r.Read (), "go#1");
+                       Assert.AreEqual (XamlNodeType.GetObject, r.NodeType, "go#2");
+
+                       // m:Items(GetObject)
+                       Assert.IsTrue (r.Read (), "sm2#1");
+                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm2#2");
+                       Assert.AreEqual (XamlLanguage.Items, r.Member, "sm2#3");
+
+                       xt = r.SchemaContext.GetXamlType (typeof (DirectListContent));
+                       for (int i = 0; i < 3; i++) {
+                               // t:DirectListContent
+                               Assert.IsTrue (r.Read (), "so#x-1." + i);
+                               Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#x-2." + i);
+                               Assert.AreEqual (xt, r.Type, "so#x-3." + i);
+
+                               // m:Value
+                               Assert.IsTrue (r.Read (), "sm#x1");
+                               Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm#x2");
+                               Assert.AreEqual (xt.GetMember ("Value"), r.Member, "sm#x3");
+
+                               // x:Value
+                               Assert.IsTrue (r.Read (), "v#x-1");
+                               Assert.AreEqual (XamlNodeType.Value, r.NodeType, "v#x-2");
+                               Assert.AreEqual ("Hello" + (i + 1), r.Value, "v#x-3");
+
+                               // /m:Value
+                               Assert.IsTrue (r.Read (), "em#x-1");
+                               Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "em#x-2");
+
+                               // /t:DirectListContent
+                               Assert.IsTrue (r.Read (), "eo#x-1");
+                               Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#x-2");
+                       }
+
+                       // /m:Items(GetObject)
+                       Assert.IsTrue (r.Read (), "em#2-1");
+                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "em#2-2");
+
+                       // /GetObject
+                       Assert.IsTrue (r.Read (), "ego#2-1");
+                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "ego#2-2");
+
+                       // /m:Items
+                       Assert.IsTrue (r.Read (), "em#1-1");
+                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "em#1-2");
+
+                       // /t:DirectListContainer
+                       Assert.IsTrue (r.Read (), "eo#1-1");
+                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#1-2");
+
+                       Assert.IsFalse (r.Read (), "end");
+               }
+
+               protected void Read_DirectDictionaryContainer (XamlReader r)
+               {
+                       var assns1 = "clr-namespace:MonoTests.System.Xaml;assembly=" + GetType ().Assembly.GetName ().Name;
+                       ReadNamespace (r, String.Empty, assns1, "ns#1");
+                       ReadNamespace (r, "x", XamlLanguage.Xaml2006Namespace, "ns#2");
+
+                       // t:DirectDictionaryContainer
+                       Assert.IsTrue (r.Read (), "so#1-1");
+                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#1-2");
+                       var xt = new XamlType (typeof (DirectDictionaryContainer), r.SchemaContext);
+                       Assert.AreEqual (xt, r.Type, "so#1-3");
+
+                       if (r is XamlXmlReader)
+                               ReadBase (r);
+
+                       // m:Items
+                       Assert.IsTrue (r.Read (), "sm1#1");
+                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm1#2");
+                       Assert.AreEqual (xt.GetMember ("Items"), r.Member, "sm1#3");
+
+                       // GetObject
+                       Assert.IsTrue (r.Read (), "go#1");
+                       Assert.AreEqual (XamlNodeType.GetObject, r.NodeType, "go#2");
+
+                       // m:Items(GetObject)
+                       Assert.IsTrue (r.Read (), "sm2#1");
+                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm2#2");
+                       Assert.AreEqual (XamlLanguage.Items, r.Member, "sm2#3");
+
+                       xt = r.SchemaContext.GetXamlType (typeof (int));
+                       for (int i = 0; i < 3; i++) {
+                               // t:DirectDictionaryContent
+                               Assert.IsTrue (r.Read (), "so#x-1." + i);
+                               Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#x-2." + i);
+                               Assert.AreEqual (xt, r.Type, "so#x-3." + i);
+
+                               // m:Key
+                               Assert.IsTrue (r.Read (), "sm#y1");
+                               Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm#y2");
+                               Assert.AreEqual (XamlLanguage.Key, r.Member, "sm#y3");
+
+                               // x:Value
+                               Assert.IsTrue (r.Read (), "v#y-1");
+                               Assert.AreEqual (XamlNodeType.Value, r.NodeType, "v#y-2");
+                               Assert.AreEqual (((EnumValueType) i).ToString ().ToLower (), r.Value, "v#y-3");
+
+                               // /m:Key
+                               Assert.IsTrue (r.Read (), "em#y-1");
+                               Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "em#y-2");
+
+                               // m:Value
+                               Assert.IsTrue (r.Read (), "sm#x1");
+                               Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm#x2");
+                               Assert.AreEqual (XamlLanguage.Initialization, r.Member, "sm#x3");
+
+                               // x:Value
+                               Assert.IsTrue (r.Read (), "v#x-1");
+                               Assert.AreEqual (XamlNodeType.Value, r.NodeType, "v#x-2");
+                               Assert.AreEqual ("" + (i + 2) * 10, r.Value, "v#x-3");
+
+                               // /m:Value
+                               Assert.IsTrue (r.Read (), "em#x-1");
+                               Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "em#x-2");
+
+                               // /t:DirectDictionaryContent
+                               Assert.IsTrue (r.Read (), "eo#x-1");
+                               Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#x-2");
+                       }
+
+                       // /m:Items(GetObject)
+                       Assert.IsTrue (r.Read (), "em#2-1");
+                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "em#2-2");
+
+                       // /GetObject
+                       Assert.IsTrue (r.Read (), "ego#2-1");
+                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "ego#2-2");
+
+                       // /m:Items
+                       Assert.IsTrue (r.Read (), "em#1-1");
+                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "em#1-2");
+
+                       // /t:DirectDictionaryContainer
+                       Assert.IsTrue (r.Read (), "eo#1-1");
+                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#1-2");
+
+                       Assert.IsFalse (r.Read (), "end");
+               }
+
+               protected void Read_DirectDictionaryContainer2 (XamlReader r)
+               {
+                       ReadNamespace (r, String.Empty, "http://www.domain.com/path", "ns#1");
+                       ReadNamespace (r, "x", XamlLanguage.Xaml2006Namespace, "ns#2");
+
+                       // t:DirectDictionaryContainer
+                       Assert.IsTrue (r.Read (), "so#1-1");
+                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#1-2");
+                       var xt = new XamlType (typeof (SecondTest.ResourcesDict2), r.SchemaContext);
+                       Assert.AreEqual (xt, r.Type, "so#1-3");
+
+                       if (r is XamlXmlReader)
+                               ReadBase (r);
+
+                       // m:Items
+                       Assert.IsTrue (r.Read (), "sm1#1");
+                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm1#2");
+                       Assert.AreEqual (XamlLanguage.Items, r.Member, "sm1#3");
+
+                       xt = r.SchemaContext.GetXamlType (typeof (SecondTest.TestObject2));
+                       for (int i = 0; i < 2; i++) {
+                               // t:TestObject
+                               Assert.IsTrue (r.Read (), "so#x-1." + i);
+                               Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#x-2." + i);
+                               Assert.AreEqual (xt, r.Type, "so#x-3." + i);
+
+                               // m:Key
+                               Assert.IsTrue (r.Read (), "sm#y1");
+                               Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm#y2");
+                               Assert.AreEqual (XamlLanguage.Key, r.Member, "sm#y3");
+
+                               // value
+                               Assert.IsTrue (r.Read (), "v#y-1");
+                               Assert.AreEqual (XamlNodeType.Value, r.NodeType, "v#y-2");
+                               Assert.AreEqual (i == 0 ? "1" : "two", r.Value, "v#y-3");
+
+                               // /m:Key
+                               Assert.IsTrue (r.Read (), "em#y-1");
+                               Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "em#y-2");
+
+                               // m:TestProperty
+                               Assert.IsTrue (r.Read (), "sm#x1");
+                               Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm#x2");
+                               Assert.AreEqual (xt.GetMember ("TestProperty"), r.Member, "sm#x3");
+
+                               // x:Value
+                               Assert.IsTrue (r.Read (), "v#x-1");
+                               Assert.AreEqual (XamlNodeType.Value, r.NodeType, "v#x-2");
+                               Assert.AreEqual (i == 0 ? "1" : "two", r.Value, "v#x-3");
+
+                               // /m:TestProperty
+                               Assert.IsTrue (r.Read (), "em#x-1");
+                               Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "em#x-2");
+
+                               // /t:TestObject
+                               Assert.IsTrue (r.Read (), "eo#x-1");
+                               Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#x-2");
+                       }
+
+                       // /m:Items
+                       Assert.IsTrue (r.Read (), "em#1-1");
+                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "em#1-2");
+
+                       // /t:DirectDictionaryContainer
+                       Assert.IsTrue (r.Read (), "eo#1-1");
+                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#1-2");
+
+                       Assert.IsFalse (r.Read (), "end");
+               }
+
+               protected void Read_ContentPropertyContainer (XamlReader r)
+               {
+                       ReadNamespace (r, String.Empty, "http://www.domain.com/path", "ns#1");
+                       ReadNamespace (r, "x", XamlLanguage.Xaml2006Namespace, "ns#2");
+
+                       // 1:: t:ContentPropertyContainer
+                       Assert.IsTrue (r.Read (), "so#1-1");
+                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#1-2");
+                       var xt = new XamlType (typeof (SecondTest.ContentPropertyContainer), r.SchemaContext);
+                       Assert.AreEqual (xt, r.Type, "so#1-3");
+
+                       if (r is XamlXmlReader)
+                               ReadBase (r);
+
+                       // 2:: m:Items
+                       Assert.IsTrue (r.Read (), "sm1#1");
+                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm1#2");
+                       Assert.AreEqual (XamlLanguage.Items, r.Member, "sm1#3");
+
+                       xt = r.SchemaContext.GetXamlType (typeof (SecondTest.SimpleType));
+                       for (int i = 0; i < 2; i++) {
+                               // 3:: t:SimpleType
+                               Assert.IsTrue (r.Read (), "so#x-1" + "." + i);
+                               Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#x-2" + "." + i);
+                               Assert.AreEqual (xt, r.Type, "so#x-3" + "." + i);
+
+                               // 4:: m:Key
+                               Assert.IsTrue (r.Read (), "sm#y1" + "." + i);
+                               Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm#y2" + "." + i);
+                               Assert.AreEqual (XamlLanguage.Key, r.Member, "sm#y3" + "." + i);
+
+                               // 4:: value
+                               Assert.IsTrue (r.Read (), "v#y-1" + "." + i);
+                               Assert.AreEqual (XamlNodeType.Value, r.NodeType, "v#y-2" + "." + i);
+                               Assert.AreEqual (i == 0 ? "one" : "two", r.Value, "v#y-3" + "." + i);
+
+                               // 4:: /m:Key
+                               Assert.IsTrue (r.Read (), "em#y-1" + "." + i);
+                               Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "em#y-2" + "." + i);
+
+if (i == 0) {
+
+                               // 4-2:: m:Items(ContentProperty)
+                               Assert.IsTrue (r.Read (), "sm#x1" + "." + i);
+                               Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm#x2" + "." + i);
+                               Assert.AreEqual (xt.GetMember ("Items"), r.Member, "sm#x3" + "." + i);
+
+                               // 5:: GetObject
+                               Assert.IsTrue (r.Read (), "go#z-1" + "." + i);
+                               Assert.AreEqual (XamlNodeType.GetObject, r.NodeType, "go#z-2" + "." + i);
+
+                               // 6:: m:Items(GetObject)
+                               Assert.IsTrue (r.Read (), "smz#1" + "." + i);
+                               Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "smz#2" + "." + i);
+                               Assert.AreEqual (XamlLanguage.Items, r.Member, "smz#3" + "." + i);
+
+                               for (int j = 0; j < 2; j++) {
+                                       // 7:: t:SimpleType
+                                       Assert.IsTrue (r.Read (), "soi#x-1" + "." + i + "-" + j);
+                                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "soi#x-2" + "." + i + "-" + j);
+                                       Assert.AreEqual (xt, r.Type, "soi#z-3" + "." + i + "-" + j);
+
+                                       // 7:: /t:SimpleType
+                                       Assert.IsTrue (r.Read (), "eoi#x-1" + "." + i + "-" + j);
+                                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eoi#x-2" + "." + i + "-" + j);
+                               }
+
+                               // 6:: /m:Items(GetObject)
+                               Assert.IsTrue (r.Read (), "emz#x-1" + "." + i);
+                               Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "emz#x-2" + "." + i);
+
+                               // 5:: /GetObject
+                               Assert.IsTrue (r.Read (), "eo#z-1" + "." + i);
+                               Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#z-2" + "." + i);
+
+                               // 4:: /m:Items(ContentProperty)
+                               Assert.IsTrue (r.Read (), "em#x1" + "." + i);
+                               Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "em#x2" + "." + i);
+
+                               // 4-2:: m:NonContentItems
+                               Assert.IsTrue (r.Read (), "smv#1" + "." + i);
+                               Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "smv#2" + "." + i);
+                               Assert.AreEqual (xt.GetMember ("NonContentItems"), r.Member, "smv#3" + "." + i);
+
+                               // 5-2:: GetObject
+                               Assert.IsTrue (r.Read (), "go#z-1" + "." + i);
+                               Assert.AreEqual (XamlNodeType.GetObject, r.NodeType, "go#v-2" + "." + i);
+
+                               // 6-2:: m:Items
+                               Assert.IsTrue (r.Read (), "smw#1" + "." + i);
+                               Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "smw#2" + "." + i);
+                               Assert.AreEqual (XamlLanguage.Items, r.Member, "smw#3" + "." + i);
+
+                               for (int j = 0; j < 2; j++) {
+                                       // 7-2:: t:SimpleType
+                                       Assert.IsTrue (r.Read (), "soi2#x-1" + "." + i + "-" + j);
+                                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "soi2#x-2" + "." + i + "-" + j);
+                                       Assert.AreEqual (xt, r.Type, "soi2#z-3" + "." + i + "-" + j);
+
+                                       // 7-2:: /t:SimpleType
+                                       Assert.IsTrue (r.Read (), "eoi2#x-1" + "." + i + "-" + j);
+                                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eoi2#x-2" + "." + i + "-" + j);
+                               }
+
+                               // 6-2:: /m:Items
+                               Assert.IsTrue (r.Read (), "emw#1" + "." + i);
+                               Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "emw#2" + "." + i);
+
+                               // 5-2:: /GetObject
+                               Assert.IsTrue (r.Read (), "eo#v-1" + "." + i);
+                               Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#v-2" + "." + i);
+
+                               // 4-2:: /m:NonContentItems
+                               Assert.IsTrue (r.Read (), "emv#1" + "." + i);
+                               Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "emv#2" + "." + i);
+
+}
+
+                               // 3:: /t:SimpleType
+                               Assert.IsTrue (r.Read (), "eo#x-1" + "." + i);
+                               Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#x-2" + "." + i);
+                       }
+
+                       // 2:: /m:Items
+                       Assert.IsTrue (r.Read (), "em#1-1");
+                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "em#1-2");
+
+                       // 1:: /t:ContentPropertyContainer
+                       Assert.IsTrue (r.Read (), "eo#1-1");
+                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#1-2");
+
+                       Assert.IsFalse (r.Read (), "end");
+               }
+               
                protected void Read_AttachedProperty (XamlReader r)
                {
                        var at = new XamlType (typeof (Attachable), r.SchemaContext);
@@ -2746,5 +3376,14 @@ namespace MonoTests.System.Xaml
                        Assert.IsTrue (r.Read (), "ebase#1");
                        Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ebase#2");
                }
+
+               void ReadNamespace (XamlReader r, string prefix, string ns, string label)
+               {
+                       Assert.IsTrue (r.Read (), label + "-1");
+                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, label + "-2");
+                       Assert.IsNotNull (r.Namespace, label + "-3");
+                       Assert.AreEqual (prefix, r.Namespace.Prefix, label + "-4");
+                       Assert.AreEqual (ns, r.Namespace.Namespace, label + "-5");
+               }
        }
 }