Author: atsushi
Date: 2007-05-05 14:51:21 -0400 (Sat, 05 May 2007)
New Revision: 76757

Added:
   
trunk/olive/class/System.Xml.Linq/Test/System.Xml.Linq/XNodeDocumentOrderComparerTest.cs
Modified:
   trunk/olive/class/System.Xml.Linq/System.Xml.Linq/ChangeLog
   
trunk/olive/class/System.Xml.Linq/System.Xml.Linq/XNodeDocumentOrderComparer.cs
   trunk/olive/class/System.Xml.Linq/System.Xml.Linq/XObject.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]>

        * XNodeDocumentOrderComparer.cs : implemented.
        * XObject.cs : Owner is internally referenced now.

        * XNodeDocumentOrderComparerTest.cs : new test.



Modified: trunk/olive/class/System.Xml.Linq/System.Xml.Linq/ChangeLog
===================================================================
--- trunk/olive/class/System.Xml.Linq/System.Xml.Linq/ChangeLog 2007-05-05 
18:14:29 UTC (rev 76756)
+++ trunk/olive/class/System.Xml.Linq/System.Xml.Linq/ChangeLog 2007-05-05 
18:51:21 UTC (rev 76757)
@@ -1,5 +1,10 @@
 2007-05-05  Atsushi Enomoto  <[EMAIL PROTECTED]>
 
+       * XNodeDocumentOrderComparer.cs : implemented.
+       * XObject.cs : Owner is internally referenced now.
+
+2007-05-05  Atsushi Enomoto  <[EMAIL PROTECTED]>
+
        * XNodeEqualityComparer.cs : implemented.
 
 2007-05-05  Atsushi Enomoto  <[EMAIL PROTECTED]>

Modified: 
trunk/olive/class/System.Xml.Linq/System.Xml.Linq/XNodeDocumentOrderComparer.cs
===================================================================
--- 
trunk/olive/class/System.Xml.Linq/System.Xml.Linq/XNodeDocumentOrderComparer.cs 
    2007-05-05 18:14:29 UTC (rev 76756)
+++ 
trunk/olive/class/System.Xml.Linq/System.Xml.Linq/XNodeDocumentOrderComparer.cs 
    2007-05-05 18:51:21 UTC (rev 76757)
