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
23 XmlValidatingReader dvr;
\r
25 private XmlValidatingReader PrepareXmlReader (string xml)
\r
27 XmlReader reader = new XmlTextReader (xml, XmlNodeType.Document, null);
\r
28 // XmlDocument doc = new XmlDocument ();
\r
29 // doc.LoadXml (xml);
\r
30 // XmlReader reader = new XmlNodeReader (doc);
\r
32 return new XmlValidatingReader (reader);
\r
36 public void TestSingleElement ()
\r
38 string intSubset = "<!ELEMENT root EMPTY>";
\r
39 string dtd = "<!DOCTYPE root [" + intSubset + "]>";
\r
40 string xml = dtd + "<root />";
\r
41 dvr = PrepareXmlReader (xml);
\r
45 xml = dtd + "<invalid />";
\r
46 dvr = PrepareXmlReader (xml);
\r
49 dvr.Read (); // invalid element.
\r
50 Fail ("should be failed.");
\r
51 } catch (XmlSchemaException) {
\r
54 xml = dtd + "<root>invalid PCDATA.</root>";
\r
55 dvr = PrepareXmlReader (xml);
\r
57 dvr.Read (); // root
\r
59 dvr.Read (); // invalid text
\r
60 Fail ("should be failed.");
\r
61 } catch (XmlSchemaException) {
\r
64 xml = dtd + "<root><invalid_child /></root>";
\r
65 dvr = PrepareXmlReader (xml);
\r
67 dvr.Read (); // root
\r
69 dvr.Read (); // invalid child
\r
70 Fail ("should be failed.");
\r
71 } catch (XmlSchemaException) {
\r
76 public void TestElementContent ()
\r
78 string intSubset = "<!ELEMENT root (foo)><!ELEMENT foo EMPTY>";
\r
79 string dtd = "<!DOCTYPE root [" + intSubset + "]>";
\r
80 string xml = dtd + "<root />";
\r
81 dvr = PrepareXmlReader (xml);
\r
84 dvr.Read (); // root: invalid end
\r
85 Fail ("should be failed.");
\r
86 } catch (XmlSchemaException) {
\r
89 xml = dtd + "<root>Test.</root>";
\r
90 dvr = PrepareXmlReader (xml);
\r
92 dvr.Read (); // root
\r
94 dvr.Read (); // invalid end
\r
95 Fail ("should be failed.");
\r
96 } catch (XmlSchemaException) {
\r
99 xml = dtd + "<root><foo /></root>";
\r
100 dvr = PrepareXmlReader (xml);
\r
101 dvr.Read (); // DTD
\r
102 dvr.Read (); // root
\r
103 dvr.Read (); // foo
\r
105 xml = dtd + "<root><bar /></root>";
\r
106 dvr = PrepareXmlReader (xml);
\r
107 dvr.Read (); // DTD
\r
108 dvr.Read (); // root
\r
110 dvr.Read (); // invalid element
\r
111 Fail ("should be failed.");
\r
112 } catch (XmlSchemaException) {
\r
117 public void TestMixedContent ()
\r
119 string intSubset = "<!ELEMENT root (#PCDATA | foo)*><!ELEMENT foo EMPTY>";
\r
120 string dtd = "<!DOCTYPE root [" + intSubset + "]>";
\r
121 string xml = dtd + "<root />";
\r
122 dvr = PrepareXmlReader (xml);
\r
123 dvr.Read (); // DTD
\r
124 dvr.Read (); // root
\r
125 dvr.Read (); // end
\r
127 xml = dtd + "<root>Test.</root>";
\r
128 dvr = PrepareXmlReader (xml);
\r
129 dvr.Read (); // DTD
\r
130 dvr.Read (); // root
\r
131 dvr.Read (); // valid PCDATA
\r
132 dvr.Read (); // endelement root
\r
134 xml = dtd + "<root><foo/>Test.<foo></foo></root>";
\r
135 dvr = PrepareXmlReader (xml);
\r
136 dvr.Read (); // DTD
\r
137 dvr.Read (); // root
\r
138 dvr.Read (); // valid foo
\r
139 dvr.Read (); // valid #PCDATA
\r
140 dvr.Read (); // valid foo
\r
141 dvr.Read (); // valid endElement foo
\r
142 dvr.Read (); // valid endElement root
\r
144 xml = dtd + "<root>Test.<bar /></root>";
\r
145 dvr = PrepareXmlReader (xml);
\r
146 dvr.Read (); // DTD
\r
147 dvr.Read (); // root
\r
148 dvr.Read (); // valid #PCDATA
\r
150 dvr.Read (); // invalid element
\r
151 Fail ("should be failed.");
\r
152 } catch (XmlSchemaException) {
\r
157 public void TestSequence ()
\r
159 string intSubset = "<!ELEMENT root (foo, bar)><!ELEMENT foo EMPTY><!ELEMENT bar EMPTY>";
\r
160 string dtd = "<!DOCTYPE root [" + intSubset + "]>";
\r
161 string xml = dtd + "<root><foo/><bar/></root>";
\r
162 dvr = PrepareXmlReader (xml);
\r
163 dvr.Read (); // DTD
\r
164 dvr.Read (); // root
\r
165 dvr.Read (); // foo
\r
166 dvr.Read (); // bar
\r
167 dvr.Read (); // end root
\r
169 xml = dtd + "<root><foo/></root>";
\r
170 dvr = PrepareXmlReader (xml);
\r
171 dvr.Read (); // DTD
\r
172 dvr.Read (); // root
\r
173 dvr.Read (); // foo
\r
175 dvr.Read (); // invalid end root
\r
176 Fail ("should be failed.");
\r
177 } catch (XmlSchemaException) {
\r
180 xml = dtd + "<root><bar/></root>";
\r
181 dvr = PrepareXmlReader (xml);
\r
182 dvr.Read (); // DTD
\r
183 dvr.Read (); // root
\r
185 dvr.Read (); // invalid element bar
\r
186 Fail ("should be failed.");
\r
187 } catch (XmlSchemaException) {
\r
192 public void TestChoice ()
\r
194 string intSubset = "<!ELEMENT root (foo|bar)><!ELEMENT foo EMPTY><!ELEMENT bar EMPTY>";
\r
195 string dtd = "<!DOCTYPE root [" + intSubset + "]>";
\r
196 string xml = dtd + "<root><foo/><bar/></root>";
\r
197 dvr = PrepareXmlReader (xml);
\r
198 dvr.Read (); // DTD
\r
199 dvr.Read (); // root
\r
200 dvr.Read (); // foo
\r
202 dvr.Read (); // invalid element bar
\r
203 Fail ("should be failed.");
\r
204 } catch (XmlSchemaException) {
\r
207 xml = dtd + "<root><foo/></root>";
\r
208 dvr = PrepareXmlReader (xml);
\r
209 dvr.Read (); // DTD
\r
210 dvr.Read (); // root
\r
211 dvr.Read (); // foo
\r
212 dvr.Read (); // end root
\r
214 xml = dtd + "<root><bar/></root>";
\r
215 dvr = PrepareXmlReader (xml);
\r
216 dvr.Read (); // DTD
\r
217 dvr.Read (); // root
\r
218 dvr.Read (); // bar
\r
219 dvr.Read (); // end root
\r
221 xml = dtd + "<root><foo/>text.<bar/></root>";
\r
222 dvr = PrepareXmlReader (xml);
\r
223 dvr.Read (); // DTD
\r
224 dvr.Read (); // root
\r
225 dvr.Read (); // foo
\r
227 dvr.Read (); // invalid text
\r
228 Fail ("should be failed.");
\r
229 } catch (XmlSchemaException) {
\r
234 public void TestAny ()
\r
236 string intSubset = "<!ELEMENT root ANY><!ELEMENT foo EMPTY>";
\r
237 string dtd = "<!DOCTYPE root [" + intSubset + "]>";
\r
238 string xml = dtd + "<root />";
\r
239 dvr = PrepareXmlReader (xml);
\r
240 dvr.Read (); // DTD
\r
241 dvr.Read (); // empty root.
\r
242 dvr.Read (); // end of document.
\r
244 xml = dtd + "<root><foo/></root>";
\r
245 dvr = PrepareXmlReader (xml);
\r
246 dvr.Read (); // DTD
\r
247 dvr.Read (); // root
\r
248 dvr.Read (); // foo
\r
249 dvr.Read (); // end root
\r
251 xml = dtd + "<root><foo /><foo></foo><foo/></root>";
\r
252 dvr = PrepareXmlReader (xml);
\r
253 dvr.Read (); // DTD
\r
254 dvr.Read (); // root
\r
255 dvr.Read (); // foo
\r
256 dvr.Read (); // foo
\r
257 dvr.Read (); // foo
\r
258 dvr.Read (); // end root
\r
260 xml = dtd + "<root><bar /></root>";
\r
261 dvr = PrepareXmlReader (xml);
\r
262 dvr.Read (); // DTD
\r
263 dvr.Read (); // root
\r
265 dvr.Read (); // bar: invalid (undeclared) element
\r
266 Fail ("should be failed.");
\r
267 } catch (XmlSchemaException) {
\r
272 public void TestNonDeterministicContent ()
\r
274 string intSubset = "<!ELEMENT root ((foo, bar)|(foo,baz))><!ELEMENT foo EMPTY><!ELEMENT bar EMPTY><!ELEMENT baz EMPTY>";
\r
275 string dtd = "<!DOCTYPE root [" + intSubset + "]>";
\r
276 string xml = dtd + "<root><foo/><bar/></root>";
\r
277 dvr = PrepareXmlReader (xml);
\r
278 dvr.Read (); // DTD
\r
279 dvr.Read (); // root
\r
280 dvr.Read (); // foo
\r
281 dvr.Read (); // bar
\r
282 dvr.Read (); // end root
\r
284 xml = dtd + "<root><foo/><baz/></root>";
\r
285 dvr = PrepareXmlReader (xml);
\r
286 dvr.Read (); // DTD
\r
287 dvr.Read (); // root
\r
288 dvr.Read (); // foo
\r
289 dvr.Read (); // end root
\r
293 public void TestAttributes ()
\r
295 // simple content and attributes are required
\r
296 string intSubset = "<!ELEMENT root (foo)><!ELEMENT foo EMPTY><!ATTLIST root foo CDATA #REQUIRED bar CDATA #IMPLIED>";
\r
297 string dtd = "<!DOCTYPE root [" + intSubset + "]>";
\r
298 string xml = dtd + "<root><foo/></root>";
\r
299 dvr = PrepareXmlReader (xml);
\r
300 dvr.ValidationType = ValidationType.DTD;
\r
301 dvr.Read (); // DTD
\r
303 dvr.Read (); // missing attributes
\r
304 Fail ("should be failed."); // MS.NET fails to fail this test.
\r
305 } catch (XmlSchemaException) {
\r
308 // empty element but attributes are required
\r
309 intSubset = "<!ELEMENT root EMPTY><!ATTLIST root foo CDATA #REQUIRED bar CDATA #IMPLIED>";
\r
310 dtd = "<!DOCTYPE root [" + intSubset + "]>";
\r
311 xml = dtd + "<root />";
\r
312 dvr = PrepareXmlReader (xml);
\r
313 dvr.ValidationType = ValidationType.DTD;
\r
314 dvr.Read (); // DTD
\r
316 dvr.Read (); // missing attributes
\r
317 Fail ("should be failed.");
\r
318 } catch (XmlSchemaException) {
\r
321 xml = dtd + "<root foo='value' />";
\r
322 dvr = PrepareXmlReader (xml);
\r
323 dvr.Read (); // DTD
\r
324 dvr.Read (); // root
\r
325 dvr.Read (); // end of document
\r
327 xml = dtd + "<root foo='value' bar='2nd' />";
\r
328 dvr = PrepareXmlReader (xml);
\r
329 dvr.Read (); // DTD
\r
330 dvr.Read (); // root
\r
331 dvr.Read (); // end of document
\r
333 xml = dtd + "<root foo='value' bar='2nd' baz='3rd' />";
\r
334 dvr = PrepareXmlReader (xml);
\r
335 dvr.Read (); // DTD
\r
337 dvr.Read (); // undeclared attribute baz
\r
338 Fail ("should be failed.");
\r
339 } catch (XmlSchemaException) {
\r
344 public void TestAttributeDefaultContribution ()
\r
346 string intSubset = "<!ELEMENT root EMPTY><!ATTLIST root foo CDATA 'foo-def' bar CDATA 'bar-def'>";
\r
347 string dtd = "<!DOCTYPE root [" + intSubset + "]>";
\r
348 string xml = dtd + "<root />";
\r
350 dvr = PrepareXmlReader (xml);
\r
351 dvr.ValidationType = ValidationType.DTD;
\r
352 this.TestAttributeDefaultContributionInternal (dvr);
\r
354 dvr = PrepareXmlReader (xml);
\r
355 dvr.ValidationType = ValidationType.None;
\r
356 this.TestAttributeDefaultContributionInternal (dvr);
\r
359 private void TestAttributeDefaultContributionInternal (XmlReader dvr)
\r
361 dvr.Read (); // DTD
\r
363 AssertEquals (XmlNodeType.Element, dvr.NodeType);
\r
364 AssertEquals ("root", dvr.Name);
\r
365 AssertEquals (2, dvr.AttributeCount);
\r
367 Assert (dvr.MoveToFirstAttribute ());
\r
368 AssertEquals ("foo", dvr.Name);
\r
369 AssertEquals ("foo-def", dvr ["foo"]);
\r
370 AssertNotNull (dvr ["bar"]);
\r
371 AssertEquals ("foo-def", dvr.Value);
\r
372 Assert (dvr.ReadAttributeValue ());
\r
373 AssertEquals (XmlNodeType.Text, dvr.NodeType);
\r
374 AssertEquals ("", dvr.Name);
\r
375 AssertEquals ("foo-def", dvr.Value);
\r
377 Assert (dvr.MoveToNextAttribute ());
\r
378 AssertEquals ("bar", dvr.Name);
\r
379 AssertEquals ("foo-def", dvr ["foo"]);
\r
380 AssertNotNull (dvr ["bar"]);
\r
381 AssertEquals ("bar-def", dvr.Value);
\r
382 Assert (dvr.ReadAttributeValue ());
\r
383 AssertEquals (XmlNodeType.Text, dvr.NodeType);
\r
384 AssertEquals ("", dvr.Name);
\r
385 AssertEquals ("bar-def", dvr.Value);
\r
389 public void TestExpandEntity ()
\r
391 string intSubset = "<!ELEMENT root (#PCDATA)><!ATTLIST root foo CDATA 'foo-def' bar CDATA 'bar-def'><!ENTITY ent 'entity string'>";
\r
392 string dtd = "<!DOCTYPE root [" + intSubset + "]>";
\r
393 string xml = dtd + "<root foo='&ent;' bar='internal &ent; value'>&ent;</root>";
\r
394 dvr = PrepareXmlReader (xml);
\r
395 dvr.EntityHandling = EntityHandling.ExpandEntities;
\r
396 dvr.Read (); // DTD
\r
398 AssertEquals (XmlNodeType.Element, dvr.NodeType);
\r
399 AssertEquals ("root", dvr.Name);
\r
400 Assert (dvr.MoveToFirstAttribute ());
\r
401 AssertEquals ("foo", dvr.Name);
\r
402 AssertEquals ("entity string", dvr.Value);
\r
403 Assert (dvr.MoveToNextAttribute ());
\r
404 AssertEquals ("bar", dvr.Name);
\r
405 AssertEquals ("internal entity string value", dvr.Value);
\r
406 AssertEquals ("entity string", dvr.ReadString ());
\r
408 // ValidationType = None
\r
410 dvr = PrepareXmlReader (xml);
\r
411 dvr.EntityHandling = EntityHandling.ExpandEntities;
\r
412 dvr.ValidationType = ValidationType.None;
\r
413 dvr.Read (); // DTD
\r
415 AssertEquals (XmlNodeType.Element, dvr.NodeType);
\r
416 AssertEquals ("root", dvr.Name);
\r
418 Assert (dvr.MoveToFirstAttribute ());
\r
419 AssertEquals ("foo", dvr.Name);
\r
420 AssertEquals ("entity string", dvr.Value);
\r
422 Assert (dvr.MoveToNextAttribute ());
\r
423 AssertEquals ("bar", dvr.Name);
\r
424 AssertEquals ("internal entity string value", dvr.Value);
\r
425 AssertEquals ("entity string", dvr.ReadString ());
\r
429 public void TestPreserveEntity ()
\r
431 string intSubset = "<!ELEMENT root EMPTY><!ATTLIST root foo CDATA 'foo-def' bar CDATA 'bar-def'><!ENTITY ent 'entity string'>";
\r
432 string dtd = "<!DOCTYPE root [" + intSubset + "]>";
\r
433 string xml = dtd + "<root foo='&ent;' bar='internal &ent; value' />";
\r
434 dvr = PrepareXmlReader (xml);
\r
435 dvr.EntityHandling = EntityHandling.ExpandCharEntities;
\r
436 dvr.Read (); // DTD
\r
438 AssertEquals (XmlNodeType.Element, dvr.NodeType);
\r
439 AssertEquals ("root", dvr.Name);
\r
440 Assert (dvr.MoveToFirstAttribute ());
\r
441 AssertEquals ("foo", dvr.Name);
\r
442 // MS BUG: it returns "entity string", however, entity should not be exanded.
\r
443 AssertEquals ("&ent;", 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 &ent; 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 ("&ent;", 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 &ent; 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