Evolving doctests for changing output format
Raymond Hettinger
python at rcn.com
Wed Jan 10 21:58:35 EST 2007
[nriley at gmail.com]
> What I'd like is if I could get doctest to take my tests, and
> substitute the obtained output for the provided output.
There's currently no support for auto-updating doctests. I think it
would make for a good feature request.
In the meantime, it may not be difficult to roll your own by converting
the current expected/got output into a diff and then applying it to the
original source code being doctested.
Start with a regular expression like this:
pat = re.compile(r'''
File.+,\sline\s(\d+),.+\n
Failed\sexample:\n((?:.*?\n)*?)
Expected:\n((?:.*?\n)*?)
Got:\n((?:.*?\n)*?)
\*{70,70}
''', (re.MULTILINE | re.VERBOSE))
Then, build-up a diff in your preferred format. Perhaps like this:
cumadj = 0
for lineno, example, expected, got in pat.findall(source):
len_example, len_expected, len_got = example.count('\n'),
expected.count('\n') , got.count('\n')
start = int(lineno) + len_example
lead = str(start)
if len_expected !=1:
lead += ',' + str(start+len_expected-1)
lead += 'c' + str(start + cumadj)
if len_got != 1:
lead += ',' + str(start+cumadj+len_got-1)
print lead
for old in expected.splitlines(False):
print '<' + old
print '---'
for new in got.splitlines(False):
print '>' + new
cumadj += len_got - len_expected
Raymond
More information about the Python-list
mailing list