| #!/usr/bin/env python |
| |
| import re |
| import sys |
| import subprocess |
| import os |
| |
| def generate(test): |
| with open("tests/template.fmt") as file: |
| template = file.read() |
| |
| lines = [] |
| for line in re.split('(?<=(?:.;| [{}]))\n', test.read()): |
| match = re.match('(?: *\n)*( *)(.*)=>(.*);', line, re.DOTALL | re.MULTILINE) |
| if match: |
| tab, test, expect = match.groups() |
| lines.append(tab+'test = {test};'.format(test=test.strip())) |
| lines.append(tab+'test_assert("{name}", test, {expect});'.format( |
| name = re.match('\w*', test.strip()).group(), |
| expect = expect.strip())) |
| else: |
| lines.append(line) |
| |
| # Create test file |
| with open('test.c', 'w') as file: |
| 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): |
| 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() |
| |
| if __name__ == "__main__": |
| main(*sys.argv[1:]) |