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()
 |