Merge pull request #704 from jgagnon/master
[mono.git] / mcs / class / System.Xaml / Test / System.Xaml / XamlObjectReaderTest.cs
index b5bba79d3ed8b9b3d5fd63f752fa77ff6c67ab45..d8fc2cd6c756bb102e73bd72b154db7e266424c5 100755 (executable)
@@ -35,14 +35,6 @@ using NUnit.Framework;
 
 using CategoryAttribute = NUnit.Framework.CategoryAttribute;
 
-// Some test result remarks:
-// - TypeExtension: [ConstructorArgument] -> PositionalParameters
-// - StaticExtension: almost identical to TypeExtension
-// - Reference: [ConstructorArgument], [ContentProperty] -> only ordinal member.
-// - ArrayExtension: [ConstrutorArgument], [ContentProperty] -> no PositionalParameters, Items.
-// - NullExtension: no member.
-// - MyExtension: [ConstructorArgument] -> only ordinal members...hmm?
-
 namespace MonoTests.System.Xaml
 {
        [TestFixture]
@@ -112,718 +104,9 @@ namespace MonoTests.System.Xaml
                {
                        new XamlObjectReader (new TestClass3 ());
                }
-       }
-       
-       public partial class XamlReaderTestBase
-       {
-               protected void Read_String (XamlReader r)
-               {
-                       Assert.AreEqual (XamlNodeType.None, r.NodeType, "#1");
-                       Assert.IsNull (r.Member, "#2");
-                       Assert.IsNull (r.Namespace, "#3");
-                       Assert.IsNull (r.Member, "#4");
-                       Assert.IsNull (r.Type, "#5");
-                       Assert.IsNull (r.Value, "#6");
-
-                       Assert.IsTrue (r.Read (), "#11");
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
-                       Assert.IsNotNull (r.Namespace, "#13");
-                       Assert.AreEqual ("x", r.Namespace.Prefix, "#13-2");
-                       Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#13-3");
-
-                       Assert.IsTrue (r.Read (), "#21");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
-                       Assert.IsNotNull (r.Type, "#23");
-                       Assert.AreEqual (new XamlType (typeof (string), r.SchemaContext), r.Type, "#23-2");
-                       Assert.IsNull (r.Namespace, "#25");
-
-                       if (r is XamlXmlReader)
-                               ReadBase (r);
-
-                       Assert.IsTrue (r.Read (), "#31");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#32");
-                       Assert.IsNotNull (r.Member, "#33");
-                       Assert.AreEqual (XamlLanguage.Initialization, r.Member, "#33-2");
-                       Assert.IsNull (r.Type, "#34");
-
-                       Assert.IsTrue (r.Read (), "#41");
-                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#42");
-                       Assert.AreEqual ("foo", r.Value, "#43");
-                       Assert.IsNull (r.Member, "#44");
-
-                       Assert.IsTrue (r.Read (), "#51");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#52");
-                       Assert.IsNull (r.Type, "#53");
-                       Assert.IsNull (r.Member, "#54");
-
-                       Assert.IsTrue (r.Read (), "#61");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#62");
-                       Assert.IsNull (r.Type, "#63");
-
-                       Assert.IsFalse (r.Read (), "#71");
-                       Assert.IsTrue (r.IsEof, "#72");
-               }
-
-               protected void WriteNullMemberAsObject (XamlReader r, Action validateNullInstance)
-               {
-                       Assert.AreEqual (XamlNodeType.None, r.NodeType, "#1");
-                       Assert.IsTrue (r.Read (), "#6");
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#7");
-                       Assert.AreEqual (String.Empty, r.Namespace.Prefix, "#7-2");
-                       Assert.AreEqual ("clr-namespace:MonoTests.System.Xaml;assembly=" + GetType ().Assembly.GetName ().Name, r.Namespace.Namespace, "#7-3");
-
-                       Assert.IsTrue (r.Read (), "#11");
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
-                       Assert.AreEqual ("x", r.Namespace.Prefix, "#12-2");
-                       Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#12-3");
-
-                       Assert.IsTrue (r.Read (), "#16");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#17");
-                       var xt = new XamlType (typeof (TestClass4), r.SchemaContext);
-                       Assert.AreEqual (xt, r.Type, "#17-2");
-//                     Assert.IsTrue (r.Instance is TestClass4, "#17-3");
-                       Assert.AreEqual (2, xt.GetAllMembers ().Count, "#17-4");
-
-                       if (r is XamlXmlReader)
-                               ReadBase (r);
-
-                       Assert.IsTrue (r.Read (), "#21");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#22");
-                       Assert.AreEqual (xt.GetMember ("Bar"), r.Member, "#22-2");
-
-                       Assert.IsTrue (r.Read (), "#26");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#27");
-                       Assert.AreEqual (XamlLanguage.Null, r.Type, "#27-2");
-                       if (validateNullInstance != null)
-                               validateNullInstance ();
-
-                       Assert.IsTrue (r.Read (), "#31");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#32");
-
-                       Assert.IsTrue (r.Read (), "#36");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#37");
-
-                       Assert.IsTrue (r.Read (), "#41");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#42");
-                       Assert.AreEqual (xt.GetMember ("Foo"), r.Member, "#42-2");
-
-                       Assert.IsTrue (r.Read (), "#43");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#43-2");
-                       Assert.AreEqual (XamlLanguage.Null, r.Type, "#43-3");
-                       if (validateNullInstance != null)
-                               validateNullInstance ();
-
-                       Assert.IsTrue (r.Read (), "#44");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#44-2");
-
-                       Assert.IsTrue (r.Read (), "#46");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#47");
-
-                       Assert.IsTrue (r.Read (), "#51");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#52");
-
-                       Assert.IsFalse (r.Read (), "#56");
-                       Assert.IsTrue (r.IsEof, "#57");
-               }
-               
-               protected void StaticMember (XamlReader r)
-               {
-                       Assert.AreEqual (XamlNodeType.None, r.NodeType, "#1");
-                       Assert.IsTrue (r.Read (), "#6");
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#7");
-                       Assert.AreEqual (String.Empty, r.Namespace.Prefix, "#7-2");
-                       Assert.AreEqual ("clr-namespace:MonoTests.System.Xaml;assembly=" + GetType ().Assembly.GetName ().Name, r.Namespace.Namespace, "#7-3");
-
-                       Assert.IsTrue (r.Read (), "#11");
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
-                       Assert.AreEqual ("x", r.Namespace.Prefix, "#12-2");
-                       Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#12-3");
-
-                       Assert.IsTrue (r.Read (), "#16");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#17");
-                       var xt = new XamlType (typeof (TestClass5), r.SchemaContext);
-                       Assert.AreEqual (xt, r.Type, "#17-2");
-//                     Assert.IsTrue (r.Instance is TestClass5, "#17-3");
-                       Assert.AreEqual (2, xt.GetAllMembers ().Count, "#17-4");
-                       Assert.IsTrue (xt.GetAllMembers ().Any (xm => xm.Name == "Bar"), "#17-5");
-                       Assert.IsTrue (xt.GetAllMembers ().Any (xm => xm.Name == "Baz"), "#17-6");
-
-                       if (r is XamlXmlReader)
-                               ReadBase (r);
-
-                       Assert.IsTrue (r.Read (), "#21");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#22");
-                       Assert.AreEqual (xt.GetMember ("Bar"), r.Member, "#22-2");
-
-                       Assert.IsTrue (r.Read (), "#26");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#27");
-                       Assert.AreEqual (XamlLanguage.Null, r.Type, "#27-2");
-//                     Assert.IsNull (r.Instance, "#27-3");
-
-                       Assert.IsTrue (r.Read (), "#31");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#32");
-
-                       Assert.IsTrue (r.Read (), "#36");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#37");
-                       // static Foo is not included in GetAllXembers() return value.
-                       // ReadOnly is not included in GetAllMembers() return value neither.
-                       // nonpublic Baz is a member, but does not appear in the reader.
-
-                       Assert.IsTrue (r.Read (), "#51");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#52");
-
-                       Assert.IsFalse (r.Read (), "#56");
-                       Assert.IsTrue (r.IsEof, "#57");
-               }
-
-               protected void Skip (XamlReader r)
-               {
-                       r.Skip ();
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#1");
-                       r.Skip ();
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#2");
-                       r.Skip ();
-                       Assert.IsTrue (r.IsEof, "#3");
-               }
-
-               protected void Skip2 (XamlReader r)
-               {
-                       r.Read (); // NamespaceDeclaration
-                       r.Read (); // Type
-                       if (r is XamlXmlReader)
-                               ReadBase (r);
-                       r.Read (); // Member (Initialization)
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#1");
-                       r.Skip ();
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#2");
-                       r.Skip ();
-                       Assert.IsTrue (r.IsEof, "#3");
-               }
-
-               protected void Read_XmlDocument (XamlReader r)
-               {
-                       for (int i = 0; i < 3; i++) {
-                               r.Read ();
-                               Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#1-" + i);
-                       }
-                       r.Read ();
-
-                       Assert.AreEqual (new XamlType (typeof (XmlDocument), r.SchemaContext), r.Type, "#2");
-                       r.Read ();
-                       var l = new List<XamlMember> ();
-                       while (r.NodeType == XamlNodeType.StartMember) {
-                       // It depends on XmlDocument's implenentation details. It fails on mono only because XmlDocument.SchemaInfo overrides both getter and setter.
-                       //for (int i = 0; i < 5; i++) {
-                       //      Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#3-" + i);
-                               l.Add (r.Member);
-                               r.Skip ();
-                       }
-                       Assert.IsNotNull (l.FirstOrDefault (m => m.Name == "Value"), "#4-1");
-                       Assert.IsNotNull (l.FirstOrDefault (m => m.Name == "InnerXml"), "#4-2");
-                       Assert.IsNotNull (l.FirstOrDefault (m => m.Name == "Prefix"), "#4-3");
-                       Assert.IsNotNull (l.FirstOrDefault (m => m.Name == "PreserveWhitespace"), "#4-4");
-                       Assert.IsNotNull (l.FirstOrDefault (m => m.Name == "Schemas"), "#4-5");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#5");
-                       Assert.IsFalse (r.Read (), "#6");
-               }
-
-               protected void Read_NonPrimitive (XamlReader r)
-               {
-                       Assert.AreEqual (XamlNodeType.None, r.NodeType, "#1");
-                       Assert.IsTrue (r.Read (), "#6");
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#7");
-                       Assert.AreEqual (String.Empty, r.Namespace.Prefix, "#7-2");
-                       Assert.AreEqual ("clr-namespace:MonoTests.System.Xaml;assembly=" + GetType ().Assembly.GetName ().Name, r.Namespace.Namespace, "#7-3");
-
-                       Assert.IsTrue (r.Read (), "#11");
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
-                       Assert.AreEqual ("x", r.Namespace.Prefix, "#12-2");
-                       Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#12-3");
-
-                       Assert.IsTrue (r.Read (), "#16");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#17");
-                       var xt = new XamlType (typeof (TestClass3), r.SchemaContext);
-                       Assert.AreEqual (xt, r.Type, "#17-2");
-//                     Assert.IsTrue (r.Instance is TestClass3, "#17-3");
-
-                       if (r is XamlXmlReader)
-                               ReadBase (r);
-
-                       Assert.IsTrue (r.Read (), "#21");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#22");
-                       Assert.AreEqual (xt.GetMember ("Nested"), r.Member, "#22-2");
-
-                       Assert.IsTrue (r.Read (), "#26");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#27");
-                       Assert.AreEqual (XamlLanguage.Null, r.Type, "#27-2");
-//                     Assert.IsNull (r.Instance, "#27-3");
-
-                       Assert.IsTrue (r.Read (), "#31");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#32");
-
-                       Assert.IsTrue (r.Read (), "#36");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#37");
-
-                       Assert.IsTrue (r.Read (), "#41");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#42");
-
-                       Assert.IsFalse (r.Read (), "#46");
-                       Assert.IsTrue (r.IsEof, "#47");
-               }
-
-               protected void Read_TypeOrTypeExtension (XamlReader r, Action validateInstance, XamlMember ctorArgMember)
-               {
-                       Assert.IsTrue (r.Read (), "#11");
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
-                       Assert.IsNotNull (r.Namespace, "#13");
-                       Assert.AreEqual ("x", r.Namespace.Prefix, "#13-2");
-                       Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#13-3");
-//                     Assert.IsNull (r.Instance, "#14");
-
-                       Assert.IsTrue (r.Read (), "#21");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
-                       Assert.IsNotNull (r.Type, "#23");
-                       Assert.AreEqual (new XamlType (typeof (TypeExtension), r.SchemaContext), r.Type, "#23-2");
-                       Assert.IsNull (r.Namespace, "#25");
-                       if (validateInstance != null)
-                               validateInstance ();
-
-                       if (r is XamlXmlReader)
-                               ReadBase (r);
-
-                       Assert.IsTrue (r.Read (), "#31");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#32");
-                       Assert.IsNotNull (r.Member, "#33");
-                       Assert.AreEqual (ctorArgMember, r.Member, "#33-2");
-                       Assert.IsNull (r.Type, "#34");
-//                     Assert.IsNull (r.Instance, "#35");
-
-                       Assert.IsTrue (r.Read (), "#41");
-                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#42");
-                       Assert.IsNotNull (r.Value, "#43");
-                       Assert.AreEqual ("x:Int32", r.Value, "#43-2");
-                       Assert.IsNull (r.Member, "#44");
-//                     Assert.IsNull (r.Instance, "#45");
-
-                       Assert.IsTrue (r.Read (), "#51");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#52");
-                       Assert.IsNull (r.Type, "#53");
-                       Assert.IsNull (r.Member, "#54");
-//                     Assert.IsNull (r.Instance, "#55");
-
-                       Assert.IsTrue (r.Read (), "#61");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#62");
-                       Assert.IsNull (r.Type, "#63");
-
-                       Assert.IsFalse (r.Read (), "#71");
-                       Assert.IsTrue (r.IsEof, "#72");
-               }
-
-               protected void Read_TypeOrTypeExtension2 (XamlReader r, Action validateInstance, XamlMember ctorArgMember)
-               {
-                       Assert.IsTrue (r.Read (), "#11");
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
-
-                       var defns = "clr-namespace:MonoTests.System.Xaml;assembly=" + GetType ().Assembly.GetName ().Name;
-
-                       Assert.AreEqual (String.Empty, r.Namespace.Prefix, "#13-2");
-                       Assert.AreEqual (defns, r.Namespace.Namespace, "#13-3:" + r.Namespace.Prefix);
-
-                       Assert.IsTrue (r.Read (), "#16");
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#17");
-                       Assert.IsNotNull (r.Namespace, "#18");
-                       Assert.AreEqual ("x", r.Namespace.Prefix, "#18-2");
-                       Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#18-3:" + r.Namespace.Prefix);
-
-                       Assert.IsTrue (r.Read (), "#21");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
-                       Assert.AreEqual (new XamlType (typeof (TypeExtension), r.SchemaContext), r.Type, "#23-2");
-                       if (validateInstance != null)
-                               validateInstance ();
-
-                       if (r is XamlXmlReader)
-                               ReadBase (r);
-
-                       Assert.IsTrue (r.Read (), "#31");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#32");
-                       Assert.AreEqual (ctorArgMember, r.Member, "#33-2");
-
-                       Assert.IsTrue (r.Read (), "#41");
-                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#42");
-                       Assert.AreEqual ("TestClass1", r.Value, "#43-2");
-
-                       Assert.IsTrue (r.Read (), "#51");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#52");
-
-                       Assert.IsTrue (r.Read (), "#61");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#62");
-
-                       Assert.IsFalse (r.Read (), "#71");
-                       Assert.IsTrue (r.IsEof, "#72");
-               }
-
-               protected void Read_Reference (XamlReader r)
-               {
-                       Assert.IsTrue (r.Read (), "#11");
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
-                       Assert.AreEqual ("x", r.Namespace.Prefix, "#13-2");
-                       Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#13-3");
-
-                       Assert.IsTrue (r.Read (), "#21");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
-                       var xt = new XamlType (typeof (Reference), r.SchemaContext);
-                       Assert.AreEqual (xt, r.Type, "#23-2");
-//                     Assert.IsTrue (r.Instance is Reference, "#26");
-
-                       if (r is XamlXmlReader)
-                               ReadBase (r);
-
-                       Assert.IsTrue (r.Read (), "#31");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#32");
-                       // unlike TypeExtension there is no PositionalParameters.
-                       Assert.AreEqual (xt.GetMember ("Name"), r.Member, "#33-2");
-
-                       // It is a ContentProperty (besides [ConstructorArgument])
-                       Assert.IsTrue (r.Read (), "#41");
-                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#42");
-                       Assert.AreEqual ("FooBar", r.Value, "#43-2");
-
-                       Assert.IsTrue (r.Read (), "#51");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#52");
-
-                       Assert.IsTrue (r.Read (), "#61");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#62");
-
-                       Assert.IsFalse (r.Read (), "#71");
-                       Assert.IsTrue (r.IsEof, "#72");
-               }
-
-               protected void Read_NullOrNullExtension (XamlReader r, Action validateInstance)
-               {
-                       Assert.IsTrue (r.Read (), "#11");
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
-                       Assert.IsNotNull (r.Namespace, "#13");
-                       Assert.AreEqual ("x", r.Namespace.Prefix, "#13-2");
-                       Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#13-3");
-//                     Assert.IsNull (r.Instance, "#14");
-
-                       Assert.IsTrue (r.Read (), "#21");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
-                       Assert.AreEqual (new XamlType (typeof (NullExtension), r.SchemaContext), r.Type, "#23-2");
-                       if (validateInstance != null)
-                               validateInstance ();
-
-                       if (r is XamlXmlReader)
-                               ReadBase (r);
-
-                       Assert.IsTrue (r.Read (), "#61");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#62");
-
-                       Assert.IsFalse (r.Read (), "#71");
-                       Assert.IsTrue (r.IsEof, "#72");
-               }
-
-               // almost identical to TypeExtension (only type/instance difference)
-               protected void Read_StaticExtension (XamlReader r, XamlMember ctorArgMember)
-               {
-                       Assert.IsTrue (r.Read (), "#11");
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
-                       Assert.IsNotNull (r.Namespace, "#13");
-                       Assert.AreEqual ("x", r.Namespace.Prefix, "#13-2");
-                       Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#13-3");
-//                     Assert.IsNull (r.Instance, "#14");
-
-                       Assert.IsTrue (r.Read (), "#21");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
-                       Assert.AreEqual (new XamlType (typeof (StaticExtension), r.SchemaContext), r.Type, "#23-2");
-//                     Assert.IsTrue (r.Instance is StaticExtension, "#26");
-
-                       if (r is XamlXmlReader)
-                               ReadBase (r);
-
-                       Assert.IsTrue (r.Read (), "#31");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#32");
-                       Assert.AreEqual (ctorArgMember, r.Member, "#33-2");
-
-                       Assert.IsTrue (r.Read (), "#41");
-                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#42");
-                       Assert.AreEqual ("FooBar", r.Value, "#43-2");
-
-                       Assert.IsTrue (r.Read (), "#51");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#52");
-
-                       Assert.IsTrue (r.Read (), "#61");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#62");
-
-                       Assert.IsFalse (r.Read (), "#71");
-                       Assert.IsTrue (r.IsEof, "#72");
-               }
-
-               protected void Read_ListInt32 (XamlReader r, Action validateInstance, List<int> obj)
-               {
-                       Assert.IsTrue (r.Read (), "ns#1-1");
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#1-2");
-
-                       var defns = "clr-namespace:System.Collections.Generic;assembly=mscorlib";
-
-                       Assert.AreEqual (String.Empty, r.Namespace.Prefix, "ns#1-3");
-                       Assert.AreEqual (defns, r.Namespace.Namespace, "ns#1-4");
-
-                       Assert.IsTrue (r.Read (), "#11");
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
-                       Assert.IsNotNull (r.Namespace, "#13");
-                       Assert.AreEqual ("x", r.Namespace.Prefix, "#13-2");
-                       Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#13-3");
-
-                       Assert.IsTrue (r.Read (), "#21");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
-                       var xt = new XamlType (typeof (List<int>), r.SchemaContext);
-                       Assert.AreEqual (xt, r.Type, "#23");
-                       Assert.IsTrue (xt.IsCollection, "#27");
-                       if (validateInstance != null)
-                               validateInstance ();
-
-                       // This assumption on member ordering ("Type" then "Items") is somewhat wrong, and we might have to adjust it in the future.
-
-                       if (r is XamlXmlReader)
-                               ReadBase (r);
-
-                       Assert.IsTrue (r.Read (), "#31");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#32");
-                       Assert.AreEqual (xt.GetMember ("Capacity"), r.Member, "#33");
 
-                       Assert.IsTrue (r.Read (), "#41");
-                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#42");
-                       // The value is implementation details, not testable.
-                       //Assert.AreEqual ("3", r.Value, "#43");
+               // Based on Common tests
 
-                       Assert.IsTrue (r.Read (), "#51");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#52");
-
-                       if (obj.Count > 0) { // only when items exist.
-
-                       Assert.IsTrue (r.Read (), "#72");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#72-2");
-                       Assert.AreEqual (XamlLanguage.Items, r.Member, "#72-3");
-
-                       string [] values = {"5", "-3", "2147483647", "0"};
-                       for (int i = 0; i < 4; i++) {
-                               Assert.IsTrue (r.Read (), i + "#73");
-                               Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, i + "#73-2");
-                               Assert.IsTrue (r.Read (), i + "#74");
-                               Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, i + "#74-2");
-                               Assert.AreEqual (XamlLanguage.Initialization, r.Member, i + "#74-3");
-                               Assert.IsTrue (r.Read (), i + "#75");
-                               Assert.IsNotNull (r.Value, i + "#75-2");
-                               Assert.AreEqual (values [i], r.Value, i + "#73-3");
-                               Assert.IsTrue (r.Read (), i + "#74");
-                               Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, i + "#74-2");
-                               Assert.IsTrue (r.Read (), i + "#75");
-                               Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, i + "#75-2");
-                       }
-
-                       Assert.IsTrue (r.Read (), "#81");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#82"); // XamlLanguage.Items
-                       
-                       } // end of "if count > 0".
-
-                       Assert.IsTrue (r.Read (), "#87");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#88");
-
-                       Assert.IsFalse (r.Read (), "#89");
-               }
-
-               protected void Read_ArrayList (XamlReader r)
-               {
-                       Assert.IsTrue (r.Read (), "ns#1-1");
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#1-2");
-
-                       var defns = "clr-namespace:System.Collections;assembly=mscorlib";
-
-                       Assert.AreEqual (String.Empty, r.Namespace.Prefix, "ns#1-3");
-                       Assert.AreEqual (defns, r.Namespace.Namespace, "ns#1-4");
-
-                       Assert.IsTrue (r.Read (), "#11");
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
-                       Assert.IsNotNull (r.Namespace, "#13");
-                       Assert.AreEqual ("x", r.Namespace.Prefix, "#13-2");
-                       Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#13-3");
-
-                       Assert.IsTrue (r.Read (), "#21");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
-                       var xt = new XamlType (typeof (ArrayList), r.SchemaContext);
-                       Assert.AreEqual (xt, r.Type, "#23");
-//                     Assert.AreEqual (obj, r.Instance, "#26");
-                       Assert.IsTrue (xt.IsCollection, "#27");
-
-                       if (r is XamlXmlReader)
-                               ReadBase (r);
-
-                       // This assumption on member ordering ("Type" then "Items") is somewhat wrong, and we might have to adjust it in the future.
-
-                       Assert.IsTrue (r.Read (), "#31");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#32");
-                       Assert.AreEqual (xt.GetMember ("Capacity"), r.Member, "#33");
-
-                       Assert.IsTrue (r.Read (), "#41");
-                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#42");
-                       // The value is implementation details, not testable.
-                       //Assert.AreEqual ("3", r.Value, "#43");
-
-                       Assert.IsTrue (r.Read (), "#51");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#52");
-
-                       Assert.IsTrue (r.Read (), "#72");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#72-2");
-                       Assert.AreEqual (XamlLanguage.Items, r.Member, "#72-3");
-
-                       string [] values = {"5", "-3", "0"};
-                       for (int i = 0; i < 3; i++) {
-                               Assert.IsTrue (r.Read (), i + "#73");
-                               Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, i + "#73-2");
-                               Assert.IsTrue (r.Read (), i + "#74");
-                               Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, i + "#74-2");
-                               Assert.AreEqual (XamlLanguage.Initialization, r.Member, i + "#74-3");
-                               Assert.IsTrue (r.Read (), i + "#75");
-                               Assert.IsNotNull (r.Value, i + "#75-2");
-                               Assert.AreEqual (values [i], r.Value, i + "#73-3");
-                               Assert.IsTrue (r.Read (), i + "#74");
-                               Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, i + "#74-2");
-                               Assert.IsTrue (r.Read (), i + "#75");
-                               Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, i + "#75-2");
-                       }
-
-                       Assert.IsTrue (r.Read (), "#81");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#82"); // XamlLanguage.Items
-
-                       Assert.IsTrue (r.Read (), "#87");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#88");
-
-                       Assert.IsFalse (r.Read (), "#89");
-               }
-
-               protected void Read_ArrayOrArrayExtensionOrMyArrayExtension (XamlReader r, Action validateInstance, Type extType)
-               {
-                       if (extType == typeof (MyArrayExtension)) {
-                               Assert.IsTrue (r.Read (), "#1");
-                               Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#2");
-                               Assert.IsNotNull (r.Namespace, "#3");
-                               Assert.AreEqual (String.Empty, r.Namespace.Prefix, "#3-2");
-                       }
-                       Assert.IsTrue (r.Read (), "#11");
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
-                       Assert.IsNotNull (r.Namespace, "#13");
-                       Assert.AreEqual ("x", r.Namespace.Prefix, "#13-2");
-                       Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#13-3");
-
-                       Assert.IsTrue (r.Read (), "#21");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
-                       var xt = new XamlType (extType, r.SchemaContext);
-                       Assert.AreEqual (xt, r.Type, "#23");
-                       if (validateInstance != null)
-                               validateInstance ();
-
-                       if (r is XamlXmlReader)
-                               ReadBase (r);
-
-                       // This assumption on member ordering ("Type" then "Items") is somewhat wrong, and we might have to adjust it in the future.
-
-                       Assert.IsTrue (r.Read (), "#31");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#32");
-                       Assert.AreEqual (xt.GetMember ("Type"), r.Member, "#33");
-
-                       Assert.IsTrue (r.Read (), "#41");
-                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#42");
-                       Assert.AreEqual ("x:Int32", r.Value, "#43");
-
-                       Assert.IsTrue (r.Read (), "#51");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#52");
-
-                       Assert.IsTrue (r.Read (), "#61");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#62");
-                       Assert.AreEqual (xt.GetMember ("Items"), r.Member, "#63");
-
-                       Assert.IsTrue (r.Read (), "#71");
-                       Assert.AreEqual (XamlNodeType.GetObject, r.NodeType, "#71-2");
-                       Assert.IsNull (r.Type, "#71-3");
-                       Assert.IsNull (r.Member, "#71-4");
-                       Assert.IsNull (r.Value, "#71-5");
-
-                       Assert.IsTrue (r.Read (), "#72");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#72-2");
-                       Assert.AreEqual (XamlLanguage.Items, r.Member, "#72-3");
-
-                       string [] values = {"5", "-3", "0"};
-                       for (int i = 0; i < 3; i++) {
-                               Assert.IsTrue (r.Read (), i + "#73");
-                               Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, i + "#73-2");
-                               Assert.IsTrue (r.Read (), i + "#74");
-                               Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, i + "#74-2");
-                               Assert.AreEqual (XamlLanguage.Initialization, r.Member, i + "#74-3");
-                               Assert.IsTrue (r.Read (), i + "#75");
-                               Assert.IsNotNull (r.Value, i + "#75-2");
-                               Assert.AreEqual (values [i], r.Value, i + "#73-3");
-                               Assert.IsTrue (r.Read (), i + "#74");
-                               Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, i + "#74-2");
-                               Assert.IsTrue (r.Read (), i + "#75");
-                               Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, i + "#75-2");
-                       }
-
-                       Assert.IsTrue (r.Read (), "#81");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#82"); // XamlLanguage.Items
-
-                       Assert.IsTrue (r.Read (), "#83");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#84"); // GetObject
-
-                       Assert.IsTrue (r.Read (), "#85");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#86"); // ArrayExtension.Items
-
-                       Assert.IsTrue (r.Read (), "#87");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#88"); // ArrayExtension
-
-                       Assert.IsFalse (r.Read (), "#89");
-               }
-
-               // It gives Type member, not PositionalParameters... and no Items member here.
-               protected void Read_ArrayExtension2 (XamlReader r)
-               {
-                       Assert.IsTrue (r.Read (), "#11");
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
-                       Assert.IsNotNull (r.Namespace, "#13");
-                       Assert.AreEqual ("x", r.Namespace.Prefix, "#13-2");
-                       Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#13-3");
-//                     Assert.IsNull (r.Instance, "#14");
-
-                       Assert.IsTrue (r.Read (), "#21");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
-                       var xt = new XamlType (typeof (ArrayExtension), r.SchemaContext);
-                       Assert.AreEqual (xt, r.Type, "#23-2");
-//                     Assert.IsTrue (r.Instance is ArrayExtension, "#26");
-
-                       if (r is XamlXmlReader)
-                               ReadBase (r);
-
-                       Assert.IsTrue (r.Read (), "#31");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#32");
-                       Assert.AreEqual (xt.GetMember ("Type"), r.Member, "#33-2");
-
-                       Assert.IsTrue (r.Read (), "#41");
-                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#42");
-                       Assert.AreEqual ("x:Int32", r.Value, "#43-2");
-
-                       Assert.IsTrue (r.Read (), "#51");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#52");
-
-                       Assert.IsTrue (r.Read (), "#61");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#62");
-
-                       Assert.IsFalse (r.Read (), "#71");
-                       Assert.IsTrue (r.IsEof, "#72");
-               }
-       }
-
-       public partial class XamlObjectReaderTest
-       {
                [Test]
                public void Read_String ()
                {
@@ -861,6 +144,16 @@ namespace MonoTests.System.Xaml
                        Skip2 (r);
                }
 
+               [Test]
+               public void Skip3 ()
+               {
+                       var r = new XamlObjectReader (new ReadOnlyPropertyContainer () { Foo = "x" });
+                       while (r.NodeType != XamlNodeType.StartMember)
+                               r.Read ();
+                       r.Skip ();
+                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#1");
+               }
+
                [Test]
                public void Read_XmlDocument ()
                {
@@ -977,6 +270,22 @@ namespace MonoTests.System.Xaml
                                Assert.AreEqual (obj, r.Instance, "#26");
                                }, obj);
                }
