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/>";
788 XmlTextReader xtr
= new XmlTextReader (new StringReader (xml
));
790 byte [] data
= new byte [1];
791 xtr
.ReadBase64 (data
, 0, 1);
795 xml
= "<root></root>";
796 xtr
= new XmlTextReader (new StringReader (xml
));
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;
831 public void NormalizationLineEnd ()
833 string s
= "One\rtwo\nthree\r\nfour";
834 string t
= "<hi><![CDATA[" + s
+ "]]></hi>";
836 XmlTextReader r
= new XmlTextReader (new StringReader (t
));
837 r
.WhitespaceHandling
= WhitespaceHandling
.Significant
;
839 r
.Normalization
= true;
841 s
= r
.ReadElementString ("hi");
842 AssertEquals ("One\ntwo\nthree\nfour", s
);
846 public void NormalizationAttributes ()
848 // does not normalize attribute values.
849 StringReader sr
= new StringReader ("<!DOCTYPE root [<!ELEMENT root EMPTY><!ATTLIST root attr ID #IMPLIED>]><root attr=' value '/>");
850 XmlTextReader xtr
= new XmlTextReader (sr
);
851 xtr
.Normalization
= true;
854 xtr
.MoveToFirstAttribute ();
855 AssertEquals (" value ", xtr
.Value
);
859 public void CloseIsNotAlwaysEOF ()
862 XmlTextReader xtr
= new XmlTextReader (
863 new StringReader ("<a></a><b></b>"));
865 Assert (!xtr
.EOF
); // Close() != EOF
869 public void CloseIsNotAlwaysEOF2 ()
871 XmlTextReader xtr
= new XmlTextReader ("Test/XmlFiles/simple.xml");
873 Assert (!xtr
.EOF
); // Close() != EOF
877 public void IXmlLineInfo ()
880 XmlTextReader aux
= new XmlTextReader (
881 new StringReader ("<all><hello></hello><bug></bug></all>"));
882 AssertEquals (0, aux
.LineNumber
);
883 AssertEquals (0, aux
.LinePosition
);
885 AssertEquals (1, aux
.LineNumber
);
886 AssertEquals (2, aux
.LinePosition
);
888 AssertEquals (1, aux
.LineNumber
);
889 AssertEquals (7, aux
.LinePosition
);
891 AssertEquals (1, aux
.LineNumber
);
892 AssertEquals (22, aux
.LinePosition
);
894 AssertEquals (1, aux
.LineNumber
);
895 AssertEquals (34, aux
.LinePosition
);
897 AssertEquals (1, aux
.LineNumber
);
898 AssertEquals (38, aux
.LinePosition
);
900 AssertEquals (0, aux
.LineNumber
);
901 AssertEquals (0, aux
.LinePosition
);
905 [ExpectedException (typeof (XmlException
))]
906 public void ProhibitDtd ()
908 XmlTextReader xtr
= new XmlTextReader ("<!DOCTYPE root []><root/>", XmlNodeType
.Document
, null);
909 xtr
.ProhibitDtd
= true;
915 public void Settings ()
917 XmlTextReader xtr
= new XmlTextReader ("<root/>", XmlNodeType
.Document
, null);
918 AssertNull (xtr
.Settings
);
921 // Copied from XmlValidatingReaderTests.cs
923 public void ExpandEntity ()
925 string intSubset
= "<!ELEMENT root (#PCDATA)><!ATTLIST root foo CDATA 'foo-def' bar CDATA 'bar-def'><!ENTITY ent 'entity string'>";
926 string dtd
= "<!DOCTYPE root [" + intSubset
+ "]>";
927 string xml
= dtd
+ "<root foo='&ent;' bar='internal &ent; value'>&ent;</root>";
928 XmlTextReader dvr
= new XmlTextReader (xml
, XmlNodeType
.Document
, null);
929 dvr
.EntityHandling
= EntityHandling
.ExpandEntities
;
932 AssertEquals (XmlNodeType
.Element
, dvr
.NodeType
);
933 AssertEquals ("root", dvr
.Name
);
934 Assert (dvr
.MoveToFirstAttribute ());
935 AssertEquals ("foo", dvr
.Name
);
936 AssertEquals ("entity string", dvr
.Value
);
937 Assert (dvr
.MoveToNextAttribute ());
938 AssertEquals ("bar", dvr
.Name
);
939 AssertEquals ("internal entity string value", dvr
.Value
);
940 AssertEquals ("entity string", dvr
.ReadString ());
944 public void PreserveEntity ()
946 string intSubset
= "<!ELEMENT root EMPTY><!ATTLIST root foo CDATA 'foo-def' bar CDATA 'bar-def'><!ENTITY ent 'entity string'>";
947 string dtd
= "<!DOCTYPE root [" + intSubset
+ "]>";
948 string xml
= dtd
+ "<root foo='&ent;' bar='internal &ent; value' />";
949 XmlTextReader dvr
= new XmlTextReader (xml
, XmlNodeType
.Document
, null);
950 dvr
.EntityHandling
= EntityHandling
.ExpandCharEntities
;
953 AssertEquals (XmlNodeType
.Element
, dvr
.NodeType
);
954 AssertEquals ("root", dvr
.Name
);
955 Assert (dvr
.MoveToFirstAttribute ());
956 AssertEquals ("foo", dvr
.Name
);
957 // MS BUG: it returns "entity string", however, entity should not be exanded.
958 AssertEquals ("&ent;", dvr
.Value
);
959 // ReadAttributeValue()
960 Assert (dvr
.ReadAttributeValue ());
961 AssertEquals (XmlNodeType
.EntityReference
, dvr
.NodeType
);
962 AssertEquals ("ent", dvr
.Name
);
963 AssertEquals ("", dvr
.Value
);
964 Assert (!dvr
.ReadAttributeValue ());
967 Assert (dvr
.MoveToNextAttribute ());
968 AssertEquals ("bar", dvr
.Name
);
969 AssertEquals ("internal &ent; value", dvr
.Value
);
970 // ReadAttributeValue()
971 Assert (dvr
.ReadAttributeValue ());
972 AssertEquals (XmlNodeType
.Text
, dvr
.NodeType
);
973 AssertEquals ("", dvr
.Name
);
974 AssertEquals ("internal ", dvr
.Value
);
975 Assert (dvr
.ReadAttributeValue ());
976 AssertEquals (XmlNodeType
.EntityReference
, dvr
.NodeType
);
977 AssertEquals ("ent", dvr
.Name
);
978 AssertEquals ("", dvr
.Value
);
979 Assert (dvr
.ReadAttributeValue ());
980 AssertEquals (XmlNodeType
.Text
, dvr
.NodeType
);
981 AssertEquals ("", dvr
.Name
);
982 AssertEquals (" value", dvr
.Value
);
987 [ExpectedException (typeof (XmlException
))]
988 public void ExpandEntityRejectsUndeclaredEntityAttr ()
990 XmlTextReader xtr
= new XmlTextReader ("<!DOCTYPE root SYSTEM 'foo.dtd'><root attr='&rnt;'>&rnt;</root>", XmlNodeType
.Document
, null);
991 xtr
.EntityHandling
= EntityHandling
.ExpandEntities
;
992 xtr
.XmlResolver
= null;
994 xtr
.Read (); // attribute entity 'rnt' is undeclared
998 [ExpectedException (typeof (XmlException
))]
999 public void ExpandEntityRejectsUndeclaredEntityContent ()
1001 XmlTextReader xtr
= new XmlTextReader ("<!DOCTYPE root SYSTEM 'foo.dtd'><root>&rnt;</root>", XmlNodeType
.Document
, null);
1002 xtr
.EntityHandling
= EntityHandling
.ExpandEntities
;
1003 xtr
.XmlResolver
= null;
1006 xtr
.Read (); // content entity 'rnt' is undeclared
1009 // mostly copied from XmlValidatingReaderTests.
1011 public void ResolveEntity ()
1013 string ent1
= "<!ENTITY ent 'entity string'>";
1014 string ent2
= "<!ENTITY ent2 '<foo/><foo/>'>]>";
1015 string dtd
= "<!DOCTYPE root[<!ELEMENT root (#PCDATA|foo)*>" + ent1
+ ent2
;
1016 string xml
= dtd
+ "<root>&ent;&ent2;</root>";
1017 XmlTextReader dvr
= new XmlTextReader (xml
, XmlNodeType
.Document
, null);
1018 dvr
.EntityHandling
= EntityHandling
.ExpandCharEntities
;
1020 dvr
.Read (); // root
1021 dvr
.Read (); // &ent;
1022 AssertEquals (XmlNodeType
.EntityReference
, dvr
.NodeType
);
1023 AssertEquals (1, dvr
.Depth
);
1024 dvr
.ResolveEntity ();
1025 // It is still entity reference.
1026 AssertEquals (XmlNodeType
.EntityReference
, dvr
.NodeType
);
1028 AssertEquals (XmlNodeType
.Text
, dvr
.NodeType
);
1029 AssertEquals (2, dvr
.Depth
);
1030 AssertEquals ("entity string", dvr
.Value
);
1032 AssertEquals (XmlNodeType
.EndEntity
, dvr
.NodeType
);
1033 AssertEquals (1, dvr
.Depth
);
1034 AssertEquals ("", dvr
.Value
);
1036 dvr
.Read (); // &ent2;
1037 AssertEquals (XmlNodeType
.EntityReference
, dvr
.NodeType
);
1038 AssertEquals (1, dvr
.Depth
);
1039 dvr
.ResolveEntity ();
1040 // It is still entity reference.
1041 AssertEquals (XmlNodeType
.EntityReference
, dvr
.NodeType
);
1042 // It now became element node.
1044 AssertEquals (XmlNodeType
.Element
, dvr
.NodeType
);
1045 AssertEquals (2, dvr
.Depth
);
1048 // mostly copied from XmlValidatingReaderTests.
1050 public void ResolveEntity2 ()
1052 string ent1
= "<!ENTITY ent 'entity string'>";
1053 string ent2
= "<!ENTITY ent2 '<foo/><foo/>'>]>";
1054 string dtd
= "<!DOCTYPE root[<!ELEMENT root (#PCDATA|foo)*>" + ent1
+ ent2
;
1055 string xml
= dtd
+ "<root>&ent3;&ent2;</root>";
1056 XmlTextReader dvr
= new XmlTextReader (xml
, XmlNodeType
.Document
, null);
1057 dvr
.EntityHandling
= EntityHandling
.ExpandCharEntities
;
1059 dvr
.Read (); // root
1060 dvr
.Read (); // &ent3;
1061 AssertEquals (XmlNodeType
.EntityReference
, dvr
.NodeType
);
1062 // ent3 does not exists in this dtd.
1063 AssertEquals (XmlNodeType
.EntityReference
, dvr
.NodeType
);
1065 dvr
.ResolveEntity ();
1066 Fail ("Attempt to resolve undeclared entity should fail.");
1067 } catch (XmlException
) {