XsdValidatingReaderTests.cs 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. //
  2. // MonoTests.System.Xml.XsdValidatingReaderTests.cs
  3. //
  4. // Author:
  5. // Atsushi Enomoto <[email protected]>
  6. //
  7. // (C)2003 Atsushi Enomoto
  8. // (C)2005-2006 Novell, Inc.
  9. //
  10. using System;
  11. using System.IO;
  12. using System.Xml;
  13. using System.Xml.Schema;
  14. using NUnit.Framework;
  15. namespace MonoTests.System.Xml
  16. {
  17. [TestFixture]
  18. public class XsdValidatingReaderTests : Assertion
  19. {
  20. public XsdValidatingReaderTests ()
  21. {
  22. }
  23. XmlReader xtr;
  24. XmlValidatingReader xvr;
  25. private XmlValidatingReader PrepareXmlReader (string xml)
  26. {
  27. XmlReader reader = new XmlTextReader (xml, XmlNodeType.Document, null);
  28. // XmlDocument doc = new XmlDocument ();
  29. // doc.LoadXml (xml);
  30. // XmlReader reader = new XmlNodeReader (doc);
  31. return new XmlValidatingReader (reader);
  32. }
  33. [Test]
  34. public void TestEmptySchema ()
  35. {
  36. string xml = "<root/>";
  37. xvr = PrepareXmlReader (xml);
  38. xvr.ValidationType = ValidationType.Schema;
  39. xvr.Read (); // Is is missing schema component.
  40. }
  41. [Test]
  42. public void TestSimpleValidation ()
  43. {
  44. string xml = "<root/>";
  45. xvr = PrepareXmlReader (xml);
  46. AssertEquals (ValidationType.Auto, xvr.ValidationType);
  47. XmlSchema schema = new XmlSchema ();
  48. XmlSchemaElement elem = new XmlSchemaElement ();
  49. elem.Name = "root";
  50. schema.Items.Add (elem);
  51. xvr.Schemas.Add (schema);
  52. xvr.Read (); // root
  53. AssertEquals (ValidationType.Auto, xvr.ValidationType);
  54. xvr.Read (); // EOF
  55. xml = "<hoge/>";
  56. xvr = PrepareXmlReader (xml);
  57. xvr.Schemas.Add (schema);
  58. try {
  59. xvr.Read ();
  60. Fail ("element mismatch is incorrectly allowed");
  61. } catch (XmlSchemaException) {
  62. }
  63. xml = "<hoge xmlns='urn:foo' />";
  64. xvr = PrepareXmlReader (xml);
  65. xvr.Schemas.Add (schema);
  66. try {
  67. xvr.Read ();
  68. Fail ("Element in different namespace is incorrectly allowed.");
  69. } catch (XmlSchemaException) {
  70. }
  71. }
  72. [Test]
  73. public void TestReadTypedValueSimple ()
  74. {
  75. string xml = "<root>12</root>";
  76. XmlSchema schema = new XmlSchema ();
  77. XmlSchemaElement elem = new XmlSchemaElement ();
  78. elem.Name = "root";
  79. elem.SchemaTypeName = new XmlQualifiedName ("integer", XmlSchema.Namespace);
  80. schema.Items.Add (elem);
  81. // Lap 1:
  82. xvr = PrepareXmlReader (xml);
  83. xvr.Schemas.Add (schema);
  84. // Read directly from root.
  85. object o = xvr.ReadTypedValue ();
  86. AssertEquals (ReadState.Initial, xvr.ReadState);
  87. AssertNull (o);
  88. xvr.Read (); // element root
  89. AssertEquals (XmlNodeType.Element, xvr.NodeType);
  90. AssertNotNull (xvr.SchemaType);
  91. Assert (xvr.SchemaType is XmlSchemaDatatype);
  92. o = xvr.ReadTypedValue (); // read "12"
  93. AssertEquals (XmlNodeType.EndElement, xvr.NodeType);
  94. AssertNotNull (o);
  95. AssertEquals (typeof (decimal), o.GetType ());
  96. decimal n = (decimal) o;
  97. AssertEquals (12, n);
  98. Assert (!xvr.EOF);
  99. AssertEquals ("root", xvr.Name);
  100. AssertNull (xvr.SchemaType); // EndElement's type
  101. // Lap 2:
  102. xvr = PrepareXmlReader (xml);
  103. xvr.Schemas.Add (schema);
  104. xvr.Read (); // root
  105. XmlSchemaDatatype dt = xvr.SchemaType as XmlSchemaDatatype;
  106. AssertNotNull (dt);
  107. AssertEquals (typeof (decimal), dt.ValueType);
  108. AssertEquals (XmlTokenizedType.None, dt.TokenizedType);
  109. xvr.Read (); // text "12"
  110. AssertNull (xvr.SchemaType);
  111. o = xvr.ReadTypedValue ();
  112. // ReadTypedValue is different from ReadString().
  113. AssertNull (o);
  114. }
  115. [Test]
  116. [Ignore ("XML Schema validator should not be available for validating non namespace-aware XmlReader that handled colon as a name character")]
  117. public void TestNamespacesFalse ()
  118. {
  119. // This tests if Namespaces=false is specified, then
  120. // the reader's NamespaceURI should be always string.Empty and
  121. // validation should be done against such schema that has target ns as "".
  122. string xml = "<x:root xmlns:x='urn:foo' />";
  123. xvr = PrepareXmlReader (xml);
  124. xvr.Namespaces = false;
  125. AssertEquals (ValidationType.Auto, xvr.ValidationType);
  126. XmlSchema schema = new XmlSchema ();
  127. schema.TargetNamespace = "urn:foo";
  128. XmlSchemaElement elem = new XmlSchemaElement ();
  129. elem.Name = "root";
  130. schema.Items.Add (elem);
  131. xvr.Schemas.Add (schema);
  132. xvr.Read (); // root
  133. Assert (!xvr.Namespaces);
  134. AssertEquals ("x:root", xvr.Name);
  135. // LocalName may contain colons.
  136. AssertEquals ("x:root", xvr.LocalName);
  137. // NamespaceURI is not supplied.
  138. AssertEquals ("", xvr.NamespaceURI);
  139. }
  140. [Test]
  141. public void TestReadTypedAttributeValue ()
  142. {
  143. string xml = "<root attr='12'></root>";
  144. XmlSchema schema = new XmlSchema ();
  145. XmlSchemaElement elem = new XmlSchemaElement ();
  146. elem.Name = "root";
  147. XmlSchemaComplexType ct = new XmlSchemaComplexType ();
  148. XmlSchemaAttribute attr = new XmlSchemaAttribute ();
  149. attr.Name = "attr";
  150. attr.SchemaTypeName = new XmlQualifiedName ("int", XmlSchema.Namespace);
  151. ct.Attributes.Add (attr);
  152. elem.SchemaType = ct;
  153. schema.Items.Add (elem);
  154. xvr = PrepareXmlReader (xml);
  155. xvr.Schemas.Add (schema);
  156. xvr.Read ();
  157. AssertEquals ("root", xvr.Name);
  158. Assert (xvr.MoveToNextAttribute ()); // attr
  159. AssertEquals ("attr", xvr.Name);
  160. XmlSchemaDatatype dt = xvr.SchemaType as XmlSchemaDatatype;
  161. AssertNotNull (dt);
  162. AssertEquals (typeof (int), dt.ValueType);
  163. AssertEquals (XmlTokenizedType.None, dt.TokenizedType);
  164. object o = xvr.ReadTypedValue ();
  165. AssertEquals (XmlNodeType.Attribute, xvr.NodeType);
  166. AssertEquals (typeof (int), o.GetType ());
  167. int n = (int) o;
  168. AssertEquals (12, n);
  169. Assert (xvr.ReadAttributeValue ()); // can read = seems not proceed.
  170. }
  171. [Test]
  172. public void DuplicateSchemaAssignment ()
  173. {
  174. string xml = @"<data
  175. xmlns='http://www.test.com/schemas/'
  176. xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
  177. xsi:schemaLocation='http://www.test.com/schemas/ /home/user/schema.xsd' />";
  178. string xsd = @"<xs:schema
  179. targetNamespace='http://www.test.com/schemas/'
  180. xmlns:xs='http://www.w3.org/2001/XMLSchema'
  181. xmlns='http://www.test.com/schemas/' >
  182. <xs:element name='data' /></xs:schema>";
  183. string xmlns = "http://www.test.com/schemas/";
  184. XmlValidatingReader xvr = new XmlValidatingReader (
  185. xml, XmlNodeType.Document, null);
  186. XmlSchemaCollection schemas = new XmlSchemaCollection ();
  187. schemas.Add (XmlSchema.Read (new XmlTextReader (
  188. xsd, XmlNodeType.Document, null), null));
  189. xvr.Schemas.Add (schemas);
  190. while (!xvr.EOF)
  191. xvr.Read ();
  192. }
  193. [Test] // bug #76234
  194. public void DTDValidatorNamespaceHandling ()
  195. {
  196. string xml = "<xml xmlns='urn:a'> <foo> <a:bar xmlns='urn:b' xmlns:a='urn:a' /> <bug /> </foo> </xml>";
  197. XmlValidatingReader vr = new XmlValidatingReader (
  198. xml, XmlNodeType.Document, null);
  199. vr.Read ();
  200. vr.Read (); // whitespace
  201. AssertEquals ("#1", String.Empty, vr.NamespaceURI);
  202. vr.Read (); // foo
  203. AssertEquals ("#2", "urn:a", vr.NamespaceURI);
  204. vr.Read (); // whitespace
  205. vr.Read (); // a:bar
  206. AssertEquals ("#3", "urn:a", vr.NamespaceURI);
  207. vr.Read (); // whitespace
  208. vr.Read (); // bug
  209. AssertEquals ("#4", "urn:a", vr.NamespaceURI);
  210. }
  211. [Test]
  212. public void MultipleSchemaInSchemaLocation ()
  213. {
  214. XmlTextReader xtr = new XmlTextReader ("Test/XmlFiles/xsd/multi-schemaLocation.xml");
  215. XmlValidatingReader vr = new XmlValidatingReader (xtr);
  216. while (!vr.EOF)
  217. vr.Read ();
  218. }
  219. [Test]
  220. public void ReadTypedValueSimpleTypeRestriction ()
  221. {
  222. string xml = "<root>xx</root><!-- after -->";
  223. string xsd = @"
  224. <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>
  225. <xs:element name='root'>
  226. <xs:simpleType>
  227. <xs:restriction base='xs:string'>
  228. <xs:minLength value='2' />
  229. </xs:restriction>
  230. </xs:simpleType>
  231. </xs:element>
  232. </xs:schema>";
  233. XmlTextReader xir =
  234. new XmlTextReader (xml, XmlNodeType.Document, null);
  235. XmlTextReader xsr =
  236. new XmlTextReader (xsd, XmlNodeType.Document, null);
  237. XmlValidatingReader vr = new XmlValidatingReader (xir);
  238. vr.Schemas.Add (XmlSchema.Read (xsr, null));
  239. vr.Read (); // root
  240. AssertEquals ("xx", vr.ReadTypedValue ());
  241. AssertEquals (XmlNodeType.EndElement, vr.NodeType);
  242. }
  243. // If we normalize string before validating with facets,
  244. // this test will fail. It will also fail if ReadTypedValue()
  245. // ignores whitespace nodes.
  246. [Test]
  247. public void ReadTypedValueWhitespaces ()
  248. {
  249. string xml = "<root> </root><!-- after -->";
  250. string xsd = @"
  251. <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>
  252. <xs:element name='root'>
  253. <xs:simpleType>
  254. <xs:restriction base='xs:string'>
  255. <xs:minLength value='2' />
  256. </xs:restriction>
  257. </xs:simpleType>
  258. </xs:element>
  259. </xs:schema>";
  260. XmlTextReader xir =
  261. new XmlTextReader (xml, XmlNodeType.Document, null);
  262. XmlTextReader xsr =
  263. new XmlTextReader (xsd, XmlNodeType.Document, null);
  264. XmlValidatingReader vr = new XmlValidatingReader (xir);
  265. vr.Schemas.Add (XmlSchema.Read (xsr, null));
  266. vr.Read (); // root
  267. AssertEquals (" ", vr.ReadTypedValue ());
  268. AssertEquals (XmlNodeType.EndElement, vr.NodeType);
  269. }
  270. [Test] // bug #77241
  271. public void EmptyContentAllowWhitespace ()
  272. {
  273. string doc = @"
  274. <root>
  275. <!-- some comment -->
  276. <child/>
  277. </root>
  278. ";
  279. string schema = @"
  280. <xsd:schema xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
  281. <xsd:element name=""root"">
  282. <xsd:complexType>
  283. <xsd:sequence>
  284. <xsd:element name=""child"" type=""xsd:string"" />
  285. </xsd:sequence>
  286. </xsd:complexType>
  287. </xsd:element>
  288. </xsd:schema>
  289. ";
  290. XmlValidatingReader reader = new XmlValidatingReader (
  291. new XmlTextReader (new StringReader (doc)));
  292. reader.Schemas.Add (null,
  293. new XmlTextReader (new StringReader (schema)));
  294. while (reader.Read ())
  295. ;
  296. }
  297. }
  298. }