Merge pull request #1196 from tritao/master
[mono.git] / mcs / class / System.XML / Test / System.Xml.Serialization / XmlSchemaImporterTests.cs
index 87e8ffeb4ee9f0fbeb729322ee656e0405ab42a2..fe4838cb2e9d8184999494e9a45d2809f8550f8f 100644 (file)
@@ -6,7 +6,7 @@
 //   Atsushi Enomoto (atsushi@ximian.com)
 //
 // (C) 2005 Gert Driesen
-// Copyright (C) 2006 Novell, Inc.
+// Copyright (C) 2006-2007 Novell, Inc.
 // 
 
 //
 
 using System;
 using System.CodeDom;
+using System.CodeDom.Compiler;
 using System.Collections;
 using System.Globalization;
 using System.IO;
 using System.Xml;
 using System.Xml.Schema;
 using System.Xml.Serialization;
-
+#if !MOBILE
+using Microsoft.CSharp;
+#endif
 using NUnit.Framework;
 
 using MonoTests.System.Xml.TestClasses;
 
-namespace MonoTests.System.XmlSerialization
+namespace MonoTests.System.Xml.Serialization
 {
        [TestFixture]
        public class XmlSchemaImporterTests
@@ -889,6 +892,8 @@ namespace MonoTests.System.XmlSerialization
                        Assert.AreEqual ("UInt16", map.TypeName, "#6");
                }
 
+#if !MOBILE
+
                [Test]
                public void ImportTypeMapping_EnumSimpleContent ()
                {
@@ -968,6 +973,86 @@ namespace MonoTests.System.XmlSerialization
                        Assert.AreEqual ("System.Int32", field.Type.BaseType, "#B2");
 #endif
                }
+
+               XmlSchemaImporter CreateSchemaImporter (string xsd)
+               {
+                       XmlSchemas s = new XmlSchemas ();
+                       XmlReader r = new XmlTextReader (xsd, XmlNodeType.Document, null);
+                       s.Add (XmlSchema.Read (r, null));
+                       return new XmlSchemaImporter (s);
+               }
+
+               [Test]
+               public void ImportTypeMapping_NullableField ()
+               {
+                       string xsd = @"
+<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>
+  <xs:element name='Root'>
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name='Bar' nillable='true' type='xs:int' />
+      </xs:sequence>
+      <xs:attribute name='A' use='optional' type='xs:int' />
+    </xs:complexType>
+  </xs:element>
+</xs:schema>";
+                       XmlSchemaImporter imp = CreateSchemaImporter (xsd);
+                       XmlTypeMapping map = imp.ImportTypeMapping (new XmlQualifiedName ("Root"));
+                       CodeNamespace cns = ExportCode (map);
+#if NET_2_0
+                       CodeMemberProperty p = (CodeMemberProperty) FindMember (FindType (cns, "Root"), "Bar");
+                       Assert.AreEqual (1, p.Type.TypeArguments.Count, "2.0 #1");
+                       Assert.AreEqual ("System.Int32", p.Type.TypeArguments [0].BaseType, "2.0 #2");
+#else
+                       CodeMemberField f = (CodeMemberField) FindMember (FindType (cns, "Root"), "Bar");
+                       Assert.AreEqual ("System.Int32", f.Type.BaseType, "1.x #1");
+#endif
+               }
+
+               [Test]
+               public void ImportMembersMapping_NullableField ()
+               {
+                       string xsd = @"
+<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>
+  <xs:element name='Root'>
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name='Bar' nillable='true' type='xs:int' />
+        <xs:element name='Baz' type='xs:int' />
+      </xs:sequence>
+      <xs:attribute name='A' use='optional' type='xs:int' />
+    </xs:complexType>
+  </xs:element>
+</xs:schema>";
+                       XmlSchemaImporter imp = CreateSchemaImporter (xsd);
+                       XmlMembersMapping map = imp.ImportMembersMapping (new XmlQualifiedName ("Root"));
+                       Assert.AreEqual (3, map.Count, "#1");
+                       XmlMemberMapping bar = map [0];
+                       Assert.AreEqual ("Bar", bar.ElementName, "#2-1");
+                       Assert.IsFalse (bar.CheckSpecified, "#2-2");
+                       XmlMemberMapping baz = map [1];
+                       Assert.AreEqual ("Baz", baz.ElementName, "#3-1");
+                       Assert.IsFalse (baz.CheckSpecified, "#3-2");
+                       XmlMemberMapping a = map [2];
+                       Assert.AreEqual ("A", a.ElementName, "#4-1"); // ... element name?
+                       Assert.IsTrue (a.CheckSpecified, "#4-2");
+
+#if NET_2_0
+                       Assert.IsNull (map.TypeName, "#4-3"); // null at this state
+                       Assert.IsNull (map.TypeNamespace, "#4-4"); // null at this state
+
+                       CodeDomProvider p = new Microsoft.CSharp.CSharpCodeProvider ();
+                       Assert.AreEqual ("System.Nullable`1[System.Int32]", bar.GenerateTypeName (p), "#5-1");
+                       Assert.AreEqual ("System.Int32", baz.GenerateTypeName (p), "#5-2");
+
+                       var table = new Hashtable ();
+                       var exp = new XmlCodeExporter (new CodeNamespace ("foobar"), null, p, CodeGenerationOptions.None, table);
+                       exp.ExportMembersMapping (map);
+                       Assert.AreEqual (null, map.TypeName, "#5-3"); // filled after ExportExportMembersMapping().
+                       Assert.AreEqual (null, map.TypeNamespace, "#5-4"); // filled after ExportMembersMapping().
+                       // table contains some internal stuff that does not make sense in any public API.
+#endif
+               }
                
                CodeNamespace ExportCode (XmlTypeMapping map)
                {
@@ -993,30 +1078,6 @@ namespace MonoTests.System.XmlSerialization
                        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;
-               }
-
                [Test]
                [ExpectedException (typeof (InvalidOperationException))]
                public void ImportTypeMappingNonExistent ()
