Skip to main content

static_suite Class

A test suite designed for static (namespace-scope) registration with a static_runner. More...

Declaration

class micro_os_plus::micro_test_plus::static_suite { ... }

Included Headers

Base class

classsuite

A named, runnable test suite registered with the test runner. More...

Public Constructors Index

template <typename Callable_T, typename... Args_T>
static_suite (const char *name, static_runner &runner, Callable_T &&callable, Args_T &&... arguments)

Class template constructor for static_suite. More...

static_suite (const static_suite &)=delete

Deleted copy constructor to prevent copying. More...

static_suite (static_suite &&)=delete

Deleted move constructor to prevent moving. More...

Public Destructor Index

~static_suite () override

Virtual destructor. More...

Public Operators Index

static_suite &operator= (const static_suite &)=delete

Deleted copy assignment operator to prevent copying. More...

static_suite &operator= (static_suite &&)=delete

Deleted move assignment operator to prevent moving. More...

Public Member Functions Index

voidabort (const reflection::source_location &sl=reflection::source_location::current())

Aborts test execution via the owning runner. More...

size_tchildren_subtests_count (void) const noexcept

Returns the number of direct child subtests owned by this node. More...

size_tcurrent_subtest_index () const noexcept

Returns the index of the most recently created child subtest. More...

size_tincrement_subtest_index () noexcept

Increments and returns the child subtest sequential index. More...

const char *name (void) const noexcept

Gets the node name. More...

size_town_index () const noexcept

Returns the positional index of this object within its parent. More...

voidown_index (size_t index) noexcept

Sets the positional index of this object within its parent. More...

class reporter &reporter (void) const noexcept

Gets the test reporter associated with this test runnable. More...

voidrun (void) override

Executes the static suite body using the stored static callable. More...

class runner &runner (void) const noexcept

Gets the test runner associated with this test runnable. More...

template <typename Callable_T, typename... Args_T>
voidtest (const char *name, Callable_T &&callable, Args_T &&... arguments)

Adds a test case to the suite. More...

const detail::timestamps &timings () const noexcept

Gets the timings for this suite (const overload). More...

detail::timestamps &timings () noexcept

Gets the timings for this suite. More...

const runner_totals &totals () const noexcept

Gets the totals for the test (const overload). More...

runner_totals &totals () noexcept

Gets the totals for the test. More...

Protected Member Functions Index

voidafter_subtest_create_ (std::unique_ptr< subtest > child_test, suite &suite)

Registers a newly constructed child subtest and executes it immediately. More...

Protected Member Attributes Index

std::function< void(suite &)>callable_

Callable storing the test body and any bound arguments. Invoked with a reference to the derived Self_T instance. More...

std::vector< std::unique_ptr< subtest > >children_subtests_

Owning collection of direct child subtests. More...

size_tcurrent_subtest_index_

The subtest index, counting from 1. More...

const char *name_

The test node name. More...

size_town_index_

The test index, counting from 1. More...

class { ... }runner_

Reference to the test runner that owns this object. More...

std::function< void(static_suite &)>static_callable_

Callable storing the static suite body and any bound arguments. Invoked with a reference to the concrete static_suite instance. More...

detail::timestampstimings_

Timing measurements for this suite's execution. More...

runner_totalstotals_

Totals for the test node, including nested cases. More...

Description

A test suite designed for static (namespace-scope) registration with a static_runner.

static_suite extends suite to support the pattern where test suites are declared as namespace-scope objects and therefore constructed before or after the static_runner instance, in unspecified static-initialisation order.

Upon construction, the suite automatically registers itself with the supplied static_runner by calling static_runner::register_suite_(). The runner defers execution of all registered static suites until static_runner::run_suites_() is invoked, which typically happens inside the implicit main() provided by the framework.

In addition to the standard callable body inherited from suite, a static_suite may carry a second, statically-registered callable stored in static_callable_. The overridden run() method invokes both bodies in sequence, allowing the suite to integrate both dynamic and static registration patterns.

The class is non-copyable and non-movable to preserve unique ownership and consistent state throughout the test session.

Definition at line 923 of file test.h.

Public Constructors

static_suite()

