Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/onqtam/doctest.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan <29021710+Saalvage@users.noreply.github.com>2022-05-02 06:19:20 +0300
committerGitHub <noreply@github.com>2022-05-02 06:19:20 +0300
commit94b52bb66753f33ee422d60eda459bfb865c3ae0 (patch)
tree5f6f2726322c2ff66cec97db3fc458b45fdb0228
parent499a0fd6afe5975ec52a7b0e7a49c6d0835a449d (diff)
Add tests for DOCTEST_CONFIG_USE_STD_HEADERS (#643)
* Add std headers * Fix and suppress warnings * Use new-style cast * More fixes to weird ambiguities * Fix MSVC * Try fix ancient GCC * Fix fix * Add missing `typename` * Adjust docs * Test remove enums.cpp * Readd tests * Fix assert count
-rw-r--r--doctest/doctest.h36
-rw-r--r--doctest/parts/doctest.cpp30
-rw-r--r--doctest/parts/doctest_fwd.h6
-rw-r--r--examples/all_features/CMakeLists.txt1
-rw-r--r--examples/all_features/enums.cpp36
-rw-r--r--examples/all_features/test_output/enums.cpp.txt12
-rw-r--r--examples/all_features/test_output/enums.cpp_junit.txt12
-rw-r--r--examples/all_features/test_output/enums.cpp_xml.txt12
-rw-r--r--examples/all_features/test_output/no_multi_lane_atomics.txt12
-rw-r--r--examples/all_features/test_output/no_multithreading.txt12
-rw-r--r--examples/all_features/test_output/std_headers.txt928
11 files changed, 1025 insertions, 72 deletions
diff --git a/doctest/doctest.h b/doctest/doctest.h
index 18dde2b3..b46e1c5c 100644
--- a/doctest/doctest.h
+++ b/doctest/doctest.h
@@ -454,7 +454,9 @@ DOCTEST_GCC_SUPPRESS_WARNING_POP
// this is kept here for backwards compatibility since the config option was changed
#ifdef DOCTEST_CONFIG_USE_IOSFWD
+#ifndef DOCTEST_CONFIG_USE_STD_HEADERS
#define DOCTEST_CONFIG_USE_STD_HEADERS
+#endif
#endif // DOCTEST_CONFIG_USE_IOSFWD
// for clang - always include ciso646 (which drags some std stuff) because
@@ -465,7 +467,9 @@ DOCTEST_GCC_SUPPRESS_WARNING_POP
#if DOCTEST_CLANG
#include <ciso646>
#ifdef _LIBCPP_VERSION
+#ifndef DOCTEST_CONFIG_USE_STD_HEADERS
#define DOCTEST_CONFIG_USE_STD_HEADERS
+#endif
#endif // _LIBCPP_VERSION
#endif // clang
@@ -473,9 +477,11 @@ DOCTEST_GCC_SUPPRESS_WARNING_POP
#ifndef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
#define DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
#endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
+DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN
#include <cstddef>
#include <ostream>
#include <istream>
+DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_END
#else // DOCTEST_CONFIG_USE_STD_HEADERS
// Forward declaring 'X' in namespace std is not permitted by the C++ Standard.
@@ -6195,7 +6201,7 @@ namespace {
// log the preamble of the test case only if there is something
// else to print - something other than that an assert has failed
if(opt.duration ||
- (st.failure_flags && st.failure_flags != TestCaseFailureReason::AssertFailure))
+ (st.failure_flags && st.failure_flags != static_cast<int>(TestCaseFailureReason::AssertFailure)))
logTestStart();
if(opt.duration)
@@ -6446,30 +6452,30 @@ namespace {
if(!parseOption(argc, argv, pattern, &parsedValue))
return false;
- if(type == 0) {
+ if(type) {
+ // integer
+ // TODO: change this to use std::stoi or something else! currently it uses undefined behavior - assumes '0' on failed parse...
+ int theInt = std::atoi(parsedValue.c_str()); // NOLINT
+ if (theInt != 0) {
+ res = theInt; //!OCLINT parameter reassignment
+ return true;
+ }
+ } else {
// boolean
- const char positive[][5] = {"1", "true", "on", "yes"}; // 5 - strlen("true") + 1
- const char negative[][6] = {"0", "false", "off", "no"}; // 6 - strlen("false") + 1
+ const char positive[][5] = { "1", "true", "on", "yes" }; // 5 - strlen("true") + 1
+ const char negative[][6] = { "0", "false", "off", "no" }; // 6 - strlen("false") + 1
// if the value matches any of the positive/negative possibilities
- for(unsigned i = 0; i < 4; i++) {
- if(parsedValue.compare(positive[i], true) == 0) {
+ for (unsigned i = 0; i < 4; i++) {
+ if (parsedValue.compare(positive[i], true) == 0) {
res = 1; //!OCLINT parameter reassignment
return true;
}
- if(parsedValue.compare(negative[i], true) == 0) {
+ if (parsedValue.compare(negative[i], true) == 0) {
res = 0; //!OCLINT parameter reassignment
return true;
}
}
- } else {
- // integer
- // TODO: change this to use std::stoi or something else! currently it uses undefined behavior - assumes '0' on failed parse...
- int theInt = std::atoi(parsedValue.c_str()); // NOLINT
- if(theInt != 0) {
- res = theInt; //!OCLINT parameter reassignment
- return true;
- }
}
return false;
}
diff --git a/doctest/parts/doctest.cpp b/doctest/parts/doctest.cpp
index 450f7d20..2e2ace35 100644
--- a/doctest/parts/doctest.cpp
+++ b/doctest/parts/doctest.cpp
@@ -3194,7 +3194,7 @@ namespace {
// log the preamble of the test case only if there is something
// else to print - something other than that an assert has failed
if(opt.duration ||
- (st.failure_flags && st.failure_flags != TestCaseFailureReason::AssertFailure))
+ (st.failure_flags && st.failure_flags != static_cast<int>(TestCaseFailureReason::AssertFailure)))
logTestStart();
if(opt.duration)
@@ -3445,30 +3445,30 @@ namespace {
if(!parseOption(argc, argv, pattern, &parsedValue))
return false;
- if(type == 0) {
+ if(type) {
+ // integer
+ // TODO: change this to use std::stoi or something else! currently it uses undefined behavior - assumes '0' on failed parse...
+ int theInt = std::atoi(parsedValue.c_str()); // NOLINT
+ if (theInt != 0) {
+ res = theInt; //!OCLINT parameter reassignment
+ return true;
+ }
+ } else {
// boolean
- const char positive[][5] = {"1", "true", "on", "yes"}; // 5 - strlen("true") + 1
- const char negative[][6] = {"0", "false", "off", "no"}; // 6 - strlen("false") + 1
+ const char positive[][5] = { "1", "true", "on", "yes" }; // 5 - strlen("true") + 1
+ const char negative[][6] = { "0", "false", "off", "no" }; // 6 - strlen("false") + 1
// if the value matches any of the positive/negative possibilities
- for(unsigned i = 0; i < 4; i++) {
- if(parsedValue.compare(positive[i], true) == 0) {
+ for (unsigned i = 0; i < 4; i++) {
+ if (parsedValue.compare(positive[i], true) == 0) {
res = 1; //!OCLINT parameter reassignment
return true;
}
- if(parsedValue.compare(negative[i], true) == 0) {
+ if (parsedValue.compare(negative[i], true) == 0) {
res = 0; //!OCLINT parameter reassignment
return true;
}
}
- } else {
- // integer
- // TODO: change this to use std::stoi or something else! currently it uses undefined behavior - assumes '0' on failed parse...
- int theInt = std::atoi(parsedValue.c_str()); // NOLINT
- if(theInt != 0) {
- res = theInt; //!OCLINT parameter reassignment
- return true;
- }
}
return false;
}
diff --git a/doctest/parts/doctest_fwd.h b/doctest/parts/doctest_fwd.h
index ef1ff803..2e537356 100644
--- a/doctest/parts/doctest_fwd.h
+++ b/doctest/parts/doctest_fwd.h
@@ -451,7 +451,9 @@ DOCTEST_GCC_SUPPRESS_WARNING_POP
// this is kept here for backwards compatibility since the config option was changed
#ifdef DOCTEST_CONFIG_USE_IOSFWD
+#ifndef DOCTEST_CONFIG_USE_STD_HEADERS
#define DOCTEST_CONFIG_USE_STD_HEADERS
+#endif
#endif // DOCTEST_CONFIG_USE_IOSFWD
// for clang - always include ciso646 (which drags some std stuff) because
@@ -462,7 +464,9 @@ DOCTEST_GCC_SUPPRESS_WARNING_POP
#if DOCTEST_CLANG
#include <ciso646>
#ifdef _LIBCPP_VERSION
+#ifndef DOCTEST_CONFIG_USE_STD_HEADERS
#define DOCTEST_CONFIG_USE_STD_HEADERS
+#endif
#endif // _LIBCPP_VERSION
#endif // clang
@@ -470,9 +474,11 @@ DOCTEST_GCC_SUPPRESS_WARNING_POP
#ifndef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
#define DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
#endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
+DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN
#include <cstddef>
#include <ostream>
#include <istream>
+DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_END
#else // DOCTEST_CONFIG_USE_STD_HEADERS
// Forward declaring 'X' in namespace std is not permitted by the C++ Standard.
diff --git a/examples/all_features/CMakeLists.txt b/examples/all_features/CMakeLists.txt
index 86dfc9e5..5b752e0e 100644
--- a/examples/all_features/CMakeLists.txt
+++ b/examples/all_features/CMakeLists.txt
@@ -131,6 +131,7 @@ endfunction()
add_test_all_features(no_multithreading DOCTEST_CONFIG_NO_MULTITHREADING)
add_test_all_features(no_multi_lane_atomics DOCTEST_CONFIG_NO_MULTI_LANE_ATOMICS)
add_test_all_features(disabled DOCTEST_CONFIG_DISABLE)
+add_test_all_features(std_headers DOCTEST_CONFIG_USE_STD_HEADERS)
# TODO: think about fixing these in a different way! - see issue #61 or commit 6b61e8aa3818c5ea100cedc1bb48a60ea10df6e8
if(MSVC)
diff --git a/examples/all_features/enums.cpp b/examples/all_features/enums.cpp
index 5f9d8d0c..e58c3a90 100644
--- a/examples/all_features/enums.cpp
+++ b/examples/all_features/enums.cpp
@@ -1,5 +1,17 @@
#include <doctest/doctest.h>
+// GCC < 5 breaks when trying to compare enums to integers when using std headers.
+#if !defined(DOCTEST_CONFIG_USE_STD_HEADERS) || DOCTEST_GCC == 0 || DOCTEST_GCC >= DOCTEST_COMPILER(5, 0, 0)
+#define RET_TYPE(x) x
+#else
+#define RET_TYPE(x) typename doctest::detail::types::underlying_type<x>::type
+#endif
+
+template <typename S>
+static RET_TYPE(S) castToUnderlying(S in) {
+ return in;
+}
+
#include "header.h"
DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN
@@ -68,13 +80,13 @@ TEST_CASE("enum 1")
static_assert(std::is_enum<EnumClassSC>::value, "");
ostr << printable(EnumClassSC::Zero) << printable(EnumClassSC::One) << printable(EnumClassSC::Two);
- CHECK_EQ(Zero, 0);
- CHECK_EQ(One, 1);
- CHECK_EQ(Two, 2);
+ CHECK_EQ(castToUnderlying(Zero), 0);
+ CHECK_EQ(castToUnderlying(One), 1);
+ CHECK_EQ(castToUnderlying(Two), 2);
- CHECK_EQ(TypedZero, 0);
- CHECK_EQ(TypedOne, 1);
- CHECK_EQ(TypedTwo, 2);
+ CHECK_EQ(castToUnderlying(TypedZero), 0);
+ CHECK_EQ(castToUnderlying(TypedOne), 1);
+ CHECK_EQ(castToUnderlying(TypedTwo), 2);
CHECK_EQ(EnumClassSC::Zero, EnumClassSC::Zero);
CHECK_EQ(EnumClassSC::One, EnumClassSC::One);
@@ -83,13 +95,13 @@ TEST_CASE("enum 1")
TEST_CASE("enum 2" * doctest::should_fail())
{
- CHECK_EQ(Zero, 1);
- CHECK_EQ(One, 2);
- CHECK_EQ(Two, 3);
+ CHECK_EQ(castToUnderlying(Zero), 1);
+ CHECK_EQ(castToUnderlying(One), 2);
+ CHECK_EQ(castToUnderlying(Two), 3);
- CHECK_EQ(TypedZero, 1);
- CHECK_EQ(TypedOne, 2);
- CHECK_EQ(TypedTwo, 3);
+ CHECK_EQ(castToUnderlying(TypedZero), 1);
+ CHECK_EQ(castToUnderlying(TypedOne), 2);
+ CHECK_EQ(castToUnderlying(TypedTwo), 3);
CHECK_EQ(EnumClassC::Zero, EnumClassC::One);
CHECK_EQ(EnumClassC::One, EnumClassC::Two);
diff --git a/examples/all_features/test_output/enums.cpp.txt b/examples/all_features/test_output/enums.cpp.txt
index bae3d07c..bb739e68 100644
--- a/examples/all_features/test_output/enums.cpp.txt
+++ b/examples/all_features/test_output/enums.cpp.txt
@@ -3,22 +3,22 @@
enums.cpp(0):
TEST CASE: enum 2
-enums.cpp(0): ERROR: CHECK_EQ( Zero, 1 ) is NOT correct!
+enums.cpp(0): ERROR: CHECK_EQ( castToUnderlying(Zero), 1 ) is NOT correct!
values: CHECK_EQ( 0, 1 )
-enums.cpp(0): ERROR: CHECK_EQ( One, 2 ) is NOT correct!
+enums.cpp(0): ERROR: CHECK_EQ( castToUnderlying(One), 2 ) is NOT correct!
values: CHECK_EQ( 1, 2 )
-enums.cpp(0): ERROR: CHECK_EQ( Two, 3 ) is NOT correct!
+enums.cpp(0): ERROR: CHECK_EQ( castToUnderlying(Two), 3 ) is NOT correct!
values: CHECK_EQ( 2, 3 )
-enums.cpp(0): ERROR: CHECK_EQ( TypedZero, 1 ) is NOT correct!
+enums.cpp(0): ERROR: CHECK_EQ( castToUnderlying(TypedZero), 1 ) is NOT correct!
values: CHECK_EQ( 0, 1 )
-enums.cpp(0): ERROR: CHECK_EQ( TypedOne, 2 ) is NOT correct!
+enums.cpp(0): ERROR: CHECK_EQ( castToUnderlying(TypedOne), 2 ) is NOT correct!
values: CHECK_EQ( 1, 2 )
-enums.cpp(0): ERROR: CHECK_EQ( TypedTwo, 3 ) is NOT correct!
+enums.cpp(0): ERROR: CHECK_EQ( castToUnderlying(TypedTwo), 3 ) is NOT correct!
values: CHECK_EQ( 2, 3 )
enums.cpp(0): ERROR: CHECK_EQ( EnumClassC::Zero, EnumClassC::One ) is NOT correct!
diff --git a/examples/all_features/test_output/enums.cpp_junit.txt b/examples/all_features/test_output/enums.cpp_junit.txt
index eadaebda..325c31e6 100644
--- a/examples/all_features/test_output/enums.cpp_junit.txt
+++ b/examples/all_features/test_output/enums.cpp_junit.txt
@@ -5,37 +5,37 @@
<testcase classname="enums.cpp" name="enum 2" status="run">
<failure message="0, 1" type="CHECK_EQ">
enums.cpp(0):
-CHECK_EQ( Zero, 1 ) is NOT correct!
+CHECK_EQ( castToUnderlying(Zero), 1 ) is NOT correct!
values: CHECK_EQ( 0, 1 )
</failure>
<failure message="1, 2" type="CHECK_EQ">
enums.cpp(0):
-CHECK_EQ( One, 2 ) is NOT correct!
+CHECK_EQ( castToUnderlying(One), 2 ) is NOT correct!
values: CHECK_EQ( 1, 2 )
</failure>
<failure message="2, 3" type="CHECK_EQ">
enums.cpp(0):
-CHECK_EQ( Two, 3 ) is NOT correct!
+CHECK_EQ( castToUnderlying(Two), 3 ) is NOT correct!
values: CHECK_EQ( 2, 3 )
</failure>
<failure message="0, 1" type="CHECK_EQ">
enums.cpp(0):
-CHECK_EQ( TypedZero, 1 ) is NOT correct!
+CHECK_EQ( castToUnderlying(TypedZero), 1 ) is NOT correct!
values: CHECK_EQ( 0, 1 )
</failure>
<failure message="1, 2" type="CHECK_EQ">
enums.cpp(0):
-CHECK_EQ( TypedOne, 2 ) is NOT correct!
+CHECK_EQ( castToUnderlying(TypedOne), 2 ) is NOT correct!
values: CHECK_EQ( 1, 2 )
</failure>
<failure message="2, 3" type="CHECK_EQ">
enums.cpp(0):
-CHECK_EQ( TypedTwo, 3 ) is NOT correct!
+CHECK_EQ( castToUnderlying(TypedTwo), 3 ) is NOT correct!
values: CHECK_EQ( 2, 3 )
</failure>
diff --git a/examples/all_features/test_output/enums.cpp_xml.txt b/examples/all_features/test_output/enums.cpp_xml.txt
index 85d6fe71..1f74d517 100644
--- a/examples/all_features/test_output/enums.cpp_xml.txt
+++ b/examples/all_features/test_output/enums.cpp_xml.txt
@@ -8,7 +8,7 @@
<TestCase name="enum 2" filename="enums.cpp" line="0" should_fail="true">
<Expression success="false" type="CHECK_EQ" filename="enums.cpp" line="0">
<Original>
- Zero, 1
+ castToUnderlying(Zero), 1
</Original>
<Expanded>
0, 1
@@ -16,7 +16,7 @@
</Expression>
<Expression success="false" type="CHECK_EQ" filename="enums.cpp" line="0">
<Original>
- One, 2
+ castToUnderlying(One), 2
</Original>
<Expanded>
1, 2
@@ -24,7 +24,7 @@
</Expression>
<Expression success="false" type="CHECK_EQ" filename="enums.cpp" line="0">
<Original>
- Two, 3
+ castToUnderlying(Two), 3
</Original>
<Expanded>
2, 3
@@ -32,7 +32,7 @@
</Expression>
<Expression success="false" type="CHECK_EQ" filename="enums.cpp" line="0">
<Original>
- TypedZero, 1
+ castToUnderlying(TypedZero), 1
</Original>
<Expanded>
0, 1
@@ -40,7 +40,7 @@
</Expression>
<Expression success="false" type="CHECK_EQ" filename="enums.cpp" line="0">
<Original>
- TypedOne, 2
+ castToUnderlying(TypedOne), 2
</Original>
<Expanded>
1, 2
@@ -48,7 +48,7 @@
</Expression>
<Expression success="false" type="CHECK_EQ" filename="enums.cpp" line="0">
<Original>
- TypedTwo, 3
+ castToUnderlying(TypedTwo), 3
</Original>
<Expanded>
2, 3
diff --git a/examples/all_features/test_output/no_multi_lane_atomics.txt b/examples/all_features/test_output/no_multi_lane_atomics.txt
index 175aee36..b95037bd 100644
--- a/examples/all_features/test_output/no_multi_lane_atomics.txt
+++ b/examples/all_features/test_output/no_multi_lane_atomics.txt
@@ -318,22 +318,22 @@ Should have failed but didn't! Marking it as failed!
enums.cpp(0):
TEST CASE: enum 2
-enums.cpp(0): ERROR: CHECK_EQ( Zero, 1 ) is NOT correct!
+enums.cpp(0): ERROR: CHECK_EQ( castToUnderlying(Zero), 1 ) is NOT correct!
values: CHECK_EQ( 0, 1 )
-enums.cpp(0): ERROR: CHECK_EQ( One, 2 ) is NOT correct!
+enums.cpp(0): ERROR: CHECK_EQ( castToUnderlying(One), 2 ) is NOT correct!
values: CHECK_EQ( 1, 2 )
-enums.cpp(0): ERROR: CHECK_EQ( Two, 3 ) is NOT correct!
+enums.cpp(0): ERROR: CHECK_EQ( castToUnderlying(Two), 3 ) is NOT correct!
values: CHECK_EQ( 2, 3 )
-enums.cpp(0): ERROR: CHECK_EQ( TypedZero, 1 ) is NOT correct!
+enums.cpp(0): ERROR: CHECK_EQ( castToUnderlying(TypedZero), 1 ) is NOT correct!
values: CHECK_EQ( 0, 1 )
-enums.cpp(0): ERROR: CHECK_EQ( TypedOne, 2 ) is NOT correct!
+enums.cpp(0): ERROR: CHECK_EQ( castToUnderlying(TypedOne), 2 ) is NOT correct!
values: CHECK_EQ( 1, 2 )
-enums.cpp(0): ERROR: CHECK_EQ( TypedTwo, 3 ) is NOT correct!
+enums.cpp(0): ERROR: CHECK_EQ( castToUnderlying(TypedTwo), 3 ) is NOT correct!
values: CHECK_EQ( 2, 3 )
enums.cpp(0): ERROR: CHECK_EQ( EnumClassC::Zero, EnumClassC::One ) is NOT correct!
diff --git a/examples/all_features/test_output/no_multithreading.txt b/examples/all_features/test_output/no_multithreading.txt
index 175aee36..b95037bd 100644
--- a/examples/all_features/test_output/no_multithreading.txt
+++ b/examples/all_features/test_output/no_multithreading.txt
@@ -318,22 +318,22 @@ Should have failed but didn't! Marking it as failed!
enums.cpp(0):
TEST CASE: enum 2
-enums.cpp(0): ERROR: CHECK_EQ( Zero, 1 ) is NOT correct!
+enums.cpp(0): ERROR: CHECK_EQ( castToUnderlying(Zero), 1 ) is NOT correct!
values: CHECK_EQ( 0, 1 )
-enums.cpp(0): ERROR: CHECK_EQ( One, 2 ) is NOT correct!
+enums.cpp(0): ERROR: CHECK_EQ( castToUnderlying(One), 2 ) is NOT correct!
values: CHECK_EQ( 1, 2 )
-enums.cpp(0): ERROR: CHECK_EQ( Two, 3 ) is NOT correct!
+enums.cpp(0): ERROR: CHECK_EQ( castToUnderlying(Two), 3 ) is NOT correct!
values: CHECK_EQ( 2, 3 )
-enums.cpp(0): ERROR: CHECK_EQ( TypedZero, 1 ) is NOT correct!
+enums.cpp(0): ERROR: CHECK_EQ( castToUnderlying(TypedZero), 1 ) is NOT correct!
values: CHECK_EQ( 0, 1 )
-enums.cpp(0): ERROR: CHECK_EQ( TypedOne, 2 ) is NOT correct!
+enums.cpp(0): ERROR: CHECK_EQ( castToUnderlying(TypedOne), 2 ) is NOT correct!
values: CHECK_EQ( 1, 2 )
-enums.cpp(0): ERROR: CHECK_EQ( TypedTwo, 3 ) is NOT correct!
+enums.cpp(0): ERROR: CHECK_EQ( castToUnderlying(TypedTwo), 3 ) is NOT correct!
values: CHECK_EQ( 2, 3 )
enums.cpp(0): ERROR: CHECK_EQ( EnumClassC::Zero, EnumClassC::One ) is NOT correct!
diff --git a/examples/all_features/test_output/std_headers.txt b/examples/all_features/test_output/std_headers.txt
new file mode 100644
index 00000000..b95037bd
--- /dev/null
+++ b/examples/all_features/test_output/std_headers.txt
@@ -0,0 +1,928 @@
+[doctest] run with "--help" for options
+===============================================================================
+subcases.cpp(0):
+ Scenario: vectors can be sized and resized
+ Given: A vector with some items
+ When: the size is increased
+ Then: the size and capacity change
+
+subcases.cpp(0): ERROR: CHECK( v.size() == 20 ) is NOT correct!
+ values: CHECK( 10 == 20 )
+
+===============================================================================
+subcases.cpp(0):
+ Scenario: vectors can be sized and resized
+ Given: A vector with some items
+ When: less capacity is reserved
+ Then: neither size nor capacity are changed
+
+subcases.cpp(0): ERROR: CHECK( v.size() == 10 ) is NOT correct!
+ values: CHECK( 5 == 10 )
+
+===============================================================================
+assertion_macros.cpp(0):
+TEST CASE: CHECK level of asserts fail the test case but don't abort it
+
+assertion_macros.cpp(0): ERROR: CHECK( 0 ) is NOT correct!
+ values: CHECK( 0 )
+
+assertion_macros.cpp(0): ERROR: CHECK_FALSE( 1 ) is NOT correct!
+ values: CHECK_FALSE( 1 )
+
+assertion_macros.cpp(0): ERROR: CHECK_THROWS( throw_if(false, 0) ) did NOT throw at all!
+
+assertion_macros.cpp(0): ERROR: CHECK_THROWS_AS( throw_if(false, 0), bool ) did NOT throw at all!
+
+assertion_macros.cpp(0): ERROR: CHECK_THROWS_AS( throw_if(true, 0), bool ) threw a DIFFERENT exception: "0"
+
+assertion_macros.cpp(0): ERROR: CHECK_THROWS_WITH( throw_if(true, 0), "unrecognized" ) threw a DIFFERENT exception: "0"
+
+assertion_macros.cpp(0): ERROR: CHECK_THROWS_WITH_AS( throw_if(true, 0), "unrecognized", int ) threw a DIFFERENT exception! (contents: "0")
+
+assertion_macros.cpp(0): ERROR: CHECK_NOTHROW( throw_if(true, 0) ) THREW exception: "0"
+
+assertion_macros.cpp(0): ERROR: CHECK_EQ( 1, 0 ) is NOT correct!
+ values: CHECK_EQ( 1, 0 )
+
+assertion_macros.cpp(0): ERROR: CHECK_UNARY( 0 ) is NOT correct!
+ values: CHECK_UNARY( 0 )
+
+assertion_macros.cpp(0): ERROR: CHECK_UNARY_FALSE( 1 ) is NOT correct!
+ values: CHECK_UNARY_FALSE( 1 )
+
+assertion_macros.cpp(0): MESSAGE: reached!
+
+===============================================================================
+decomposition.cpp(0):
+TEST CASE: Move Only Type
+
+decomposition.cpp(0): ERROR: CHECK( genType(false) ) is NOT correct!
+ values: CHECK( {?} )
+
+===============================================================================
+assertion_macros.cpp(0):
+TEST CASE: REQUIRE level of asserts fail and abort the test case - 1
+
+assertion_macros.cpp(0): FATAL ERROR: REQUIRE( 0 ) is NOT correct!
+ values: REQUIRE( 0 )
+
+===============================================================================
+assertion_macros.cpp(0):
+TEST CASE: REQUIRE level of asserts fail and abort the test case - 10
+
+assertion_macros.cpp(0): FATAL ERROR: REQUIRE_NOTHROW( throw_if(true, 0) ) THREW exception: "0"
+
+===============================================================================
+assertion_macros.cpp(0):
+TEST CASE: REQUIRE level of asserts fail and abort the test case - 11
+
+assertion_macros.cpp(0): FATAL ERROR: REQUIRE_EQ( 1, 0 ) is NOT correct!
+ values: REQUIRE_EQ( 1, 0 )
+
+===============================================================================
+assertion_macros.cpp(0):
+TEST CASE: REQUIRE level of asserts fail and abort the test case - 12
+
+assertion_macros.cpp(0): FATAL ERROR: REQUIRE_UNARY( 0 ) is NOT correct!
+ values: REQUIRE_UNARY( 0 )
+
+===============================================================================
+assertion_macros.cpp(0):
+TEST CASE: REQUIRE level of asserts fail and abort the test case - 13
+
+assertion_macros.cpp(0): FATAL ERROR: REQUIRE_UNARY_FALSE( 1 ) is NOT correct!
+ values: REQUIRE_UNARY_FALSE( 1 )
+
+===============================================================================
+assertion_macros.cpp(0):
+TEST CASE: REQUIRE level of asserts fail and abort the test case - 2
+
+assertion_macros.cpp(0): FATAL ERROR: REQUIRE_FALSE( 1 ) is NOT correct!
+ values: REQUIRE_FALSE( 1 )
+
+===============================================================================
+assertion_macros.cpp(0):
+TEST CASE: REQUIRE level of asserts fail and abort the test case - 3
+
+assertion_macros.cpp(0): FATAL ERROR: REQUIRE_THROWS( throw_if(false, 0) ) did NOT throw at all!
+
+===============================================================================
+assertion_macros.cpp(0):
+TEST CASE: REQUIRE level of asserts fail and abort the test case - 4
+
+assertion_macros.cpp(0): FATAL ERROR: REQUIRE_THROWS_AS( throw_if(false, 0), bool ) did NOT throw at all!
+
+===============================================================================
+assertion_macros.cpp(0):
+TEST CASE: REQUIRE level of asserts fail and abort the test case - 5
+
+assertion_macros.cpp(0): FATAL ERROR: REQUIRE_THROWS_AS( throw_if(true, 0), bool ) threw a DIFFERENT exception: "0"
+
+===============================================================================
+assertion_macros.cpp(0):
+TEST CASE: REQUIRE level of asserts fail and abort the test case - 6
+
+assertion_macros.cpp(0): FATAL ERROR: REQUIRE_THROWS_WITH( throw_if(false, ""), "whops!" ) did NOT throw at all!
+
+===============================================================================
+assertion_macros.cpp(0):
+TEST CASE: REQUIRE level of asserts fail and abort the test case - 7
+
+assertion_macros.cpp(0): FATAL ERROR: REQUIRE_THROWS_WITH( throw_if(true, ""), "whops!" ) threw a DIFFERENT exception:
+
+===============================================================================
+assertion_macros.cpp(0):
+TEST CASE: REQUIRE level of asserts fail and abort the test case - 8
+
+assertion_macros.cpp(0): FATAL ERROR: REQUIRE_THROWS_WITH_AS( throw_if(false, ""), "whops!", bool ) did NOT throw at all!
+
+===============================================================================
+assertion_macros.cpp(0):
+TEST CASE: REQUIRE level of asserts fail and abort the test case - 9
+
+assertion_macros.cpp(0): FATAL ERROR: REQUIRE_THROWS_WITH_AS( throw_if(true, ""), "whops!", bool ) threw a DIFFERENT exception! (contents: )
+
+===============================================================================
+assertion_macros.cpp(0):
+TEST CASE: WARN level of asserts don't fail the test case
+
+assertion_macros.cpp(0): WARNING: WARN( 0 ) is NOT correct!
+ values: WARN( 0 )
+
+assertion_macros.cpp(0): WARNING: WARN_FALSE( 1 ) is NOT correct!
+ values: WARN_FALSE( 1 )
+
+assertion_macros.cpp(0): WARNING: WARN_THROWS( throw_if(false, 0) ) did NOT throw at all!
+
+assertion_macros.cpp(0): WARNING: WARN_THROWS_WITH( throw_if(true, ""), "whops!" ) threw a DIFFERENT exception:
+
+assertion_macros.cpp(0): WARNING: WARN_THROWS_WITH( throw_if(false, ""), "whops!" ) did NOT throw at all!
+
+assertion_macros.cpp(0): WARNING: WARN_THROWS_AS( throw_if(false, 0), bool ) did NOT throw at all!
+
+assertion_macros.cpp(0): WARNING: WARN_THROWS_AS( throw_if(true, 0), bool ) threw a DIFFERENT exception: "0"
+
+assertion_macros.cpp(0): WARNING: WARN_THROWS_WITH_AS( throw_if(false, ""), "whops!", int ) did NOT throw at all!
+
+assertion_macros.cpp(0): WARNING: WARN_THROWS_WITH_AS( throw_if(true, ""), "whops!", int ) threw a DIFFERENT exception! (contents: )
+
+assertion_macros.cpp(0): WARNING: WARN_NOTHROW( throw_if(true, 0) ) THREW exception: "0"
+
+assertion_macros.cpp(0): WARNING: WARN_EQ( 1, 0 ) is NOT correct!
+ values: WARN_EQ( 1, 0 )
+
+assertion_macros.cpp(0): WARNING: WARN_UNARY( 0 ) is NOT correct!
+ values: WARN_UNARY( 0 )
+
+assertion_macros.cpp(0): WARNING: WARN_UNARY_FALSE( 1 ) is NOT correct!
+ values: WARN_UNARY_FALSE( 1 )
+
+===============================================================================
+stringification.cpp(0):
+TEST CASE: a test case that registers an exception translator for int and then throws one
+
+stringification.cpp(0): ERROR: test case THREW exception: 5
+
+===============================================================================
+logging.cpp(0):
+TEST CASE: a test case that will end from an exception
+
+logging.cpp(0): ERROR: forcing the many captures to be stringified
+ logged: lots of captures: 42 42 42;
+ old way of capturing - using the streaming operator: 42 42
+
+logging.cpp(0): ERROR: CHECK( some_var == 666 ) is NOT correct!
+ values: CHECK( 42 == 666 )
+ logged: someTests() returned: 42
+ this should be printed if an exception is thrown even if no assert has failed: 42
+ in a nested scope this should be printed as well: 42
+ why is this not 666 ?!
+
+logging.cpp(0): ERROR: test case THREW exception: 0
+ logged: someTests() returned: 42
+ this should be printed if an exception is thrown even if no assert has failed: 42
+ in a nested scope this should be printed as well: 42
+
+===============================================================================
+logging.cpp(0):
+TEST CASE: a test case that will end from an exception and should print the unprinted context
+
+logging.cpp(0): ERROR: test case THREW exception: 0
+ logged: should be printed even if an exception is thrown and no assert fails before that
+
+===============================================================================
+stringification.cpp(0):
+TEST CASE: all asserts should fail and show how the objects get stringified
+
+stringification.cpp(0): MESSAGE: Foo{}
+
+stringification.cpp(0): ERROR: CHECK( f1 == f2 ) is NOT correct!
+ values: CHECK( Foo{} == Foo{} )
+
+stringification.cpp(0): MESSAGE: omg
+
+stringification.cpp(0): ERROR: CHECK( dummy == "tralala" ) is NOT correct!
+ values: CHECK( omg == tralala )
+
+stringification.cpp(0): ERROR: CHECK( "tralala" == dummy ) is NOT correct!
+ values: CHECK( tralala == omg )
+
+stringification.cpp(0): MESSAGE: [1, 2, 3]
+
+stringification.cpp(0): ERROR: CHECK( vec1 == vec2 ) is NOT correct!
+ values: CHECK( [1, 2, 3] == [1, 2, 4] )
+
+stringification.cpp(0): MESSAGE: [1, 42, 3]
+
+stringification.cpp(0): ERROR: CHECK( lst_1 == lst_2 ) is NOT correct!
+ values: CHECK( [1, 42, 3] == [1, 2, 666] )
+
+stringification.cpp(0): ERROR: CHECK( s1 == s2 ) is NOT correct!
+ values: CHECK( MyOtherType: 42 == MyOtherType: 666 )
+ logged: s1=MyOtherType: 42 s2=MyOtherType: 666
+
+stringification.cpp(0): ERROR: CHECK( s1 == s2 ) is NOT correct!
+ values: CHECK( MyOtherType: 42 == MyOtherType: 666 )
+ logged: s1=MyOtherType: 42 s2=MyOtherType: 666
+ MyOtherType: 42 is not really MyOtherType: 666
+
+stringification.cpp(0): ERROR: CHECK( "a" == doctest::Contains("aaa") ) is NOT correct!
+ values: CHECK( a == Contains( aaa ) )
+
+stringification.cpp(0): ERROR: test case THREW exception: MyTypeInherited<int>(5, 4)
+
+===============================================================================
+templated_test_cases.cpp(0):
+TEST CASE: bad stringification of type pair<int_pair>
+
+templated_test_cases.cpp(0): ERROR: CHECK( t2 != T2() ) is NOT correct!
+ values: CHECK( 0 != 0 )
+
+===============================================================================
+assertion_macros.cpp(0):
+TEST CASE: check return values
+
+assertion_macros.cpp(0): MESSAGE: :D
+
+assertion_macros.cpp(0): MESSAGE: :D
+
+assertion_macros.cpp(0): MESSAGE: :D
+
+assertion_macros.cpp(0): MESSAGE: :D
+
+assertion_macros.cpp(0): MESSAGE: :D
+
+assertion_macros.cpp(0): MESSAGE: :D
+
+assertion_macros.cpp(0): MESSAGE: :D
+
+assertion_macros.cpp(0): MESSAGE: :D
+
+assertion_macros.cpp(0): MESSAGE: :D
+
+===============================================================================
+assertion_macros.cpp(0):
+TEST CASE: check return values no print
+
+assertion_macros.cpp(0): ERROR: CHECK( a == b ) is NOT correct!
+ values: CHECK( 4 == 2 )
+
+assertion_macros.cpp(0): ERROR: CHECK_FALSE( a != b ) is NOT correct!
+ values: CHECK_FALSE( 4 != 2 )
+
+assertion_macros.cpp(0): ERROR: CHECK_EQ( a, b ) is NOT correct!
+ values: CHECK_EQ( 4, 2 )
+
+assertion_macros.cpp(0): ERROR: CHECK_UNARY( a == b ) is NOT correct!
+ values: CHECK_UNARY( false )
+
+assertion_macros.cpp(0): ERROR: CHECK_UNARY_FALSE( a != b ) is NOT correct!
+ values: CHECK_UNARY_FALSE( true )
+
+assertion_macros.cpp(0): ERROR: CHECK_THROWS( throw_if(false, false) ) did NOT throw at all!
+
+assertion_macros.cpp(0): ERROR: CHECK_THROWS_AS( throw_if(true, 2), doctest::Approx ) threw a DIFFERENT exception: "2"
+
+assertion_macros.cpp(0): ERROR: CHECK_NOTHROW( throw_if(true, 2) ) THREW exception: "2"
+
+assertion_macros.cpp(0): ERROR: CHECK_THROWS_WITH( throw_if(true, 2), "1" ) threw a DIFFERENT exception: "2"
+
+===============================================================================
+test_cases_and_suites.cpp(0):
+DESCRIPTION: regarding failures
+TEST SUITE: test suite with a description
+TEST CASE: doesn't fail but it should have
+
+Should have failed but didn't! Marking it as failed!
+===============================================================================
+enums.cpp(0):
+TEST CASE: enum 2
+
+enums.cpp(0): ERROR: CHECK_EQ( castToUnderlying(Zero), 1 ) is NOT correct!
+ values: CHECK_EQ( 0, 1 )
+
+enums.cpp(0): ERROR: CHECK_EQ( castToUnderlying(One), 2 ) is NOT correct!
+ values: CHECK_EQ( 1, 2 )
+
+enums.cpp(0): ERROR: CHECK_EQ( castToUnderlying(Two), 3 ) is NOT correct!
+ values: CHECK_EQ( 2, 3 )
+
+enums.cpp(0): ERROR: CHECK_EQ( castToUnderlying(TypedZero), 1 ) is NOT correct!
+ values: CHECK_EQ( 0, 1 )
+
+enums.cpp(0): ERROR: CHECK_EQ( castToUnderlying(TypedOne), 2 ) is NOT correct!
+ values: CHECK_EQ( 1, 2 )
+
+enums.cpp(0): ERROR: CHECK_EQ( castToUnderlying(TypedTwo), 3 ) is NOT correct!
+ values: CHECK_EQ( 2, 3 )
+
+enums.cpp(0): ERROR: CHECK_EQ( EnumClassC::Zero, EnumClassC::One ) is NOT correct!
+ values: CHECK_EQ( 48, 49 )
+
+enums.cpp(0): ERROR: CHECK_EQ( EnumClassC::One, EnumClassC::Two ) is NOT correct!
+ values: CHECK_EQ( 49, 50 )
+
+enums.cpp(0): ERROR: CHECK_EQ( EnumClassC::Two, EnumClassC::Zero ) is NOT correct!
+ values: CHECK_EQ( 50, 48 )
+
+enums.cpp(0): ERROR: CHECK_EQ( EnumClassSC::Zero, EnumClassSC::One ) is NOT correct!
+ values: CHECK_EQ( 48, 49 )
+
+enums.cpp(0): ERROR: CHECK_EQ( EnumClassSC::One, EnumClassSC::Two ) is NOT correct!
+ values: CHECK_EQ( 49, 50 )
+
+enums.cpp(0): ERROR: CHECK_EQ( EnumClassSC::Two, EnumClassSC::Zero ) is NOT correct!
+ values: CHECK_EQ( 50, 48 )
+
+enums.cpp(0): ERROR: CHECK_EQ( EnumClassUC::Zero, EnumClassUC::One ) is NOT correct!
+ values: CHECK_EQ( 48, 49 )
+
+enums.cpp(0): ERROR: CHECK_EQ( EnumClassUC::One, EnumClassUC::Two ) is NOT correct!
+ values: CHECK_EQ( 49, 50 )
+
+enums.cpp(0): ERROR: CHECK_EQ( EnumClassUC::Two, EnumClassUC::Zero ) is NOT correct!
+ values: CHECK_EQ( 50, 48 )
+
+enums.cpp(0): ERROR: CHECK_EQ( EnumClassU8::Zero, EnumClassU8::One ) is NOT correct!
+ values: CHECK_EQ( 0, 1 )
+
+enums.cpp(0): ERROR: CHECK_EQ( EnumClassU8::One, EnumClassU8::Two ) is NOT correct!
+ values: CHECK_EQ( 1, 2 )
+
+enums.cpp(0): ERROR: CHECK_EQ( EnumClassU8::Two, EnumClassU8::Zero ) is NOT correct!
+ values: CHECK_EQ( 2, 0 )
+
+Failed as expected so marking it as not failed
+===============================================================================
+assertion_macros.cpp(0):
+TEST CASE: exceptions-related macros
+
+assertion_macros.cpp(0): ERROR: CHECK_THROWS( throw_if(false, 0) ) did NOT throw at all!
+
+assertion_macros.cpp(0): ERROR: CHECK_THROWS_AS( throw_if(true, 0), char ) threw a DIFFERENT exception: "0"
+
+assertion_macros.cpp(0): ERROR: CHECK_THROWS_AS( throw_if(false, 0), int ) did NOT throw at all!
+
+assertion_macros.cpp(0): ERROR: CHECK_THROWS_WITH( throw_if(true, "whops!"), "whops! no match!" ) threw a DIFFERENT exception: "whops!"
+
+assertion_macros.cpp(0): ERROR: CHECK_THROWS_WITH( throw_if(true, "whops! does it match?"), "whops! no match!" ) threw a DIFFERENT exception: "whops! does it match?"
+
+assertion_macros.cpp(0): ERROR: CHECK_THROWS_WITH_AS( throw_if(true, "whops!"), "whops! no match!", bool ) threw a DIFFERENT exception! (contents: "whops!")
+
+assertion_macros.cpp(0): ERROR: CHECK_THROWS_WITH_AS( throw_if(true, "whops!"), "whops!", int ) threw a DIFFERENT exception! (contents: "whops!")
+
+assertion_macros.cpp(0): ERROR: CHECK_THROWS_WITH_AS( throw_if(true, "whops! does it match?"), "whops! no match!", int ) threw a DIFFERENT exception! (contents: "whops! does it match?")
+
+assertion_macros.cpp(0): ERROR: CHECK_NOTHROW( throw_if(true, 0) ) THREW exception: "0"
+
+===============================================================================
+assertion_macros.cpp(0):
+TEST CASE: exceptions-related macros for std::exception
+
+assertion_macros.cpp(0): ERROR: CHECK_THROWS( throw_if(false, 0) ) did NOT throw at all!
+
+assertion_macros.cpp(0): ERROR: CHECK_THROWS_AS( throw_if(false, std::runtime_error("whops!")), std::exception ) did NOT throw at all!
+
+assertion_macros.cpp(0): ERROR: CHECK_THROWS_AS( throw_if(true, std::runtime_error("whops!")), int ) threw a DIFFERENT exception: "whops!"
+
+assertion_macros.cpp(0): ERROR: CHECK_THROWS_WITH( throw_if(false, ""), "whops!" ) did NOT throw at all!
+
+assertion_macros.cpp(0): FATAL ERROR: REQUIRE_NOTHROW( throw_if(true, std::runtime_error("whops!")) ) THREW exception: "whops!"
+
+===============================================================================
+logging.cpp(0):
+TEST CASE: explicit failures 1
+
+logging.cpp(0): ERROR: this should not end the test case, but mark it as failing
+
+logging.cpp(0): MESSAGE: reached!
+
+===============================================================================
+logging.cpp(0):
+TEST CASE: explicit failures 2
+
+logging.cpp(0): FATAL ERROR: fail the test case and also end it
+
+===============================================================================
+test_cases_and_suites.cpp(0):
+DESCRIPTION: regarding failures
+TEST SUITE: test suite with a description
+TEST CASE: fails - and its allowed
+
+test_cases_and_suites.cpp(0): FATAL ERROR:
+
+Allowed to fail so marking it as not failed
+===============================================================================
+test_cases_and_suites.cpp(0):
+DESCRIPTION: regarding failures
+TEST SUITE: test suite with a description
+TEST CASE: fails 1 time as it should
+
+test_cases_and_suites.cpp(0): FATAL ERROR:
+
+Failed exactly 1 times as expected so marking it as not failed!
+===============================================================================
+test_cases_and_suites.cpp(0):
+DESCRIPTION: regarding failures
+TEST SUITE: test suite with a description
+TEST CASE: fails as it should
+
+test_cases_and_suites.cpp(0): FATAL ERROR:
+
+Failed as expected so marking it as not failed
+===============================================================================
+subcases.cpp(0):
+TEST CASE: fails from an exception but gets re-entered to traverse all subcases
+ level zero
+ one
+
+subcases.cpp(0): ERROR: CHECK( false ) is NOT correct!
+ values: CHECK( false )
+
+===============================================================================
+subcases.cpp(0):
+TEST CASE: fails from an exception but gets re-entered to traverse all subcases
+ level zero
+
+DEEPEST SUBCASE STACK REACHED (DIFFERENT FROM THE CURRENT ONE):
+ level zero
+ one
+
+subcases.cpp(0): ERROR: test case THREW exception: exception thrown in subcase - will translate later when the whole test case has been exited (cannot translate while there is an active exception)
+
+===============================================================================
+subcases.cpp(0):
+TEST CASE: fails from an exception but gets re-entered to traverse all subcases
+
+DEEPEST SUBCASE STACK REACHED (DIFFERENT FROM THE CURRENT ONE):
+ level zero
+ one
+
+subcases.cpp(0): ERROR: test case THREW exception: failure... but the show must go on!
+
+===============================================================================
+subcases.cpp(0):
+TEST CASE: fails from an exception but gets re-entered to traverse all subcases
+ level zero
+ two
+
+subcases.cpp(0): ERROR: CHECK( false ) is NOT correct!
+ values: CHECK( false )
+
+===============================================================================
+subcases.cpp(0):
+TEST CASE: fails from an exception but gets re-entered to traverse all subcases
+ level zero
+
+DEEPEST SUBCASE STACK REACHED (DIFFERENT FROM THE CURRENT ONE):
+ level zero
+ two
+
+subcases.cpp(0): ERROR: test case THREW exception: exception thrown in subcase - will translate later when the whole test case has been exited (cannot translate while there is an active exception)
+
+===============================================================================
+subcases.cpp(0):
+TEST CASE: fails from an exception but gets re-entered to traverse all subcases
+
+DEEPEST SUBCASE STACK REACHED (DIFFERENT FROM THE CURRENT ONE):
+ level zero
+ two
+
+subcases.cpp(0): ERROR: test case THREW exception: failure... but the show must go on!
+
+===============================================================================
+test_cases_and_suites.cpp(0):
+DESCRIPTION: regarding failures
+TEST SUITE: test suite with a description
+TEST CASE: fails more times than it should
+
+test_cases_and_suites.cpp(0): ERROR:
+
+test_cases_and_suites.cpp(0): ERROR:
+
+Didn't fail exactly 1 times so marking it as failed!
+===============================================================================
+test_cases_and_suites.cpp(0):
+TEST CASE: fixtured test - not part of a test suite
+
+test_cases_and_suites.cpp(0): ERROR: CHECK( data == 85 ) is NOT correct!
+ values: CHECK( 21 == 85 )
+
+===============================================================================
+header.h(0):
+TEST SUITE: some TS
+TEST CASE: in TS
+
+header.h(0): FATAL ERROR:
+
+===============================================================================
+logging.cpp(0):
+TEST CASE: logging the counter of a loop
+
+logging.cpp(0): ERROR: CHECK( vec[i] != (1 << i) ) is NOT correct!
+ values: CHECK( 1 != 1 )
+ logged: current iteration of loop:
+ i := 0
+
+logging.cpp(0): ERROR: CHECK( vec[i] != (1 << i) ) is NOT correct!
+ values: CHECK( 2 != 2 )
+ logged: current iteration of loop:
+ i := 1
+
+logging.cpp(0): ERROR: CHECK( vec[i] != (1 << i) ) is NOT correct!
+ values: CHECK( 4 != 4 )
+ logged: current iteration of loop:
+ i := 2
+
+logging.cpp(0): ERROR: CHECK( vec[i] != (1 << i) ) is NOT correct!
+ values: CHECK( 8 != 8 )
+ logged: current iteration of loop:
+ i := 3
+
+logging.cpp(0): ERROR: CHECK( vec[i] != (1 << i) ) is NOT correct!
+ values: CHECK( 16 != 16 )
+ logged: current iteration of loop:
+ i := 4
+
+
+root
+1
+1.1
+
+root
+2
+2.1
+
+root
+2
+===============================================================================
+subcases.cpp(0):
+TEST CASE: lots of nested subcases
+
+subcases.cpp(0): FATAL ERROR:
+
+===============================================================================
+templated_test_cases.cpp(0):
+TEST CASE: multiple types<Custom name test>
+
+templated_test_cases.cpp(0): ERROR: CHECK( t2 != T2() ) is NOT correct!
+ values: CHECK( 0 != 0 )
+
+===============================================================================
+templated_test_cases.cpp(0):
+TEST CASE: multiple types<Other custom name>
+
+templated_test_cases.cpp(0): ERROR: CHECK( t2 != T2() ) is NOT correct!
+ values: CHECK( 0 != 0 )
+
+===============================================================================
+templated_test_cases.cpp(0):
+TEST CASE: multiple types<TypePair<bool, int>>
+
+templated_test_cases.cpp(0): ERROR: CHECK( t2 != T2() ) is NOT correct!
+ values: CHECK( 0 != 0 )
+
+===============================================================================
+stringification.cpp(0):
+TEST CASE: no headers
+
+stringification.cpp(0): MESSAGE: 1as
+
+stringification.cpp(0): ERROR: CHECK( chs == nullptr ) is NOT correct!
+ values: CHECK( 1as == nullptr )
+
+stringification.cpp(0): MESSAGE: 1as
+
+stringification.cpp(0): ERROR: CHECK( "1as" == nullptr ) is NOT correct!
+ values: CHECK( 1as == nullptr )
+
+stringification.cpp(0): MESSAGE: [0, 1, 1, 2, 3, 5, 8, 13]
+
+stringification.cpp(0): ERROR: CHECK( ints == nullptr ) is NOT correct!
+ values: CHECK( [0, 1, 1, 2, 3, 5, 8, 13] == nullptr )
+
+stringification.cpp(0): MESSAGE: [0, 1, 1, 2, 3, 5, 8, 13]
+
+stringification.cpp(0): MESSAGE: nullptr
+
+stringification.cpp(0): ERROR: CHECK( cnptr != nullptr ) is NOT correct!
+ values: CHECK( nullptr != nullptr )
+
+stringification.cpp(0): MESSAGE: 0
+
+stringification.cpp(0): ERROR: CHECK( A == C ) is NOT correct!
+ values: CHECK( 0 == 100 )
+
+stringification.cpp(0): MESSAGE: int
+
+===============================================================================
+assertion_macros.cpp(0):
+TEST CASE: normal macros
+
+assertion_macros.cpp(0): ERROR: CHECK( throw_if(true, std::runtime_error("whops!")) == 42 ) THREW exception: "whops!"
+
+assertion_macros.cpp(0): ERROR: CHECK( doctest::Approx(0.502) == 0.501 ) is NOT correct!
+ values: CHECK( Approx( 0.502 ) == 0.501 )
+
+===============================================================================
+test_cases_and_suites.cpp(0):
+TEST SUITE: ts1
+TEST CASE: normal test in a test suite from a decorator
+
+test_cases_and_suites.cpp(0): MESSAGE: failing because of the timeout decorator!
+
+Test case exceeded time limit of 0.000001!
+===============================================================================
+stringification.cpp(0):
+TEST CASE: operator<<
+
+stringification.cpp(0): MESSAGE: A
+
+stringification.cpp(0): MESSAGE: B
+
+stringification.cpp(0): MESSAGE: C
+
+===============================================================================
+test_cases_and_suites.cpp(0):
+TEST SUITE: scoped test suite
+TEST CASE: part of scoped
+
+test_cases_and_suites.cpp(0): FATAL ERROR:
+
+===============================================================================
+test_cases_and_suites.cpp(0):
+TEST SUITE: scoped test suite
+TEST CASE: part of scoped 2
+
+test_cases_and_suites.cpp(0): FATAL ERROR:
+
+===============================================================================
+test_cases_and_suites.cpp(0):
+TEST SUITE: some TS
+TEST CASE: part of some TS
+
+test_cases_and_suites.cpp(0): FATAL ERROR:
+
+
+root
+outside of subcase
+inside subcase 0
+outside of subcase
+inside subcase 1
+outside of subcase
+inside subcase 2
+
+root
+outside of subcase
+also inside 0
+outside of subcase
+also inside 1
+outside of subcase
+also inside 2
+
+root
+outside of subcase
+fail inside 0
+outside of subcase
+===============================================================================
+subcases.cpp(0):
+TEST CASE: reentering subcase via regular control flow
+
+DEEPEST SUBCASE STACK REACHED (DIFFERENT FROM THE CURRENT ONE):
+
+subcases.cpp(0): FATAL ERROR: 1
+
+
+root
+outside of subcase
+inside outside
+nested twice 0, 0
+nested twice 0, 1
+nested twice 0, 2
+outside of subcase
+inside outside
+nested twice 1, 0
+nested twice 1, 1
+nested twice 1, 2
+outside of subcase
+inside outside
+nested twice 2, 0
+nested twice 2, 1
+nested twice 2, 2
+
+root
+outside of subcase
+inside outside
+also twice 0, 0
+also twice 0, 1
+also twice 0, 2
+outside of subcase
+inside outside
+also twice 1, 0
+also twice 1, 1
+also twice 1, 2
+outside of subcase
+inside outside
+also twice 2, 0
+also twice 2, 1
+also twice 2, 2
+===============================================================================
+test_cases_and_suites.cpp(0):
+TEST CASE: should fail because of an exception
+
+test_cases_and_suites.cpp(0): ERROR: test case THREW exception: 0
+
+===============================================================================
+assertion_macros.cpp(0):
+TEST CASE: some asserts used in a function called by a test case
+
+assertion_macros.cpp(0): ERROR: CHECK_THROWS_WITH_AS( throw_if(true, false), "unknown exception", int ) threw a DIFFERENT exception! (contents: "unknown exception")
+
+===============================================================================
+subcases.cpp(0):
+TEST CASE: subcases can be used in a separate function as well
+ from function...
+
+subcases.cpp(0): MESSAGE: print me twice
+
+===============================================================================
+subcases.cpp(0):
+TEST CASE: subcases can be used in a separate function as well
+ from function...
+ sc1
+
+subcases.cpp(0): MESSAGE: hello! from sc1
+
+===============================================================================
+subcases.cpp(0):
+TEST CASE: subcases can be used in a separate function as well
+
+DEEPEST SUBCASE STACK REACHED (DIFFERENT FROM THE CURRENT ONE):
+ from function...
+ sc1
+
+subcases.cpp(0): MESSAGE: lala
+
+===============================================================================
+subcases.cpp(0):
+TEST CASE: subcases can be used in a separate function as well
+ from function...
+
+subcases.cpp(0): MESSAGE: print me twice
+
+===============================================================================
+subcases.cpp(0):
+TEST CASE: subcases can be used in a separate function as well
+ from function...
+ sc2
+
+subcases.cpp(0): MESSAGE: hello! from sc2
+
+===============================================================================
+subcases.cpp(0):
+TEST CASE: subcases can be used in a separate function as well
+
+DEEPEST SUBCASE STACK REACHED (DIFFERENT FROM THE CURRENT ONE):
+ from function...
+ sc2
+
+subcases.cpp(0): MESSAGE: lala
+
+===============================================================================
+subcases.cpp(0):
+TEST CASE: subcases with changing names
+ outer 0
+ inner 0
+
+subcases.cpp(0): MESSAGE: msg!
+
+===============================================================================
+subcases.cpp(0):
+TEST CASE: subcases with changing names
+ outer 0
+ inner 1
+
+subcases.cpp(0): MESSAGE: msg!
+
+===============================================================================
+subcases.cpp(0):
+TEST CASE: subcases with changing names
+ outer 1
+ inner 0
+
+subcases.cpp(0): MESSAGE: msg!
+
+===============================================================================
+subcases.cpp(0):
+TEST CASE: subcases with changing names
+ outer 1
+ inner 1
+
+subcases.cpp(0): MESSAGE: msg!
+
+===============================================================================
+subcases.cpp(0):
+TEST CASE: subcases with changing names
+ separate
+
+subcases.cpp(0): MESSAGE: separate msg!
+
+===============================================================================
+header.h(0):
+TEST CASE: template 1<char>
+
+header.h(0): FATAL ERROR:
+
+===============================================================================
+header.h(0):
+TEST CASE: template 2<doctest::String>
+
+header.h(0): FATAL ERROR:
+
+===============================================================================
+subcases.cpp(0):
+TEST CASE: test case should fail even though the last subcase passes
+ one
+
+subcases.cpp(0): ERROR: CHECK( false ) is NOT correct!
+ values: CHECK( false )
+
+===============================================================================
+logging.cpp(0):
+TEST CASE: third party asserts can report failures to doctest
+
+logging.cpp(0): ERROR: MY_ASSERT(false)
+
+logging.cpp(0): FATAL ERROR: MY_ASSERT_FATAL(false)
+
+===============================================================================
+test_cases_and_suites.cpp(0):
+DESCRIPTION: this test has overridden its skip decorator
+TEST SUITE: skipped test cases
+TEST CASE: unskipped
+
+test_cases_and_suites.cpp(0): FATAL ERROR:
+
+===============================================================================
+templated_test_cases.cpp(0):
+TEST CASE: vector stuff<std::vector<int>>
+
+templated_test_cases.cpp(0): ERROR: CHECK( vec.size() == 20 ) is NOT correct!
+ values: CHECK( 10 == 20 )
+
+===============================================================================
+subcases.cpp(0):
+TEST SUITE: with a funny name,
+TEST CASE: with a funnier name\:
+ with the funniest name\,
+
+subcases.cpp(0): MESSAGE: Yes!
+
+===============================================================================
+subcases.cpp(0):
+TEST SUITE: with a funny name,
+TEST CASE: with a funnier name\:
+ with a slightly funny name :
+
+subcases.cpp(0): MESSAGE: Yep!
+
+===============================================================================
+subcases.cpp(0):
+TEST SUITE: with a funny name,
+TEST CASE: with a funnier name\:
+ without a funny name
+
+subcases.cpp(0): MESSAGE: NO!
+
+===============================================================================
+subcases.cpp(0):
+TEST SUITE: with a funny name,
+TEST CASE: without a funny name:
+
+subcases.cpp(0): MESSAGE: Nooo
+
+===============================================================================
+[doctest] test cases: 83 | 32 passed | 51 failed |
+[doctest] assertions: 228 | 109 passed | 119 failed |
+[doctest] Status: FAILURE!
+Program code.