+               
+               [Test]
+               public void Read_ListType ()
+               {
+                       var obj = new List<Type> (new Type [] {typeof (int), typeof (Dictionary<Type, XamlType>)}) { Capacity = 2 };
+                       var r = new XamlObjectReader (obj);
+                       Read_ListType (r, true);
+               }
+
+               [Test]
+               public void Read_ListArray ()
+               {
+                       var obj = new List<Array> (new Array [] { new int [] { 1,2,3}, new string [] { "foo", "bar", "baz" }}) { Capacity = 2 };
+                       var r = new XamlObjectReader (obj);
+                       Read_ListArray (r);
+               }
 
                [Test]
                public void Read_ArrayList ()
@@ -1070,6 +379,17 @@ namespace MonoTests.System.Xaml
                                r.Read ();
                }
 
+               [Test]
+               [ExpectedException (typeof (XamlObjectReaderException))]
+               [Category ("NotWorking")]
+               public void Read_XDataWrapper ()
+               {
+                       var obj = new XDataWrapper () { Markup = new XData () {Text = "<my_xdata/>" } };
+                       var r = new XamlObjectReader (obj);
+                       while (!r.IsEof)
+                               r.Read ();
+               }
+
                [Test]
                public void ReadStandardTypes ()
                {
@@ -1132,955 +452,304 @@ namespace MonoTests.System.Xaml
                        Read_CustomMarkupExtension6 (r);
                }
 
