using System.Xml;
using NUnit.Framework;
-using Category = NUnit.Framework.CategoryAttribute;
+using CategoryAttribute = NUnit.Framework.CategoryAttribute;
// Some test result remarks:
// - TypeExtension: [ConstructorArgument] -> PositionalParameters
// - 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
{
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 ()
{
}
[Test]
- [Category ("NotWorking")]
public void Read2 ()
{
var doc = new XmlDocument ();
}
[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");
}
[Test]
- [Category ("NotWorking")] // namespace node differences
public void Read_Type2 ()
{
var r = new XamlObjectReader (typeof (TestClass1));
}
[Test]
- [Category ("NotWorking")] // namespace node differences
public void Read_TypeExtension2 ()
{
var r = new XamlObjectReader (new TypeExtension (typeof (TestClass1)));
{
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");
}
[Test] // almost identical to TypeExtension (only type/instance difference)
- [Category ("NotWorking")]
public void Read_StaticExtension ()
{
var r = new XamlObjectReader (new StaticExtension ("MyMember"));
[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};
}
[Test]
- [Category ("NotWorking")]
public void Read_ArrayExtension ()
{
var obj = new ArrayExtension (new int [] {5, -3, 0});
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");
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 ()
{
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);
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)
{
}
// 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");
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");
{
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);
+ }
+ }
}