|
57 | 57 | logger = logging.getLogger('twister')
|
58 | 58 | logger.setLevel(logging.DEBUG)
|
59 | 59 | import expr_parser
|
| 60 | +from anytree import Node, RenderTree |
60 | 61 |
|
61 | 62 |
|
62 | 63 | class ExecutionCounter(object):
|
@@ -146,44 +147,42 @@ def _find_number_length(n):
|
146 | 147 |
|
147 | 148 | def summary(self):
|
148 | 149 | selected_cases = self.cases - self.filtered_cases
|
149 |
| - completed_configs = self.done - self.filtered_static - self.filtered_runtime |
150 |
| - |
151 |
| - # Find alignment length for aesthetic printing |
152 |
| - suites_n_length = self._find_number_length(self.total if self.total > self.done else self.done) |
153 |
| - completed_suites_n_length = self._find_number_length(completed_configs) |
154 |
| - filtered_suites_n_length = self._find_number_length(self.filtered_configs) |
155 |
| - total_cases_n_length = self._find_number_length(self.cases) |
156 |
| - selected_cases_n_length = self._find_number_length(selected_cases) |
157 |
| - |
158 |
| - print("--------------------------------------------------") |
159 |
| - print(f"{'Total test suites: ':<23}{self.total:>{suites_n_length}}") # actually test instances |
160 |
| - print(f"{'Processed test suites: ':<23}{self.done:>{suites_n_length}}") |
161 |
| - print(f"└─{'Filtered test suites: ':<21}{self.filtered_configs}") |
162 |
| - print(f" ├─ {'Filtered test suites (static): ':<37}{self.filtered_static:>{filtered_suites_n_length}}") |
163 |
| - print(f" └─ {'Filtered test suites (at runtime): ':<37}{self.filtered_runtime:>{filtered_suites_n_length}}") |
164 |
| - print(f"└─ {'Selected test suites: ':<37}{completed_configs:>{completed_suites_n_length}}") |
165 |
| - print(f" ├─ {'Skipped test suites: ':<37}{self.skipped:>{completed_suites_n_length}}") |
166 |
| - print(f" ├─ {'Passed test suites: ':<37}{self.passed:>{completed_suites_n_length}}") |
167 |
| - print(f" ├─ {'Built only test suites: ':<37}{self.notrun:>{completed_suites_n_length}}") |
168 |
| - print(f" ├─ {'Failed test suites: ':<37}{self.failed:>{completed_suites_n_length}}") |
169 |
| - print(f" └─ {'Errors in test suites: ':<37}{self.error:>{completed_suites_n_length}}") |
170 |
| - print("---------------------- ----------------------") |
171 |
| - print(f"{'Total test cases: ':<18}{self.cases}") |
172 |
| - print(f"├─ {'Filtered test cases: ':<21}{self.filtered_cases:>{total_cases_n_length}}") |
173 |
| - print(f"└─ {'Selected test cases: ':<21}{selected_cases:>{total_cases_n_length}}") |
174 |
| - print(f" ├─ {'Passed test cases: ':<25}{self.passed_cases:>{selected_cases_n_length}}") |
175 |
| - print(f" ├─ {'Skipped test cases: ':<25}{self.skipped_cases:>{total_cases_n_length}}") |
176 |
| - print(f" ├─ {'Built only test cases: ':<25}{self.notrun_cases:>{selected_cases_n_length}}") |
177 |
| - print(f" ├─ {'Blocked test cases: ':<25}{self.blocked_cases:>{selected_cases_n_length}}") |
178 |
| - print(f" ├─ {'Failed test cases: ':<25}{self.failed_cases:>{selected_cases_n_length}}") |
179 |
| - print(f" {'├' if self.none_cases or self.started_cases else '└'}─ {'Errors in test cases: ':<25}{self.error_cases:>{selected_cases_n_length}}") |
| 150 | + selected_configs = self.done - self.filtered_static - self.filtered_runtime |
| 151 | + |
| 152 | + |
| 153 | + root = Node("Summary") |
| 154 | + |
| 155 | + Node(f"Total test suites: {self.total}", parent=root) |
| 156 | + processed_suites = Node(f"Processed test suites: {self.done}", parent=root) |
| 157 | + filtered_suites = Node(f"Filtered test suites: {self.filtered_configs}", parent=processed_suites) |
| 158 | + Node(f"Filtered test suites (static): {self.filtered_static}", parent=filtered_suites) |
| 159 | + Node(f"Filtered test suites (at runtime): {self.filtered_runtime}", parent=filtered_suites) |
| 160 | + selected_suites = Node(f"Selected test suites: {selected_configs}", parent=processed_suites) |
| 161 | + Node(f"Skipped test suites: {self.skipped}", parent=selected_suites) |
| 162 | + Node(f"Passed test suites: {self.passed}", parent=selected_suites) |
| 163 | + Node(f"Built only test suites: {self.notrun}", parent=selected_suites) |
| 164 | + Node(f"Failed test suites: {self.failed}", parent=selected_suites) |
| 165 | + Node(f"Errors in test suites: {self.error}", parent=selected_suites) |
| 166 | + |
| 167 | + total_cases = Node(f"Total test cases: {self.cases}", parent=root) |
| 168 | + Node(f"Filtered test cases: {self.filtered_cases}", parent=total_cases) |
| 169 | + selected_cases_node = Node(f"Selected test cases: {selected_cases}", parent=total_cases) |
| 170 | + Node(f"Passed test cases: {self.passed_cases}", parent=selected_cases_node) |
| 171 | + Node(f"Skipped test cases: {self.skipped_cases}", parent=selected_cases_node) |
| 172 | + Node(f"Built only test cases: {self.notrun_cases}", parent=selected_cases_node) |
| 173 | + Node(f"Blocked test cases: {self.blocked_cases}", parent=selected_cases_node) |
| 174 | + Node(f"Failed test cases: {self.failed_cases}", parent=selected_cases_node) |
| 175 | + error_cases_node = Node(f"Errors in test cases: {self.error_cases}", parent=selected_cases_node) |
| 176 | + |
180 | 177 | if self.none_cases or self.started_cases:
|
181 |
| - print(f" ├──── The following test case statuses should not appear in a proper execution ───") |
| 178 | + Node("The following test case statuses should not appear in a proper execution", parent=error_cases_node) |
182 | 179 | if self.none_cases:
|
183 |
| - print(f" {'├' if self.started_cases else '└'}─ {'Statusless test cases: ':<25}{self.none_cases:>{selected_cases_n_length}}") |
| 180 | + Node(f"Statusless test cases: {self.none_cases}", parent=error_cases_node) |
184 | 181 | if self.started_cases:
|
185 |
| - print(f" └─ {'Test cases only started: ':<25}{self.started_cases:>{selected_cases_n_length}}") |
186 |
| - print("--------------------------------------------------") |
| 182 | + Node(f"Test cases only started: {self.started_cases}", parent=error_cases_node) |
| 183 | + |
| 184 | + for pre, _, node in RenderTree(root): |
| 185 | + print("%s%s" % (pre, node.name)) |
187 | 186 |
|
188 | 187 | @property
|
189 | 188 | def warnings(self):
|
|
0 commit comments