tests/test-ancestor.py
branchstable
changeset 19504 2fa303619b4d
parent 18091 f7f8159caad3
child 21024 7731a2281cf0
--- a/tests/test-ancestor.py	Thu Jul 25 17:35:53 2013 +0800
+++ b/tests/test-ancestor.py	Thu Jul 25 14:43:15 2013 -0700
@@ -1,4 +1,4 @@
-from mercurial import ancestor
+from mercurial import ancestor, commands, hg, ui, util
 
 # graph is a dict of child->parent adjacency lists for this graph:
 # o  13
@@ -101,6 +101,36 @@
     s = genlazyancestors([11, 13], stoprev=6, inclusive=True)
     printlazyancestors(s, [11, 13, 7, 9, 8, 3, 6, 4, 1, -1, 0])
 
+
+# The C gca algorithm requires a real repo. These are textual descriptions of
+# dags that have been known to be problematic.
+dagtests = [
+    '+2*2*2/*3/2',
+    '+3*3/*2*2/*4*4/*4/2*4/2*2',
+]
+def test_gca():
+    u = ui.ui()
+    for i, dag in enumerate(dagtests):
+        repo = hg.repository(u, 'gca%d' % i, create=1)
+        cl = repo.changelog
+        if not util.safehasattr(cl.index, 'ancestors'):
+            # C version not available
+            return
+
+        commands.debugbuilddag(u, repo, dag)
+        # Compare the results of the Python and C versions. This does not
+        # include choosing a winner when more than one gca exists -- we make
+        # sure both return exactly the same set of gcas.
+        for a in cl:
+            for b in cl:
+                cgcas = sorted(cl.index.ancestors(a, b))
+                pygcas = sorted(ancestor.ancestors(cl.parentrevs, a, b))
+                if cgcas != pygcas:
+                    print "test_gca: for dag %s, gcas for %d, %d:" % (dag, a, b)
+                    print "  C returned:      %s" % cgcas
+                    print "  Python returned: %s" % pygcas
+
 if __name__ == '__main__':
     test_missingancestors()
     test_lazyancestors()
+    test_gca()