179 {
180 auto startTime = std::chrono::system_clock::now();
181 auto test_cases =
cases[suite];
182 std::cout << suite << std::flush;
183 bool suite_nl = false;
184 auto print_suite_nl = [&] {
185 if (suite_nl)
186 return;
187 suite_nl = true;
188 std::cout << "\n";
189 };
191 for (const auto &tc : test_cases) {
192 auto tcStart = std::chrono::system_clock::now();
193 bool printed = false;
194 auto print_case = [&] {
195 print_suite_nl();
196 if (printed) return;
197 printed = true;
198 std::cout << "\tCASE " << tc.name << std::flush;
199 };
200 if (verbose) print_case();
201
202 auto context = mttest::TestContext{};
203
204#if __cpp_exceptions
205 try {
206 tc.case_impl(context);
207 } catch (const std::runtime_error &err) {
208 context.add_error("Uncaught Exception", err, tc.name, 0);
209 } catch (int err) {
210 context.add_error("Uncaught Exception", err, tc.name, 0);
211 } catch (...) {
212 context.add_error("Uncaught Exception", tc.name, 0);
213 }
214#else
215 tc.case_impl(context);
216#endif
217 if (context.errors.empty() && context.failures.empty() && verbose) {
218 std::cout << " [PASS]";
219 } else if (!context.errors.empty()) {
220 print_case();
221 std::cout << " [ERROR]";
223 } else if (!context.failures.empty()) {
224 print_case();
225 std::cout << " [FAILED]";
227 }
228
229 if (printed) {
230 std::cout << " (" <<
231 std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - tcStart).count()
232 << "ms)" << std::endl;
233 }
234
235 for (const auto &err : context.errors) {
236 std::cout << "\t\t" << err.cond << " ERRED WITH " << err.err << "\n"
237 << "\t\t\tWHERE: " << err.file << ":" << err.line << "\n";
238 }
239
240 for (const auto &fail : context.failures) {
241 std::cout << "\t\t" << fail.cond << " FAILED! " << fail.message << "\n"
242 << "\t\t\tWHERE: " << fail.file << ":" << fail.line << "\n";
243 }
244 }
245
246 if (!suite_nl) {
247 std::cout << " ";
248 } else {
249 std::cout << suite << " ";
250 }
251
252 switch (status) {
254 std::cout << "[PASSED]";
255 break;
257 std::cout << "[FAILED]";
258 break;
260 std::cout << "[ERRED]";
261 break;
262 }
263 std::cout << " (" << std::chrono::duration_cast<std::chrono::milliseconds>(
264 std::chrono::system_clock::now() - startTime).count() << "ms)" << std::endl;
265 return status;
266 }