84 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# vim: set ts=4 sw=4 tw=99 et:
 | 
						|
import os, sys
 | 
						|
import argparse
 | 
						|
import subprocess
 | 
						|
 | 
						|
def run_tests(args):
 | 
						|
    testdir = os.path.dirname(os.path.abspath(__file__))
 | 
						|
    tests = []
 | 
						|
    for filename in os.listdir(testdir):
 | 
						|
        base, ext = os.path.splitext(filename)
 | 
						|
        if ext == '.sp':
 | 
						|
            tests += [base]
 | 
						|
 | 
						|
    failed = False
 | 
						|
 | 
						|
    for test in tests:
 | 
						|
        if test.startswith('fail-'):
 | 
						|
            kind = 'fail'
 | 
						|
        elif test.startswith('warn-'):
 | 
						|
            kind = 'warn'
 | 
						|
        elif test.startswith('ok-'):
 | 
						|
            kind = 'pass'
 | 
						|
 | 
						|
        try:
 | 
						|
            argv = [os.path.abspath(args.spcomp), os.path.join(testdir, test + '.sp')]
 | 
						|
            p = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
 | 
						|
            stdout, stderr = p.communicate()
 | 
						|
            stdout = stdout.decode('utf-8')
 | 
						|
            stderr = stderr.decode('utf-8')
 | 
						|
 | 
						|
            smx_path = test + '.smx'
 | 
						|
            compiled = os.path.exists(smx_path)
 | 
						|
            if compiled:
 | 
						|
                os.unlink(smx_path)
 | 
						|
 | 
						|
            status = 'ok'
 | 
						|
            if compiled and kind == 'fail':
 | 
						|
                status = 'fail'
 | 
						|
            elif not compiled and kind != 'fail':
 | 
						|
                status = 'fail'
 | 
						|
 | 
						|
            fails = []
 | 
						|
            if status == 'ok' and kind != 'pass':
 | 
						|
                lines = []
 | 
						|
                with open(os.path.join(testdir, test + '.txt')) as fp:
 | 
						|
                    for line in fp:
 | 
						|
                        lines.append(line.strip())
 | 
						|
                for line in lines:
 | 
						|
                    if line not in stdout:
 | 
						|
                        fails += [
 | 
						|
                            'Expected to find text in stdout: >>>\n',
 | 
						|
                            line,
 | 
						|
                            '<<<\n',
 | 
						|
                        ]
 | 
						|
                        break
 | 
						|
            
 | 
						|
            if status == 'fail' or len(fails):
 | 
						|
                print('Test {0} ... FAIL'.format(test))
 | 
						|
                failed = True
 | 
						|
                sys.stderr.write('FAILED! Dumping stdout/stderr:\n')
 | 
						|
                sys.stderr.write(stdout)
 | 
						|
                sys.stderr.write(stderr)
 | 
						|
                for line in fails:
 | 
						|
                    sys.stderr.write(line)
 | 
						|
            else:
 | 
						|
                print('Test {0} ... OK'.format(test))
 | 
						|
 | 
						|
        except Exception as exn:
 | 
						|
            raise
 | 
						|
            sys.stderr.write('FAILED! {0}\n'.format(exn.message))
 | 
						|
 | 
						|
    if failed:
 | 
						|
        sys.stderr.write('One or more tests failed!\n')
 | 
						|
        sys.exit(1)
 | 
						|
 | 
						|
def main():
 | 
						|
    parser = argparse.ArgumentParser()
 | 
						|
    parser.add_argument('spcomp', type=str, help='Path to spcomp')
 | 
						|
    args = parser.parse_args()
 | 
						|
    run_tests(args)
 | 
						|
 | 
						|
if __name__ == '__main__':
 | 
						|
    main()
 |