testsuite.py

changeset 17
327da5d00360
parent 16
09cc89622262
child 18
672ebc45685a
--- 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())

mercurial