-               [Test] // not commonized
+               [Test]
                public void Read_ArgumentAttributed ()
                {
                        var obj = new ArgumentAttributed ("foo", "bar");
                        var r = new XamlObjectReader (obj);
-                       Read_CommonClrType (r, obj, new KeyValuePair<string,string> ("x", XamlLanguage.Xaml2006Namespace));
-                       var args = Read_AttributedArguments_String (r, new string [] {"arg1", "arg2"});
-                       Assert.AreEqual ("foo", args [0], "#1");
-                       Assert.AreEqual ("bar", args [1], "#2");
-               }
-       }
-
-       public partial class XamlReaderTestBase
-       {
-               protected void Read_CustomMarkupExtension (XamlReader r)
-               {
-                       r.Read (); // ns
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#1");
-                       r.Read (); // ns
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#1-2");
-                       r.Read ();
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#2-0");
-                       Assert.IsFalse (r.IsEof, "#1");
-                       var xt = r.Type;
-
-                       if (r is XamlXmlReader)
-                               ReadBase (r);
-
-                       r.Read ();
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#2-1");
-                       Assert.IsFalse (r.IsEof, "#2-2");
-                       Assert.AreEqual (xt.GetMember ("Bar"), r.Member, "#2-3");
-
-                       Assert.IsTrue (r.Read (), "#2-4");
-                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#2-5");
-                       Assert.AreEqual ("v2", r.Value, "#2-6");
-
-                       Assert.IsTrue (r.Read (), "#2-7");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#2-8");
-
-                       r.Read ();
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#3-1");
-                       Assert.IsFalse (r.IsEof, "#3-2");
-                       Assert.AreEqual (xt.GetMember ("Baz"), r.Member, "#3-3");
-
-                       Assert.IsTrue (r.Read (), "#3-4");
-                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#3-5");
-                       Assert.AreEqual ("v7", r.Value, "#3-6");
-
-                       Assert.IsTrue (r.Read (), "#3-7");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#3-8");
-                       
-                       r.Read ();
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#4-1");
-                       Assert.IsFalse (r.IsEof, "#4-2");
-                       Assert.AreEqual (xt.GetMember ("Foo"), r.Member, "#4-3");
-                       Assert.IsTrue (r.Read (), "#4-4");
-                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#4-5");
-                       Assert.AreEqual ("x:Int32", r.Value, "#4-6");
-
-                       Assert.IsTrue (r.Read (), "#4-7");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#4-8");
-
-                       Assert.IsTrue (r.Read (), "#5");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#5-2");
-
-                       Assert.IsFalse (r.Read (), "#6");
-               }
-
-               protected void Read_CustomMarkupExtension2 (XamlReader r)
-               {
-                       r.Read (); // ns
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#1");
-                       r.Read (); // note that there wasn't another NamespaceDeclaration.
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#2-0");
-                       var xt = r.Type;
-                       Assert.AreEqual (r.SchemaContext.GetXamlType (typeof (MyExtension2)), xt, "#2");
-
-                       if (r is XamlXmlReader)
-                               ReadBase (r);
-
-                       Assert.IsTrue (r.Read (), "#3");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#3-2");
-                       Assert.AreEqual (XamlLanguage.Initialization, r.Member, "#4");
-                       Assert.IsTrue (r.Read (), "#5");
-                       Assert.AreEqual ("MonoTests.System.Xaml.MyExtension2", r.Value, "#6");
-                       Assert.IsTrue (r.Read (), "#7"); // EndMember
-                       Assert.IsTrue (r.Read (), "#8"); // EndObject
-                       Assert.IsFalse (r.Read (), "#9");
-               }
-
-               protected void Read_CustomMarkupExtension3 (XamlReader r)
-               {
-                       r.Read (); // ns
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#1");
-                       r.Read (); // note that there wasn't another NamespaceDeclaration.
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#2-0");
-                       var xt = r.Type;
-                       Assert.AreEqual (r.SchemaContext.GetXamlType (typeof (MyExtension3)), xt, "#2");
-
-                       if (r is XamlXmlReader)
-                               ReadBase (r);
-
-                       Assert.IsTrue (r.Read (), "#3");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#3-2");
-                       Assert.AreEqual (XamlLanguage.Initialization, r.Member, "#4");
-                       Assert.IsTrue (r.Read (), "#5");
-                       Assert.AreEqual ("MonoTests.System.Xaml.MyExtension3", r.Value, "#6");
-                       Assert.IsTrue (r.Read (), "#7"); // EndMember
-                       Assert.IsTrue (r.Read (), "#8"); // EndObject
-                       Assert.IsFalse (r.Read (), "#9");
+                       Read_ArgumentAttributed (r, obj);
                }
 
-               protected void Read_CustomMarkupExtension4 (XamlReader r)
-               {
-                       r.Read (); // ns
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#1");
-                       r.Read (); // note that there wasn't another NamespaceDeclaration.
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#2-0");
-                       var xt = r.Type;
-                       Assert.AreEqual (r.SchemaContext.GetXamlType (typeof (MyExtension4)), xt, "#2");
-
-                       if (r is XamlXmlReader)
-                               ReadBase (r);
-
-                       Assert.IsTrue (r.Read (), "#3");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#3-2");
-                       Assert.AreEqual (XamlLanguage.Initialization, r.Member, "#4");
-                       Assert.IsTrue (r.Read (), "#5");
-                       Assert.AreEqual ("MonoTests.System.Xaml.MyExtension4", r.Value, "#6");
-                       Assert.IsTrue (r.Read (), "#7"); // EndMember
-                       Assert.IsTrue (r.Read (), "#8"); // EndObject
-                       Assert.IsFalse (r.Read (), "#9");
-               }
-
-               protected void Read_CustomMarkupExtension5 (XamlReader r)
-               {
-                       r.Read (); // ns
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#1");
-                       r.Read (); // note that there wasn't another NamespaceDeclaration.
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#2-0");
-                       var xt = r.Type;
-                       Assert.AreEqual (r.SchemaContext.GetXamlType (typeof (MyExtension5)), xt, "#2");
-
-                       if (r is XamlXmlReader)
-                               ReadBase (r);
-
-                       Assert.IsTrue (r.Read (), "#3");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#3-2");
-                       Assert.AreEqual (XamlLanguage.PositionalParameters, r.Member, "#4");
-                       Assert.IsTrue (r.Read (), "#5");
-                       Assert.AreEqual ("foo", r.Value, "#6");
-                       Assert.IsTrue (r.Read (), "#7");
-                       Assert.AreEqual ("bar", r.Value, "#8");
-                       Assert.IsTrue (r.Read (), "#9");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#10");
-                       Assert.IsTrue (r.Read (), "#11");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#12");
-                       Assert.IsFalse (r.Read (), "#13");
-               }
-
-               protected void Read_CustomMarkupExtension6 (XamlReader r)
-               {
-                       r.Read (); // ns
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#1");
-                       r.Read (); // note that there wasn't another NamespaceDeclaration.
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#2-0");
-                       var xt = r.Type;
-                       Assert.AreEqual (r.SchemaContext.GetXamlType (typeof (MyExtension6)), xt, "#2");
-
-                       if (r is XamlXmlReader)
-                               ReadBase (r);
-
-                       Assert.IsTrue (r.Read (), "#3");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#3-2");
-                       Assert.AreEqual (xt.GetMember ("Foo"), r.Member, "#4"); // this is the difference between MyExtension5 and MyExtension6: it outputs constructor arguments as normal members
-                       Assert.IsTrue (r.Read (), "#5");
-                       Assert.AreEqual ("foo", r.Value, "#6");
-                       Assert.IsTrue (r.Read (), "#7"); // EndMember
-                       Assert.IsTrue (r.Read (), "#8"); // EndObject
-                       Assert.IsFalse (r.Read (), "#9");
-               }
-
-               protected void Read_Dictionary (XamlReader r)
+               [Test]
+               public void Read_Dictionary ()
                {
-                       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 (String.Empty, r.Namespace.Prefix, "ns#1-4");
-                       Assert.AreEqual ("clr-namespace:System.Collections.Generic;assembly=mscorlib", 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");
-
-                       Assert.IsTrue (r.Read (), "so#1-1");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#1-2");
-                       var xt = new XamlType (typeof (Dictionary<string,object>), r.SchemaContext);
-                       Assert.AreEqual (xt, r.Type, "so#1-3");
-//                     Assert.AreEqual (obj, r.Instance, "so#1-4");
-
-                       if (r is XamlXmlReader)
-                               ReadBase (r);
-
-                       Assert.IsTrue (r.Read (), "smitems#1");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "smitems#2");
-                       Assert.AreEqual (XamlLanguage.Items, r.Member, "smitems#3");
-
-                       for (int i = 0; i < 2; i++) {
-
-                               // start of an item
-                               Assert.IsTrue (r.Read (), "soi#1-1." + i);
-                               Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "soi#1-2." + i);
-                               var xt2 = new XamlType (typeof (double), r.SchemaContext);
-                               Assert.AreEqual (xt2, r.Type, "soi#1-3." + i);
-
-                               Assert.IsTrue (r.Read (), "smi#1-1." + i);
-                               Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "smi#1-2." + i);
-                               Assert.AreEqual (XamlLanguage.Key, r.Member, "smi#1-3." + i);
-
-                               Assert.IsTrue (r.Read (), "svi#1-1." + i);
-                               Assert.AreEqual (XamlNodeType.Value, r.NodeType, "svi#1-2." + i);
-                               Assert.AreEqual (i == 0 ? "Foo" : "Bar", r.Value, "svi#1-3." + i);
-
-                               Assert.IsTrue (r.Read (), "emi#1-1." + i);
-                               Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "emi#1-2." + i);
-
-                               Assert.IsTrue (r.Read (), "smi#2-1." + i);
-                               Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "smi#2-2." + i);
-                               Assert.AreEqual (XamlLanguage.Initialization, r.Member, "smi#2-3." + i);
-
-                               Assert.IsTrue (r.Read (), "svi#2-1." + i);
-                               Assert.AreEqual (XamlNodeType.Value, r.NodeType, "svi#2-2." + i);
-                               Assert.AreEqual (i == 0 ? "5" : "-6.5", r.Value, "svi#2-3." + i); // converted to string(!)
-
-                               Assert.IsTrue (r.Read (), "emi#2-1." + i);
-                               Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "emi#2-2." + i);
-
-                               Assert.IsTrue (r.Read (), "eoi#1-1." + i);
-                               Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eoi#1-2." + i);
-                               // end of an item
-                       }
-
-                       Assert.IsTrue (r.Read (), "emitems#1");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "emitems#2"); // XamlLanguage.Items
-
-                       Assert.IsTrue (r.Read (), "eo#1-1");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#1-2"); // Dictionary
-
-                       Assert.IsFalse (r.Read (), "end");
+                       var obj = new Dictionary<string,object> ();
+                       obj ["Foo"] = 5.0;
+                       obj ["Bar"] = -6.5;
+                       var r = new XamlObjectReader (obj);
+                       Read_Dictionary (r);
                }
