Mercurial > hg
changeset 15434:5635a4017061
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.
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Mon, 07 Nov 2011 13:46:41 -0600 |
parents | 4df3de1d44ce |
children | 493fffdc6398 |
files | tests/heredoctest.py tests/run-tests.py tests/test-run-tests.t |
diffstat | 3 files changed, 40 insertions(+), 29 deletions(-) [+] |
line wrap: on
line diff
--- 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: