XmlNodeReaderTests.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. //
  2. // System.Xml.XmlNodeReaderTests
  3. //
  4. // Authors:
  5. // Atsushi Enomoto <[email protected]>
  6. // Martin Willemoes Hansen <[email protected]>
  7. //
  8. // (C) 2003 Atsushi Enomoto
  9. // (C) 2003 Martin Willemoes Hansen
  10. //
  11. //
  12. using System;
  13. using System.IO;
  14. using System.Text;
  15. using System.Xml;
  16. using NUnit.Framework;
  17. namespace MonoTests.System.Xml
  18. {
  19. [TestFixture]
  20. public class XmlNodeReaderTests
  21. {
  22. [SetUp]
  23. public void GetReady ()
  24. {
  25. document.LoadXml ("<root attr1='value1'><child /></root>");
  26. }
  27. XmlDocument document = new XmlDocument ();
  28. [Test]
  29. public void InvalidConstruction ()
  30. {
  31. XmlNodeReader nrdr;
  32. try {
  33. nrdr = new XmlNodeReader (null);
  34. Assert.Fail ("null reference exception is preferable.");
  35. } catch (NullReferenceException) {
  36. }
  37. nrdr = new XmlNodeReader (new XmlDocument ());
  38. nrdr.Read ();
  39. Assert.AreEqual (ReadState.Error, nrdr.ReadState, "newDoc.ReadState");
  40. Assert.AreEqual (true, nrdr.EOF, "newDoc.EOF");
  41. Assert.AreEqual (XmlNodeType.None, nrdr.NodeType, "newDoc.NodeType");
  42. nrdr = new XmlNodeReader (document.CreateDocumentFragment ());
  43. nrdr.Read ();
  44. Assert.AreEqual (ReadState.Error, nrdr.ReadState, "Fragment.ReadState");
  45. Assert.AreEqual (true, nrdr.EOF, "Fragment.EOF");
  46. Assert.AreEqual (XmlNodeType.None, nrdr.NodeType, "Fragment.NodeType");
  47. }
  48. [Test]
  49. public void ReadFromElement ()
  50. {
  51. XmlNodeReader nrdr = new XmlNodeReader (document.DocumentElement);
  52. nrdr.Read ();
  53. Assert.AreEqual (XmlNodeType.Element, nrdr.NodeType, "<root>.NodeType");
  54. Assert.AreEqual ("root", nrdr.Name, "<root>.Name");
  55. Assert.AreEqual (ReadState.Interactive, nrdr.ReadState, "<root>.ReadState");
  56. Assert.AreEqual (0, nrdr.Depth, "<root>.Depth");
  57. }
  58. [Test]
  59. public void ReadInnerXmlWrongInit ()
  60. {
  61. document.LoadXml ("<root>test of <b>mixed</b> string.</root>");
  62. XmlNodeReader nrdr = new XmlNodeReader (document);
  63. nrdr.ReadInnerXml ();
  64. Assert.AreEqual (ReadState.Initial, nrdr.ReadState, "initial.ReadState");
  65. Assert.AreEqual (false, nrdr.EOF, "initial.EOF");
  66. Assert.AreEqual (XmlNodeType.None, nrdr.NodeType, "initial.NodeType");
  67. }
  68. [Test]
  69. public void ResolveEntity ()
  70. {
  71. string ent1 = "<!ENTITY ent 'entity string'>";
  72. string ent2 = "<!ENTITY ent2 '<foo/><foo/>'>]>";
  73. string dtd = "<!DOCTYPE root[<!ELEMENT root (#PCDATA|foo)*>" + ent1 + ent2;
  74. string xml = dtd + "<root>&ent;&ent2;</root>";
  75. document.LoadXml (xml);
  76. Assert.AreEqual (xml, document.OuterXml);
  77. XmlNodeReader nr = new XmlNodeReader (document);
  78. nr.Read (); // DTD
  79. nr.Read (); // root
  80. nr.Read (); // &ent;
  81. Assert.AreEqual (XmlNodeType.EntityReference, nr.NodeType);
  82. Assert.AreEqual (1, nr.Depth, "depth#1");
  83. nr.ResolveEntity ();
  84. // It is still entity reference.
  85. Assert.AreEqual (XmlNodeType.EntityReference, nr.NodeType);
  86. nr.Read ();
  87. Assert.AreEqual (XmlNodeType.Text, nr.NodeType);
  88. Assert.AreEqual (2, nr.Depth, "depth#2");
  89. Assert.AreEqual ("entity string", nr.Value);
  90. nr.Read ();
  91. Assert.AreEqual (XmlNodeType.EndEntity, nr.NodeType);
  92. Assert.AreEqual (1, nr.Depth, "depth#3");
  93. Assert.AreEqual ("", nr.Value);
  94. nr.Read (); // &ent2;
  95. Assert.AreEqual (XmlNodeType.EntityReference, nr.NodeType);
  96. Assert.AreEqual (1, nr.Depth, "depth#4");
  97. nr.ResolveEntity ();
  98. Assert.AreEqual (xml, document.OuterXml);
  99. // It is still entity reference.
  100. Assert.AreEqual (XmlNodeType.EntityReference, nr.NodeType);
  101. // It now became element node.
  102. nr.Read ();
  103. Assert.AreEqual (XmlNodeType.Element, nr.NodeType);
  104. Assert.AreEqual (2, nr.Depth, "depth#5");
  105. Assert.AreEqual (xml, document.OuterXml);
  106. }
  107. [Test]
  108. #if NET_2_0
  109. [Ignore (".NET 2.0 XmlNodeReader does not allow undeclared entities at all.")]
  110. #endif
  111. public void ResolveEntity2 ()
  112. {
  113. document.RemoveAll ();
  114. string ent1 = "<!ENTITY ent 'entity string'>";
  115. string ent2 = "<!ENTITY ent2 '<foo/><foo/>'>]>";
  116. string dtd = "<!DOCTYPE root[<!ELEMENT root (#PCDATA|foo)*>" + ent1 + ent2;
  117. string xml = dtd + "<root>&ent3;&ent2;</root>";
  118. XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null);
  119. xtr.Read ();
  120. document.AppendChild (document.ReadNode (xtr));
  121. document.AppendChild (document.ReadNode (xtr));
  122. xtr.Close ();
  123. Assert.AreEqual (xml, document.OuterXml);
  124. XmlNodeReader nr = new XmlNodeReader (document);
  125. nr.Read (); // DTD
  126. nr.Read (); // root
  127. nr.Read (); // &ent3;
  128. Assert.AreEqual (XmlNodeType.EntityReference, nr.NodeType);
  129. // ent3 does not exists in this dtd.
  130. nr.ResolveEntity ();
  131. Assert.AreEqual (XmlNodeType.EntityReference, nr.NodeType);
  132. nr.Read ();
  133. #if false
  134. // Hmm... MS.NET returned as it is a Text node.
  135. Assert.AreEqual (XmlNodeType.Text, nr.NodeType);
  136. Assert.AreEqual (String.Empty, nr.Value);
  137. nr.Read ();
  138. // Really!?
  139. Assert.AreEqual (XmlNodeType.EndEntity, nr.NodeType);
  140. Assert.AreEqual (String.Empty, nr.Value);
  141. #endif
  142. }
  143. [Test]
  144. #if NET_2_0
  145. [Ignore (".NET 2.0 XmlNodeReader does not allow undeclared entities at all.")]
  146. #endif
  147. public void ResolveEntityWithoutDTD ()
  148. {
  149. document.RemoveAll ();
  150. string xml = "<root>&ent;&ent2;</root>";
  151. XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null);
  152. xtr.Read ();
  153. document.AppendChild (document.ReadNode (xtr));
  154. xtr.Close ();
  155. Assert.AreEqual (xml, document.OuterXml);
  156. XmlNodeReader nr = new XmlNodeReader (document);
  157. nr.Read (); // root
  158. nr.Read (); // &ent;
  159. Assert.AreEqual (XmlNodeType.EntityReference, nr.NodeType);
  160. // ent does not exists in this dtd.
  161. nr.ResolveEntity ();
  162. }
  163. [Test] // bug #76260
  164. public void FromEmptyNonDocumentElement ()
  165. {
  166. document.LoadXml ("<root><child/></root>");
  167. XmlNodeReader nr = new XmlNodeReader (
  168. document.DocumentElement.FirstChild);
  169. nr.Read ();
  170. Assert.AreEqual (true, nr.IsEmptyElement, "#0");
  171. Assert.IsTrue (!nr.Read (), "#1");
  172. document.LoadXml ("<root><child></child></root>");
  173. nr = new XmlNodeReader (
  174. document.DocumentElement.FirstChild);
  175. nr.Read ();
  176. Assert.IsTrue (nr.Read (), "#2");
  177. Assert.AreEqual (false, nr.IsEmptyElement, "#2.2");
  178. Assert.IsTrue (!nr.Read (), "#3");
  179. }
  180. [Test] // bug #550379
  181. public void MoveToNextAttributeFromValue ()
  182. {
  183. document.LoadXml ("<ul test='xxx'></ul>");
  184. XmlNodeReader nr = new XmlNodeReader (document);
  185. nr.Read ();
  186. nr.Read ();
  187. Assert.IsTrue (nr.MoveToFirstAttribute (), "#1");
  188. Assert.IsTrue (nr.ReadAttributeValue (), "#2");
  189. Assert.IsFalse (nr.MoveToNextAttribute (), "#3");
  190. }
  191. }
  192. }