-
-               protected void Read_Dictionary2 (XamlReader r, XamlMember ctorArgMember)
+               
+               [Test]
+               public void Read_Dictionary2 ()
                {
-                       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 (String.Empty, r.Namespace.Prefix, "ns#1-4");
-                       Assert.AreEqual ("clr-namespace:System.Collections.Generic;assembly=mscorlib", 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 ("s", r.Namespace.Prefix, "ns#2-4");
-                       Assert.AreEqual ("clr-namespace:System;assembly=mscorlib", r.Namespace.Namespace, "ns#2-5");
-
-                       Assert.IsTrue (r.Read (), "ns#3-1");
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#3-2");
-                       Assert.IsNotNull (r.Namespace, "ns#3-3");
-                       Assert.AreEqual ("sx", r.Namespace.Prefix, "ns#3-4");
-                       Assert.AreEqual ("clr-namespace:System.Xaml;assembly=System.Xaml", r.Namespace.Namespace, "ns#3-5");
-
-                       Assert.IsTrue (r.Read (), "ns#4-1");
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ns#4-2");
-                       Assert.IsNotNull (r.Namespace, "ns#4-3");
-                       Assert.AreEqual ("x", r.Namespace.Prefix, "ns#4-4");
-                       Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns#4-5");
-
-                       Assert.IsTrue (r.Read (), "so#1-1");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#1-2");
-                       var xt = new XamlType (typeof (Dictionary<string,Type>), r.SchemaContext);
-                       Assert.AreEqual (xt, r.Type, "so#1-3");
-//                     Assert.AreEqual (obj, r.Instance, "so#1-4");
-
-                       if (r is XamlXmlReader)
-                               ReadBase (r);
-
-                       Assert.IsTrue (r.Read (), "smitems#1");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "smitems#2");
-                       Assert.AreEqual (XamlLanguage.Items, r.Member, "smitems#3");
-
-                       for (int i = 0; i < 2; i++) {
-
-                               // start of an item
-                               Assert.IsTrue (r.Read (), "soi#1-1." + i);
-                               Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "soi#1-2." + i);
-                               var xt2 = XamlLanguage.Type;
-                               Assert.AreEqual (xt2, r.Type, "soi#1-3." + i);
-
-                               if (r is XamlObjectReader) {
-                                       Read_Dictionary2_ConstructorArgument (r, ctorArgMember, i);
-                                       Read_Dictionary2_Key (r, i);
-                               } else {
-                                       Read_Dictionary2_Key (r, i);
-                                       Read_Dictionary2_ConstructorArgument (r, ctorArgMember, i);
-                               }
-
-                               Assert.IsTrue (r.Read (), "eoi#1-1." + i);
-                               Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eoi#1-2." + i);
-                               // end of an item
-                       }
-
-                       Assert.IsTrue (r.Read (), "emitems#1");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "emitems#2"); // XamlLanguage.Items
-
-                       Assert.IsTrue (r.Read (), "eo#1-1");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#1-2"); // Dictionary
-
-                       Assert.IsFalse (r.Read (), "end");
+                       var obj = new Dictionary<string,Type> ();
+                       obj ["Foo"] = typeof (int);
+                       obj ["Bar"] = typeof (Dictionary<Type,XamlType>);
+                       var r = new XamlObjectReader (obj);
+                       Read_Dictionary2 (r, XamlLanguage.PositionalParameters);
                }
                
