2 // XmlTextReaderTests.cs
5 // Jason Diamond (jason@injektilo.org)
6 // Martin Willemoes Hansen (mwh@sysrq.dk)
8 // (C) 2001, 2002 Jason Diamond http://injektilo.org/
16 using NUnit.Framework;
18 namespace MonoTests.System.Xml
21 public class XmlTextReaderTests : Assertion
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 ("#Read", xmlReader.Read ());
44 Assert ("#ReadState", xmlReader.ReadState == ReadState.Interactive);
45 Assert (!xmlReader.EOF);
46 AssertNodeValues (xmlReader, nodeType, depth, isEmptyElement, name, prefix, localName, namespaceURI, value, attributeCount);
49 private void AssertNodeValues (
61 AssertEquals ("NodeType", nodeType, xmlReader.NodeType);
62 AssertEquals ("Depth", depth, xmlReader.Depth);
63 AssertEquals ("IsEmptyElement", isEmptyElement, xmlReader.IsEmptyElement);
65 AssertEquals ("name", name, xmlReader.Name);
67 AssertEquals ("prefix", prefix, xmlReader.Prefix);
69 AssertEquals ("localName", localName, xmlReader.LocalName);
71 AssertEquals ("namespaceURI", namespaceURI, xmlReader.NamespaceURI);
73 AssertEquals ("hasValue", (value != String.Empty), xmlReader.HasValue);
75 AssertEquals ("Value", value, xmlReader.Value);
77 AssertEquals ("hasAttributes", attributeCount > 0, xmlReader.HasAttributes);
79 AssertEquals ("attributeCount", attributeCount, xmlReader.AttributeCount);
82 private void AssertAttribute (
90 AssertEquals ("value.Indexer", value, xmlReader [name]);
92 AssertEquals ("value.GetAttribute", value, xmlReader.GetAttribute (name));
94 if (namespaceURI != String.Empty) {
95 Assert (xmlReader[localName, namespaceURI] == value);
96 Assert (xmlReader.GetAttribute (localName, namespaceURI) == value);
100 private void AssertEndDocument (XmlReader xmlReader)
102 Assert ("could read", !xmlReader.Read ());
103 AssertEquals ("NodeType is not XmlNodeType.None", XmlNodeType.None, xmlReader.NodeType);
104 AssertEquals ("Depth is not 0", 0, xmlReader.Depth);
105 AssertEquals ("ReadState is not ReadState.EndOfFile", ReadState.EndOfFile, xmlReader.ReadState);
106 Assert ("not EOF", xmlReader.EOF);
109 AssertEquals ("ReadState is not ReadState.Cosed", ReadState.Closed, xmlReader.ReadState);
113 public void StartAndEndTagWithAttribute ()
115 string xml = @"<foo bar='baz'></foo>";
116 XmlReader xmlReader =
117 new XmlTextReader (new StringReader (xml));
119 AssertStartDocument (xmlReader);
122 xmlReader, // xmlReader
123 XmlNodeType.Element, // nodeType
125 false, // isEmptyElement
127 String.Empty, // prefix
129 String.Empty, // namespaceURI
130 String.Empty, // value
135 xmlReader, // xmlReader
137 String.Empty, // prefix
139 String.Empty, // namespaceURI
144 xmlReader, // xmlReader
145 XmlNodeType.EndElement, // nodeType
147 false, // isEmptyElement
149 String.Empty, // prefix
151 String.Empty, // namespaceURI
152 String.Empty, // value
156 AssertEndDocument (xmlReader);
159 // expecting parser error
161 public void EmptyElementWithBadName ()
163 string xml = "<1foo/>";
164 XmlReader xmlReader =
165 new XmlTextReader (new StringReader (xml));
167 bool caughtXmlException = false;
171 } catch (XmlException) {
172 caughtXmlException = true;
175 Assert(caughtXmlException);
179 public void EmptyElementWithStartAndEndTag ()
181 string xml = "<foo></foo>";
182 XmlReader xmlReader =
183 new XmlTextReader (new StringReader (xml));
185 AssertStartDocument (xmlReader);
188 xmlReader, // xmlReader
189 XmlNodeType.Element, // nodeType
191 false, // isEmptyElement
193 String.Empty, // prefix
195 String.Empty, // namespaceURI
196 String.Empty, // value
201 xmlReader, // xmlReader
202 XmlNodeType.EndElement, // nodeType
204 false, // isEmptyElement
206 String.Empty, // prefix
208 String.Empty, // namespaceURI
209 String.Empty, // value
213 AssertEndDocument (xmlReader);
218 public void EmptyElementWithStartAndEndTagWithWhitespace ()
220 string xml = "<foo ></foo >";
221 XmlReader xmlReader =
222 new XmlTextReader (new StringReader (xml));
224 AssertStartDocument (xmlReader);
227 xmlReader, // xmlReader
228 XmlNodeType.Element, // nodeType
230 false, // isEmptyElement
232 String.Empty, // prefix
234 String.Empty, // namespaceURI
235 String.Empty, // value
240 xmlReader, // xmlReader
241 XmlNodeType.EndElement, // nodeType
243 false, // isEmptyElement
245 String.Empty, // prefix
247 String.Empty, // namespaceURI
248 String.Empty, // value
252 AssertEndDocument (xmlReader);
256 public void EmptyElementWithAttribute ()
258 string xml = @"<foo bar=""baz""/>";
259 XmlReader xmlReader =
260 new XmlTextReader (new StringReader (xml));
262 AssertStartDocument (xmlReader);
265 xmlReader, // xmlReader
266 XmlNodeType.Element, // nodeType
268 true, // isEmptyElement
270 String.Empty, // prefix
272 String.Empty, // namespaceURI
273 String.Empty, // value
278 xmlReader, // xmlReader
280 String.Empty, // prefix
282 String.Empty, // namespaceURI
286 AssertEndDocument (xmlReader);
290 public void EmptyElementInNamespace ()
292 string xml = @"<foo:bar xmlns:foo='http://foo/' />";
293 XmlReader xmlReader =
294 new XmlTextReader (new StringReader (xml));
296 AssertStartDocument (xmlReader);
299 xmlReader, // xmlReader
300 XmlNodeType.Element, // nodeType
302 true, // isEmptyElement
306 "http://foo/", // namespaceURI
307 String.Empty, // value
312 xmlReader, // xmlReader
316 "http://www.w3.org/2000/xmlns/", // namespaceURI
317 "http://foo/" // value
320 AssertEquals ("http://foo/", xmlReader.LookupNamespace ("foo"));
322 AssertEndDocument (xmlReader);
326 public void EntityReferenceInAttribute ()
328 string xml = "<foo bar='&baz;'/>";
329 XmlReader xmlReader =
330 new XmlTextReader (new StringReader (xml));
332 AssertStartDocument (xmlReader);
335 xmlReader, // xmlReader
336 XmlNodeType.Element, // nodeType
338 true, // isEmptyElement
340 String.Empty, // prefix
342 String.Empty, // namespaceURI
343 String.Empty, // value
348 xmlReader, // xmlReader
350 String.Empty, // prefix
352 String.Empty, // namespaceURI
356 AssertEndDocument (xmlReader);
360 public void IsName ()
362 Assert (XmlReader.IsName ("foo"));
363 Assert (!XmlReader.IsName ("1foo"));
364 Assert (!XmlReader.IsName (" foo"));
368 public void IsNameToken ()
370 Assert (XmlReader.IsNameToken ("foo"));
371 Assert (XmlReader.IsNameToken ("1foo"));
372 Assert (!XmlReader.IsNameToken (" foo"));
376 public void FragmentConstructor()
378 XmlDocument doc = new XmlDocument();
379 // doc.LoadXml("<root/>");
381 string xml = @"<foo><bar xmlns=""NSURI"">TEXT NODE</bar></foo>";
382 MemoryStream ms = new MemoryStream(Encoding.Default.GetBytes(xml));
384 XmlParserContext ctx = new XmlParserContext(doc.NameTable, new XmlNamespaceManager(doc.NameTable), "", "", "", "",
385 doc.BaseURI, "", XmlSpace.Default, Encoding.Default);
387 XmlTextReader xmlReader = new XmlTextReader(ms, XmlNodeType.Element, ctx);
388 AssertNode(xmlReader, XmlNodeType.Element, 0, false, "foo", "", "foo", "", "", 0);
390 AssertNode(xmlReader, XmlNodeType.Element, 1, false, "bar", "", "bar", "NSURI", "", 1);
392 AssertNode(xmlReader, XmlNodeType.Text, 2, false, "", "", "", "", "TEXT NODE", 0);
394 AssertNode(xmlReader, XmlNodeType.EndElement, 1, false, "bar", "", "bar", "NSURI", "", 0);
396 AssertNode(xmlReader, XmlNodeType.EndElement, 0, false, "foo", "", "foo", "", "", 0);
398 AssertEndDocument (xmlReader);
402 public void AttributeWithCharacterReference ()
404 string xml = @"<a value='hello & world' />";
405 XmlReader xmlReader =
406 new XmlTextReader (new StringReader (xml));
408 AssertEquals ("hello & world", xmlReader ["value"]);
412 public void AttributeWithEntityReference ()
414 string xml = @"<a value='hello &ent; world' />";
415 XmlReader xmlReader =
416 new XmlTextReader (new StringReader (xml));
418 xmlReader.MoveToFirstAttribute ();
419 xmlReader.ReadAttributeValue ();
420 AssertEquals ("hello ", xmlReader.Value);
421 Assert (xmlReader.ReadAttributeValue ());
422 AssertEquals (XmlNodeType.EntityReference, xmlReader.NodeType);
423 AssertEquals ("ent", xmlReader.Name);
424 AssertEquals (XmlNodeType.EntityReference, xmlReader.NodeType);
425 Assert (xmlReader.ReadAttributeValue ());
426 AssertEquals (" world", xmlReader.Value);
427 AssertEquals (XmlNodeType.Text, xmlReader.NodeType);
428 Assert (!xmlReader.ReadAttributeValue ());
429 AssertEquals (" world", xmlReader.Value); // remains
430 AssertEquals (XmlNodeType.Text, xmlReader.NodeType);
431 xmlReader.ReadAttributeValue ();
432 AssertEquals (XmlNodeType.Text, xmlReader.NodeType);
436 public void QuoteChar ()
438 string xml = @"<a value='hello & world' value2="""" />";
439 XmlReader xmlReader =
440 new XmlTextReader (new StringReader (xml));
442 xmlReader.MoveToFirstAttribute ();
443 AssertEquals ("First", '\'', xmlReader.QuoteChar);
444 xmlReader.MoveToNextAttribute ();
445 AssertEquals ("Next", '"', xmlReader.QuoteChar);
446 xmlReader.MoveToFirstAttribute ();
447 AssertEquals ("First.Again", '\'', xmlReader.QuoteChar);
451 public void ReadInnerXmlWrongInit ()
453 // This behavior is different from XmlNodeReader.
454 XmlReader reader = new XmlTextReader (new StringReader ("<root>test of <b>mixed</b> string.</root>"));
455 reader.ReadInnerXml ();
456 AssertEquals ("initial.ReadState", ReadState.Initial, reader.ReadState);
457 AssertEquals ("initial.EOF", false, reader.EOF);
458 AssertEquals ("initial.NodeType", XmlNodeType.None, reader.NodeType);
462 public void EntityReference ()
464 string xml = "<foo>&bar;</foo>";
465 XmlReader xmlReader = new XmlTextReader (new StringReader (xml));
467 xmlReader, // xmlReader
468 XmlNodeType.Element, // nodeType
470 false, // isEmptyElement
472 String.Empty, // prefix
474 String.Empty, // namespaceURI
475 String.Empty, // value
480 xmlReader, // xmlReader
481 XmlNodeType.EntityReference, // nodeType
483 false, // isEmptyElement
485 String.Empty, // prefix
487 String.Empty, // namespaceURI
488 String.Empty, // value
493 xmlReader, // xmlReader
494 XmlNodeType.EndElement, // nodeType
496 false, // isEmptyElement
498 String.Empty, // prefix
500 String.Empty, // namespaceURI
501 String.Empty, // value
505 AssertEndDocument (xmlReader);
509 public void EntityReferenceInsideText ()
511 string xml = "<foo>bar&baz;quux</foo>";
512 XmlReader xmlReader = new XmlTextReader (new StringReader (xml));
514 xmlReader, // xmlReader
515 XmlNodeType.Element, // nodeType
517 false, // isEmptyElement
519 String.Empty, // prefix
521 String.Empty, // namespaceURI
522 String.Empty, // value
527 xmlReader, // xmlReader
528 XmlNodeType.Text, // nodeType
530 false, // isEmptyElement
531 String.Empty, // name
532 String.Empty, // prefix
533 String.Empty, // localName
534 String.Empty, // namespaceURI
540 xmlReader, // xmlReader
541 XmlNodeType.EntityReference, // nodeType
543 false, // isEmptyElement
545 String.Empty, // prefix
547 String.Empty, // namespaceURI
548 String.Empty, // value
553 xmlReader, // xmlReader
554 XmlNodeType.Text, // nodeType
556 false, // isEmptyElement
557 String.Empty, // name
558 String.Empty, // prefix
559 String.Empty, // localName
560 String.Empty, // namespaceURI
566 xmlReader, // xmlReader
567 XmlNodeType.EndElement, // nodeType
569 false, // isEmptyElement
571 String.Empty, // prefix
573 String.Empty, // namespaceURI
574 String.Empty, // value
578 AssertEndDocument (xmlReader);
582 [ExpectedException (typeof (XmlException))]
583 public void XmlDeclAfterWhitespace ()
585 XmlTextReader xtr = new XmlTextReader (
586 " <?xml version='1.0' ?><root />",
587 XmlNodeType.Document,
590 xtr.Read (); // not-wf xmldecl
595 [ExpectedException (typeof (XmlException))]
596 public void XmlDeclAfterComment ()
598 XmlTextReader xtr = new XmlTextReader (
599 "<!-- comment --><?xml version='1.0' ?><root />",
600 XmlNodeType.Document,
602 xtr.Read (); // comment
603 xtr.Read (); // not-wf xmldecl
608 [ExpectedException (typeof (XmlException))]
609 public void XmlDeclAfterProcessingInstruction ()
611 XmlTextReader xtr = new XmlTextReader (
612 "<?myPI let it go ?><?xml version='1.0' ?><root />",
613 XmlNodeType.Document,
616 xtr.Read (); // not-wf xmldecl
621 [ExpectedException (typeof (XmlException))]
622 public void StartsFromEndElement ()
624 XmlTextReader xtr = new XmlTextReader (
626 XmlNodeType.Document,
633 public void ReadAsElementContent ()
635 XmlTextReader xtr = new XmlTextReader (
636 "<foo /><bar />", XmlNodeType.Element, null);
642 public void ReadAsAttributeContent ()
644 XmlTextReader xtr = new XmlTextReader (
645 "test", XmlNodeType.Attribute, null);
651 public void ExternalDocument ()
653 XmlDocument doc = new XmlDocument ();
654 doc.Load ("Test/XmlFiles/nested-dtd-test.xml");
658 [ExpectedException (typeof (XmlException))]
659 public void NotAllowedCharRef ()
661 string xml = "<root>�</root>";
662 XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null);
663 xtr.Normalization = true;
670 public void NotAllowedCharRefButPassNormalizationFalse ()
672 string xml = "<root>�</root>";
673 XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null);
680 [ExpectedException (typeof (XmlException))]
681 [Ignore ("MS.NET 1.0 fails this test. The related spec is XML rec. 4.1")]
682 public void UndeclaredEntityInIntSubsetOnlyXml ()
684 string ent2 = "<!ENTITY ent2 '<foo/><foo/>'>]>";
685 string dtd = "<!DOCTYPE root[<!ELEMENT root (#PCDATA|foo)*>" + ent2;
686 string xml = dtd + "<root>&ent;&ent2;</root>";
687 XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null);
694 [ExpectedException (typeof (XmlException))]
695 [Ignore ("MS.NET 1.0 fails this test. The related spec is XML rec. 4.1")]
696 public void UndeclaredEntityInStandaloneXml ()
698 string ent2 = "<!ENTITY ent2 '<foo/><foo/>'>]>";
699 string dtd = "<!DOCTYPE root[<!ELEMENT root (#PCDATA|foo)*>" + ent2;
700 string xml = "<?xml version='1.0' standalone='yes' ?>"
701 + dtd + "<root>&ent;</root>";
702 XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null);
709 public void ExpandParameterEntity ()
711 string ent = "<!ENTITY foo \"foo-def\">";
712 string pe = "<!ENTITY % pe '" + ent + "'>";
713 string eldecl = "<!ELEMENT root ANY>";
714 string dtd = "<!DOCTYPE root[" + eldecl + pe + "%pe;]>";
715 string xml = dtd + "<root/>";
716 XmlDocument doc = new XmlDocument ();
718 XmlEntity foo = doc.DocumentType.Entities.GetNamedItem ("foo") as XmlEntity;
720 AssertEquals ("foo-def", foo.InnerText);
724 public void IfNamespacesThenProhibitedAttributes ()
726 string xml = @"<foo _1='1' xmlns:x='urn:x' x:_1='1' />";
727 XmlDocument doc = new XmlDocument ();
732 public void ReadBase64 ()
734 byte [] bytes = new byte [] {4,14,54,114,134,184,254,255};
736 string base64 = "<root><foo>BA42coa44</foo></root>";
737 XmlTextReader xtr = new XmlTextReader (base64, XmlNodeType.Document, null);
738 byte [] bytes2 = new byte [10];
741 this.AssertNodeValues (xtr, XmlNodeType.Element, 1, false, "foo", String.Empty,
742 "foo", String.Empty, String.Empty, 0);
743 AssertEquals (6, xtr.ReadBase64 (bytes2, 0, 10));
744 this.AssertNodeValues (xtr, XmlNodeType.EndElement, 0, false, "root", String.Empty,
745 "root", String.Empty, String.Empty, 0);
746 Assert (!xtr.Read ());
747 AssertEquals (4, bytes2 [0]);
748 AssertEquals (14, bytes2 [1]);
749 AssertEquals (54, bytes2 [2]);
750 AssertEquals (114, bytes2 [3]);
751 AssertEquals (134, bytes2 [4]);
752 AssertEquals (184, bytes2 [5]);
753 AssertEquals (0, bytes2 [6]);
756 xtr = new XmlTextReader (base64, XmlNodeType.Document, null);
757 bytes2 = new byte [10];
760 this.AssertNodeValues (xtr, XmlNodeType.Element, 1, false, "foo", String.Empty,
761 "foo", String.Empty, String.Empty, 0);
763 // Read less than 4 (i.e. one Base64 block)
764 AssertEquals (1, xtr.ReadBase64 (bytes2, 0, 1));
765 this.AssertNodeValues (xtr, XmlNodeType.Element, 1, false, "foo", String.Empty,
766 "foo", String.Empty, String.Empty, 0);
767 AssertEquals (4, bytes2 [0]);
769 AssertEquals (5, xtr.ReadBase64 (bytes2, 0, 10));
770 this.AssertNodeValues (xtr, XmlNodeType.EndElement, 0, false, "root", String.Empty,
771 "root", String.Empty, String.Empty, 0);
772 Assert (!xtr.Read ());
773 AssertEquals (14, bytes2 [0]);
774 AssertEquals (54, bytes2 [1]);
775 AssertEquals (114, bytes2 [2]);
776 AssertEquals (134, bytes2 [3]);
777 AssertEquals (184, bytes2 [4]);
778 AssertEquals (0, bytes2 [5]);
785 public void ReadBase64Test2 ()
787 string xml = "<root/>";
\r
788 XmlTextReader xtr = new XmlTextReader (new StringReader (xml));
\r
790 byte [] data = new byte [1];
\r
791 xtr.ReadBase64 (data, 0, 1);
795 xml = "<root></root>";
\r
796 xtr = new XmlTextReader (new StringReader (xml));
\r
798 xtr.ReadBase64 (data, 0, 1);
804 [ExpectedException (typeof (XmlException))]
805 public void CheckNamespaceValidity1 ()
807 string xml = "<x:root />";
808 XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null);
813 [ExpectedException (typeof (XmlException))]
814 public void CheckNamespaceValidity2 ()
816 string xml = "<root x:attr='val' />";
817 XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null);
822 public void NamespaceFalse ()
824 string xml = "<x:root />";
825 XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null);
826 xtr.Namespaces = false;