ledger/test/RegressTests.py
John Wiegley d58797e98c The -B, -G, -V reports now show rounding amounts
This way, if the running total is off by a penny or two due to rounding
of one or more commodities in the account, the user will see it.

This commit also reorganizes the testing code a bit, which I did after
adding the ninth test series (ConfirmTests), to validate the new
rounding code.
2009-02-26 03:16:39 -04:00

148 lines
3.6 KiB
Python
Executable file

#!/usr/bin/env python
import sys
import os
import re
import string
import tempfile
from difflib import unified_diff
from subprocess import Popen, PIPE
ledger = sys.argv[1]
tests = sys.argv[2]
if not os.path.isfile(ledger):
sys.exit(1)
if not os.path.isdir(tests) and not os.path.isfile(tests):
sys.exit(1)
succeeded = 0
failed = 0
def test_regression(test_file):
global succeeded, failed
bug = open(test_file)
command = bug.readline()
line = bug.readline()
assert "<<<\n" == line
line = bug.readline()
data = []
while line != ">>>1\n":
data.append(line)
line = bug.readline()
line = bug.readline()
use_stdin = False
if command.startswith("-f - "):
use_stdin = True
if re.search('--columns', command):
command = ("%s" % ledger) + " --verify --args-only " + command
else:
command = (("%s" % ledger) +
" --verify --args-only --columns=80 " + command)
else:
tempdata = tempfile.mkstemp()
os.write(tempdata[0], string.join(data, ''))
os.close(tempdata[0])
if re.search('--columns', command):
command = (("%s -f \"%s\" " % (ledger, tempdata[1])) +
" --verify --args-only " + command)
else:
command = (("%s -f \"%s\" " % (ledger, tempdata[1])) +
" --verify --args-only --columns=80 " + command)
output = []
while line != ">>>2\n":
output.append(line)
line = bug.readline()
line = bug.readline()
error = []
while not line.startswith("==="):
error.append(line)
line = bug.readline()
match = re.match('=== ([0-9]+)', line)
assert match
exitcode = int(match.group(1))
p = Popen(command[:-1], shell=True,
stdin=PIPE, stdout=PIPE, stderr=PIPE,
close_fds=True)
if use_stdin:
p.stdin.write(string.join(data))
p.stdin.close()
success = True
printed = False
index = 0
for line in unified_diff(output, p.stdout.readlines()):
index += 1
if index < 3:
continue
if not printed:
if success: print
print "Regression failure in output from %s:" \
% os.path.basename(test_file)
if success: failed += 1
success = False
printed = True
print " ", line,
printed = False
index = 0
for line in unified_diff([re.sub('\$FILE', tempdata[1], line)
for line in error],
p.stderr.readlines()):
index += 1
if index < 3:
continue
if not printed:
if success: print
print "Regression failure in error output from %s:" \
% os.path.basename(test_file)
if success: failed += 1
success = False
printed = True
print " ", line,
if exitcode != p.wait():
if success: print
if success: failed += 1
success = False
print "Regression failure in exitcode from %s: %d (expected) != %d" \
% (os.path.basename(test_file), exitcode, p.returncode)
if success:
succeeded += 1
print ".",
else:
print "E",
if not use_stdin:
os.remove(tempdata[1])
if os.path.isdir(tests):
for test in os.listdir(tests):
if re.search('\.test$', test):
test_regression(os.path.join(tests, test))
else:
test_regression(tests)
print
if succeeded > 0:
print "OK (%d) " % succeeded,
if failed > 0:
print "FAILED (%d)" % failed,
print
sys.exit(failed)