-               void Read_Dictionary2_ConstructorArgument (XamlReader r, XamlMember ctorArgMember, int i)
+               [Test]
+               public void PositionalParameters1 ()
                {
-                       Assert.IsTrue (r.Read (), "smi#1-1." + i);
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "smi#1-2." + i);
-                       Assert.AreEqual (ctorArgMember, r.Member, "smi#1-3." + i);
-
-                       Assert.IsTrue (r.Read (), "svi#1-1." + i);
-                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "svi#1-2." + i);
-                       Assert.AreEqual (i == 0 ? "x:Int32" : "Dictionary(s:Type, sx:XamlType)", r.Value, "svi#1-3." + i);
-
-                       Assert.IsTrue (r.Read (), "emi#1-1." + i);
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "emi#1-2." + i);
+                       // Note: this can be read, but cannot be written to XML.
+                       var obj = new PositionalParametersClass1 ("foo", 5);
+                       var r = new XamlObjectReader (obj);
+                       PositionalParameters1 (r);
                }
-
-               void Read_Dictionary2_Key (XamlReader r, int i)
+               
+               [Test]
+               public void PositionalParameters2 ()
                {
-                       Assert.IsTrue (r.Read (), "smi#2-1." + i);
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "smi#2-2." + i);
-                       Assert.AreEqual (XamlLanguage.Key, r.Member, "smi#2-3." + i);
-
-                       Assert.IsTrue (r.Read (), "svi#2-1." + i);
-                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "svi#2-2." + i);
-                       Assert.AreEqual (i == 0 ? "Foo" : "Bar", r.Value, "svi#2-3." + i);
-
-                       Assert.IsTrue (r.Read (), "emi#2-1." + i);
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "emi#2-2." + i);
+                       var obj = new PositionalParametersWrapper ("foo", 5);
+                       var r = new XamlObjectReader (obj);
+                       PositionalParameters2 (r);
                }
 
-               protected void PositionalParameters1 (XamlReader r)
+               [Test]
+               public void ComplexPositionalParameters ()
                {
-                       // ns1 > T:PositionalParametersClass1 > M:_PositionalParameters > foo > 5 > EM:_PositionalParameters > ET:PositionalParametersClass1
-
-                       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 (String.Empty, r.Namespace.Prefix, "ns#1-4");
-                       Assert.AreEqual ("clr-namespace:MonoTests.System.Xaml;assembly=" + GetType ().Assembly.GetName ().Name, r.Namespace.Namespace, "ns#1-5");
-
-                       Assert.IsTrue (r.Read (), "so#1-1");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#1-2");
-                       var xt = new XamlType (typeof (PositionalParametersClass1), r.SchemaContext);
-                       Assert.AreEqual (xt, r.Type, "so#1-3");
-//                     Assert.AreEqual (obj, r.Instance, "so#1-4");
-
-                       if (r is XamlXmlReader)
-                               ReadBase (r);
-
-                       Assert.IsTrue (r.Read (), "sposprm#1");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sposprm#2");
-                       Assert.AreEqual (XamlLanguage.PositionalParameters, r.Member, "sposprm#3");
-
-                       Assert.IsTrue (r.Read (), "sva#1-1");
-                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "sva#1-2");
-                       Assert.AreEqual ("foo", r.Value, "sva#1-3");
-
-                       Assert.IsTrue (r.Read (), "sva#2-1");
-                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "sva#2-2");
-                       Assert.AreEqual ("5", r.Value, "sva#2-3");
-
-                       Assert.IsTrue (r.Read (), "eposprm#1");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eposprm#2"); // XamlLanguage.PositionalParameters
-
-                       Assert.IsTrue (r.Read (), "eo#1-1");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#1-2");
-
-                       Assert.IsFalse (r.Read (), "end");
+                       var obj = new ComplexPositionalParameterWrapper () { Param = new ComplexPositionalParameterClass (new ComplexPositionalParameterValue () { Foo = "foo" })};
+                       var r = new XamlObjectReader (obj);
+                       ComplexPositionalParameters (r);
                }
                
