run-tests: replace inline python handling with more native scheme stable
authorMatt Mackall <mpm@selenic.com>
Mon, 07 Nov 2011 13:46:41 -0600
branchstable
changeset 1005 d86b26020b48
parent 1003 59bd7f017103
child 1006 826681fc0976
child 1008 f2a62458ef8b
run-tests: replace inline python handling with more native scheme Normally changes in tests are reported like this in diffs: $ cat foo - a + b Using -i mode lets us update tests when the new results are correct and/or populate tests with their output. But with the standard doctest framework, inline Python sections in tests changes instead result in a big failure report that's unhelpful. So here, we replace the doctest calls with a simple compile/eval loop. [ original upstream message ]
tests/run-tests.py
--- a/tests/run-tests.py	Thu Nov 03 15:18:10 2011 -0500
+++ b/tests/run-tests.py	Mon Nov 07 13:46:41 2011 -0600
@@ -563,8 +563,11 @@
     # up script results with our source. These markers include input
     # line number and the last return code
     salt = "SALT" + str(time.time())
-    def addsalt(line):
-        script.append('echo %s %s $?\n' % (salt, line))
+    def addsalt(line, inpython):
+        if inpython:
+            script.append('%s %d 0\n' % (salt, line))
+        else:
+            script.append('echo %s %s $?\n' % (salt, line))
 
     # After we run the shell script, we re-unify the script output
     # with non-active parts of the source, with synchronization by our
@@ -589,13 +592,17 @@
         if not l.endswith('\n'):
             l += '\n'
         if l.startswith('  >>> '): # python inlines
+            after.setdefault(pos, []).append(l)
+            prepos = pos
+            pos = n
             if not inpython:
                 # we've just entered a Python block, add the header
                 inpython = True
-                addsalt(n)
+                addsalt(prepos, False) # make sure we report the exit code
                 script.append('%s -m heredoctest <<EOF\n' % PYTHON)
-                prepos = pos
-                pos = n
+            addsalt(n, True)
+            script.append(l[2:])
+        if l.startswith('  ... '): # python inlines
             after.setdefault(prepos, []).append(l)
             script.append(l[2:])
         elif l.startswith('  $ '): # commands
@@ -605,18 +612,14 @@
             after.setdefault(pos, []).append(l)
             prepos = pos
             pos = n
-            addsalt(n)
+            addsalt(n, False)
             script.append(l[4:])
         elif l.startswith('  > '): # continuations
             after.setdefault(prepos, []).append(l)
             script.append(l[4:])
         elif l.startswith('  '): # results
-            if inpython:
-                script.append(l[2:])
-                after.setdefault(prepos, []).append(l)
-            else:
-                # queue up a list of expected results
-                expected.setdefault(pos, []).append(l[2:])
+            # queue up a list of expected results
+            expected.setdefault(pos, []).append(l[2:])
         else:
             if inpython:
                 script.append("EOF\n")
@@ -626,7 +629,7 @@
 
     if inpython:
         script.append("EOF\n")
-    addsalt(n + 1)
+    addsalt(n + 1, False)
 
     # Write out the script and execute it
     fd, name = tempfile.mkstemp(suffix='hg-tst')