// // Copyright (C) 2010 Novell Inc. http://novell.com // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.IO; using System.Linq; using System.Reflection; using System.Windows.Markup; using System.Xaml; using System.Xaml.Schema; using System.Xml; 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] public class XamlObjectReaderTest { [Test] public void ConstructorNullObject () { // allowed. new XamlObjectReader (null); } [Test] [ExpectedException (typeof (ArgumentNullException))] public void ConstructorNullSchemaContext () { new XamlObjectReader ("foo", (XamlSchemaContext) null); } [Test] public void ConstructorNullSettings () { new XamlObjectReader ("foo", (XamlObjectReaderSettings) null); } [Test] [ExpectedException (typeof (ArgumentNullException))] public void ConstructorNullSchemaContext2 () { new XamlObjectReader ("foo", null, new XamlObjectReaderSettings ()); } [Test] public void ConstructorNullSettings2 () { new XamlObjectReader ("foo", new XamlSchemaContext (null, null), null); } [Test] public void ReadNull () { var r = new XamlObjectReader (null); Assert.IsTrue (r.Read (), "#1"); Assert.AreEqual (XamlNodeType.NamespaceDeclaration, r.NodeType, "#1-2"); Assert.IsTrue (r.Read (), "#2"); Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "#2-2"); Assert.AreEqual (XamlLanguage.Null, r.Type, "#2-3"); Assert.IsTrue (r.Read (), "#3"); Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#3-2"); Assert.IsFalse (r.Read (), "#4"); Assert.AreEqual (XamlNodeType.None, r.NodeType, "#4-2"); } [Test] public void Read1 () { var r = new XamlObjectReader ("Foo"); 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"); 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"); } [Test] [ExpectedException (typeof (XamlObjectReaderException))] public void ReadNonConstructible () { // XamlType has no default constructor. var r = new XamlObjectReader (XamlLanguage.String); } [Test] [ExpectedException (typeof (XamlObjectReaderException))] public void NonPublicType () { new XamlObjectReader (new TestClass1 ()); } [Test] [ExpectedException (typeof (XamlObjectReaderException))] public void NestedType () { new XamlObjectReader (new TestClass2 ()); } public class TestClass2 { } [Test] public void ConstructibleType () { new XamlObjectReader (new TestClass3 ()); } [Test] public void Skip () { var r = new XamlObjectReader ("Foo"); 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"); } [Test] public void Skip2 () { var r = new XamlObjectReader ("Foo"); r.Read (); // NamespaceDeclaration r.Read (); // Type 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"); } [Test] [Category ("NotWorking")] public void Read2 () { var doc = new XmlDocument (); doc.LoadXml (""); var r = new XamlObjectReader (doc); 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 (); for (int i = 0; i < 5; i++) { Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#3-" + i); l.Add (r.Member); r.Skip (); } l.First (m => m.Name == "Value"); l.First (m => m.Name == "InnerXml"); l.First (m => m.Name == "Prefix"); l.First (m => m.Name == "PreserveWhitespace"); l.First (m => m.Name == "Schemas"); Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#4"); Assert.IsFalse (r.Read (), "#5"); } [Test] public void Read_NonPrimitive () { var r = new XamlObjectReader (new TestClass3 ()); 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"); 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"); } [Test] public void Read_Type () { var r = new XamlObjectReader (typeof (int)); Read_TypeOrTypeExtension (r); } [Test] public void Read_TypeExtension () { var r = new XamlObjectReader (new TypeExtension (typeof (int))); Read_TypeOrTypeExtension (r); } void Read_TypeOrTypeExtension (XamlObjectReader 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"); Assert.IsNotNull (r.Type, "#23"); Assert.AreEqual (new XamlType (typeof (TypeExtension), r.SchemaContext), r.Type, "#23-2"); Assert.IsNull (r.Namespace, "#25"); Assert.IsTrue (r.Instance is TypeExtension, "#26"); Assert.IsTrue (r.Read (), "#31"); Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#32"); Assert.IsNotNull (r.Member, "#33"); Assert.AreEqual (XamlLanguage.PositionalParameters, 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"); } [Test] public void Read_Type2 () { var r = new XamlObjectReader (typeof (TestClass1)); Read_TypeOrTypeExtension2 (r); } [Test] public void Read_TypeExtension2 () { var r = new XamlObjectReader (new TypeExtension (typeof (TestClass1))); Read_TypeOrTypeExtension2 (r); } void Read_TypeOrTypeExtension2 (XamlObjectReader r) { 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"); Assert.IsTrue (r.Instance is TypeExtension, "#26"); Assert.IsTrue (r.Read (), "#31"); Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#32"); Assert.AreEqual (XamlLanguage.PositionalParameters, 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"); } [Test] public void Read_Reference () { var r = new XamlObjectReader (new Reference ("TestName")); 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"); 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 ("TestName", 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_Null () { var r = new XamlObjectReader (null); Read_NullOrNullExtension (r, null); } [Test] public void Read_NullExtension () { var o = new NullExtension (); var r = new XamlObjectReader (o); Read_NullOrNullExtension (r, o); } void Read_NullOrNullExtension (XamlObjectReader r, object instance) { 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"); Assert.AreEqual (instance, r.Instance, "#26"); // null and NullExtension are different here. Assert.IsTrue (r.Read (), "#61"); Assert.AreEqual (XamlNodeType.EndObject, r.NodeType, "#62"); Assert.IsFalse (r.Read (), "#71"); Assert.IsTrue (r.IsEof, "#72"); } [Test] // almost identical to TypeExtension (only type/instance difference) [Category ("NotWorking")] public void Read_StaticExtension () { var r = new XamlObjectReader (new StaticExtension ("MyMember")); 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"); Assert.IsTrue (r.Read (), "#31"); Assert.AreEqual (XamlNodeType.StartMember, r.NodeType, "#32"); Assert.AreEqual (XamlLanguage.PositionalParameters, r.Member, "#33-2"); Assert.IsTrue (r.Read (), "#41"); Assert.AreEqual (XamlNodeType.Value, r.NodeType, "#42"); Assert.AreEqual ("MyMember", 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] [Category ("NotWorking")] public void Read_Array () { var obj = new int [] {5, -3, 0}; var r = new XamlObjectReader (obj); Read_ArrayOrArrayExtension (r, obj); } [Test] [Category ("NotWorking")] public void Read_ArrayExtension () { var obj = new ArrayExtension (new int [] {5, -3, 0}); var r = new XamlObjectReader (obj); Read_ArrayOrArrayExtension (r, obj); } void Read_ArrayOrArrayExtension (XamlObjectReader r, object instance) { 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 (ArrayExtension), r.SchemaContext); Assert.AreEqual (xt, r.Type, "#23"); Assert.AreEqual (instance, r.Instance, "#26"); // different between Array and ArrayExtension 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"); } [Test] // It gives Type member, not PositionalParameters... and no Items member here. [Category ("NotWorking")] 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 () { var obj = new DateTime (2010, 4, 15); var r = new XamlObjectReader (obj); Read_CommonClrType (r, obj); Assert.AreEqual ("2010-04-15", Read_Initialization (r, null), "#1"); } [Test] public void Read_TimeSpan () { Read_CommonXamlPrimitive (TimeSpan.FromMinutes (4)); } [Test] public void Read_Uri () { Read_CommonXamlPrimitive (new Uri ("urn:foo")); } [Test] [ExpectedException (typeof (XamlObjectReaderException))] [Category ("NotWorking")] public void Read_XData () { var r = new XamlObjectReader (new XData () {Text = "xdata text"}); // XmlReader implementation is not visible. while (!r.IsEof) r.Read (); } [Test] public void ReadStandardTypes () { SimpleReadStandardType (new ArrayExtension ()); SimpleReadStandardType (new NullExtension ()); SimpleReadStandardType (new PropertyDefinition ()); SimpleReadStandardType (new Reference ()); SimpleReadStandardType (new StaticExtension ()); SimpleReadStandardType (new TypeExtension ()); } [Test] [Category ("NotWorking")] 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] [Category ("NotWorking")] public void Read_CustomMarkupExtension2 () { 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] [Category ("NotWorking")] 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] [Category ("NotWorking")] 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] public void Read_ArgumentAttributed () { var obj = new ArgumentAttributed ("foo", "bar"); var r = new XamlObjectReader (obj); Read_CommonClrType (r, obj, new KeyValuePair ("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"); } void SimpleReadStandardType (object instance) { var r = new XamlObjectReader (instance); while (!r.IsEof) r.Read (); } void Read_CommonXamlPrimitive (object obj) { var r = new XamlObjectReader (obj); Read_CommonXamlType (r); Read_Initialization (r, obj); } // from StartMember of Initialization to EndMember string Read_Initialization (XamlObjectReader 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; } 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) { 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"); Assert.IsNull (r.Instance, "ct#4"); Assert.IsTrue (r.Read (), "ct#5"); Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "ct#6"); } // from initial to StartObject void Read_CommonClrType (XamlObjectReader r, object obj, params KeyValuePair [] 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); } Assert.IsTrue (r.Read (), "ct#7"); Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "ct#8"); } } class TestClass1 { } public class TestClass3 { public TestClass3 Nested { 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; } } }