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

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.

>10 + 10

>10 + 10

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!).



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

P: n/a
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'''
''', (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


Jan 11 '07 #2

This discussion thread is closed

Replies have been disabled for this discussion.