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
\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 Assert.Fail ("null reference exception is preferable.");
\r
40 } catch (NullReferenceException) {
\r
42 nrdr = new XmlNodeReader (new XmlDocument ());
\r
44 Assert.AreEqual (ReadState.Error, nrdr.ReadState, "newDoc.ReadState");
\r
45 Assert.AreEqual (true, nrdr.EOF, "newDoc.EOF");
\r
46 Assert.AreEqual (XmlNodeType.None, nrdr.NodeType, "newDoc.NodeType");
\r
47 nrdr = new XmlNodeReader (document.CreateDocumentFragment ());
\r
49 Assert.AreEqual (ReadState.Error, nrdr.ReadState, "Fragment.ReadState");
\r
50 Assert.AreEqual (true, nrdr.EOF, "Fragment.EOF");
\r
51 Assert.AreEqual (XmlNodeType.None, nrdr.NodeType, "Fragment.NodeType");
\r
55 public void ReadFromElement ()
\r
57 XmlNodeReader nrdr = new XmlNodeReader (document.DocumentElement);
\r
59 Assert.AreEqual (XmlNodeType.Element, nrdr.NodeType, "<root>.NodeType");
\r
60 Assert.AreEqual ("root", nrdr.Name, "<root>.Name");
\r
61 Assert.AreEqual (ReadState.Interactive, nrdr.ReadState, "<root>.ReadState");
\r
62 Assert.AreEqual (0, nrdr.Depth, "<root>.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 Assert.AreEqual (ReadState.Initial, nrdr.ReadState, "initial.ReadState");
\r
73 Assert.AreEqual (false, nrdr.EOF, "initial.EOF");
\r
74 Assert.AreEqual (XmlNodeType.None, nrdr.NodeType, "initial.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 Assert.AreEqual (xml, document.OuterXml);
\r
86 XmlNodeReader nr = new XmlNodeReader (document);
\r
89 nr.Read (); // &ent;
\r
90 Assert.AreEqual (XmlNodeType.EntityReference, nr.NodeType);
\r
91 Assert.AreEqual (1, nr.Depth, "depth#1");
\r
92 nr.ResolveEntity ();
\r
93 // It is still entity reference.
\r
94 Assert.AreEqual (XmlNodeType.EntityReference, nr.NodeType);
\r
96 Assert.AreEqual (XmlNodeType.Text, nr.NodeType);
\r
97 Assert.AreEqual (2, nr.Depth, "depth#2");
\r
98 Assert.AreEqual ("entity string", nr.Value);
\r
100 Assert.AreEqual (XmlNodeType.EndEntity, nr.NodeType);
\r
101 Assert.AreEqual (1, nr.Depth, "depth#3");
\r
102 Assert.AreEqual ("", nr.Value);
\r
104 nr.Read (); // &ent2;
\r
105 Assert.AreEqual (XmlNodeType.EntityReference, nr.NodeType);
\r
106 Assert.AreEqual (1, nr.Depth, "depth#4");
\r
107 nr.ResolveEntity ();
\r
108 Assert.AreEqual (xml, document.OuterXml);
\r
109 // It is still entity reference.
\r
110 Assert.AreEqual (XmlNodeType.EntityReference, nr.NodeType);
\r
111 // It now became element node.
\r
113 Assert.AreEqual (XmlNodeType.Element, nr.NodeType);
\r
114 Assert.AreEqual (2, nr.Depth, "depth#5");
\r
116 Assert.AreEqual (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 Assert.AreEqual (xml, document.OuterXml);
\r
136 XmlNodeReader nr = new XmlNodeReader (document);
\r
138 nr.Read (); // root
\r
139 nr.Read (); // &ent3;
\r
140 Assert.AreEqual (XmlNodeType.EntityReference, nr.NodeType);
\r
141 // ent3 does not exists in this dtd.
\r
142 nr.ResolveEntity ();
\r
143 Assert.AreEqual (XmlNodeType.EntityReference, nr.NodeType);
\r
146 // Hmm... MS.NET returned as it is a Text node.
\r
147 Assert.AreEqual (XmlNodeType.Text, nr.NodeType);
\r
148 Assert.AreEqual (String.Empty, nr.Value);
\r
151 Assert.AreEqual (XmlNodeType.EndEntity, nr.NodeType);
\r
152 Assert.AreEqual (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 Assert.AreEqual (xml, document.OuterXml);
\r
169 XmlNodeReader nr = new XmlNodeReader (document);
\r
170 nr.Read (); // root
\r
171 nr.Read (); // &ent;
\r
172 Assert.AreEqual (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.AreEqual (true, nr.IsEmptyElement, "#0");
\r
185 Assert.IsTrue (!nr.Read (), "#1");
\r
187 document.LoadXml ("<root><child></child></root>");
\r
188 nr = new XmlNodeReader (
\r
189 document.DocumentElement.FirstChild);
\r
191 Assert.IsTrue (nr.Read (), "#2");
\r
192 Assert.AreEqual (false, nr.IsEmptyElement, "#2.2");
\r
193 Assert.IsTrue (!nr.Read (), "#3");
\r