Author: atsushi
Date: 2007-05-05 10:31:11 -0400 (Sat, 05 May 2007)
New Revision: 76739
Added:
trunk/olive/class/System.Xml.Linq/Test/System.Xml.Linq/XNodeEqualityComparerTest.cs
trunk/olive/class/System.Xml.Linq/Test/System.Xml.Linq/XTextTest.cs
Modified:
trunk/olive/class/System.Xml.Linq/System.Xml.Linq/ChangeLog
trunk/olive/class/System.Xml.Linq/System.Xml.Linq/XNodeEqualityComparer.cs
trunk/olive/class/System.Xml.Linq/System.Xml.Linq_test.dll.sources
trunk/olive/class/System.Xml.Linq/Test/System.Xml.Linq/ChangeLog
Log:
2007-05-05 Atsushi Enomoto <[EMAIL PROTECTED]>
* XNodeEqualityComparer.cs : implemented.
* XTextTest.cs : test for NodeType (and whitespace),
* XNodeEqualityComparerTest.cs : test for GetHashCode(null) and
Compare().
Modified: trunk/olive/class/System.Xml.Linq/System.Xml.Linq/ChangeLog
===================================================================
--- trunk/olive/class/System.Xml.Linq/System.Xml.Linq/ChangeLog 2007-05-05
14:10:59 UTC (rev 76738)
+++ trunk/olive/class/System.Xml.Linq/System.Xml.Linq/ChangeLog 2007-05-05
14:31:11 UTC (rev 76739)
@@ -1,5 +1,9 @@
2007-05-05 Atsushi Enomoto <[EMAIL PROTECTED]>
+ * XNodeEqualityComparer.cs : implemented.
+
+2007-05-05 Atsushi Enomoto <[EMAIL PROTECTED]>
+
* XNode.cs
XDocument.cs
XElement.cs
Modified:
trunk/olive/class/System.Xml.Linq/System.Xml.Linq/XNodeEqualityComparer.cs
===================================================================
--- trunk/olive/class/System.Xml.Linq/System.Xml.Linq/XNodeEqualityComparer.cs
2007-05-05 14:10:59 UTC (rev 76738)
+++ trunk/olive/class/System.Xml.Linq/System.Xml.Linq/XNodeEqualityComparer.cs
2007-05-05 14:31:11 UTC (rev 76739)
@@ -2,30 +2,155 @@
using System.Collections;
using System.Collections.Generic;
+using XPI = System.Xml.Linq.XProcessingInstruction;
+
namespace System.Xml.Linq
{
- [MonoTODO]
public sealed class XNodeEqualityComparer : IEqualityComparer,
IEqualityComparer<XNode>
{
public XNodeEqualityComparer ()
{
}
- [MonoTODO]
public bool Equals (XNode n1, XNode n2)
{
- throw new NotImplementedException ();
+ if (n1 == null)
+ return n2 == null;
+ else if (n2 == null)
+ return false;
+ //throw new NotImplementedException ();
+ if (n1.NodeType != n2.NodeType)
+ return false;
+ switch (n1.NodeType) {
+ case XmlNodeType.Document:
+ XDocument doc1 = (XDocument) n1;
+ XDocument doc2 = (XDocument) n2;
+ if (!Equals (doc1.Declaration,
doc2.Declaration))
+ return false;
+ IEnumerator<XNode> id2 = doc2.Nodes
().GetEnumerator ();
+ foreach (XNode n in doc1.Nodes ()) {
+ if (!id2.MoveNext ())
+ return false;
+ if (!Equals (n, id2.Current))
+ return false;
+ }
+ return !id2.MoveNext ();
+ case XmlNodeType.Element:
+ XElement e1 = (XElement) n1;
+ XElement e2 = (XElement) n2;
+ if (e1.Name != e2.Name)
+ return false;
+ IEnumerator<XAttribute> ia2 = e2.Attributes
().GetEnumerator ();
+ foreach (XAttribute n in e1.Attributes ()) {
+ if (!ia2.MoveNext ())
+ return false;
+ if (!Equals (n, ia2.Current))
+ return false;
+ }
+ if (ia2.MoveNext ())
+ return false;
+ IEnumerator<XNode> ie2 = e2.Nodes
().GetEnumerator ();
+ foreach (XNode n in e1.Nodes ()) {
+ if (!ie2.MoveNext ())
+ return false;
+ if (!Equals (n, ie2.Current))
+ return false;
+ }
+ return !ie2.MoveNext ();
+ case XmlNodeType.Comment:
+ XComment c1 = (XComment) n1;
+ XComment c2 = (XComment) n2;
+ return c1.Value == c2.Value;
+ case XmlNodeType.ProcessingInstruction:
+ XPI p1 = (XPI) n1;
+ XPI p2 = (XPI) n2;
+ return p1.Target == p2.Target && p1.Data ==
p2.Data;
+ case XmlNodeType.DocumentType:
+ XDocumentType d1 = (XDocumentType) n1;
+ XDocumentType d2 = (XDocumentType) n2;
+ return d1.Name == d2.Name &&
+ d1.PublicId == d2.PublicId &&
+ d1.SystemId == d2.SystemId &&
+ d1.InternalSubset == d2.InternalSubset;
+ case XmlNodeType.Text:
+ return ((XText) n1).Value == ((XText) n2).Value;
+ }
+ throw new Exception ("INTERNAL ERROR: should not
happen");
}
+ bool Equals (XAttribute a1, XAttribute a2)
+ {
+ if (a1 == null)
+ return a2 == null;
+ else if (a2 == null)
+ return false;
+ return a1.Name == a2.Name && a1.Value == a2.Value;
+ }
+
+ bool Equals (XDeclaration d1, XDeclaration d2)
+ {
+ if (d1 == null)
+ return d2 == null;
+ else if (d2 == null)
+ return false;
+ return d1.Version == d2.Version &&
+ d1.Encoding == d2.Encoding &&
+ d1.Standalone == d2.Standalone;
+ }
+
bool IEqualityComparer.Equals (object n1, object n2)
{
return Equals ((XNode) n1, (XNode) n2);
}
- [MonoTODO]
+ int GetHashCode (XDeclaration d)
+ {
+ if (d == null)
+ return 0;
+ return (d.Version.GetHashCode () << 7) ^
+ (d.Encoding.GetHashCode () << 6) ^
+ d.Standalone.GetHashCode ();
+ }
+
public int GetHashCode (XNode node)
{
- throw new NotImplementedException ();
+ if (node == null)
+ return 0;
+ int h = ((int) node.NodeType << 6);
+ switch (node.NodeType) {
+ case XmlNodeType.Document:
+ XDocument doc = (XDocument) node;
+ h = h ^ GetHashCode (doc.Declaration);
+ foreach (XNode n in doc.Nodes ())
+ h = h ^ (n.GetHashCode () << 5);
+ break;
+ case XmlNodeType.Element:
+ XElement el = (XElement) node;
+ h = h ^ (el.Name.GetHashCode () << 3);
+ foreach (XAttribute a in el.Attributes ())
+ h = h ^ (a.GetHashCode () << 7);
+ foreach (XNode n in el.Nodes ())
+ h = h ^ (n.GetHashCode () << 6);
+ break;
+ case XmlNodeType.Comment:
+ h = h ^ ((XComment) node).Value.GetHashCode ();
+ break;
+ case XmlNodeType.ProcessingInstruction:
+ XPI pi = (XPI) node;
+ h = h ^ ((pi.Target.GetHashCode () << 6) +
pi.Data.GetHashCode ());
+ break;
+ case XmlNodeType.DocumentType:
+ XDocumentType dtd = (XDocumentType) node;
+ h = h ^ (dtd.Name.GetHashCode () << 7) ^
+ (dtd.PublicId.GetHashCode () << 6) ^
+ (dtd.SystemId.GetHashCode () << 5) ^
+ (dtd.InternalSubset.GetHashCode () << 4);
+ break;
+ case XmlNodeType.Text:
+ h = h ^ (((XText) node).GetHashCode ());
+ break;
+ }
+ return h;
}
int IEqualityComparer.GetHashCode (object node)
Modified: trunk/olive/class/System.Xml.Linq/System.Xml.Linq_test.dll.sources
===================================================================
--- trunk/olive/class/System.Xml.Linq/System.Xml.Linq_test.dll.sources
2007-05-05 14:10:59 UTC (rev 76738)
+++ trunk/olive/class/System.Xml.Linq/System.Xml.Linq_test.dll.sources
2007-05-05 14:31:11 UTC (rev 76739)
@@ -4,3 +4,5 @@
System.Xml.Linq/XElementTest.cs
System.Xml.Linq/XNameTest.cs
System.Xml.Linq/XNamespaceTest.cs
+System.Xml.Linq/XNodeEqualityComparerTest.cs
+System.Xml.Linq/XTextTest.cs
Modified: trunk/olive/class/System.Xml.Linq/Test/System.Xml.Linq/ChangeLog
===================================================================
--- trunk/olive/class/System.Xml.Linq/Test/System.Xml.Linq/ChangeLog
2007-05-05 14:10:59 UTC (rev 76738)
+++ trunk/olive/class/System.Xml.Linq/Test/System.Xml.Linq/ChangeLog
2007-05-05 14:31:11 UTC (rev 76739)
@@ -1,5 +1,11 @@
2007-05-05 Atsushi Enomoto <[EMAIL PROTECTED]>
+ * XTextTest.cs : test for NodeType (and whitespace),
+ * XNodeEqualityComparerTest.cs : test for GetHashCode(null) and
+ Compare().
+
+2007-05-05 Atsushi Enomoto <[EMAIL PROTECTED]>
+
* XElementTest.cs : Tests for ReplaceAll() and AddBeforeSelf() for
sequential strings.
Added:
trunk/olive/class/System.Xml.Linq/Test/System.Xml.Linq/XNodeEqualityComparerTest.cs
===================================================================
---
trunk/olive/class/System.Xml.Linq/Test/System.Xml.Linq/XNodeEqualityComparerTest.cs
2007-05-05 14:10:59 UTC (rev 76738)
+++
trunk/olive/class/System.Xml.Linq/Test/System.Xml.Linq/XNodeEqualityComparerTest.cs
2007-05-05 14:31:11 UTC (rev 76739)
@@ -0,0 +1,53 @@
+using System;
+using System.Collections.Generic;
+using System.Xml;
+using System.Xml.Linq;
+
+using NUnit.Framework;
+
+namespace MonoTests.System.Xml.Linq
+{
+ [TestFixture]
+ public class XNodeEqualityComparerTest
+ {
+ [Test]
+ public void CompareNulls ()
+ {
+ Assert.IsTrue (XNode.EqualityComparer.Equals (null,
null));
+ }
+
+ [Test]
+// [ExpectedException (typeof (ArgumentNullException))]
+ public void GetHashCodeNull ()
+ {
+ XNode.EqualityComparer.GetHashCode (null);
+ }
+
+ [Test]
+ public void Compare1 ()
+ {
+ XNodeEqualityComparer c = XNode.EqualityComparer;
+ XDocument doc = XDocument.Parse
("<root><foo/><bar/><foo/></root>");
+ Assert.IsTrue (c.Equals (doc.Root.FirstNode,
doc.Root.LastNode), "#1");
+ Assert.IsFalse (c.Equals (doc.Root.FirstNode,
doc.Root.FirstNode.NextNode), "#2");
+
+ doc = XDocument.Parse ("<root><foo/><foo a='v'/><foo
a='v2' /><foo a='v' b='v' /><foo a='v' b='v' /><foo b='v' a='v' /></root>");
+ Assert.IsFalse (c.Equals (doc.Root.FirstNode,
doc.Root.LastNode.NextNode), "#3");
+ Assert.IsFalse (c.Equals (doc.Root.FirstNode,
doc.Root.FirstNode.NextNode.NextNode), "#4");
+ Assert.IsFalse (c.Equals (doc.Root.FirstNode,
doc.Root.LastNode.PreviousNode), "#5");
+ // huh?
+ Assert.IsFalse (c.Equals
(doc.Root.LastNode.PreviousNode, doc.Root.LastNode), "#6");
+ Assert.IsTrue (c.Equals
(doc.Root.LastNode.PreviousNode.PreviousNode, doc.Root.LastNode.PreviousNode),
"#7");
+ }
+
+ [Test]
+ public void Compare2 ()
+ {
+ XNodeEqualityComparer c = XNode.EqualityComparer;
+ XElement e1 = XElement.Parse ("<foo><bar/></foo>");
+ XElement e2 = XElement.Parse ("<foo><bar/></foo>");
+ Assert.IsTrue (c.Equals (e1, e2), "#1");
+ Assert.IsTrue (c.Equals (e1.FirstNode, e2.FirstNode),
"#2");
+ }
+ }
+}
Added: trunk/olive/class/System.Xml.Linq/Test/System.Xml.Linq/XTextTest.cs
===================================================================
--- trunk/olive/class/System.Xml.Linq/Test/System.Xml.Linq/XTextTest.cs
2007-05-05 14:10:59 UTC (rev 76738)
+++ trunk/olive/class/System.Xml.Linq/Test/System.Xml.Linq/XTextTest.cs
2007-05-05 14:31:11 UTC (rev 76739)
@@ -0,0 +1,20 @@
+using System;
+using System.IO;
+using System.Xml;
+using System.Xml.Linq;
+
+using NUnit.Framework;
+
+namespace MonoTests.System.Xml.Linq
+{
+ [TestFixture]
+ public class XTextTest
+ {
+ [Test]
+ public void NodeType ()
+ {
+ Assert.AreEqual (XmlNodeType.Text, new XText
("test").NodeType, "#1");
+ Assert.AreEqual (XmlNodeType.Text, new XText ("
").NodeType, "#2");
+ }
+ }
+}
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches