XmlNodeReaderTests.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  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 : Assertion
  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. Fail ("null reference exception is preferable.");
  35. } catch (NullReferenceException) {
  36. }
  37. nrdr = new XmlNodeReader (new XmlDocument ());
  38. nrdr.Read ();
  39. AssertEquals ("newDoc.ReadState", ReadState.Error, nrdr.ReadState);
  40. AssertEquals ("newDoc.EOF", true, nrdr.EOF);
  41. AssertEquals ("newDoc.NodeType", XmlNodeType.None, nrdr.NodeType);
  42. nrdr = new XmlNodeReader (document.CreateDocumentFragment ());
  43. nrdr.Read ();
  44. AssertEquals ("Fragment.ReadState", ReadState.Error, nrdr.ReadState);
  45. AssertEquals ("Fragment.EOF", true, nrdr.EOF);
  46. AssertEquals ("Fragment.NodeType", XmlNodeType.None, nrdr.NodeType);
  47. }
  48. [Test]
  49. public void ReadFromElement ()
  50. {
  51. XmlNodeReader nrdr = new XmlNodeReader (document.DocumentElement);
  52. nrdr.Read ();
  53. AssertEquals ("<root>.NodeType", XmlNodeType.Element, nrdr.NodeType);
  54. AssertEquals ("<root>.Name", "root", nrdr.Name);
  55. AssertEquals ("<root>.ReadState", ReadState.Interactive, nrdr.ReadState);
  56. AssertEquals ("<root>.Depth", 0, nrdr.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. AssertEquals ("initial.ReadState", ReadState.Initial, nrdr.ReadState);
  65. AssertEquals ("initial.EOF", false, nrdr.EOF);
  66. AssertEquals ("initial.NodeType", XmlNodeType.None, nrdr.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. AssertEquals (xml, document.OuterXml);
  77. XmlNodeReader nr = new XmlNodeReader (document);
  78. nr.Read (); // DTD
  79. nr.Read (); // root
  80. nr.Read (); // &ent;
  81. AssertEquals (XmlNodeType.EntityReference, nr.NodeType);
  82. AssertEquals ("depth#1", 1, nr.Depth);
  83. nr.ResolveEntity ();
  84. // It is still entity reference.
  85. AssertEquals (XmlNodeType.EntityReference, nr.NodeType);
  86. nr.Read ();
  87. AssertEquals (XmlNodeType.Text, nr.NodeType);
  88. AssertEquals ("depth#2", 2, nr.Depth);
  89. AssertEquals ("entity string", nr.Value);
  90. nr.Read ();
  91. AssertEquals (XmlNodeType.EndEntity, nr.NodeType);
  92. AssertEquals ("depth#3", 1, nr.Depth);
  93. AssertEquals ("", nr.Value);
  94. nr.Read (); // &ent2;
  95. AssertEquals (XmlNodeType.EntityReference, nr.NodeType);
  96. AssertEquals ("depth#4", 1, nr.Depth);
  97. nr.ResolveEntity ();
  98. AssertEquals (xml, document.OuterXml);
  99. // It is still entity reference.
  100. AssertEquals (XmlNodeType.EntityReference, nr.NodeType);
  101. // It now became element node.
  102. nr.Read ();
  103. AssertEquals (XmlNodeType.Element, nr.NodeType);
  104. AssertEquals ("depth#5", 2, nr.Depth);
  105. AssertEquals (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. AssertEquals (xml, document.OuterXml);
  124. XmlNodeReader nr = new XmlNodeReader (document);
  125. nr.Read (); // DTD
  126. nr.Read (); // root
  127. nr.Read (); // &ent3;
  128. AssertEquals (XmlNodeType.EntityReference, nr.NodeType);
  129. // ent3 does not exists in this dtd.
  130. nr.ResolveEntity ();
  131. AssertEquals (XmlNodeType.EntityReference, nr.NodeType);
  132. nr.Read ();
  133. #if false
  134. // Hmm... MS.NET returned as it is a Text node.
  135. AssertEquals (XmlNodeType.Text, nr.NodeType);
  136. AssertEquals (String.Empty, nr.Value);
  137. nr.Read ();
  138. // Really!?
  139. AssertEquals (XmlNodeType.EndEntity, nr.NodeType);
  140. AssertEquals (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. AssertEquals (xml, document.OuterXml);
  156. XmlNodeReader nr = new XmlNodeReader (document);
  157. nr.Read (); // root
  158. nr.Read (); // &ent;
  159. AssertEquals (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. AssertEquals ("#0", true, nr.IsEmptyElement);
  171. Assert ("#1", !nr.Read ());
  172. document.LoadXml ("<root><child></child></root>");
  173. nr = new XmlNodeReader (
  174. document.DocumentElement.FirstChild);
  175. nr.Read ();
  176. Assert ("#2", nr.Read ());
  177. AssertEquals ("#2.2", false, nr.IsEmptyElement);
  178. Assert ("#3", !nr.Read ());
  179. }
  180. }
  181. }