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