diff -r 09cc89622262 -r 327da5d00360 testsuite.py --- a/testsuite.py Mon Jan 22 13:51:13 2018 +0200 +++ b/testsuite.py Mon Jan 22 17:05:10 2018 +0200 @@ -8,10 +8,10 @@ 'args': args, } -def warning(bad_object, error_name, *args): +def warning(bad_object, error_name, **args): return report_element(bad_object, 'warning', error_name, args) -def error(bad_object, error_name, *args): +def error(bad_object, error_name, **args): return report_element(bad_object, 'error', error_name, args) def test_discovery(): @@ -67,6 +67,41 @@ warn(str.format('Module {} does not have a manifest', module_name)) return test_suite +def check_model(model, test_suite = None): + if not test_suite: + test_suite = load_tests() + report = [] + line_numbers = { + element: (i, i + 1 + model.body_offset) + for i, element in enumerate(model.body) + } + for test_name, test_function in test_suite['tests'].items(): + problems = test_function(model) + for problem in problems: + problem['body-index'], problem['line-number'] \ + = line_numbers[problem['object']] + del problem['object'] + report.append(problem) + return report + +def format_report(report, model, test_suite): + result = [] + for problem in report: + problem_text = test_suite['messages'][problem['name']] + if callable(problem_text): + problem_text = problem_text(**problem['args']) + message = str.format( + 'Line {}: {}\n\t{}', + problem['line-number'], + problem_text, + model.body[problem['body-index']].original_code + ) + result.append((problem['line-number'], message)) + return '\n'.join( + problem[1] + for problem in sorted(result) + ) + if __name__ == '__main__': from pprint import pprint pprint(load_tests())