-               protected void PositionalParameters2 (XamlReader r)
+               [Test]
+               public void Read_ListWrapper ()
                {
-                       // ns1 > T:PositionalParametersWrapper > M:Body > T:PositionalParametersClass1 > M:_PositionalParameters > foo > 5 > EM:_PositionalParameters > ET:PositionalParametersClass1
-
-                       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 (String.Empty, r.Namespace.Prefix, "ns#1-4");
-                       Assert.AreEqual ("clr-namespace:MonoTests.System.Xaml;assembly=" + GetType ().Assembly.GetName ().Name, r.Namespace.Namespace, "ns#1-5");
-
-                       Assert.IsTrue (r.Read (), "so#1-1");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#1-2");
-                       var xt = new XamlType (typeof (PositionalParametersWrapper), r.SchemaContext);
-                       Assert.AreEqual (xt, r.Type, "so#1-3");
-//                     Assert.AreEqual (obj, r.Instance, "so#1-4");
-
-                       if (r is XamlXmlReader)
-                               ReadBase (r);
-
-                       Assert.IsTrue (r.Read (), "sm#1-1");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm#1-2");
-                       Assert.AreEqual (xt.GetMember ("Body"), r.Member, "sm#1-3");
-
-                       xt = new XamlType (typeof (PositionalParametersClass1), r.SchemaContext);
-                       Assert.IsTrue (r.Read (), "so#2-1");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2-2");
-                       Assert.AreEqual (xt, r.Type, "so#2-3");
-//                     Assert.AreEqual (obj.Body, r.Instance, "so#2-4");
-
-                       Assert.IsTrue (r.Read (), "sposprm#1");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sposprm#2");
-                       Assert.AreEqual (XamlLanguage.PositionalParameters, r.Member, "sposprm#3");
-
-                       Assert.IsTrue (r.Read (), "sva#1-1");
-                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "sva#1-2");
-                       Assert.AreEqual ("foo", r.Value, "sva#1-3");
-
-                       Assert.IsTrue (r.Read (), "sva#2-1");
-                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "sva#2-2");
-                       Assert.AreEqual ("5", r.Value, "sva#2-3");
-
-                       Assert.IsTrue (r.Read (), "eposprm#1");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eposprm#2"); // XamlLanguage.PositionalParameters
-
-                       Assert.IsTrue (r.Read (), "eo#2-1");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2-2");
-
-                       Assert.IsTrue (r.Read (), "em#1-1");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eo#1-2");
-
-                       Assert.IsTrue (r.Read (), "eo#1-1");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#1-2");
-
-                       Assert.IsFalse (r.Read (), "end");
+                       var obj = new ListWrapper (new List<int> (new int [] {5, -3, 0}));
+                       var r = new XamlObjectReader (obj);
+                       Read_ListWrapper (r);
                }
                
-               protected void ComplexPositionalParameters (XamlReader r)
+               [Test]
+               public void Read_ListWrapper2 () // read-write list member.
                {
-                       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 (String.Empty, r.Namespace.Prefix, "ns#1-4");
-                       Assert.AreEqual ("clr-namespace:MonoTests.System.Xaml;assembly=" + GetType ().Assembly.GetName ().Name, 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");
-
-                       Assert.IsTrue (r.Read (), "so#1-1");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#1-2");
-                       var xt = new XamlType (typeof (ComplexPositionalParameterWrapper), r.SchemaContext);
-                       Assert.AreEqual (xt, r.Type, "so#1-3");
-//                     Assert.AreEqual (obj, r.Instance, "so#1-4");
-
-                       if (r is XamlXmlReader)
-                               ReadBase (r);
-
-                       Assert.IsTrue (r.Read (), "sm#1-1");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm#1-2");
-                       Assert.AreEqual (xt.GetMember ("Param"), r.Member, "sm#1-3");
-
-                       xt = r.SchemaContext.GetXamlType (typeof (ComplexPositionalParameterClass));
-                       Assert.IsTrue (r.Read (), "so#2-1");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#2-2");
-                       Assert.AreEqual (xt, r.Type, "so#2-3");
-//                     Assert.AreEqual (obj.Param, r.Instance, "so#2-4");
-
-                       Assert.IsTrue (r.Read (), "sarg#1");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sarg#2");
-                       Assert.AreEqual (XamlLanguage.Arguments, r.Member, "sarg#3");
-
-                       Assert.IsTrue (r.Read (), "so#3-1");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#3-2");
-                       xt = r.SchemaContext.GetXamlType (typeof (ComplexPositionalParameterValue));
-                       Assert.AreEqual (xt, r.Type, "so#3-3");
-
-                       Assert.IsTrue (r.Read (), "sm#3-1");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sm#3-2");
-                       Assert.AreEqual (xt.GetMember ("Foo"), r.Member, "sm#3-3");
-                       Assert.IsTrue (r.Read (), "v#3-1");
-                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "v#3-2");
-                       Assert.AreEqual ("foo", r.Value, "v#3-3");
-
-                       Assert.IsTrue (r.Read (), "em#3-1");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "em#3-2");
-                       Assert.IsTrue (r.Read (), "eo#3-1");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#3-2");
-
-                       Assert.IsTrue (r.Read (), "earg#1");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "earg#2"); // XamlLanguage.Arguments
-
-                       Assert.IsTrue (r.Read (), "eo#2-1");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#2-2");
-
-                       Assert.IsTrue (r.Read (), "em#1-1");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eo#1-2");
-
-                       Assert.IsTrue (r.Read (), "eo#1-1");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#1-2");
-
-                       Assert.IsFalse (r.Read (), "end");
+                       var obj = new ListWrapper2 (new List<int> (new int [] {5, -3, 0}));
+                       var r = new XamlObjectReader (obj);
+                       Read_ListWrapper2 (r);
                }
 
-               protected void Read_ListWrapper (XamlReader r)
+               [Test]
+               public void Read_ContentIncluded ()
                {
-                       Assert.IsTrue (r.Read (), "#1");
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#2");
-                       Assert.IsNotNull (r.Namespace, "#3");
-                       Assert.AreEqual (String.Empty, r.Namespace.Prefix, "#3-2");
-
-                       Assert.IsTrue (r.Read (), "#11");
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
-                       Assert.IsNotNull (r.Namespace, "#13");
-                       Assert.AreEqual ("x", r.Namespace.Prefix, "#13-2");
-                       Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#13-3");
-
-                       Assert.IsTrue (r.Read (), "#21");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
-                       var xt = new XamlType (typeof (ListWrapper), r.SchemaContext);
-                       Assert.AreEqual (xt, r.Type, "#23");
-//                     Assert.AreEqual (obj, r.Instance, "#26");
-
-                       if (r is XamlXmlReader)
-                               ReadBase (r);
-
-                       Assert.IsTrue (r.Read (), "#61");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#62");
-                       Assert.AreEqual (xt.GetMember ("Items"), r.Member, "#63");
-
-                       Assert.IsTrue (r.Read (), "#71");
-                       Assert.AreEqual (XamlNodeType.GetObject, r.NodeType, "#71-2");
-                       Assert.IsNull (r.Type, "#71-3");
-                       Assert.IsNull (r.Member, "#71-4");
-                       Assert.IsNull (r.Value, "#71-5");
-
-                       Assert.IsTrue (r.Read (), "#72");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#72-2");
-                       Assert.AreEqual (XamlLanguage.Items, r.Member, "#72-3");
-
-                       string [] values = {"5", "-3", "0"};
-                       for (int i = 0; i < 3; i++) {
-                               Assert.IsTrue (r.Read (), i + "#73");
-                               Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, i + "#73-2");
-                               Assert.IsTrue (r.Read (), i + "#74");
-                               Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, i + "#74-2");
-                               Assert.AreEqual (XamlLanguage.Initialization, r.Member, i + "#74-3");
-                               Assert.IsTrue (r.Read (), i + "#75");
-                               Assert.IsNotNull (r.Value, i + "#75-2");
-                               Assert.AreEqual (values [i], r.Value, i + "#73-3");
-                               Assert.IsTrue (r.Read (), i + "#74");
-                               Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, i + "#74-2");
-                               Assert.IsTrue (r.Read (), i + "#75");
-                               Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, i + "#75-2");
-                       }
-
-                       Assert.IsTrue (r.Read (), "#81");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#82"); // XamlLanguage.Items
-
-                       Assert.IsTrue (r.Read (), "#83");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#84"); // GetObject
-
-                       Assert.IsTrue (r.Read (), "#85");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#86"); // ListWrapper.Items
-
-                       Assert.IsTrue (r.Read (), "#87");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#88"); // ListWrapper
-
-                       Assert.IsFalse (r.Read (), "#89");
+                       var obj = new ContentIncludedClass () { Content = "foo" };
+                       var r = new XamlObjectReader (obj);
+                       Read_ContentIncluded (r);
                }
 
-               protected void Read_ListWrapper2 (XamlReader r)
+               [Test]
+               public void Read_PropertyDefinition ()
                {
-                       Assert.IsTrue (r.Read (), "#1");
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#2");
-                       Assert.IsNotNull (r.Namespace, "#3");
-                       Assert.AreEqual (String.Empty, r.Namespace.Prefix, "#3-2");
-
-                       Assert.IsTrue (r.Read (), "#6");
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#7");
-                       Assert.IsNotNull (r.Namespace, "#8");
-                       Assert.AreEqual ("scg", r.Namespace.Prefix, "#8-2");
-                       Assert.AreEqual ("clr-namespace:System.Collections.Generic;assembly=mscorlib", r.Namespace.Namespace, "#8-3");
-
-                       Assert.IsTrue (r.Read (), "#11");
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
-                       Assert.IsNotNull (r.Namespace, "#13");
-                       Assert.AreEqual ("x", r.Namespace.Prefix, "#13-2");
-                       Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#13-3");
-
-                       Assert.IsTrue (r.Read (), "#21");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
-                       var xt = new XamlType (typeof (ListWrapper2), r.SchemaContext);
-                       Assert.AreEqual (xt, r.Type, "#23");
-//                     Assert.AreEqual (obj, r.Instance, "#26");
-
-                       if (r is XamlXmlReader)
-                               ReadBase (r);
-
-                       Assert.IsTrue (r.Read (), "#61");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#62");
-                       Assert.AreEqual (xt.GetMember ("Items"), r.Member, "#63");
-
-                       Assert.IsTrue (r.Read (), "#71");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#71-2");
-                       xt = r.SchemaContext.GetXamlType (typeof (List<int>));
-                       Assert.AreEqual (xt, r.Type, "#71-3");
-                       Assert.IsNull (r.Member, "#71-4");
-                       Assert.IsNull (r.Value, "#71-5");
-
-                       // Capacity
-                       Assert.IsTrue (r.Read (), "#31");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#32");
-                       Assert.AreEqual (xt.GetMember ("Capacity"), r.Member, "#33");
-
-                       Assert.IsTrue (r.Read (), "#41");
-                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#42");
-                       // The value is implementation details, not testable.
-                       //Assert.AreEqual ("3", r.Value, "#43");
-
-                       Assert.IsTrue (r.Read (), "#51");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#52");
-
-                       // Items
-                       Assert.IsTrue (r.Read (), "#72");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#72-2");
-                       Assert.AreEqual (XamlLanguage.Items, r.Member, "#72-3");
-
-                       string [] values = {"5", "-3", "0"};
-                       for (int i = 0; i < 3; i++) {
-                               Assert.IsTrue (r.Read (), i + "#73");
-                               Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, i + "#73-2");
-                               Assert.IsTrue (r.Read (), i + "#74");
-                               Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, i + "#74-2");
-                               Assert.AreEqual (XamlLanguage.Initialization, r.Member, i + "#74-3");
-                               Assert.IsTrue (r.Read (), i + "#75");
-                               Assert.IsNotNull (r.Value, i + "#75-2");
-                               Assert.AreEqual (values [i], r.Value, i + "#73-3");
-                               Assert.IsTrue (r.Read (), i + "#74");
-                               Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, i + "#74-2");
-                               Assert.IsTrue (r.Read (), i + "#75");
-                               Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, i + "#75-2");
-                       }
-
-                       Assert.IsTrue (r.Read (), "#81");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#82"); // XamlLanguage.Items
-
-                       Assert.IsTrue (r.Read (), "#83");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#84"); // StartObject(of List<int>)
-
-                       Assert.IsTrue (r.Read (), "#85");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "#86"); // ListWrapper.Items
+                       var obj = new PropertyDefinition () { Modifier = "protected", Name = "foo", Type = XamlLanguage.String };
+                       var r = new XamlObjectReader (obj);
+                       Read_PropertyDefinition (r);
+               }
 
