| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| import argparse |
| from collections import defaultdict |
|
|
|
|
| def overwrite_file(file, class_name, test_name, correct_line, done_test): |
| _id = f"{file}_{class_name}_{test_name}" |
| done_test[_id] += 1 |
|
|
| with open(file, "r") as f: |
| lines = f.readlines() |
|
|
| class_regex = f"class {class_name}(" |
| test_regex = f"{4 * ' '}def {test_name}(" |
| line_begin_regex = f"{8 * ' '}{correct_line.split()[0]}" |
| another_line_begin_regex = f"{16 * ' '}{correct_line.split()[0]}" |
| in_class = False |
| in_func = False |
| in_line = False |
| insert_line = False |
| count = 0 |
| spaces = 0 |
|
|
| new_lines = [] |
| for line in lines: |
| if line.startswith(class_regex): |
| in_class = True |
| elif in_class and line.startswith(test_regex): |
| in_func = True |
| elif in_class and in_func and (line.startswith(line_begin_regex) or line.startswith(another_line_begin_regex)): |
| spaces = len(line.split(correct_line.split()[0])[0]) |
| count += 1 |
|
|
| if count == done_test[_id]: |
| in_line = True |
|
|
| if in_class and in_func and in_line: |
| if ")" not in line: |
| continue |
| else: |
| insert_line = True |
|
|
| if in_class and in_func and in_line and insert_line: |
| new_lines.append(f"{spaces * ' '}{correct_line}") |
| in_class = in_func = in_line = insert_line = False |
| else: |
| new_lines.append(line) |
|
|
| with open(file, "w") as f: |
| for line in new_lines: |
| f.write(line) |
|
|
|
|
| def main(correct, fail=None): |
| if fail is not None: |
| with open(fail, "r") as f: |
| test_failures = {l.strip() for l in f.readlines()} |
| else: |
| test_failures = None |
|
|
| with open(correct, "r") as f: |
| correct_lines = f.readlines() |
|
|
| done_tests = defaultdict(int) |
| for line in correct_lines: |
| file, class_name, test_name, correct_line = line.split(";") |
| if test_failures is None or "::".join([file, class_name, test_name]) in test_failures: |
| overwrite_file(file, class_name, test_name, correct_line, done_tests) |
|
|
|
|
| if __name__ == "__main__": |
| parser = argparse.ArgumentParser() |
| parser.add_argument("--correct_filename", help="filename of tests with expected result") |
| parser.add_argument("--fail_filename", help="filename of test failures", type=str, default=None) |
| args = parser.parse_args() |
|
|
| main(args.correct_filename, args.fail_filename) |
|
|