40#if defined(MICRO_OS_PLUS_INCLUDE_CONFIG_H)
41#include <micro-os-plus/config.h>
44#if defined(MICRO_OS_PLUS_TRACE)
45#include <micro-os-plus/diag/trace.h>
55#pragma GCC diagnostic ignored "-Waggregate-return"
57#pragma clang diagnostic ignored "-Wunknown-warning-option"
58#pragma clang diagnostic ignored "-Wc++98-compat"
59#pragma clang diagnostic ignored "-Wc++98-compat-pedantic"
76 std::unique_ptr<std::vector<std::string_view>> argvs)
79#if defined(MICRO_OS_PLUS_TRACE) \
80 && defined(MICRO_OS_PLUS_TRACE_MICRO_TEST_PLUS_CONSTRUCTORS)
81 trace::printf (
"%s\n", __PRETTY_FUNCTION__);
93#if defined(MICRO_OS_PLUS_TRACE) \
94 && defined(MICRO_OS_PLUS_TRACE_MICRO_TEST_PLUS_CONSTRUCTORS)
95 trace::printf (
"%s\n", __PRETTY_FUNCTION__);
131#if defined(MICRO_OS_PLUS_TRACE) \
132 && defined(MICRO_OS_PLUS_TRACE_MICRO_TEST_PLUS)
133 trace::printf (
"%s\n", __PRETTY_FUNCTION__);
137#pragma GCC diagnostic push
138#if defined(__clang__)
139#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
150 const char* message =
"TAP version 14";
158 printf (
"%s\n", message);
166#pragma GCC diagnostic pop
182#if defined(MICRO_OS_PLUS_TRACE) \
183 && defined(MICRO_OS_PLUS_TRACE_MICRO_TEST_PLUS)
184 trace::printf (
"%s\n", __PRETTY_FUNCTION__);
188#pragma GCC diagnostic push
189#if defined(__clang__)
190#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
196 uint32_t milliseconds = 0;
197 uint32_t microseconds = 0;
203 char message_summary[32];
204 snprintf (message_summary,
sizeof (message_summary),
"1..%zu",
207 char message_totals[160];
208 snprintf (message_totals,
sizeof (message_totals),
209 "total: %zu check%s passed, %zu failed, in %zu test "
210 "case%s, %zu test suite%s",
216 total_suites_count, total_suites_count == 1 ?
"" :
"s");
218 char message_time[120] =
"";
219 if (milliseconds > 0 || microseconds > 0)
221 snprintf (message_time,
sizeof (message_time),
222 ", time: %" PRIu32
".%03" PRIu32
" ms", milliseconds,
228 fprintf (
output_file_,
"%s\n# { %s%s }\n", message_summary,
229 message_totals, message_time);
241 printf (
"%s\n", message_summary);
250 printf (
"# { %s%s }\n", message_totals, message_time);
256#pragma GCC diagnostic pop
273#if defined(MICRO_OS_PLUS_TRACE) \
274 && defined(MICRO_OS_PLUS_TRACE_MICRO_TEST_PLUS)
275#pragma GCC diagnostic push
276#if defined(__clang__)
277#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
279 trace::printf (
"%s '%s'\n", __PRETTY_FUNCTION__,
suite.
name ());
280#pragma GCC diagnostic pop
284#pragma GCC diagnostic push
285#if defined(__clang__)
286#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
290 char message_subtest[120];
291 snprintf (message_subtest,
sizeof (message_subtest),
"# Subtest: %s",
306 printf (
"%s\n", message_subtest);
314#pragma GCC diagnostic pop
330#if defined(MICRO_OS_PLUS_TRACE) \
331 && defined(MICRO_OS_PLUS_TRACE_MICRO_TEST_PLUS)
332#pragma GCC diagnostic push
333#if defined(__clang__)
334#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
337 "%s '%s' +%zu -%zu in xc%zu, xs%zu | cs%zu\n", __PRETTY_FUNCTION__,
343#pragma GCC diagnostic pop
347#pragma GCC diagnostic push
348#if defined(__clang__)
349#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
353 uint32_t milliseconds = 0;
354 uint32_t microseconds = 0;
362 char message_summary[40];
363 snprintf (message_summary,
sizeof (message_summary),
"%s1..%zu",
365 char message_totals[120];
368 snprintf (message_totals,
sizeof (message_totals),
369 "ok %zu - %s # { passed, %zu check%s in %zu "
379 snprintf (message_totals,
sizeof (message_totals),
380 "not ok %zu - %s # { FAILED, %zu check%s "
381 "passed, %zu failed, in %zu test case%s",
390 char message_time[120] =
"";
391 if (milliseconds > 0 || microseconds > 0)
393 snprintf (message_time,
sizeof (message_time),
394 ", time: %" PRIu32
".%03" PRIu32
" ms", milliseconds,
402 fprintf (
output_file_,
"%s\n%s%s }\n", message_summary, message_totals,
426 printf (
"%s\n%s%s }\n", message_summary, message_totals,
437 printf (
"%s\n%s%s }\n", message_summary, message_totals,
449#pragma GCC diagnostic pop
466#if defined(MICRO_OS_PLUS_TRACE) \
467 && defined(MICRO_OS_PLUS_TRACE_MICRO_TEST_PLUS)
468#pragma GCC diagnostic push
469#if defined(__clang__)
470#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
472 trace::printf (
"%s '%s'\n", __PRETTY_FUNCTION__,
subtest.
name ());
473#pragma GCC diagnostic pop
477#pragma GCC diagnostic push
478#if defined(__clang__)
479#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
493 char message_subtest[120];
494 snprintf (message_subtest,
sizeof (message_subtest),
"%s# Subtest: %s",
509 printf (
"%s\n", message_subtest);
517#pragma GCC diagnostic pop
533#if defined(MICRO_OS_PLUS_TRACE) \
534 && defined(MICRO_OS_PLUS_TRACE_MICRO_TEST_PLUS)
535#pragma GCC diagnostic push
536#if defined(__clang__)
537#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
539 trace::printf (
"%s '%s' i%zu +%zu -%zu in xc%zu, xs%zu | cs%zu\n",
547#pragma GCC diagnostic pop
551#pragma GCC diagnostic push
552#if defined(__clang__)
553#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
560 char message_summary[40];
561 snprintf (message_summary,
sizeof (message_summary),
"%s1..%zu",
566 char message_totals[120];
569 snprintf (message_totals,
sizeof (message_totals),
570 "%sok %zu - %s # { passed, %zu check%s }",
indent.c_str (),
577 snprintf (message_totals,
sizeof (message_totals),
578 "%snot ok %zu - %s # { FAILED, %zu check%s "
579 "passed, %zu failed }",
590 fprintf (
output_file_,
"%s\n%s\n", message_summary, message_totals);
611 printf (
"%s\n", message_summary);
618 printf (
"%s1..%zu\n", indent2.c_str (),
622 printf (
"%s\n", message_totals);
633 printf (
"%s\n%s\n", message_summary, message_totals);
644#pragma GCC diagnostic pop
678 *
this <<
indent (level + 1) <<
"ok "
680 if (!message.empty ())
682 *
this << message.c_str ();
713 std::string& message,
const bool has_expression,
718 *
this <<
indent (level + 1) <<
"not ok "
721 if (!message.empty ())
723 *
this <<
" - " << message.c_str ();
729 *
this <<
indent (level + 1) <<
" ---";
733 *
this <<
indent (level + 1) <<
" condition: ";
751 *
this <<
" aborted...";
758 *
this <<
indent (level + 1) <<
" at:" <<
endl;
759 *
this <<
indent (level + 1)
762 *
this <<
indent (level + 1) <<
" line: " << location.
line () <<
endl;
764 *
this <<
indent (level + 1) <<
" ..." <<
endl;
size_t current_subtest_index() const noexcept
Returns the index of the most recently created child subtest.
size_t own_index() const noexcept
Returns the positional index of this object within its parent.
size_t children_subtests_count(void) const noexcept
Returns the number of direct child subtests owned by this node.
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.
size_t executed_checks() const noexcept
Returns the total number of checks executed.
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.
void begin_session(runner &runner) override
Mark the beginning of a test session.
virtual void begin_subtest(subtest &subtest) override
Mark the beginning of a subtest.
reporter_tap & operator<<(detail::indent_t m)
Output operator for the indent_t manipulator.
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.
virtual void end_subtest(subtest &subtest) override
Mark the end of a subtest.
virtual void end_suite(suite &suite) override
Mark the end of a test suite.
void output_fail_suffix_(const reflection::source_location &location, bool abort, subtest &subtest) override
Outputs the suffix for a failing condition.
void end_session(runner &runner) override
Mark the end of a test session.
reporter_tap(std::unique_ptr< std::vector< std::string_view > > argvs)
Constructor for the reporter_tap class.
virtual const char * get_comment_prefix(void) override
Returns the TAP comment prefix string "# ".
void output_pass_prefix_(std::string &message, subtest &subtest) override
Outputs the prefix for a passing condition.
void output_pass_suffix_(subtest &subtest) override
Outputs the suffix for a passing condition.
virtual void begin_suite(suite &suite) override
Mark the beginning of a test suite.
~reporter_tap() override
Destructor for the reporter_tap 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.
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.
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++ TAP 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.