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

Reply via email to