XmlSchemaTests.cs 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. //
  2. // System.Xml.XmlSchemaTests.cs
  3. //
  4. // Author:
  5. // Atsushi Enomoto <[email protected]>
  6. //
  7. // (C) 2002 Atsushi Enomoto
  8. //
  9. using System;
  10. using System.IO;
  11. using System.Xml;
  12. using System.Xml.Schema;
  13. using NUnit.Framework;
  14. namespace MonoTests.System.Xml
  15. {
  16. [TestFixture]
  17. public class XmlSchemaTests : Assertion
  18. {
  19. private XmlSchema GetSchema (string path)
  20. {
  21. return XmlSchema.Read (new XmlTextReader (path), null);
  22. }
  23. private XmlQualifiedName QName (string name, string ns)
  24. {
  25. return new XmlQualifiedName (name, ns);
  26. }
  27. private void AssertElement (XmlSchemaElement element,
  28. string name, XmlQualifiedName refName, string id,
  29. XmlQualifiedName schemaTypeName, XmlSchemaType schemaType)
  30. {
  31. AssertNotNull (element);
  32. AssertEquals (name, element.Name);
  33. AssertEquals (refName, element.RefName);
  34. AssertEquals (id, element.Id);
  35. AssertEquals (schemaTypeName, element.SchemaTypeName);
  36. AssertEquals (schemaType, element.SchemaType);
  37. }
  38. private void AssertElementEx (XmlSchemaElement element,
  39. XmlSchemaDerivationMethod block, XmlSchemaDerivationMethod final,
  40. string defaultValue, string fixedValue,
  41. XmlSchemaForm form, bool isAbstract, bool isNillable,
  42. XmlQualifiedName substGroup)
  43. {
  44. AssertNotNull (element);
  45. AssertEquals (block, element.Block);
  46. AssertEquals (final, element.Final);
  47. AssertEquals (defaultValue, element.DefaultValue);
  48. AssertEquals (fixedValue, element.FixedValue);
  49. AssertEquals (form, element.Form);
  50. AssertEquals (isAbstract, element.IsAbstract);
  51. AssertEquals (isNillable, element.IsNillable);
  52. AssertEquals (substGroup, element.SubstitutionGroup);
  53. }
  54. private void AssertCompiledComplexType (XmlSchemaComplexType cType,
  55. XmlQualifiedName name,
  56. int attributesCount, int attributeUsesCount,
  57. bool existsAny, Type contentModelType,
  58. bool hasContentTypeParticle,
  59. XmlSchemaContentType contentType)
  60. {
  61. AssertNotNull (cType);
  62. AssertEquals (name.Name, cType.Name);
  63. AssertEquals (name, cType.QualifiedName);
  64. AssertEquals (attributesCount, cType.Attributes.Count);
  65. AssertEquals (attributeUsesCount, cType.AttributeUses.Count);
  66. Assert (existsAny == (cType.AttributeWildcard != null));
  67. if (contentModelType == null)
  68. AssertNull (cType.ContentModel);
  69. else
  70. AssertEquals (contentModelType, cType.ContentModel.GetType ());
  71. AssertEquals (hasContentTypeParticle, cType.ContentTypeParticle != null);
  72. AssertEquals (contentType, cType.ContentType);
  73. }
  74. private void AssertCompiledComplexContentExtension (XmlSchemaComplexContentExtension xccx,
  75. int attributeCount, bool hasAnyAttribute, XmlQualifiedName baseTypeName)
  76. {
  77. AssertNotNull (xccx);
  78. AssertEquals (attributeCount, xccx.Attributes.Count);
  79. AssertEquals (hasAnyAttribute, xccx.AnyAttribute != null);
  80. AssertEquals (baseTypeName, xccx.BaseTypeName);
  81. AssertNotNull (xccx.Particle);
  82. }
  83. private void AssertCompiledElement (XmlSchemaElement element,
  84. XmlQualifiedName name, object elementType)
  85. {
  86. AssertNotNull (element);
  87. AssertEquals (name, element.QualifiedName);
  88. AssertEquals (elementType, element.ElementType);
  89. }
  90. [Test]
  91. public void TestRead ()
  92. {
  93. XmlSchema schema = GetSchema ("Test/XmlFiles/xsd/1.xsd");
  94. AssertEquals (6, schema.Items.Count);
  95. bool fooValidated = false;
  96. bool barValidated = false;
  97. string ns = "urn:bar";
  98. foreach (XmlSchemaObject obj in schema.Items) {
  99. XmlSchemaElement element = obj as XmlSchemaElement;
  100. if (element == null)
  101. continue;
  102. if (element.Name == "Foo") {
  103. AssertElement (element, "Foo",
  104. XmlQualifiedName.Empty, null,
  105. QName ("string", XmlSchema.Namespace), null);
  106. fooValidated = true;
  107. }
  108. if (element.Name == "Bar") {
  109. AssertElement (element, "Bar",
  110. XmlQualifiedName.Empty, null, QName ("FugaType", ns), null);
  111. barValidated = true;
  112. }
  113. }
  114. Assert (fooValidated);
  115. Assert (barValidated);
  116. }
  117. [Test]
  118. public void TestReadFlags ()
  119. {
  120. XmlSchema schema = GetSchema ("Test/XmlFiles/xsd/2.xsd");
  121. schema.Compile (null);
  122. XmlSchemaElement el = schema.Items [0] as XmlSchemaElement;
  123. AssertNotNull (el);
  124. AssertEquals (XmlSchemaDerivationMethod.Extension, el.Block);
  125. el = schema.Items [1] as XmlSchemaElement;
  126. AssertNotNull (el);
  127. AssertEquals (XmlSchemaDerivationMethod.Extension |
  128. XmlSchemaDerivationMethod.Restriction, el.Block);
  129. }
  130. [Test]
  131. public void TestWriteFlags ()
  132. {
  133. XmlSchema schema = GetSchema ("Test/XmlFiles/xsd/2.xsd");
  134. StringWriter sw = new StringWriter ();
  135. XmlTextWriter xtw = new XmlTextWriter (sw);
  136. schema.Write (xtw);
  137. }
  138. [Test]
  139. public void TestCompile ()
  140. {
  141. XmlQualifiedName qname;
  142. XmlSchemaComplexContentExtension xccx;
  143. XmlSchemaComplexType cType;
  144. XmlSchemaSequence seq;
  145. XmlSchema schema = GetSchema ("Test/XmlFiles/xsd/1.xsd");
  146. // Assert (!schema.IsCompiled);
  147. schema.Compile (null);
  148. Assert (schema.IsCompiled);
  149. string ns = "urn:bar";
  150. XmlSchemaElement foo = (XmlSchemaElement) schema.Elements [QName ("Foo", ns)];
  151. AssertNotNull (foo);
  152. XmlSchemaDatatype stringDatatype = foo.ElementType as XmlSchemaDatatype;
  153. AssertNotNull (stringDatatype);
  154. // HogeType
  155. qname = QName ("HogeType", ns);
  156. cType = schema.SchemaTypes [qname] as XmlSchemaComplexType;
  157. AssertNotNull (cType);
  158. AssertNull (cType.ContentModel);
  159. AssertCompiledComplexType (cType, qname, 0, 0,
  160. false, null, true, XmlSchemaContentType.ElementOnly);
  161. seq = cType.ContentTypeParticle as XmlSchemaSequence;
  162. AssertNotNull (seq);
  163. AssertEquals (2, seq.Items.Count);
  164. XmlSchemaElement refFoo = seq.Items [0] as XmlSchemaElement;
  165. AssertCompiledElement (refFoo, QName ("Foo", ns), stringDatatype);
  166. // FugaType
  167. qname = QName ("FugaType", ns);
  168. cType = schema.SchemaTypes [qname] as XmlSchemaComplexType;
  169. AssertNotNull (cType);
  170. xccx = cType.ContentModel.Content as XmlSchemaComplexContentExtension;
  171. AssertCompiledComplexContentExtension (
  172. xccx, 0, false, QName ("HogeType", ns));
  173. AssertCompiledComplexType (cType, qname, 0, 0,
  174. false, typeof (XmlSchemaComplexContent),
  175. true, XmlSchemaContentType.ElementOnly);
  176. AssertNotNull (cType.BaseSchemaType);
  177. seq = xccx.Particle as XmlSchemaSequence;
  178. AssertNotNull (seq);
  179. AssertEquals (1, seq.Items.Count);
  180. XmlSchemaElement refBaz = seq.Items [0] as XmlSchemaElement;
  181. AssertNotNull (refBaz);
  182. AssertCompiledElement (refBaz, QName ("Baz", ""), stringDatatype);
  183. qname = QName ("Bar", ns);
  184. XmlSchemaElement element = schema.Elements [qname] as XmlSchemaElement;
  185. AssertCompiledElement (element, qname, cType);
  186. }
  187. [Test]
  188. [ExpectedException (typeof (XmlSchemaException))]
  189. public void TestCompileNonSchema ()
  190. {
  191. XmlTextReader xtr = new XmlTextReader ("<root/>", XmlNodeType.Document, null);
  192. XmlSchema schema = XmlSchema.Read (xtr, null);
  193. }
  194. [Test]
  195. public void TestSimpleImport ()
  196. {
  197. XmlSchema schema = XmlSchema.Read (new XmlTextReader ("Test/XmlFiles/xsd/3.xsd"), null);
  198. AssertEquals ("urn:foo", schema.TargetNamespace);
  199. XmlSchemaImport import = schema.Includes [0] as XmlSchemaImport;
  200. AssertNotNull (import);
  201. schema.Compile (null);
  202. AssertEquals (4, schema.Elements.Count);
  203. AssertNotNull (schema.Elements [QName ("Foo", "urn:foo")]);
  204. AssertNotNull (schema.Elements [QName ("Bar", "urn:foo")]);
  205. AssertNotNull (schema.Elements [QName ("Foo", "urn:bar")]);
  206. AssertNotNull (schema.Elements [QName ("Bar", "urn:bar")]);
  207. }
  208. [Test]
  209. public void TestQualification ()
  210. {
  211. XmlSchema schema = XmlSchema.Read (new XmlTextReader ("Test/XmlFiles/xsd/5.xsd"), null);
  212. schema.Compile (null);
  213. XmlSchemaElement el = schema.Elements [QName ("Foo", "urn:bar")] as XmlSchemaElement;
  214. AssertNotNull (el);
  215. XmlSchemaComplexType ct = el.ElementType as XmlSchemaComplexType;
  216. XmlSchemaSequence seq = ct.ContentTypeParticle as XmlSchemaSequence;
  217. XmlSchemaElement elp = seq.Items [0] as XmlSchemaElement;
  218. AssertEquals (QName ("Bar", ""), elp.QualifiedName);
  219. schema = XmlSchema.Read (new XmlTextReader ("Test/XmlFiles/xsd/6.xsd"), null);
  220. schema.Compile (null);
  221. el = schema.Elements [QName ("Foo", "urn:bar")] as XmlSchemaElement;
  222. AssertNotNull (el);
  223. ct = el.ElementType as XmlSchemaComplexType;
  224. seq = ct.ContentTypeParticle as XmlSchemaSequence;
  225. elp = seq.Items [0] as XmlSchemaElement;
  226. AssertEquals (QName ("Bar", "urn:bar"), elp.QualifiedName);
  227. }
  228. }
  229. }