template <typename Callable_T, typename... Args_T>
micro_os_plus::micro_test_plus::static_suite::static_suite (const char * name, static_runner & runner, Callable_T && callable, Args_T &&... arguments)

Class template constructor for static_suite.

Template Parameters
Callable_T

The type of a callable object.

Args_T

The types of the callable arguments.

Parameters
name

The test suite name or description, used in reports.

runner

The static test runner managing this suite.

callable

A generic callable object, usually a lambda or function, invoked to perform the test suite.

arguments

A possibly empty list of arguments to be passed to the callable.

Delegates to runnable, which binds the callable with its arguments. After construction, the suite is registered with the static test runner.

Declaration at line 940 of file test.h, definition at line 499 of file test-inlines.h.

500 Callable_T&& callable, Args_T&&... arguments)
501 // The nullptr passed to the base constructor is an optimisation to save
502 // some space, since this callble is not used by the static runner.
503 : suite{ name, detail::to_runner (runner), nullptr }
504 {
505 if constexpr (sizeof...(arguments) == 0)
506 {
507 static_callable_ = std::forward<Callable_T> (callable);
508 }
509 else
510 {
511 static_callable_ = std::bind (std::forward<Callable_T> (callable),
512 std::placeholders::_1,
513 std::forward<Args_T> (arguments)...);
514 }
515
516#if defined(MICRO_OS_PLUS_MICRO_TEST_PLUS_TRACE_CONSTRUCTORS_ENABLED)
517#if defined(__GNUC__)
518#pragma GCC diagnostic push
519#if defined(__clang__)
520#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
521#endif
522#endif
523 trace::printf ("%s '%s' %zu\n", __PRETTY_FUNCTION__, name, own_index_);
524#if defined(__GNUC__)
525#pragma GCC diagnostic pop
526#endif
527#endif // MICRO_OS_PLUS_MICRO_TEST_PLUS_TRACE_CONSTRUCTORS_ENABLED
528
530 }

References micro_os_plus::micro_test_plus::suite::suite, micro_os_plus::micro_test_plus::detail::runnable< suite >::name, micro_os_plus::micro_test_plus::detail::runnable< suite >::own_index_, micro_os_plus::micro_test_plus::detail::register_static_suite and static_callable_.

Referenced by static_suite, static_suite, operator= and operator=.

static_suite()

micro_os_plus::micro_test_plus::static_suite::static_suite (const static_suite &)
delete

Deleted copy constructor to prevent copying.

Definition at line 946 of file test.h.

Reference static_suite.

static_suite()

micro_os_plus::micro_test_plus::static_suite::static_suite (static_suite &&)
delete

Deleted move constructor to prevent moving.

Definition at line 951 of file test.h.

Reference static_suite.

Public Destructor

~static_suite()

micro_os_plus::micro_test_plus::static_suite::~static_suite ()
virtual

Virtual destructor.

No resources are owned directly by static_suite; the destructor performs no explicit clean-up. If tracing is enabled, the suite name is output for diagnostic purposes.

Declaration at line 970 of file test.h, definition at line 443 of file test.cpp.

444 {
445#if defined(MICRO_OS_PLUS_MICRO_TEST_PLUS_TRACE_CONSTRUCTORS_ENABLED)
446#if defined(__GNUC__)
447#pragma GCC diagnostic push
448#if defined(__clang__)
449#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
450#endif
451#endif
452 trace::printf ("%s '%s'\n", __PRETTY_FUNCTION__, name_);
453#if defined(__GNUC__)
454#pragma GCC diagnostic pop
455#endif
456#endif // MICRO_OS_PLUS_MICRO_TEST_PLUS_TRACE_CONSTRUCTORS_ENABLED
457 }

Reference micro_os_plus::micro_test_plus::detail::runnable< suite >::name_.

Public Operators

operator=()

static_suite & micro_os_plus::micro_test_plus::static_suite::operator= (const static_suite &)
delete

Deleted copy assignment operator to prevent copying.

Definition at line 957 of file test.h.

Reference static_suite.

operator=()

static_suite & micro_os_plus::micro_test_plus::static_suite::operator= (static_suite &&)
delete

Deleted move assignment operator to prevent moving.

Definition at line 964 of file test.h.

References static_suite and run.

Public Member Functions

abort()

