# # run all the regression tests # # [or, you can request specific ones by giving their names on the command line] # import sys import compile import os import subprocess import context def run_test (cmd, *args): cmd = PJ ('tests', cmd) p = subprocess.Popen ([cmd] + list(args), stdout=subprocess.PIPE) out = p.stdout.read() return out def test_t17(): lines = run_test ('t17').split ('\n') # we can't say anything about the address returned by malloc # but we should expect to read this number assert (lines[1] == '3141') # and the sizeof (pxll_int) is random too, since even on the same # platform we might compile 32 or 64 bit, so just ignore it. def test_t_dump_image(): # generate the output run_test ('t_dump_image') # load the image and run it exp0 = run_test ('t_dump_image','-l') exp1 = open ('tests/t_dump_image.exp').read() assert (exp0 == exp1) def test_t21(): out = run_test ('t21') exp = open ('gc.c').read() # make sure the first part matches the contents of gc.c assert (out[:len(exp)] == exp) # the chars are too hard to tests for, and unlikely to be wrong. # should really make a separate char test. def test_t22(): out = run_test ('t22') lines = out.split ('\n') assert (lines[0].count (' 1: # run only these specific tests files = [x + '.scm' for x in sys.argv[1:]] else: files = os.listdir ('tests') # When looking for things that are broken, I prefer to work with the smallest # test that reproduces a problem. Thus, run the tests in source-size order... files = [ (os.stat(PJ ('tests', x)).st_size, x) for x in files ] files.sort() # tests that need special handling special = [x[5:] for x in dir() if x.startswith ('test_')] failed = [] # nobody wants to wait for a non-optimized tak20 optimize = ['t_vm'] succeeded = 0 for size, file in files: if file.endswith ('.scm'): base, ext = os.path.splitext (file) path = os.path.join ('tests', file) print 'compiling', path fail = file.startswith ('f') c = context.context() c.verbose = False c.typetype = True if base in optimize: c.optimize = True try: compile.compile_file (open (path, 'rb'), path, c) except: if not fail: #raise failed.append ((base, "compile failed")) else: succeeded += 1 else: if fail: failed.append ((base, 'compile did not fail like expected')) #raise ValueError ("oops - expected compilation to fail") if base not in special: out = run_test (base) exp_path = PJ ('tests', base + '.exp') if os.path.isfile (exp_path): exp = open (exp_path).read() if out != exp: failed.append ((base, 'did not match expected output')) #raise ValueError ("oops - output didn't match on test '%s'" % (base,)) else: succeeded += 1 else: succeeded += 1 else: # tests that require special handling for whatever reason. try: eval ('test_%s()' % (base,)) except: failed.append ((base, 'assertion failed')) else: succeeded += 1 print '%d tests passed' % succeeded if len(failed): print '%d tests failed!!' % (len(failed)) for base, reason in failed: print base, reason