2 // System.Xml.XmlNodeReaderTests
\r
5 // Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
\r
6 // Martin Willemoes Hansen <mwh@sysrq.dk>
\r
8 // (C) 2003 Atsushi Enomoto
\r
9 // (C) 2003 Martin Willemoes Hansen
\r
18 using NUnit.Framework;
\r
20 namespace MonoTests.System.Xml
\r
23 public class XmlNodeReaderTests : Assertion
\r
26 public void GetReady ()
\r
28 document.LoadXml ("<root attr1='value1'><child /></root>");
\r
31 XmlDocument document = new XmlDocument ();
\r
34 public void InvalidConstruction ()
\r
38 nrdr = new XmlNodeReader (null);
\r
39 Fail ("null reference exception is preferable.");
\r
40 } catch (NullReferenceException) {
\r
42 nrdr = new XmlNodeReader (new XmlDocument ());
\r
44 AssertEquals ("newDoc.ReadState", ReadState.Error, nrdr.ReadState);
\r
45 AssertEquals ("newDoc.EOF", true, nrdr.EOF);
\r
46 AssertEquals ("newDoc.NodeType", XmlNodeType.None, nrdr.NodeType);
\r
47 nrdr = new XmlNodeReader (document.CreateDocumentFragment ());
\r
49 AssertEquals ("Fragment.ReadState", ReadState.Error, nrdr.ReadState);
\r
50 AssertEquals ("Fragment.EOF", true, nrdr.EOF);
\r
51 AssertEquals ("Fragment.NodeType", XmlNodeType.None, nrdr.NodeType);
\r
55 public void ReadFromElement ()
\r
57 XmlNodeReader nrdr = new XmlNodeReader (document.DocumentElement);
\r
59 AssertEquals ("<root>.NodeType", XmlNodeType.Element, nrdr.NodeType);
\r
60 AssertEquals ("<root>.Name", "root", nrdr.Name);
\r
61 AssertEquals ("<root>.ReadState", ReadState.Interactive, nrdr.ReadState);
\r
62 AssertEquals ("<root>.Depth", 0, nrdr.Depth);
\r
67 public void ReadInnerXmlWrongInit ()
\r
69 document.LoadXml ("<root>test of <b>mixed</b> string.</root>");
\r
70 XmlNodeReader nrdr = new XmlNodeReader (document);
\r
71 nrdr.ReadInnerXml ();
\r
72 AssertEquals ("initial.ReadState", ReadState.Initial, nrdr.ReadState);
\r
73 AssertEquals ("initial.EOF", false, nrdr.EOF);
\r
74 AssertEquals ("initial.NodeType", XmlNodeType.None, nrdr.NodeType);
\r
78 public void ResolveEntity ()
\r
80 string ent1 = "<!ENTITY ent 'entity string'>";
\r
81 string ent2 = "<!ENTITY ent2 '<foo/><foo/>'>]>";
\r
82 string dtd = "<!DOCTYPE root[<!ELEMENT root (#PCDATA|foo)*>" + ent1 + ent2;
\r
83 string xml = dtd + "<root>&ent;&ent2;</root>";
\r
84 document.LoadXml (xml);
\r
85 AssertEquals (xml, document.OuterXml);
\r
86 XmlNodeReader nr = new XmlNodeReader (document);
\r
89 nr.Read (); // &ent;
\r
90 AssertEquals (XmlNodeType.EntityReference, nr.NodeType);
\r
91 AssertEquals ("depth#1", 1, nr.Depth);
\r
92 nr.ResolveEntity ();
\r
93 // It is still entity reference.
\r
94 AssertEquals (XmlNodeType.EntityReference, nr.NodeType);
\r
96 AssertEquals (XmlNodeType.Text, nr.NodeType);
\r
97 AssertEquals ("depth#2", 2, nr.Depth);
\r
98 AssertEquals ("entity string", nr.Value);
\r
100 AssertEquals (XmlNodeType.EndEntity, nr.NodeType);
\r
101 AssertEquals ("depth#3", 1, nr.Depth);
\r
102 AssertEquals ("", nr.Value);
\r
104 nr.Read (); // &ent2;
\r
105 AssertEquals (XmlNodeType.EntityReference, nr.NodeType);
\r
106 AssertEquals ("depth#4", 1, nr.Depth);
\r
107 nr.ResolveEntity ();
\r
108 AssertEquals (xml, document.OuterXml);
\r
109 // It is still entity reference.
\r
110 AssertEquals (XmlNodeType.EntityReference, nr.NodeType);
\r
111 // It now became element node.
\r
113 AssertEquals (XmlNodeType.Element, nr.NodeType);
\r
114 AssertEquals ("depth#5", 2, nr.Depth);
\r
116 AssertEquals (xml, document.OuterXml);
\r
121 [Ignore (".NET 2.0 XmlNodeReader does not allow undeclared entities at all.")]
\r
123 public void ResolveEntity2 ()
\r
125 document.RemoveAll ();
\r
126 string ent1 = "<!ENTITY ent 'entity string'>";
\r
127 string ent2 = "<!ENTITY ent2 '<foo/><foo/>'>]>";
\r
128 string dtd = "<!DOCTYPE root[<!ELEMENT root (#PCDATA|foo)*>" + ent1 + ent2;
\r
129 string xml = dtd + "<root>&ent3;&ent2;</root>";
\r
130 XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null);
\r
132 document.AppendChild (document.ReadNode (xtr));
\r
133 document.AppendChild (document.ReadNode (xtr));
\r
135 AssertEquals (xml, document.OuterXml);
\r
136 XmlNodeReader nr = new XmlNodeReader (document);
\r
138 nr.Read (); // root
\r
139 nr.Read (); // &ent3;
\r
140 AssertEquals (XmlNodeType.EntityReference, nr.NodeType);
\r
141 // ent3 does not exists in this dtd.
\r
142 nr.ResolveEntity ();
\r
143 AssertEquals (XmlNodeType.EntityReference, nr.NodeType);
\r
146 // Hmm... MS.NET returned as it is a Text node.
\r
147 AssertEquals (XmlNodeType.Text, nr.NodeType);
\r
148 AssertEquals (String.Empty, nr.Value);
\r
151 AssertEquals (XmlNodeType.EndEntity, nr.NodeType);
\r
152 AssertEquals (String.Empty, nr.Value);
\r
158 [Ignore (".NET 2.0 XmlNodeReader does not allow undeclared entities at all.")]
\r
160 public void ResolveEntityWithoutDTD ()
\r
162 document.RemoveAll ();
\r
163 string xml = "<root>&ent;&ent2;</root>";
\r
164 XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null);
\r
166 document.AppendChild (document.ReadNode (xtr));
\r
168 AssertEquals (xml, document.OuterXml);
\r
169 XmlNodeReader nr = new XmlNodeReader (document);
\r
170 nr.Read (); // root
\r
171 nr.Read (); // &ent;
\r
172 AssertEquals (XmlNodeType.EntityReference, nr.NodeType);
\r
173 // ent does not exists in this dtd.
\r
174 nr.ResolveEntity ();
\r
177 [Test] // bug #76260
\r
178 public void FromEmptyNonDocumentElement ()
\r
180 document.LoadXml ("<root><child/></root>");
\r
181 XmlNodeReader nr = new XmlNodeReader (
\r
182 document.DocumentElement.FirstChild);
\r
184 Assert ("#1", !nr.Read ());
\r
186 document.LoadXml ("<root><child></child></root>");
\r
187 nr = new XmlNodeReader (
\r
188 document.DocumentElement.FirstChild);
\r
190 Assert ("#2", nr.Read ());
\r
191 Assert ("#3", !nr.Read ());
\r