Add Dictionary related tests.
[mono.git] / mcs / class / System.Xaml / Test / System.Xaml / XamlObjectReaderTest.cs
index c00a4329b9463564f66440dfac8448a310998961..16db42dbb89ebb805f0ea1da56fe366e84ae96dc 100644 (file)
@@ -33,7 +33,7 @@ using System.Xaml.Schema;
 using System.Xml;
 using NUnit.Framework;
 
-using Category = NUnit.Framework.CategoryAttribute;
+using CategoryAttribute = NUnit.Framework.CategoryAttribute;
 
 // Some test result remarks:
 // - TypeExtension: [ConstructorArgument] -> PositionalParameters
@@ -41,6 +41,7 @@ using Category = NUnit.Framework.CategoryAttribute;
 // - 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
 {
@@ -174,6 +175,115 @@ namespace MonoTests.System.Xaml
                        new XamlObjectReader (new TestClass3 ());
                }
 
+               [Test]
+               public void WriteNullMemberAsObject ()
+               {
+                       var r = new XamlObjectReader (new TestClass4 ());
+
+                       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");
+
+                       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");
+
+                       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");
+                       Assert.IsNull (r.Instance, "#43-4");
+
+                       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");
+               }
+
+               [Test]
+               public void StaticMember ()
+               {
+                       var r = new XamlObjectReader (new TestClass5 ());
+
+                       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");
+
+                       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.
+                       // nonpublic Baz does not appear either.
+
+                       Assert.IsTrue (r.Read (), "#51");
+                       Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#52");
+
+                       Assert.IsFalse (r.Read (), "#56");
+                       Assert.IsTrue (r.IsEof, "#57");
+               }
+
                [Test]
                public void Skip ()
                {
@@ -201,7 +311,6 @@ namespace MonoTests.System.Xaml
                }
 
                [Test]
-               [Category ("NotWorking")]
                public void Read2 ()
                {
                        var doc = new XmlDocument ();
@@ -275,22 +384,21 @@ namespace MonoTests.System.Xaml
                }
 
                [Test]
-               [Category ("NotWorking")]
                public void Read_Type ()
                {
                        var r = new XamlObjectReader (typeof (int));
-                       Read_TypeOrTypeExtension (r);
+                       Read_TypeOrTypeExtension (r, typeof (int));
                }
                
                [Test]
-               [Category ("NotWorking")]
                public void Read_TypeExtension ()
                {
-                       var r = new XamlObjectReader (new TypeExtension (typeof (int)));
-                       Read_TypeOrTypeExtension (r);
+                       var tx = new TypeExtension (typeof (int));
+                       var r = new XamlObjectReader (tx);
+                       Read_TypeOrTypeExtension (r, tx);
                }
 
-               void Read_TypeOrTypeExtension (XamlObjectReader r)
+               void Read_TypeOrTypeExtension (XamlObjectReader r, object obj)
                {
                        Assert.IsTrue (r.Read (), "#11");
                        Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#12");
@@ -335,7 +443,6 @@ namespace MonoTests.System.Xaml
                }
 
                [Test]
-               [Category ("NotWorking")] // namespace node differences
                public void Read_Type2 ()
                {
                        var r = new XamlObjectReader (typeof (TestClass1));
@@ -343,7 +450,6 @@ namespace MonoTests.System.Xaml
                }
                
                [Test]
-               [Category ("NotWorking")] // namespace node differences
                public void Read_TypeExtension2 ()
                {
                        var r = new XamlObjectReader (new TypeExtension (typeof (TestClass1)));
@@ -354,14 +460,17 @@ namespace MonoTests.System.Xaml
                {
                        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 ("clr-namespace:MonoTests.System.Xaml;assembly=" + GetType ().Assembly.GetName ().Name, r.Namespace.Namespace, "#13-3");
+                       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");
+                       Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "#18-3:" + r.Namespace.Prefix);
 
                        Assert.IsTrue (r.Read (), "#21");
                        Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
@@ -459,7 +568,6 @@ namespace MonoTests.System.Xaml
                }
 
                [Test] // almost identical to TypeExtension (only type/instance difference)
