39#if __has_include(<micro-os-plus/project-config.h>)
40#include <micro-os-plus/project-config.h>
41#elif __has_include(<micro-os-plus/config.h>)
43 "micro-os-plus/config.h is deprecated, rename to micro-os-plus/project-config.h and include it instead of micro-os-plus/config.h"
44#include <micro-os-plus/config.h>
47#if __has_include(<micro-os-plus/micro-test-plus-defines.h>)
48#include <micro-os-plus/micro-test-plus-defines.h>
51#include <micro-os-plus/diag/trace.h>
60#if defined(__APPLE__) || defined(__linux__) || defined(__unix__)
68#pragma GCC diagnostic ignored "-Waggregate-return"
70#pragma clang diagnostic ignored "-Wunknown-warning-option"
71#pragma clang diagnostic ignored "-Wc++98-compat"
72#pragma clang diagnostic ignored "-Wc++98-compat-pedantic"
91 std::unique_ptr<std::vector<std::string_view>> argvs)
94#if defined(MICRO_OS_PLUS_MICRO_TEST_PLUS_TRACE_CONSTRUCTORS_ENABLED)
95 trace::printf (
"%s\n", __PRETTY_FUNCTION__);
98#if defined(__APPLE__) || defined(__linux__) || defined(__unix__)
99 if (isatty (fileno (stdout)))
114#if defined(MICRO_OS_PLUS_MICRO_TEST_PLUS_TRACE_CONSTRUCTORS_ENABLED)
115 trace::printf (
"%s\n", __PRETTY_FUNCTION__);
157#if defined(MICRO_OS_PLUS_MICRO_TEST_PLUS_TRACE_ENABLED)
158 trace::printf (
"%s\n", __PRETTY_FUNCTION__);
162#pragma GCC diagnostic push
163#if defined(__clang__)
164#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
175 const char* message =
"µTest++ human report";
183 printf (
"%s\n", message);
191#pragma GCC diagnostic pop
207#if defined(MICRO_OS_PLUS_MICRO_TEST_PLUS_TRACE_ENABLED)
208 trace::printf (
"%s\n", __PRETTY_FUNCTION__);
212#pragma GCC diagnostic push
213#if defined(__clang__)
214#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
227 uint32_t milliseconds = 0;
228 uint32_t microseconds = 0;
235 char message_totals[300];
236 snprintf (message_totals,
sizeof (message_totals),
237 "Total: %zu check%s passed, %zu failed, in %zu test "
238 "case%s, %zu test suite%s",
244 total_suites_count, total_suites_count == 1 ?
"" :
"s");
246 char message_time[120] =
"";
247 if (milliseconds > 0 || microseconds > 0)
249 snprintf (message_time,
sizeof (message_time),
250 ", time: %" PRIu32
".%03" PRIu32
" ms", milliseconds,
263 message_totals, message_time);
274 message_totals, message_time);
281#pragma GCC diagnostic pop
300#if defined(MICRO_OS_PLUS_MICRO_TEST_PLUS_TRACE_ENABLED)
301#pragma GCC diagnostic push
302#if defined(__clang__)
303#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
305 trace::printf (
"%s '%s'\n", __PRETTY_FUNCTION__,
suite.
name ());
306#pragma GCC diagnostic pop
310#pragma GCC diagnostic push
311#if defined(__clang__)
312#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
336#pragma GCC diagnostic pop
355#if defined(MICRO_OS_PLUS_MICRO_TEST_PLUS_TRACE_ENABLED)
357#pragma GCC diagnostic push
358#if defined(__clang__)
359#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
362 trace::printf (
"%s '%s'\n", __PRETTY_FUNCTION__,
suite.
name ());
364#pragma GCC diagnostic pop
369#pragma GCC diagnostic push
370#if defined(__clang__)
371#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
375 uint32_t milliseconds = 0;
376 uint32_t microseconds = 0;
382 char message_time[120] =
"";
383 if (milliseconds > 0 || microseconds > 0)
385 snprintf (message_time,
sizeof (message_time),
386 ", time: %" PRIu32
".%03" PRIu32
" ms", milliseconds,
405 char message_totals[300];
406 snprintf (message_totals,
sizeof (message_totals),
407 "(%zu check%s in %zu test case%s)",
418 message_totals, message_time);
429 suite.
name (), message_totals, message_time);
435 char message_totals[300];
436 snprintf (message_totals,
sizeof (message_totals),
437 "(%zu check%s passed, %zu "
438 "failed, in %zu test case%s)",
450 message_totals, message_time);
457 printf (
"%s✗%s %s - %sFAILED%s %s%s\n",
colours_.fail,
459 message_totals, message_time);
471#pragma GCC diagnostic pop
491#if defined(MICRO_OS_PLUS_MICRO_TEST_PLUS_TRACE_ENABLED)
493#pragma GCC diagnostic push
494#if defined(__clang__)
495#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
498 trace::printf (
"%s '%s'\n", __PRETTY_FUNCTION__,
subtest.
name ());
500#pragma GCC diagnostic pop
505#pragma GCC diagnostic push
506#if defined(__clang__)
507#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
515 "Buffer not empty at the beginning of a test case:\n%s\n",
543#pragma GCC diagnostic pop
562#if defined(MICRO_OS_PLUS_MICRO_TEST_PLUS_TRACE_ENABLED)
564#pragma GCC diagnostic push
565#if defined(__clang__)
566#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
569 trace::printf (
"%s '%s' i%zu\n", __PRETTY_FUNCTION__,
subtest.
name (),
572#pragma GCC diagnostic pop
577#pragma GCC diagnostic push
578#if defined(__clang__)
579#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
600 char message_totals[300];
601 snprintf (message_totals,
sizeof (message_totals),
636 char message_totals[300];
637 snprintf (message_totals,
sizeof (message_totals),
638 "(%zu check%s passed, %zu failed)",
667 printf (
"%s%s✗%s %s - %sFAILED%s %s\n",
indent.c_str (),
681#pragma GCC diagnostic pop
715 *
this <<
indent (level + 1);
717 if (!message.empty ())
719 *
this << message.c_str ();
752 std::string& message,
const bool has_expression,
756#pragma GCC diagnostic push
757#if defined(__clang__)
758#pragma clang diagnostic ignored "-Wsign-conversion"
759#elif defined(__GNUC__)
760#pragma GCC diagnostic ignored "-Wnarrowing"
761#pragma GCC diagnostic ignored "-Wsign-conversion"
767 *
this <<
indent (level + 1);
769 if (!message.empty ())
771 *
this << message.c_str ();
783#pragma GCC diagnostic pop
804 *
this <<
" aborted...";
size_t executed_subtests() const noexcept
Returns the number of subtests that were executed.
size_t successful_checks() const noexcept
Returns the number of checks that passed.
bool was_successful(void) const noexcept
Checks whether all executed checks were successful.
size_t failed_checks() const noexcept
Returns the number of checks that failed.
const char * name(void) const noexcept
Gets the node name.
runner_totals & totals() noexcept
Gets the totals for the test.
bool has_timestamps(void) const noexcept
Returns true if both begin and end timestamps are available.
void compute_elapsed_time(uint32_t &milliseconds, uint32_t µseconds) const
Computes the elapsed time between begin and end timestamps.
Local implementation of source location information for diagnostics.
constexpr auto file_name(void) const noexcept
Retrieve the file name associated with this source location.
constexpr auto line(void) const noexcept
Retrieve the line number associated with this source location.
virtual void end_subtest(subtest &subtest) override
Mark the end of a subtest.
virtual void begin_suite(suite &suite) override
Mark the beginning of a suite.
void output_fail_prefix_(std::string &message, const bool has_expression, const reflection::source_location &location, subtest &subtest) override
Outputs the prefix for a failing condition.
void end_session(runner &runner) override
Mark the end of a test session.
reporter_human(std::unique_ptr< std::vector< std::string_view > > argvs)
Constructor for the reporter_human class.
virtual void begin_subtest(subtest &subtest) override
Mark the beginning of a subtest.
reporter_human & operator<<(detail::indent_t m)
Output operator for the indent_t manipulator.
void begin_session(runner &runner) override
Mark the beginning of a test session.
virtual void end_suite(suite &suite) override
Mark the end of a test suite.
void output_pass_suffix_(subtest &subtest) override
Outputs the suffix for a passing condition.
virtual const char * get_comment_prefix(void) override
Returns an empty comment prefix string.
void output_pass_prefix_(std::string &message, subtest &subtest) override
Outputs the prefix for a passing condition.
void output_fail_suffix_(const reflection::source_location &location, bool abort, subtest &subtest) override
Outputs the suffix for a failing condition.
~reporter_human() override
Destructor for the reporter_human class.
reporter(std::unique_ptr< std::vector< std::string_view > > argvs)
Constructor for the reporter class.
FILE * output_file_
Optional output file for redirecting test report output.
void write_buffer_to_stdout(void)
Output the current buffered content.
bool add_empty_line_
Controls whether to add an empty line between successful test cases.
std::string buffer_
Output accumulation buffer.
void write_info_(void)
Appends informational (non-result) text to the output buffer.
detail::colours colours_
ANSI colour codes for output formatting.
void write_buffer_to_file_(void)
void flush(void)
Flush the current buffered content.
enum verbosity verbosity_
The verbosity level for test reporting.
The test runner for the µTest++ framework.
detail::timestamps & timings() noexcept
Gets the timings for this runner.
virtual size_t total_suites_count(void) const noexcept
Returns the total count of registered test suites.
A named, runnable test case that lives inside a suite.
size_t nesting_depth() const noexcept
Returns the nesting depth of this subtest.
A named, runnable test suite registered with the test runner.
detail::timestamps & timings() noexcept
Gets the timings for this suite.
constexpr colours colours_red_green
const char * short_name(const char *name) noexcept
Extract a short type or function name from a fully qualified name.
Primary namespace for the µTest++ testing framework.
constexpr size_t indent_size
Number of spaces per indentation level.
detail::indent_t indent(size_t level)
Factory function that creates an indent_t manipulator.
reporter & endl(reporter &stream)
Output stream manipulator for ending a line in test reports.
C++ header file with declarations for the µTest++ human test reporter.
C++ header file with declarations for the µTest++ test runner.
Parameterised stream manipulator for outputting indentation.
size_t level
Number of four-space indentation levels.
C++ header file with declarations for the µTest++ test suite.