2 // XsdDataContractExporterTest.cs
5 // Ankit Jain <JAnkit@novell.com>
7 // Copyright (C) 2006 Novell, Inc. http://www.novell.com
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 using System.Collections.Generic;
35 using System.Runtime.Serialization;
36 using NUnit.Framework;
37 using System.Xml.Schema;
38 using System.Collections;
39 using System.Xml.Serialization;
40 using System.Reflection;
43 using QName = System.Xml.XmlQualifiedName;
45 namespace MonoTests.System.Runtime.Serialization
48 public class XsdDataContractExporterTest
50 internal const string MSSimpleNamespace =
51 "http://schemas.microsoft.com/2003/10/Serialization/";
52 internal const string MSArraysNamespace =
53 "http://schemas.microsoft.com/2003/10/Serialization/Arrays";
54 internal const string DefaultClrNamespaceBase =
55 "http://schemas.datacontract.org/2004/07/";
60 XsdDataContractExporter xdce = new XsdDataContractExporter ();
61 Assert.IsNotNull (xdce.Schemas);
65 public void PrimitiveType ()
67 XsdDataContractExporter xdce = new XsdDataContractExporter ();
68 Assert.AreEqual (1, xdce.Schemas.Count);
70 Assert.IsNull (xdce.GetSchemaType (typeof (int)));
71 Assert.AreEqual (new QName ("int", XmlSchema.Namespace), xdce.GetSchemaTypeName (typeof (int)));
73 xdce.Export (typeof (int));
74 Assert.IsNull (xdce.GetSchemaType (typeof (int)));
75 Assert.AreEqual (new QName ("int", XmlSchema.Namespace), xdce.GetSchemaTypeName (typeof (int)));
79 public void CanExportTest ()
81 XsdDataContractExporter xdce = new XsdDataContractExporter ();
82 Assert.IsTrue (xdce.CanExport (typeof (int)), "#1");
83 Assert.IsTrue (xdce.CanExport (typeof (dc)), "#2");
85 //No DataContract/Serializable etc -> changed in 3.5
86 Assert.IsTrue (xdce.CanExport (this.GetType ()), "#3");
90 public void GetSchemaTypeTest ()
92 XsdDataContractExporter xdce = new XsdDataContractExporter ();
93 Assert.IsNull (xdce.GetSchemaType (typeof (dc)));
94 Assert.AreEqual (new QName ("_dc", "http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization"), xdce.GetSchemaTypeName (typeof (dc)));
100 XsdDataContractExporter xdce = new XsdDataContractExporter ();
101 xdce.Export (typeof (dc));
102 XmlSchemaSet set = xdce.Schemas;
104 xdce = new XsdDataContractExporter (set);
106 xdce.Export (typeof (dc));
107 } catch (XmlSchemaException xe) {
109 } catch (Exception e) {
110 Assert.Fail ("Expected XmlSchemaException, but got " + e.GetType ().ToString ());
113 Assert.Fail ("Expected XmlSchemaException");
117 public void EnumTest ()
119 XsdDataContractExporter xdce = new XsdDataContractExporter ();
120 xdce.Export (typeof (XColors));
122 CheckEnum (xdce.Schemas, colors_qname, new List<string> (new string [] { "_Red" }));
126 public void EnumNoDcTest ()
128 XsdDataContractExporter xdce = new XsdDataContractExporter ();
129 xdce.Export (typeof (EnumNoDc));
131 CheckEnum (xdce.Schemas,
132 new QName ("EnumNoDc",
133 "http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization"),
134 new List<string> (new string [] { "Red", "Green", "Blue" }));
137 //Test case for class dc
139 public void DcTest ()
141 XsdDataContractExporter xdce = new XsdDataContractExporter ();
142 xdce.Export (typeof (dc));
143 CheckDcFull (xdce.Schemas);
147 public void Dc3Test ()
149 //Check for duplicate dc2 ?
150 XsdDataContractExporter xdce = new XsdDataContractExporter ();
151 xdce.Export (typeof (dc3));
152 CheckDcFull (xdce.Schemas);
156 public void Dc3Test2 ()
158 //Check for duplicate dc2 ?
159 XsdDataContractExporter xdce = new XsdDataContractExporter ();
160 xdce.Export (typeof (dc3));
161 xdce.Export (typeof (dc3));
162 CheckDcFull (xdce.Schemas);
166 public void GetSchemaTypeName ()
168 var xdce = new XsdDataContractExporter ();
170 Assert.AreEqual (new XmlQualifiedName ("ArrayOfstring", MSArraysNamespace), xdce.GetSchemaTypeName (typeof (IEnumerable<string>)), "#1");
175 XmlSchemas GetSchemas (XmlSchemaSet set)
177 XmlSchemas schemas = new XmlSchemas ();
178 foreach (XmlSchema schema in set.Schemas ())
179 schemas.Add (schema);
184 void CheckEnum (XmlSchemaSet schemas, QName qname, List<string> values)
186 XmlSchemaSimpleType simple = schemas.GlobalTypes [qname] as XmlSchemaSimpleType;
187 Assert.IsNotNull (simple, "#ce1");
189 XmlSchemaSimpleTypeRestriction restriction = simple.Content as XmlSchemaSimpleTypeRestriction;
190 Assert.IsNotNull (restriction, "#ce2");
191 Assert.AreEqual (new QName ("string", XmlSchema.Namespace), restriction.BaseTypeName, "#ce3");
194 Assert.AreEqual (values.Count, restriction.Facets.Count, "#ce4");
197 List<string> facets = new List<string> ();
198 foreach (XmlSchemaObject obj in restriction.Facets) {
199 XmlSchemaEnumerationFacet facet = obj as XmlSchemaEnumerationFacet;
200 Assert.IsNotNull (facet, "#ce5");
201 facets.Add (facet.Value);
205 for (int i = 0;i < values.Count;i++)
206 Assert.AreEqual (values [i], facets [i], "#ce6");
208 //Check the corresponding element
209 CheckElement (schemas, qname);
212 void CheckElement (XmlSchemaSet schemas, QName qname)
214 XmlSchemaElement element = schemas.GlobalElements [qname] as XmlSchemaElement;
215 Assert.IsNotNull (element, "#c1");
216 Assert.IsTrue (element.IsNillable, "#c2");
217 Assert.AreEqual (qname, element.SchemaTypeName, "#c3");
220 XmlSchemaComplexType GetSchemaComplexType (XmlSchemaSet schemas, QName qname)
222 XmlSchemaComplexType type = schemas.GlobalTypes [qname] as XmlSchemaComplexType;
223 Assert.IsNotNull (type, "ComplexType " + qname.ToString () + " not found.");
228 //Check the <element .. > in a sequence
229 void CheckElementReference (XmlSchemaObject obj, string name, QName schema_type, bool nillable)
231 XmlSchemaElement element = obj as XmlSchemaElement;
232 Assert.IsNotNull (element, "XmlSchemaElement not found for " + schema_type.ToString ());
234 Assert.AreEqual (name, element.Name, "#v1, Element name did not match");
235 //FIXME: Assert.AreEqual (0, element.MinOccurs, "#v0, MinOccurs should be 0 for element '" + name + "'");
236 Assert.AreEqual (schema_type, element.SchemaTypeName, "#v2, SchemaTypeName for element '" + element.Name + "' did not match.");
237 Assert.AreEqual (nillable, element.IsNillable, "#v3, Element '" + element.Name + "', schema type = '" + schema_type + "' should have nillable = " + nillable);
240 void CheckArray (XmlSchemaSet schemas, QName qname, QName element_qname)
242 XmlSchemaComplexType type = GetSchemaComplexType (schemas, qname);
243 XmlSchemaSequence sequence = type.Particle as XmlSchemaSequence;
244 Assert.IsNotNull (sequence, "#ca1");
246 Assert.AreEqual (1, sequence.Items.Count, "#ca2, Sequence.Items.Count");
247 CheckElementReference (
251 element_qname.Namespace != XmlSchema.Namespace);
253 XmlSchemaElement element = (XmlSchemaElement) sequence.Items [0];
254 Assert.AreEqual ("unbounded", element.MaxOccursString, "#ca3");
256 CheckElement (schemas, qname);
259 QName colors_qname = new QName ("_XColors", "http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization");
260 QName dc_qname = new QName ("_dc", "http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization");
261 QName other_qname = new QName ("_other", "http://schemas.datacontract.org/2004/07/OtherNs");
264 void CheckDcFull (XmlSchemaSet schemas)
266 Assert.IsTrue (schemas.IsCompiled, "#dt0, XmlSchemaSet not compiled");
267 XmlSchemaComplexType type = GetSchemaComplexType (schemas, dc_qname);
268 XmlSchemaSequence sequence = type.Particle as XmlSchemaSequence;
269 Assert.IsNotNull (sequence, "#dt1");
271 Assert.AreEqual (5, sequence.Items.Count, "#dt2, Sequence.Items.Count");
272 CheckElementReference (sequence.Items [0], "_color",
273 colors_qname, false);
274 CheckEnum (schemas, colors_qname, new List<string> (new string [] { "_Red" }));
276 CheckElementReference (sequence.Items [1], "_foo",
277 new QName ("string", XmlSchema.Namespace), true);
279 CheckElementReference (sequence.Items [2], "_o",
280 new QName ("ArrayOf_other", "http://schemas.datacontract.org/2004/07/OtherNs"), true);
281 CheckArray (schemas, new QName ("ArrayOf_other", "http://schemas.datacontract.org/2004/07/OtherNs"), other_qname);
283 CheckElementReference (sequence.Items [3], "_single_o",
284 new QName ("_other", "http://schemas.datacontract.org/2004/07/OtherNs"), true);
285 CheckOther (schemas);
287 CheckElementReference (sequence.Items [4], "i_array",
288 new QName ("ArrayOfint", "http://schemas.microsoft.com/2003/10/Serialization/Arrays"), true);
289 CheckArray (schemas, new QName ("ArrayOfint", "http://schemas.microsoft.com/2003/10/Serialization/Arrays"),
290 new QName ("int", XmlSchema.Namespace));
292 CheckElement (schemas, dc_qname);
295 void CheckOther (XmlSchemaSet schemas)
297 XmlSchemaComplexType type = GetSchemaComplexType (schemas, other_qname);
298 XmlSchemaSequence sequence = type.Particle as XmlSchemaSequence;
299 Assert.IsNotNull (sequence, "#ct0");
301 Assert.AreEqual (1, sequence.Items.Count, "#ct1");
302 CheckElementReference (sequence.Items [0], "_field_int", new QName ("int", XmlSchema.Namespace), false);
307 [DataContract (Name = "_XColors")]
310 [EnumMember (Value = "_Red")]
323 [DataContract (Name = "_dc")]
326 [DataMember (Name = "_foo")]
331 [DataMember (Name = "_color")]
337 [DataMember (Name = "_o")]
338 public OtherNs.other [] o;
340 [DataMember (Name = "_single_o")]
341 public OtherNs.other single_o;
344 public int [] i_array;
347 [DataContract (Name = "_dc2")]
348 public class dc2 : dc
350 [DataMember (Name = "_foo2")]
355 public abstract class abstract_class
365 private string base_string;
369 public class xs : base_xs
371 private string ignore;
376 public class dc_with_basexs : base_xs
378 [DataMember (Name = "_foo")]
392 [DataContract (Name = "_dc3")]
395 [DataMember (Name = "_first")]
398 [DataMember (Name = "_second")]
406 [DataContract (Name = "_other")]
407 public class other /*: MonoTests.System.Runtime.Serialization.dc*/
409 [DataMember (Name = "_field_int")]
410 public int field_int;