2003-08-24 Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
[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                 XmlReader xtr;\r
24                 XmlValidatingReader dvr;\r
25 \r
26                 private XmlValidatingReader PrepareXmlReader (string xml)\r
27                 {\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
32 \r
33                         return new XmlValidatingReader (reader);\r
34                 }\r
35 \r
36                 [Test]\r
37                 public void TestSingleElement ()\r
38                 {\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
43                         dvr.Read ();    // DTD\r
44                         dvr.Read ();\r
45 \r
46                         xml = dtd + "<invalid />";\r
47                         dvr = PrepareXmlReader (xml);\r
48                         dvr.Read ();    // DTD\r
49                         try {\r
50                                 dvr.Read ();    // invalid element.\r
51                                 Fail ("should be failed.");\r
52                         } catch (XmlSchemaException) {\r
53                         }\r
54 \r
55                         xml = dtd + "<root>invalid PCDATA.</root>";\r
56                         dvr = PrepareXmlReader (xml);\r
57                         dvr.Read ();    // DTD\r
58                         dvr.Read ();    // root\r
59                         try {\r
60                                 dvr.Read ();    // invalid text\r
61                                 Fail ("should be failed.");\r
62                         } catch (XmlSchemaException) {\r
63                         }\r
64 \r
65                         xml = dtd + "<root><invalid_child /></root>";\r
66                         dvr = PrepareXmlReader (xml);\r
67                         dvr.Read ();    // DTD\r
68                         dvr.Read ();    // root\r
69                         try {\r
70                                 dvr.Read ();    // invalid child\r
71                                 Fail ("should be failed.");\r
72                         } catch (XmlSchemaException) {\r
73                         }\r
74                 }\r
75 \r
76                 [Test]\r
77                 public void TestElementContent ()\r
78                 {\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
83                         dvr.Read ();    // DTD\r
84                         try {\r
85                                 dvr.Read ();    // root: invalid end\r
86                                 Fail ("should be failed.");\r
87                         } catch (XmlSchemaException) {\r
88                         }\r
89 \r
90                         xml = dtd + "<root>Test.</root>";\r
91                         dvr = PrepareXmlReader (xml);\r
92                         dvr.Read ();    // DTD\r
93                         dvr.Read ();    // root\r
94                         try {\r
95                                 dvr.Read ();    // invalid end\r
96                                 Fail ("should be failed.");\r
97                         } catch (XmlSchemaException) {\r
98                         }\r
99 \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
105 \r
106                         xml = dtd + "<root><bar /></root>";\r
107                         dvr = PrepareXmlReader (xml);\r
108                         dvr.Read ();    // DTD\r
109                         dvr.Read ();    // root\r
110                         try {\r
111                                 dvr.Read ();    // invalid element\r
112                                 Fail ("should be failed.");\r
113                         } catch (XmlSchemaException) {\r
114                         }\r
115                 }\r
116 \r
117                 [Test]\r
118                 public void TestMixedContent ()\r
119                 {\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
127 \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
134 \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
144 \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
150                         try {\r
151                                 dvr.Read ();    // invalid element\r
152                                 Fail ("should be failed.");\r
153                         } catch (XmlSchemaException) {\r
154                         }\r
155                 }\r
156 \r
157                 [Test]\r
158                 public void TestSequence ()\r
159                 {\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
169 \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
175                         try {\r
176                                 dvr.Read ();    // invalid end root\r
177                                 Fail ("should be failed.");\r
178                         } catch (XmlSchemaException) {\r
179                         }\r
180 \r
181                         xml = dtd + "<root><bar/></root>";\r
182                         dvr = PrepareXmlReader (xml);\r
183                         dvr.Read ();    // DTD\r
184                         dvr.Read ();    // root\r
185                         try {\r
186                                 dvr.Read ();    // invalid element bar\r
187                                 Fail ("should be failed.");\r
188                         } catch (XmlSchemaException) {\r
189                         }\r
190                 }\r
191 \r
192                 [Test]\r
193                 public void TestChoice ()\r
194                 {\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
202                         try {\r
203                                 dvr.Read ();    // invalid element bar\r
204                                 Fail ("should be failed.");\r
205                         } catch (XmlSchemaException) {\r
206                         }\r
207 \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
214 \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
221 \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
227                         try {\r
228                                 dvr.Read ();    // invalid text\r
229                                 Fail ("should be failed.");\r
230                         } catch (XmlSchemaException) {\r
231                         }\r
232                 }\r
233 \r
234                 [Test]\r
235                 public void TestAny ()\r
236                 {\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
244 \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
251 \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
260 \r
261                         xml = dtd + "<root><bar /></root>";\r
262                         dvr = PrepareXmlReader (xml);\r
263                         dvr.Read ();    // DTD\r
264                         dvr.Read ();    // root\r
265                         try {\r
266                                 dvr.Read ();    // bar: invalid (undeclared) element\r
267                                 Fail ("should be failed.");\r
268                         } catch (XmlSchemaException) {\r
269                         }\r
270                 }\r
271 \r
272                 [Test]\r
273                 public void TestNonDeterministicContent ()\r
274                 {\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
284 \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
291                 }\r
292 \r
293                 [Test]\r
294                 public void TestAttributes ()\r
295                 {\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
303                         try {\r
304                                 dvr.Read ();    // missing attributes\r
305                                 Fail ("should be failed.");\r
306                         } catch (XmlSchemaException ex) {\r
307                         }\r
308 \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
316                         try {\r
317                                 dvr.Read ();    // missing attributes\r
318                                 Fail ("should be failed.");\r
319                         } catch (XmlSchemaException ex) {\r
320                         }\r
321 \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
327 \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
333 \r
334                         xml = dtd + "<root foo='value' bar='2nd' baz='3rd' />";\r
335                         dvr = PrepareXmlReader (xml);\r
336                         dvr.Read ();    // DTD\r
337                         try {\r
338                                 dvr.Read ();    // undeclared attribute baz\r
339                                 Fail ("should be failed.");\r
340                         } catch (XmlSchemaException) {\r
341                         }\r
342                 }\r
343 \r
344                 [Test]\r
345                 public void TestAttributeDefaultContribution ()\r
346                 {\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
350 \r
351                         dvr = PrepareXmlReader (xml);\r
352                         dvr.ValidationType = ValidationType.DTD;\r
353                         this.TestAttributeDefaultContributionInternal (dvr);\r
354 \r
355                         dvr = PrepareXmlReader (xml);\r
356                         dvr.ValidationType = ValidationType.None;\r
357                         this.TestAttributeDefaultContributionInternal (dvr);\r
358                 }\r
359 \r
360                 private void TestAttributeDefaultContributionInternal (XmlReader dvr)\r
361                 {\r
362                         dvr.Read ();    // DTD\r
363                         dvr.Read ();\r
364                         AssertEquals (XmlNodeType.Element, dvr.NodeType);\r
365                         AssertEquals ("root", dvr.Name);\r
366                         AssertEquals (2, dvr.AttributeCount);\r
367                         // foo\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
377                         // bar\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
387                 }\r
388 \r
389                 [Test]\r
390                 public void TestExpandEntity ()\r
391                 {\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
398                         dvr.Read ();\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
408 \r
409                         // ValidationType = None\r
410 \r
411                         dvr = PrepareXmlReader (xml);\r
412                         dvr.EntityHandling = EntityHandling.ExpandEntities;\r
413                         dvr.ValidationType = ValidationType.None;\r
414                         dvr.Read ();    // DTD\r
415                         dvr.Read ();\r
416                         AssertEquals (XmlNodeType.Element, dvr.NodeType);\r
417                         AssertEquals ("root", dvr.Name);\r
418 \r
419                         Assert (dvr.MoveToFirstAttribute ());\r
420                         AssertEquals ("foo", dvr.Name);\r
421                         AssertEquals ("entity string", dvr.Value);\r
422 \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
427                 }\r
428 \r
429                 [Test]\r
430                 public void TestPreserveEntity ()\r
431                 {\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
438                         dvr.Read ();\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
450 \r
451                         // bar\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
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 ("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
489 \r
490                         // bar\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
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