2 // MonoTests.System.Xml.XsdValidatingReaderTests.cs
\r
5 // Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
\r
7 // (C)2003 Atsushi Enomoto
\r
8 // (C)2005-2007 Novell, Inc.
\r
14 using System.Xml.Schema;
\r
15 using NUnit.Framework;
\r
17 namespace MonoTests.System.Xml
\r
20 public class XsdValidatingReaderTests : Assertion
\r
22 public XsdValidatingReaderTests ()
\r
27 XmlValidatingReader xvr;
\r
29 private XmlValidatingReader PrepareXmlReader (string xml)
\r
31 XmlReader reader = new XmlTextReader (xml, XmlNodeType.Document, null);
\r
32 // XmlDocument doc = new XmlDocument ();
\r
33 // doc.LoadXml (xml);
\r
34 // XmlReader reader = new XmlNodeReader (doc);
\r
36 return new XmlValidatingReader (reader);
\r
40 public void TestEmptySchema ()
\r
42 string xml = "<root/>";
\r
43 xvr = PrepareXmlReader (xml);
\r
44 xvr.ValidationType = ValidationType.Schema;
\r
45 xvr.Read (); // Is is missing schema component.
\r
49 public void TestSimpleValidation ()
\r
51 string xml = "<root/>";
\r
52 xvr = PrepareXmlReader (xml);
\r
53 AssertEquals (ValidationType.Auto, xvr.ValidationType);
\r
54 XmlSchema schema = new XmlSchema ();
\r
55 XmlSchemaElement elem = new XmlSchemaElement ();
\r
57 schema.Items.Add (elem);
\r
58 xvr.Schemas.Add (schema);
\r
59 xvr.Read (); // root
\r
60 AssertEquals (ValidationType.Auto, xvr.ValidationType);
\r
64 xvr = PrepareXmlReader (xml);
\r
65 xvr.Schemas.Add (schema);
\r
68 Fail ("element mismatch is incorrectly allowed");
\r
69 } catch (XmlSchemaException) {
\r
72 xml = "<hoge xmlns='urn:foo' />";
\r
73 xvr = PrepareXmlReader (xml);
\r
74 xvr.Schemas.Add (schema);
\r
77 Fail ("Element in different namespace is incorrectly allowed.");
\r
78 } catch (XmlSchemaException) {
\r
83 public void TestReadTypedValueSimple ()
\r
85 string xml = "<root>12</root>";
\r
86 XmlSchema schema = new XmlSchema ();
\r
87 XmlSchemaElement elem = new XmlSchemaElement ();
\r
89 elem.SchemaTypeName = new XmlQualifiedName ("integer", XmlSchema.Namespace);
\r
90 schema.Items.Add (elem);
\r
94 xvr = PrepareXmlReader (xml);
\r
95 xvr.Schemas.Add (schema);
\r
96 // Read directly from root.
\r
97 object o = xvr.ReadTypedValue ();
\r
98 AssertEquals (ReadState.Initial, xvr.ReadState);
\r
101 xvr.Read (); // element root
\r
102 AssertEquals (XmlNodeType.Element, xvr.NodeType);
\r
103 AssertNotNull (xvr.SchemaType);
\r
104 Assert (xvr.SchemaType is XmlSchemaDatatype);
\r
105 o = xvr.ReadTypedValue (); // read "12"
\r
106 AssertEquals (XmlNodeType.EndElement, xvr.NodeType);
\r
108 AssertEquals (typeof (decimal), o.GetType ());
\r
109 decimal n = (decimal) o;
\r
110 AssertEquals (12, n);
\r
112 AssertEquals ("root", xvr.Name);
\r
113 AssertNull (xvr.SchemaType); // EndElement's type
\r
117 xvr = PrepareXmlReader (xml);
\r
118 xvr.Schemas.Add (schema);
\r
119 xvr.Read (); // root
\r
120 XmlSchemaDatatype dt = xvr.SchemaType as XmlSchemaDatatype;
\r
121 AssertNotNull (dt);
\r
122 AssertEquals (typeof (decimal), dt.ValueType);
\r
123 AssertEquals (XmlTokenizedType.None, dt.TokenizedType);
\r
124 xvr.Read (); // text "12"
\r
125 AssertNull (xvr.SchemaType);
\r
126 o = xvr.ReadTypedValue ();
\r
127 // ReadTypedValue is different from ReadString().
\r
132 [Ignore ("XML Schema validator should not be available for validating non namespace-aware XmlReader that handled colon as a name character")]
\r
133 public void TestNamespacesFalse ()
\r
135 // This tests if Namespaces=false is specified, then
\r
136 // the reader's NamespaceURI should be always string.Empty and
\r
137 // validation should be done against such schema that has target ns as "".
\r
138 string xml = "<x:root xmlns:x='urn:foo' />";
\r
139 xvr = PrepareXmlReader (xml);
\r
140 xvr.Namespaces = false;
\r
141 AssertEquals (ValidationType.Auto, xvr.ValidationType);
\r
142 XmlSchema schema = new XmlSchema ();
\r
143 schema.TargetNamespace = "urn:foo";
\r
144 XmlSchemaElement elem = new XmlSchemaElement ();
\r
145 elem.Name = "root";
\r
146 schema.Items.Add (elem);
\r
147 xvr.Schemas.Add (schema);
\r
148 xvr.Read (); // root
\r
149 Assert (!xvr.Namespaces);
\r
150 AssertEquals ("x:root", xvr.Name);
\r
151 // LocalName may contain colons.
\r
152 AssertEquals ("x:root", xvr.LocalName);
\r
153 // NamespaceURI is not supplied.
\r
154 AssertEquals ("", xvr.NamespaceURI);
\r
158 public void TestReadTypedAttributeValue ()
\r
160 string xml = "<root attr='12'></root>";
\r
161 XmlSchema schema = new XmlSchema ();
\r
162 XmlSchemaElement elem = new XmlSchemaElement ();
\r
163 elem.Name = "root";
\r
164 XmlSchemaComplexType ct = new XmlSchemaComplexType ();
\r
165 XmlSchemaAttribute attr = new XmlSchemaAttribute ();
\r
166 attr.Name = "attr";
\r
167 attr.SchemaTypeName = new XmlQualifiedName ("int", XmlSchema.Namespace);
\r
168 ct.Attributes.Add (attr);
\r
169 elem.SchemaType = ct;
\r
170 schema.Items.Add (elem);
\r
172 xvr = PrepareXmlReader (xml);
\r
173 xvr.Schemas.Add (schema);
\r
175 AssertEquals ("root", xvr.Name);
\r
176 Assert (xvr.MoveToNextAttribute ()); // attr
\r
177 AssertEquals ("attr", xvr.Name);
\r
178 XmlSchemaDatatype dt = xvr.SchemaType as XmlSchemaDatatype;
\r
179 AssertNotNull (dt);
\r
180 AssertEquals (typeof (int), dt.ValueType);
\r
181 AssertEquals (XmlTokenizedType.None, dt.TokenizedType);
\r
182 object o = xvr.ReadTypedValue ();
\r
183 AssertEquals (XmlNodeType.Attribute, xvr.NodeType);
\r
184 AssertEquals (typeof (int), o.GetType ());
\r
186 AssertEquals (12, n);
\r
187 Assert (xvr.ReadAttributeValue ()); // can read = seems not proceed.
\r
191 public void DuplicateSchemaAssignment ()
\r
193 string xml = @"<data
\r
194 xmlns='http://www.test.com/schemas/'
\r
195 xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
\r
196 xsi:schemaLocation='http://www.test.com/schemas/ /home/user/schema.xsd' />";
\r
197 string xsd = @"<xs:schema
\r
198 targetNamespace='http://www.test.com/schemas/'
\r
199 xmlns:xs='http://www.w3.org/2001/XMLSchema'
\r
200 xmlns='http://www.test.com/schemas/' >
\r
201 <xs:element name='data' /></xs:schema>";
\r
203 string xmlns = "http://www.test.com/schemas/";
\r
205 XmlValidatingReader xvr = new XmlValidatingReader (
\r
206 xml, XmlNodeType.Document, null);
\r
207 XmlSchemaCollection schemas = new XmlSchemaCollection ();
\r
208 schemas.Add (XmlSchema.Read (new XmlTextReader (
\r
209 xsd, XmlNodeType.Document, null), null));
\r
210 xvr.Schemas.Add (schemas);
\r
215 [Test] // bug #76234
\r
216 public void DTDValidatorNamespaceHandling ()
\r
218 string xml = "<xml xmlns='urn:a'> <foo> <a:bar xmlns='urn:b' xmlns:a='urn:a' /> <bug /> </foo> </xml>";
\r
219 XmlValidatingReader vr = new XmlValidatingReader (
\r
220 xml, XmlNodeType.Document, null);
\r
222 vr.Read (); // whitespace
\r
223 AssertEquals ("#1", String.Empty, vr.NamespaceURI);
\r
225 AssertEquals ("#2", "urn:a", vr.NamespaceURI);
\r
226 vr.Read (); // whitespace
\r
227 vr.Read (); // a:bar
\r
228 AssertEquals ("#3", "urn:a", vr.NamespaceURI);
\r
229 vr.Read (); // whitespace
\r
231 AssertEquals ("#4", "urn:a", vr.NamespaceURI);
\r
235 public void MultipleSchemaInSchemaLocation ()
\r
237 XmlTextReader xtr = new XmlTextReader ("Test/XmlFiles/xsd/multi-schemaLocation.xml");
\r
238 XmlValidatingReader vr = new XmlValidatingReader (xtr);
\r
244 public void ReadTypedValueSimpleTypeRestriction ()
\r
246 string xml = "<root>xx</root><!-- after -->";
\r
248 <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>
\r
249 <xs:element name='root'>
\r
251 <xs:restriction base='xs:string'>
\r
252 <xs:minLength value='2' />
\r
257 XmlTextReader xir =
\r
258 new XmlTextReader (xml, XmlNodeType.Document, null);
\r
259 XmlTextReader xsr =
\r
260 new XmlTextReader (xsd, XmlNodeType.Document, null);
\r
261 XmlValidatingReader vr = new XmlValidatingReader (xir);
\r
262 vr.Schemas.Add (XmlSchema.Read (xsr, null));
\r
263 vr.Read (); // root
\r
264 AssertEquals ("xx", vr.ReadTypedValue ());
\r
265 AssertEquals (XmlNodeType.EndElement, vr.NodeType);
\r
268 // If we normalize string before validating with facets,
\r
269 // this test will fail. It will also fail if ReadTypedValue()
\r
270 // ignores whitespace nodes.
\r
272 public void ReadTypedValueWhitespaces ()
\r
274 string xml = "<root> </root><!-- after -->";
\r
276 <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>
\r
277 <xs:element name='root'>
\r
279 <xs:restriction base='xs:string'>
\r
280 <xs:minLength value='2' />
\r
285 XmlTextReader xir =
\r
286 new XmlTextReader (xml, XmlNodeType.Document, null);
\r
287 XmlTextReader xsr =
\r
288 new XmlTextReader (xsd, XmlNodeType.Document, null);
\r
289 XmlValidatingReader vr = new XmlValidatingReader (xir);
\r
290 vr.Schemas.Add (XmlSchema.Read (xsr, null));
\r
291 vr.Read (); // root
\r
292 AssertEquals (" ", vr.ReadTypedValue ());
\r
293 AssertEquals (XmlNodeType.EndElement, vr.NodeType);
\r
296 [Test] // bug #77241
\r
297 public void EmptyContentAllowWhitespace ()
\r
301 <!-- some comment -->
\r
306 <xsd:schema xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
\r
307 <xsd:element name=""root"">
\r
310 <xsd:element name=""child"" type=""xsd:string"" />
\r
316 XmlValidatingReader reader = new XmlValidatingReader (
\r
317 new XmlTextReader (new StringReader (doc)));
\r
318 reader.Schemas.Add (null,
\r
319 new XmlTextReader (new StringReader (schema)));
\r
320 while (reader.Read ())
\r
324 [Test] // bug #79650
\r
327 [ExpectedException (typeof (XmlSchemaValidationException))]
\r
329 [ExpectedException (typeof (XmlSchemaException))]
\r
331 public void EnumerationFacetOnAttribute ()
\r
333 string xml = "<test mode='NOT A ENUMERATION VALUE' />";
\r
334 XmlSchema schema = XmlSchema.Read (new XmlTextReader ("Test/XmlFiles/xsd/79650.xsd"), null);
\r
335 XmlValidatingReader xvr = new XmlValidatingReader (xml, XmlNodeType.Document, null);
\r
336 xvr.ValidationType = ValidationType.Schema;
\r
337 xvr.Schemas.Add (schema);
\r
342 class XmlErrorResolver : XmlResolver
\r
344 public override ICredentials Credentials {
\r
348 public override object GetEntity (Uri uri, string role, Type type)
\r
350 throw new Exception ();
\r
354 [Test] // bug #79924
\r
355 public void ValidationTypeNoneIgnoreSchemaLocations ()
\r
357 string xml = "<project xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='nosuchschema.xsd'/>";
\r
358 XmlValidatingReader vr = new XmlValidatingReader (
\r
359 new XmlTextReader (new StringReader (xml)));
\r
360 vr.ValidationType = ValidationType.None;
\r
361 vr.XmlResolver = new XmlErrorResolver ();
\r
366 [Test] // bug #336625
\r
367 public void ValidationTypeNoneIgnoreLocatedSchemaErrors ()
\r
369 string xml = "<test xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='Test/XmlFiles/xsd/336625.xsd'/>";
\r
370 XmlValidatingReader vr = new XmlValidatingReader (
\r
371 new XmlTextReader (new StringReader (xml)));
\r
372 vr.ValidationType = ValidationType.None;
\r
378 public void Bug81360 ()
\r
380 string schemaFile = "Test/XmlFiles/xsd/81360.xsd";
\r
381 XmlTextReader treader = new XmlTextReader (schemaFile);
\r
382 XmlSchema sc = XmlSchema.Read (treader, null);
\r
384 string xml = @"<body xmlns='" + sc.TargetNamespace + "'><div></div></body>";
\r
385 XmlTextReader reader = new XmlTextReader (new StringReader (xml));
\r
386 XmlValidatingReader validator = new XmlValidatingReader (reader);
\r
387 validator.Schemas.Add (sc);
\r
388 validator.ValidationType = ValidationType.Schema;
\r
389 while (!validator.EOF)
\r
395 public void Bug81460 ()
\r
397 string xsd = "<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'><xs:element name='foo'><xs:complexType><xs:attribute name='a' default='x' /></xs:complexType></xs:element></xs:schema>";
\r
398 string xml = "<foo/>";
\r
399 XmlReaderSettings s = new XmlReaderSettings ();
\r
400 s.ValidationType = ValidationType.Schema;
\r
401 s.Schemas.Add (XmlSchema.Read (new StringReader (xsd), null));
\r
402 XmlReader r = XmlReader.Create (new StringReader (xml), s);
\r
404 r.MoveToFirstAttribute (); // default attribute
\r
405 AssertEquals (String.Empty, r.Prefix);
\r
412 [ExpectedException (typeof (XmlSchemaValidationException))]
\r
414 [ExpectedException (typeof (XmlSchemaException))]
\r
416 public void Bug82099 ()
\r
419 <xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
\r
420 <xsd:element name='Customer' type='CustomerType' />
\r
421 <xsd:complexType name='CustomerType'>
\r
422 <xsd:attribute name='name' type='xsd:string' />
\r
425 XmlSchema schema = XmlSchema.Read (new StringReader (xsd), null);
\r
427 string xml = "<Customer name='Bob'> </Customer>";
\r
430 XmlReaderSettings settings = new XmlReaderSettings ();
\r
431 settings.Schemas.Add (schema);
\r
432 settings.ValidationType = ValidationType.Schema;
\r
434 XmlReader reader = XmlReader.Create (new StringReader (xml), settings);
\r
437 XmlValidatingReader reader = new XmlValidatingReader (xml, XmlNodeType.Document, null);
\r
438 reader.Schemas.Add (schema);
\r
439 reader.ValidationType = ValidationType.Schema;
\r
447 public void Bug82010 ()
\r
449 string xmlfile = "Test/XmlFiles/xsd/82010.xml";
\r
450 string xsdfile = "Test/XmlFiles/xsd/82010.xsd";
\r
451 XmlTextReader xr = null, xr2 = null;
\r
453 xr = new XmlTextReader (xsdfile);
\r
454 xr2 = new XmlTextReader (xmlfile);
\r
455 XmlValidatingReader xvr = new XmlValidatingReader (xr2);
\r
456 xvr.Schemas.Add (XmlSchema.Read (xr, null));
\r
468 public void Bug376395 ()
\r
470 string xmlfile = "Test/XmlFiles/xsd/376395.xml";
\r
471 string xsdfile = "Test/XmlFiles/xsd/376395.xsd";
\r
472 XmlTextReader xr = null, xr2 = null;
\r
474 xr = new XmlTextReader (xsdfile);
\r
475 xr2 = new XmlTextReader (xmlfile);
\r
476 XmlValidatingReader xvr = new XmlValidatingReader (xr2);
\r
477 xvr.Schemas.Add (XmlSchema.Read (xr, null));
\r
489 public void ValidateMixedInsideXsdAny ()
\r
491 string xml = @"<root xmlns='urn:foo'>
\r
493 <Y><X><Z>text</Z></X></Y>
\r
496 <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'
\r
497 targetNamespace='urn:foo' xmlns='urn:foo'>
\r
498 <xs:complexType name='root-type'>
\r
499 <xs:sequence><xs:element ref='X' /><xs:element ref='Y' /></xs:sequence>
\r
501 <xs:complexType name='X-type'>
\r
502 <xs:choice minOccurs='1' maxOccurs='unbounded'>
\r
503 <xs:any processContents='skip'/>
\r
506 <xs:complexType name='Y-type'>
\r
507 <xs:sequence><xs:element ref='X' /></xs:sequence>
\r
509 <xs:element name='root' type='root-type' />
\r
510 <xs:element name='X' type='X-type' />
\r
511 <xs:element name='Y' type='Y-type' />
\r
513 XmlTextReader xtr = new XmlTextReader (new StringReader (xml));
\r
514 XmlValidatingReader xvr = new XmlValidatingReader (xtr);
\r
515 XmlReader xsr = new XmlTextReader (new StringReader (xsd));
\r
516 xvr.Schemas.Add (XmlSchema.Read (xsr, null));
\r
520 xtr = new XmlTextReader (new StringReader (xml));
\r
521 xsr = new XmlTextReader (new StringReader (xsd));
\r
522 var s = new XmlReaderSettings ();
\r
523 s.Schemas.Add (XmlSchema.Read (xsr, null));
\r
524 s.ValidationType = ValidationType.Schema;
\r
525 XmlReader xvr2 = XmlReader.Create (xtr, s);
\r
533 public void WhitespaceAndElementOnly ()
\r
535 string xsd = @"<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>
\r
536 <xs:element name='element_list'>
\r
539 <xs:element name='element' maxOccurs='unbounded' />
\r
544 string xml = @"<element_list>
\r
545 <!-- blah blah blah -->
\r
551 RunValidation (xml, xsd);
\r
555 [ExpectedException (typeof (XmlSchemaValidationException))]
\r
556 public void EnumerationFacet ()
\r
559 string xsd = @"<xs:schema id='schema' xmlns:xs='http://www.w3.org/2001/XMLSchema'>
\r
560 <xs:simpleType name='ModeType'>
\r
561 <xs:restriction base='xs:string'>
\r
562 <xs:enumeration value='on' />
\r
563 <xs:enumeration value='off' />
\r
566 <xs:element name='test'>
\r
569 <xs:attribute name='mode' type='ModeType' use='required' />
\r
573 string xml = @"<test mode='out of scope'></test>";
\r
575 RunValidation (xml, xsd);
\r
579 public void Bug501763 ()
\r
582 <xs:schema id='foo1'
\r
583 targetNamespace='foo1'
\r
584 elementFormDefault='qualified'
\r
586 xmlns:xs='http://www.w3.org/2001/XMLSchema'
\r
589 <xs:import namespace='foo2' />
\r
590 <xs:element name='Foo1Element' type='f2:Foo2ExtendedType'/>
\r
594 <xs:schema id='foo2'
\r
595 targetNamespace='foo2'
\r
596 elementFormDefault='qualified'
\r
598 xmlns:xs='http://www.w3.org/2001/XMLSchema' >
\r
600 <xs:element name='Foo2Element' type='Foo2Type' />
\r
602 <xs:complexType name='Foo2Type'>
\r
603 <xs:attribute name='foo2Attr' type='xs:string' use='required'/>
\r
606 <xs:complexType name='Foo2ExtendedType'>
\r
607 <xs:complexContent>
\r
608 <xs:extension base='Foo2Type'>
\r
609 <xs:attribute name='foo2ExtAttr' type='xs:string' use='required'/>
\r
611 </xs:complexContent>
\r
616 XmlDocument doc = new XmlDocument ();
\r
618 XmlSchema schema1 = XmlSchema.Read (XmlReader.Create (new StringReader (xsd1)), null);
\r
619 XmlSchema schema2 = XmlSchema.Read (XmlReader.Create (new StringReader (xsd2)), null);
\r
623 foo2Attr='dummyvalue1'
\r
626 doc.Schemas.Add (schema2);
\r
627 doc.Validate (null);
\r
629 doc = new XmlDocument();
\r
632 foo2Attr='dummyvalue1'
\r
633 foo2ExtAttr='dummyvalue2'
\r
636 doc.Schemas.Add (schema2);
\r
637 doc.Schemas.Add (schema1);
\r
638 doc.Validate (null);
\r
641 void RunValidation (string xml, string xsd)
\r
643 XmlReaderSettings s = new XmlReaderSettings ();
\r
644 s.ValidationType = ValidationType.Schema;
\r
645 s.Schemas.Add (XmlSchema.Read (XmlReader.Create (new StringReader (xsd)), null));
\r
647 XmlReader r = XmlReader.Create (new StringReader (xml), s);
\r