// // System.Xml.Serialization.XmlSchemaImporterTests // // Author: // Gert Driesen (drieseng@users.sourceforge.net) // // (C) 2005 Novell // using System; using System.CodeDom; using System.Collections; using System.Globalization; using System.IO; using System.Xml; using System.Xml.Schema; using System.Xml.Serialization; using NUnit.Framework; using MonoTests.System.Xml.TestClasses; namespace MonoTests.System.XmlSerialization { [TestFixture] public class XmlSchemaImporterTests { private const string WsdlTypesNamespace = "http://microsoft.com/wsdl/types/"; [Test] [Category ("NotWorking")] public void ImportTypeMapping_Struct () { XmlSchemas schemas = ExportType (typeof (TimeSpan)); ArrayList qnames = GetXmlQualifiedNames (schemas); Assert.AreEqual (1, qnames.Count, "#1"); XmlSchemaImporter importer = new XmlSchemaImporter (schemas); XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]); Assert.IsNotNull (map, "#2"); Assert.AreEqual ("TimeSpan", map.ElementName, "#3"); Assert.AreEqual ("NSTimeSpan", map.Namespace, "#4"); Assert.AreEqual ("TimeSpan", map.TypeFullName, "#5"); Assert.AreEqual ("TimeSpan", map.TypeName, "#6"); } [Test] [Category ("NotWorking")] // mark it NotWorking until fixes have landed in svn public void ImportTypeMapping_XsdPrimitive_AnyType () { XmlSchemas schemas = ExportType (typeof (object)); ArrayList qnames = GetXmlQualifiedNames (schemas); Assert.AreEqual (1, qnames.Count, "#1"); XmlSchemaImporter importer = new XmlSchemaImporter (schemas); XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]); Assert.IsNotNull (map, "#2"); Assert.AreEqual ("anyType", map.ElementName, "#3"); Assert.AreEqual ("NSObject", map.Namespace, "#4"); Assert.AreEqual ("System.Object", map.TypeFullName, "#5"); Assert.AreEqual ("Object", map.TypeName, "#6"); } [Test] public void ImportTypeMapping_XsdPrimitive_Boolean () { XmlSchemas schemas = ExportType (typeof (bool)); ArrayList qnames = GetXmlQualifiedNames (schemas); Assert.AreEqual (1, qnames.Count, "#1"); XmlSchemaImporter importer = new XmlSchemaImporter (schemas); XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]); Assert.IsNotNull (map, "#2"); Assert.AreEqual ("boolean", map.ElementName, "#3"); Assert.AreEqual ("NSBoolean", map.Namespace, "#4"); Assert.AreEqual ("System.Boolean", map.TypeFullName, "#5"); Assert.AreEqual ("Boolean", map.TypeName, "#6"); } [Test] public void ImportTypeMapping_XsdPrimitive_Short () { XmlSchemas schemas = ExportType (typeof (short)); ArrayList qnames = GetXmlQualifiedNames (schemas); Assert.AreEqual (1, qnames.Count, "#1"); XmlSchemaImporter importer = new XmlSchemaImporter (schemas); XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]); Assert.IsNotNull (map, "#2"); Assert.AreEqual ("short", map.ElementName, "#3"); Assert.AreEqual ("NSInt16", map.Namespace, "#4"); Assert.AreEqual ("System.Int16", map.TypeFullName, "#5"); Assert.AreEqual ("Int16", map.TypeName, "#6"); } [Test] public void ImportTypeMapping_XsdPrimitive_UnsignedShort () { XmlSchemas schemas = ExportType (typeof (ushort)); ArrayList qnames = GetXmlQualifiedNames (schemas); Assert.AreEqual (1, qnames.Count, "#1"); XmlSchemaImporter importer = new XmlSchemaImporter (schemas); XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]); Assert.IsNotNull (map, "#2"); Assert.AreEqual ("unsignedShort", map.ElementName, "#3"); Assert.AreEqual ("NSUInt16", map.Namespace, "#4"); Assert.AreEqual ("System.UInt16", map.TypeFullName, "#5"); Assert.AreEqual ("UInt16", map.TypeName, "#6"); } [Test] public void ImportTypeMapping_XsdPrimitive_Int () { XmlSchemas schemas = ExportType (typeof (int)); ArrayList qnames = GetXmlQualifiedNames (schemas); Assert.AreEqual (1, qnames.Count, "#1"); XmlSchemaImporter importer = new XmlSchemaImporter (schemas); XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]); Assert.IsNotNull (map, "#2"); Assert.AreEqual ("int", map.ElementName, "#3"); Assert.AreEqual ("NSInt32", map.Namespace, "#4"); Assert.AreEqual ("System.Int32", map.TypeFullName, "#5"); Assert.AreEqual ("Int32", map.TypeName, "#6"); } [Test] public void ImportTypeMapping_XsdPrimitive_UnsignedInt () { XmlSchemas schemas = ExportType (typeof (uint)); ArrayList qnames = GetXmlQualifiedNames (schemas); Assert.AreEqual (1, qnames.Count, "#1"); XmlSchemaImporter importer = new XmlSchemaImporter (schemas); XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]); Assert.IsNotNull (map, "#2"); Assert.AreEqual ("unsignedInt", map.ElementName, "#3"); Assert.AreEqual ("NSUInt32", map.Namespace, "#4"); Assert.AreEqual ("System.UInt32", map.TypeFullName, "#5"); Assert.AreEqual ("UInt32", map.TypeName, "#6"); } [Test] public void ImportTypeMapping_XsdPrimitive_Long () { XmlSchemas schemas = ExportType (typeof (long)); ArrayList qnames = GetXmlQualifiedNames (schemas); Assert.AreEqual (1, qnames.Count, "#1"); XmlSchemaImporter importer = new XmlSchemaImporter (schemas); XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]); Assert.IsNotNull (map, "#2"); Assert.AreEqual ("long", map.ElementName, "#3"); Assert.AreEqual ("NSInt64", map.Namespace, "#4"); Assert.AreEqual ("System.Int64", map.TypeFullName, "#5"); Assert.AreEqual ("Int64", map.TypeName, "#6"); } [Test] public void ImportTypeMapping_XsdPrimitive_UnsignedLong () { XmlSchemas schemas = ExportType (typeof (ulong)); ArrayList qnames = GetXmlQualifiedNames (schemas); Assert.AreEqual (1, qnames.Count, "#1"); XmlSchemaImporter importer = new XmlSchemaImporter (schemas); XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]); Assert.IsNotNull (map, "#2"); Assert.AreEqual ("unsignedLong", map.ElementName, "#3"); Assert.AreEqual ("NSUInt64", map.Namespace, "#4"); Assert.AreEqual ("System.UInt64", map.TypeFullName, "#5"); Assert.AreEqual ("UInt64", map.TypeName, "#6"); } [Test] public void ImportTypeMapping_XsdPrimitive_Float () { XmlSchemas schemas = ExportType (typeof (float)); ArrayList qnames = GetXmlQualifiedNames (schemas); Assert.AreEqual (1, qnames.Count, "#1"); XmlSchemaImporter importer = new XmlSchemaImporter (schemas); XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]); Assert.IsNotNull (map, "#2"); Assert.AreEqual ("float", map.ElementName, "#3"); Assert.AreEqual ("NSSingle", map.Namespace, "#4"); Assert.AreEqual ("System.Single", map.TypeFullName, "#5"); Assert.AreEqual ("Single", map.TypeName, "#6"); } [Test] public void ImportTypeMapping_XsdPrimitive_Double () { XmlSchemas schemas = ExportType (typeof (double)); ArrayList qnames = GetXmlQualifiedNames (schemas); Assert.AreEqual (1, qnames.Count, "#1"); XmlSchemaImporter importer = new XmlSchemaImporter (schemas); XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]); Assert.IsNotNull (map, "#2"); Assert.AreEqual ("double", map.ElementName, "#3"); Assert.AreEqual ("NSDouble", map.Namespace, "#4"); Assert.AreEqual ("System.Double", map.TypeFullName, "#5"); Assert.AreEqual ("Double", map.TypeName, "#6"); } [Test] public void ImportTypeMapping_XsdPrimitive_DateTime () { XmlSchemas schemas = ExportType (typeof (DateTime)); ArrayList qnames = GetXmlQualifiedNames (schemas); Assert.AreEqual (1, qnames.Count, "#1"); XmlSchemaImporter importer = new XmlSchemaImporter (schemas); XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]); Assert.IsNotNull (map, "#2"); Assert.AreEqual ("dateTime", map.ElementName, "#3"); Assert.AreEqual ("NSDateTime", map.Namespace, "#4"); Assert.AreEqual ("System.DateTime", map.TypeFullName, "#5"); Assert.AreEqual ("DateTime", map.TypeName, "#6"); } [Test] public void ImportTypeMapping_XsdPrimitive_Decimal () { XmlSchemas schemas = ExportType (typeof (decimal)); ArrayList qnames = GetXmlQualifiedNames (schemas); Assert.AreEqual (1, qnames.Count, "#1"); XmlSchemaImporter importer = new XmlSchemaImporter (schemas); XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]); Assert.IsNotNull (map, "#2"); Assert.AreEqual ("decimal", map.ElementName, "#3"); Assert.AreEqual ("NSDecimal", map.Namespace, "#4"); Assert.AreEqual ("System.Decimal", map.TypeFullName, "#5"); Assert.AreEqual ("Decimal", map.TypeName, "#6"); } [Test] public void ImportTypeMapping_XsdPrimitive_QName () { XmlSchemas schemas = ExportType (typeof (XmlQualifiedName)); ArrayList qnames = GetXmlQualifiedNames (schemas); Assert.AreEqual (1, qnames.Count, "#1"); XmlSchemaImporter importer = new XmlSchemaImporter (schemas); XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]); Assert.IsNotNull (map, "#2"); Assert.AreEqual ("QName", map.ElementName, "#3"); Assert.AreEqual ("NSXmlQualifiedName", map.Namespace, "#4"); Assert.AreEqual ("System.Xml.XmlQualifiedName", map.TypeFullName, "#5"); Assert.AreEqual ("XmlQualifiedName", map.TypeName, "#6"); } [Test] public void ImportTypeMapping_XsdPrimitive_String () { XmlSchemas schemas = ExportType (typeof (string)); ArrayList qnames = GetXmlQualifiedNames (schemas); Assert.AreEqual (1, qnames.Count, "#1"); XmlSchemaImporter importer = new XmlSchemaImporter (schemas); XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]); Assert.IsNotNull (map, "#2"); Assert.AreEqual ("string", map.ElementName, "#3"); Assert.AreEqual ("NSString", map.Namespace, "#4"); Assert.AreEqual ("System.String", map.TypeFullName, "#5"); Assert.AreEqual ("String", map.TypeName, "#6"); } [Test] [Category ("NotWorking")] [ExpectedException (typeof (XmlSchemaException))] // Type 'http://microsoft.com/wsdl/types/:guid' is not declared public void ImportTypeMapping_XsdPrimitive_Guid () { XmlSchemas schemas = ExportType (typeof (Guid)); GetXmlQualifiedNames (schemas); } [Test] public void ImportTypeMapping_XsdPrimitive_UnsignedByte () { XmlSchemas schemas = ExportType (typeof (byte)); ArrayList qnames = GetXmlQualifiedNames (schemas); Assert.AreEqual (1, qnames.Count, "#1"); XmlSchemaImporter importer = new XmlSchemaImporter (schemas); XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]); Assert.IsNotNull (map, "#2"); Assert.AreEqual ("unsignedByte", map.ElementName, "#3"); Assert.AreEqual ("NSByte", map.Namespace, "#4"); Assert.AreEqual ("System.Byte", map.TypeFullName, "#5"); Assert.AreEqual ("Byte", map.TypeName, "#6"); } [Test] public void ImportTypeMapping_XsdPrimitive_Byte () { XmlSchemas schemas = ExportType (typeof (sbyte)); ArrayList qnames = GetXmlQualifiedNames (schemas); Assert.AreEqual (1, qnames.Count, "#1"); XmlSchemaImporter importer = new XmlSchemaImporter (schemas); XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]); Assert.IsNotNull (map, "#2"); Assert.AreEqual ("byte", map.ElementName, "#3"); Assert.AreEqual ("NSSByte", map.Namespace, "#4"); Assert.AreEqual ("System.SByte", map.TypeFullName, "#5"); Assert.AreEqual ("SByte", map.TypeName, "#6"); } [Test] [Category ("NotWorking")] [ExpectedException (typeof (XmlSchemaException))] // Type 'http://microsoft.com/wsdl/types/:char' is not declared public void ImportTypeMapping_XsdPrimitive_Char () { XmlSchemas schemas = ExportType (typeof (char)); GetXmlQualifiedNames (schemas); } [Test] public void ImportTypeMapping_XsdPrimitive_Base64Binary () { XmlSchemas schemas = ExportType (typeof (byte[])); ArrayList qnames = GetXmlQualifiedNames (schemas); Assert.AreEqual (1, qnames.Count, "#1"); XmlSchemaImporter importer = new XmlSchemaImporter (schemas); XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]); Assert.IsNotNull (map, "#2"); Assert.AreEqual ("base64Binary", map.ElementName, "#3"); Assert.AreEqual ("NSByte[]", map.Namespace, "#4"); Assert.AreEqual ("System.Byte[]", map.TypeFullName, "#5"); Assert.AreEqual ("Byte[]", map.TypeName, "#6"); } [Test] [Category ("NotWorking")] public void ImportTypeMapping_XsdPrimitive_Duration () { string schemaFragment = "" + "" + " " + ""; XmlSchemas schemas = new XmlSchemas (); schemas.Add (XmlSchema.Read (new StringReader (schemaFragment), null)); ArrayList qnames = GetXmlQualifiedNames (schemas); Assert.AreEqual (1, qnames.Count, "#1"); XmlQualifiedName qname = (XmlQualifiedName) qnames[0]; Assert.AreEqual ("duration", qname.Name, "#2"); Assert.AreEqual ("NSDuration", qname.Namespace, "#3"); XmlSchemaImporter importer = new XmlSchemaImporter (schemas); XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]); Assert.IsNotNull (map, "#4"); Assert.AreEqual ("duration", map.ElementName, "#5"); Assert.AreEqual ("NSDuration", map.Namespace, "#6"); Assert.AreEqual ("System.String", map.TypeFullName, "#7"); Assert.AreEqual ("String", map.TypeName, "#8"); } [Test] [Category ("NotWorking")] public void ImportTypeMapping_XsdPrimitive_Date () { string schemaFragment = "" + "" + " " + ""; XmlSchemas schemas = new XmlSchemas (); schemas.Add (XmlSchema.Read (new StringReader (schemaFragment), null)); ArrayList qnames = GetXmlQualifiedNames (schemas); Assert.AreEqual (1, qnames.Count, "#1"); XmlQualifiedName qname = (XmlQualifiedName) qnames[0]; Assert.AreEqual ("date", qname.Name, "#2"); Assert.AreEqual ("NSDate", qname.Namespace, "#3"); XmlSchemaImporter importer = new XmlSchemaImporter (schemas); XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]); Assert.IsNotNull (map, "#4"); Assert.AreEqual ("date", map.ElementName, "#5"); Assert.AreEqual ("NSDate", map.Namespace, "#6"); Assert.AreEqual ("System.DateTime", map.TypeFullName, "#7"); Assert.AreEqual ("DateTime", map.TypeName, "#8"); } [Test] public void ImportTypeMapping_EnumSimpleContent () { string schemaFragment = "" + ""; schemaFragment += " "; schemaFragment += " "; schemaFragment += " "; schemaFragment += " "; schemaFragment += " "; schemaFragment += " "; schemaFragment += " "; schemaFragment += " "; schemaFragment += " "; schemaFragment += " "; schemaFragment += " "; schemaFragment += " "; schemaFragment += " "; schemaFragment += " "; schemaFragment += " "; schemaFragment += " "; schemaFragment += ""; XmlSchemas schemas = new XmlSchemas (); schemas.Add (XmlSchema.Read (new StringReader (schemaFragment), null)); ArrayList qnames = GetXmlQualifiedNames (schemas); Assert.AreEqual (1, qnames.Count, "#1"); XmlQualifiedName qname = (XmlQualifiedName) qnames[0]; Assert.AreEqual ("trans", qname.Name, "#2"); Assert.AreEqual ("NSDate", qname.Namespace, "#3"); XmlSchemaImporter importer = new XmlSchemaImporter (schemas); XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]); Assert.IsNotNull (map, "#4"); Assert.AreEqual ("trans", map.ElementName, "#5"); Assert.AreEqual ("NSDate", map.Namespace, "#6"); Assert.AreEqual ("TranslationStatus", map.TypeFullName, "#7"); Assert.AreEqual ("TranslationStatus", map.TypeName, "#8"); CodeNamespace codeNamespace = ExportCode (map); Assert.IsNotNull (codeNamespace); CodeTypeDeclaration type = FindType (codeNamespace, "TranslationStatus"); Assert.IsNotNull (type, "#9"); CodeMemberField field = FindMember (type, "Value") as CodeMemberField; Assert.IsNotNull (field, "#10"); Assert.AreEqual ("StatusType", field.Type.BaseType, "#11"); field = FindMember (type, "Language") as CodeMemberField; Assert.IsNotNull (field, "#12"); Assert.AreEqual ("System.Int32", field.Type.BaseType, "#13"); } CodeNamespace ExportCode (XmlTypeMapping map) { CodeNamespace codeNamespace = new CodeNamespace (); XmlCodeExporter exp = new XmlCodeExporter (codeNamespace); exp.ExportTypeMapping (map); return codeNamespace; } CodeTypeDeclaration FindType (CodeNamespace codeNamespace, string name) { foreach (CodeTypeDeclaration t in codeNamespace.Types) if (t.Name == name) return t; return null; } CodeTypeMember FindMember (CodeTypeDeclaration type, string name) { foreach (CodeTypeMember m in type.Members) if (m.Name == name) return m; return null; } private static XmlSchemas ExportType (Type type) { XmlReflectionImporter ri = new XmlReflectionImporter ("NS" + type.Name); XmlSchemas schemas = new XmlSchemas (); XmlSchemaExporter sx = new XmlSchemaExporter (schemas); XmlTypeMapping tm = ri.ImportTypeMapping (type); sx.ExportTypeMapping (tm); return schemas; } private static ArrayList GetXmlQualifiedNames (XmlSchemas schemas) { ArrayList qnames = new ArrayList (); foreach (XmlSchema schema in schemas) { if (!schema.IsCompiled) schema.Compile (null); foreach (XmlSchemaObject ob in schema.Items) if (ob is XmlSchemaElement) qnames.Add (((XmlSchemaElement) ob).QualifiedName); } return qnames; } } }