Can now scan most location paths (without predicates).
[mono.git] / mcs / class / System.XML / Test / XmlNodeListTests.cs
1 using System;
2 using System.Xml;
3 using System.Collections;
4
5 using NUnit.Framework;
6
7 namespace Ximian.Mono.Tests
8 {
9         public class XmlNodeListTests : TestCase
10         {
11                 public XmlNodeListTests () : base ("Ximian.Mono.Tests.XmlNodeListTests testsuite") {}
12                 public XmlNodeListTests (string name) : base (name) {}
13                 
14                 XmlDocument document;
15                 XmlElement documentElement;
16                 XmlElement element;
17                 XmlNode node;
18                 Object obj;
19                 IEnumerator enumerator;
20                 int index;
21                 
22                 protected override void SetUp ()
23                 {
24                         document = new XmlDocument ();
25                 }
26
27                 public void TestNodeTypesThatCantHaveChildren ()
28                 {
29                         document.LoadXml ("<foo>bar</foo>");
30                         documentElement = document.DocumentElement;
31                         node = documentElement.FirstChild;
32                         AssertEquals ("Expected a text node.", node.NodeType, XmlNodeType.Text);
33                         AssertEquals ("Shouldn't have children.", node.HasChildNodes, false);
34                         AssertEquals ("Should be empty node list.", node.ChildNodes.Count, 0);
35                         AssertEquals ("Should be empty node list.", node.GetEnumerator().MoveNext(), false);
36                 }
37
38                 public void TestZeroChildren ()
39                 {
40                         document.LoadXml ("<foo/>");
41                         documentElement = document.DocumentElement;
42                         AssertEquals ("Should be empty node list.", documentElement.GetEnumerator().MoveNext(), false);
43                 }
44
45                 public void TestOneChild ()
46                 {
47                         document.LoadXml ("<foo><child1/></foo>");
48                         documentElement = document.DocumentElement;
49                         AssertEquals ("Incorrect number of children returned from Count property.", documentElement.ChildNodes.Count, 1);
50                         index = 1;
51                         foreach (XmlNode childNode in documentElement.ChildNodes) 
52                         {
53                                 AssertEquals ("Enumerator didn't return correct node.", "child" + index.ToString(), childNode.LocalName);
54                                 index++;
55                         }
56                         AssertEquals ("foreach didn't loop over all children correctly.", index, 2);
57                 }
58
59                 public void TestMultipleChildren ()
60                 {
61                         document.LoadXml ("<foo><child1/><child2/><child3/></foo>");
62                         element = document.DocumentElement;
63                         AssertEquals ("Incorrect number of children returned from Count property.", element.ChildNodes.Count, 3);
64                         AssertNull ("Index less than zero should have returned null.", element.ChildNodes [-1]);
65                         AssertNull ("Index greater than or equal to Count should have returned null.", element.ChildNodes [3]);
66                         AssertEquals ("Didn't return the correct child.", element.FirstChild, element.ChildNodes[0]);
67                         AssertEquals ("Didn't return the correct child.", "child1", element.ChildNodes[0].LocalName);
68                         AssertEquals ("Didn't return the correct child.", "child2", element.ChildNodes[1].LocalName);
69                         AssertEquals ("Didn't return the correct child.", "child3", element.ChildNodes[2].LocalName);
70
71                         index = 1;
72                         foreach (XmlNode childNode in element.ChildNodes) 
73                         {
74                                 AssertEquals ("Enumerator didn't return correct node.", "child" + index.ToString(), childNode.LocalName);
75                                 index++;
76                         }
77                         AssertEquals ("foreach didn't loop over all children correctly.", index, 4);
78                 }
79
80                 public void TestAppendChildAffectOnEnumeration ()
81                 {
82                         document.LoadXml ("<foo><child1/></foo>");
83                         element = document.DocumentElement;
84                         enumerator = element.GetEnumerator();
85                         AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true);
86                         AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false);
87                         enumerator.Reset();
88                         AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true);
89                         element.AppendChild(document.CreateElement("child2"));
90                         AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true);
91                         AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false);
92                 }
93
94                 public void TestRemoveChildAffectOnEnumeration ()
95                 {
96                         document.LoadXml ("<foo><child1/><child2/></foo>");
97                         element = document.DocumentElement;
98                         enumerator = element.GetEnumerator();
99                         element.RemoveChild(element.FirstChild);
100                         enumerator.MoveNext();
101                         AssertEquals ("Expected child2 element.", ((XmlElement)enumerator.Current).LocalName, "child2");
102                 }
103
104                 public void TestRemoveChildAffectOnEnumerationWhenEnumeratorIsOnRemovedChild ()
105                 {
106                         document.LoadXml ("<foo><child1/><child2/><child3/></foo>");
107                         element = document.DocumentElement;
108                         enumerator = element.GetEnumerator ();
109                         enumerator.MoveNext ();
110                         enumerator.MoveNext ();
111                         AssertEquals ("Expected child2 element.", "child2", ((XmlElement)enumerator.Current).LocalName);
112                         AssertEquals ("Expected child2 element.", "child2", element.FirstChild.NextSibling.LocalName);
113                         element.RemoveChild (element.FirstChild.NextSibling);
114                         enumerator.MoveNext ();
115                         
116                         try {
117                                 element = (XmlElement) enumerator.Current;
118                                 Fail ("Expected an InvalidOperationException.");
119                         } catch (InvalidOperationException) { }
120                 }
121
122                 // TODO:  Take the word save off front of this method when XmlNode.ReplaceChild() is implemented.
123                 public void saveTestReplaceChildAffectOnEnumeration ()
124                 {
125                         document.LoadXml ("<foo><child1/><child2/></foo>");
126                         element = document.DocumentElement;
127                         node = document.CreateElement("child3");
128                         enumerator = element.GetEnumerator();
129                         AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true);
130                         element.ReplaceChild(node, element.LastChild);
131                         enumerator.MoveNext();
132                         AssertEquals ("Expected child3 element.", ((XmlElement)enumerator.Current).LocalName, "child3");
133                         AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false);
134                 }
135
136                 public void TestRemoveOnlyChildAffectOnEnumeration ()
137                 {
138                         document.LoadXml ("<foo><child1/></foo>");
139                         element = document.DocumentElement;
140                         enumerator = element.GetEnumerator();
141                         element.RemoveChild(element.FirstChild);
142                         AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false);
143                 }
144
145                 // TODO:  Take the word save off front of this method when XmlNode.RemoveAll() is fully implemented.
146                 public void saveTestRemoveAllAffectOnEnumeration ()
147                 {
148                         document.LoadXml ("<foo><child1/><child2/><child3/></foo>");
149                         element = document.DocumentElement;
150                         enumerator = element.GetEnumerator();
151                         AssertEquals ("Expected 3 children.", element.ChildNodes.Count, 3);
152                         AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true);
153                         element.RemoveAll();
154                         AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false);
155                 }
156
157                 public void TestCurrentBeforeFirstNode ()
158                 {
159                         document.LoadXml ("<foo><child1/></foo>");
160                         element = document.DocumentElement;
161                         enumerator = element.GetEnumerator();
162                         try 
163                         {
164                                 obj = enumerator.Current;
165                                 Fail ("Calling Current property before first node in list should have thrown InvalidOperationException.");
166                         } catch (InvalidOperationException) { }
167                 }
168
169                 public void TestCurrentAfterLastNode ()
170                 {
171                         document.LoadXml ("<foo><child1/></foo>");
172                         element = document.DocumentElement;
173                         enumerator = element.GetEnumerator();
174                         enumerator.MoveNext();
175                         enumerator.MoveNext();
176                         try 
177                         {
178                                 obj = enumerator.Current;
179                                 Fail ("Calling Current property after last node in list should have thrown InvalidOperationException.");
180                         } 
181                         catch (InvalidOperationException) { }
182                 }
183
184                 public void TestCurrentDoesntMove ()
185                 {
186                         document.LoadXml ("<foo><child1/></foo>");
187                         element = document.DocumentElement;
188                         enumerator = element.GetEnumerator();
189                         enumerator.MoveNext();
190                         AssertEquals("Consecutive calls to Current property should yield same reference.", Object.ReferenceEquals(enumerator.Current, enumerator.Current), true);
191                 }
192
193                 public void TestReset ()
194                 {
195                         document.LoadXml ("<foo><child1/><child2/></foo>");
196                         element = document.DocumentElement;
197                         enumerator = element.GetEnumerator();
198                         enumerator.MoveNext();
199                         enumerator.MoveNext();
200                         AssertEquals("Expected child2.", ((XmlElement)enumerator.Current).LocalName, "child2");
201                         enumerator.Reset();
202                         enumerator.MoveNext();
203                         AssertEquals("Expected child1.", ((XmlElement)enumerator.Current).LocalName, "child1");
204                 }
205         }
206 }