@@ -4,19 +4,120 @@
 
 namespace System.Xml.Linq
 {
-       [MonoTODO]
        public sealed class XNodeDocumentOrderComparer : IComparer, 
IComparer<XNode>
        {
                public XNodeDocumentOrderComparer ()
                {
                }
 
-               [MonoTODO]
+               enum CompareResult
+               {
+                       Same,
+                       Random,
+                       Parent,
+                       Child,
+                       Ancestor,
+                       Descendant,
+                       Preceding,
+                       Following
+               }
+
                public int Compare (XNode n1, XNode n2)
                {
-                       throw new NotImplementedException ();
+                       switch (CompareCore (n1, n2)) {
+                       case CompareResult.Same:
+                               return 0;
+                       case CompareResult.Random:
+                               return DateTime.Now.Ticks % 2 == 1 ? 1 : -1;
+                       case CompareResult.Parent:
+                       case CompareResult.Ancestor:
+                       case CompareResult.Preceding:
+                               return 1;
+                       default:
+                               return -1;
+                       }
                }
 
+               CompareResult CompareCore (XNode n1, XNode n2)
+               {
+                       if (n1 == n2)
+                               return CompareResult.Same;
+                       if (n1.Owner == null) {
+                               if (n2.Owner == null)
+                                       // n1 and n2 do not share the same
+                                       // top-level node, so return semi-
+                                       // random value.
+                                       return CompareResult.Random;
+
+                               CompareResult result = CompareCore (n1, 
n2.Owner);
+                               switch (result) {
+                               case CompareResult.Same:
+                                       return CompareResult.Child;
+                               case CompareResult.Child:
+                               case CompareResult.Descendant:
+                                       return CompareResult.Descendant;
+                               case CompareResult.Parent:
+                               case CompareResult.Ancestor:
+                                       throw new Exception ("INTERNAL ERROR: 
should not happen");
+                               default:
+                                       return result;
+                               }
+                       }
+                       // else
+                       if (n2.Owner == null) {
+                               // do reverse
+                               CompareResult rev = CompareCore (n2, n1);
+                               switch (rev) {
+                               case CompareResult.Parent:
+                                       return CompareResult.Child;
+                               case CompareResult.Child:
+                                       return CompareResult.Parent;
+                               case CompareResult.Ancestor:
+                                       return CompareResult.Descendant;
+                               case CompareResult.Descendant:
+                                       return CompareResult.Ancestor;
+                               case CompareResult.Following:
+                                       return CompareResult.Preceding;
+                               case CompareResult.Preceding:
+                                       return CompareResult.Following;
+                               case CompareResult.Same:
+                               case CompareResult.Random:
+                                       return rev;
+                               }
+                       }
+                       // both have parents
+                       CompareResult ret = CompareCore (n1.Owner, n2.Owner);
+                       switch (ret) {
+                       case CompareResult.Same:
+                               // n1 and n2 are sibling each other.
+                               return CompareSibling (n1, n2);
+                       case CompareResult.Child:
+                               return CompareSibling (n1, n2.Owner);
+                       case CompareResult.Parent:
+                               return CompareSibling (n1.Owner, n2);
+                       case CompareResult.Descendant:
+                               for (XNode i2 = n2; ; i2 = i2.Owner)
+                                       if (i2.Owner == n1.Owner)
+                                               return CompareSibling (n1, i2);
+                       case CompareResult.Ancestor:
+                               for (XNode i1 = n1; ; i1 = i1.Owner)
+                                       if (i1.Owner == n2.Owner)
+                                               return CompareSibling (i1, n2);
+                       default:
+                               return ret;
+                       }
+               }
+
+               // results are returned as following/preceding, as it is also
+               // used for comparing parents.
+               CompareResult CompareSibling (XNode n1, XNode n2)
+               {
+                       for (XNode n = n1.NextNode; n != null; n = n.NextNode)
+                               if (n == n2)
+                                       return CompareResult.Following;
+                       return CompareResult.Preceding;
+               }
+
                int IComparer.Compare (object n1, object n2)
                {
                        return Compare ((XNode) n1, (XNode) n2);

Modified: trunk/olive/class/System.Xml.Linq/System.Xml.Linq/XObject.cs
===================================================================
--- trunk/olive/class/System.Xml.Linq/System.Xml.Linq/XObject.cs        
2007-05-05 18:14:29 UTC (rev 76756)
+++ trunk/olive/class/System.Xml.Linq/System.Xml.Linq/XObject.cs        
2007-05-05 18:51:21 UTC (rev 76757)
@@ -41,6 +41,10 @@
                        get { return owner as XElement; }
                }
 
+               internal XContainer Owner {
+                       get { return owner; }
+               }
+
                internal void SetOwner (XContainer node)
                {
                        owner = 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 18:14:29 UTC (rev 76756)
+++ trunk/olive/class/System.Xml.Linq/System.Xml.Linq_test.dll.sources  
2007-05-05 18:51:21 UTC (rev 76757)
@@ -4,5 +4,6 @@
 System.Xml.Linq/XElementTest.cs
 System.Xml.Linq/XNameTest.cs
 System.Xml.Linq/XNamespaceTest.cs
+System.Xml.Linq/XNodeDocumentOrderComparerTest.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 18:14:29 UTC (rev 76756)
+++ trunk/olive/class/System.Xml.Linq/Test/System.Xml.Linq/ChangeLog    
2007-05-05 18:51:21 UTC (rev 76757)
@@ -1,5 +1,9 @@
 2007-05-05  Atsushi Enomoto  <[EMAIL PROTECTED]>
 
+       * XNodeDocumentOrderComparerTest.cs : new test.
+
+2007-05-05  Atsushi Enomoto  <[EMAIL PROTECTED]>
+
        * XTextTest.cs : test for NodeType (and whitespace),
        * XNodeEqualityComparerTest.cs : test for GetHashCode(null) and
          Compare().

Added: 
trunk/olive/class/System.Xml.Linq/Test/System.Xml.Linq/XNodeDocumentOrderComparerTest.cs
===================================================================
--- 
trunk/olive/class/System.Xml.Linq/Test/System.Xml.Linq/XNodeDocumentOrderComparerTest.cs
    2007-05-05 18:14:29 UTC (rev 76756)
+++ 
trunk/olive/class/System.Xml.Linq/Test/System.Xml.Linq/XNodeDocumentOrderComparerTest.cs
    2007-05-05 18:51:21 UTC (rev 76757)
@@ -0,0 +1,45 @@
+using System;
+using System.Collections.Generic;
+using System.Xml;
+using System.Xml.Linq;
+
+using NUnit.Framework;
+
+namespace MonoTests.System.Xml.Linq
+{
+       [TestFixture]
+       public class XNodeDocumentOrderComparerTest
+       {
+               [Test]
+               public void CompareNulls ()
+               {
+                       Assert.AreEqual (0, XNode.DocumentOrderComparer.Compare 
(null, null));
+               }
+
+               [Test]
+               public void Compare1 ()
+               {
+                       // ancestors/descendants
+                       XNodeDocumentOrderComparer c = 
XNode.DocumentOrderComparer;
+                       XElement el = XElement.Parse ("<foo><bar/></foo>");
+                       Assert.IsTrue (c.Compare (el, el.FirstNode) < 0, 
"#1-1");
+                       Assert.IsTrue (c.Compare (el.FirstNode, el) > 0, 
"#1-2");
+
+                       XDocument doc = XDocument.Parse ("<foo><bar/></foo>");
+                       Assert.IsTrue (c.Compare (doc, doc.FirstNode) < 0, 
"#2-1");
+                       Assert.IsTrue (c.Compare (doc.FirstNode, doc) > 0, 
"#2-2");
+               }
+
+               [Test]
+               public void Compare2 ()
+               {
+                       // sibling/following/preceding
+                       XNodeDocumentOrderComparer c = 
XNode.DocumentOrderComparer;
+                       XElement el = XElement.Parse 
("<n1><n11><n111/><n112/></n11><n12><n121><n1211/><n1212/></n121></n12></n1>");
+                       Assert.IsTrue (c.Compare (el.FirstNode, el.LastNode) < 
0, "#3-1"); // following-sibling
+                       Assert.IsTrue (c.Compare (el.LastNode, el.FirstNode) > 
0, "#3-2"); // preceding-sibling
+                       Assert.IsTrue (c.Compare (el.FirstNode, ((XContainer) 
el.LastNode).FirstNode) < 0, "#3-3"); // following
+                       Assert.IsTrue (c.Compare (((XContainer) 
el.LastNode).FirstNode, el.FirstNode) > 0, "#3-4"); // preceding
+               }
+       }
+}

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to