This commit was manufactured by cvs2svn to create branch 'mono-1-0'.
[mono.git] / mcs / class / System.XML / Test / System.Xml / XmlValidatingReaderTests.cs
1 //\r
2 // MonoTests.System.Xml.XmlValidatingReaderTests.cs\r
3 //\r
4 // Author:\r
5 //      Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>\r
6 //\r
7 // (C)2003 Atsushi Enomoto\r
8 //\r
9 using System;\r
10 using System.Xml;\r
11 using System.Xml.Schema;\r
12 using NUnit.Framework;\r
13 \r
14 namespace MonoTests.System.Xml\r
15 {\r
16         [TestFixture]\r
17         public class XmlValidatingReaderTests : Assertion\r
18         {\r
19                 public XmlValidatingReaderTests ()\r
20                 {\r
21                 }\r
22 \r
23                 XmlValidatingReader dvr;\r
24 \r
25                 private XmlValidatingReader PrepareXmlReader (string xml)\r
26                 {\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
31 \r
32                         return new XmlValidatingReader (reader);\r
33                 }\r
34 \r
35                 [Test]\r
36                 public void TestSingleElement ()\r
37                 {\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
42                         dvr.Read ();    // DTD\r
43                         dvr.Read ();\r
44 \r
45                         xml = dtd + "<invalid />";\r
46                         dvr = PrepareXmlReader (xml);\r
47                         dvr.Read ();    // DTD\r
48                         try {\r
49                                 dvr.Read ();    // invalid element.\r
50                                 Fail ("should be failed.");\r
51                         } catch (XmlSchemaException) {\r
52                         }\r
53 \r
54                         xml = dtd + "<root>invalid PCDATA.</root>";\r
55                         dvr = PrepareXmlReader (xml);\r
56                         dvr.Read ();    // DTD\r
57                         dvr.Read ();    // root\r
58                         try {\r
59                                 dvr.Read ();    // invalid text\r
60                                 Fail ("should be failed.");\r
61                         } catch (XmlSchemaException) {\r
62                         }\r
63 \r
64                         xml = dtd + "<root><invalid_child /></root>";\r
65                         dvr = PrepareXmlReader (xml);\r
66                         dvr.Read ();    // DTD\r
67                         dvr.Read ();    // root\r
68                         try {\r
69                                 dvr.Read ();    // invalid child\r
70                                 Fail ("should be failed.");\r
71                         } catch (XmlSchemaException) {\r
72                         }\r
73                 }\r
74 \r
75                 [Test]\r
76                 public void TestElementContent ()\r
77                 {\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
82                         dvr.Read ();    // DTD\r
83                         try {\r
84                                 dvr.Read ();    // root: invalid end\r
85                                 Fail ("should be failed.");\r
86                         } catch (XmlSchemaException) {\r
87                         }\r
88 \r
89                         xml = dtd + "<root>Test.</root>";\r
90                         dvr = PrepareXmlReader (xml);\r
91                         dvr.Read ();    // DTD\r
92                         dvr.Read ();    // root\r
93                         try {\r
94                                 dvr.Read ();    // invalid end\r
95                                 Fail ("should be failed.");\r
96                         } catch (XmlSchemaException) {\r
97                         }\r
98 \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
104 \r
105                         xml = dtd + "<root><bar /></root>";\r
106                         dvr = PrepareXmlReader (xml);\r
107                         dvr.Read ();    // DTD\r
108                         dvr.Read ();    // root\r
109                         try {\r
110                                 dvr.Read ();    // invalid element\r
111                                 Fail ("should be failed.");\r
112                         } catch (XmlSchemaException) {\r
113                         }\r
114                 }\r
115 \r
116                 [Test]\r
117                 public void TestMixedContent ()\r
118                 {\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
126 \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
133 \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
143 \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
149                         try {\r
150                                 dvr.Read ();    // invalid element\r
151                                 Fail ("should be failed.");\r
152                         } catch (XmlSchemaException) {\r
153                         }\r
154                 }\r
155 \r
156                 [Test]\r
157                 public void TestSequence ()\r
158                 {\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
168 \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
174                         try {\r
175                                 dvr.Read ();    // invalid end root\r
176                                 Fail ("should be failed.");\r
177                         } catch (XmlSchemaException) {\r
178                         }\r
179 \r
180                         xml = dtd + "<root><bar/></root>";\r
181                         dvr = PrepareXmlReader (xml);\r
182                         dvr.Read ();    // DTD\r
183                         dvr.Read ();    // root\r
184                         try {\r
185                                 dvr.Read ();    // invalid element bar\r
186                                 Fail ("should be failed.");\r
187                         } catch (XmlSchemaException) {\r
188                         }\r
189                 }\r
190 \r
191                 [Test]\r
192                 public void TestChoice ()\r
193                 {\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
201                         try {\r
202                                 dvr.Read ();    // invalid element bar\r
203                                 Fail ("should be failed.");\r
204                         } catch (XmlSchemaException) {\r
205                         }\r
206 \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
213 \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
220 \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
226                         try {\r
227                                 dvr.Read ();    // invalid text\r
228                                 Fail ("should be failed.");\r
229                         } catch (XmlSchemaException) {\r
230                         }\r
231                 }\r
232 \r
233                 [Test]\r
234                 public void TestAny ()\r
235                 {\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
243 \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
250 \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
259 \r
260                         xml = dtd + "<root><bar /></root>";\r
261                         dvr = PrepareXmlReader (xml);\r
262                         dvr.Read ();    // DTD\r
263                         dvr.Read ();    // root\r
264                         try {\r
265                                 dvr.Read ();    // bar: invalid (undeclared) element\r
266                                 Fail ("should be failed.");\r
267                         } catch (XmlSchemaException) {\r
268                         }\r
269                 }\r
270 \r
271                 [Test]\r
272                 public void TestNonDeterministicContent ()\r
273                 {\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
283 \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
290                 }\r
291 \r
292                 [Test]\r
293                 public void TestAttributes ()\r
294                 {\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
302                         try {\r
303                                 dvr.Read ();    // missing attributes\r
304                                 Fail ("should be failed."); // MS.NET fails to fail this test.\r
305                         } catch (XmlSchemaException) {\r
306                         }\r
307 \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
315                         try {\r
316                                 dvr.Read ();    // missing attributes\r
317                                 Fail ("should be failed.");\r
318                         } catch (XmlSchemaException) {\r
319                         }\r
320 \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
326 \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
332 \r
333                         xml = dtd + "<root foo='value' bar='2nd' baz='3rd' />";\r
334                         dvr = PrepareXmlReader (xml);\r
335                         dvr.Read ();    // DTD\r
336                         try {\r
337                                 dvr.Read ();    // undeclared attribute baz\r
338                                 Fail ("should be failed.");\r
339                         } catch (XmlSchemaException) {\r
340                         }\r
341                 }\r
342 \r
343                 [Test]\r
344                 public void TestAttributeDefaultContribution ()\r
345                 {\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
349 \r
350                         dvr = PrepareXmlReader (xml);\r
351                         dvr.ValidationType = ValidationType.DTD;\r
352                         this.TestAttributeDefaultContributionInternal (dvr);\r
353 \r
354                         dvr = PrepareXmlReader (xml);\r
355                         dvr.ValidationType = ValidationType.None;\r
356                         this.TestAttributeDefaultContributionInternal (dvr);\r
357                 }\r
358 \r
359                 private void TestAttributeDefaultContributionInternal (XmlReader dvr)\r
360                 {\r
361                         dvr.Read ();    // DTD\r
362                         dvr.Read ();\r
363                         AssertEquals (XmlNodeType.Element, dvr.NodeType);\r
364                         AssertEquals ("root", dvr.Name);\r
365                         AssertEquals (2, dvr.AttributeCount);\r
366                         // foo\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
376                         // bar\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
386                 }\r
387 \r
388                 [Test]\r
389                 public void TestExpandEntity ()\r
390                 {\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
397                         dvr.Read ();\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
407 \r
408                         // ValidationType = None\r
409 \r
410                         dvr = PrepareXmlReader (xml);\r
411                         dvr.EntityHandling = EntityHandling.ExpandEntities;\r
412                         dvr.ValidationType = ValidationType.None;\r
413                         dvr.Read ();    // DTD\r
414                         dvr.Read ();\r
415                         AssertEquals (XmlNodeType.Element, dvr.NodeType);\r
416                         AssertEquals ("root", dvr.Name);\r
417 \r
418                         Assert (dvr.MoveToFirstAttribute ());\r
419                         AssertEquals ("foo", dvr.Name);\r
420                         AssertEquals ("entity string", dvr.Value);\r
421 \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
426                 }\r
427 \r
428                 [Test]\r
429                 public void TestPreserveEntity ()\r
430                 {\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
437                         dvr.Read ();\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
450 \r
451                         // bar\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
468 \r
469                         // ValidationType = None\r
470 \r
471                         dvr = PrepareXmlReader (xml);\r
472                         dvr.EntityHandling = EntityHandling.ExpandCharEntities;\r
473                         dvr.ValidationType = ValidationType.None;\r
474                         dvr.Read ();    // DTD\r
475                         dvr.Read ();\r
476                         AssertEquals (XmlNodeType.Element, dvr.NodeType);\r
477                         AssertEquals ("root", dvr.Name);\r
478 \r
479                         // foo\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
489 \r
490                         // bar\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
507                 }\r
508 \r
509                 [Test]\r
510                 public void TestNormalization ()\r
511                 {\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
523                         dvr.Read ();\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
538                 }\r
539 \r
540                 [Test]\r
541                 public void TestValidationEvent ()\r
542                 {\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
562 \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
571                 }\r
572 \r
573                 private bool eventFired;\r
574                 private void OnInvalidityFound (object o, ValidationEventArgs e)\r
575                 {\r
576                         eventFired = true;\r
577                 }\r
578 \r
579                 [Test]\r
580                 public void TestIdentityConstraints ()\r
581                 {\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
588                         try {\r
589                                 dvr.Read ();    // root misses attribute foo\r
590                                 Fail ();\r
591                         } catch (XmlSchemaException) {\r
592                         }\r
593 \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
602                         try {\r
603                                 dvr.Read ();    // c[2]\r
604                                 Fail ();\r
605                         } catch (XmlSchemaException) {\r
606                         }\r
607 \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
613                         try {\r
614                                 dvr.Read ();    // c[2]\r
615                                 Fail ();\r
616                         } catch (XmlSchemaException) {\r
617                         }\r
618                 }\r
619 \r
620                 // Entity tests are almost copied from XmlNodeReaderTests.\r
621                 [Test]\r
622                 public void ResolveEntity ()\r
623                 {\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
639                         dvr.Read ();\r
640                         AssertEquals (XmlNodeType.Text, dvr.NodeType);\r
641                         AssertEquals (2, dvr.Depth);\r
642                         AssertEquals ("entity string", dvr.Value);\r
643                         dvr.Read ();\r
644                         AssertEquals (XmlNodeType.EndEntity, dvr.NodeType);\r
645                         AssertEquals (1, dvr.Depth);\r
646                         AssertEquals ("", dvr.Value);\r
647 \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
655                         dvr.Read ();\r
656                         AssertEquals (XmlNodeType.Element, dvr.NodeType);\r
657                         AssertEquals (2, dvr.Depth);\r
658                 }\r
659 \r
660                 [Test]\r
661                 public void ResolveEntity2 ()\r
662                 {\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
677                         try {\r
678                                 dvr.Read ();\r
679                                 Fail ("Undeclared entity resolution should be failed.");\r
680                         } catch (XmlException) {\r
681                         }\r
682                 }\r
683 \r
684                 [Test]\r
685                 [ExpectedException (typeof (XmlException))]\r
686                 public void ResolveEntityWithoutDTD ()\r
687                 {\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
692                 }\r
693         }\r
694 }\r