46#ifndef MICRO_TEST_PLUS_TEST_INLINES_H_
47#define MICRO_TEST_PLUS_TEST_INLINES_H_
58#if defined(MICRO_OS_PLUS_TRACE)
59#include <micro-os-plus/diag/trace.h>
68#pragma GCC diagnostic push
69#pragma GCC diagnostic ignored "-Waggregate-return"
71#pragma clang diagnostic ignored "-Wunknown-warning-option"
72#pragma clang diagnostic ignored "-Wc++98-compat"
73#pragma clang diagnostic ignored "-Wc++98-compat-pedantic"
75#pragma GCC diagnostic ignored "-Wredundant-tags"
190 template <
typename Self_T>
191 template <
typename Callable_T,
typename... Args_T>
194 Args_T&&... arguments)
202 if constexpr (
sizeof...(arguments) == 0)
204 callable_ = std::forward<Callable_T> (callable);
208 callable_ = std::bind (std::forward<Callable_T> (callable),
209 std::placeholders::_1,
210 std::forward<Args_T> (arguments)...);
213#if defined(MICRO_OS_PLUS_TRACE) \
214 && defined(MICRO_OS_PLUS_MICRO_TEST_PLUS_TRACE_CONSTRUCTORS_ENABLED)
216#pragma GCC diagnostic push
217#if defined(__clang__)
218#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
221 trace::printf (
"%s '%s' %zu\n", __PRETTY_FUNCTION__,
name,
own_index_);
223#pragma GCC diagnostic pop
234 template <
typename Self_T>
237#if defined(MICRO_OS_PLUS_TRACE) \
238 && defined(MICRO_OS_PLUS_MICRO_TEST_PLUS_TRACE_CONSTRUCTORS_ENABLED)
240#pragma GCC diagnostic push
241#if defined(__clang__)
242#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
245 trace::printf (
"%s '%s'\n", __PRETTY_FUNCTION__,
name_);
247#pragma GCC diagnostic pop
262 template <
typename Callable_T,
typename... Args_T>
266 Args_T&&... arguments)
268 std::forward<Callable_T> (callable),
269 std::forward<Args_T> (arguments)... },
270 parent_suite_{ parent_suite }, nesting_depth_{ nesting_depth }
272#if defined(MICRO_OS_PLUS_TRACE) \
273 && defined(MICRO_OS_PLUS_MICRO_TEST_PLUS_TRACE_CONSTRUCTORS_ENABLED)
275#pragma GCC diagnostic push
276#if defined(__clang__)
277#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
280 trace::printf (
"%s '%s' %zu %zu\n", __PRETTY_FUNCTION__, name, own_index_,
283#pragma GCC diagnostic pop
294 template <
typename Callable_T,
typename... Args_T>
297 Args_T&&... arguments)
299#if defined(MICRO_OS_PLUS_TRACE) \
300 && defined(MICRO_OS_PLUS_MICRO_TEST_PLUS_TRACE_ENABLED)
302#pragma GCC diagnostic push
303#if defined(__clang__)
304#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
307 trace::printf (
"%s '%s'\n", __PRETTY_FUNCTION__,
name);
309#pragma GCC diagnostic pop
314 auto child_subtest = std::make_unique<subtest> (
316 std::forward<Callable_T> (callable),
317 std::forward<Args_T> (arguments)...);
328 template <
class Expr_T>
343 template <
class Expr_T>
371 template <
typename Callable_T,
typename... Args_T>
373 Args_T&&... arguments)
375 std::forward<Args_T> (arguments)... }
377#if defined(MICRO_OS_PLUS_TRACE) \
378 && defined(MICRO_OS_PLUS_MICRO_TEST_PLUS_TRACE_CONSTRUCTORS_ENABLED)
380#pragma GCC diagnostic push
381#if defined(__clang__)
382#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
385 trace::printf (
"%s '%s' %zu\n", __PRETTY_FUNCTION__,
name,
own_index_);
387#pragma GCC diagnostic pop
393#pragma GCC diagnostic push
394#if defined(__clang__)
395#pragma clang diagnostic ignored "-Wdocumentation"
434#pragma GCC diagnostic pop
436 template <
typename Callable_T,
typename... Args_T>
440#if defined(MICRO_OS_PLUS_TRACE) \
441 && defined(MICRO_OS_PLUS_MICRO_TEST_PLUS_TRACE_ENABLED)
443#pragma GCC diagnostic push
444#if defined(__clang__)
445#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
448 trace::printf (
"%s '%s'\n", __PRETTY_FUNCTION__,
name);
450#pragma GCC diagnostic pop
457 std::forward<Callable_T> (callable),
458 std::forward<Args_T> (arguments)...);
506 template <
typename Callable_T,
typename... Args_T>
508 Callable_T&& callable, Args_T&&... arguments)
513 if constexpr (
sizeof...(arguments) == 0)
520 std::placeholders::_1,
521 std::forward<Args_T> (arguments)...);
524#if defined(MICRO_OS_PLUS_TRACE) \
525 && defined(MICRO_OS_PLUS_MICRO_TEST_PLUS_TRACE_CONSTRUCTORS_ENABLED)
527#pragma GCC diagnostic push
528#if defined(__clang__)
529#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
532 trace::printf (
"%s '%s' %zu\n", __PRETTY_FUNCTION__,
name,
own_index_);
534#pragma GCC diagnostic pop
545#pragma GCC diagnostic pop
Deferred reporter class for a specific expression.
class runner & runner(void) const noexcept
Gets the test runner associated with this test runnable.
size_t current_subtest_index() const noexcept
Returns the index of the most recently created child subtest.
runnable_base(const char *name, runner &runner, size_t own_index)
Constructs a runnable_base with a name, runner, and index.
void after_subtest_create_(std::unique_ptr< subtest > child_test, suite &suite)
size_t own_index_
The test index, counting from 1.
size_t own_index() const noexcept
Returns the positional index of this object within its parent.
size_t current_subtest_index_
The subtest index, counting from 1.
class reporter & reporter(void) const noexcept
size_t children_subtests_count(void) const noexcept
Returns the number of direct child subtests owned by this node.
class runner & runner_
Reference to the test runner that owns this object.
size_t increment_subtest_index() noexcept
Increments and returns the child subtest sequential index.
std::vector< std::unique_ptr< subtest > > children_subtests_
Owning collection of direct child subtests.
std::function< void(suite &)> callable_
runnable(const char *name, class runner &runner, size_t own_index, Callable_T &&callable, Args_T &&... arguments)
Class template constructor.
virtual ~runnable() override
Virtual destructor.
Aggregated pass/fail/subtest counters for a node in the test tree.
const char * name(void) const noexcept
Gets the node name.
runner_totals totals_
Totals for the test node, including nested cases.
runner_totals & totals() noexcept
Gets the totals for the test.
const char * name_
The test node name.
A begin/end timestamp pair used to measure elapsed time.
Local implementation of source location information for diagnostics.
detail::expression_formatter & expression()
Provides access to the expression formatter for this reporter.
The test runner for the µTest++ framework.
A runner variant that also manages statically-registered test suites.
std::function< void(static_suite &)> static_callable_
Callable storing the static suite body and any bound arguments. Invoked with a reference to the concr...
static_suite(const char *name, static_runner &runner, Callable_T &&callable, Args_T &&... arguments)
Class template constructor for static_suite.
suite & parent_suite_
Reference to the parent suite that owns this subtest.
void test(const char *name, Callable_T &&callable, Args_T &&... arguments)
Adds a test case to the suite.
subtest(const char *name, class runner &runner, suite &parent_suite, size_t own_index, size_t nesting_depth, Callable_T &&callable, Args_T &&... arguments)
Constructs a subtest with a name, runner, parent suite, index, nesting depth, and callable.
size_t nesting_depth_
The nesting depth of this subtest within the suite.
size_t nesting_depth() const noexcept
Returns the nesting depth of this subtest.
A named, runnable test suite registered with the test runner.
suite(const char *name, class runner &runner, Callable_T &&callable, Args_T &&... arguments)
Constructs a suite with a name, runner, and callable body.
detail::timestamps timings_
Timing measurements for this suite's execution.
detail::timestamps & timings() noexcept
Gets the timings for this suite.
void test(const char *name, Callable_T &&callable, Args_T &&... arguments)
Adds a test case to the suite.
const char * name(void) const noexcept
Gets the node name.
void name(const char *new_name) noexcept
Sets the name of the top-level suite.
C++20 concept satisfied when a type can be used as a test expression in expect() or assume().
C++ header file with declarations for the µTest++ deferred reporter.
auto assume(const Expr_T &expr, const reflection::source_location &sl=reflection::source_location::current())
Check a condition and, if false, abort test execution.
auto expect(const Expr_T &expr, const reflection::source_location &sl=reflection::source_location::current())
Evaluate a generic condition and report the results.
Internal implementation details for the µTest++ framework.
void register_static_suite(static_runner &static_runner_ref, static_suite &static_suite_ref)
Registers a static suite with a static runner.
Primary namespace for the µTest++ testing framework.
C++ header file with declarations for the µTest++ test reporter.