|
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