| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- #!/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:])
|