run-tests: replace inline python handling with more native scheme
authorMatt Mackall <mpm@selenic.com>
Mon, 07 Nov 2011 13:46:41 -0600
changeset 15434 5635a4017061
parent 15433 4df3de1d44ce
child 15435 493fffdc6398
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.
tests/heredoctest.py
tests/run-tests.py
tests/test-run-tests.t
--- a/tests/heredoctest.py	Mon Nov 07 13:46:39 2011 -0600
+++ b/tests/heredoctest.py	Mon Nov 07 13:46:41 2011 -0600
@@ -1,16 +1,19 @@
-import doctest, tempfile, os, sys
-
-if __name__ == "__main__":
-    if 'TERM' in os.environ:
-        del os.environ['TERM']
-
-    fd, name = tempfile.mkstemp(suffix='hg-tst')
+import sys
 
-    try:
-        os.write(fd, sys.stdin.read())
-        os.close(fd)
-        failures, _ = doctest.testfile(name, module_relative=False)
-        if failures:
-            sys.exit(1)
-    finally:
-        os.remove(name)
+globalvars = {}
+localvars = {}
+lines = sys.stdin.readlines()
+while lines:
+    l = lines.pop(0)
+    if l.startswith('SALT'):
+        print l[:-1]
+    elif l.startswith('>>> '):
+        snippet = l[4:]
+        while lines and lines[0].startswith('... '):
+            l = lines.pop(0)
+            snippet += "\n" + l[4:]
+        c = compile(snippet, '<heredoc>', 'single')
+        try:
+            exec c in globalvars, localvars
+        except Exception, inst:
+            print repr(inst)
--- a/tests/run-tests.py	Mon Nov 07 13:46:39 2011 -0600
+++ 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')
--- a/tests/test-run-tests.t	Mon Nov 07 13:46:39 2011 -0600
+++ b/tests/test-run-tests.t	Mon Nov 07 13:46:41 2011 -0600
@@ -16,6 +16,11 @@
   $ foo
   bar
 
+Return codes before inline python:
+
+  $ false
+  [1]
+
 Doctest commands:
 
   >>> print 'foo'
@@ -28,7 +33,7 @@
   y
   z
   >>> print
-  <BLANKLINE>
+  
 
 Regular expressions: