diff options
Diffstat (limited to 'test/RegressTests.py')
-rwxr-xr-x | test/RegressTests.py | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/test/RegressTests.py b/test/RegressTests.py new file mode 100755 index 00000000..13a0a113 --- /dev/null +++ b/test/RegressTests.py @@ -0,0 +1,159 @@ +#!/usr/bin/env python + +import sys +import os +import re +import tempfile + +from string import join +from difflib import unified_diff + +from LedgerHarness import LedgerHarness + +harness = LedgerHarness(sys.argv) +tests = sys.argv[3] + +if not os.path.isdir(tests) and not os.path.isfile(tests): + sys.exit(1) + +class RegressFile: + def __init__(self, filename): + self.filename = filename + self.fd = open(self.filename) + + def is_directive(self, line): + return line == "<<<\n" or \ + line == ">>>1\n" or \ + line == ">>>2\n" or \ + line.startswith("===") + + def transform_line(self, line): + line = re.sub('\$sourcepath', harness.sourcepath, line) + return line + + def read_section(self): + lines = [] + line = self.fd.readline() + while not self.is_directive(line): + lines.append(self.transform_line(line)) + line = self.fd.readline() + return (lines, line) + + def read_test(self, last_test = None): + test = { + 'command': None, + 'input': None, + 'output': None, + 'error': None, + 'exitcode': None + } + if last_test: + test['input'] = last_test['input'] + + line = self.fd.readline() + while line: + if line == "<<<\n": + (test['input'], line) = self.read_section() + elif line == ">>>1\n": + (test['output'], line) = self.read_section() + elif line == ">>>2\n": + (test['error'], line) = self.read_section() + elif line.startswith("==="): + match = re.match('=== ([0-9]+)', line) + assert match + test['exitcode'] = int(match.group(1)) + return test + else: + test['command'] = self.transform_line(line) + line = self.fd.readline() + + return None + + def run_test(self, test): + use_stdin = False + if test['command'].find("-f - ") != -1: + use_stdin = True + + test['command'] = '$ledger ' + test['command'] + else: + tempdata = tempfile.mkstemp() + + os.write(tempdata[0], join(test['input'], '')) + os.close(tempdata[0]) + + test['command'] = (('$ledger -f "%s" ' % tempdata[1]) + + test['command']) + + p = harness.run(test['command'], + columns=(not re.search('--columns', test['command']))) + + if use_stdin: + p.stdin.write(join(test['input'], '')) + p.stdin.close() + + success = True + printed = False + index = 0 + for line in unified_diff(test['output'], harness.readlines(p.stdout)): + index += 1 + if index < 3: + continue + if not printed: + if success: print + print "Regression failure in output from %s:" % \ + os.path.basename(self.filename) + success = False + printed = True + print " ", line, + + printed = False + index = 0 + for line in unified_diff([re.sub('\$FILE', tempdata[1], line) + for line in test['error']], + harness.readlines(p.stderr)): + index += 1 + if index < 3: + continue + if not printed: + if success: print + print "Regression failure in error output from %s:" % \ + os.path.basename(self.filename) + success = False + printed = True + print " ", line, + + if test['exitcode'] == p.wait(): + if success: + harness.success() + else: + harness.failure() + else: + if success: print + print "Regression failure in exitcode from %s: %d (expected) != %d" % \ + (os.path.basename(self.filename), test['exitcode'], p.returncode) + harness.failure() + + if not use_stdin: + os.remove(tempdata[1]) + + def run_tests(self): + test = self.read_test() + while test: + self.run_test(test) + test = self.read_test(test) + + def close(self): + self.fd.close() + +if os.path.isdir(tests): + for test_file in os.listdir(tests): + if re.search('\.test$', test_file): + entry = RegressFile(os.path.join(tests, test_file)) + entry.run_tests() + entry.close() +else: + entry = RegressFile(tests) + entry.run_tests() + entry.close() + +harness.exit() |