void micro_os_plus::micro_test_plus::detail::runnable_base::abort (const reflection::source_location & sl=reflection::source_location::current())

Aborts test execution via the owning runner.

Parameters
sl

The source location from which the abort is triggered.

Returns

Does not return.

Delegates immediately to runner_.abort(), passing the supplied source location so that the error message identifies the call site before the process is terminated via ::abort().

Declaration at line 369 of file test.h, definition at line 202 of file test.cpp.

203 {
204 runner_.abort (sl);
205 }

children_subtests_count()

size_t micro_os_plus::micro_test_plus::detail::runnable_base::children_subtests_count (void)
inline nodiscard noexcept

Returns the number of direct child subtests owned by this node.

Parameters

None.

Returns

The number of child subtests.

Returns the number of child subtests owned by this node.

Declaration at line 349 of file test.h, definition at line 164 of file test-inlines.h.

165 {
166 return children_subtests_.size ();
167 }

current_subtest_index()

size_t micro_os_plus::micro_test_plus::detail::runnable_base::current_subtest_index ()
inline nodiscard noexcept

Returns the index of the most recently created child subtest.

Parameters

None.

Returns

The current child subtest sequential index.

Returns the sequential index of the most recently created child subtest.

Declaration at line 329 of file test.h, definition at line 142 of file test-inlines.h.

143 {
145 }

increment_subtest_index()

size_t micro_os_plus::micro_test_plus::detail::runnable_base::increment_subtest_index ()
inline noexcept

Increments and returns the child subtest sequential index.

Parameters

None.

Returns

The new index value after incrementing.

Each call to test() invokes this method before constructing the new subtest, so the index values form a strictly increasing, one-based sequence.

Declaration at line 339 of file test.h, definition at line 154 of file test-inlines.h.

155 {
157 }

Referenced by micro_os_plus::micro_test_plus::suite::test.

name()

const char * micro_os_plus::micro_test_plus::detail::test_node::name (void)
inline nodiscard noexcept

Gets the node name.

Parameters

None.

Returns

A pointer to the null-terminated test node name.

Returns a pointer to the null-terminated name stored in name_.

Declaration at line 194 of file test.h, definition at line 90 of file test-inlines.h.

90 test_node::name (void) const noexcept
91 {
92 return name_;
93 }

Referenced by static_suite, micro_os_plus::micro_test_plus::suite::suite, micro_os_plus::micro_test_plus::suite::operator= and micro_os_plus::micro_test_plus::suite::test.

own_index()

size_t micro_os_plus::micro_test_plus::detail::runnable_base::own_index ()
inline nodiscard noexcept

Returns the positional index of this object within its parent.

Parameters

None.

Returns

The one-based own index.

Returns the one-based positional index of this object within its parent.

Declaration at line 305 of file test.h, definition at line 122 of file test-inlines.h.

122 runnable_base::own_index () const noexcept
123 {
124 return own_index_;
125 }

Referenced by micro_os_plus::micro_test_plus::suite::test.

own_index()

void micro_os_plus::micro_test_plus::detail::runnable_base::own_index (size_t index)
inline noexcept

Sets the positional index of this object within its parent.

info

This overload follows the same-name getter/setter pattern used throughout the framework: the getter is the const overload and the setter is the non-const single-argument overload.

Parameters
index

The new index value.

Returns

Nothing.

Sets the positional index of this object within its parent.

Declaration at line 319 of file test.h, definition at line 132 of file test-inlines.h.

132 runnable_base::own_index (size_t index) noexcept
133 {
134 own_index_ = index;
135 }

reporter()

reporter & micro_os_plus::micro_test_plus::detail::runnable_base::reporter (void)
nodiscard noexcept

Gets the test reporter associated with this test runnable.

Parameters

None.

Returns

A reference to the test reporter.

Delegates immediately to runner_.reporter(), returning the reporter associated with the owning runner instance.

Declaration at line 359 of file test.h, definition at line 190 of file test.cpp.

190 runnable_base::reporter (void) const noexcept
191 {
192 return runner_.reporter ();
193 }

run()

void micro_os_plus::micro_test_plus::static_suite::run (void)
virtual

Executes the static suite body using the stored static callable.

Parameters

None.

Returns

Nothing.