@@ -1107,12 +1168,80 @@ namespace MonoTests.System.XmlSerialization
     <xs:attribute name='Foo' type='xs:string' />
   </xs:complexType>
 </xs:schema>";
-                       XmlSchemas xss = new XmlSchemas ();
-                       xss.Add (XmlSchema.Read (new XmlTextReader (new StringReader (xsd)), null));
-                       XmlSchemaImporter imp = new XmlSchemaImporter (xss);
+                       XmlSchemaImporter imp = CreateImporter (xsd);
                        CodeNamespace cns = new CodeNamespace ();
                        XmlCodeExporter exp = new XmlCodeExporter (cns);
                        exp.ExportTypeMapping (imp.ImportTypeMapping (new XmlQualifiedName ("Root")));
                }
+
+               [Test]
+               public void ImportSimpleSchemaType ()
+               {
+                       string xsd = @"
+<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>
+  <xs:element name='a' type='b' />
+  <xs:simpleType name='b'>
+    <xs:restriction base='xs:string'>
+      <xs:enumeration value='v1'/>
+      <xs:enumeration value='v2'/>
+      <xs:enumeration value='v3'/>
+    </xs:restriction>
+  </xs:simpleType>
+</xs:schema>";
+                       XmlSchemaImporter imp = CreateImporter (xsd);
+                       XmlTypeMapping tm = imp.ImportTypeMapping (new XmlQualifiedName ("a"));
+                       Assert.AreEqual ("a", tm.ElementName, "#1");
+                       Assert.AreEqual ("b", tm.TypeName, "#2");
+               }
+
+               [Test]
+               public void ImportWildcardElementAsClass ()
+               {
+                       var xss = new XmlSchemas ();
+                       xss.Add (XmlSchema.Read (XmlReader.Create ("Test/XmlFiles/xsd/670945-1.xsd"), null));
+                       xss.Add (XmlSchema.Read (XmlReader.Create ("Test/XmlFiles/xsd/670945-2.xsd"), null));
+                       var imp = new XmlSchemaImporter (xss);
+                       var xtm = imp.ImportSchemaType (new XmlQualifiedName ("SystemDateTime", "http://www.onvif.org/ver10/schema"));
+                       var cns = new CodeNamespace ();
+                       var exp = new XmlCodeExporter (cns);
+                       exp.ExportTypeMapping (xtm);
+                       var sw = new StringWriter ();
+                       new CSharpCodeProvider ().GenerateCodeFromNamespace (cns, sw, null);
+                       Assert.IsTrue (sw.ToString ().IndexOf ("class SystemDateTimeExtension") > 0, "#1");
+               }
+
+               XmlSchemaImporter CreateImporter (params string [] schemaXmlStrings)
+               {
+                       XmlSchemas xss = new XmlSchemas ();
+                       foreach (string xsd in schemaXmlStrings)
+                               xss.Add (XmlSchema.Read (new XmlTextReader (new StringReader (xsd)), null));
+                       return new XmlSchemaImporter (xss);
+               }
+
+#endif
+
+               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;
+               }
+
+               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;
+               }
        }
 }