6 'object': bad_object, |
6 'object': bad_object, |
7 'name': error_name, |
7 'name': error_name, |
8 'args': args, |
8 'args': args, |
9 } |
9 } |
10 |
10 |
11 def warning(bad_object, error_name, *args): |
11 def warning(bad_object, error_name, **args): |
12 return report_element(bad_object, 'warning', error_name, args) |
12 return report_element(bad_object, 'warning', error_name, args) |
13 |
13 |
14 def error(bad_object, error_name, *args): |
14 def error(bad_object, error_name, **args): |
15 return report_element(bad_object, 'error', error_name, args) |
15 return report_element(bad_object, 'error', error_name, args) |
16 |
16 |
17 def test_discovery(): |
17 def test_discovery(): |
18 ''' |
18 ''' |
19 Finds all test modules and yields their names. |
19 Finds all test modules and yields their names. |
65 test_suite[key].update(module.manifest[key]) |
65 test_suite[key].update(module.manifest[key]) |
66 else: |
66 else: |
67 warn(str.format('Module {} does not have a manifest', module_name)) |
67 warn(str.format('Module {} does not have a manifest', module_name)) |
68 return test_suite |
68 return test_suite |
69 |
69 |
|
70 def check_model(model, test_suite = None): |
|
71 if not test_suite: |
|
72 test_suite = load_tests() |
|
73 report = [] |
|
74 line_numbers = { |
|
75 element: (i, i + 1 + model.body_offset) |
|
76 for i, element in enumerate(model.body) |
|
77 } |
|
78 for test_name, test_function in test_suite['tests'].items(): |
|
79 problems = test_function(model) |
|
80 for problem in problems: |
|
81 problem['body-index'], problem['line-number'] \ |
|
82 = line_numbers[problem['object']] |
|
83 del problem['object'] |
|
84 report.append(problem) |
|
85 return report |
|
86 |
|
87 def format_report(report, model, test_suite): |
|
88 result = [] |
|
89 for problem in report: |
|
90 problem_text = test_suite['messages'][problem['name']] |
|
91 if callable(problem_text): |
|
92 problem_text = problem_text(**problem['args']) |
|
93 message = str.format( |
|
94 'Line {}: {}\n\t{}', |
|
95 problem['line-number'], |
|
96 problem_text, |
|
97 model.body[problem['body-index']].original_code |
|
98 ) |
|
99 result.append((problem['line-number'], message)) |
|
100 return '\n'.join( |
|
101 problem[1] |
|
102 for problem in sorted(result) |
|
103 ) |
|
104 |
70 if __name__ == '__main__': |
105 if __name__ == '__main__': |
71 from pprint import pprint |
106 from pprint import pprint |
72 pprint(load_tests()) |
107 pprint(load_tests()) |