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 "-Wc++98-compat"
72#pragma clang diagnostic ignored "-Wc++98-compat-pedantic"
74#pragma GCC diagnostic ignored "-Wredundant-tags"
189 template <
typename Self_T>
190 template <
typename Callable_T,
typename... Args_T>
193 Args_T&&... arguments)
201 if constexpr (
sizeof...(arguments) == 0)
203 callable_ = std::forward<Callable_T> (callable);
207 callable_ = std::bind (std::forward<Callable_T> (callable),
208 std::placeholders::_1,
209 std::forward<Args_T> (arguments)...);
212#if defined(MICRO_OS_PLUS_TRACE) \
213 && defined(MICRO_OS_PLUS_TRACE_MICRO_TEST_PLUS_CONSTRUCTORS)
215#pragma GCC diagnostic push
216#if defined(__clang__)
217#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
220 trace::printf (
"%s '%s' %zu\n", __PRETTY_FUNCTION__,
name,
own_index_);
222#pragma GCC diagnostic pop
233 template <
typename Self_T>
236#if defined(MICRO_OS_PLUS_TRACE) \
237 && defined(MICRO_OS_PLUS_TRACE_MICRO_TEST_PLUS_CONSTRUCTORS)
239#pragma GCC diagnostic push
240#if defined(__clang__)
241#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
244 trace::printf (
"%s '%s'\n", __PRETTY_FUNCTION__,
name_);
246#pragma GCC diagnostic pop
261 template <
typename Callable_T,
typename... Args_T>
265 Args_T&&... arguments)
267 std::forward<Callable_T> (callable),
268 std::forward<Args_T> (arguments)... },
269 parent_suite_{ parent_suite }, nesting_depth_{ nesting_depth }
271#if defined(MICRO_OS_PLUS_TRACE) \
272 && defined(MICRO_OS_PLUS_TRACE_MICRO_TEST_PLUS_CONSTRUCTORS)
274#pragma GCC diagnostic push
275#if defined(__clang__)
276#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
279 trace::printf (
"%s '%s' %zu %zu\n", __PRETTY_FUNCTION__, name, own_index_,
282#pragma GCC diagnostic pop
293 template <
typename Callable_T,
typename... Args_T>
296 Args_T&&... arguments)
298#if defined(MICRO_OS_PLUS_TRACE) \
299 && defined(MICRO_OS_PLUS_TRACE_MICRO_TEST_PLUS)
301#pragma GCC diagnostic push
302#if defined(__clang__)
303#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
306 trace::printf (
"%s '%s'\n", __PRETTY_FUNCTION__,
name);
308#pragma GCC diagnostic pop
313 auto child_subtest = std::make_unique<subtest> (
315 std::forward<Callable_T> (callable),
316 std::forward<Args_T> (arguments)...);
327 template <
class Expr_T>
342 template <
class Expr_T>
370 template <
typename Callable_T,
typename... Args_T>
372 Args_T&&... arguments)
374 std::forward<Args_T> (arguments)... }
376#if defined(MICRO_OS_PLUS_TRACE) \
377 && defined(MICRO_OS_PLUS_TRACE_MICRO_TEST_PLUS_CONSTRUCTORS)
379#pragma GCC diagnostic push
380#if defined(__clang__)
381#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
384 trace::printf (
"%s '%s' %zu\n", __PRETTY_FUNCTION__,
name,
own_index_);
386#pragma GCC diagnostic pop
392#pragma GCC diagnostic push
393#if defined(__clang__)
394#pragma clang diagnostic ignored "-Wdocumentation"
433#pragma GCC diagnostic pop
435 template <
typename Callable_T,
typename... Args_T>
439#if defined(MICRO_OS_PLUS_TRACE) \
440 && defined(MICRO_OS_PLUS_TRACE_MICRO_TEST_PLUS)
442#pragma GCC diagnostic push
443#if defined(__clang__)
444#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
447 trace::printf (
"%s '%s'\n", __PRETTY_FUNCTION__,
name);
449#pragma GCC diagnostic pop
456 std::forward<Callable_T> (callable),
457 std::forward<Args_T> (arguments)...);
505 template <
typename Callable_T,
typename... Args_T>
507 Callable_T&& callable, Args_T&&... arguments)
512 if constexpr (
sizeof...(arguments) == 0)
519 std::placeholders::_1,
520 std::forward<Args_T> (arguments)...);
523#if defined(MICRO_OS_PLUS_TRACE) \
524 && defined(MICRO_OS_PLUS_TRACE_MICRO_TEST_PLUS_CONSTRUCTORS)
526#pragma GCC diagnostic push
527#if defined(__clang__)
528#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
531 trace::printf (
"%s '%s' %zu\n", __PRETTY_FUNCTION__,
name,
own_index_);
533#pragma GCC diagnostic pop
544#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.