//
// 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 Category = NUnit.Framework.CategoryAttribute;
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))]
[Category ("NotWorking")]
public void ReadNonConstructible ()
{
var r = new XamlObjectReader (XamlLanguage.String);
// XamlType has no default constructor.
r.Read ();
}
[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]
[Category ("NotWorking")]
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]
[Category ("NotWorking")]
public void Read_Type ()
{
var r = new XamlObjectReader (typeof (int));
Read_TypeOrTypeExtension (r);
}
[Test]
[Category ("NotWorking")]
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]
[Category ("NotWorking")] // namespace node differences
public void Read_Type2 ()
{
var r = new XamlObjectReader (typeof (TestClass1));
Read_TypeOrTypeExtension2 (r);
}
[Test]
[Category ("NotWorking")] // namespace node differences
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");
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.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.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]
// WTF, It does not give XAML namespace, but XamlSerives.Save()
// serializes DateTime instance in the XAML namespace.
[Category ("NotWorking")]
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 ();
}
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;
}
// 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)
{
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");
/*
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");
*/
Assert.IsTrue (r.Read (), "ct#7");
Assert.AreEqual (XamlNodeType.StartObject, r.NodeType, "ct#8");
}
}
class TestClass1
{
}
public class TestClass3
{
public TestClass3 Nested { get; set; }
}
}