| #!/usr/bin/env python2 |
| |
| import re |
| import sys |
| import subprocess |
| import os |
| |
| |
| def generate(test): |
| with open("scripts/template.fmt") as file: |
| template = file.read() |
| |
| haslines = 'TEST_LINE' in os.environ and 'TEST_FILE' in os.environ |
| |
| lines = [] |
| for offset, line in enumerate( |
| re.split('(?<=(?:.;| [{}]))\n', test.read())): |
| match = re.match('((?: *\n)*)( *)(.*)=>(.*);', |
| line, re.DOTALL | re.MULTILINE) |
| if match: |
| preface, tab, test, expect = match.groups() |
| lines.extend(['']*preface.count('\n')) |
| lines.append(tab+'test_assert({test}, {expect});'.format( |
| test=test.strip(), expect=expect.strip())) |
| else: |
| lines.append(line) |
| |
| # Create test file |
| with open('test.c', 'w') as file: |
| if 'TEST_LINE' in os.environ and 'TEST_FILE' in os.environ: |
| lines.insert(0, '#line %d "%s"' % ( |
| int(os.environ['TEST_LINE']) + 1, |
| os.environ['TEST_FILE'])) |
| lines.append('#line %d "test.c"' % ( |
| template[:template.find('{tests}')].count('\n') |
| + len(lines) + 2)) |
| |
| file.write(template.format(tests='\n'.join(lines))) |
| |
| # Remove build artifacts to force rebuild |
| try: |
| os.remove('test.o') |
| os.remove('lfs') |
| except OSError: |
| pass |
| |
| def compile(): |
| subprocess.check_call([ |
| os.environ.get('MAKE', 'make'), |
| '--no-print-directory', '-s']) |
| |
| def execute(): |
| if 'EXEC' in os.environ: |
| subprocess.check_call([os.environ['EXEC'], "./lfs"]) |
| else: |
| subprocess.check_call(["./lfs"]) |
| |
| def main(test=None): |
| try: |
| if test and not test.startswith('-'): |
| with open(test) as file: |
| generate(file) |
| else: |
| generate(sys.stdin) |
| |
| compile() |
| |
| if test == '-s': |
| sys.exit(1) |
| |
| execute() |
| |
| except subprocess.CalledProcessError: |
| # Python stack trace is counterproductive, just exit |
| sys.exit(2) |
| except KeyboardInterrupt: |
| # Python stack trace is counterproductive, just exit |
| sys.exit(3) |
| |
| if __name__ == "__main__": |
| main(*sys.argv[1:]) |