By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
444,034 Members | 1,325 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 444,034 IT Pros & Developers. It's quick & easy.

Evolving doctests for changing output format

P: n/a
Hi,

I've got a number of doctests which rely on a certain output format,
and since I wrote the tests I've changed the output format. Now,
almost all the tests fail.

What I'd like is if I could get doctest to take my tests, and
substitute the obtained output for the provided output. Then, I could
in this case just replace the doctest file with the generated file, or
in general be able to run it through a file comparison tool so I could
examine the differences.

If it's not clear from the above, here's an example, assuming for the
sake of simplicity that Python somehow changed its default output base
between runs.

INPUT:
>10 + 10
20

OUTPUT:
>10 + 10
0x14

Is it possible to use doctest in such a "run-only" mode, or script the
above using its API? I read the documentation several times but just
got further confused (sorry!).

Thanks,

--Nicholas

Jan 9 '07 #1
Share this Question
Share on Google+
1 Reply


P: n/a
[nr****@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

Jan 11 '07 #2

This discussion thread is closed

Replies have been disabled for this discussion.