// // System.Xml.XmlTextWriterTests // // Author: // Kral Ferch // // (C) 2002 Kral Ferch // using System; using System.Xml; using System.Collections; using NUnit.Framework; namespace MonoTests.System.Xml { public class XmlNodeListTests : TestCase { public XmlNodeListTests () : base ("MonoTests.System.Xml.XmlNodeListTests testsuite") {} public XmlNodeListTests (string name) : base (name) {} XmlDocument document; XmlElement documentElement; XmlElement element; XmlNode node; Object obj; IEnumerator enumerator; int index; protected override void SetUp () { document = new XmlDocument (); } public void TestNodeTypesThatCantHaveChildren () { document.LoadXml ("bar"); documentElement = document.DocumentElement; node = documentElement.FirstChild; AssertEquals ("Expected a text node.", node.NodeType, XmlNodeType.Text); AssertEquals ("Shouldn't have children.", node.HasChildNodes, false); AssertEquals ("Should be empty node list.", node.ChildNodes.Count, 0); AssertEquals ("Should be empty node list.", node.GetEnumerator().MoveNext(), false); } public void TestZeroChildren () { document.LoadXml (""); documentElement = document.DocumentElement; AssertEquals ("Should be empty node list.", documentElement.GetEnumerator().MoveNext(), false); } public void TestOneChild () { document.LoadXml (""); documentElement = document.DocumentElement; AssertEquals ("Incorrect number of children returned from Count property.", documentElement.ChildNodes.Count, 1); index = 1; foreach (XmlNode childNode in documentElement.ChildNodes) { AssertEquals ("Enumerator didn't return correct node.", "child" + index.ToString(), childNode.LocalName); index++; } AssertEquals ("foreach didn't loop over all children correctly.", index, 2); } public void TestMultipleChildren () { document.LoadXml (""); element = document.DocumentElement; AssertEquals ("Incorrect number of children returned from Count property.", element.ChildNodes.Count, 3); AssertNull ("Index less than zero should have returned null.", element.ChildNodes [-1]); AssertNull ("Index greater than or equal to Count should have returned null.", element.ChildNodes [3]); AssertEquals ("Didn't return the correct child.", element.FirstChild, element.ChildNodes[0]); AssertEquals ("Didn't return the correct child.", "child1", element.ChildNodes[0].LocalName); AssertEquals ("Didn't return the correct child.", "child2", element.ChildNodes[1].LocalName); AssertEquals ("Didn't return the correct child.", "child3", element.ChildNodes[2].LocalName); index = 1; foreach (XmlNode childNode in element.ChildNodes) { AssertEquals ("Enumerator didn't return correct node.", "child" + index.ToString(), childNode.LocalName); index++; } AssertEquals ("foreach didn't loop over all children correctly.", index, 4); } public void TestAppendChildAffectOnEnumeration () { document.LoadXml (""); element = document.DocumentElement; enumerator = element.GetEnumerator(); AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true); AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false); enumerator.Reset(); AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true); element.AppendChild(document.CreateElement("child2")); AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true); AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false); } public void TestRemoveChildAffectOnEnumeration () { document.LoadXml (""); element = document.DocumentElement; enumerator = element.GetEnumerator(); element.RemoveChild(element.FirstChild); enumerator.MoveNext(); AssertEquals ("Expected child2 element.", ((XmlElement)enumerator.Current).LocalName, "child2"); } public void TestRemoveChildAffectOnEnumerationWhenEnumeratorIsOnRemovedChild () { document.LoadXml (""); element = document.DocumentElement; enumerator = element.GetEnumerator (); enumerator.MoveNext (); enumerator.MoveNext (); AssertEquals ("Expected child2 element.", "child2", ((XmlElement)enumerator.Current).LocalName); AssertEquals ("Expected child2 element.", "child2", element.FirstChild.NextSibling.LocalName); element.RemoveChild (element.FirstChild.NextSibling); enumerator.MoveNext (); try { element = (XmlElement) enumerator.Current; Fail ("Expected an InvalidOperationException."); } catch (InvalidOperationException) { } } // TODO: Take the word save off front of this method when XmlNode.ReplaceChild() is implemented. public void saveTestReplaceChildAffectOnEnumeration () { document.LoadXml (""); element = document.DocumentElement; node = document.CreateElement("child3"); enumerator = element.GetEnumerator(); AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true); element.ReplaceChild(node, element.LastChild); enumerator.MoveNext(); AssertEquals ("Expected child3 element.", ((XmlElement)enumerator.Current).LocalName, "child3"); AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false); } public void TestRemoveOnlyChildAffectOnEnumeration () { document.LoadXml (""); element = document.DocumentElement; enumerator = element.GetEnumerator(); element.RemoveChild(element.FirstChild); AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false); } // TODO: Take the word save off front of this method when XmlNode.RemoveAll() is fully implemented. public void saveTestRemoveAllAffectOnEnumeration () { document.LoadXml (""); element = document.DocumentElement; enumerator = element.GetEnumerator(); AssertEquals ("Expected 3 children.", element.ChildNodes.Count, 3); AssertEquals ("MoveNext should have succeeded.", enumerator.MoveNext(), true); element.RemoveAll(); AssertEquals ("MoveNext should have failed.", enumerator.MoveNext(), false); } public void TestCurrentBeforeFirstNode () { document.LoadXml (""); element = document.DocumentElement; enumerator = element.GetEnumerator(); try { obj = enumerator.Current; Fail ("Calling Current property before first node in list should have thrown InvalidOperationException."); } catch (InvalidOperationException) { } } public void TestCurrentAfterLastNode () { document.LoadXml (""); element = document.DocumentElement; enumerator = element.GetEnumerator(); enumerator.MoveNext(); enumerator.MoveNext(); try { obj = enumerator.Current; Fail ("Calling Current property after last node in list should have thrown InvalidOperationException."); } catch (InvalidOperationException) { } } public void TestCurrentDoesntMove () { document.LoadXml (""); element = document.DocumentElement; enumerator = element.GetEnumerator(); enumerator.MoveNext(); AssertEquals("Consecutive calls to Current property should yield same reference.", Object.ReferenceEquals(enumerator.Current, enumerator.Current), true); } public void TestReset () { document.LoadXml (""); element = document.DocumentElement; enumerator = element.GetEnumerator(); enumerator.MoveNext(); enumerator.MoveNext(); AssertEquals("Expected child2.", ((XmlElement)enumerator.Current).LocalName, "child2"); enumerator.Reset(); enumerator.MoveNext(); AssertEquals("Expected child1.", ((XmlElement)enumerator.Current).LocalName, "child1"); } } }