2 // System.Xml.Serialization.XmlSchemaImporterTests
5 // Gert Driesen (drieseng@users.sourceforge.net)
12 using System.Collections;
13 using System.Globalization;
16 using System.Xml.Schema;
17 using System.Xml.Serialization;
19 using NUnit.Framework;
21 using MonoTests.System.Xml.TestClasses;
23 namespace MonoTests.System.XmlSerialization
26 public class XmlSchemaImporterTests
28 private const string WsdlTypesNamespace = "http://microsoft.com/wsdl/types/";
31 [Category ("NotWorking")]
32 public void ImportTypeMapping_Struct ()
34 XmlSchemas schemas = ExportType (typeof (TimeSpan));
35 ArrayList qnames = GetXmlQualifiedNames (schemas);
36 Assert.AreEqual (1, qnames.Count, "#1");
38 XmlSchemaImporter importer = new XmlSchemaImporter (schemas);
39 XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]);
41 Assert.IsNotNull (map, "#2");
42 Assert.AreEqual ("TimeSpan", map.ElementName, "#3");
43 Assert.AreEqual ("NSTimeSpan", map.Namespace, "#4");
44 Assert.AreEqual ("TimeSpan", map.TypeFullName, "#5");
45 Assert.AreEqual ("TimeSpan", map.TypeName, "#6");
49 [Category ("NotWorking")] // mark it NotWorking until fixes have landed in svn
50 public void ImportTypeMapping_XsdPrimitive_AnyType ()
52 XmlSchemas schemas = ExportType (typeof (object));
53 ArrayList qnames = GetXmlQualifiedNames (schemas);
54 Assert.AreEqual (1, qnames.Count, "#1");
56 XmlSchemaImporter importer = new XmlSchemaImporter (schemas);
57 XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]);
59 Assert.IsNotNull (map, "#2");
60 Assert.AreEqual ("anyType", map.ElementName, "#3");
61 Assert.AreEqual ("NSObject", map.Namespace, "#4");
62 Assert.AreEqual ("System.Object", map.TypeFullName, "#5");
63 Assert.AreEqual ("Object", map.TypeName, "#6");
67 public void ImportTypeMapping_XsdPrimitive_Boolean ()
69 XmlSchemas schemas = ExportType (typeof (bool));
70 ArrayList qnames = GetXmlQualifiedNames (schemas);
71 Assert.AreEqual (1, qnames.Count, "#1");
73 XmlSchemaImporter importer = new XmlSchemaImporter (schemas);
74 XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]);
76 Assert.IsNotNull (map, "#2");
77 Assert.AreEqual ("boolean", map.ElementName, "#3");
78 Assert.AreEqual ("NSBoolean", map.Namespace, "#4");
79 Assert.AreEqual ("System.Boolean", map.TypeFullName, "#5");
80 Assert.AreEqual ("Boolean", map.TypeName, "#6");
84 public void ImportTypeMapping_XsdPrimitive_Short ()
86 XmlSchemas schemas = ExportType (typeof (short));
87 ArrayList qnames = GetXmlQualifiedNames (schemas);
88 Assert.AreEqual (1, qnames.Count, "#1");
90 XmlSchemaImporter importer = new XmlSchemaImporter (schemas);
91 XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]);
93 Assert.IsNotNull (map, "#2");
94 Assert.AreEqual ("short", map.ElementName, "#3");
95 Assert.AreEqual ("NSInt16", map.Namespace, "#4");
96 Assert.AreEqual ("System.Int16", map.TypeFullName, "#5");
97 Assert.AreEqual ("Int16", map.TypeName, "#6");
101 public void ImportTypeMapping_XsdPrimitive_UnsignedShort ()
103 XmlSchemas schemas = ExportType (typeof (ushort));
104 ArrayList qnames = GetXmlQualifiedNames (schemas);
105 Assert.AreEqual (1, qnames.Count, "#1");
107 XmlSchemaImporter importer = new XmlSchemaImporter (schemas);
108 XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]);
110 Assert.IsNotNull (map, "#2");
111 Assert.AreEqual ("unsignedShort", map.ElementName, "#3");
112 Assert.AreEqual ("NSUInt16", map.Namespace, "#4");
113 Assert.AreEqual ("System.UInt16", map.TypeFullName, "#5");
114 Assert.AreEqual ("UInt16", map.TypeName, "#6");
118 public void ImportTypeMapping_XsdPrimitive_Int ()
120 XmlSchemas schemas = ExportType (typeof (int));
121 ArrayList qnames = GetXmlQualifiedNames (schemas);
122 Assert.AreEqual (1, qnames.Count, "#1");
124 XmlSchemaImporter importer = new XmlSchemaImporter (schemas);
125 XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]);
127 Assert.IsNotNull (map, "#2");
128 Assert.AreEqual ("int", map.ElementName, "#3");
129 Assert.AreEqual ("NSInt32", map.Namespace, "#4");
130 Assert.AreEqual ("System.Int32", map.TypeFullName, "#5");
131 Assert.AreEqual ("Int32", map.TypeName, "#6");
135 public void ImportTypeMapping_XsdPrimitive_UnsignedInt ()
137 XmlSchemas schemas = ExportType (typeof (uint));
138 ArrayList qnames = GetXmlQualifiedNames (schemas);
139 Assert.AreEqual (1, qnames.Count, "#1");
141 XmlSchemaImporter importer = new XmlSchemaImporter (schemas);
142 XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]);
144 Assert.IsNotNull (map, "#2");
145 Assert.AreEqual ("unsignedInt", map.ElementName, "#3");
146 Assert.AreEqual ("NSUInt32", map.Namespace, "#4");
147 Assert.AreEqual ("System.UInt32", map.TypeFullName, "#5");
148 Assert.AreEqual ("UInt32", map.TypeName, "#6");
152 public void ImportTypeMapping_XsdPrimitive_Long ()
154 XmlSchemas schemas = ExportType (typeof (long));
155 ArrayList qnames = GetXmlQualifiedNames (schemas);
156 Assert.AreEqual (1, qnames.Count, "#1");
158 XmlSchemaImporter importer = new XmlSchemaImporter (schemas);
159 XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]);
161 Assert.IsNotNull (map, "#2");
162 Assert.AreEqual ("long", map.ElementName, "#3");
163 Assert.AreEqual ("NSInt64", map.Namespace, "#4");
164 Assert.AreEqual ("System.Int64", map.TypeFullName, "#5");
165 Assert.AreEqual ("Int64", map.TypeName, "#6");
169 public void ImportTypeMapping_XsdPrimitive_UnsignedLong ()
171 XmlSchemas schemas = ExportType (typeof (ulong));
172 ArrayList qnames = GetXmlQualifiedNames (schemas);
173 Assert.AreEqual (1, qnames.Count, "#1");
175 XmlSchemaImporter importer = new XmlSchemaImporter (schemas);
176 XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]);
178 Assert.IsNotNull (map, "#2");
179 Assert.AreEqual ("unsignedLong", map.ElementName, "#3");
180 Assert.AreEqual ("NSUInt64", map.Namespace, "#4");
181 Assert.AreEqual ("System.UInt64", map.TypeFullName, "#5");
182 Assert.AreEqual ("UInt64", map.TypeName, "#6");
186 public void ImportTypeMapping_XsdPrimitive_Float ()
188 XmlSchemas schemas = ExportType (typeof (float));
189 ArrayList qnames = GetXmlQualifiedNames (schemas);
190 Assert.AreEqual (1, qnames.Count, "#1");
192 XmlSchemaImporter importer = new XmlSchemaImporter (schemas);
193 XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]);
195 Assert.IsNotNull (map, "#2");
196 Assert.AreEqual ("float", map.ElementName, "#3");
197 Assert.AreEqual ("NSSingle", map.Namespace, "#4");
198 Assert.AreEqual ("System.Single", map.TypeFullName, "#5");
199 Assert.AreEqual ("Single", map.TypeName, "#6");
203 public void ImportTypeMapping_XsdPrimitive_Double ()
205 XmlSchemas schemas = ExportType (typeof (double));
206 ArrayList qnames = GetXmlQualifiedNames (schemas);
207 Assert.AreEqual (1, qnames.Count, "#1");
209 XmlSchemaImporter importer = new XmlSchemaImporter (schemas);
210 XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]);
212 Assert.IsNotNull (map, "#2");
213 Assert.AreEqual ("double", map.ElementName, "#3");
214 Assert.AreEqual ("NSDouble", map.Namespace, "#4");
215 Assert.AreEqual ("System.Double", map.TypeFullName, "#5");
216 Assert.AreEqual ("Double", map.TypeName, "#6");
220 public void ImportTypeMapping_XsdPrimitive_DateTime ()
222 XmlSchemas schemas = ExportType (typeof (DateTime));
223 ArrayList qnames = GetXmlQualifiedNames (schemas);
224 Assert.AreEqual (1, qnames.Count, "#1");
226 XmlSchemaImporter importer = new XmlSchemaImporter (schemas);
227 XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]);
229 Assert.IsNotNull (map, "#2");
230 Assert.AreEqual ("dateTime", map.ElementName, "#3");
231 Assert.AreEqual ("NSDateTime", map.Namespace, "#4");
232 Assert.AreEqual ("System.DateTime", map.TypeFullName, "#5");
233 Assert.AreEqual ("DateTime", map.TypeName, "#6");
237 public void ImportTypeMapping_XsdPrimitive_Decimal ()
239 XmlSchemas schemas = ExportType (typeof (decimal));
240 ArrayList qnames = GetXmlQualifiedNames (schemas);
241 Assert.AreEqual (1, qnames.Count, "#1");
243 XmlSchemaImporter importer = new XmlSchemaImporter (schemas);
244 XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]);
246 Assert.IsNotNull (map, "#2");
247 Assert.AreEqual ("decimal", map.ElementName, "#3");
248 Assert.AreEqual ("NSDecimal", map.Namespace, "#4");
249 Assert.AreEqual ("System.Decimal", map.TypeFullName, "#5");
250 Assert.AreEqual ("Decimal", map.TypeName, "#6");
254 public void ImportTypeMapping_XsdPrimitive_QName ()
256 XmlSchemas schemas = ExportType (typeof (XmlQualifiedName));
257 ArrayList qnames = GetXmlQualifiedNames (schemas);
258 Assert.AreEqual (1, qnames.Count, "#1");
260 XmlSchemaImporter importer = new XmlSchemaImporter (schemas);
261 XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]);
263 Assert.IsNotNull (map, "#2");
264 Assert.AreEqual ("QName", map.ElementName, "#3");
265 Assert.AreEqual ("NSXmlQualifiedName", map.Namespace, "#4");
266 Assert.AreEqual ("System.Xml.XmlQualifiedName", map.TypeFullName, "#5");
267 Assert.AreEqual ("XmlQualifiedName", map.TypeName, "#6");
271 public void ImportTypeMapping_XsdPrimitive_String ()
273 XmlSchemas schemas = ExportType (typeof (string));
274 ArrayList qnames = GetXmlQualifiedNames (schemas);
275 Assert.AreEqual (1, qnames.Count, "#1");
277 XmlSchemaImporter importer = new XmlSchemaImporter (schemas);
278 XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]);
280 Assert.IsNotNull (map, "#2");
281 Assert.AreEqual ("string", map.ElementName, "#3");
282 Assert.AreEqual ("NSString", map.Namespace, "#4");
283 Assert.AreEqual ("System.String", map.TypeFullName, "#5");
284 Assert.AreEqual ("String", map.TypeName, "#6");
288 [Category ("NotWorking")]
289 [ExpectedException (typeof (XmlSchemaException))] // Type 'http://microsoft.com/wsdl/types/:guid' is not declared
290 public void ImportTypeMapping_XsdPrimitive_Guid ()
292 XmlSchemas schemas = ExportType (typeof (Guid));
293 GetXmlQualifiedNames (schemas);
297 public void ImportTypeMapping_XsdPrimitive_UnsignedByte ()
299 XmlSchemas schemas = ExportType (typeof (byte));
300 ArrayList qnames = GetXmlQualifiedNames (schemas);
301 Assert.AreEqual (1, qnames.Count, "#1");
303 XmlSchemaImporter importer = new XmlSchemaImporter (schemas);
304 XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]);
306 Assert.IsNotNull (map, "#2");
307 Assert.AreEqual ("unsignedByte", map.ElementName, "#3");
308 Assert.AreEqual ("NSByte", map.Namespace, "#4");
309 Assert.AreEqual ("System.Byte", map.TypeFullName, "#5");
310 Assert.AreEqual ("Byte", map.TypeName, "#6");
314 public void ImportTypeMapping_XsdPrimitive_Byte ()
316 XmlSchemas schemas = ExportType (typeof (sbyte));
317 ArrayList qnames = GetXmlQualifiedNames (schemas);
318 Assert.AreEqual (1, qnames.Count, "#1");
320 XmlSchemaImporter importer = new XmlSchemaImporter (schemas);
321 XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]);
323 Assert.IsNotNull (map, "#2");
324 Assert.AreEqual ("byte", map.ElementName, "#3");
325 Assert.AreEqual ("NSSByte", map.Namespace, "#4");
326 Assert.AreEqual ("System.SByte", map.TypeFullName, "#5");
327 Assert.AreEqual ("SByte", map.TypeName, "#6");
331 [Category ("NotWorking")]
332 [ExpectedException (typeof (XmlSchemaException))] // Type 'http://microsoft.com/wsdl/types/:char' is not declared
333 public void ImportTypeMapping_XsdPrimitive_Char ()
335 XmlSchemas schemas = ExportType (typeof (char));
336 GetXmlQualifiedNames (schemas);
340 public void ImportTypeMapping_XsdPrimitive_Base64Binary ()
342 XmlSchemas schemas = ExportType (typeof (byte[]));
343 ArrayList qnames = GetXmlQualifiedNames (schemas);
344 Assert.AreEqual (1, qnames.Count, "#1");
346 XmlSchemaImporter importer = new XmlSchemaImporter (schemas);
347 XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]);
349 Assert.IsNotNull (map, "#2");
350 Assert.AreEqual ("base64Binary", map.ElementName, "#3");
351 Assert.AreEqual ("NSByte[]", map.Namespace, "#4");
352 Assert.AreEqual ("System.Byte[]", map.TypeFullName, "#5");
353 Assert.AreEqual ("Byte[]", map.TypeName, "#6");
357 [Category ("NotWorking")]
358 public void ImportTypeMapping_XsdPrimitive_Duration ()
360 string schemaFragment = "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
361 "<xs:schema xmlns:tns=\"NSDuration\" elementFormDefault=\"qualified\" targetNamespace=\"NSDuration\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">" +
362 " <xs:element name=\"duration\" type=\"xs:duration\" />" +
365 XmlSchemas schemas = new XmlSchemas ();
366 schemas.Add (XmlSchema.Read (new StringReader (schemaFragment), null));
368 ArrayList qnames = GetXmlQualifiedNames (schemas);
369 Assert.AreEqual (1, qnames.Count, "#1");
371 XmlQualifiedName qname = (XmlQualifiedName) qnames[0];
373 Assert.AreEqual ("duration", qname.Name, "#2");
374 Assert.AreEqual ("NSDuration", qname.Namespace, "#3");
376 XmlSchemaImporter importer = new XmlSchemaImporter (schemas);
377 XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]);
379 Assert.IsNotNull (map, "#4");
380 Assert.AreEqual ("duration", map.ElementName, "#5");
381 Assert.AreEqual ("NSDuration", map.Namespace, "#6");
382 Assert.AreEqual ("System.String", map.TypeFullName, "#7");
383 Assert.AreEqual ("String", map.TypeName, "#8");
387 [Category ("NotWorking")]
388 public void ImportTypeMapping_XsdPrimitive_Date ()
390 string schemaFragment = "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
391 "<xs:schema xmlns:tns=\"NSDate\" elementFormDefault=\"qualified\" targetNamespace=\"NSDate\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">" +
392 " <xs:element name=\"date\" type=\"xs:date\" />" +
395 XmlSchemas schemas = new XmlSchemas ();
396 schemas.Add (XmlSchema.Read (new StringReader (schemaFragment), null));
398 ArrayList qnames = GetXmlQualifiedNames (schemas);
399 Assert.AreEqual (1, qnames.Count, "#1");
401 XmlQualifiedName qname = (XmlQualifiedName) qnames[0];
403 Assert.AreEqual ("date", qname.Name, "#2");
404 Assert.AreEqual ("NSDate", qname.Namespace, "#3");
406 XmlSchemaImporter importer = new XmlSchemaImporter (schemas);
407 XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]);
409 Assert.IsNotNull (map, "#4");
410 Assert.AreEqual ("date", map.ElementName, "#5");
411 Assert.AreEqual ("NSDate", map.Namespace, "#6");
412 Assert.AreEqual ("System.DateTime", map.TypeFullName, "#7");
413 Assert.AreEqual ("DateTime", map.TypeName, "#8");
417 public void ImportTypeMapping_EnumSimpleContent ()
419 string schemaFragment = "<?xml version=\"1.0\" encoding=\"utf-16\"?>" +
420 "<s:schema xmlns:tns=\"NSDate\" elementFormDefault=\"qualified\" targetNamespace=\"NSDate\" xmlns:s=\"http://www.w3.org/2001/XMLSchema\">";
421 schemaFragment += " <s:element name=\"trans\" type=\"tns:TranslationStatus\" />";
422 schemaFragment += " <s:complexType name=\"TranslationStatus\">";
423 schemaFragment += " <s:simpleContent>";
424 schemaFragment += " <s:extension base=\"tns:StatusType\">";
425 schemaFragment += " <s:attribute name=\"Language\" type=\"s:int\" use=\"required\" />";
426 schemaFragment += " </s:extension>";
427 schemaFragment += " </s:simpleContent>";
428 schemaFragment += " </s:complexType>";
429 schemaFragment += " <s:simpleType name=\"StatusType\">";
430 schemaFragment += " <s:restriction base=\"s:string\">";
431 schemaFragment += " <s:enumeration value=\"Untouched\" />";
432 schemaFragment += " <s:enumeration value=\"Touched\" />";
433 schemaFragment += " <s:enumeration value=\"Complete\" />";
434 schemaFragment += " <s:enumeration value=\"None\" />";
435 schemaFragment += " </s:restriction>";
436 schemaFragment += " </s:simpleType>";
437 schemaFragment += "</s:schema>";
439 XmlSchemas schemas = new XmlSchemas ();
440 schemas.Add (XmlSchema.Read (new StringReader (schemaFragment), null));
442 ArrayList qnames = GetXmlQualifiedNames (schemas);
443 Assert.AreEqual (1, qnames.Count, "#1");
445 XmlQualifiedName qname = (XmlQualifiedName) qnames[0];
447 Assert.AreEqual ("trans", qname.Name, "#2");
448 Assert.AreEqual ("NSDate", qname.Namespace, "#3");
450 XmlSchemaImporter importer = new XmlSchemaImporter (schemas);
451 XmlTypeMapping map = importer.ImportTypeMapping ((XmlQualifiedName) qnames[0]);
453 Assert.IsNotNull (map, "#4");
454 Assert.AreEqual ("trans", map.ElementName, "#5");
455 Assert.AreEqual ("NSDate", map.Namespace, "#6");
456 Assert.AreEqual ("TranslationStatus", map.TypeFullName, "#7");
457 Assert.AreEqual ("TranslationStatus", map.TypeName, "#8");
459 CodeNamespace codeNamespace = ExportCode (map);
460 Assert.IsNotNull (codeNamespace);
462 CodeTypeDeclaration type = FindType (codeNamespace, "TranslationStatus");
463 Assert.IsNotNull (type, "#9");
465 CodeMemberField field = FindMember (type, "Value") as CodeMemberField;
466 Assert.IsNotNull (field, "#10");
467 Assert.AreEqual ("StatusType", field.Type.BaseType, "#11");
469 field = FindMember (type, "Language") as CodeMemberField;
470 Assert.IsNotNull (field, "#12");
471 Assert.AreEqual ("System.Int32", field.Type.BaseType, "#13");
474 CodeNamespace ExportCode (XmlTypeMapping map)
476 CodeNamespace codeNamespace = new CodeNamespace ();
477 XmlCodeExporter exp = new XmlCodeExporter (codeNamespace);
478 exp.ExportTypeMapping (map);
479 return codeNamespace;
482 CodeTypeDeclaration FindType (CodeNamespace codeNamespace, string name)
484 foreach (CodeTypeDeclaration t in codeNamespace.Types)
490 CodeTypeMember FindMember (CodeTypeDeclaration type, string name)
492 foreach (CodeTypeMember m in type.Members)
498 private static XmlSchemas ExportType (Type type)
500 XmlReflectionImporter ri = new XmlReflectionImporter ("NS" + type.Name);
501 XmlSchemas schemas = new XmlSchemas ();
502 XmlSchemaExporter sx = new XmlSchemaExporter (schemas);
503 XmlTypeMapping tm = ri.ImportTypeMapping (type);
504 sx.ExportTypeMapping (tm);
508 private static ArrayList GetXmlQualifiedNames (XmlSchemas schemas)
510 ArrayList qnames = new ArrayList ();
512 foreach (XmlSchema schema in schemas) {
513 if (!schema.IsCompiled) schema.Compile (null);
514 foreach (XmlSchemaObject ob in schema.Items)
515 if (ob is XmlSchemaElement)
516 qnames.Add (((XmlSchemaElement) ob).QualifiedName);