Records the suite begin timestamp, notifies the reporter via begin_suite(), invokes the stored static callable with *this, records the suite end timestamp, and notifies the reporter via end_suite().

Declaration at line 983 of file test.h, definition at line 467 of file test.cpp.

468 {
469#if defined(MICRO_OS_PLUS_MICRO_TEST_PLUS_TRACE_ENABLED)
470#if defined(__GNUC__)
471#pragma GCC diagnostic push
472#if defined(__clang__)
473#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
474#endif
475#endif
476 trace::printf ("%s '%s'\n", __PRETTY_FUNCTION__, name_);
477#if defined(__GNUC__)
478#pragma GCC diagnostic pop
479#endif
480#endif // MICRO_OS_PLUS_MICRO_TEST_PLUS_TRACE_ENABLED
481
482 class reporter& reporter = this->reporter ();
483
484 this->timings ().timestamp_begin ();
485 reporter.begin_suite (*this);
486
487 static_callable_ (*this);
488
489 this->timings ().timestamp_end ();
490 reporter.end_suite (*this);
491 }

References micro_os_plus::micro_test_plus::reporter::begin_suite, micro_os_plus::micro_test_plus::reporter::end_suite, micro_os_plus::micro_test_plus::detail::runnable< suite >::name_, static_callable_ and micro_os_plus::micro_test_plus::suite::timings.

Referenced by operator=.

runner()

class runner & micro_os_plus::micro_test_plus::detail::runnable_base::runner (void)
inline nodiscard noexcept

Gets the test runner associated with this test runnable.

Parameters

None.

Returns

A reference to the test runner.

Returns a reference to the owning test runner.

Declaration at line 380 of file test.h, definition at line 174 of file test-inlines.h.

174 runnable_base::runner (void) const noexcept
175 {
176 return runner_;
177 }

Referenced by micro_os_plus::micro_test_plus::suite::suite and micro_os_plus::micro_test_plus::suite::test.

test()

template <typename Callable_T, typename... Args_T>
void micro_os_plus::micro_test_plus::suite::test (const char * name, Callable_T && callable, Args_T &&... arguments)

Adds a test case to the suite.

Template Parameters
Callable_T

The type of a callable object.

Args_T

The types of the callable arguments.

Parameters
name

The test case name or description, used in reports.

callable

A generic callable object, usually a lambda, invoked to perform the test.

arguments

A possibly empty list of arguments to be passed to the callable.

The test function template registers and executes a test case within the µTest++ framework. It accepts a descriptive name, a callable object (such as a lambda or function pointer), and an optional list of arguments to be passed to the callable. The test case is reported using the provided name, and its execution is managed by the framework's test runner.

Each test case typically involves evaluating a logical expression, such as comparing a computed result to an expected value. For C++ projects, it is also possible to verify whether evaluating an expression throws exceptions. Each test either succeeds or fails, and for expectations, the test runner maintains counts of successful and failed checks.

This function template enables flexible and expressive test case definitions, supporting both parameterised and non-parameterised tests. It is typically invoked at global scope or within test suite definitions to ensure automatic registration and execution.

A test case is characterised by a name, a function that performs the checks, and optionally, arguments to be passed to that function. The implementation of test invokes the provided function with the given arguments and reports the results to the test runner.

Example
 namespace mt = micro_os_plus::micro_test_plus;
 
 ts.test ("Check answer with comparator", [] (auto& t) {
  t.expect (mt::eq (compute_answer (), 42)) << "answer is 42";
 });

Declaration at line 779 of file test.h, definition at line 431 of file test-inlines.h.

431 suite::test (const char* name, Callable_T&& callable, Args_T&&... arguments)
432 {
433#if defined(MICRO_OS_PLUS_MICRO_TEST_PLUS_TRACE_ENABLED)
434#if defined(__GNUC__)
435#pragma GCC diagnostic push
436#if defined(__clang__)
437#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
438#endif
439#endif
440 trace::printf ("%s '%s'\n", __PRETTY_FUNCTION__, name);
441#if defined(__GNUC__)
442#pragma GCC diagnostic pop
443#endif
444#endif // MICRO_OS_PLUS_MICRO_TEST_PLUS_TRACE_ENABLED
445
447 auto child_subtest
448 = std::make_unique<subtest> (name, runner (), *this, own_index, 1,
449 std::forward<Callable_T> (callable),
450 std::forward<Args_T> (arguments)...);
451
452 after_subtest_create_ (std::move (child_subtest), *this);
453 }

