2 // XmlTextReaderTests.cs
5 // Jason Diamond (jason@injektilo.org)
7 // (C) 2001, 2002 Jason Diamond http://injektilo.org/
15 using NUnit.Framework;
17 namespace MonoTests.System.Xml
19 public class XmlTextReaderTests : TestCase
21 public XmlTextReaderTests () : base ("MonoTests.System.Xml.XmlTextReaderTests testsuite") { }
22 public XmlTextReaderTests (string name) : base (name) { }
24 private void AssertStartDocument (XmlReader xmlReader)
26 Assert (xmlReader.ReadState == ReadState.Initial);
27 Assert (xmlReader.NodeType == XmlNodeType.None);
28 Assert (xmlReader.Depth == 0);
29 Assert (!xmlReader.EOF);
32 private void AssertNode (
44 Assert (xmlReader.Read ());
45 Assert (xmlReader.ReadState == ReadState.Interactive);
46 Assert (!xmlReader.EOF);
47 AssertNodeValues (xmlReader, nodeType, depth, isEmptyElement, name, prefix, localName, namespaceURI, value, attributeCount);
50 private void AssertNodeValues (
62 AssertEquals ("NodeType", nodeType, xmlReader.NodeType);
63 AssertEquals ("Depth", depth, xmlReader.Depth);
64 AssertEquals ("IsEmptyElement", isEmptyElement, xmlReader.IsEmptyElement);
66 AssertEquals ("name", name, xmlReader.Name);
68 AssertEquals ("prefix", prefix, xmlReader.Prefix);
70 AssertEquals ("localName", localName, xmlReader.LocalName);
72 AssertEquals ("namespaceURI", namespaceURI, xmlReader.NamespaceURI);
74 AssertEquals ("hasValue", (value != String.Empty), xmlReader.HasValue);
76 AssertEquals ("Value", value, xmlReader.Value);
78 AssertEquals ("hasAttributes", attributeCount > 0, xmlReader.HasAttributes);
80 AssertEquals ("attributeCount", attributeCount, xmlReader.AttributeCount);
83 private void AssertAttribute (
91 AssertEquals ("value", value, xmlReader [name]);
93 Assert (xmlReader.GetAttribute (name) == value);
95 if (namespaceURI != String.Empty) {
96 Assert (xmlReader[localName, namespaceURI] == value);
97 Assert (xmlReader.GetAttribute (localName, namespaceURI) == value);
101 private void AssertEndDocument (XmlReader xmlReader)
103 Assert ("could read", !xmlReader.Read ());
104 AssertEquals ("NodeType is not XmlNodeType.None", XmlNodeType.None, xmlReader.NodeType);
105 AssertEquals ("Depth is not 0", 0, xmlReader.Depth);
106 AssertEquals ("ReadState is not ReadState.EndOfFile", ReadState.EndOfFile, xmlReader.ReadState);
107 Assert ("not EOF", xmlReader.EOF);
110 AssertEquals ("ReadState is not ReadState.Cosed", ReadState.Closed, xmlReader.ReadState);
113 public void TestEmptyElement ()
115 string xml = "<foo/>";
116 XmlReader xmlReader =
117 new XmlTextReader (new StringReader (xml));
119 AssertStartDocument (xmlReader);
122 xmlReader, // xmlReader
123 XmlNodeType.Element, // nodeType
125 true, // isEmptyElement
127 String.Empty, // prefix
129 String.Empty, // namespaceURI
130 String.Empty, // value
134 AssertEndDocument (xmlReader);
137 public void TestEmptyElementWithBadName ()
139 string xml = "<1foo/>";
140 XmlReader xmlReader =
141 new XmlTextReader (new StringReader (xml));
143 bool caughtXmlException = false;
147 } catch (XmlException) {
148 caughtXmlException = true;
151 Assert(caughtXmlException);
154 public void TestEmptyElementWithWhitespace ()
156 string xml = "<foo />";
157 XmlReader xmlReader =
158 new XmlTextReader (new StringReader (xml));
160 AssertStartDocument (xmlReader);
163 xmlReader, // xmlReader
164 XmlNodeType.Element, // nodeType
166 true, // isEmptyElement
168 String.Empty, // prefix
170 String.Empty, // namespaceURI
171 String.Empty, // value
175 AssertEndDocument (xmlReader);
178 public void TestEmptyElementWithStartAndEndTag ()
180 string xml = "<foo></foo>";
181 XmlReader xmlReader =
182 new XmlTextReader (new StringReader (xml));
184 AssertStartDocument (xmlReader);
187 xmlReader, // xmlReader
188 XmlNodeType.Element, // nodeType
190 false, // isEmptyElement
192 String.Empty, // prefix
194 String.Empty, // namespaceURI
195 String.Empty, // value
200 xmlReader, // xmlReader
201 XmlNodeType.EndElement, // nodeType
203 false, // isEmptyElement
205 String.Empty, // prefix
207 String.Empty, // namespaceURI
208 String.Empty, // value
212 AssertEndDocument (xmlReader);
215 public void TestEmptyElementWithStartAndEndTagWithWhitespace ()
217 string xml = "<foo ></foo >";
218 XmlReader xmlReader =
219 new XmlTextReader (new StringReader (xml));
221 AssertStartDocument (xmlReader);
224 xmlReader, // xmlReader
225 XmlNodeType.Element, // nodeType
227 false, // isEmptyElement
229 String.Empty, // prefix
231 String.Empty, // namespaceURI
232 String.Empty, // value
237 xmlReader, // xmlReader
238 XmlNodeType.EndElement, // nodeType
240 false, // isEmptyElement
242 String.Empty, // prefix
244 String.Empty, // namespaceURI
245 String.Empty, // value
249 AssertEndDocument (xmlReader);
252 public void TestNestedEmptyTag ()
254 string xml = "<foo><bar/></foo>";
255 XmlReader xmlReader =
256 new XmlTextReader (new StringReader (xml));
258 AssertStartDocument (xmlReader);
261 xmlReader, // xmlReader
262 XmlNodeType.Element, // nodeType
264 false, // isEmptyElement
266 String.Empty, // prefix
268 String.Empty, // namespaceURI
269 String.Empty, // value
274 xmlReader, // xmlReader
275 XmlNodeType.Element, // nodeType
277 true, // isEmptyElement
279 String.Empty, // prefix
281 String.Empty, // namespaceURI
282 String.Empty, // value
287 xmlReader, // xmlReader
288 XmlNodeType.EndElement, // nodeType
290 false, // isEmptyElement
292 String.Empty, // prefix
294 String.Empty, // namespaceURI
295 String.Empty, // value
299 AssertEndDocument (xmlReader);
302 public void TestNestedText ()
304 string xml = "<foo>bar</foo>";
305 XmlReader xmlReader =
306 new XmlTextReader (new StringReader (xml));
308 AssertStartDocument (xmlReader);
311 xmlReader, // xmlReader
312 XmlNodeType.Element, // nodeType
314 false, // isEmptyElement
316 String.Empty, // prefix
318 String.Empty, // namespaceURI
319 String.Empty, // value
324 xmlReader, // xmlReader
325 XmlNodeType.Text, // nodeType
327 false, // isEmptyElement
328 String.Empty, // name
329 String.Empty, // prefix
330 String.Empty, // localName
331 String.Empty, // namespaceURI
337 xmlReader, // xmlReader
338 XmlNodeType.EndElement, // nodeType
340 false, // isEmptyElement
342 String.Empty, // prefix
344 String.Empty, // namespaceURI
345 String.Empty, // value
349 AssertEndDocument (xmlReader);
352 public void TestEmptyElementWithAttribute ()
354 string xml = @"<foo bar=""baz""/>";
355 XmlReader xmlReader =
356 new XmlTextReader (new StringReader (xml));
358 AssertStartDocument (xmlReader);
361 xmlReader, // xmlReader
362 XmlNodeType.Element, // nodeType
364 true, // isEmptyElement
366 String.Empty, // prefix
368 String.Empty, // namespaceURI
369 String.Empty, // value
374 xmlReader, // xmlReader
376 String.Empty, // prefix
378 String.Empty, // namespaceURI
382 AssertEndDocument (xmlReader);
385 public void TestStartAndEndTagWithAttribute ()
387 string xml = @"<foo bar='baz'></foo>";
388 XmlReader xmlReader =
389 new XmlTextReader (new StringReader (xml));
391 AssertStartDocument (xmlReader);
394 xmlReader, // xmlReader
395 XmlNodeType.Element, // nodeType
397 false, // isEmptyElement
399 String.Empty, // prefix
401 String.Empty, // namespaceURI
402 String.Empty, // value
407 xmlReader, // xmlReader
409 String.Empty, // prefix
411 String.Empty, // namespaceURI
416 xmlReader, // xmlReader
417 XmlNodeType.EndElement, // nodeType
419 false, // isEmptyElement
421 String.Empty, // prefix
423 String.Empty, // namespaceURI
424 String.Empty, // value
428 AssertEndDocument (xmlReader);
431 public void TestEmptyElementWithTwoAttributes ()
433 string xml = @"<foo bar=""baz"" quux='quuux'/>";
434 XmlReader xmlReader =
435 new XmlTextReader (new StringReader (xml));
437 AssertStartDocument (xmlReader);
440 xmlReader, // xmlReader
441 XmlNodeType.Element, // nodeType
443 true, // isEmptyElement
445 String.Empty, // prefix
447 String.Empty, // namespaceURI
448 String.Empty, // value
453 xmlReader, // xmlReader
455 String.Empty, // prefix
457 String.Empty, // namespaceURI
462 xmlReader, // xmlReader
464 String.Empty, // prefix
466 String.Empty, // namespaceURI
470 AssertEndDocument (xmlReader);
473 public void TestProcessingInstructionBeforeDocumentElement ()
475 string xml = "<?foo bar?><baz/>";
476 XmlReader xmlReader =
477 new XmlTextReader (new StringReader (xml));
479 AssertStartDocument (xmlReader);
482 xmlReader, // xmlReader
483 XmlNodeType.ProcessingInstruction, // nodeType
485 false, // isEmptyElement
487 String.Empty, // prefix
489 String.Empty, // namespaceURI
495 xmlReader, // xmlReader
496 XmlNodeType.Element, // nodeType
498 true, // isEmptyElement
500 String.Empty, // prefix
502 String.Empty, // namespaceURI
503 String.Empty, // value
507 AssertEndDocument (xmlReader);
510 public void TestCommentBeforeDocumentElement ()
512 string xml = "<!--foo--><bar/>";
513 XmlReader xmlReader =
514 new XmlTextReader (new StringReader (xml));
516 AssertStartDocument (xmlReader);
519 xmlReader, // xmlReader
520 XmlNodeType.Comment, // nodeType
522 false, // isEmptyElement
523 String.Empty, // name
524 String.Empty, // prefix
525 String.Empty, // localName
526 String.Empty, // namespaceURI
532 xmlReader, // xmlReader
533 XmlNodeType.Element, // nodeType
535 true, // isEmptyElement
537 String.Empty, // prefix
539 String.Empty, // namespaceURI
540 String.Empty, // value
544 AssertEndDocument (xmlReader);
547 public void TestPredefinedEntities ()
549 string xml = "<foo><>&'"</foo>";
550 XmlReader xmlReader =
551 new XmlTextReader (new StringReader (xml));
553 AssertStartDocument (xmlReader);
556 xmlReader, // xmlReader
557 XmlNodeType.Element, // nodeType
559 false, // isEmptyElement
561 String.Empty, // prefix
563 String.Empty, // namespaceURI
564 String.Empty, // value
569 xmlReader, // xmlReader
570 XmlNodeType.Text, // nodeType
572 false, // isEmptyElement
573 String.Empty, // name
574 String.Empty, // prefix
575 String.Empty, // localName
576 String.Empty, // namespaceURI
582 xmlReader, // xmlReader
583 XmlNodeType.EndElement, // nodeType
585 false, // isEmptyElement
587 String.Empty, // prefix
589 String.Empty, // namespaceURI
590 String.Empty, // value
594 AssertEndDocument (xmlReader);
597 public void TestEntityReference ()
599 string xml = "<foo>&bar;</foo>";
600 XmlReader xmlReader =
601 new XmlTextReader (new StringReader (xml));
603 AssertStartDocument (xmlReader);
606 xmlReader, // xmlReader
607 XmlNodeType.Element, // nodeType
609 false, // isEmptyElement
611 String.Empty, // prefix
613 String.Empty, // namespaceURI
614 String.Empty, // value
619 xmlReader, // xmlReader
620 XmlNodeType.EntityReference, // nodeType
622 false, // isEmptyElement
624 String.Empty, // prefix
626 String.Empty, // namespaceURI
627 String.Empty, // value
632 xmlReader, // xmlReader
633 XmlNodeType.EndElement, // nodeType
635 false, // isEmptyElement
637 String.Empty, // prefix
639 String.Empty, // namespaceURI
640 String.Empty, // value
644 AssertEndDocument (xmlReader);
647 public void TestEntityReferenceInsideText ()
649 string xml = "<foo>bar&baz;quux</foo>";
650 XmlReader xmlReader =
651 new XmlTextReader (new StringReader (xml));
653 AssertStartDocument (xmlReader);
656 xmlReader, // xmlReader
657 XmlNodeType.Element, // nodeType
659 false, // isEmptyElement
661 String.Empty, // prefix
663 String.Empty, // namespaceURI
664 String.Empty, // value
669 xmlReader, // xmlReader
670 XmlNodeType.Text, // nodeType
672 false, // isEmptyElement
673 String.Empty, // name
674 String.Empty, // prefix
675 String.Empty, // localName
676 String.Empty, // namespaceURI
682 xmlReader, // xmlReader
683 XmlNodeType.EntityReference, // nodeType
685 false, // isEmptyElement
687 String.Empty, // prefix
689 String.Empty, // namespaceURI
690 String.Empty, // value
695 xmlReader, // xmlReader
696 XmlNodeType.Text, // nodeType
698 false, // isEmptyElement
699 String.Empty, // name
700 String.Empty, // prefix
701 String.Empty, // localName
702 String.Empty, // namespaceURI
708 xmlReader, // xmlReader
709 XmlNodeType.EndElement, // nodeType
711 false, // isEmptyElement
713 String.Empty, // prefix
715 String.Empty, // namespaceURI
716 String.Empty, // value
720 AssertEndDocument (xmlReader);
723 public void TestCharacterReferences ()
725 string xml = "<foo>FOO</foo>";
726 XmlReader xmlReader =
727 new XmlTextReader (new StringReader (xml));
729 AssertStartDocument (xmlReader);
732 xmlReader, // xmlReader
733 XmlNodeType.Element, // nodeType
735 false, // isEmptyElement
737 String.Empty, // prefix
739 String.Empty, // namespaceURI
740 String.Empty, // value
745 xmlReader, // xmlReader
746 XmlNodeType.Text, // nodeType
748 false, // isEmptyElement
749 String.Empty, // name
750 String.Empty, // prefix
751 String.Empty, // localName
752 String.Empty, // namespaceURI
758 xmlReader, // xmlReader
759 XmlNodeType.EndElement, // nodeType
761 false, // isEmptyElement
763 String.Empty, // prefix
765 String.Empty, // namespaceURI
766 String.Empty, // value
770 AssertEndDocument (xmlReader);
773 public void TestEntityReferenceInAttribute ()
775 string xml = "<foo bar='&baz;'/>";
776 XmlReader xmlReader =
777 new XmlTextReader (new StringReader (xml));
779 AssertStartDocument (xmlReader);
782 xmlReader, // xmlReader
783 XmlNodeType.Element, // nodeType
785 true, // isEmptyElement
787 String.Empty, // prefix
789 String.Empty, // namespaceURI
790 String.Empty, // value
795 xmlReader, // xmlReader
797 String.Empty, // prefix
799 String.Empty, // namespaceURI
803 AssertEndDocument (xmlReader);
806 public void TestPredefinedEntitiesInAttribute ()
808 string xml = "<foo bar='<>&'"'/>";
809 XmlReader xmlReader =
810 new XmlTextReader (new StringReader (xml));
812 AssertStartDocument (xmlReader);
815 xmlReader, // xmlReader
816 XmlNodeType.Element, // nodeType
818 true, // isEmptyElement
820 String.Empty, // prefix
822 String.Empty, // namespaceURI
823 String.Empty, // value
828 xmlReader, // xmlReader
830 String.Empty, // prefix
832 String.Empty, // namespaceURI
836 AssertEndDocument (xmlReader);
839 public void TestCharacterReferencesInAttribute ()
841 string xml = "<foo bar='FOO'/>";
842 XmlReader xmlReader =
843 new XmlTextReader (new StringReader (xml));
845 AssertStartDocument (xmlReader);
848 xmlReader, // xmlReader
849 XmlNodeType.Element, // nodeType
851 true, // isEmptyElement
853 String.Empty, // prefix
855 String.Empty, // namespaceURI
856 String.Empty, // value
861 xmlReader, // xmlReader
863 String.Empty, // prefix
865 String.Empty, // namespaceURI
869 AssertEndDocument (xmlReader);
872 public void TestCDATA ()
874 string xml = "<foo><![CDATA[<>&]]></foo>";
875 XmlReader xmlReader =
876 new XmlTextReader (new StringReader (xml));
878 AssertStartDocument (xmlReader);
881 xmlReader, // xmlReader
882 XmlNodeType.Element, // nodeType
884 false, // isEmptyElement
886 String.Empty, // prefix
888 String.Empty, // namespaceURI
889 String.Empty, // value
894 xmlReader, // xmlReader
895 XmlNodeType.CDATA, // nodeType
897 false, // isEmptyElement
898 String.Empty, // name
899 String.Empty, // prefix
900 String.Empty, // localName
901 String.Empty, // namespaceURI
907 xmlReader, // xmlReader
908 XmlNodeType.EndElement, // nodeType
910 false, // isEmptyElement
912 String.Empty, // prefix
914 String.Empty, // namespaceURI
915 String.Empty, // value
919 AssertEndDocument (xmlReader);
922 public void TestEmptyElementInNamespace ()
924 string xml = @"<foo:bar xmlns:foo='http://foo/' />";
925 XmlReader xmlReader =
926 new XmlTextReader (new StringReader (xml));
928 AssertStartDocument (xmlReader);
931 xmlReader, // xmlReader
932 XmlNodeType.Element, // nodeType
934 true, // isEmptyElement
938 "http://foo/", // namespaceURI
939 String.Empty, // value
944 xmlReader, // xmlReader
948 "http://www.w3.org/2000/xmlns/", // namespaceURI
949 "http://foo/" // value
952 AssertEquals ("http://foo/", xmlReader.LookupNamespace ("foo"));
954 AssertEndDocument (xmlReader);
957 public void TestEmptyElementInDefaultNamespace ()
959 string xml = @"<foo xmlns='http://foo/' />";
960 XmlReader xmlReader =
961 new XmlTextReader (new StringReader (xml));
963 AssertStartDocument (xmlReader);
966 xmlReader, // xmlReader
967 XmlNodeType.Element, // nodeType
969 true, // isEmptyElement
971 String.Empty, // prefix
973 "http://foo/", // namespaceURI
974 String.Empty, // value
979 xmlReader, // xmlReader
981 String.Empty, // prefix
982 "xmlns", // localName
983 "http://www.w3.org/2000/xmlns/", // namespaceURI
984 "http://foo/" // value
987 AssertEquals ("http://foo/", xmlReader.LookupNamespace (String.Empty));
989 AssertEndDocument (xmlReader);
992 public void TestChildElementInNamespace ()
994 string xml = @"<foo:bar xmlns:foo='http://foo/'><baz:quux xmlns:baz='http://baz/' /></foo:bar>";
995 XmlReader xmlReader =
996 new XmlTextReader (new StringReader (xml));
998 AssertStartDocument (xmlReader);
1001 xmlReader, // xmlReader
1002 XmlNodeType.Element, // nodeType
1004 false, // isEmptyElement
1008 "http://foo/", // namespaceURI
1009 String.Empty, // value
1014 xmlReader, // xmlReader
1015 "xmlns:foo", // name
1018 "http://www.w3.org/2000/xmlns/", // namespaceURI
1019 "http://foo/" // value
1022 AssertEquals ("http://foo/", xmlReader.LookupNamespace ("foo"));
1025 xmlReader, // xmlReader
1026 XmlNodeType.Element, // nodeType
1028 true, // isEmptyElement
1031 "quux", // localName
1032 "http://baz/", // namespaceURI
1033 String.Empty, // value
1038 xmlReader, // xmlReader
1039 "xmlns:baz", // name
1042 "http://www.w3.org/2000/xmlns/", // namespaceURI
1043 "http://baz/" // value
1046 AssertEquals ("http://foo/", xmlReader.LookupNamespace ("foo"));
1047 AssertEquals ("http://baz/", xmlReader.LookupNamespace ("baz"));
1050 xmlReader, // xmlReader
1051 XmlNodeType.EndElement, // nodeType
1053 false, // isEmptyElement
1057 "http://foo/", // namespaceURI
1058 String.Empty, // value
1062 AssertEquals ("http://foo/", xmlReader.LookupNamespace ("foo"));
1063 AssertNull (xmlReader.LookupNamespace ("baz"));
1065 AssertEndDocument (xmlReader);
1068 public void TestChildElementInDefaultNamespace ()
1070 string xml = @"<foo:bar xmlns:foo='http://foo/'><baz xmlns='http://baz/' /></foo:bar>";
1071 XmlReader xmlReader =
1072 new XmlTextReader (new StringReader (xml));
1074 AssertStartDocument (xmlReader);
1077 xmlReader, // xmlReader
1078 XmlNodeType.Element, // nodeType
1080 false, // isEmptyElement
1084 "http://foo/", // namespaceURI
1085 String.Empty, // value
1090 xmlReader, // xmlReader
1091 "xmlns:foo", // name
1094 "http://www.w3.org/2000/xmlns/", // namespaceURI
1095 "http://foo/" // value
1098 AssertEquals ("http://foo/", xmlReader.LookupNamespace ("foo"));
1101 xmlReader, // xmlReader
1102 XmlNodeType.Element, // nodeType
1104 true, // isEmptyElement
1106 String.Empty, // prefix
1108 "http://baz/", // namespaceURI
1109 String.Empty, // value
1114 xmlReader, // xmlReader
1116 String.Empty, // prefix
1117 "xmlns", // localName
1118 "http://www.w3.org/2000/xmlns/", // namespaceURI
1119 "http://baz/" // value
1122 AssertEquals ("http://foo/", xmlReader.LookupNamespace ("foo"));
1123 AssertEquals ("http://baz/", xmlReader.LookupNamespace (String.Empty));
1126 xmlReader, // xmlReader
1127 XmlNodeType.EndElement, // nodeType
1129 false, // isEmptyElement
1133 "http://foo/", // namespaceURI
1134 String.Empty, // value
1138 AssertEquals ("http://foo/", xmlReader.LookupNamespace ("foo"));
1140 AssertEndDocument (xmlReader);
1143 public void TestAttributeInNamespace ()
1145 string xml = @"<foo bar:baz='quux' xmlns:bar='http://bar/' />";
1146 XmlReader xmlReader =
1147 new XmlTextReader (new StringReader (xml));
1149 AssertStartDocument (xmlReader);
1152 xmlReader, // xmlReader
1153 XmlNodeType.Element, // nodeType
1155 true, // isEmptyElement
1157 String.Empty, // prefix
1159 String.Empty, // namespaceURI
1160 String.Empty, // value
1165 xmlReader, // xmlReader
1169 "http://bar/", // namespaceURI
1174 xmlReader, // xmlReader
1175 "xmlns:bar", // name
1178 "http://www.w3.org/2000/xmlns/", // namespaceURI
1179 "http://bar/" // value
1182 AssertEquals ("http://bar/", xmlReader.LookupNamespace ("bar"));
1184 AssertEndDocument (xmlReader);
1187 // The following is #if'ed out because it's specific to the Mono
1188 // implementation and won't compile when testing Microsoft's code.
1189 // Feel free to turn it on if you want to test Mono's name tables.
1193 public void TestIsFirstNameChar ()
1195 for (int ch = 0; ch <= 0xFFFF; ++ch) {
1197 XmlChar.IsFirstNameChar (ch) ==
1198 IsFirstNameChar (ch));
1202 public void TestIsNameChar ()
1204 for (int ch = 0; ch <= 0xFFFF; ++ch) {
1206 XmlChar.IsNameChar (ch) ==
1211 private static bool IsFirstNameChar (int ch)
1219 private static bool IsNameChar (int ch)
1228 IsCombiningChar (ch) ||
1232 private static bool IsLetter (int ch)
1239 private static bool IsBaseChar (int ch)
1242 (ch >= 0x0041 && ch <= 0x005A) ||
1243 (ch >= 0x0061 && ch <= 0x007A) ||
1244 (ch >= 0x00C0 && ch <= 0x00D6) ||
1245 (ch >= 0x00D8 && ch <= 0x00F6) ||
1246 (ch >= 0x00F8 && ch <= 0x00FF) ||
1247 (ch >= 0x0100 && ch <= 0x0131) ||
1248 (ch >= 0x0134 && ch <= 0x013E) ||
1249 (ch >= 0x0141 && ch <= 0x0148) ||
1250 (ch >= 0x014A && ch <= 0x017E) ||
1251 (ch >= 0x0180 && ch <= 0x01C3) ||
1252 (ch >= 0x01CD && ch <= 0x01F0) ||
1253 (ch >= 0x01F4 && ch <= 0x01F5) ||
1254 (ch >= 0x01FA && ch <= 0x0217) ||
1255 (ch >= 0x0250 && ch <= 0x02A8) ||
1256 (ch >= 0x02BB && ch <= 0x02C1) ||
1258 (ch >= 0x0388 && ch <= 0x038A) ||
1260 (ch >= 0x038E && ch <= 0x03A1) ||
1261 (ch >= 0x03A3 && ch <= 0x03CE) ||
1262 (ch >= 0x03D0 && ch <= 0x03D6) ||
1267 (ch >= 0x03E2 && ch <= 0x03F3) ||
1268 (ch >= 0x0401 && ch <= 0x040C) ||
1269 (ch >= 0x040E && ch <= 0x044F) ||
1270 (ch >= 0x0451 && ch <= 0x045C) ||
1271 (ch >= 0x045E && ch <= 0x0481) ||
1272 (ch >= 0x0490 && ch <= 0x04C4) ||
1273 (ch >= 0x04C7 && ch <= 0x04C8) ||
1274 (ch >= 0x04CB && ch <= 0x04CC) ||
1275 (ch >= 0x04D0 && ch <= 0x04EB) ||
1276 (ch >= 0x04EE && ch <= 0x04F5) ||
1277 (ch >= 0x04F8 && ch <= 0x04F9) ||
1278 (ch >= 0x0531 && ch <= 0x0556) ||
1280 (ch >= 0x0561 && ch <= 0x0586) ||
1281 (ch >= 0x05D0 && ch <= 0x05EA) ||
1282 (ch >= 0x05F0 && ch <= 0x05F2) ||
1283 (ch >= 0x0621 && ch <= 0x063A) ||
1284 (ch >= 0x0641 && ch <= 0x064A) ||
1285 (ch >= 0x0671 && ch <= 0x06B7) ||
1286 (ch >= 0x06BA && ch <= 0x06BE) ||
1287 (ch >= 0x06C0 && ch <= 0x06CE) ||
1288 (ch >= 0x06D0 && ch <= 0x06D3) ||
1290 (ch >= 0x06E5 && ch <= 0x06E6) ||
1291 (ch >= 0x0905 && ch <= 0x0939) ||
1293 (ch >= 0x0958 && ch <= 0x0961) ||
1294 (ch >= 0x0985 && ch <= 0x098C) ||
1295 (ch >= 0x098F && ch <= 0x0990) ||
1296 (ch >= 0x0993 && ch <= 0x09A8) ||
1297 (ch >= 0x09AA && ch <= 0x09B0) ||
1299 (ch >= 0x09B6 && ch <= 0x09B9) ||
1300 (ch >= 0x09DC && ch <= 0x09DD) ||
1301 (ch >= 0x09DF && ch <= 0x09E1) ||
1302 (ch >= 0x09F0 && ch <= 0x09F1) ||
1303 (ch >= 0x0A05 && ch <= 0x0A0A) ||
1304 (ch >= 0x0A0F && ch <= 0x0A10) ||
1305 (ch >= 0x0A13 && ch <= 0x0A28) ||
1306 (ch >= 0x0A2A && ch <= 0x0A30) ||
1307 (ch >= 0x0A32 && ch <= 0x0A33) ||
1308 (ch >= 0x0A35 && ch <= 0x0A36) ||
1309 (ch >= 0x0A38 && ch <= 0x0A39) ||
1310 (ch >= 0x0A59 && ch <= 0x0A5C) ||
1312 (ch >= 0x0A72 && ch <= 0x0A74) ||
1313 (ch >= 0x0A85 && ch <= 0x0A8B) ||
1315 (ch >= 0x0A8F && ch <= 0x0A91) ||
1316 (ch >= 0x0A93 && ch <= 0x0AA8) ||
1317 (ch >= 0x0AAA && ch <= 0x0AB0) ||
1318 (ch >= 0x0AB2 && ch <= 0x0AB3) ||
1319 (ch >= 0x0AB5 && ch <= 0x0AB9) ||
1322 (ch >= 0x0B05 && ch <= 0x0B0C) ||
1323 (ch >= 0x0B0F && ch <= 0x0B10) ||
1324 (ch >= 0x0B13 && ch <= 0x0B28) ||
1325 (ch >= 0x0B2A && ch <= 0x0B30) ||
1326 (ch >= 0x0B32 && ch <= 0x0B33) ||
1327 (ch >= 0x0B36 && ch <= 0x0B39) ||
1329 (ch >= 0x0B5C && ch <= 0x0B5D) ||
1330 (ch >= 0x0B5F && ch <= 0x0B61) ||
1331 (ch >= 0x0B85 && ch <= 0x0B8A) ||
1332 (ch >= 0x0B8E && ch <= 0x0B90) ||
1333 (ch >= 0x0B92 && ch <= 0x0B95) ||
1334 (ch >= 0x0B99 && ch <= 0x0B9A) ||
1336 (ch >= 0x0B9E && ch <= 0x0B9F) ||
1337 (ch >= 0x0BA3 && ch <= 0x0BA4) ||
1338 (ch >= 0x0BA8 && ch <= 0x0BAA) ||
1339 (ch >= 0x0BAE && ch <= 0x0BB5) ||
1340 (ch >= 0x0BB7 && ch <= 0x0BB9) ||
1341 (ch >= 0x0C05 && ch <= 0x0C0C) ||
1342 (ch >= 0x0C0E && ch <= 0x0C10) ||
1343 (ch >= 0x0C12 && ch <= 0x0C28) ||
1344 (ch >= 0x0C2A && ch <= 0x0C33) ||
1345 (ch >= 0x0C35 && ch <= 0x0C39) ||
1346 (ch >= 0x0C60 && ch <= 0x0C61) ||
1347 (ch >= 0x0C85 && ch <= 0x0C8C) ||
1348 (ch >= 0x0C8E && ch <= 0x0C90) ||
1349 (ch >= 0x0C92 && ch <= 0x0CA8) ||
1350 (ch >= 0x0CAA && ch <= 0x0CB3) ||
1351 (ch >= 0x0CB5 && ch <= 0x0CB9) ||
1353 (ch >= 0x0CE0 && ch <= 0x0CE1) ||
1354 (ch >= 0x0D05 && ch <= 0x0D0C) ||
1355 (ch >= 0x0D0E && ch <= 0x0D10) ||
1356 (ch >= 0x0D12 && ch <= 0x0D28) ||
1357 (ch >= 0x0D2A && ch <= 0x0D39) ||
1358 (ch >= 0x0D60 && ch <= 0x0D61) ||
1359 (ch >= 0x0E01 && ch <= 0x0E2E) ||
1361 (ch >= 0x0E32 && ch <= 0x0E33) ||
1362 (ch >= 0x0E40 && ch <= 0x0E45) ||
1363 (ch >= 0x0E81 && ch <= 0x0E82) ||
1365 (ch >= 0x0E87 && ch <= 0x0E88) ||
1368 (ch >= 0x0E94 && ch <= 0x0E97) ||
1369 (ch >= 0x0E99 && ch <= 0x0E9F) ||
1370 (ch >= 0x0EA1 && ch <= 0x0EA3) ||
1373 (ch >= 0x0EAA && ch <= 0x0EAB) ||
1374 (ch >= 0x0EAD && ch <= 0x0EAE) ||
1376 (ch >= 0x0EB2 && ch <= 0x0EB3) ||
1378 (ch >= 0x0EC0 && ch <= 0x0EC4) ||
1379 (ch >= 0x0F40 && ch <= 0x0F47) ||
1380 (ch >= 0x0F49 && ch <= 0x0F69) ||
1381 (ch >= 0x10A0 && ch <= 0x10C5) ||
1382 (ch >= 0x10D0 && ch <= 0x10F6) ||
1384 (ch >= 0x1102 && ch <= 0x1103) ||
1385 (ch >= 0x1105 && ch <= 0x1107) ||
1387 (ch >= 0x110B && ch <= 0x110C) ||
1388 (ch >= 0x110E && ch <= 0x1112) ||
1395 (ch >= 0x1154 && ch <= 0x1155) ||
1397 (ch >= 0x115F && ch <= 0x1161) ||
1402 (ch >= 0x116D && ch <= 0x116E) ||
1403 (ch >= 0x1172 && ch <= 0x1173) ||
1408 (ch >= 0x11AE && ch <= 0x11AF) ||
1409 (ch >= 0x11B7 && ch <= 0x11B8) ||
1411 (ch >= 0x11BC && ch <= 0x11C2) ||
1415 (ch >= 0x1E00 && ch <= 0x1E9B) ||
1416 (ch >= 0x1EA0 && ch <= 0x1EF9) ||
1417 (ch >= 0x1F00 && ch <= 0x1F15) ||
1418 (ch >= 0x1F18 && ch <= 0x1F1D) ||
1419 (ch >= 0x1F20 && ch <= 0x1F45) ||
1420 (ch >= 0x1F48 && ch <= 0x1F4D) ||
1421 (ch >= 0x1F50 && ch <= 0x1F57) ||
1425 (ch >= 0x1F5F && ch <= 0x1F7D) ||
1426 (ch >= 0x1F80 && ch <= 0x1FB4) ||
1427 (ch >= 0x1FB6 && ch <= 0x1FBC) ||
1429 (ch >= 0x1FC2 && ch <= 0x1FC4) ||
1430 (ch >= 0x1FC6 && ch <= 0x1FCC) ||
1431 (ch >= 0x1FD0 && ch <= 0x1FD3) ||
1432 (ch >= 0x1FD6 && ch <= 0x1FDB) ||
1433 (ch >= 0x1FE0 && ch <= 0x1FEC) ||
1434 (ch >= 0x1FF2 && ch <= 0x1FF4) ||
1435 (ch >= 0x1FF6 && ch <= 0x1FFC) ||
1437 (ch >= 0x212A && ch <= 0x212B) ||
1439 (ch >= 0x2180 && ch <= 0x2182) ||
1440 (ch >= 0x3041 && ch <= 0x3094) ||
1441 (ch >= 0x30A1 && ch <= 0x30FA) ||
1442 (ch >= 0x3105 && ch <= 0x312C) ||
1443 (ch >= 0xAC00 && ch <= 0xD7A3);
1446 private static bool IsIdeographic (int ch)
1449 (ch >= 0x4E00 && ch <= 0x9FA5) ||
1451 (ch >= 0x3021 && ch <= 0x3029);
1454 private static bool IsDigit (int ch)
1457 (ch >= 0x0030 && ch <= 0x0039) ||
1458 (ch >= 0x0660 && ch <= 0x0669) ||
1459 (ch >= 0x06F0 && ch <= 0x06F9) ||
1460 (ch >= 0x0966 && ch <= 0x096F) ||
1461 (ch >= 0x09E6 && ch <= 0x09EF) ||
1462 (ch >= 0x0A66 && ch <= 0x0A6F) ||
1463 (ch >= 0x0AE6 && ch <= 0x0AEF) ||
1464 (ch >= 0x0B66 && ch <= 0x0B6F) ||
1465 (ch >= 0x0BE7 && ch <= 0x0BEF) ||
1466 (ch >= 0x0C66 && ch <= 0x0C6F) ||
1467 (ch >= 0x0CE6 && ch <= 0x0CEF) ||
1468 (ch >= 0x0D66 && ch <= 0x0D6F) ||
1469 (ch >= 0x0E50 && ch <= 0x0E59) ||
1470 (ch >= 0x0ED0 && ch <= 0x0ED9) ||
1471 (ch >= 0x0F20 && ch <= 0x0F29);
1474 private static bool IsCombiningChar (int ch)
1477 (ch >= 0x0300 && ch <= 0x0345) ||
1478 (ch >= 0x0360 && ch <= 0x0361) ||
1479 (ch >= 0x0483 && ch <= 0x0486) ||
1480 (ch >= 0x0591 && ch <= 0x05A1) ||
1481 (ch >= 0x05A3 && ch <= 0x05B9) ||
1482 (ch >= 0x05BB && ch <= 0x05BD) ||
1484 (ch >= 0x05C1 && ch <= 0x05C2) ||
1486 (ch >= 0x064B && ch <= 0x0652) ||
1488 (ch >= 0x06D6 && ch <= 0x06DC) ||
1489 (ch >= 0x06DD && ch <= 0x06DF) ||
1490 (ch >= 0x06E0 && ch <= 0x06E4) ||
1491 (ch >= 0x06E7 && ch <= 0x06E8) ||
1492 (ch >= 0x06EA && ch <= 0x06ED) ||
1493 (ch >= 0x0901 && ch <= 0x0903) ||
1495 (ch >= 0x093E && ch <= 0x094C) ||
1497 (ch >= 0x0951 && ch <= 0x0954) ||
1498 (ch >= 0x0962 && ch <= 0x0963) ||
1499 (ch >= 0x0981 && ch <= 0x0983) ||
1503 (ch >= 0x09C0 && ch <= 0x09C4) ||
1504 (ch >= 0x09C7 && ch <= 0x09C8) ||
1505 (ch >= 0x09CB && ch <= 0x09CD) ||
1507 (ch >= 0x09E2 && ch <= 0x09E3) ||
1512 (ch >= 0x0A40 && ch <= 0x0A42) ||
1513 (ch >= 0x0A47 && ch <= 0x0A48) ||
1514 (ch >= 0x0A4B && ch <= 0x0A4D) ||
1515 (ch >= 0x0A70 && ch <= 0x0A71) ||
1516 (ch >= 0x0A81 && ch <= 0x0A83) ||
1518 (ch >= 0x0ABE && ch <= 0x0AC5) ||
1519 (ch >= 0x0AC7 && ch <= 0x0AC9) ||
1520 (ch >= 0x0ACB && ch <= 0x0ACD) ||
1521 (ch >= 0x0B01 && ch <= 0x0B03) ||
1523 (ch >= 0x0B3E && ch <= 0x0B43) ||
1524 (ch >= 0x0B47 && ch <= 0x0B48) ||
1525 (ch >= 0x0B4B && ch <= 0x0B4D) ||
1526 (ch >= 0x0B56 && ch <= 0x0B57) ||
1527 (ch >= 0x0B82 && ch <= 0x0B83) ||
1528 (ch >= 0x0BBE && ch <= 0x0BC2) ||
1529 (ch >= 0x0BC6 && ch <= 0x0BC8) ||
1530 (ch >= 0x0BCA && ch <= 0x0BCD) ||
1532 (ch >= 0x0C01 && ch <= 0x0C03) ||
1533 (ch >= 0x0C3E && ch <= 0x0C44) ||
1534 (ch >= 0x0C46 && ch <= 0x0C48) ||
1535 (ch >= 0x0C4A && ch <= 0x0C4D) ||
1536 (ch >= 0x0C55 && ch <= 0x0C56) ||
1537 (ch >= 0x0C82 && ch <= 0x0C83) ||
1538 (ch >= 0x0CBE && ch <= 0x0CC4) ||
1539 (ch >= 0x0CC6 && ch <= 0x0CC8) ||
1540 (ch >= 0x0CCA && ch <= 0x0CCD) ||
1541 (ch >= 0x0CD5 && ch <= 0x0CD6) ||
1542 (ch >= 0x0D02 && ch <= 0x0D03) ||
1543 (ch >= 0x0D3E && ch <= 0x0D43) ||
1544 (ch >= 0x0D46 && ch <= 0x0D48) ||
1545 (ch >= 0x0D4A && ch <= 0x0D4D) ||
1548 (ch >= 0x0E34 && ch <= 0x0E3A) ||
1549 (ch >= 0x0E47 && ch <= 0x0E4E) ||
1551 (ch >= 0x0EB4 && ch <= 0x0EB9) ||
1552 (ch >= 0x0EBB && ch <= 0x0EBC) ||
1553 (ch >= 0x0EC8 && ch <= 0x0ECD) ||
1554 (ch >= 0x0F18 && ch <= 0x0F19) ||
1560 (ch >= 0x0F71 && ch <= 0x0F84) ||
1561 (ch >= 0x0F86 && ch <= 0x0F8B) ||
1562 (ch >= 0x0F90 && ch <= 0x0F95) ||
1564 (ch >= 0x0F99 && ch <= 0x0FAD) ||
1565 (ch >= 0x0FB1 && ch <= 0x0FB7) ||
1567 (ch >= 0x20D0 && ch <= 0x20DC) ||
1569 (ch >= 0x302A && ch <= 0x302F) ||
1574 private static bool IsExtender (int ch)
1585 (ch >= 0x3031 && ch <= 0x3035) ||
1586 (ch >= 0x309D && ch <= 0x309E) ||
1587 (ch >= 0x30FC && ch <= 0x30FE);
1592 public void TestIsName ()
1594 Assert (XmlReader.IsName ("foo"));
1595 Assert (!XmlReader.IsName ("1foo"));
1596 Assert (!XmlReader.IsName (" foo"));
1599 public void TestIsNameToken ()
1601 Assert (XmlReader.IsNameToken ("foo"));
1602 Assert (XmlReader.IsNameToken ("1foo"));
1603 Assert (!XmlReader.IsNameToken (" foo"));
1606 public void TestMoveToElementFromAttribute ()
1608 string xml = @"<foo bar=""baz"" />";
1609 XmlReader xmlReader =
1610 new XmlTextReader (new StringReader (xml));
1612 Assert (xmlReader.Read ());
1613 AssertEquals (XmlNodeType.Element, xmlReader.NodeType);
1614 Assert (xmlReader.MoveToFirstAttribute ());
1615 AssertEquals (XmlNodeType.Attribute, xmlReader.NodeType);
1616 Assert (xmlReader.MoveToElement ());
1617 AssertEquals (XmlNodeType.Element, xmlReader.NodeType);
1620 public void TestMoveToElementFromElement ()
1622 string xml = @"<foo bar=""baz"" />";
1623 XmlReader xmlReader =
1624 new XmlTextReader (new StringReader (xml));
1626 Assert (xmlReader.Read ());
1627 AssertEquals (XmlNodeType.Element, xmlReader.NodeType);
1628 Assert (!xmlReader.MoveToElement ());
1629 AssertEquals (XmlNodeType.Element, xmlReader.NodeType);
1632 public void TestMoveToFirstAttributeWithNoAttributes ()
1634 string xml = @"<foo />";
1635 XmlReader xmlReader =
1636 new XmlTextReader (new StringReader (xml));
1638 Assert (xmlReader.Read ());
1639 AssertEquals (XmlNodeType.Element, xmlReader.NodeType);
1640 Assert (!xmlReader.MoveToFirstAttribute ());
1641 AssertEquals (XmlNodeType.Element, xmlReader.NodeType);
1644 public void TestMoveToNextAttributeWithNoAttributes ()
1646 string xml = @"<foo />";
1647 XmlReader xmlReader =
1648 new XmlTextReader (new StringReader (xml));
1650 Assert (xmlReader.Read ());
1651 AssertEquals (XmlNodeType.Element, xmlReader.NodeType);
1652 Assert (!xmlReader.MoveToNextAttribute ());
1653 AssertEquals (XmlNodeType.Element, xmlReader.NodeType);
1656 public void TestMoveToNextAttribute()
1658 string xml = @"<foo bar=""baz"" quux='quuux'/>";
1659 XmlReader xmlReader =
1660 new XmlTextReader (new StringReader (xml));
1662 AssertStartDocument (xmlReader);
1665 xmlReader, // xmlReader
1666 XmlNodeType.Element, // nodeType
1668 true, // isEmptyElement
1670 String.Empty, // prefix
1672 String.Empty, // namespaceURI
1673 String.Empty, // value
1678 xmlReader, // xmlReader
1680 String.Empty, // prefix
1682 String.Empty, // namespaceURI
1687 xmlReader, // xmlReader
1689 String.Empty, // prefix
1690 "quux", // localName
1691 String.Empty, // namespaceURI
1695 Assert (xmlReader.MoveToNextAttribute ());
1696 Assert ("bar" == xmlReader.Name || "quux" == xmlReader.Name);
1697 Assert ("baz" == xmlReader.Value || "quuux" == xmlReader.Value);
1699 Assert (xmlReader.MoveToNextAttribute ());
1700 Assert ("bar" == xmlReader.Name || "quux" == xmlReader.Name);
1701 Assert ("baz" == xmlReader.Value || "quuux" == xmlReader.Value);
1703 Assert (!xmlReader.MoveToNextAttribute ());
1705 Assert (xmlReader.MoveToElement ());
1708 xmlReader, // xmlReader
1709 XmlNodeType.Element, // nodeType
1711 true, // isEmptyElement
1713 String.Empty, // prefix
1715 String.Empty, // namespaceURI
1716 String.Empty, // value
1720 AssertEndDocument (xmlReader);
1723 public void TestAttributeOrder ()
1725 string xml = @"<foo _1='1' _2='2' _3='3' />";
1726 XmlReader xmlReader =
1727 new XmlTextReader (new StringReader (xml));
1729 Assert (xmlReader.Read ());
1730 AssertEquals (XmlNodeType.Element, xmlReader.NodeType);
1732 Assert (xmlReader.MoveToFirstAttribute ());
1733 AssertEquals ("_1", xmlReader.Name);
1734 Assert (xmlReader.MoveToNextAttribute ());
1735 AssertEquals ("_2", xmlReader.Name);
1736 Assert (xmlReader.MoveToNextAttribute ());
1737 AssertEquals ("_3", xmlReader.Name);
1739 Assert (!xmlReader.MoveToNextAttribute ());
1742 public void TestFragmentConstructor()
1744 XmlDocument doc = new XmlDocument();
1745 // doc.LoadXml("<root/>");
1747 string xml = @"<foo><bar xmlns=""NSURI"">TEXT NODE</bar></foo>";
1748 MemoryStream ms = new MemoryStream(Encoding.Default.GetBytes(xml));
1750 XmlParserContext ctx = new XmlParserContext(doc.NameTable, new XmlNamespaceManager(doc.NameTable), "", "", "", "",
1751 doc.BaseURI, "", XmlSpace.Default, Encoding.Default);
1753 XmlTextReader xmlReader = new XmlTextReader(ms, XmlNodeType.Element, ctx);
1754 AssertNode(xmlReader, XmlNodeType.Element, 0, false, "foo", "", "foo", "", "", 0);
1756 AssertNode(xmlReader, XmlNodeType.Element, 1, false, "bar", "", "bar", "NSURI", "", 1);
1758 AssertNode(xmlReader, XmlNodeType.Text, 2, false, "", "", "", "NSURI", "TEXT NODE", 0);
1760 AssertNode(xmlReader, XmlNodeType.EndElement, 1, false, "bar", "", "bar", "NSURI", "", 0);
1762 AssertNode(xmlReader, XmlNodeType.EndElement, 0, false, "foo", "", "foo", "", "", 0);
1764 AssertEndDocument (xmlReader);
1767 public void TestAttributeWithEntityReference ()
1769 string xml = @"<a value='hello & world' />";
1770 XmlReader xmlReader =
1771 new XmlTextReader (new StringReader (xml));
1773 AssertEquals ("hello & world", xmlReader ["value"]);