-               [Category ("NotWorking")]
                public void Read_StaticExtension ()
                {
                        var r = new XamlObjectReader (new StaticExtension ("MyMember"));
@@ -495,6 +603,76 @@ namespace MonoTests.System.Xaml
 
                [Test]
                [Category ("NotWorking")]
+               public void Read_ListInt32 ()
+               {
+                       var obj = new List<int> (new int [] {5, -3, 0});
+
+                       var r = new XamlObjectReader (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.AreEqual (obj, r.Instance, "#26");
+                       Assert.IsTrue (xt.IsCollection, "#27");
+
+                       // 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"); // ArrayExtension
+
+                       Assert.IsFalse (r.Read (), "#89");
+               }
+
+               [Test]
                public void Read_Array ()
                {
                        var obj = new int [] {5, -3, 0};
@@ -503,7 +681,6 @@ namespace MonoTests.System.Xaml
                }
                
                [Test]
-               [Category ("NotWorking")]
                public void Read_ArrayExtension ()
                {
                        var obj = new ArrayExtension (new int [] {5, -3, 0});
@@ -523,7 +700,9 @@ namespace MonoTests.System.Xaml
                        Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#22");
                        var xt = new XamlType (typeof (ArrayExtension), r.SchemaContext);
                        Assert.AreEqual (xt, r.Type, "#23");
-                       Assert.AreEqual (instance, r.Instance, "#26"); // different between Array and ArrayExtension
+                       Assert.AreEqual (instance, r.Instance, "#26"); // different between Array and ArrayExtension. Also, different from Type and TypeExtension (Type returns TypeExtension, while Array remains to return Array)
+
+                       // 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");
@@ -581,6 +760,41 @@ namespace MonoTests.System.Xaml
                        Assert.IsFalse (r.Read (), "#89");
                }
 
+               [Test] // It gives Type member, not PositionalParameters... and no Items member here.
+               public void Read_ArrayExtension2 ()
+               {
+                       var r = new XamlObjectReader (new ArrayExtension (typeof (int)));
+                       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");
+
+                       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");
+               }
+
                [Test]
                public void Read_DateTime ()
                {
@@ -623,6 +837,352 @@ namespace MonoTests.System.Xaml
                        SimpleReadStandardType (new TypeExtension ());
                }
 
+               [Test]
+               public void Read_CustomMarkupExtension ()
+               {
+                       var r = new XamlObjectReader (new MyExtension () { Foo = typeof (int), Bar = "v2", Baz = "v7"});
+                       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;
+
+                       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");
+               }
+
+               [Test]
+               public void Read_CustomMarkupExtension2 ()
+               {
+Console.Error.WriteLine (XamlServices.Save (new MyExtension2 () { Foo = typeof (int), Bar = "v2"}));
+                       var r = new XamlObjectReader (new MyExtension2 () { Foo = typeof (int), Bar = "v2"});
+                       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");
+                       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");
+               }
+
+               [Test]
+               public void Read_CustomMarkupExtension3 ()
+               {
+                       var r = new XamlObjectReader (new MyExtension3 () { Foo = typeof (int), Bar = "v2"});
+                       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");
+                       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");
+               }
+
+               [Test]
+               public void Read_CustomMarkupExtension4 ()
+               {
+                       var r = new XamlObjectReader (new MyExtension4 () { Foo = typeof (int), Bar = "v2"});
+                       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");
+                       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");
+               }
+
+               [Test]
+               [Category ("NotWorking")]
+               public void Read_CustomMarkupExtension5 ()
+               {
+                       // This cannot be written to XamlXmlWriter though...
+
+                       var r = new XamlObjectReader (new MyExtension5 ("foo"));
+                       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");
+                       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"); // EndMember
+                       Assert.IsTrue (r.Read (), "#8"); // EndObject
+                       Assert.IsFalse (r.Read (), "#9");
+               }
+
+               [Test]
+               [Category ("NotWorking")]
+               public void Read_CustomMarkupExtension6 ()
+               {
+Console.Error.WriteLine (XamlServices.Save (new MyExtension6 ("foo")));
+                       var r = new XamlObjectReader (new MyExtension6 ("foo"));
+                       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");
+                       Assert.IsTrue (r.Read (), "#3");
+                       Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#3-2");
+                       Assert.AreEqual (xt.GetMember ("Foo"), r.Member, "#4"); // this is the only difference between MyExtension5 and MyExtension6.
+                       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");
+               }
+
+               [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");
+               }
+
+               [Test]
+               public void Read_Dictionary ()
+               {
+                       var obj = new Dictionary<string,object> ();
+                       obj ["Foo"] = 5.0;
+                       obj ["Bar"] = -6.5;
+                       var r = new XamlObjectReader (obj);
+
+                       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");
+
+                       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");
+               }
+               
+               [Test]
+               [Category ("NotWorking")]
+               public void PositionalParameters1 ()
+               {
+                       // ns1 > T:PositionalParametersClass1 > M:_PositionalParameters > foo > 5 > EM:_PositionalParameters > ET:PositionalParametersClass1
+
+                       // Note: this can be read, but cannot be written to XML.
+                       var obj = new PositionalParametersClass1 ("foo", 5);
+                       var r = new XamlObjectReader (obj);
+
+                       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");
+
+                       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");
+               }
+               
+               [Test]
+               [Category ("NotWorking")]
+               public void PositionalParameters2 ()
+               {
+                       // ns1 > T:PositionalParametersWrapper > M:Body > T:PositionalParametersClass1 > M:_PositionalParameters > foo > 5 > EM:_PositionalParameters > ET:PositionalParametersClass1
+
+                       var obj = new PositionalParametersWrapper ("foo", 5);
+                       var r = new XamlObjectReader (obj);
+
+                       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");
+
+                       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");
+               }
+
                void SimpleReadStandardType (object instance)
                {
                        var r = new XamlObjectReader (instance);
@@ -655,6 +1215,36 @@ namespace MonoTests.System.Xaml
                        return ret;
                }
 
+               object [] Read_AttributedArguments_String (XamlObjectReader r, string [] argNames) // valid only for string arguments.
+               {
+                       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;
+               }
+
                // from initial to StartObject
                void Read_CommonXamlType (XamlObjectReader r)
                {
@@ -670,7 +1260,7 @@ namespace MonoTests.System.Xaml
                }
 
                // from initial to StartObject
-               void Read_CommonClrType (XamlObjectReader r, object obj)
+               void Read_CommonClrType (XamlObjectReader r, object obj, params KeyValuePair<string,string> [] additionalNamespaces)
                {
                        Assert.IsTrue (r.Read (), "ct#1");
                        Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ct#2");
@@ -678,13 +1268,13 @@ namespace MonoTests.System.Xaml
                        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");
 
-/*
-                       Assert.IsTrue (r.Read (), "ct#4");
-                       Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "ct#5");
-                       Assert.IsNotNull (r.Namespace, "ct#6");
-                       Assert.AreEqual ("x", r.Namespace.Prefix, "ct#6-2");
-                       Assert.AreEqual (XamlLanguage.Xaml2006Namespace, r.Namespace.Namespace, "ct#6-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);
+                       }
 
                        Assert.IsTrue (r.Read (), "ct#7");
                        Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "ct#8");
@@ -699,4 +1289,189 @@ namespace MonoTests.System.Xaml
        {
                public TestClass3 Nested { get; set; }
        }
+
+       public class TestClass4
+       {
+               public string Foo { get; set; }
+               public string Bar { get; set; }
+       }
+       
+       public class TestClass5
+       {
+               public static string Foo { get; set; }
+               public string Bar { get; set; }
+               public string Baz { internal get; set; }
+       }
+
+       public class MyExtension : MarkupExtension
+       {
+               public MyExtension ()
+               {
+               }
+
+               public MyExtension (Type arg1, string arg2, string arg3)
+               {
+                       Foo = arg1;
+                       Bar = arg2;
+                       Baz = arg3;
+               }
+
+               [ConstructorArgument ("arg1")]
+               public Type Foo { get; set; }
+               
+               [ConstructorArgument ("arg2")]
+               public string Bar { get; set; }
+               
+               [ConstructorArgument ("arg3")]
+               public string Baz { get; set; }
+
+               public override object ProvideValue (IServiceProvider provider)
+               {
+                       return "provided_value";
+               }
+       }
+
+       [TypeConverter (typeof (StringConverter))] // This attribute is the markable difference between MyExtension and this type.
+       public class MyExtension2 : MarkupExtension
+       {
+               public MyExtension2 ()
+               {
+               }
+
+               public MyExtension2 (Type arg1, string arg2)
+               {
+                       Foo = arg1;
+                       Bar = arg2;
+               }
+
+               [ConstructorArgument ("arg1")]
+               public Type Foo { get; set; }
+               
+               [ConstructorArgument ("arg2")]
+               public string Bar { get; set; }
+
+               public override object ProvideValue (IServiceProvider provider)
+               {
+                       return "provided_value";
+               }
+       }
+
+       [TypeConverter (typeof (StringConverter))] // same as MyExtension2 except that it is *not* MarkupExtension.
+       public class MyExtension3
+       {
+               public MyExtension3 ()
+               {
+               }
+
+               // cf. According to [MS-XAML-2009] 3.2.1.11, constructors are invalid unless the type is derived from TypeExtension. So, it is likely *ignored*.
+               public MyExtension3 (Type arg1, string arg2)
+               {
+                       Foo = arg1;
+                       Bar = arg2;
+               }
+
+               [ConstructorArgument ("arg1")]
+               public Type Foo { get; set; }
+               
+               [ConstructorArgument ("arg2")]
+               public string Bar { get; set; }
+       }
+
+       [TypeConverter (typeof (DateTimeConverter))] // same as MyExtension3 except for the type converter.
+       public class MyExtension4
+       {
+               public MyExtension4 ()
+               {
+               }
+
+               // cf. According to [MS-XAML-2009] 3.2.1.11, constructors are invalid unless the type is derived from TypeExtension. So, it is likely *ignored*.
+               public MyExtension4 (Type arg1, string arg2)
+               {
+                       Foo = arg1;
+                       Bar = arg2;
+               }
+
+               [ConstructorArgument ("arg1")]
+               public Type Foo { get; set; }
+               
+               [ConstructorArgument ("arg2")]
+               public string Bar { get; set; }
+       }
+
+       // no type converter, and there's only one argument == _PositionalParameters is applicable.
+       public class MyExtension5 : MarkupExtension
+       {
+               public MyExtension5 (string arg1)
+               {
+                       Foo = arg1;
+               }
+
+               [ConstructorArgument ("arg1")]
+               public string Foo { get; set; }
+               
+               public override object ProvideValue (IServiceProvider sp)
+               {
+                       return Foo;
+               }
+       }
+
+       // Almost the same as MyExtension5, BUT there is default constructor which XamlObjectReader prefers.
+       public class MyExtension6 : MarkupExtension
+       {
+               public MyExtension6 ()
+               {
+               }
+
+               public MyExtension6 (string arg1)
+               {
+                       Foo = arg1;
+               }
+
+               [ConstructorArgument ("arg1")]
+               public string Foo { get; set; }
+               
+               public override object ProvideValue (IServiceProvider sp)
+               {
+                       return Foo;
+               }
+       }
+
+       public class PositionalParametersClass1 : MarkupExtension
+       {
+               public PositionalParametersClass1 (string foo)
+                       : this (foo, -1)
+               {
+               }
+               
+               public PositionalParametersClass1 (string foo, int bar)
+               {
+                       Foo = foo;
+                       Bar = bar;
+               }
+               
+               [ConstructorArgument ("foo")]
+               public string Foo { get; set; }
+
+               [ConstructorArgument ("bar")]
+               public int Bar { get; set; }
+
+               public override object ProvideValue (IServiceProvider sp)
+               {
+                       return Foo;
+               }
+       }
+
+       public class PositionalParametersWrapper
+       {
+               public PositionalParametersClass1 Body { get; set; }
+               
+               public PositionalParametersWrapper ()
+               {
+               }
+               
+               public PositionalParametersWrapper (string foo, int bar)
+               {
+                       Body = new PositionalParametersClass1 (foo, bar);
+               }
+       }
 }