References micro_os_plus::micro_test_plus::detail::runnable< suite >::after_subtest_create_, micro_os_plus::micro_test_plus::detail::runnable< suite >::increment_subtest_index, micro_os_plus::micro_test_plus::detail::runnable< suite >::name, micro_os_plus::micro_test_plus::detail::runnable< suite >::own_index and micro_os_plus::micro_test_plus::detail::runnable< suite >::runner.

Referenced by micro_os_plus::micro_test_plus::suite::operator=.

timings()

const detail::timestamps & micro_os_plus::micro_test_plus::suite::timings ()
inline nodiscard noexcept

Gets the timings for this suite (const overload).

Parameters

None.

Returns

A const reference to the timestamps instance.

Returns a const reference to the timestamps member.

Declaration at line 801 of file test.h, definition at line 470 of file test-inlines.h.

470 suite::timings () const noexcept
471 {
472 return timings_;
473 }

Reference micro_os_plus::micro_test_plus::suite::timings_.

timings()

detail::timestamps & micro_os_plus::micro_test_plus::suite::timings ()
inline nodiscard noexcept

Gets the timings for this suite.

Parameters

None.

Returns

A reference to the timestamps instance.

Returns a reference to the timestamps member.

Declaration at line 791 of file test.h, definition at line 460 of file test-inlines.h.

460 suite::timings () noexcept
461 {
462 return timings_;
463 }

Referenced by micro_os_plus::micro_test_plus::reporter_human::end_suite, micro_os_plus::micro_test_plus::reporter_tap::end_suite, micro_os_plus::micro_test_plus::suite::operator= and run.

totals()

const runner_totals & micro_os_plus::micro_test_plus::detail::test_node::totals ()
inline nodiscard noexcept

Gets the totals for the test (const overload).

Parameters

None.

Returns

A const reference to the runner_totals instance.

Returns a const reference to the runner_totals member.

Declaration at line 215 of file test.h, definition at line 110 of file test-inlines.h.

110 test_node::totals () const noexcept
111 {
112 return totals_;
113 }

totals()

runner_totals & micro_os_plus::micro_test_plus::detail::test_node::totals ()
inline nodiscard noexcept

Gets the totals for the test.

Parameters

None.

Returns

A reference to the runner_totals instance.

Returns a reference to the runner_totals member.

Declaration at line 205 of file test.h, definition at line 100 of file test-inlines.h.

101 {
102 return totals_;
103 }

Protected Member Functions

after_subtest_create_()

void micro_os_plus::micro_test_plus::detail::runnable_base::after_subtest_create_ (std::unique_ptr< subtest > child_test, suite & suite)
protected

Registers a newly constructed child subtest and executes it immediately.

Parameters
child_test

Owning pointer to the newly created subtest.

suite

The parent suite to which execution results are reported.

Returns

Nothing.

Transfers ownership of child_test into children_subtests_ and immediately invokes subtest::run() on the newly stored subtest. The parent's executed-subtest counter is then incremented. The child's check counters are intentionally not merged into the parent totals; each subtest reports only its own counters. The child's totals are, however, accumulated into suite so that the suite summary reflects all checks performed by its subtests.

Declaration at line 394 of file test.h, definition at line 218 of file test.cpp.

