Merge pull request #900 from Blewzman/FixAggregateExceptionGetBaseException
[mono.git] / mcs / class / System.XML / Test / System.Xml / XmlNodeReaderTests.cs
1 //\r
2 // System.Xml.XmlNodeReaderTests\r
3 //\r
4 // Authors:\r
5 //   Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>\r
6 //   Martin Willemoes Hansen <mwh@sysrq.dk>\r
7 //\r
8 // (C) 2003 Atsushi Enomoto\r
9 // (C) 2003 Martin Willemoes Hansen\r
10 //\r
11 //\r
12 \r
13 using System;\r
14 using System.IO;\r
15 using System.Text;\r
16 using System.Xml;\r
17 \r
18 using NUnit.Framework;\r
19 \r
20 namespace MonoTests.System.Xml\r
21 {\r
22         [TestFixture]\r
23         public class XmlNodeReaderTests\r
24         {\r
25                 [SetUp]\r
26                 public void GetReady ()\r
27                 {\r
28                         document.LoadXml ("<root attr1='value1'><child /></root>");\r
29                 }\r
30 \r
31                 XmlDocument document = new XmlDocument ();\r
32 \r
33                 [Test]\r
34                 public void InvalidConstruction ()\r
35                 {\r
36                         XmlNodeReader nrdr;\r
37                         try {\r
38                                 nrdr = new XmlNodeReader (null);\r
39                                 Assert.Fail ("null reference exception is preferable.");\r
40                         } catch (NullReferenceException) {\r
41                         }\r
42                         nrdr = new XmlNodeReader (new XmlDocument ());\r
43                         nrdr.Read ();\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
48                         nrdr.Read ();\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
52                 }\r
53 \r
54                 [Test]\r
55                 public void ReadFromElement ()\r
56                 {\r
57                         XmlNodeReader nrdr = new XmlNodeReader (document.DocumentElement);\r
58                         nrdr.Read ();\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
63                 }\r
64 \r
65 \r
66                 [Test]\r
67                 public void ReadInnerXmlWrongInit ()\r
68                 {\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
75                 }\r
76 \r
77                 [Test]\r
78                 public void ResolveEntity ()\r
79                 {\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
87                         nr.Read ();     // DTD\r
88                         nr.Read ();     // root\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
95                         nr.Read ();\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
99                         nr.Read ();\r
100                         Assert.AreEqual (XmlNodeType.EndEntity, nr.NodeType);\r
101                         Assert.AreEqual (1, nr.Depth, "depth#3");\r
102                         Assert.AreEqual ("", nr.Value);\r
103 \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
112                         nr.Read ();\r
113                         Assert.AreEqual (XmlNodeType.Element, nr.NodeType);\r
114                         Assert.AreEqual (2, nr.Depth, "depth#5");\r
115 \r
116                         Assert.AreEqual (xml, document.OuterXml);\r
117                 }\r
118 \r
119                 [Test]\r
120 #if NET_2_0\r
121                 [Ignore (".NET 2.0 XmlNodeReader does not allow undeclared entities at all.")]\r
122 #endif\r
123                 public void ResolveEntity2 ()\r
124                 {\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
131                         xtr.Read ();\r
132                         document.AppendChild (document.ReadNode (xtr));\r
133                         document.AppendChild (document.ReadNode (xtr));\r
134                         xtr.Close ();\r
135                         Assert.AreEqual (xml, document.OuterXml);\r
136                         XmlNodeReader nr = new XmlNodeReader (document);\r
137                         nr.Read ();     // DTD\r
138                         nr.Read ();     // root\r
139                         nr.Read ();     // &ent3;\r
140                         Assert.AreEqual (XmlNodeType.EntityReference, nr.NodeType);\r
141                         // ent3 does not exist in this dtd.\r
142                         nr.ResolveEntity ();\r
143                         Assert.AreEqual (XmlNodeType.EntityReference, nr.NodeType);\r
144                         nr.Read ();\r
145 #if false\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
149                         nr.Read ();\r
150                         // Really!?\r
151                         Assert.AreEqual (XmlNodeType.EndEntity, nr.NodeType);\r
152                         Assert.AreEqual (String.Empty, nr.Value);\r
153 #endif\r
154                 }\r
155 \r
156                 [Test]\r
157 #if NET_2_0\r
158                 [Ignore (".NET 2.0 XmlNodeReader does not allow undeclared entities at all.")]\r
159 #endif\r
160                 public void ResolveEntityWithoutDTD ()\r
161                 {\r
162                         document.RemoveAll ();\r
163                         string xml = "<root>&ent;&ent2;</root>";\r
164                         XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null);\r
165                         xtr.Read ();\r
166                         document.AppendChild (document.ReadNode (xtr));\r
167                         xtr.Close ();\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 exist in this dtd.\r
174                         nr.ResolveEntity ();\r
175                 }\r
176 \r
177                 [Test] // bug #76260\r
178                 public void FromEmptyNonDocumentElement ()\r
179                 {\r
180                         document.LoadXml ("<root><child/></root>");\r
181                         XmlNodeReader nr = new XmlNodeReader (\r
182                                 document.DocumentElement.FirstChild);\r
183                         nr.Read ();\r
184                         Assert.AreEqual (true, nr.IsEmptyElement, "#0");\r
185                         Assert.IsTrue (!nr.Read (), "#1");\r
186 \r
187                         document.LoadXml ("<root><child></child></root>");\r
188                         nr = new XmlNodeReader (\r
189                                 document.DocumentElement.FirstChild);\r
190                         nr.Read ();\r
191                         Assert.IsTrue (nr.Read (), "#2");\r
192                         Assert.AreEqual (false, nr.IsEmptyElement, "#2.2");\r
193                         Assert.IsTrue (!nr.Read (), "#3");\r
194                 }\r
195                 \r
196                 [Test] // bug #550379\r
197                 public void MoveToNextAttributeFromValue ()\r
198                 {\r
199                         document.LoadXml ("<ul test='xxx'></ul>");\r
200                         XmlNodeReader nr = new XmlNodeReader (document);\r
201                         nr.Read ();\r
202                         nr.Read ();\r
203                         Assert.IsTrue (nr.MoveToFirstAttribute (), "#1");\r
204                         Assert.IsTrue (nr.ReadAttributeValue (), "#2");\r
205                         Assert.IsFalse (nr.MoveToNextAttribute (), "#3");\r
206                 }\r
207         }\r
208 \r
209 }\r