-                       Assert.IsTrue (r.Read (), "#87");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#88"); // ListWrapper
+               [Test]
+               public void Read_StaticExtensionWrapper ()
+               {
+                       var obj = new StaticExtensionWrapper () { Param = new StaticExtension ("StaticExtensionWrapper.Foo") };
+                       var r = new XamlObjectReader (obj);
+                       Read_StaticExtensionWrapper (r);
+               }
 
-                       Assert.IsFalse (r.Read (), "#89");
+               [Test]
+               public void Read_TypeExtensionWrapper ()
+               {
+                       var obj = new TypeExtensionWrapper () { Param = new TypeExtension ("Foo") };
+                       var r = new XamlObjectReader (obj);
+                       Read_TypeExtensionWrapper (r);
                }
                
-               protected void Read_ContentIncluded (XamlReader r)
+               [Test]
+               public void Read_EventContainer ()
                {
-                       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 (String.Empty, r.Namespace.Prefix, "ns#1-4");
-                       Assert.AreEqual ("clr-namespace:MonoTests.System.Xaml;assembly=" + GetType ().Assembly.GetName ().Name, r.Namespace.Namespace, "ns#1-5");
-
-                       Assert.IsTrue (r.Read (), "so#1-1");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#1-2");
-                       var xt = new XamlType (typeof (ContentIncludedClass), r.SchemaContext);
-                       Assert.AreEqual (xt, r.Type, "so#1-3");
-
-                       if (r is XamlXmlReader)
-                               ReadBase (r);
-
-                       Assert.IsTrue (r.Read (), "sposprm#1");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sposprm#2");
-                       Assert.AreEqual (xt.GetMember ("Content"), r.Member, "sposprm#3");
-
-                       Assert.IsTrue (r.Read (), "sva#1-1");
-                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "sva#1-2");
-                       Assert.AreEqual ("foo", r.Value, "sva#1-3");
-
-                       Assert.IsTrue (r.Read (), "eposprm#1");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "eposprm#2");
-
-                       Assert.IsTrue (r.Read (), "eo#1-1");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#1-2");
-
-                       Assert.IsFalse (r.Read (), "end");
+                       var obj = new EventContainer ();
+                       obj.Run += delegate { Console.Error.WriteLine ("done"); };
+                       var xr = new XamlObjectReader (obj);
+                       Read_EventContainer (xr);
                }
                
-               protected void Read_PropertyDefinition (XamlReader r)
+               [Test]
+               public void Read_NamedItems ()
                {
-                       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 ("x", r.Namespace.Prefix, "ns#1-4");
-                       Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ns#1-5");
-
-                       Assert.IsTrue (r.Read (), "so#1-1");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "so#1-2");
-                       var xt = new XamlType (typeof (PropertyDefinition), r.SchemaContext);
-                       Assert.AreEqual (xt, r.Type, "so#1-3");
-
-                       if (r is XamlXmlReader)
-                               ReadBase (r);
-
-                       Assert.IsTrue (r.Read (), "smod#1");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "smod#2");
-                       Assert.AreEqual (xt.GetMember ("Modifier"), r.Member, "smod#3");
-
-                       Assert.IsTrue (r.Read (), "vmod#1");
-                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vmod#2");
-                       Assert.AreEqual ("protected", r.Value, "vmod#3");
-
-                       Assert.IsTrue (r.Read (), "emod#1");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "emod#2");
-
-                       Assert.IsTrue (r.Read (), "sname#1");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sname#2");
-                       Assert.AreEqual (xt.GetMember ("Name"), r.Member, "sname#3");
-
-                       Assert.IsTrue (r.Read (), "vname#1");
-                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vname#2");
-                       Assert.AreEqual ("foo", r.Value, "vname#3");
-
-                       Assert.IsTrue (r.Read (), "ename#1");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ename#2");
+                       // foo
+                       // - bar
+                       // -- foo
+                       // - baz
+                       var obj = new NamedItem ("foo");
+                       var obj2 = new NamedItem ("bar");
+                       obj.References.Add (obj2);
+                       obj.References.Add (new NamedItem ("baz"));
+                       obj2.References.Add (obj);
 
-                       Assert.IsTrue (r.Read (), "stype#1");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "stype#2");
-                       Assert.AreEqual (xt.GetMember ("Type"), r.Member, "stype#3");
-
-                       Assert.IsTrue (r.Read (), "vtype#1");
-                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vtype#2");
-                       Assert.AreEqual ("x:String", r.Value, "vtype#3");
-
-                       Assert.IsTrue (r.Read (), "etype#1");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "etype#2");
-
-                       Assert.IsTrue (r.Read (), "eo#1-1");
-                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "eo#1-2");
-
-                       Assert.IsFalse (r.Read (), "end");
+                       var xr = new XamlObjectReader (obj);
+                       Read_NamedItems (xr, true);
                }
 
-               protected void Read_CommonXamlPrimitive (object obj)
+               [Test]
+               public void Read_NamedItems2 ()
                {
-                       var r = new XamlObjectReader (obj);
-                       Read_CommonXamlType (r);
-                       Read_Initialization (r, obj);
-               }
+                       // i1
+                       // - i2
+                       // -- i3
+                       // - i4
+                       // -- i3
+                       var obj = new NamedItem2 ("i1");
+                       var obj2 = new NamedItem2 ("i2");
+                       var obj3 = new NamedItem2 ("i3");
+                       var obj4 = new NamedItem2 ("i4");
+                       obj.References.Add (obj2);
+                       obj.References.Add (obj4);
+                       obj2.References.Add (obj3);
+                       obj4.References.Add (obj3);
 
-               // from StartMember of Initialization to EndMember
-               protected string Read_Initialization (XamlReader r, object comparableValue)
-               {
-                       Assert.IsTrue (r.Read (), "init#1");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "init#2");
-                       Assert.IsNotNull (r.Member, "init#3");
-                       Assert.AreEqual (XamlLanguage.Initialization, r.Member, "init#3-2");
-                       Assert.IsTrue (r.Read (), "init#4");
-                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "init#5");
-                       Assert.AreEqual (typeof (string), r.Value.GetType (), "init#6");
-                       string ret = (string) r.Value;
-                       if (comparableValue != null)
-                               Assert.AreEqual (comparableValue.ToString (), r.Value, "init#6-2");
-                       Assert.IsTrue (r.Read (), "init#7");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "init#8");
-                       return ret;
+                       var xr = new XamlObjectReader (obj);
+                       Read_NamedItems2 (xr, true);
                }
 
-               protected object [] Read_AttributedArguments_String (XamlReader r, string [] argNames) // valid only for string arguments.
+               [Test]
+               public void Read_XmlSerializableWrapper ()
                {
-                       object [] ret = new object [argNames.Length];
-
-                       Assert.IsTrue (r.Read (), "attarg.Arguments.Start1");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "attarg.Arguments.Start2");
-                       Assert.IsNotNull (r.Member, "attarg.Arguments.Start3");
-                       Assert.AreEqual (XamlLanguage.Arguments, r.Member, "attarg.Arguments.Start4");
-                       for (int i = 0; i < argNames.Length; i++) {
-                               string arg = argNames [i];
-                               Assert.IsTrue (r.Read (), "attarg.ArgStartObject1." + arg);
-                               Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "attarg.ArgStartObject2." + arg);
-                               Assert.AreEqual (typeof (string), r.Type.UnderlyingType, "attarg.ArgStartObject3." + arg);
-                               Assert.IsTrue (r.Read (), "attarg.ArgStartMember1." + arg);
-                               Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "attarg.ArgStartMember2." + arg);
-                               Assert.AreEqual (XamlLanguage.Initialization, r.Member, "attarg.ArgStartMember3." + arg); // (as the argument is string here by definition)
-                               Assert.IsTrue (r.Read (), "attarg.ArgValue1." + arg);
-                               Assert.AreEqual (XamlNodeType.Value, r.NodeType, "attarg.ArgValue2." + arg);
-                               Assert.AreEqual (typeof (string), r.Value.GetType (), "attarg.ArgValue3." + arg);
-                               ret [i] = r.Value;
-                               Assert.IsTrue (r.Read (), "attarg.ArgEndMember1." + arg);
-                               Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "attarg.ArgEndMember2." + arg);
-                               Assert.IsTrue (r.Read (), "attarg.ArgEndObject1." + arg);
-                               Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "attarg.ArgEndObject2." + arg);
-                       }
-                       Assert.IsTrue (r.Read (), "attarg.Arguments.End1");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "attarg.Arguments.End2");
-                       return ret;
+                       var obj = new XmlSerializableWrapper (new XmlSerializable ("<root/>"));
+                       var xr = new XamlObjectReader (obj);
+                       Read_XmlSerializableWrapper (xr, true);
                }
 
