2 // MonoTests.System.Xml.XmlValidatingReaderTests.cs
\r
5 // Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
\r
7 // (C)2003 Atsushi Enomoto
\r
11 using System.Xml.Schema;
\r
12 using NUnit.Framework;
\r
14 namespace MonoTests.System.Xml
\r
17 public class XmlValidatingReaderTests : Assertion
\r
19 public XmlValidatingReaderTests ()
\r
24 XmlValidatingReader dvr;
\r
26 private XmlValidatingReader PrepareXmlReader (string xml)
\r
28 XmlReader reader = new XmlTextReader (xml, XmlNodeType.Document, null);
\r
29 // XmlDocument doc = new XmlDocument ();
\r
30 // doc.LoadXml (xml);
\r
31 // XmlReader reader = new XmlNodeReader (doc);
\r
33 return new XmlValidatingReader (reader);
\r
37 public void TestSingleElement ()
\r
39 string intSubset = "<!ELEMENT root EMPTY>";
\r
40 string dtd = "<!DOCTYPE root [" + intSubset + "]>";
\r
41 string xml = dtd + "<root />";
\r
42 dvr = PrepareXmlReader (xml);
\r
46 xml = dtd + "<invalid />";
\r
47 dvr = PrepareXmlReader (xml);
\r
50 dvr.Read (); // invalid element.
\r
51 Fail ("should be failed.");
\r
52 } catch (XmlSchemaException) {
\r
55 xml = dtd + "<root>invalid PCDATA.</root>";
\r
56 dvr = PrepareXmlReader (xml);
\r
58 dvr.Read (); // root
\r
60 dvr.Read (); // invalid text
\r
61 Fail ("should be failed.");
\r
62 } catch (XmlSchemaException) {
\r
65 xml = dtd + "<root><invalid_child /></root>";
\r
66 dvr = PrepareXmlReader (xml);
\r
68 dvr.Read (); // root
\r
70 dvr.Read (); // invalid child
\r
71 Fail ("should be failed.");
\r
72 } catch (XmlSchemaException) {
\r
77 public void TestElementContent ()
\r
79 string intSubset = "<!ELEMENT root (foo)><!ELEMENT foo EMPTY>";
\r
80 string dtd = "<!DOCTYPE root [" + intSubset + "]>";
\r
81 string xml = dtd + "<root />";
\r
82 dvr = PrepareXmlReader (xml);
\r
85 dvr.Read (); // root: invalid end
\r
86 Fail ("should be failed.");
\r
87 } catch (XmlSchemaException) {
\r
90 xml = dtd + "<root>Test.</root>";
\r
91 dvr = PrepareXmlReader (xml);
\r
93 dvr.Read (); // root
\r
95 dvr.Read (); // invalid end
\r
96 Fail ("should be failed.");
\r
97 } catch (XmlSchemaException) {
\r
100 xml = dtd + "<root><foo /></root>";
\r
101 dvr = PrepareXmlReader (xml);
\r
102 dvr.Read (); // DTD
\r
103 dvr.Read (); // root
\r
104 dvr.Read (); // foo
\r
106 xml = dtd + "<root><bar /></root>";
\r
107 dvr = PrepareXmlReader (xml);
\r
108 dvr.Read (); // DTD
\r
109 dvr.Read (); // root
\r
111 dvr.Read (); // invalid element
\r
112 Fail ("should be failed.");
\r
113 } catch (XmlSchemaException) {
\r
118 public void TestMixedContent ()
\r
120 string intSubset = "<!ELEMENT root (#PCDATA | foo)*><!ELEMENT foo EMPTY>";
\r
121 string dtd = "<!DOCTYPE root [" + intSubset + "]>";
\r
122 string xml = dtd + "<root />";
\r
123 dvr = PrepareXmlReader (xml);
\r
124 dvr.Read (); // DTD
\r
125 dvr.Read (); // root
\r
126 dvr.Read (); // end
\r
128 xml = dtd + "<root>Test.</root>";
\r
129 dvr = PrepareXmlReader (xml);
\r
130 dvr.Read (); // DTD
\r
131 dvr.Read (); // root
\r
132 dvr.Read (); // valid PCDATA
\r
133 dvr.Read (); // endelement root
\r
135 xml = dtd + "<root><foo/>Test.<foo></foo></root>";
\r
136 dvr = PrepareXmlReader (xml);
\r
137 dvr.Read (); // DTD
\r
138 dvr.Read (); // root
\r
139 dvr.Read (); // valid foo
\r
140 dvr.Read (); // valid #PCDATA
\r
141 dvr.Read (); // valid foo
\r
142 dvr.Read (); // valid endElement foo
\r
143 dvr.Read (); // valid endElement root
\r
145 xml = dtd + "<root>Test.<bar /></root>";
\r
146 dvr = PrepareXmlReader (xml);
\r
147 dvr.Read (); // DTD
\r
148 dvr.Read (); // root
\r
149 dvr.Read (); // valid #PCDATA
\r
151 dvr.Read (); // invalid element
\r
152 Fail ("should be failed.");
\r
153 } catch (XmlSchemaException) {
\r
158 public void TestSequence ()
\r
160 string intSubset = "<!ELEMENT root (foo, bar)><!ELEMENT foo EMPTY><!ELEMENT bar EMPTY>";
\r
161 string dtd = "<!DOCTYPE root [" + intSubset + "]>";
\r
162 string xml = dtd + "<root><foo/><bar/></root>";
\r
163 dvr = PrepareXmlReader (xml);
\r
164 dvr.Read (); // DTD
\r
165 dvr.Read (); // root
\r
166 dvr.Read (); // foo
\r
167 dvr.Read (); // bar
\r
168 dvr.Read (); // end root
\r
170 xml = dtd + "<root><foo/></root>";
\r
171 dvr = PrepareXmlReader (xml);
\r
172 dvr.Read (); // DTD
\r
173 dvr.Read (); // root
\r
174 dvr.Read (); // foo
\r
176 dvr.Read (); // invalid end root
\r
177 Fail ("should be failed.");
\r
178 } catch (XmlSchemaException) {
\r
181 xml = dtd + "<root><bar/></root>";
\r
182 dvr = PrepareXmlReader (xml);
\r
183 dvr.Read (); // DTD
\r
184 dvr.Read (); // root
\r
186 dvr.Read (); // invalid element bar
\r
187 Fail ("should be failed.");
\r
188 } catch (XmlSchemaException) {
\r
193 public void TestChoice ()
\r
195 string intSubset = "<!ELEMENT root (foo|bar)><!ELEMENT foo EMPTY><!ELEMENT bar EMPTY>";
\r
196 string dtd = "<!DOCTYPE root [" + intSubset + "]>";
\r
197 string xml = dtd + "<root><foo/><bar/></root>";
\r
198 dvr = PrepareXmlReader (xml);
\r
199 dvr.Read (); // DTD
\r
200 dvr.Read (); // root
\r
201 dvr.Read (); // foo
\r
203 dvr.Read (); // invalid element bar
\r
204 Fail ("should be failed.");
\r
205 } catch (XmlSchemaException) {
\r
208 xml = dtd + "<root><foo/></root>";
\r
209 dvr = PrepareXmlReader (xml);
\r
210 dvr.Read (); // DTD
\r
211 dvr.Read (); // root
\r
212 dvr.Read (); // foo
\r
213 dvr.Read (); // end root
\r
215 xml = dtd + "<root><bar/></root>";
\r
216 dvr = PrepareXmlReader (xml);
\r
217 dvr.Read (); // DTD
\r
218 dvr.Read (); // root
\r
219 dvr.Read (); // bar
\r
220 dvr.Read (); // end root
\r
222 xml = dtd + "<root><foo/>text.<bar/></root>";
\r
223 dvr = PrepareXmlReader (xml);
\r
224 dvr.Read (); // DTD
\r
225 dvr.Read (); // root
\r
226 dvr.Read (); // foo
\r
228 dvr.Read (); // invalid text
\r
229 Fail ("should be failed.");
\r
230 } catch (XmlSchemaException) {
\r
235 public void TestAny ()
\r
237 string intSubset = "<!ELEMENT root ANY><!ELEMENT foo EMPTY>";
\r
238 string dtd = "<!DOCTYPE root [" + intSubset + "]>";
\r
239 string xml = dtd + "<root />";
\r
240 dvr = PrepareXmlReader (xml);
\r
241 dvr.Read (); // DTD
\r
242 dvr.Read (); // empty root.
\r
243 dvr.Read (); // end of document.
\r
245 xml = dtd + "<root><foo/></root>";
\r
246 dvr = PrepareXmlReader (xml);
\r
247 dvr.Read (); // DTD
\r
248 dvr.Read (); // root
\r
249 dvr.Read (); // foo
\r
250 dvr.Read (); // end root
\r
252 xml = dtd + "<root><foo /><foo></foo><foo/></root>";
\r
253 dvr = PrepareXmlReader (xml);
\r
254 dvr.Read (); // DTD
\r
255 dvr.Read (); // root
\r
256 dvr.Read (); // foo
\r
257 dvr.Read (); // foo
\r
258 dvr.Read (); // foo
\r
259 dvr.Read (); // end root
\r
261 xml = dtd + "<root><bar /></root>";
\r
262 dvr = PrepareXmlReader (xml);
\r
263 dvr.Read (); // DTD
\r
264 dvr.Read (); // root
\r
266 dvr.Read (); // bar: invalid (undeclared) element
\r
267 Fail ("should be failed.");
\r
268 } catch (XmlSchemaException) {
\r
273 public void TestNonDeterministicContent ()
\r
275 string intSubset = "<!ELEMENT root ((foo, bar)|(foo,baz))><!ELEMENT foo EMPTY><!ELEMENT bar EMPTY><!ELEMENT baz EMPTY>";
\r
276 string dtd = "<!DOCTYPE root [" + intSubset + "]>";
\r
277 string xml = dtd + "<root><foo/><bar/></root>";
\r
278 dvr = PrepareXmlReader (xml);
\r
279 dvr.Read (); // DTD
\r
280 dvr.Read (); // root
\r
281 dvr.Read (); // foo
\r
282 dvr.Read (); // bar
\r
283 dvr.Read (); // end root
\r
285 xml = dtd + "<root><foo/><baz/></root>";
\r
286 dvr = PrepareXmlReader (xml);
\r
287 dvr.Read (); // DTD
\r
288 dvr.Read (); // root
\r
289 dvr.Read (); // foo
\r
290 dvr.Read (); // end root
\r
294 public void TestAttributes ()
\r
296 // simple content and attributes are required
\r
297 string intSubset = "<!ELEMENT root (foo)><!ELEMENT foo EMPTY><!ATTLIST root foo CDATA #REQUIRED bar CDATA #IMPLIED>";
\r
298 string dtd = "<!DOCTYPE root [" + intSubset + "]>";
\r
299 string xml = dtd + "<root><foo/></root>";
\r
300 dvr = PrepareXmlReader (xml);
\r
301 dvr.ValidationType = ValidationType.DTD;
\r
302 dvr.Read (); // DTD
\r
304 dvr.Read (); // missing attributes
\r
305 Fail ("should be failed.");
\r
306 } catch (XmlSchemaException ex) {
\r
309 // empty element but attributes are required
\r
310 intSubset = "<!ELEMENT root EMPTY><!ATTLIST root foo CDATA #REQUIRED bar CDATA #IMPLIED>";
\r
311 dtd = "<!DOCTYPE root [" + intSubset + "]>";
\r
312 xml = dtd + "<root />";
\r
313 dvr = PrepareXmlReader (xml);
\r
314 dvr.ValidationType = ValidationType.DTD;
\r
315 dvr.Read (); // DTD
\r
317 dvr.Read (); // missing attributes
\r
318 Fail ("should be failed.");
\r
319 } catch (XmlSchemaException ex) {
\r
322 xml = dtd + "<root foo='value' />";
\r
323 dvr = PrepareXmlReader (xml);
\r
324 dvr.Read (); // DTD
\r
325 dvr.Read (); // root
\r
326 dvr.Read (); // end of document
\r
328 xml = dtd + "<root foo='value' bar='2nd' />";
\r
329 dvr = PrepareXmlReader (xml);
\r
330 dvr.Read (); // DTD
\r
331 dvr.Read (); // root
\r
332 dvr.Read (); // end of document
\r
334 xml = dtd + "<root foo='value' bar='2nd' baz='3rd' />";
\r
335 dvr = PrepareXmlReader (xml);
\r
336 dvr.Read (); // DTD
\r
338 dvr.Read (); // undeclared attribute baz
\r
339 Fail ("should be failed.");
\r
340 } catch (XmlSchemaException) {
\r
345 public void TestAttributeDefaultContribution ()
\r
347 string intSubset = "<!ELEMENT root EMPTY><!ATTLIST root foo CDATA 'foo-def' bar CDATA 'bar-def'>";
\r
348 string dtd = "<!DOCTYPE root [" + intSubset + "]>";
\r
349 string xml = dtd + "<root />";
\r
351 dvr = PrepareXmlReader (xml);
\r
352 dvr.ValidationType = ValidationType.DTD;
\r
353 this.TestAttributeDefaultContributionInternal (dvr);
\r
355 dvr = PrepareXmlReader (xml);
\r
356 dvr.ValidationType = ValidationType.None;
\r
357 this.TestAttributeDefaultContributionInternal (dvr);
\r
360 private void TestAttributeDefaultContributionInternal (XmlReader dvr)
\r
362 dvr.Read (); // DTD
\r
364 AssertEquals (XmlNodeType.Element, dvr.NodeType);
\r
365 AssertEquals ("root", dvr.Name);
\r
366 AssertEquals (2, dvr.AttributeCount);
\r
368 Assert (dvr.MoveToFirstAttribute ());
\r
369 AssertEquals ("foo", dvr.Name);
\r
370 AssertEquals ("foo-def", dvr ["foo"]);
\r
371 AssertNotNull (dvr ["bar"]);
\r
372 AssertEquals ("foo-def", dvr.Value);
\r
373 Assert (dvr.ReadAttributeValue ());
\r
374 AssertEquals (XmlNodeType.Text, dvr.NodeType);
\r
375 AssertEquals ("", dvr.Name);
\r
376 AssertEquals ("foo-def", dvr.Value);
\r
378 Assert (dvr.MoveToNextAttribute ());
\r
379 AssertEquals ("bar", dvr.Name);
\r
380 AssertEquals ("foo-def", dvr ["foo"]);
\r
381 AssertNotNull (dvr ["bar"]);
\r
382 AssertEquals ("bar-def", dvr.Value);
\r
383 Assert (dvr.ReadAttributeValue ());
\r
384 AssertEquals (XmlNodeType.Text, dvr.NodeType);
\r
385 AssertEquals ("", dvr.Name);
\r
386 AssertEquals ("bar-def", dvr.Value);
\r
390 public void TestExpandEntity ()
\r
392 string intSubset = "<!ELEMENT root (#PCDATA)><!ATTLIST root foo CDATA 'foo-def' bar CDATA 'bar-def'><!ENTITY ent 'entity string'>";
\r
393 string dtd = "<!DOCTYPE root [" + intSubset + "]>";
\r
394 string xml = dtd + "<root foo='&ent;' bar='internal &ent; value'>&ent;</root>";
\r
395 dvr = PrepareXmlReader (xml);
\r
396 dvr.EntityHandling = EntityHandling.ExpandEntities;
\r
397 dvr.Read (); // DTD
\r
399 AssertEquals (XmlNodeType.Element, dvr.NodeType);
\r
400 AssertEquals ("root", dvr.Name);
\r
401 Assert (dvr.MoveToFirstAttribute ());
\r
402 AssertEquals ("foo", dvr.Name);
\r
403 AssertEquals ("entity string", dvr.Value);
\r
404 Assert (dvr.MoveToNextAttribute ());
\r
405 AssertEquals ("bar", dvr.Name);
\r
406 AssertEquals ("internal entity string value", dvr.Value);
\r
407 AssertEquals ("entity string", dvr.ReadString ());
\r
409 // ValidationType = None
\r
411 dvr = PrepareXmlReader (xml);
\r
412 dvr.EntityHandling = EntityHandling.ExpandEntities;
\r
413 dvr.ValidationType = ValidationType.None;
\r
414 dvr.Read (); // DTD
\r
416 AssertEquals (XmlNodeType.Element, dvr.NodeType);
\r
417 AssertEquals ("root", dvr.Name);
\r
419 Assert (dvr.MoveToFirstAttribute ());
\r
420 AssertEquals ("foo", dvr.Name);
\r
421 AssertEquals ("entity string", dvr.Value);
\r
423 Assert (dvr.MoveToNextAttribute ());
\r
424 AssertEquals ("bar", dvr.Name);
\r
425 AssertEquals ("internal entity string value", dvr.Value);
\r
426 AssertEquals ("entity string", dvr.ReadString ());
\r
430 public void TestPreserveEntity ()
\r
432 string intSubset = "<!ELEMENT root EMPTY><!ATTLIST root foo CDATA 'foo-def' bar CDATA 'bar-def'><!ENTITY ent 'entity string'>";
\r
433 string dtd = "<!DOCTYPE root [" + intSubset + "]>";
\r
434 string xml = dtd + "<root foo='&ent;' bar='internal &ent; value' />";
\r
435 dvr = PrepareXmlReader (xml);
\r
436 dvr.EntityHandling = EntityHandling.ExpandCharEntities;
\r
437 dvr.Read (); // DTD
\r
439 AssertEquals (XmlNodeType.Element, dvr.NodeType);
\r
440 AssertEquals ("root", dvr.Name);
\r
441 Assert (dvr.MoveToFirstAttribute ());
\r
442 AssertEquals ("foo", dvr.Name);
\r
443 AssertEquals ("entity string", dvr.Value);
\r
444 // ReadAttributeValue()
\r
445 Assert (dvr.ReadAttributeValue ());
\r
446 AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
\r
447 AssertEquals ("ent", dvr.Name);
\r
448 AssertEquals ("", dvr.Value);
\r
449 Assert (!dvr.ReadAttributeValue ());
\r
452 Assert (dvr.MoveToNextAttribute ());
\r
453 AssertEquals ("bar", dvr.Name);
\r
454 AssertEquals ("internal entity string value", dvr.Value);
\r
455 // ReadAttributeValue()
\r
456 Assert (dvr.ReadAttributeValue ());
\r
457 AssertEquals (XmlNodeType.Text, dvr.NodeType);
\r
458 AssertEquals ("", dvr.Name);
\r
459 AssertEquals ("internal ", dvr.Value);
\r
460 Assert (dvr.ReadAttributeValue ());
\r
461 AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
\r
462 AssertEquals ("ent", dvr.Name);
\r
463 AssertEquals ("", dvr.Value);
\r
464 Assert (dvr.ReadAttributeValue ());
\r
465 AssertEquals (XmlNodeType.Text, dvr.NodeType);
\r
466 AssertEquals ("", dvr.Name);
\r
467 AssertEquals (" value", dvr.Value);
\r
469 // ValidationType = None
\r
471 dvr = PrepareXmlReader (xml);
\r
472 dvr.EntityHandling = EntityHandling.ExpandCharEntities;
\r
473 dvr.ValidationType = ValidationType.None;
\r
474 dvr.Read (); // DTD
\r
476 AssertEquals (XmlNodeType.Element, dvr.NodeType);
\r
477 AssertEquals ("root", dvr.Name);
\r
480 Assert (dvr.MoveToFirstAttribute ());
\r
481 AssertEquals ("foo", dvr.Name);
\r
482 AssertEquals ("entity string", dvr.Value);
\r
483 // ReadAttributeValue()
\r
484 Assert (dvr.ReadAttributeValue ());
\r
485 AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
\r
486 AssertEquals ("ent", dvr.Name);
\r
487 AssertEquals ("", dvr.Value);
\r
488 Assert (!dvr.ReadAttributeValue ());
\r
491 Assert (dvr.MoveToNextAttribute ());
\r
492 AssertEquals ("bar", dvr.Name);
\r
493 AssertEquals ("internal entity string value", dvr.Value);
\r
494 // ReadAttributeValue()
\r
495 Assert (dvr.ReadAttributeValue ());
\r
496 AssertEquals (XmlNodeType.Text, dvr.NodeType);
\r
497 AssertEquals ("", dvr.Name);
\r
498 AssertEquals ("internal ", dvr.Value);
\r
499 Assert (dvr.ReadAttributeValue ());
\r
500 AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
\r
501 AssertEquals ("ent", dvr.Name);
\r
502 AssertEquals ("", dvr.Value);
\r
503 Assert (dvr.ReadAttributeValue ());
\r
504 AssertEquals (XmlNodeType.Text, dvr.NodeType);
\r
505 AssertEquals ("", dvr.Name);
\r
506 AssertEquals (" value", dvr.Value);
\r
510 public void TestNormalization ()
\r
512 string intSubset = "<!ELEMENT root EMPTY>"
\r
513 + "<!ATTLIST root foo ID #REQUIRED"
\r
514 + " bar NMTOKEN #IMPLIED "
\r
515 + " baz NMTOKENS #IMPLIED "
\r
516 + " quux CDATA #IMPLIED >";
\r
517 string dtd = "<!DOCTYPE root [" + intSubset + "]>";
\r
518 string xml = dtd + "<root foo=' id1 ' bar=' nameToken ' baz=' list of\r\nname token' quux=' quuux\tquuux\t ' />";
\r
519 dvr = PrepareXmlReader (xml);
\r
520 ((XmlTextReader) dvr.Reader).Normalization = true;
\r
521 dvr.EntityHandling = EntityHandling.ExpandEntities;
\r
522 dvr.Read (); // DTD
\r
524 AssertEquals (XmlNodeType.Element, dvr.NodeType);
\r
525 AssertEquals ("root", dvr.Name);
\r
526 Assert (dvr.MoveToFirstAttribute ());
\r
527 AssertEquals ("foo", dvr.Name);
\r
528 AssertEquals ("id1", dvr.Value);
\r
529 Assert (dvr.MoveToNextAttribute ());
\r
530 AssertEquals ("bar", dvr.Name);
\r
531 AssertEquals ("nameToken", dvr.Value);
\r
532 Assert (dvr.MoveToNextAttribute ());
\r
533 AssertEquals ("baz", dvr.Name);
\r
534 AssertEquals ("list of name token", dvr.Value);
\r
535 Assert (dvr.MoveToNextAttribute ());
\r
536 AssertEquals ("quux", dvr.Name);
\r
537 AssertEquals (" quuux quuux ", dvr.Value);
\r
541 public void TestValidationEvent ()
\r
543 string intSubset = "<!ELEMENT root EMPTY><!ATTLIST root foo CDATA 'foo-def' bar CDATA 'bar-def'>";
\r
544 string dtd = "<!DOCTYPE root [" + intSubset + "]>";
\r
545 string xml = dtd + "<foo><bar att='val' /></foo>";
\r
546 eventFired = false;
\r
547 dvr = PrepareXmlReader (xml);
\r
548 dvr.ValidationEventHandler += new ValidationEventHandler (OnInvalidityFound);
\r
549 dvr.ValidationType = ValidationType.DTD;
\r
550 dvr.Read (); // DTD
\r
551 Assert (dvr.Read ()); // invalid foo
\r
552 Assert (eventFired);
\r
553 AssertEquals ("foo", dvr.Name);
\r
554 Assert (dvr.Read ()); // invalid bar
\r
555 AssertEquals ("bar", dvr.Name);
\r
556 Assert (dvr.MoveToFirstAttribute ()); // att
\r
557 AssertEquals ("att", dvr.Name);
\r
558 Assert (dvr.Read ()); // invalid end foo
\r
559 AssertEquals ("foo", dvr.Name);
\r
560 AssertEquals (XmlNodeType.EndElement, dvr.NodeType);
\r
561 Assert (!dvr.Read ());
\r
563 // When ValidationType is None, event should not be fired,
\r
564 eventFired = false;
\r
565 dvr = PrepareXmlReader (xml);
\r
566 dvr.ValidationEventHandler += new ValidationEventHandler (OnInvalidityFound);
\r
567 dvr.ValidationType = ValidationType.None;
\r
568 dvr.Read (); // DTD
\r
569 Assert (dvr.Read ()); // invalid foo
\r
570 Assert (!eventFired);
\r
573 private bool eventFired;
\r
574 private void OnInvalidityFound (object o, ValidationEventArgs e)
\r
580 public void TestIdentityConstraints ()
\r
582 string intSubset = "<!ELEMENT root (c)+><!ELEMENT c EMPTY><!ATTLIST root foo ID #REQUIRED>";
\r
583 string dtd = "<!DOCTYPE root [" + intSubset + "]>";
\r
584 string xml = dtd + "<root><c foo='val' /><c foo='val'></root>";
\r
585 dvr = PrepareXmlReader (xml);
\r
586 dvr.ValidationType = ValidationType.DTD;
\r
587 dvr.Read (); // DTD
\r
589 dvr.Read (); // root misses attribute foo
\r
591 } catch (XmlSchemaException) {
\r
594 intSubset = "<!ELEMENT root (c)+><!ELEMENT c EMPTY><!ATTLIST c foo ID #REQUIRED bar IDREF #IMPLIED baz IDREFS #IMPLIED>";
\r
595 dtd = "<!DOCTYPE root [" + intSubset + "]>";
\r
596 xml = dtd + "<root><c foo='val' /><c foo='val'></root>";
\r
597 dvr = PrepareXmlReader (xml);
\r
598 dvr.ValidationType = ValidationType.DTD;
\r
599 dvr.Read (); // DTD
\r
600 dvr.Read (); // root
\r
601 dvr.Read (); // c[1]
\r
603 dvr.Read (); // c[2]
\r
605 } catch (XmlSchemaException) {
\r
608 xml = dtd + "<root><c foo='val' /><c baz='val val val 1 2 3'></root>";
\r
609 dvr = PrepareXmlReader (xml);
\r
610 dvr.Read (); // DTD
\r
611 dvr.Read (); // root
\r
612 dvr.Read (); // c[1]
\r
614 dvr.Read (); // c[2]
\r
616 } catch (XmlSchemaException) {
\r
620 // Entity tests are almost copied from XmlNodeReaderTests.
\r
622 public void ResolveEntity ()
\r
624 string ent1 = "<!ENTITY ent 'entity string'>";
\r
625 string ent2 = "<!ENTITY ent2 '<foo/><foo/>'>]>";
\r
626 string dtd = "<!DOCTYPE root[<!ELEMENT root (#PCDATA|foo)*>" + ent1 + ent2;
\r
627 string xml = dtd + "<root>&ent;&ent2;</root>";
\r
628 dvr = new XmlValidatingReader (xml, XmlNodeType.Document, null);
\r
629 dvr.ValidationType = ValidationType.None;
\r
630 dvr.EntityHandling = EntityHandling.ExpandCharEntities;
\r
631 dvr.Read (); // DTD
\r
632 dvr.Read (); // root
\r
633 dvr.Read (); // &ent;
\r
634 AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
\r
635 AssertEquals (1, dvr.Depth);
\r
636 dvr.ResolveEntity ();
\r
637 // It is still entity reference.
\r
638 AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
\r
640 AssertEquals (XmlNodeType.Text, dvr.NodeType);
\r
641 AssertEquals (2, dvr.Depth);
\r
642 AssertEquals ("entity string", dvr.Value);
\r
644 AssertEquals (XmlNodeType.EndEntity, dvr.NodeType);
\r
645 AssertEquals (1, dvr.Depth);
\r
646 AssertEquals ("", dvr.Value);
\r
648 dvr.Read (); // &ent2;
\r
649 AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
\r
650 AssertEquals (1, dvr.Depth);
\r
651 dvr.ResolveEntity ();
\r
652 // It is still entity reference.
\r
653 AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
\r
654 // It now became element node.
\r
656 AssertEquals (XmlNodeType.Element, dvr.NodeType);
\r
657 AssertEquals (2, dvr.Depth);
\r
661 public void ResolveEntity2 ()
\r
663 string ent1 = "<!ENTITY ent 'entity string'>";
\r
664 string ent2 = "<!ENTITY ent2 '<foo/><foo/>'>]>";
\r
665 string dtd = "<!DOCTYPE root[<!ELEMENT root (#PCDATA|foo)*>" + ent1 + ent2;
\r
666 string xml = dtd + "<root>&ent3;&ent2;</root>";
\r
667 dvr = new XmlValidatingReader (xml, XmlNodeType.Document, null);
\r
668 dvr.ValidationType = ValidationType.None;
\r
669 dvr.EntityHandling = EntityHandling.ExpandCharEntities;
\r
670 dvr.Read (); // DTD
\r
671 dvr.Read (); // root
\r
672 dvr.Read (); // &ent3;
\r
673 AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
\r
674 // ent3 does not exists in this dtd.
\r
675 dvr.ResolveEntity ();
\r
676 AssertEquals (XmlNodeType.EntityReference, dvr.NodeType);
\r
679 Fail ("Undeclared entity resolution should be failed.");
\r
680 } catch (XmlException) {
\r
685 [ExpectedException (typeof (XmlException))]
\r
686 public void ResolveEntityWithoutDTD ()
\r
688 string xml = "<root>&ent;&ent2;</root>";
\r
689 dvr = new XmlValidatingReader (xml, XmlNodeType.Document, null);
\r
690 dvr.Read (); // root
\r
691 dvr.Read (); // &ent;
\r