Feat: add now can add two full strings Fix: it2 would have different working for emit eof Fix: eq and lt would return bools on it0 and it1 Fix: Functions always return something (there is no such thing as an empty type). Fix: Return value from main is now always ignored. Fix: Output from check is same on all iterations
107 lines
3.0 KiB
Python
107 lines
3.0 KiB
Python
import glob
|
|
import os
|
|
import sys
|
|
|
|
class Rule:
|
|
def __init__(self, target: str, prerequisites: list[str], recipe: list[str]) -> None:
|
|
self.target = target
|
|
self.prerequisites = prerequisites
|
|
self.recipe = recipe
|
|
|
|
def make_lines(self):
|
|
return [
|
|
self.target + ': ' + ' '.join(self.prerequisites),
|
|
] + [
|
|
'\t' + line
|
|
for line in self.recipe
|
|
] + ['']
|
|
|
|
def get_file_list():
|
|
return sorted(glob.glob('test_*/*.lang0'))
|
|
|
|
def make_rules(file_path, lang0it):
|
|
result: list[Rule] = []
|
|
|
|
stdin = file_path.replace('.lang0', '.stdin')
|
|
exp_stdout = file_path.replace('.lang0', '.exp.stdout')
|
|
exp_stderr = file_path.replace('.lang0', '.exp.stderr')
|
|
|
|
act_result = 'build/' + file_path.replace('.lang0', f'.{lang0it}.result')
|
|
act_stderr = 'build/' + file_path.replace('.lang0', f'.{lang0it}.stderr')
|
|
act_stdout = 'build/' + file_path.replace('.lang0', f'.{lang0it}.stdout')
|
|
program = 'build/' + file_path.replace('.lang0', f'.{lang0it}')
|
|
|
|
if os.path.isfile(exp_stdout) or os.path.isfile(exp_stderr):
|
|
result.append(Rule(
|
|
act_stdout,
|
|
[program] + ([stdin] if os.path.isfile(stdin) else []),
|
|
[
|
|
'-' + (f'cat {stdin} | ' if os.path.isfile(stdin) else 'echo x | ')
|
|
+ f'{program} 1> {act_stdout} 2> {act_stderr}',
|
|
]
|
|
))
|
|
|
|
exp_list = [exp_stdout, exp_stderr]
|
|
act_list = [act_stdout, act_stderr]
|
|
|
|
result.append(Rule(
|
|
act_result,
|
|
[act_stdout] + [
|
|
x
|
|
for x in exp_list
|
|
if os.path.isfile(x)
|
|
],
|
|
[
|
|
'rm -f $@',
|
|
] + [
|
|
f'-diff {exp_file} {act_file} >> $@'
|
|
for exp_file, act_file in zip(exp_list, act_list, strict=True)
|
|
if os.path.isfile(exp_file)
|
|
] + [
|
|
f'-diff /dev/null {act_file} >> $@'
|
|
for exp_file, act_file in zip(exp_list, act_list, strict=True)
|
|
if not os.path.isfile(exp_file)
|
|
]
|
|
))
|
|
|
|
assert result[-1].prerequisites, f'Missing expectations for {file_path}'
|
|
|
|
return result
|
|
|
|
def main(program, write_to, *lang0it):
|
|
rule_list_list = [
|
|
make_rules(file_path, it)
|
|
for file_path in get_file_list()
|
|
for it in lang0it
|
|
]
|
|
|
|
result_targets = [
|
|
rule.target
|
|
for rule_list in rule_list_list
|
|
for rule in rule_list
|
|
if rule.target.endswith('.result')
|
|
]
|
|
|
|
rule_list_list.append([Rule(
|
|
'verify-results',
|
|
result_targets,
|
|
[
|
|
'@echo Finding failed test results...',
|
|
'@find $^ -not -empty -print -exec false {} +',
|
|
'@echo All tests passed.'
|
|
]
|
|
)])
|
|
|
|
data = '\n'.join(
|
|
line
|
|
for rule_list in rule_list_list
|
|
for rule in rule_list
|
|
for line in rule.make_lines()
|
|
)
|
|
|
|
with open(write_to, 'wt', encoding='ASCII') as fil:
|
|
fil.write(data)
|
|
|
|
if __name__ == '__main__':
|
|
main(*sys.argv)
|