-               // from initial to StartObject
-               protected void Read_CommonXamlType (XamlObjectReader r)
+               [Test] // If it is root, it is not serialized as IXmlSerializable.
+               public void Read_XmlSerializable ()
                {
-                       Read_CommonXamlType (r, delegate {
-                               Assert.IsNull (r.Instance, "ct#4");
-                               });
+                       var obj = new XmlSerializable ("<root/>");
+                       var xr = new XamlObjectReader (obj);
+                       Read_XmlSerializable (xr);
                }
-               
-               protected void Read_CommonXamlType (XamlReader r, Action validateInstance)
-               {
-                       Assert.IsTrue (r.Read (), "ct#1");
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ct#2");
-                       Assert.IsNotNull (r.Namespace, "ct#3");
-                       Assert.AreEqual ("x", r.Namespace.Prefix, "ct#3-2");
-                       Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ct#3-3");
-                       if (validateInstance != null)
-                               validateInstance ();
 
-                       Assert.IsTrue (r.Read (), "ct#5");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "ct#6");
+               [Test] // List contents are (sort of) treated as top-level too, so it is not serialized as IXmlSerializable(!)
+               public void Read_ListXmlSerializable ()
+               {
+                       var obj = new List<XmlSerializable> ();
+                       obj.Add (new XmlSerializable ("<root/>"));
+                       var xr = new XamlObjectReader (obj);
+                       Read_ListXmlSerializable (xr);
                }
-
-               // from initial to StartObject
-               protected void Read_CommonClrType (XamlReader r, object obj, params KeyValuePair<string,string> [] additionalNamespaces)
-               {
-                       Assert.IsTrue (r.Read (), "ct#1");
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ct#2");
-                       Assert.IsNotNull (r.Namespace, "ct#3");
-                       Assert.AreEqual (String.Empty, r.Namespace.Prefix, "ct#3-2");
-                       Assert.AreEqual ("clr-namespace:" + obj.GetType ().Namespace + ";assembly=" + obj.GetType ().Assembly.GetName ().Name, r.Namespace.Namespace, "ct#3-3");
-
-                       foreach (var kvp in additionalNamespaces) {
-                               Assert.IsTrue (r.Read (), "ct#4." + kvp.Key);
-                               Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ct#5." + kvp.Key);
-                               Assert.IsNotNull (r.Namespace, "ct#6." + kvp.Key);
-                               Assert.AreEqual (kvp.Key, r.Namespace.Prefix, "ct#6-2." + kvp.Key);
-                               Assert.AreEqual (kvp.Value, r.Namespace.Namespace, "ct#6-3." + kvp.Key);
+               
+               [Test]
+               public void Read_AttachedProperty ()
+               {
+                       var obj = new AttachedWrapper ();
+                       Attachable.SetFoo (obj, "x");
+                       Attachable.SetFoo (obj.Value, "y");
+                       try {
+                               var xr = new XamlObjectReader (obj);
+                               Read_AttachedProperty (xr);
+                       } finally {
+                               Attachable.SetFoo (obj, null);
+                               Attachable.SetFoo (obj.Value, null);
                        }
-
-                       Assert.IsTrue (r.Read (), "ct#7");
-                       Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "ct#8");
                }
-
-               protected void ReadBase (XamlReader r)
+               
+               [Test]
+               [Ignore ("Foo does not work as attached properties in this test yet")]
+               public void Read_AttachedProperty2 ()
                {
-                       Assert.IsTrue (r.Read (), "sbase#1");
-                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "sbase#2");
-                       Assert.AreEqual (XamlLanguage.Base, r.Member, "sbase#3");
-
-                       Assert.IsTrue (r.Read (), "vbase#1");
-                       Assert.AreEqual (XamlNodeType.Value, r.NodeType, "vbase#2");
-                       Assert.IsTrue (r.Value is string, "vbase#3");
-
-                       Assert.IsTrue (r.Read (), "ebase#1");
-                       Assert.AreEqual (XamlNodeType.EndMember, r.NodeType, "ebase#2");
+                       var obj = new AttachedWrapper2 ();
+                       AttachedWrapper2.SetFoo (obj, "x");
+                       AttachedWrapper2.SetFoo (obj.Value, "y");
+                       try {
+                               var xr = new XamlObjectReader (obj);
+//while (xr.Read ()) Console.Error.WriteLine ("{0} {1} {2} {3}", xr.NodeType, xr.Type, xr.Member, xr.Value);
+                       } finally {
+                               AttachedWrapper2.SetFoo (obj, null);
+                               AttachedWrapper2.SetFoo (obj.Value, null);
+                       }
                }
-       }
 
-       public partial class XamlObjectReaderTest
-       {
                [Test]
-               public void Read_Dictionary ()
+               public void Read_AbstractContainer ()
                {
-                       var obj = new Dictionary<string,object> ();
-                       obj ["Foo"] = 5.0;
-                       obj ["Bar"] = -6.5;
-                       var r = new XamlObjectReader (obj);
-                       Read_Dictionary (r);
+                       var obj = new AbstractContainer () { Value2 = new DerivedObject () { Foo = "x" } };
+                       var xr = new XamlObjectReader (obj);
+                       while (!xr.IsEof)
+                               xr.Read ();
                }
-               
+
                [Test]
-               public void Read_Dictionary2 ()
+               public void Read_ReadOnlyPropertyContainer ()
                {
-                       var obj = new Dictionary<string,Type> ();
-                       obj ["Foo"] = typeof (int);
-                       obj ["Bar"] = typeof (Dictionary<Type,XamlType>);
-                       var r = new XamlObjectReader (obj);
-                       Read_Dictionary2 (r, XamlLanguage.PositionalParameters);
+                       var obj = new ReadOnlyPropertyContainer () { Foo = "x" };
+                       var xr = new XamlObjectReader (obj);
+                       var xt = xr.SchemaContext.GetXamlType (obj.GetType ());
+                       while (xr.Read ())
+                               if (xr.NodeType == XamlNodeType.StartMember)
+                                       break;
+                       Assert.AreEqual (xt.GetMember ("Foo"), xr.Member, "#1");
+                       while (!xr.IsEof)
+                               xr.Read ();
                }
-               
+
                [Test]
-               public void PositionalParameters1 ()
+               public void Read_TypeConverterOnListMember ()
                {
-                       // Note: this can be read, but cannot be written to XML.
-                       var obj = new PositionalParametersClass1 ("foo", 5);
-                       var r = new XamlObjectReader (obj);
-                       PositionalParameters1 (r);
+                       var obj = new SecondTest.TypeOtherAssembly ();
+                       obj.Values.AddRange (new uint? [] {1, 2, 3});
+                       var xr = new XamlObjectReader (obj);
+                       Read_TypeConverterOnListMember (xr);
                }
-               
+
                [Test]
-               public void PositionalParameters2 ()
+               public void Read_EnumContainer ()
                {
-                       var obj = new PositionalParametersWrapper ("foo", 5);
-                       var r = new XamlObjectReader (obj);
-                       PositionalParameters2 (r);
+                       var obj = new EnumContainer () { EnumProperty = EnumValueType.Two };
+                       var xr = new XamlObjectReader (obj);
+                       Read_EnumContainer (xr);
                }
 
                [Test]
-               public void ComplexPositionalParameters ()
+               public void Read_CollectionContentProperty ()
                {
-                       var obj = new ComplexPositionalParameterWrapper () { Param = new ComplexPositionalParameterClass (new ComplexPositionalParameterValue () { Foo = "foo" })};
-                       var r = new XamlObjectReader (obj);
-                       ComplexPositionalParameters (r);
+                       var obj = new CollectionContentProperty ();
+                       for (int i = 0; i < 4; i++)
+                               obj.ListOfItems.Add (new SimpleClass ());
+                       var xr = new XamlObjectReader (obj);
+                       Read_CollectionContentProperty (xr, false);
                }
-               
+
                [Test]
-               public void Read_ListWrapper ()
+               public void Read_CollectionContentPropertyX ()
                {
-                       var obj = new ListWrapper (new List<int> (new int [] {5, -3, 0}));
-                       var r = new XamlObjectReader (obj);
-                       Read_ListWrapper (r);
+                       var obj = new CollectionContentPropertyX ();
+                       var l = new List<object> ();
+                       obj.ListOfItems.Add (l);
+                       for (int i = 0; i < 4; i++)
+                               l.Add (new SimpleClass ());
+                       var xr = new XamlObjectReader (obj);
+                       Read_CollectionContentPropertyX (xr, false);
                }
-               
+
                [Test]
-               public void Read_ListWrapper2 () // read-write list member.
+               [Category ("NotWorking")] // only member ordering difference, maybe.
+               public void Read_AmbientPropertyContainer ()
                {
-                       var obj = new ListWrapper2 (new List<int> (new int [] {5, -3, 0}));
-                       var r = new XamlObjectReader (obj);
-                       Read_ListWrapper2 (r);
+                       var obj = new SecondTest.ResourcesDict ();
+                       var t1 = new SecondTest.TestObject ();
+                       obj.Add ("TestDictItem", t1);
+                       var t2 = new SecondTest.TestObject ();
+                       t2.TestProperty = t1;
+                       obj.Add ("okay", t2);
+                       var xr = new XamlObjectReader (obj);
+                       Read_AmbientPropertyContainer (xr, false);
                }
 
                [Test]
-               public void Read_ContentIncluded ()
+               [Category ("NotWorking")] // only member ordering difference, maybe.
+               public void Read_AmbientPropertyContainer2 ()
                {
-                       var obj = new ContentIncludedClass () { Content = "foo" };
-                       var r = new XamlObjectReader (obj);
-                       Read_ContentIncluded (r);
+                       var obj = new SecondTest.ResourcesDict ();
+                       var t1 = new SecondTest.TestObject ();
+                       obj.Add ("TestDictItem", t1);
+                       obj.Add ("okay", new SecondTest.ResourceExtension (t1));
+                       var xr = new XamlObjectReader (obj);
+                       Read_AmbientPropertyContainer (xr, true);
                }
 
                [Test]
-               public void Read_PropertyDefinition ()
+               public void Read_NullableContainer ()
                {
-                       var obj = new PropertyDefinition () { Modifier = "protected", Name = "foo", Type = XamlLanguage.String };
-                       var r = new XamlObjectReader (obj);
-                       Read_PropertyDefinition (r);
+                       var obj = new NullableContainer () { TestProp = 5 };
+                       var xr = new XamlObjectReader (obj);
+                       Read_NullableContainer (xr);
                }
        }
 }