Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Evolving doctests for changing output format

Reply
Thread Tools

Evolving doctests for changing output format

 
 
nriley@gmail.com
Guest
Posts: n/a
 
      01-09-2007
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

 
Reply With Quote
 
 
 
 
Raymond Hettinger
Guest
Posts: n/a
 
      01-11-2007
[(E-Mail Removed)]
> 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

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
pydb output vanishes when running nosetests doctests jcervidae Python 1 05-18-2009 05:35 PM
Stroustrup - Evolving a language in and for the real world: C++ 1991-2006 (HOPL III) Roland Pibinger C++ 0 06-05-2007 07:19 PM
program written to model population evolving over time sam Python 1 11-05-2006 02:09 AM
SIP protocol evolving Fast. Juan G. Castaneda VOIP 0 10-03-2004 05:35 PM
Evolving Web App Standards and ASP.NET =?Utf-8?B?bWtsYXBw?= ASP .Net 4 07-20-2004 07:52 AM



Advertisments