219 std::unique_ptr<class subtest> child_test, suite& suite)
220 {
221 // Transfer ownership into the vector.
222 children_subtests_.push_back (std::move (child_test));
223
224 // Run the child test case immediately.
225 class subtest& subtest = *children_subtests_.back ();
226 subtest.run ();
227
228 // This test executed one more subtest.
229#if defined(MICRO_OS_PLUS_MICRO_TEST_PLUS_TRACE_CONSTRUCTORS_ENABLED)
230#if defined(__GNUC__)
231#pragma GCC diagnostic push
232#if defined(__clang__)
233#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
234#endif
235#endif
236 trace::printf ("%s subtest '%s' executed one more subtest\n",
237 __PRETTY_FUNCTION__, name ());
238#if defined(__GNUC__)
239#pragma GCC diagnostic pop
240#endif
241#endif // MICRO_OS_PLUS_MICRO_TEST_PLUS_TRACE_CONSTRUCTORS_ENABLED
243 // Do not accumulate the totals from the child test into the current test
244 // totals, each subtest shows only its counters.
245
246#if defined(MICRO_OS_PLUS_MICRO_TEST_PLUS_TRACE_CONSTRUCTORS_ENABLED)
247#if defined(__GNUC__)
248#pragma GCC diagnostic push
249#if defined(__clang__)
250#pragma clang diagnostic ignored "-Wunsafe-buffer-usage-in-libc-call"
251#endif
252#endif
253 trace::printf ("%s suite '%s' totals\n", __PRETTY_FUNCTION__,
254 suite.name ());
255#if defined(__GNUC__)
256#pragma GCC diagnostic pop
257#endif
258#endif // MICRO_OS_PLUS_MICRO_TEST_PLUS_TRACE_CONSTRUCTORS_ENABLED
259
260 // Accumulate the totals from the child test into the suite totals.
261 suite.totals () += subtest.totals ();
262 }

Referenced by micro_os_plus::micro_test_plus::suite::test.

Protected Member Attributes

callable_

std::function<void (suite&)> micro_os_plus::micro_test_plus::detail::runnable< suite >::callable_
protected

Callable storing the test body and any bound arguments. Invoked with a reference to the derived Self_T instance.

Definition at line 512 of file test.h.

512 std::function<void (Self_T&)> callable_;

Referenced by micro_os_plus::micro_test_plus::top_suite::name.

children_subtests_

std::vector<std::unique_ptr<subtest> > micro_os_plus::micro_test_plus::detail::runnable_base::children_subtests_
protected

Owning collection of direct child subtests.

Each call to test() appends a new subtest to this vector and runs it immediately. The vector retains ownership for the lifetime of the parent runnable.

Definition at line 427 of file test.h.

427 std::vector<std::unique_ptr<subtest>> children_subtests_;

current_subtest_index_

size_t micro_os_plus::micro_test_plus::detail::runnable_base::current_subtest_index_
protected

The subtest index, counting from 1.

This index is used for reporting and tracking the execution order of subtests within a suite, especially when nested subtests are involved. It is incremented for each subtest created, allowing for clear identification of subtests in reports and diagnostics.

Definition at line 417 of file test.h.

name_

const char* micro_os_plus::micro_test_plus::detail::test_node::name_
protected

The test node name.

info

Derived classes may access this member directly in addition to the public name() getter.

Definition at line 224 of file test.h.

224 const char* name_;

Referenced by ~static_suite, micro_os_plus::micro_test_plus::suite::~suite, micro_os_plus::micro_test_plus::top_suite::~top_suite, micro_os_plus::micro_test_plus::top_suite::name and run.

own_index_

size_t micro_os_plus::micro_test_plus::detail::runnable_base::own_index_
protected

The test index, counting from 1.

Definition at line 406 of file test.h.

406 size_t own_index_;

Referenced by static_suite.

runner_

class runner& micro_os_plus::micro_test_plus::detail::runnable_base::runner_
protected

Reference to the test runner that owns this object.

Definition at line 401 of file test.h.

static_callable_

std::function<void (static_suite&)> micro_os_plus::micro_test_plus::static_suite::static_callable_
protected

Callable storing the static suite body and any bound arguments. Invoked with a reference to the concrete static_suite instance.

Definition at line 990 of file test.h.

990 std::function<void (static_suite&)> static_callable_;

Referenced by static_suite and run.

timings_

detail::timestamps micro_os_plus::micro_test_plus::suite::timings_
protected

Timing measurements for this suite's execution.

Definition at line 818 of file test.h.

818 detail::timestamps timings_;

Referenced by micro_os_plus::micro_test_plus::detail::runnable< subtest >::runnable and micro_os_plus::micro_test_plus::suite::timings.

totals_

runner_totals micro_os_plus::micro_test_plus::detail::test_node::totals_
protected

Totals for the test node, including nested cases.

Definition at line 229 of file test.h.


The documentation for this class was generated from the following files:


Generated via doxygen2docusaurus 2.2.1 by Doxygen 1.17.0.