Copied remotely
[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 : Assertion\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                                 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                         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
48                         nrdr.Read ();\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
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                         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
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                         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
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                         AssertEquals (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                         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
95                         nr.Read ();\r
96                         AssertEquals (XmlNodeType.Text, nr.NodeType);\r
97                         AssertEquals ("depth#2", 2, nr.Depth);\r
98                         AssertEquals ("entity string", nr.Value);\r
99                         nr.Read ();\r
100                         AssertEquals (XmlNodeType.EndEntity, nr.NodeType);\r
101                         AssertEquals ("depth#3", 1, nr.Depth);\r
102                         AssertEquals ("", nr.Value);\r
103 \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
112                         nr.Read ();\r
113                         AssertEquals (XmlNodeType.Element, nr.NodeType);\r
114                         AssertEquals ("depth#5", 2, nr.Depth);\r
115 \r
116                         AssertEquals (xml, document.OuterXml);\r
117                 }\r
118 \r
119                 [Test]\r
120                 public void ResolveEntity2 ()\r
121                 {\r
122                         document.RemoveAll ();\r
123                         string ent1 = "<!ENTITY ent 'entity string'>";\r
124                         string ent2 = "<!ENTITY ent2 '<foo/><foo/>'>]>";\r
125                         string dtd = "<!DOCTYPE root[<!ELEMENT root (#PCDATA|foo)*>" + ent1 + ent2;\r
126                         string xml = dtd + "<root>&ent3;&ent2;</root>";\r
127                         XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null);\r
128                         xtr.Read ();\r
129                         document.AppendChild (document.ReadNode (xtr));\r
130                         document.AppendChild (document.ReadNode (xtr));\r
131                         xtr.Close ();\r
132                         AssertEquals (xml, document.OuterXml);\r
133                         XmlNodeReader nr = new XmlNodeReader (document);\r
134                         nr.Read ();     // DTD\r
135                         nr.Read ();     // root\r
136                         nr.Read ();     // &ent3;\r
137                         AssertEquals (XmlNodeType.EntityReference, nr.NodeType);\r
138                         // ent3 does not exists in this dtd.\r
139                         nr.ResolveEntity ();\r
140                         AssertEquals (XmlNodeType.EntityReference, nr.NodeType);\r
141                         nr.Read ();\r
142 #if false\r
143                         // Hmm... MS.NET returned as it is a Text node.\r
144                         AssertEquals (XmlNodeType.Text, nr.NodeType);\r
145                         AssertEquals (String.Empty, nr.Value);\r
146                         nr.Read ();\r
147                         // Really!?\r
148                         AssertEquals (XmlNodeType.EndEntity, nr.NodeType);\r
149                         AssertEquals (String.Empty, nr.Value);\r
150 #endif\r
151                 }\r
152 \r
153                 [Test]\r
154                 public void ResolveEntityWithoutDTD ()\r
155                 {\r
156                         document.RemoveAll ();\r
157                         string xml = "<root>&ent;&ent2;</root>";\r
158                         XmlTextReader xtr = new XmlTextReader (xml, XmlNodeType.Document, null);\r
159                         xtr.Read ();\r
160                         document.AppendChild (document.ReadNode (xtr));\r
161                         xtr.Close ();\r
162                         AssertEquals (xml, document.OuterXml);\r
163                         XmlNodeReader nr = new XmlNodeReader (document);\r
164                         nr.Read ();     // root\r
165                         nr.Read ();     // &ent;\r
166                         AssertEquals (XmlNodeType.EntityReference, nr.NodeType);\r
167                         // ent does not exists in this dtd.\r
168                         nr.ResolveEntity ();\r
169                 }\r
170         }\r
171 \r
172 }\r