2 // XmlTextReaderTests.cs
5 // Jason Diamond (jason@injektilo.org)
7 // (C) 2001, 2002 Jason Diamond http://injektilo.org/
14 using NUnit.Framework;
16 namespace MonoTests.System.Xml
18 public class XmlTextReaderTests : TestCase
20 public XmlTextReaderTests () : base ("MonoTests.System.Xml.XmlTextReaderTests testsuite") { }
21 public XmlTextReaderTests (string name) : base (name) { }
23 private void AssertStartDocument (XmlReader xmlReader)
25 Assert (xmlReader.ReadState == ReadState.Initial);
26 Assert (xmlReader.NodeType == XmlNodeType.None);
27 Assert (xmlReader.Depth == 0);
28 Assert (!xmlReader.EOF);
31 private void AssertNode (
43 Assert (xmlReader.Read ());
44 Assert (xmlReader.ReadState == ReadState.Interactive);
45 Assert (!xmlReader.EOF);
48 private void AssertNodeValues (
60 Assert (xmlReader.NodeType == nodeType);
61 Assert (xmlReader.Depth == depth);
62 Assert (xmlReader.IsEmptyElement == isEmptyElement);
66 "name was {0}, expected {1}",
69 xmlReader.Name == name);
73 "prefix was {0}, expected {1}",
76 xmlReader.Prefix == prefix);
80 "localName was {0}, expected {1}",
83 xmlReader.LocalName == localName);
87 "namespaceURI was {0}, expected {1}",
88 xmlReader.NamespaceURI,
90 xmlReader.NamespaceURI == namespaceURI);
94 "hasValue was {0}, expected {1}",
96 (value != String.Empty)),
97 xmlReader.HasValue == (value != String.Empty));
101 "value was {0}, expected {1}",
104 xmlReader.Value == value);
108 "hasAttributes was {0}, expected {1}",
109 xmlReader.HasAttributes,
110 (attributeCount > 0)),
111 xmlReader.HasAttributes == (attributeCount > 0));
115 "attributeCount was {0}, expected {1}",
116 xmlReader.AttributeCount,
118 xmlReader.AttributeCount == attributeCount);
121 private void AssertAttribute (
131 "value was {0}, expected {1}",
134 xmlReader[name] == value);
136 Assert (xmlReader.GetAttribute (name) == value);
138 if (namespaceURI != String.Empty) {
139 Assert (xmlReader[localName, namespaceURI] == value);
140 Assert (xmlReader.GetAttribute (localName, namespaceURI) == value);
144 private void AssertEndDocument (XmlReader xmlReader)
146 Assert (!xmlReader.Read ());
147 Assert (xmlReader.NodeType == XmlNodeType.None);
148 Assert (xmlReader.Depth == 0);
149 Assert (xmlReader.ReadState == ReadState.EndOfFile);
150 Assert (xmlReader.EOF);
153 Assert (xmlReader.ReadState == ReadState.Closed);
156 public void TestEmptyElement ()
158 string xml = "<foo/>";
159 XmlReader xmlReader =
160 new XmlTextReader (new StringReader (xml));
162 AssertStartDocument (xmlReader);
165 xmlReader, // xmlReader
166 XmlNodeType.Element, // nodeType
168 true, // isEmptyElement
170 String.Empty, // prefix
172 String.Empty, // namespaceURI
173 String.Empty, // value
177 AssertEndDocument (xmlReader);
180 public void TestEmptyElementWithBadName ()
182 string xml = "<1foo/>";
183 XmlReader xmlReader =
184 new XmlTextReader (new StringReader (xml));
186 bool caughtXmlException = false;
190 } catch (XmlException) {
191 caughtXmlException = true;
194 Assert(caughtXmlException);
197 public void TestEmptyElementWithWhitespace ()
199 string xml = "<foo />";
200 XmlReader xmlReader =
201 new XmlTextReader (new StringReader (xml));
203 AssertStartDocument (xmlReader);
206 xmlReader, // xmlReader
207 XmlNodeType.Element, // nodeType
209 true, // isEmptyElement
211 String.Empty, // prefix
213 String.Empty, // namespaceURI
214 String.Empty, // value
218 AssertEndDocument (xmlReader);
221 public void TestEmptyElementWithStartAndEndTag ()
223 string xml = "<foo></foo>";
224 XmlReader xmlReader =
225 new XmlTextReader (new StringReader (xml));
227 AssertStartDocument (xmlReader);
230 xmlReader, // xmlReader
231 XmlNodeType.Element, // nodeType
233 false, // isEmptyElement
235 String.Empty, // prefix
237 String.Empty, // namespaceURI
238 String.Empty, // value
243 xmlReader, // xmlReader
244 XmlNodeType.EndElement, // nodeType
246 false, // isEmptyElement
248 String.Empty, // prefix
250 String.Empty, // namespaceURI
251 String.Empty, // value
255 AssertEndDocument (xmlReader);
258 public void TestEmptyElementWithStartAndEndTagWithWhitespace ()
260 string xml = "<foo ></foo >";
261 XmlReader xmlReader =
262 new XmlTextReader (new StringReader (xml));
264 AssertStartDocument (xmlReader);
267 xmlReader, // xmlReader
268 XmlNodeType.Element, // nodeType
270 false, // isEmptyElement
272 String.Empty, // prefix
274 String.Empty, // namespaceURI
275 String.Empty, // value
280 xmlReader, // xmlReader
281 XmlNodeType.EndElement, // nodeType
283 false, // isEmptyElement
285 String.Empty, // prefix
287 String.Empty, // namespaceURI
288 String.Empty, // value
292 AssertEndDocument (xmlReader);
295 public void TestNestedEmptyTag ()
297 string xml = "<foo><bar/></foo>";
298 XmlReader xmlReader =
299 new XmlTextReader (new StringReader (xml));
301 AssertStartDocument (xmlReader);
304 xmlReader, // xmlReader
305 XmlNodeType.Element, // nodeType
307 false, // isEmptyElement
309 String.Empty, // prefix
311 String.Empty, // namespaceURI
312 String.Empty, // value
317 xmlReader, // xmlReader
318 XmlNodeType.Element, // nodeType
320 true, // isEmptyElement
322 String.Empty, // prefix
324 String.Empty, // namespaceURI
325 String.Empty, // value
330 xmlReader, // xmlReader
331 XmlNodeType.EndElement, // nodeType
333 false, // isEmptyElement
335 String.Empty, // prefix
337 String.Empty, // namespaceURI
338 String.Empty, // value
342 AssertEndDocument (xmlReader);
345 public void TestNestedText ()
347 string xml = "<foo>bar</foo>";
348 XmlReader xmlReader =
349 new XmlTextReader (new StringReader (xml));
351 AssertStartDocument (xmlReader);
354 xmlReader, // xmlReader
355 XmlNodeType.Element, // nodeType
357 false, // isEmptyElement
359 String.Empty, // prefix
361 String.Empty, // namespaceURI
362 String.Empty, // value
367 xmlReader, // xmlReader
368 XmlNodeType.Text, // nodeType
370 false, // isEmptyElement
371 String.Empty, // name
372 String.Empty, // prefix
373 String.Empty, // localName
374 String.Empty, // namespaceURI
380 xmlReader, // xmlReader
381 XmlNodeType.EndElement, // nodeType
383 false, // isEmptyElement
385 String.Empty, // prefix
387 String.Empty, // namespaceURI
388 String.Empty, // value
392 AssertEndDocument (xmlReader);
395 public void TestEmptyElementWithAttribute ()
397 string xml = @"<foo bar=""baz""/>";
398 XmlReader xmlReader =
399 new XmlTextReader (new StringReader (xml));
401 AssertStartDocument (xmlReader);
404 xmlReader, // xmlReader
405 XmlNodeType.Element, // nodeType
407 true, // isEmptyElement
409 String.Empty, // prefix
411 String.Empty, // namespaceURI
412 String.Empty, // value
417 xmlReader, // xmlReader
419 String.Empty, // prefix
421 String.Empty, // namespaceURI
425 AssertEndDocument (xmlReader);
428 public void TestStartAndEndTagWithAttribute ()
430 string xml = @"<foo bar='baz'></foo>";
431 XmlReader xmlReader =
432 new XmlTextReader (new StringReader (xml));
434 AssertStartDocument (xmlReader);
437 xmlReader, // xmlReader
438 XmlNodeType.Element, // nodeType
440 false, // isEmptyElement
442 String.Empty, // prefix
444 String.Empty, // namespaceURI
445 String.Empty, // value
450 xmlReader, // xmlReader
452 String.Empty, // prefix
454 String.Empty, // namespaceURI
459 xmlReader, // xmlReader
460 XmlNodeType.EndElement, // nodeType
462 false, // isEmptyElement
464 String.Empty, // prefix
466 String.Empty, // namespaceURI
467 String.Empty, // value
471 AssertEndDocument (xmlReader);
474 public void TestEmptyElementWithTwoAttributes ()
476 string xml = @"<foo bar=""baz"" quux='quuux'/>";
477 XmlReader xmlReader =
478 new XmlTextReader (new StringReader (xml));
480 AssertStartDocument (xmlReader);
483 xmlReader, // xmlReader
484 XmlNodeType.Element, // nodeType
486 true, // isEmptyElement
488 String.Empty, // prefix
490 String.Empty, // namespaceURI
491 String.Empty, // value
496 xmlReader, // xmlReader
498 String.Empty, // prefix
500 String.Empty, // namespaceURI
505 xmlReader, // xmlReader
507 String.Empty, // prefix
509 String.Empty, // namespaceURI
513 AssertEndDocument (xmlReader);
516 public void TestProcessingInstructionBeforeDocumentElement ()
518 string xml = "<?foo bar?><baz/>";
519 XmlReader xmlReader =
520 new XmlTextReader (new StringReader (xml));
522 AssertStartDocument (xmlReader);
525 xmlReader, // xmlReader
526 XmlNodeType.ProcessingInstruction, // nodeType
528 false, // isEmptyElement
530 String.Empty, // prefix
532 String.Empty, // namespaceURI
538 xmlReader, // xmlReader
539 XmlNodeType.Element, // nodeType
541 true, // isEmptyElement
543 String.Empty, // prefix
545 String.Empty, // namespaceURI
546 String.Empty, // value
550 AssertEndDocument (xmlReader);
553 public void TestCommentBeforeDocumentElement ()
555 string xml = "<!--foo--><bar/>";
556 XmlReader xmlReader =
557 new XmlTextReader (new StringReader (xml));
559 AssertStartDocument (xmlReader);
562 xmlReader, // xmlReader
563 XmlNodeType.Comment, // nodeType
565 false, // isEmptyElement
566 String.Empty, // name
567 String.Empty, // prefix
568 String.Empty, // localName
569 String.Empty, // namespaceURI
575 xmlReader, // xmlReader
576 XmlNodeType.Element, // nodeType
578 true, // isEmptyElement
580 String.Empty, // prefix
582 String.Empty, // namespaceURI
583 String.Empty, // value
587 AssertEndDocument (xmlReader);
590 public void TestPredefinedEntities ()
592 string xml = "<foo><>&'"</foo>";
593 XmlReader xmlReader =
594 new XmlTextReader (new StringReader (xml));
596 AssertStartDocument (xmlReader);
599 xmlReader, // xmlReader
600 XmlNodeType.Element, // nodeType
602 false, // isEmptyElement
604 String.Empty, // prefix
606 String.Empty, // namespaceURI
607 String.Empty, // value
612 xmlReader, // xmlReader
613 XmlNodeType.Text, // nodeType
615 false, // isEmptyElement
616 String.Empty, // name
617 String.Empty, // prefix
618 String.Empty, // localName
619 String.Empty, // namespaceURI
625 xmlReader, // xmlReader
626 XmlNodeType.EndElement, // nodeType
628 false, // isEmptyElement
630 String.Empty, // prefix
632 String.Empty, // namespaceURI
633 String.Empty, // value
637 AssertEndDocument (xmlReader);
640 public void TestEntityReference ()
642 string xml = "<foo>&bar;</foo>";
643 XmlReader xmlReader =
644 new XmlTextReader (new StringReader (xml));
646 AssertStartDocument (xmlReader);
649 xmlReader, // xmlReader
650 XmlNodeType.Element, // nodeType
652 false, // isEmptyElement
654 String.Empty, // prefix
656 String.Empty, // namespaceURI
657 String.Empty, // value
662 xmlReader, // xmlReader
663 XmlNodeType.EntityReference, // nodeType
665 false, // isEmptyElement
667 String.Empty, // prefix
669 String.Empty, // namespaceURI
670 String.Empty, // value
675 xmlReader, // xmlReader
676 XmlNodeType.EndElement, // nodeType
678 false, // isEmptyElement
680 String.Empty, // prefix
682 String.Empty, // namespaceURI
683 String.Empty, // value
687 AssertEndDocument (xmlReader);
690 public void TestEntityReferenceInsideText ()
692 string xml = "<foo>bar&baz;quux</foo>";
693 XmlReader xmlReader =
694 new XmlTextReader (new StringReader (xml));
696 AssertStartDocument (xmlReader);
699 xmlReader, // xmlReader
700 XmlNodeType.Element, // nodeType
702 false, // isEmptyElement
704 String.Empty, // prefix
706 String.Empty, // namespaceURI
707 String.Empty, // value
712 xmlReader, // xmlReader
713 XmlNodeType.Text, // nodeType
715 false, // isEmptyElement
716 String.Empty, // name
717 String.Empty, // prefix
718 String.Empty, // localName
719 String.Empty, // namespaceURI
725 xmlReader, // xmlReader
726 XmlNodeType.EntityReference, // nodeType
728 false, // isEmptyElement
730 String.Empty, // prefix
732 String.Empty, // namespaceURI
733 String.Empty, // value
738 xmlReader, // xmlReader
739 XmlNodeType.Text, // nodeType
741 false, // isEmptyElement
742 String.Empty, // name
743 String.Empty, // prefix
744 String.Empty, // localName
745 String.Empty, // namespaceURI
751 xmlReader, // xmlReader
752 XmlNodeType.EndElement, // nodeType
754 false, // isEmptyElement
756 String.Empty, // prefix
758 String.Empty, // namespaceURI
759 String.Empty, // value
763 AssertEndDocument (xmlReader);
766 public void TestCharacterReferences ()
768 string xml = "<foo>FOO</foo>";
769 XmlReader xmlReader =
770 new XmlTextReader (new StringReader (xml));
772 AssertStartDocument (xmlReader);
775 xmlReader, // xmlReader
776 XmlNodeType.Element, // nodeType
778 false, // isEmptyElement
780 String.Empty, // prefix
782 String.Empty, // namespaceURI
783 String.Empty, // value
788 xmlReader, // xmlReader
789 XmlNodeType.Text, // nodeType
791 false, // isEmptyElement
792 String.Empty, // name
793 String.Empty, // prefix
794 String.Empty, // localName
795 String.Empty, // namespaceURI
801 xmlReader, // xmlReader
802 XmlNodeType.EndElement, // nodeType
804 false, // isEmptyElement
806 String.Empty, // prefix
808 String.Empty, // namespaceURI
809 String.Empty, // value
813 AssertEndDocument (xmlReader);
816 public void TestEntityReferenceInAttribute ()
818 string xml = "<foo bar='&baz;'/>";
819 XmlReader xmlReader =
820 new XmlTextReader (new StringReader (xml));
822 AssertStartDocument (xmlReader);
825 xmlReader, // xmlReader
826 XmlNodeType.Element, // nodeType
828 true, // isEmptyElement
830 String.Empty, // prefix
832 String.Empty, // namespaceURI
833 String.Empty, // value
838 xmlReader, // xmlReader
840 String.Empty, // prefix
842 String.Empty, // namespaceURI
846 AssertEndDocument (xmlReader);
849 public void TestPredefinedEntitiesInAttribute ()
851 string xml = "<foo bar='<>&'"'/>";
852 XmlReader xmlReader =
853 new XmlTextReader (new StringReader (xml));
855 AssertStartDocument (xmlReader);
858 xmlReader, // xmlReader
859 XmlNodeType.Element, // nodeType
861 true, // isEmptyElement
863 String.Empty, // prefix
865 String.Empty, // namespaceURI
866 String.Empty, // value
871 xmlReader, // xmlReader
873 String.Empty, // prefix
875 String.Empty, // namespaceURI
879 AssertEndDocument (xmlReader);
882 public void TestCharacterReferencesInAttribute ()
884 string xml = "<foo bar='FOO'/>";
885 XmlReader xmlReader =
886 new XmlTextReader (new StringReader (xml));
888 AssertStartDocument (xmlReader);
891 xmlReader, // xmlReader
892 XmlNodeType.Element, // nodeType
894 true, // isEmptyElement
896 String.Empty, // prefix
898 String.Empty, // namespaceURI
899 String.Empty, // value
904 xmlReader, // xmlReader
906 String.Empty, // prefix
908 String.Empty, // namespaceURI
912 AssertEndDocument (xmlReader);
915 public void TestCDATA ()
917 string xml = "<foo><![CDATA[<>&]]></foo>";
918 XmlReader xmlReader =
919 new XmlTextReader (new StringReader (xml));
921 AssertStartDocument (xmlReader);
924 xmlReader, // xmlReader
925 XmlNodeType.Element, // nodeType
927 false, // isEmptyElement
929 String.Empty, // prefix
931 String.Empty, // namespaceURI
932 String.Empty, // value
937 xmlReader, // xmlReader
938 XmlNodeType.CDATA, // nodeType
940 false, // isEmptyElement
941 String.Empty, // name
942 String.Empty, // prefix
943 String.Empty, // localName
944 String.Empty, // namespaceURI
950 xmlReader, // xmlReader
951 XmlNodeType.EndElement, // nodeType
953 false, // isEmptyElement
955 String.Empty, // prefix
957 String.Empty, // namespaceURI
958 String.Empty, // value
962 AssertEndDocument (xmlReader);
965 public void TestEmptyElementInNamespace ()
967 string xml = @"<foo:bar xmlns:foo='http://foo/' />";
968 XmlReader xmlReader =
969 new XmlTextReader (new StringReader (xml));
971 AssertStartDocument (xmlReader);
974 xmlReader, // xmlReader
975 XmlNodeType.Element, // nodeType
977 true, // isEmptyElement
981 "http://foo/", // namespaceURI
982 String.Empty, // value
987 xmlReader, // xmlReader
991 "http://www.w3.org/2000/xmlns/", // namespaceURI
992 "http://foo/" // value
995 AssertEquals ("http://foo/", xmlReader.LookupNamespace ("foo"));
997 AssertEndDocument (xmlReader);
1000 public void TestEmptyElementInDefaultNamespace ()
1002 string xml = @"<foo xmlns='http://foo/' />";
1003 XmlReader xmlReader =
1004 new XmlTextReader (new StringReader (xml));
1006 AssertStartDocument (xmlReader);
1009 xmlReader, // xmlReader
1010 XmlNodeType.Element, // nodeType
1012 true, // isEmptyElement
1014 String.Empty, // prefix
1016 "http://foo/", // namespaceURI
1017 String.Empty, // value
1022 xmlReader, // xmlReader
1024 String.Empty, // prefix
1025 "xmlns", // localName
1026 "http://www.w3.org/2000/xmlns/", // namespaceURI
1027 "http://foo/" // value
1030 AssertEquals ("http://foo/", xmlReader.LookupNamespace (String.Empty));
1032 AssertEndDocument (xmlReader);
1035 public void TestChildElementInNamespace ()
1037 string xml = @"<foo:bar xmlns:foo='http://foo/'><baz:quux xmlns:baz='http://baz/' /></foo:bar>";
1038 XmlReader xmlReader =
1039 new XmlTextReader (new StringReader (xml));
1041 AssertStartDocument (xmlReader);
1044 xmlReader, // xmlReader
1045 XmlNodeType.Element, // nodeType
1047 false, // isEmptyElement
1051 "http://foo/", // namespaceURI
1052 String.Empty, // value
1057 xmlReader, // xmlReader
1058 "xmlns:foo", // name
1061 "http://www.w3.org/2000/xmlns/", // namespaceURI
1062 "http://foo/" // value
1065 AssertEquals ("http://foo/", xmlReader.LookupNamespace ("foo"));
1068 xmlReader, // xmlReader
1069 XmlNodeType.Element, // nodeType
1071 true, // isEmptyElement
1074 "quux", // localName
1075 "http://baz/", // namespaceURI
1076 String.Empty, // value
1081 xmlReader, // xmlReader
1082 "xmlns:baz", // name
1085 "http://www.w3.org/2000/xmlns/", // namespaceURI
1086 "http://baz/" // value
1089 AssertEquals ("http://foo/", xmlReader.LookupNamespace ("foo"));
1090 AssertEquals ("http://baz/", xmlReader.LookupNamespace ("baz"));
1093 xmlReader, // xmlReader
1094 XmlNodeType.EndElement, // nodeType
1096 false, // isEmptyElement
1100 "http://foo/", // namespaceURI
1101 String.Empty, // value
1105 AssertEquals ("http://foo/", xmlReader.LookupNamespace ("foo"));
1106 AssertNull (xmlReader.LookupNamespace ("baz"));
1108 AssertEndDocument (xmlReader);
1111 public void TestChildElementInDefaultNamespace ()
1113 string xml = @"<foo:bar xmlns:foo='http://foo/'><baz xmlns='http://baz/' /></foo:bar>";
1114 XmlReader xmlReader =
1115 new XmlTextReader (new StringReader (xml));
1117 AssertStartDocument (xmlReader);
1120 xmlReader, // xmlReader
1121 XmlNodeType.Element, // nodeType
1123 false, // isEmptyElement
1127 "http://foo/", // namespaceURI
1128 String.Empty, // value
1133 xmlReader, // xmlReader
1134 "xmlns:foo", // name
1137 "http://www.w3.org/2000/xmlns/", // namespaceURI
1138 "http://foo/" // value
1141 AssertEquals ("http://foo/", xmlReader.LookupNamespace ("foo"));
1144 xmlReader, // xmlReader
1145 XmlNodeType.Element, // nodeType
1147 true, // isEmptyElement
1149 String.Empty, // prefix
1151 "http://baz/", // namespaceURI
1152 String.Empty, // value
1157 xmlReader, // xmlReader
1159 String.Empty, // prefix
1160 "xmlns", // localName
1161 "http://www.w3.org/2000/xmlns/", // namespaceURI
1162 "http://baz/" // value
1165 AssertEquals ("http://foo/", xmlReader.LookupNamespace ("foo"));
1166 AssertEquals ("http://baz/", xmlReader.LookupNamespace (String.Empty));
1169 xmlReader, // xmlReader
1170 XmlNodeType.EndElement, // nodeType
1172 false, // isEmptyElement
1176 "http://foo/", // namespaceURI
1177 String.Empty, // value
1181 AssertEquals ("http://foo/", xmlReader.LookupNamespace ("foo"));
1183 AssertEndDocument (xmlReader);
1186 public void TestAttributeInNamespace ()
1188 string xml = @"<foo bar:baz='quux' xmlns:bar='http://bar/' />";
1189 XmlReader xmlReader =
1190 new XmlTextReader (new StringReader (xml));
1192 AssertStartDocument (xmlReader);
1195 xmlReader, // xmlReader
1196 XmlNodeType.Element, // nodeType
1198 true, // isEmptyElement
1200 String.Empty, // prefix
1202 String.Empty, // namespaceURI
1203 String.Empty, // value
1208 xmlReader, // xmlReader
1212 "http://bar/", // namespaceURI
1217 xmlReader, // xmlReader
1218 "xmlns:bar", // name
1221 "http://www.w3.org/2000/xmlns/", // namespaceURI
1222 "http://bar/" // value
1225 AssertEquals ("http://bar/", xmlReader.LookupNamespace ("bar"));
1227 AssertEndDocument (xmlReader);
1230 // The following is #if'ed out because it's specific to the Mono
1231 // implementation and won't compile when testing Microsoft's code.
1232 // Feel free to turn it on if you want to test Mono's name tables.
1236 public void TestIsFirstNameChar ()
1238 for (int ch = 0; ch <= 0xFFFF; ++ch) {
1240 XmlChar.IsFirstNameChar (ch) ==
1241 IsFirstNameChar (ch));
1245 public void TestIsNameChar ()
1247 for (int ch = 0; ch <= 0xFFFF; ++ch) {
1249 XmlChar.IsNameChar (ch) ==
1254 private static bool IsFirstNameChar (int ch)
1262 private static bool IsNameChar (int ch)
1271 IsCombiningChar (ch) ||
1275 private static bool IsLetter (int ch)
1282 private static bool IsBaseChar (int ch)
1285 (ch >= 0x0041 && ch <= 0x005A) ||
1286 (ch >= 0x0061 && ch <= 0x007A) ||
1287 (ch >= 0x00C0 && ch <= 0x00D6) ||
1288 (ch >= 0x00D8 && ch <= 0x00F6) ||
1289 (ch >= 0x00F8 && ch <= 0x00FF) ||
1290 (ch >= 0x0100 && ch <= 0x0131) ||
1291 (ch >= 0x0134 && ch <= 0x013E) ||
1292 (ch >= 0x0141 && ch <= 0x0148) ||
1293 (ch >= 0x014A && ch <= 0x017E) ||
1294 (ch >= 0x0180 && ch <= 0x01C3) ||
1295 (ch >= 0x01CD && ch <= 0x01F0) ||
1296 (ch >= 0x01F4 && ch <= 0x01F5) ||
1297 (ch >= 0x01FA && ch <= 0x0217) ||
1298 (ch >= 0x0250 && ch <= 0x02A8) ||
1299 (ch >= 0x02BB && ch <= 0x02C1) ||
1301 (ch >= 0x0388 && ch <= 0x038A) ||
1303 (ch >= 0x038E && ch <= 0x03A1) ||
1304 (ch >= 0x03A3 && ch <= 0x03CE) ||
1305 (ch >= 0x03D0 && ch <= 0x03D6) ||
1310 (ch >= 0x03E2 && ch <= 0x03F3) ||
1311 (ch >= 0x0401 && ch <= 0x040C) ||
1312 (ch >= 0x040E && ch <= 0x044F) ||
1313 (ch >= 0x0451 && ch <= 0x045C) ||
1314 (ch >= 0x045E && ch <= 0x0481) ||
1315 (ch >= 0x0490 && ch <= 0x04C4) ||
1316 (ch >= 0x04C7 && ch <= 0x04C8) ||
1317 (ch >= 0x04CB && ch <= 0x04CC) ||
1318 (ch >= 0x04D0 && ch <= 0x04EB) ||
1319 (ch >= 0x04EE && ch <= 0x04F5) ||
1320 (ch >= 0x04F8 && ch <= 0x04F9) ||
1321 (ch >= 0x0531 && ch <= 0x0556) ||
1323 (ch >= 0x0561 && ch <= 0x0586) ||
1324 (ch >= 0x05D0 && ch <= 0x05EA) ||
1325 (ch >= 0x05F0 && ch <= 0x05F2) ||
1326 (ch >= 0x0621 && ch <= 0x063A) ||
1327 (ch >= 0x0641 && ch <= 0x064A) ||
1328 (ch >= 0x0671 && ch <= 0x06B7) ||
1329 (ch >= 0x06BA && ch <= 0x06BE) ||
1330 (ch >= 0x06C0 && ch <= 0x06CE) ||
1331 (ch >= 0x06D0 && ch <= 0x06D3) ||
1333 (ch >= 0x06E5 && ch <= 0x06E6) ||
1334 (ch >= 0x0905 && ch <= 0x0939) ||
1336 (ch >= 0x0958 && ch <= 0x0961) ||
1337 (ch >= 0x0985 && ch <= 0x098C) ||
1338 (ch >= 0x098F && ch <= 0x0990) ||
1339 (ch >= 0x0993 && ch <= 0x09A8) ||
1340 (ch >= 0x09AA && ch <= 0x09B0) ||
1342 (ch >= 0x09B6 && ch <= 0x09B9) ||
1343 (ch >= 0x09DC && ch <= 0x09DD) ||
1344 (ch >= 0x09DF && ch <= 0x09E1) ||
1345 (ch >= 0x09F0 && ch <= 0x09F1) ||
1346 (ch >= 0x0A05 && ch <= 0x0A0A) ||
1347 (ch >= 0x0A0F && ch <= 0x0A10) ||
1348 (ch >= 0x0A13 && ch <= 0x0A28) ||
1349 (ch >= 0x0A2A && ch <= 0x0A30) ||
1350 (ch >= 0x0A32 && ch <= 0x0A33) ||
1351 (ch >= 0x0A35 && ch <= 0x0A36) ||
1352 (ch >= 0x0A38 && ch <= 0x0A39) ||
1353 (ch >= 0x0A59 && ch <= 0x0A5C) ||
1355 (ch >= 0x0A72 && ch <= 0x0A74) ||
1356 (ch >= 0x0A85 && ch <= 0x0A8B) ||
1358 (ch >= 0x0A8F && ch <= 0x0A91) ||
1359 (ch >= 0x0A93 && ch <= 0x0AA8) ||
1360 (ch >= 0x0AAA && ch <= 0x0AB0) ||
1361 (ch >= 0x0AB2 && ch <= 0x0AB3) ||
1362 (ch >= 0x0AB5 && ch <= 0x0AB9) ||
1365 (ch >= 0x0B05 && ch <= 0x0B0C) ||
1366 (ch >= 0x0B0F && ch <= 0x0B10) ||
1367 (ch >= 0x0B13 && ch <= 0x0B28) ||
1368 (ch >= 0x0B2A && ch <= 0x0B30) ||
1369 (ch >= 0x0B32 && ch <= 0x0B33) ||
1370 (ch >= 0x0B36 && ch <= 0x0B39) ||
1372 (ch >= 0x0B5C && ch <= 0x0B5D) ||
1373 (ch >= 0x0B5F && ch <= 0x0B61) ||
1374 (ch >= 0x0B85 && ch <= 0x0B8A) ||
1375 (ch >= 0x0B8E && ch <= 0x0B90) ||
1376 (ch >= 0x0B92 && ch <= 0x0B95) ||
1377 (ch >= 0x0B99 && ch <= 0x0B9A) ||
1379 (ch >= 0x0B9E && ch <= 0x0B9F) ||
1380 (ch >= 0x0BA3 && ch <= 0x0BA4) ||
1381 (ch >= 0x0BA8 && ch <= 0x0BAA) ||
1382 (ch >= 0x0BAE && ch <= 0x0BB5) ||
1383 (ch >= 0x0BB7 && ch <= 0x0BB9) ||
1384 (ch >= 0x0C05 && ch <= 0x0C0C) ||
1385 (ch >= 0x0C0E && ch <= 0x0C10) ||
1386 (ch >= 0x0C12 && ch <= 0x0C28) ||
1387 (ch >= 0x0C2A && ch <= 0x0C33) ||
1388 (ch >= 0x0C35 && ch <= 0x0C39) ||
1389 (ch >= 0x0C60 && ch <= 0x0C61) ||
1390 (ch >= 0x0C85 && ch <= 0x0C8C) ||
1391 (ch >= 0x0C8E && ch <= 0x0C90) ||
1392 (ch >= 0x0C92 && ch <= 0x0CA8) ||
1393 (ch >= 0x0CAA && ch <= 0x0CB3) ||
1394 (ch >= 0x0CB5 && ch <= 0x0CB9) ||
1396 (ch >= 0x0CE0 && ch <= 0x0CE1) ||
1397 (ch >= 0x0D05 && ch <= 0x0D0C) ||
1398 (ch >= 0x0D0E && ch <= 0x0D10) ||
1399 (ch >= 0x0D12 && ch <= 0x0D28) ||
1400 (ch >= 0x0D2A && ch <= 0x0D39) ||
1401 (ch >= 0x0D60 && ch <= 0x0D61) ||
1402 (ch >= 0x0E01 && ch <= 0x0E2E) ||
1404 (ch >= 0x0E32 && ch <= 0x0E33) ||
1405 (ch >= 0x0E40 && ch <= 0x0E45) ||
1406 (ch >= 0x0E81 && ch <= 0x0E82) ||
1408 (ch >= 0x0E87 && ch <= 0x0E88) ||
1411 (ch >= 0x0E94 && ch <= 0x0E97) ||
1412 (ch >= 0x0E99 && ch <= 0x0E9F) ||
1413 (ch >= 0x0EA1 && ch <= 0x0EA3) ||
1416 (ch >= 0x0EAA && ch <= 0x0EAB) ||
1417 (ch >= 0x0EAD && ch <= 0x0EAE) ||
1419 (ch >= 0x0EB2 && ch <= 0x0EB3) ||
1421 (ch >= 0x0EC0 && ch <= 0x0EC4) ||
1422 (ch >= 0x0F40 && ch <= 0x0F47) ||
1423 (ch >= 0x0F49 && ch <= 0x0F69) ||
1424 (ch >= 0x10A0 && ch <= 0x10C5) ||
1425 (ch >= 0x10D0 && ch <= 0x10F6) ||
1427 (ch >= 0x1102 && ch <= 0x1103) ||
1428 (ch >= 0x1105 && ch <= 0x1107) ||
1430 (ch >= 0x110B && ch <= 0x110C) ||
1431 (ch >= 0x110E && ch <= 0x1112) ||
1438 (ch >= 0x1154 && ch <= 0x1155) ||
1440 (ch >= 0x115F && ch <= 0x1161) ||
1445 (ch >= 0x116D && ch <= 0x116E) ||
1446 (ch >= 0x1172 && ch <= 0x1173) ||
1451 (ch >= 0x11AE && ch <= 0x11AF) ||
1452 (ch >= 0x11B7 && ch <= 0x11B8) ||
1454 (ch >= 0x11BC && ch <= 0x11C2) ||
1458 (ch >= 0x1E00 && ch <= 0x1E9B) ||
1459 (ch >= 0x1EA0 && ch <= 0x1EF9) ||
1460 (ch >= 0x1F00 && ch <= 0x1F15) ||
1461 (ch >= 0x1F18 && ch <= 0x1F1D) ||
1462 (ch >= 0x1F20 && ch <= 0x1F45) ||
1463 (ch >= 0x1F48 && ch <= 0x1F4D) ||
1464 (ch >= 0x1F50 && ch <= 0x1F57) ||
1468 (ch >= 0x1F5F && ch <= 0x1F7D) ||
1469 (ch >= 0x1F80 && ch <= 0x1FB4) ||
1470 (ch >= 0x1FB6 && ch <= 0x1FBC) ||
1472 (ch >= 0x1FC2 && ch <= 0x1FC4) ||
1473 (ch >= 0x1FC6 && ch <= 0x1FCC) ||
1474 (ch >= 0x1FD0 && ch <= 0x1FD3) ||
1475 (ch >= 0x1FD6 && ch <= 0x1FDB) ||
1476 (ch >= 0x1FE0 && ch <= 0x1FEC) ||
1477 (ch >= 0x1FF2 && ch <= 0x1FF4) ||
1478 (ch >= 0x1FF6 && ch <= 0x1FFC) ||
1480 (ch >= 0x212A && ch <= 0x212B) ||
1482 (ch >= 0x2180 && ch <= 0x2182) ||
1483 (ch >= 0x3041 && ch <= 0x3094) ||
1484 (ch >= 0x30A1 && ch <= 0x30FA) ||
1485 (ch >= 0x3105 && ch <= 0x312C) ||
1486 (ch >= 0xAC00 && ch <= 0xD7A3);
1489 private static bool IsIdeographic (int ch)
1492 (ch >= 0x4E00 && ch <= 0x9FA5) ||
1494 (ch >= 0x3021 && ch <= 0x3029);
1497 private static bool IsDigit (int ch)
1500 (ch >= 0x0030 && ch <= 0x0039) ||
1501 (ch >= 0x0660 && ch <= 0x0669) ||
1502 (ch >= 0x06F0 && ch <= 0x06F9) ||
1503 (ch >= 0x0966 && ch <= 0x096F) ||
1504 (ch >= 0x09E6 && ch <= 0x09EF) ||
1505 (ch >= 0x0A66 && ch <= 0x0A6F) ||
1506 (ch >= 0x0AE6 && ch <= 0x0AEF) ||
1507 (ch >= 0x0B66 && ch <= 0x0B6F) ||
1508 (ch >= 0x0BE7 && ch <= 0x0BEF) ||
1509 (ch >= 0x0C66 && ch <= 0x0C6F) ||
1510 (ch >= 0x0CE6 && ch <= 0x0CEF) ||
1511 (ch >= 0x0D66 && ch <= 0x0D6F) ||
1512 (ch >= 0x0E50 && ch <= 0x0E59) ||
1513 (ch >= 0x0ED0 && ch <= 0x0ED9) ||
1514 (ch >= 0x0F20 && ch <= 0x0F29);
1517 private static bool IsCombiningChar (int ch)
1520 (ch >= 0x0300 && ch <= 0x0345) ||
1521 (ch >= 0x0360 && ch <= 0x0361) ||
1522 (ch >= 0x0483 && ch <= 0x0486) ||
1523 (ch >= 0x0591 && ch <= 0x05A1) ||
1524 (ch >= 0x05A3 && ch <= 0x05B9) ||
1525 (ch >= 0x05BB && ch <= 0x05BD) ||
1527 (ch >= 0x05C1 && ch <= 0x05C2) ||
1529 (ch >= 0x064B && ch <= 0x0652) ||
1531 (ch >= 0x06D6 && ch <= 0x06DC) ||
1532 (ch >= 0x06DD && ch <= 0x06DF) ||
1533 (ch >= 0x06E0 && ch <= 0x06E4) ||
1534 (ch >= 0x06E7 && ch <= 0x06E8) ||
1535 (ch >= 0x06EA && ch <= 0x06ED) ||
1536 (ch >= 0x0901 && ch <= 0x0903) ||
1538 (ch >= 0x093E && ch <= 0x094C) ||
1540 (ch >= 0x0951 && ch <= 0x0954) ||
1541 (ch >= 0x0962 && ch <= 0x0963) ||
1542 (ch >= 0x0981 && ch <= 0x0983) ||
1546 (ch >= 0x09C0 && ch <= 0x09C4) ||
1547 (ch >= 0x09C7 && ch <= 0x09C8) ||
1548 (ch >= 0x09CB && ch <= 0x09CD) ||
1550 (ch >= 0x09E2 && ch <= 0x09E3) ||
1555 (ch >= 0x0A40 && ch <= 0x0A42) ||
1556 (ch >= 0x0A47 && ch <= 0x0A48) ||
1557 (ch >= 0x0A4B && ch <= 0x0A4D) ||
1558 (ch >= 0x0A70 && ch <= 0x0A71) ||
1559 (ch >= 0x0A81 && ch <= 0x0A83) ||
1561 (ch >= 0x0ABE && ch <= 0x0AC5) ||
1562 (ch >= 0x0AC7 && ch <= 0x0AC9) ||
1563 (ch >= 0x0ACB && ch <= 0x0ACD) ||
1564 (ch >= 0x0B01 && ch <= 0x0B03) ||
1566 (ch >= 0x0B3E && ch <= 0x0B43) ||
1567 (ch >= 0x0B47 && ch <= 0x0B48) ||
1568 (ch >= 0x0B4B && ch <= 0x0B4D) ||
1569 (ch >= 0x0B56 && ch <= 0x0B57) ||
1570 (ch >= 0x0B82 && ch <= 0x0B83) ||
1571 (ch >= 0x0BBE && ch <= 0x0BC2) ||
1572 (ch >= 0x0BC6 && ch <= 0x0BC8) ||
1573 (ch >= 0x0BCA && ch <= 0x0BCD) ||
1575 (ch >= 0x0C01 && ch <= 0x0C03) ||
1576 (ch >= 0x0C3E && ch <= 0x0C44) ||
1577 (ch >= 0x0C46 && ch <= 0x0C48) ||
1578 (ch >= 0x0C4A && ch <= 0x0C4D) ||
1579 (ch >= 0x0C55 && ch <= 0x0C56) ||
1580 (ch >= 0x0C82 && ch <= 0x0C83) ||
1581 (ch >= 0x0CBE && ch <= 0x0CC4) ||
1582 (ch >= 0x0CC6 && ch <= 0x0CC8) ||
1583 (ch >= 0x0CCA && ch <= 0x0CCD) ||
1584 (ch >= 0x0CD5 && ch <= 0x0CD6) ||
1585 (ch >= 0x0D02 && ch <= 0x0D03) ||
1586 (ch >= 0x0D3E && ch <= 0x0D43) ||
1587 (ch >= 0x0D46 && ch <= 0x0D48) ||
1588 (ch >= 0x0D4A && ch <= 0x0D4D) ||
1591 (ch >= 0x0E34 && ch <= 0x0E3A) ||
1592 (ch >= 0x0E47 && ch <= 0x0E4E) ||
1594 (ch >= 0x0EB4 && ch <= 0x0EB9) ||
1595 (ch >= 0x0EBB && ch <= 0x0EBC) ||
1596 (ch >= 0x0EC8 && ch <= 0x0ECD) ||
1597 (ch >= 0x0F18 && ch <= 0x0F19) ||
1603 (ch >= 0x0F71 && ch <= 0x0F84) ||
1604 (ch >= 0x0F86 && ch <= 0x0F8B) ||
1605 (ch >= 0x0F90 && ch <= 0x0F95) ||
1607 (ch >= 0x0F99 && ch <= 0x0FAD) ||
1608 (ch >= 0x0FB1 && ch <= 0x0FB7) ||
1610 (ch >= 0x20D0 && ch <= 0x20DC) ||
1612 (ch >= 0x302A && ch <= 0x302F) ||
1617 private static bool IsExtender (int ch)
1628 (ch >= 0x3031 && ch <= 0x3035) ||
1629 (ch >= 0x309D && ch <= 0x309E) ||
1630 (ch >= 0x30FC && ch <= 0x30FE);
1635 public void TestIsName ()
1637 Assert (XmlReader.IsName ("foo"));
1638 Assert (!XmlReader.IsName ("1foo"));
1639 Assert (!XmlReader.IsName (" foo"));
1642 public void TestIsNameToken ()
1644 Assert (XmlReader.IsNameToken ("foo"));
1645 Assert (XmlReader.IsNameToken ("1foo"));
1646 Assert (!XmlReader.IsNameToken (" foo"));
1649 public void TestMoveToElementFromAttribute ()
1651 string xml = @"<foo bar=""baz"" />";
1652 XmlReader xmlReader =
1653 new XmlTextReader (new StringReader (xml));
1655 Assert (xmlReader.Read ());
1656 AssertEquals (XmlNodeType.Element, xmlReader.NodeType);
1657 Assert (xmlReader.MoveToFirstAttribute ());
1658 AssertEquals (XmlNodeType.Attribute, xmlReader.NodeType);
1659 Assert (xmlReader.MoveToElement ());
1660 AssertEquals (XmlNodeType.Element, xmlReader.NodeType);
1663 public void TestMoveToElementFromElement ()
1665 string xml = @"<foo bar=""baz"" />";
1666 XmlReader xmlReader =
1667 new XmlTextReader (new StringReader (xml));
1669 Assert (xmlReader.Read ());
1670 AssertEquals (XmlNodeType.Element, xmlReader.NodeType);
1671 Assert (!xmlReader.MoveToElement ());
1672 AssertEquals (XmlNodeType.Element, xmlReader.NodeType);
1675 public void TestMoveToFirstAttributeWithNoAttributes ()
1677 string xml = @"<foo />";
1678 XmlReader xmlReader =
1679 new XmlTextReader (new StringReader (xml));
1681 Assert (xmlReader.Read ());
1682 AssertEquals (XmlNodeType.Element, xmlReader.NodeType);
1683 Assert (!xmlReader.MoveToFirstAttribute ());
1684 AssertEquals (XmlNodeType.Element, xmlReader.NodeType);
1687 public void TestMoveToNextAttributeWithNoAttributes ()
1689 string xml = @"<foo />";
1690 XmlReader xmlReader =
1691 new XmlTextReader (new StringReader (xml));
1693 Assert (xmlReader.Read ());
1694 AssertEquals (XmlNodeType.Element, xmlReader.NodeType);
1695 Assert (!xmlReader.MoveToNextAttribute ());
1696 AssertEquals (XmlNodeType.Element, xmlReader.NodeType);
1699 public void TestMoveToNextAttribute()
1701 string xml = @"<foo bar=""baz"" quux='quuux'/>";
1702 XmlReader xmlReader =
1703 new XmlTextReader (new StringReader (xml));
1705 AssertStartDocument (xmlReader);
1708 xmlReader, // xmlReader
1709 XmlNodeType.Element, // nodeType
1711 true, // isEmptyElement
1713 String.Empty, // prefix
1715 String.Empty, // namespaceURI
1716 String.Empty, // value
1721 xmlReader, // xmlReader
1723 String.Empty, // prefix
1725 String.Empty, // namespaceURI
1730 xmlReader, // xmlReader
1732 String.Empty, // prefix
1733 "quux", // localName
1734 String.Empty, // namespaceURI
1738 Assert (xmlReader.MoveToNextAttribute ());
1739 Assert ("bar" == xmlReader.Name || "quux" == xmlReader.Name);
1740 Assert ("baz" == xmlReader.Value || "quuux" == xmlReader.Value);
1742 Assert (xmlReader.MoveToNextAttribute ());
1743 Assert ("bar" == xmlReader.Name || "quux" == xmlReader.Name);
1744 Assert ("baz" == xmlReader.Value || "quuux" == xmlReader.Value);
1746 Assert (!xmlReader.MoveToNextAttribute ());
1748 Assert (xmlReader.MoveToElement ());
1751 xmlReader, // xmlReader
1752 XmlNodeType.Element, // nodeType
1754 true, // isEmptyElement
1756 String.Empty, // prefix
1758 String.Empty, // namespaceURI
1759 String.Empty, // value
1763 AssertEndDocument (xmlReader);
1766 public void TestAttributeOrder ()
1768 string xml = @"<foo _1='1' _2='2' _3='3' />";
1769 XmlReader xmlReader =
1770 new XmlTextReader (new StringReader (xml));
1772 Assert (xmlReader.Read ());
1773 AssertEquals (XmlNodeType.Element, xmlReader.NodeType);
1775 Assert (xmlReader.MoveToFirstAttribute ());
1776 AssertEquals ("_1", xmlReader.Name);
1777 Assert (xmlReader.MoveToNextAttribute ());
1778 AssertEquals ("_2", xmlReader.Name);
1779 Assert (xmlReader.MoveToNextAttribute ());
1780 AssertEquals ("_3", xmlReader.Name);
1782 Assert (!xmlReader.MoveToNextAttribute ());