try dev branch

parent cf4b8247
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
// https://opensource.org/licenses/MIT // https://opensource.org/licenses/MIT
// //
// The documentation can be found at the library's page: // The documentation can be found at the library's page:
// https://github.com/onqtam/doctest/blob/master/doc/markdown/readme.md // https://github.com/doctest/doctest/blob/master/doc/markdown/readme.md
// //
// ================================================================================================= // =================================================================================================
// ================================================================================================= // =================================================================================================
...@@ -49,7 +49,15 @@ ...@@ -49,7 +49,15 @@
#define DOCTEST_VERSION_MAJOR 2 #define DOCTEST_VERSION_MAJOR 2
#define DOCTEST_VERSION_MINOR 4 #define DOCTEST_VERSION_MINOR 4
#define DOCTEST_VERSION_PATCH 7 #define DOCTEST_VERSION_PATCH 7
#define DOCTEST_VERSION_STR "2.4.7"
// util we need here
#define DOCTEST_TOSTR_IMPL(x) #x
#define DOCTEST_TOSTR(x) DOCTEST_TOSTR_IMPL(x)
#define DOCTEST_VERSION_STR \
DOCTEST_TOSTR(DOCTEST_VERSION_MAJOR) "." \
DOCTEST_TOSTR(DOCTEST_VERSION_MINOR) "." \
DOCTEST_TOSTR(DOCTEST_VERSION_PATCH)
#define DOCTEST_VERSION \ #define DOCTEST_VERSION \
(DOCTEST_VERSION_MAJOR * 10000 + DOCTEST_VERSION_MINOR * 100 + DOCTEST_VERSION_PATCH) (DOCTEST_VERSION_MAJOR * 10000 + DOCTEST_VERSION_MINOR * 100 + DOCTEST_VERSION_PATCH)
...@@ -137,86 +145,93 @@ ...@@ -137,86 +145,93 @@
// == COMPILER WARNINGS ============================================================================ // == COMPILER WARNINGS ============================================================================
// ================================================================================================= // =================================================================================================
// both the header and the implementation suppress all of these,
// so it only makes sense to aggregrate them like so
#define DOCTEST_SUPPRESS_COMMON_WARNINGS_PUSH \
DOCTEST_CLANG_SUPPRESS_WARNING_PUSH \
DOCTEST_CLANG_SUPPRESS_WARNING("-Wunknown-pragmas") \
DOCTEST_CLANG_SUPPRESS_WARNING("-Wweak-vtables") \
DOCTEST_CLANG_SUPPRESS_WARNING("-Wpadded") \
DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-prototypes") \
DOCTEST_CLANG_SUPPRESS_WARNING("-Wunused-local-typedef") \
DOCTEST_CLANG_SUPPRESS_WARNING("-Wc++98-compat") \
DOCTEST_CLANG_SUPPRESS_WARNING("-Wc++98-compat-pedantic") \
\
DOCTEST_GCC_SUPPRESS_WARNING_PUSH \
DOCTEST_GCC_SUPPRESS_WARNING("-Wunknown-pragmas") \
DOCTEST_GCC_SUPPRESS_WARNING("-Wpragmas") \
DOCTEST_GCC_SUPPRESS_WARNING("-Weffc++") \
DOCTEST_GCC_SUPPRESS_WARNING("-Wstrict-overflow") \
DOCTEST_GCC_SUPPRESS_WARNING("-Wstrict-aliasing") \
DOCTEST_GCC_SUPPRESS_WARNING("-Wmissing-declarations") \
DOCTEST_GCC_SUPPRESS_WARNING("-Wunused-local-typedefs") \
DOCTEST_GCC_SUPPRESS_WARNING("-Wuseless-cast") \
DOCTEST_GCC_SUPPRESS_WARNING("-Wnoexcept") \
\
DOCTEST_MSVC_SUPPRESS_WARNING_PUSH \
/* these 4 also disabled globally via cmake: */ \
DOCTEST_MSVC_SUPPRESS_WARNING(4514) /* unreferenced inline function has been removed */ \
DOCTEST_MSVC_SUPPRESS_WARNING(4571) /* SEH related */ \
DOCTEST_MSVC_SUPPRESS_WARNING(4710) /* function not inlined */ \
DOCTEST_MSVC_SUPPRESS_WARNING(4711) /* function selected for inline expansion*/ \
/* */ \
DOCTEST_MSVC_SUPPRESS_WARNING(4616) /* invalid compiler warning */ \
DOCTEST_MSVC_SUPPRESS_WARNING(4619) /* invalid compiler warning */ \
DOCTEST_MSVC_SUPPRESS_WARNING(4996) /* The compiler encountered a deprecated declaration */ \
DOCTEST_MSVC_SUPPRESS_WARNING(4706) /* assignment within conditional expression */ \
DOCTEST_MSVC_SUPPRESS_WARNING(4512) /* 'class' : assignment operator could not be generated */ \
DOCTEST_MSVC_SUPPRESS_WARNING(4127) /* conditional expression is constant */ \
DOCTEST_MSVC_SUPPRESS_WARNING(4820) /* padding */ \
DOCTEST_MSVC_SUPPRESS_WARNING(4625) /* copy constructor was implicitly deleted */ \
DOCTEST_MSVC_SUPPRESS_WARNING(4626) /* assignment operator was implicitly deleted */ \
DOCTEST_MSVC_SUPPRESS_WARNING(5027) /* move assignment operator implicitly deleted */ \
DOCTEST_MSVC_SUPPRESS_WARNING(5026) /* move constructor was implicitly deleted */ \
DOCTEST_MSVC_SUPPRESS_WARNING(4640) /* construction of local static object not thread-safe */ \
DOCTEST_MSVC_SUPPRESS_WARNING(5045) /* Spectre mitigation for memory load */ \
/* static analysis */ \
DOCTEST_MSVC_SUPPRESS_WARNING(26439) /* Function may not throw. Declare it 'noexcept' */ \
DOCTEST_MSVC_SUPPRESS_WARNING(26495) /* Always initialize a member variable */ \
DOCTEST_MSVC_SUPPRESS_WARNING(26451) /* Arithmetic overflow ... */ \
DOCTEST_MSVC_SUPPRESS_WARNING(26444) /* Avoid unnamed objects with custom ctor and dtor... */ \
DOCTEST_MSVC_SUPPRESS_WARNING(26812) /* Prefer 'enum class' over 'enum' */
#define DOCTEST_SUPPRESS_COMMON_WARNINGS_POP \
DOCTEST_CLANG_SUPPRESS_WARNING_POP \
DOCTEST_GCC_SUPPRESS_WARNING_POP \
DOCTEST_MSVC_SUPPRESS_WARNING_POP
DOCTEST_SUPPRESS_COMMON_WARNINGS_PUSH
DOCTEST_CLANG_SUPPRESS_WARNING_PUSH DOCTEST_CLANG_SUPPRESS_WARNING_PUSH
DOCTEST_CLANG_SUPPRESS_WARNING("-Wunknown-pragmas")
DOCTEST_CLANG_SUPPRESS_WARNING("-Wnon-virtual-dtor") DOCTEST_CLANG_SUPPRESS_WARNING("-Wnon-virtual-dtor")
DOCTEST_CLANG_SUPPRESS_WARNING("-Wweak-vtables")
DOCTEST_CLANG_SUPPRESS_WARNING("-Wpadded")
DOCTEST_CLANG_SUPPRESS_WARNING("-Wdeprecated") DOCTEST_CLANG_SUPPRESS_WARNING("-Wdeprecated")
DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-prototypes")
DOCTEST_CLANG_SUPPRESS_WARNING("-Wunused-local-typedef")
DOCTEST_CLANG_SUPPRESS_WARNING("-Wc++98-compat")
DOCTEST_CLANG_SUPPRESS_WARNING("-Wc++98-compat-pedantic")
DOCTEST_GCC_SUPPRESS_WARNING_PUSH DOCTEST_GCC_SUPPRESS_WARNING_PUSH
DOCTEST_GCC_SUPPRESS_WARNING("-Wunknown-pragmas")
DOCTEST_GCC_SUPPRESS_WARNING("-Wpragmas")
DOCTEST_GCC_SUPPRESS_WARNING("-Weffc++")
DOCTEST_GCC_SUPPRESS_WARNING("-Wstrict-overflow")
DOCTEST_GCC_SUPPRESS_WARNING("-Wstrict-aliasing")
DOCTEST_GCC_SUPPRESS_WARNING("-Wctor-dtor-privacy") DOCTEST_GCC_SUPPRESS_WARNING("-Wctor-dtor-privacy")
DOCTEST_GCC_SUPPRESS_WARNING("-Wmissing-declarations")
DOCTEST_GCC_SUPPRESS_WARNING("-Wnon-virtual-dtor") DOCTEST_GCC_SUPPRESS_WARNING("-Wnon-virtual-dtor")
DOCTEST_GCC_SUPPRESS_WARNING("-Wunused-local-typedefs")
DOCTEST_GCC_SUPPRESS_WARNING("-Wuseless-cast")
DOCTEST_GCC_SUPPRESS_WARNING("-Wnoexcept")
DOCTEST_GCC_SUPPRESS_WARNING("-Wsign-promo") DOCTEST_GCC_SUPPRESS_WARNING("-Wsign-promo")
DOCTEST_MSVC_SUPPRESS_WARNING_PUSH DOCTEST_MSVC_SUPPRESS_WARNING_PUSH
DOCTEST_MSVC_SUPPRESS_WARNING(4616) // invalid compiler warning
DOCTEST_MSVC_SUPPRESS_WARNING(4619) // invalid compiler warning
DOCTEST_MSVC_SUPPRESS_WARNING(4996) // The compiler encountered a deprecated declaration
DOCTEST_MSVC_SUPPRESS_WARNING(4706) // assignment within conditional expression
DOCTEST_MSVC_SUPPRESS_WARNING(4512) // 'class' : assignment operator could not be generated
DOCTEST_MSVC_SUPPRESS_WARNING(4127) // conditional expression is constant
DOCTEST_MSVC_SUPPRESS_WARNING(4820) // padding
DOCTEST_MSVC_SUPPRESS_WARNING(4625) // copy constructor was implicitly defined as deleted
DOCTEST_MSVC_SUPPRESS_WARNING(4626) // assignment operator was implicitly defined as deleted
DOCTEST_MSVC_SUPPRESS_WARNING(5027) // move assignment operator was implicitly defined as deleted
DOCTEST_MSVC_SUPPRESS_WARNING(5026) // move constructor was implicitly defined as deleted
DOCTEST_MSVC_SUPPRESS_WARNING(4623) // default constructor was implicitly defined as deleted DOCTEST_MSVC_SUPPRESS_WARNING(4623) // default constructor was implicitly defined as deleted
DOCTEST_MSVC_SUPPRESS_WARNING(4640) // construction of local static object is not thread-safe
DOCTEST_MSVC_SUPPRESS_WARNING(5045) // Spectre mitigation for memory load
// static analysis
DOCTEST_MSVC_SUPPRESS_WARNING(26439) // This kind of function may not throw. Declare it 'noexcept'
DOCTEST_MSVC_SUPPRESS_WARNING(26495) // Always initialize a member variable
DOCTEST_MSVC_SUPPRESS_WARNING(26451) // Arithmetic overflow ...
DOCTEST_MSVC_SUPPRESS_WARNING(26444) // Avoid unnamed objects with custom construction and dtr...
DOCTEST_MSVC_SUPPRESS_WARNING(26812) // Prefer 'enum class' over 'enum'
// 4548 - expression before comma has no effect; expected expression with side - effect
// 4265 - class has virtual functions, but destructor is not virtual
// 4986 - exception specification does not match previous declaration
// 4350 - behavior change: 'member1' called instead of 'member2'
// 4668 - 'x' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'
// 4365 - conversion from 'int' to 'unsigned long', signed/unsigned mismatch
// 4774 - format string expected in argument 'x' is not a string literal
// 4820 - padding in structs
// only 4 should be disabled globally:
// - 4514 # unreferenced inline function has been removed
// - 4571 # SEH related
// - 4710 # function not inlined
// - 4711 # function 'x' selected for automatic inline expansion
#define DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN \ #define DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN \
DOCTEST_MSVC_SUPPRESS_WARNING_PUSH \ DOCTEST_MSVC_SUPPRESS_WARNING_PUSH \
DOCTEST_MSVC_SUPPRESS_WARNING(4548) \ DOCTEST_MSVC_SUPPRESS_WARNING(4548) /* before comma no effect; expected side - effect */ \
DOCTEST_MSVC_SUPPRESS_WARNING(4265) \ DOCTEST_MSVC_SUPPRESS_WARNING(4265) /* virtual functions, but destructor is not virtual */ \
DOCTEST_MSVC_SUPPRESS_WARNING(4986) \ DOCTEST_MSVC_SUPPRESS_WARNING(4986) /* exception specification does not match previous */ \
DOCTEST_MSVC_SUPPRESS_WARNING(4350) \ DOCTEST_MSVC_SUPPRESS_WARNING(4350) /* 'member1' called instead of 'member2' */ \
DOCTEST_MSVC_SUPPRESS_WARNING(4668) \ DOCTEST_MSVC_SUPPRESS_WARNING(4668) /* not defined as a preprocessor macro */ \
DOCTEST_MSVC_SUPPRESS_WARNING(4365) \ DOCTEST_MSVC_SUPPRESS_WARNING(4365) /* signed/unsigned mismatch */ \
DOCTEST_MSVC_SUPPRESS_WARNING(4774) \ DOCTEST_MSVC_SUPPRESS_WARNING(4774) /* format string not a string literal */ \
DOCTEST_MSVC_SUPPRESS_WARNING(4820) \ DOCTEST_MSVC_SUPPRESS_WARNING(4820) /* padding */ \
DOCTEST_MSVC_SUPPRESS_WARNING(4625) \ DOCTEST_MSVC_SUPPRESS_WARNING(4625) /* copy constructor was implicitly deleted */ \
DOCTEST_MSVC_SUPPRESS_WARNING(4626) \ DOCTEST_MSVC_SUPPRESS_WARNING(4626) /* assignment operator was implicitly deleted */ \
DOCTEST_MSVC_SUPPRESS_WARNING(5027) \ DOCTEST_MSVC_SUPPRESS_WARNING(5027) /* move assignment operator implicitly deleted */ \
DOCTEST_MSVC_SUPPRESS_WARNING(5026) \ DOCTEST_MSVC_SUPPRESS_WARNING(5026) /* move constructor was implicitly deleted */ \
DOCTEST_MSVC_SUPPRESS_WARNING(4623) \ DOCTEST_MSVC_SUPPRESS_WARNING(4623) /* default constructor was implicitly deleted */ \
DOCTEST_MSVC_SUPPRESS_WARNING(5039) \ DOCTEST_MSVC_SUPPRESS_WARNING(5039) /* pointer to pot. throwing function passed to extern C */ \
DOCTEST_MSVC_SUPPRESS_WARNING(5045) \ DOCTEST_MSVC_SUPPRESS_WARNING(5045) /* Spectre mitigation for memory load */ \
DOCTEST_MSVC_SUPPRESS_WARNING(5105) DOCTEST_MSVC_SUPPRESS_WARNING(5105) /* macro producing 'defined' has undefined behavior */
#define DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_END DOCTEST_MSVC_SUPPRESS_WARNING_POP #define DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_END DOCTEST_MSVC_SUPPRESS_WARNING_POP
...@@ -229,6 +244,7 @@ DOCTEST_MSVC_SUPPRESS_WARNING(26812) // Prefer 'enum class' over 'enum' ...@@ -229,6 +244,7 @@ DOCTEST_MSVC_SUPPRESS_WARNING(26812) // Prefer 'enum class' over 'enum'
// GCC C++11 feature support table: https://gcc.gnu.org/projects/cxx-status.html // GCC C++11 feature support table: https://gcc.gnu.org/projects/cxx-status.html
// MSVC version table: // MSVC version table:
// https://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B#Internal_version_numbering // https://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B#Internal_version_numbering
// MSVC++ 14.3 (17) _MSC_VER == 1930 (Visual Studio 2022)
// MSVC++ 14.2 (16) _MSC_VER == 1920 (Visual Studio 2019) // MSVC++ 14.2 (16) _MSC_VER == 1920 (Visual Studio 2019)
// MSVC++ 14.1 (15) _MSC_VER == 1910 (Visual Studio 2017) // MSVC++ 14.1 (15) _MSC_VER == 1910 (Visual Studio 2017)
// MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015) // MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015)
...@@ -238,6 +254,10 @@ DOCTEST_MSVC_SUPPRESS_WARNING(26812) // Prefer 'enum class' over 'enum' ...@@ -238,6 +254,10 @@ DOCTEST_MSVC_SUPPRESS_WARNING(26812) // Prefer 'enum class' over 'enum'
// MSVC++ 9.0 _MSC_VER == 1500 (Visual Studio 2008) // MSVC++ 9.0 _MSC_VER == 1500 (Visual Studio 2008)
// MSVC++ 8.0 _MSC_VER == 1400 (Visual Studio 2005) // MSVC++ 8.0 _MSC_VER == 1400 (Visual Studio 2005)
// Universal Windows Platform support
#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP)
#define DOCTEST_CONFIG_NO_WINDOWS_SEH
#endif // WINAPI_FAMILY
#if DOCTEST_MSVC && !defined(DOCTEST_CONFIG_WINDOWS_SEH) #if DOCTEST_MSVC && !defined(DOCTEST_CONFIG_WINDOWS_SEH)
#define DOCTEST_CONFIG_WINDOWS_SEH #define DOCTEST_CONFIG_WINDOWS_SEH
#endif // MSVC #endif // MSVC
...@@ -349,8 +369,6 @@ DOCTEST_MSVC_SUPPRESS_WARNING(26812) // Prefer 'enum class' over 'enum' ...@@ -349,8 +369,6 @@ DOCTEST_MSVC_SUPPRESS_WARNING(26812) // Prefer 'enum class' over 'enum'
#define DOCTEST_ANONYMOUS(x) DOCTEST_CAT(x, __LINE__) #define DOCTEST_ANONYMOUS(x) DOCTEST_CAT(x, __LINE__)
#endif // __COUNTER__ #endif // __COUNTER__
#define DOCTEST_TOSTR(x) #x
#ifndef DOCTEST_CONFIG_ASSERTION_PARAMETERS_BY_VALUE #ifndef DOCTEST_CONFIG_ASSERTION_PARAMETERS_BY_VALUE
#define DOCTEST_REF_WRAP(x) x& #define DOCTEST_REF_WRAP(x) x&
#else // DOCTEST_CONFIG_ASSERTION_PARAMETERS_BY_VALUE #else // DOCTEST_CONFIG_ASSERTION_PARAMETERS_BY_VALUE
...@@ -407,32 +425,31 @@ DOCTEST_GCC_SUPPRESS_WARNING_POP ...@@ -407,32 +425,31 @@ DOCTEST_GCC_SUPPRESS_WARNING_POP
#define DOCTEST_CONFIG_USE_STD_HEADERS #define DOCTEST_CONFIG_USE_STD_HEADERS
#endif // DOCTEST_CONFIG_USE_IOSFWD #endif // DOCTEST_CONFIG_USE_IOSFWD
// for clang - always include ciso646 (which drags some std stuff) because
// we want to check if we are using libc++ with the _LIBCPP_VERSION macro in
// which case we don't want to forward declare stuff from std - for reference:
// https://github.com/doctest/doctest/issues/126
// https://github.com/doctest/doctest/issues/356
#if DOCTEST_CLANG
#include <ciso646>
#ifdef _LIBCPP_VERSION
#define DOCTEST_CONFIG_USE_STD_HEADERS
#endif // _LIBCPP_VERSION
#endif // clang
#ifdef DOCTEST_CONFIG_USE_STD_HEADERS #ifdef DOCTEST_CONFIG_USE_STD_HEADERS
#ifndef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS #ifndef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
#define DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS #define DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
#endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS #endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
#include <iosfwd>
#include <cstddef> #include <cstddef>
#include <ostream> #include <ostream>
#include <istream>
#else // DOCTEST_CONFIG_USE_STD_HEADERS #else // DOCTEST_CONFIG_USE_STD_HEADERS
#if DOCTEST_CLANG
// to detect if libc++ is being used with clang (the _LIBCPP_VERSION identifier)
#include <ciso646>
#endif // clang
#ifdef _LIBCPP_VERSION
#define DOCTEST_STD_NAMESPACE_BEGIN _LIBCPP_BEGIN_NAMESPACE_STD
#define DOCTEST_STD_NAMESPACE_END _LIBCPP_END_NAMESPACE_STD
#else // _LIBCPP_VERSION
#define DOCTEST_STD_NAMESPACE_BEGIN namespace std {
#define DOCTEST_STD_NAMESPACE_END }
#endif // _LIBCPP_VERSION
// Forward declaring 'X' in namespace std is not permitted by the C++ Standard. // Forward declaring 'X' in namespace std is not permitted by the C++ Standard.
DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4643) DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4643)
DOCTEST_STD_NAMESPACE_BEGIN // NOLINT (cert-dcl58-cpp) namespace std { // NOLINT (cert-dcl58-cpp)
typedef decltype(nullptr) nullptr_t; typedef decltype(nullptr) nullptr_t;
template <class charT> template <class charT>
struct char_traits; struct char_traits;
...@@ -441,19 +458,20 @@ struct char_traits<char>; ...@@ -441,19 +458,20 @@ struct char_traits<char>;
template <class charT, class traits> template <class charT, class traits>
class basic_ostream; class basic_ostream;
typedef basic_ostream<char, char_traits<char>> ostream; typedef basic_ostream<char, char_traits<char>> ostream;
template <class charT, class traits>
class basic_istream;
typedef basic_istream<char, char_traits<char>> istream;
template <class... Types> template <class... Types>
class tuple; class tuple;
#if DOCTEST_MSVC >= DOCTEST_COMPILER(19, 20, 0) #if DOCTEST_MSVC >= DOCTEST_COMPILER(19, 20, 0)
DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wreserved-identifier") // see this issue on why this is needed: https://github.com/doctest/doctest/issues/183
// see this issue on why this is needed: https://github.com/onqtam/doctest/issues/183 template <class Ty>
template <class _Ty>
class allocator; class allocator;
template <class _Elem, class _Traits, class _Alloc> template <class Elem, class Traits, class Alloc>
class basic_string; class basic_string;
using string = basic_string<char, char_traits<char>, allocator<char>>; using string = basic_string<char, char_traits<char>, allocator<char>>;
DOCTEST_CLANG_SUPPRESS_WARNING_POP
#endif // VS 2019 #endif // VS 2019
DOCTEST_STD_NAMESPACE_END } // namespace std
DOCTEST_MSVC_SUPPRESS_WARNING_POP DOCTEST_MSVC_SUPPRESS_WARNING_POP
...@@ -505,6 +523,8 @@ class DOCTEST_INTERFACE String ...@@ -505,6 +523,8 @@ class DOCTEST_INTERFACE String
view data; view data;
}; };
char* allocate(unsigned sz);
bool isOnStack() const { return (buf[last] & 128) == 0; } bool isOnStack() const { return (buf[last] & 128) == 0; }
void setOnHeap(); void setOnHeap();
void setLast(unsigned in = last); void setLast(unsigned in = last);
...@@ -519,6 +539,8 @@ public: ...@@ -519,6 +539,8 @@ public:
String(const char* in); String(const char* in);
String(const char* in, unsigned in_size); String(const char* in, unsigned in_size);
String(std::istream& in, unsigned in_size);
String(const String& other); String(const String& other);
String& operator=(const String& other); String& operator=(const String& other);
...@@ -865,10 +887,8 @@ namespace detail { ...@@ -865,10 +887,8 @@ namespace detail {
template<class T> template<class T>
using has_insertion_operator = has_insertion_operator_impl::check<const T>; using has_insertion_operator = has_insertion_operator_impl::check<const T>;
DOCTEST_INTERFACE void my_memcpy(void* dest, const void* src, unsigned num); DOCTEST_INTERFACE std::ostream* tlssPush();
DOCTEST_INTERFACE String tlssPop();
DOCTEST_INTERFACE std::ostream* getTlsOss(bool reset=true); // returns a thread-local ostringstream
DOCTEST_INTERFACE String getTlsOssResult();
template <bool C> template <bool C>
...@@ -884,38 +904,40 @@ namespace detail { ...@@ -884,38 +904,40 @@ namespace detail {
template<typename T> template<typename T>
struct filldata struct filldata
{ {
static void fill(const T &in) { static void fill(std::ostream* stream, const T &in) {
*getTlsOss() << in; *stream << in;
} }
}; };
/* This method can be chained */
template<typename T,unsigned long N> template<typename T,unsigned long N>
void fillstream(const T (&in)[N] ) { struct filldata<T[N]>
for(unsigned long i = 0; i < N; i++) { {
*getTlsOss(false) << in[i]; static void fill(std::ostream* stream, const T (&in)[N]) {
for (unsigned long i = 0; i < N; i++) {
*stream << in[i];
} }
} }
};
template<typename T,unsigned long N> // Specialized since we don't want the terminating null byte!
struct filldata<T[N]> template<unsigned long N>
struct filldata<const char[N]>
{ {
static void fill(const T (&in)[N]) { static void fill(std::ostream* stream, const char(&in)[N]) {
fillstream(in); *stream << in;
*getTlsOss(false)<<"";
} }
}; };
template<typename T> template<typename T>
void filloss(const T& in){ void filloss(std::ostream* stream, const T& in){
filldata<T>::fill(in); filldata<T>::fill(stream, in);
} }
template<typename T,unsigned long N> template<typename T,unsigned long N>
void filloss(const T (&in)[N]) { void filloss(std::ostream* stream, const T (&in)[N]) {
// T[N], T(&)[N], T(&&)[N] have same behaviour. // T[N], T(&)[N], T(&&)[N] have same behaviour.
// Hence remove reference. // Hence remove reference.
filldata<typename remove_reference <decltype(in)>::type >::fill(in); filldata<typename remove_reference<decltype(in)>::type>::fill(stream, in);
} }
template <> template <>
...@@ -930,8 +952,9 @@ namespace detail { ...@@ -930,8 +952,9 @@ namespace detail {
* stepping over unaccessible memory. * stepping over unaccessible memory.
*/ */
filloss(in); std::ostream* stream = tlssPush();
return getTlsOssResult(); filloss(stream, in);
return tlssPop();
} }
}; };
...@@ -1007,7 +1030,7 @@ String toString(const DOCTEST_REF_WRAP(T) value) { ...@@ -1007,7 +1030,7 @@ String toString(const DOCTEST_REF_WRAP(T) value) {
} }
#if DOCTEST_MSVC >= DOCTEST_COMPILER(19, 20, 0) #if DOCTEST_MSVC >= DOCTEST_COMPILER(19, 20, 0)
// see this issue on why this is needed: https://github.com/onqtam/doctest/issues/183 // see this issue on why this is needed: https://github.com/doctest/doctest/issues/183
DOCTEST_INTERFACE String toString(const std::string& in); DOCTEST_INTERFACE String toString(const std::string& in);
#endif // VS 2019 #endif // VS 2019
...@@ -1164,7 +1187,7 @@ DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wunused-comparison") ...@@ -1164,7 +1187,7 @@ DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wunused-comparison")
} \ } \
template <typename R ,typename enable_if< !doctest::detail::is_rvalue_reference<R>::value , void >::type* = nullptr> \ template <typename R ,typename enable_if< !doctest::detail::is_rvalue_reference<R>::value , void >::type* = nullptr> \
DOCTEST_NOINLINE SFINAE_OP(Result,op) operator op(const R& rhs) { \ DOCTEST_NOINLINE SFINAE_OP(Result,op) operator op(const R& rhs) { \
bool res = op_macro(doctest::detail::forward<const L>(lhs), doctest::detail::forward<const R>(rhs)); \ bool res = op_macro(doctest::detail::forward<const L>(lhs), rhs); \
if(m_at & assertType::is_false) \ if(m_at & assertType::is_false) \
res = !res; \ res = !res; \
if(!res || doctest::getContextOptions()->success) \ if(!res || doctest::getContextOptions()->success) \
...@@ -1172,7 +1195,6 @@ DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wunused-comparison") ...@@ -1172,7 +1195,6 @@ DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wunused-comparison")
return Result(res); \ return Result(res); \
} }
// more checks could be added - like in Catch: // more checks could be added - like in Catch:
// https://github.com/catchorg/Catch2/pull/1480/files // https://github.com/catchorg/Catch2/pull/1480/files
// https://github.com/catchorg/Catch2/pull/1481/files // https://github.com/catchorg/Catch2/pull/1481/files
...@@ -1300,7 +1322,7 @@ DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wunused-comparison") ...@@ -1300,7 +1322,7 @@ DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wunused-comparison")
DOCTEST_NOINLINE operator Result() { DOCTEST_NOINLINE operator Result() {
// this is needed only for MSVC 2015: // this is needed only for MSVC 2015:
// https://ci.appveyor.com/project/onqtam/doctest/builds/38181202 // https://ci.appveyor.com/project/doctest/doctest/builds/38181202
DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4800) // 'int': forcing value to bool DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4800) // 'int': forcing value to bool
bool res = static_cast<bool>(lhs); bool res = static_cast<bool>(lhs);
DOCTEST_MSVC_SUPPRESS_WARNING_POP DOCTEST_MSVC_SUPPRESS_WARNING_POP
...@@ -1474,15 +1496,16 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP ...@@ -1474,15 +1496,16 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP
void setResult(const Result& res); void setResult(const Result& res);
template <int comparison, typename L, typename R> template <int comparison, typename L, typename R>
DOCTEST_NOINLINE void binary_assert(const DOCTEST_REF_WRAP(L) lhs, DOCTEST_NOINLINE bool binary_assert(const DOCTEST_REF_WRAP(L) lhs,
const DOCTEST_REF_WRAP(R) rhs) { const DOCTEST_REF_WRAP(R) rhs) {
m_failed = !RelationalComparator<comparison, L, R>()(lhs, rhs); m_failed = !RelationalComparator<comparison, L, R>()(lhs, rhs);
if(m_failed || getContextOptions()->success) if(m_failed || getContextOptions()->success)
m_decomp = stringifyBinaryExpr(lhs, ", ", rhs); m_decomp = stringifyBinaryExpr(lhs, ", ", rhs);
return !m_failed;
} }
template <typename L> template <typename L>
DOCTEST_NOINLINE void unary_assert(const DOCTEST_REF_WRAP(L) val) { DOCTEST_NOINLINE bool unary_assert(const DOCTEST_REF_WRAP(L) val) {
m_failed = !val; m_failed = !val;
if(m_at & assertType::is_false) //!OCLINT bitwise operator in conditional if(m_at & assertType::is_false) //!OCLINT bitwise operator in conditional
...@@ -1490,6 +1513,8 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP ...@@ -1490,6 +1513,8 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP
if(m_failed || getContextOptions()->success) if(m_failed || getContextOptions()->success)
m_decomp = toString(val); m_decomp = toString(val);
return !m_failed;
} }
void translateException(); void translateException();
...@@ -1509,7 +1534,7 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP ...@@ -1509,7 +1534,7 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP
DOCTEST_INTERFACE void failed_out_of_a_testing_context(const AssertData& ad); DOCTEST_INTERFACE void failed_out_of_a_testing_context(const AssertData& ad);
DOCTEST_INTERFACE void decomp_assert(assertType::Enum at, const char* file, int line, DOCTEST_INTERFACE bool decomp_assert(assertType::Enum at, const char* file, int line,
const char* expr, Result result); const char* expr, Result result);
#define DOCTEST_ASSERT_OUT_OF_TESTS(decomp) \ #define DOCTEST_ASSERT_OUT_OF_TESTS(decomp) \
...@@ -1525,7 +1550,7 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP ...@@ -1525,7 +1550,7 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP
if(checkIfShouldThrow(at)) \ if(checkIfShouldThrow(at)) \
throwException(); \ throwException(); \
} \ } \
return; \ return !failed; \
} \ } \
} while(false) } while(false)
...@@ -1540,7 +1565,7 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP ...@@ -1540,7 +1565,7 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP
throwException() throwException()
template <int comparison, typename L, typename R> template <int comparison, typename L, typename R>
DOCTEST_NOINLINE void binary_assert(assertType::Enum at, const char* file, int line, DOCTEST_NOINLINE bool binary_assert(assertType::Enum at, const char* file, int line,
const char* expr, const DOCTEST_REF_WRAP(L) lhs, const char* expr, const DOCTEST_REF_WRAP(L) lhs,
const DOCTEST_REF_WRAP(R) rhs) { const DOCTEST_REF_WRAP(R) rhs) {
bool failed = !RelationalComparator<comparison, L, R>()(lhs, rhs); bool failed = !RelationalComparator<comparison, L, R>()(lhs, rhs);
...@@ -1551,10 +1576,11 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP ...@@ -1551,10 +1576,11 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP
// ################################################################################### // ###################################################################################
DOCTEST_ASSERT_OUT_OF_TESTS(stringifyBinaryExpr(lhs, ", ", rhs)); DOCTEST_ASSERT_OUT_OF_TESTS(stringifyBinaryExpr(lhs, ", ", rhs));
DOCTEST_ASSERT_IN_TESTS(stringifyBinaryExpr(lhs, ", ", rhs)); DOCTEST_ASSERT_IN_TESTS(stringifyBinaryExpr(lhs, ", ", rhs));
return !failed;
} }
template <typename L> template <typename L>
DOCTEST_NOINLINE void unary_assert(assertType::Enum at, const char* file, int line, DOCTEST_NOINLINE bool unary_assert(assertType::Enum at, const char* file, int line,
const char* expr, const DOCTEST_REF_WRAP(L) val) { const char* expr, const DOCTEST_REF_WRAP(L) val) {
bool failed = !val; bool failed = !val;
...@@ -1567,6 +1593,7 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP ...@@ -1567,6 +1593,7 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP
// ################################################################################### // ###################################################################################
DOCTEST_ASSERT_OUT_OF_TESTS(toString(val)); DOCTEST_ASSERT_OUT_OF_TESTS(toString(val));
DOCTEST_ASSERT_IN_TESTS(toString(val)); DOCTEST_ASSERT_IN_TESTS(toString(val));
return !failed;
} }
struct DOCTEST_INTERFACE IExceptionTranslator struct DOCTEST_INTERFACE IExceptionTranslator
...@@ -1687,6 +1714,7 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP ...@@ -1687,6 +1714,7 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP
struct DOCTEST_INTERFACE MessageBuilder : public MessageData struct DOCTEST_INTERFACE MessageBuilder : public MessageData
{ {
std::ostream* m_stream; std::ostream* m_stream;
bool logged = false;
MessageBuilder(const char* file, int line, assertType::Enum severity); MessageBuilder(const char* file, int line, assertType::Enum severity);
MessageBuilder() = delete; MessageBuilder() = delete;
...@@ -1921,10 +1949,11 @@ int registerReporter(const char* name, int priority, bool isReporter) { ...@@ -1921,10 +1949,11 @@ int registerReporter(const char* name, int priority, bool isReporter) {
#if !defined(DOCTEST_CONFIG_DISABLE) #if !defined(DOCTEST_CONFIG_DISABLE)
// common code in asserts - for convenience // common code in asserts - for convenience
#define DOCTEST_ASSERT_LOG_AND_REACT(b) \ #define DOCTEST_ASSERT_LOG_REACT_RETURN(b) \
if(b.log()) \ if(b.log()) \
DOCTEST_BREAK_INTO_DEBUGGER(); \ DOCTEST_BREAK_INTO_DEBUGGER(); \
b.react() b.react(); \
return !b.m_failed
#ifdef DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS #ifdef DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS
#define DOCTEST_WRAP_IN_TRY(x) x; #define DOCTEST_WRAP_IN_TRY(x) x;
...@@ -2151,11 +2180,13 @@ int registerReporter(const char* name, int priority, bool isReporter) { ...@@ -2151,11 +2180,13 @@ int registerReporter(const char* name, int priority, bool isReporter) {
#define DOCTEST_CAPTURE(x) DOCTEST_INFO(#x " := ", x) #define DOCTEST_CAPTURE(x) DOCTEST_INFO(#x " := ", x)
#define DOCTEST_ADD_AT_IMPL(type, file, line, mb, ...) \ #define DOCTEST_ADD_AT_IMPL(type, file, line, mb, ...) \
do { \ [&] { \
doctest::detail::MessageBuilder mb(file, line, doctest::assertType::type); \ doctest::detail::MessageBuilder mb(file, line, doctest::assertType::type); \
mb * __VA_ARGS__; \ mb * __VA_ARGS__; \
DOCTEST_ASSERT_LOG_AND_REACT(mb); \ if(mb.log()) \
} while(false) DOCTEST_BREAK_INTO_DEBUGGER(); \
mb.react(); \
}()
// clang-format off // clang-format off
#define DOCTEST_ADD_MESSAGE_AT(file, line, ...) DOCTEST_ADD_AT_IMPL(is_warn, file, line, DOCTEST_ANONYMOUS(DOCTEST_MESSAGE_), __VA_ARGS__) #define DOCTEST_ADD_MESSAGE_AT(file, line, ...) DOCTEST_ADD_AT_IMPL(is_warn, file, line, DOCTEST_ANONYMOUS(DOCTEST_MESSAGE_), __VA_ARGS__)
...@@ -2178,13 +2209,13 @@ int registerReporter(const char* name, int priority, bool isReporter) { ...@@ -2178,13 +2209,13 @@ int registerReporter(const char* name, int priority, bool isReporter) {
DOCTEST_WRAP_IN_TRY(DOCTEST_RB.setResult( \ DOCTEST_WRAP_IN_TRY(DOCTEST_RB.setResult( \
doctest::detail::ExpressionDecomposer(doctest::assertType::assert_type) \ doctest::detail::ExpressionDecomposer(doctest::assertType::assert_type) \
<< __VA_ARGS__)) \ << __VA_ARGS__)) \
DOCTEST_ASSERT_LOG_AND_REACT(DOCTEST_RB) \ DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB) \
DOCTEST_CLANG_SUPPRESS_WARNING_POP DOCTEST_CLANG_SUPPRESS_WARNING_POP
#define DOCTEST_ASSERT_IMPLEMENT_1(assert_type, ...) \ #define DOCTEST_ASSERT_IMPLEMENT_1(assert_type, ...) \
do { \ [&] { \
DOCTEST_ASSERT_IMPLEMENT_2(assert_type, __VA_ARGS__); \ DOCTEST_ASSERT_IMPLEMENT_2(assert_type, __VA_ARGS__); \
} while(false) }()
#else // DOCTEST_CONFIG_SUPER_FAST_ASSERTS #else // DOCTEST_CONFIG_SUPER_FAST_ASSERTS
...@@ -2208,16 +2239,16 @@ int registerReporter(const char* name, int priority, bool isReporter) { ...@@ -2208,16 +2239,16 @@ int registerReporter(const char* name, int priority, bool isReporter) {
#define DOCTEST_REQUIRE_FALSE(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_REQUIRE_FALSE, __VA_ARGS__) #define DOCTEST_REQUIRE_FALSE(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_REQUIRE_FALSE, __VA_ARGS__)
// clang-format off // clang-format off
#define DOCTEST_WARN_MESSAGE(cond, ...) do { DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_WARN, cond); } while(false) #define DOCTEST_WARN_MESSAGE(cond, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_WARN, cond); }()
#define DOCTEST_CHECK_MESSAGE(cond, ...) do { DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_CHECK, cond); } while(false) #define DOCTEST_CHECK_MESSAGE(cond, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_CHECK, cond); }()
#define DOCTEST_REQUIRE_MESSAGE(cond, ...) do { DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_REQUIRE, cond); } while(false) #define DOCTEST_REQUIRE_MESSAGE(cond, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_REQUIRE, cond); }()
#define DOCTEST_WARN_FALSE_MESSAGE(cond, ...) do { DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_WARN_FALSE, cond); } while(false) #define DOCTEST_WARN_FALSE_MESSAGE(cond, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_WARN_FALSE, cond); }()
#define DOCTEST_CHECK_FALSE_MESSAGE(cond, ...) do { DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_CHECK_FALSE, cond); } while(false) #define DOCTEST_CHECK_FALSE_MESSAGE(cond, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_CHECK_FALSE, cond); }()
#define DOCTEST_REQUIRE_FALSE_MESSAGE(cond, ...) do { DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_REQUIRE_FALSE, cond); } while(false) #define DOCTEST_REQUIRE_FALSE_MESSAGE(cond, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_REQUIRE_FALSE, cond); }()
// clang-format on // clang-format on
#define DOCTEST_ASSERT_THROWS_AS(expr, assert_type, message, ...) \ #define DOCTEST_ASSERT_THROWS_AS(expr, assert_type, message, ...) \
do { \ [&] { \
if(!doctest::getContextOptions()->no_throw) { \ if(!doctest::getContextOptions()->no_throw) { \
doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \ doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \
__LINE__, #expr, #__VA_ARGS__, message); \ __LINE__, #expr, #__VA_ARGS__, message); \
...@@ -2228,31 +2259,35 @@ int registerReporter(const char* name, int priority, bool isReporter) { ...@@ -2228,31 +2259,35 @@ int registerReporter(const char* name, int priority, bool isReporter) {
DOCTEST_RB.translateException(); \ DOCTEST_RB.translateException(); \
DOCTEST_RB.m_threw_as = true; \ DOCTEST_RB.m_threw_as = true; \
} catch(...) { DOCTEST_RB.translateException(); } \ } catch(...) { DOCTEST_RB.translateException(); } \
DOCTEST_ASSERT_LOG_AND_REACT(DOCTEST_RB); \ DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB); \
} else { \
return false; \
} \ } \
} while(false) }()
#define DOCTEST_ASSERT_THROWS_WITH(expr, expr_str, assert_type, ...) \ #define DOCTEST_ASSERT_THROWS_WITH(expr, expr_str, assert_type, ...) \
do { \ [&] { \
if(!doctest::getContextOptions()->no_throw) { \ if(!doctest::getContextOptions()->no_throw) { \
doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \ doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \
__LINE__, expr_str, "", __VA_ARGS__); \ __LINE__, expr_str, "", __VA_ARGS__); \
try { \ try { \
DOCTEST_CAST_TO_VOID(expr) \ DOCTEST_CAST_TO_VOID(expr) \
} catch(...) { DOCTEST_RB.translateException(); } \ } catch(...) { DOCTEST_RB.translateException(); } \
DOCTEST_ASSERT_LOG_AND_REACT(DOCTEST_RB); \ DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB); \
} else { \
return false; \
} \ } \
} while(false) }()
#define DOCTEST_ASSERT_NOTHROW(assert_type, ...) \ #define DOCTEST_ASSERT_NOTHROW(assert_type, ...) \
do { \ [&] { \
doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \ doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \
__LINE__, #__VA_ARGS__); \ __LINE__, #__VA_ARGS__); \
try { \ try { \
DOCTEST_CAST_TO_VOID(__VA_ARGS__) \ DOCTEST_CAST_TO_VOID(__VA_ARGS__) \
} catch(...) { DOCTEST_RB.translateException(); } \ } catch(...) { DOCTEST_RB.translateException(); } \
DOCTEST_ASSERT_LOG_AND_REACT(DOCTEST_RB); \ DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB); \
} while(false) }()
// clang-format off // clang-format off
#define DOCTEST_WARN_THROWS(...) DOCTEST_ASSERT_THROWS_WITH((__VA_ARGS__), #__VA_ARGS__, DT_WARN_THROWS, "") #define DOCTEST_WARN_THROWS(...) DOCTEST_ASSERT_THROWS_WITH((__VA_ARGS__), #__VA_ARGS__, DT_WARN_THROWS, "")
...@@ -2275,42 +2310,42 @@ int registerReporter(const char* name, int priority, bool isReporter) { ...@@ -2275,42 +2310,42 @@ int registerReporter(const char* name, int priority, bool isReporter) {
#define DOCTEST_CHECK_NOTHROW(...) DOCTEST_ASSERT_NOTHROW(DT_CHECK_NOTHROW, __VA_ARGS__) #define DOCTEST_CHECK_NOTHROW(...) DOCTEST_ASSERT_NOTHROW(DT_CHECK_NOTHROW, __VA_ARGS__)
#define DOCTEST_REQUIRE_NOTHROW(...) DOCTEST_ASSERT_NOTHROW(DT_REQUIRE_NOTHROW, __VA_ARGS__) #define DOCTEST_REQUIRE_NOTHROW(...) DOCTEST_ASSERT_NOTHROW(DT_REQUIRE_NOTHROW, __VA_ARGS__)
#define DOCTEST_WARN_THROWS_MESSAGE(expr, ...) do { DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_THROWS(expr); } while(false) #define DOCTEST_WARN_THROWS_MESSAGE(expr, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_THROWS(expr); }()
#define DOCTEST_CHECK_THROWS_MESSAGE(expr, ...) do { DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_THROWS(expr); } while(false) #define DOCTEST_CHECK_THROWS_MESSAGE(expr, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_THROWS(expr); }()
#define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, ...) do { DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_THROWS(expr); } while(false) #define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_THROWS(expr); }()
#define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, ...) do { DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_THROWS_AS(expr, ex); } while(false) #define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_THROWS_AS(expr, ex); }()
#define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, ...) do { DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_THROWS_AS(expr, ex); } while(false) #define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_THROWS_AS(expr, ex); }()
#define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, ...) do { DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_THROWS_AS(expr, ex); } while(false) #define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_THROWS_AS(expr, ex); }()
#define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, ...) do { DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_THROWS_WITH(expr, with); } while(false) #define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_THROWS_WITH(expr, with); }()
#define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, ...) do { DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_THROWS_WITH(expr, with); } while(false) #define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_THROWS_WITH(expr, with); }()
#define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, ...) do { DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_THROWS_WITH(expr, with); } while(false) #define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_THROWS_WITH(expr, with); }()
#define DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) do { DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_THROWS_WITH_AS(expr, with, ex); } while(false) #define DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_THROWS_WITH_AS(expr, with, ex); }()
#define DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) do { DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_THROWS_WITH_AS(expr, with, ex); } while(false) #define DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_THROWS_WITH_AS(expr, with, ex); }()
#define DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) do { DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, ex); } while(false) #define DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, ex); }()
#define DOCTEST_WARN_NOTHROW_MESSAGE(expr, ...) do { DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_NOTHROW(expr); } while(false) #define DOCTEST_WARN_NOTHROW_MESSAGE(expr, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_NOTHROW(expr); }()
#define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, ...) do { DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_NOTHROW(expr); } while(false) #define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_NOTHROW(expr); }()
#define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, ...) do { DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_NOTHROW(expr); } while(false) #define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, ...) [&] {DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_NOTHROW(expr); }()
// clang-format on // clang-format on
#ifndef DOCTEST_CONFIG_SUPER_FAST_ASSERTS #ifndef DOCTEST_CONFIG_SUPER_FAST_ASSERTS
#define DOCTEST_BINARY_ASSERT(assert_type, comp, ...) \ #define DOCTEST_BINARY_ASSERT(assert_type, comp, ...) \
do { \ [&] { \
doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \ doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \
__LINE__, #__VA_ARGS__); \ __LINE__, #__VA_ARGS__); \
DOCTEST_WRAP_IN_TRY( \ DOCTEST_WRAP_IN_TRY( \
DOCTEST_RB.binary_assert<doctest::detail::binaryAssertComparison::comp>( \ DOCTEST_RB.binary_assert<doctest::detail::binaryAssertComparison::comp>( \
__VA_ARGS__)) \ __VA_ARGS__)) \
DOCTEST_ASSERT_LOG_AND_REACT(DOCTEST_RB); \ DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB); \
} while(false) }()
#define DOCTEST_UNARY_ASSERT(assert_type, ...) \ #define DOCTEST_UNARY_ASSERT(assert_type, ...) \
do { \ [&] { \
doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \ doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \
__LINE__, #__VA_ARGS__); \ __LINE__, #__VA_ARGS__); \
DOCTEST_WRAP_IN_TRY(DOCTEST_RB.unary_assert(__VA_ARGS__)) \ DOCTEST_WRAP_IN_TRY(DOCTEST_RB.unary_assert(__VA_ARGS__)) \
DOCTEST_ASSERT_LOG_AND_REACT(DOCTEST_RB); \ DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB); \
} while(false) }()
#else // DOCTEST_CONFIG_SUPER_FAST_ASSERTS #else // DOCTEST_CONFIG_SUPER_FAST_ASSERTS
...@@ -2386,37 +2421,37 @@ int registerReporter(const char* name, int priority, bool isReporter) { ...@@ -2386,37 +2421,37 @@ int registerReporter(const char* name, int priority, bool isReporter) {
#ifdef DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS #ifdef DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS
#define DOCTEST_WARN_THROWS(...) (static_cast<void>(0)) #define DOCTEST_WARN_THROWS(...) ([] { return false; })
#define DOCTEST_CHECK_THROWS(...) (static_cast<void>(0)) #define DOCTEST_CHECK_THROWS(...) ([] { return false; })
#define DOCTEST_REQUIRE_THROWS(...) (static_cast<void>(0)) #define DOCTEST_REQUIRE_THROWS(...) ([] { return false; })
#define DOCTEST_WARN_THROWS_AS(expr, ...) (static_cast<void>(0)) #define DOCTEST_WARN_THROWS_AS(expr, ...) ([] { return false; })
#define DOCTEST_CHECK_THROWS_AS(expr, ...) (static_cast<void>(0)) #define DOCTEST_CHECK_THROWS_AS(expr, ...) ([] { return false; })
#define DOCTEST_REQUIRE_THROWS_AS(expr, ...) (static_cast<void>(0)) #define DOCTEST_REQUIRE_THROWS_AS(expr, ...) ([] { return false; })
#define DOCTEST_WARN_THROWS_WITH(expr, ...) (static_cast<void>(0)) #define DOCTEST_WARN_THROWS_WITH(expr, ...) ([] { return false; })
#define DOCTEST_CHECK_THROWS_WITH(expr, ...) (static_cast<void>(0)) #define DOCTEST_CHECK_THROWS_WITH(expr, ...) ([] { return false; })
#define DOCTEST_REQUIRE_THROWS_WITH(expr, ...) (static_cast<void>(0)) #define DOCTEST_REQUIRE_THROWS_WITH(expr, ...) ([] { return false; })
#define DOCTEST_WARN_THROWS_WITH_AS(expr, with, ...) (static_cast<void>(0)) #define DOCTEST_WARN_THROWS_WITH_AS(expr, with, ...) ([] { return false; })
#define DOCTEST_CHECK_THROWS_WITH_AS(expr, with, ...) (static_cast<void>(0)) #define DOCTEST_CHECK_THROWS_WITH_AS(expr, with, ...) ([] { return false; })
#define DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, ...) (static_cast<void>(0)) #define DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, ...) ([] { return false; })
#define DOCTEST_WARN_NOTHROW(...) (static_cast<void>(0)) #define DOCTEST_WARN_NOTHROW(...) ([] { return false; })
#define DOCTEST_CHECK_NOTHROW(...) (static_cast<void>(0)) #define DOCTEST_CHECK_NOTHROW(...) ([] { return false; })
#define DOCTEST_REQUIRE_NOTHROW(...) (static_cast<void>(0)) #define DOCTEST_REQUIRE_NOTHROW(...) ([] { return false; })
#define DOCTEST_WARN_THROWS_MESSAGE(expr, ...) (static_cast<void>(0)) #define DOCTEST_WARN_THROWS_MESSAGE(expr, ...) ([] { return false; })
#define DOCTEST_CHECK_THROWS_MESSAGE(expr, ...) (static_cast<void>(0)) #define DOCTEST_CHECK_THROWS_MESSAGE(expr, ...) ([] { return false; })
#define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, ...) (static_cast<void>(0)) #define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, ...) ([] { return false; })
#define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, ...) (static_cast<void>(0)) #define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, ...) ([] { return false; })
#define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, ...) (static_cast<void>(0)) #define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, ...) ([] { return false; })
#define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, ...) (static_cast<void>(0)) #define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, ...) ([] { return false; })
#define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, ...) (static_cast<void>(0)) #define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, ...) ([] { return false; })
#define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, ...) (static_cast<void>(0)) #define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, ...) ([] { return false; })
#define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, ...) (static_cast<void>(0)) #define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, ...) ([] { return false; })
#define DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) (static_cast<void>(0)) #define DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) ([] { return false; })
#define DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) (static_cast<void>(0)) #define DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) ([] { return false; })
#define DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) (static_cast<void>(0)) #define DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) ([] { return false; })
#define DOCTEST_WARN_NOTHROW_MESSAGE(expr, ...) (static_cast<void>(0)) #define DOCTEST_WARN_NOTHROW_MESSAGE(expr, ...) ([] { return false; })
#define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, ...) (static_cast<void>(0)) #define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, ...) ([] { return false; })
#define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, ...) (static_cast<void>(0)) #define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, ...) ([] { return false; })
#else // DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS #else // DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS
...@@ -2516,77 +2551,77 @@ int registerReporter(const char* name, int priority, bool isReporter) { ...@@ -2516,77 +2551,77 @@ int registerReporter(const char* name, int priority, bool isReporter) {
#define DOCTEST_FAIL_CHECK(...) (static_cast<void>(0)) #define DOCTEST_FAIL_CHECK(...) (static_cast<void>(0))
#define DOCTEST_FAIL(...) (static_cast<void>(0)) #define DOCTEST_FAIL(...) (static_cast<void>(0))
#define DOCTEST_WARN(...) (static_cast<void>(0)) #define DOCTEST_WARN(...) ([] { return false; })
#define DOCTEST_CHECK(...) (static_cast<void>(0)) #define DOCTEST_CHECK(...) ([] { return false; })
#define DOCTEST_REQUIRE(...) (static_cast<void>(0)) #define DOCTEST_REQUIRE(...) ([] { return false; })
#define DOCTEST_WARN_FALSE(...) (static_cast<void>(0)) #define DOCTEST_WARN_FALSE(...) ([] { return false; })
#define DOCTEST_CHECK_FALSE(...) (static_cast<void>(0)) #define DOCTEST_CHECK_FALSE(...) ([] { return false; })
#define DOCTEST_REQUIRE_FALSE(...) (static_cast<void>(0)) #define DOCTEST_REQUIRE_FALSE(...) ([] { return false; })
#define DOCTEST_WARN_MESSAGE(cond, ...) (static_cast<void>(0)) #define DOCTEST_WARN_MESSAGE(cond, ...) ([] { return false; })
#define DOCTEST_CHECK_MESSAGE(cond, ...) (static_cast<void>(0)) #define DOCTEST_CHECK_MESSAGE(cond, ...) ([] { return false; })
#define DOCTEST_REQUIRE_MESSAGE(cond, ...) (static_cast<void>(0)) #define DOCTEST_REQUIRE_MESSAGE(cond, ...) ([] { return false; })
#define DOCTEST_WARN_FALSE_MESSAGE(cond, ...) (static_cast<void>(0)) #define DOCTEST_WARN_FALSE_MESSAGE(cond, ...) ([] { return false; })
#define DOCTEST_CHECK_FALSE_MESSAGE(cond, ...) (static_cast<void>(0)) #define DOCTEST_CHECK_FALSE_MESSAGE(cond, ...) ([] { return false; })
#define DOCTEST_REQUIRE_FALSE_MESSAGE(cond, ...) (static_cast<void>(0)) #define DOCTEST_REQUIRE_FALSE_MESSAGE(cond, ...) ([] { return false; })
#define DOCTEST_WARN_THROWS(...) (static_cast<void>(0)) #define DOCTEST_WARN_THROWS(...) ([] { return false; })
#define DOCTEST_CHECK_THROWS(...) (static_cast<void>(0)) #define DOCTEST_CHECK_THROWS(...) ([] { return false; })
#define DOCTEST_REQUIRE_THROWS(...) (static_cast<void>(0)) #define DOCTEST_REQUIRE_THROWS(...) ([] { return false; })
#define DOCTEST_WARN_THROWS_AS(expr, ...) (static_cast<void>(0)) #define DOCTEST_WARN_THROWS_AS(expr, ...) ([] { return false; })
#define DOCTEST_CHECK_THROWS_AS(expr, ...) (static_cast<void>(0)) #define DOCTEST_CHECK_THROWS_AS(expr, ...) ([] { return false; })
#define DOCTEST_REQUIRE_THROWS_AS(expr, ...) (static_cast<void>(0)) #define DOCTEST_REQUIRE_THROWS_AS(expr, ...) ([] { return false; })
#define DOCTEST_WARN_THROWS_WITH(expr, ...) (static_cast<void>(0)) #define DOCTEST_WARN_THROWS_WITH(expr, ...) ([] { return false; })
#define DOCTEST_CHECK_THROWS_WITH(expr, ...) (static_cast<void>(0)) #define DOCTEST_CHECK_THROWS_WITH(expr, ...) ([] { return false; })
#define DOCTEST_REQUIRE_THROWS_WITH(expr, ...) (static_cast<void>(0)) #define DOCTEST_REQUIRE_THROWS_WITH(expr, ...) ([] { return false; })
#define DOCTEST_WARN_THROWS_WITH_AS(expr, with, ...) (static_cast<void>(0)) #define DOCTEST_WARN_THROWS_WITH_AS(expr, with, ...) ([] { return false; })
#define DOCTEST_CHECK_THROWS_WITH_AS(expr, with, ...) (static_cast<void>(0)) #define DOCTEST_CHECK_THROWS_WITH_AS(expr, with, ...) ([] { return false; })
#define DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, ...) (static_cast<void>(0)) #define DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, ...) ([] { return false; })
#define DOCTEST_WARN_NOTHROW(...) (static_cast<void>(0)) #define DOCTEST_WARN_NOTHROW(...) ([] { return false; })
#define DOCTEST_CHECK_NOTHROW(...) (static_cast<void>(0)) #define DOCTEST_CHECK_NOTHROW(...) ([] { return false; })
#define DOCTEST_REQUIRE_NOTHROW(...) (static_cast<void>(0)) #define DOCTEST_REQUIRE_NOTHROW(...) ([] { return false; })
#define DOCTEST_WARN_THROWS_MESSAGE(expr, ...) (static_cast<void>(0)) #define DOCTEST_WARN_THROWS_MESSAGE(expr, ...) ([] { return false; })
#define DOCTEST_CHECK_THROWS_MESSAGE(expr, ...) (static_cast<void>(0)) #define DOCTEST_CHECK_THROWS_MESSAGE(expr, ...) ([] { return false; })
#define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, ...) (static_cast<void>(0)) #define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, ...) ([] { return false; })
#define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, ...) (static_cast<void>(0)) #define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, ...) ([] { return false; })
#define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, ...) (static_cast<void>(0)) #define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, ...) ([] { return false; })
#define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, ...) (static_cast<void>(0)) #define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, ...) ([] { return false; })
#define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, ...) (static_cast<void>(0)) #define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, ...) ([] { return false; })
#define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, ...) (static_cast<void>(0)) #define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, ...) ([] { return false; })
#define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, ...) (static_cast<void>(0)) #define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, ...) ([] { return false; })
#define DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) (static_cast<void>(0)) #define DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) ([] { return false; })
#define DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) (static_cast<void>(0)) #define DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) ([] { return false; })
#define DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) (static_cast<void>(0)) #define DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) ([] { return false; })
#define DOCTEST_WARN_NOTHROW_MESSAGE(expr, ...) (static_cast<void>(0)) #define DOCTEST_WARN_NOTHROW_MESSAGE(expr, ...) ([] { return false; })
#define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, ...) (static_cast<void>(0)) #define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, ...) ([] { return false; })
#define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, ...) (static_cast<void>(0)) #define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, ...) ([] { return false; })
#define DOCTEST_WARN_EQ(...) (static_cast<void>(0)) #define DOCTEST_WARN_EQ(...) ([] { return false; })
#define DOCTEST_CHECK_EQ(...) (static_cast<void>(0)) #define DOCTEST_CHECK_EQ(...) ([] { return false; })
#define DOCTEST_REQUIRE_EQ(...) (static_cast<void>(0)) #define DOCTEST_REQUIRE_EQ(...) ([] { return false; })
#define DOCTEST_WARN_NE(...) (static_cast<void>(0)) #define DOCTEST_WARN_NE(...) ([] { return false; })
#define DOCTEST_CHECK_NE(...) (static_cast<void>(0)) #define DOCTEST_CHECK_NE(...) ([] { return false; })
#define DOCTEST_REQUIRE_NE(...) (static_cast<void>(0)) #define DOCTEST_REQUIRE_NE(...) ([] { return false; })
#define DOCTEST_WARN_GT(...) (static_cast<void>(0)) #define DOCTEST_WARN_GT(...) ([] { return false; })
#define DOCTEST_CHECK_GT(...) (static_cast<void>(0)) #define DOCTEST_CHECK_GT(...) ([] { return false; })
#define DOCTEST_REQUIRE_GT(...) (static_cast<void>(0)) #define DOCTEST_REQUIRE_GT(...) ([] { return false; })
#define DOCTEST_WARN_LT(...) (static_cast<void>(0)) #define DOCTEST_WARN_LT(...) ([] { return false; })
#define DOCTEST_CHECK_LT(...) (static_cast<void>(0)) #define DOCTEST_CHECK_LT(...) ([] { return false; })
#define DOCTEST_REQUIRE_LT(...) (static_cast<void>(0)) #define DOCTEST_REQUIRE_LT(...) ([] { return false; })
#define DOCTEST_WARN_GE(...) (static_cast<void>(0)) #define DOCTEST_WARN_GE(...) ([] { return false; })
#define DOCTEST_CHECK_GE(...) (static_cast<void>(0)) #define DOCTEST_CHECK_GE(...) ([] { return false; })
#define DOCTEST_REQUIRE_GE(...) (static_cast<void>(0)) #define DOCTEST_REQUIRE_GE(...) ([] { return false; })
#define DOCTEST_WARN_LE(...) (static_cast<void>(0)) #define DOCTEST_WARN_LE(...) ([] { return false; })
#define DOCTEST_CHECK_LE(...) (static_cast<void>(0)) #define DOCTEST_CHECK_LE(...) ([] { return false; })
#define DOCTEST_REQUIRE_LE(...) (static_cast<void>(0)) #define DOCTEST_REQUIRE_LE(...) ([] { return false; })
#define DOCTEST_WARN_UNARY(...) (static_cast<void>(0)) #define DOCTEST_WARN_UNARY(...) ([] { return false; })
#define DOCTEST_CHECK_UNARY(...) (static_cast<void>(0)) #define DOCTEST_CHECK_UNARY(...) ([] { return false; })
#define DOCTEST_REQUIRE_UNARY(...) (static_cast<void>(0)) #define DOCTEST_REQUIRE_UNARY(...) ([] { return false; })
#define DOCTEST_WARN_UNARY_FALSE(...) (static_cast<void>(0)) #define DOCTEST_WARN_UNARY_FALSE(...) ([] { return false; })
#define DOCTEST_CHECK_UNARY_FALSE(...) (static_cast<void>(0)) #define DOCTEST_CHECK_UNARY_FALSE(...) ([] { return false; })
#define DOCTEST_REQUIRE_UNARY_FALSE(...) (static_cast<void>(0)) #define DOCTEST_REQUIRE_UNARY_FALSE(...) ([] { return false; })
#endif // DOCTEST_CONFIG_DISABLE #endif // DOCTEST_CONFIG_DISABLE
...@@ -2806,6 +2841,8 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP ...@@ -2806,6 +2841,8 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP
DOCTEST_MSVC_SUPPRESS_WARNING_POP DOCTEST_MSVC_SUPPRESS_WARNING_POP
DOCTEST_GCC_SUPPRESS_WARNING_POP DOCTEST_GCC_SUPPRESS_WARNING_POP
DOCTEST_SUPPRESS_COMMON_WARNINGS_POP
#endif // DOCTEST_LIBRARY_INCLUDED #endif // DOCTEST_LIBRARY_INCLUDED
#ifndef DOCTEST_SINGLE_HEADER #ifndef DOCTEST_SINGLE_HEADER
...@@ -2825,13 +2862,11 @@ DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wunused-macros") ...@@ -2825,13 +2862,11 @@ DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wunused-macros")
DOCTEST_CLANG_SUPPRESS_WARNING_POP DOCTEST_CLANG_SUPPRESS_WARNING_POP
DOCTEST_SUPPRESS_COMMON_WARNINGS_PUSH
DOCTEST_CLANG_SUPPRESS_WARNING_PUSH DOCTEST_CLANG_SUPPRESS_WARNING_PUSH
DOCTEST_CLANG_SUPPRESS_WARNING("-Wunknown-pragmas")
DOCTEST_CLANG_SUPPRESS_WARNING("-Wpadded")
DOCTEST_CLANG_SUPPRESS_WARNING("-Wweak-vtables")
DOCTEST_CLANG_SUPPRESS_WARNING("-Wglobal-constructors") DOCTEST_CLANG_SUPPRESS_WARNING("-Wglobal-constructors")
DOCTEST_CLANG_SUPPRESS_WARNING("-Wexit-time-destructors") DOCTEST_CLANG_SUPPRESS_WARNING("-Wexit-time-destructors")
DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-prototypes")
DOCTEST_CLANG_SUPPRESS_WARNING("-Wsign-conversion") DOCTEST_CLANG_SUPPRESS_WARNING("-Wsign-conversion")
DOCTEST_CLANG_SUPPRESS_WARNING("-Wshorten-64-to-32") DOCTEST_CLANG_SUPPRESS_WARNING("-Wshorten-64-to-32")
DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-variable-declarations") DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-variable-declarations")
...@@ -2839,66 +2874,35 @@ DOCTEST_CLANG_SUPPRESS_WARNING("-Wswitch") ...@@ -2839,66 +2874,35 @@ DOCTEST_CLANG_SUPPRESS_WARNING("-Wswitch")
DOCTEST_CLANG_SUPPRESS_WARNING("-Wswitch-enum") DOCTEST_CLANG_SUPPRESS_WARNING("-Wswitch-enum")
DOCTEST_CLANG_SUPPRESS_WARNING("-Wcovered-switch-default") DOCTEST_CLANG_SUPPRESS_WARNING("-Wcovered-switch-default")
DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-noreturn") DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-noreturn")
DOCTEST_CLANG_SUPPRESS_WARNING("-Wunused-local-typedef")
DOCTEST_CLANG_SUPPRESS_WARNING("-Wdisabled-macro-expansion") DOCTEST_CLANG_SUPPRESS_WARNING("-Wdisabled-macro-expansion")
DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-braces") DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-braces")
DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-field-initializers") DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-field-initializers")
DOCTEST_CLANG_SUPPRESS_WARNING("-Wc++98-compat")
DOCTEST_CLANG_SUPPRESS_WARNING("-Wc++98-compat-pedantic")
DOCTEST_CLANG_SUPPRESS_WARNING("-Wunused-member-function") DOCTEST_CLANG_SUPPRESS_WARNING("-Wunused-member-function")
DOCTEST_CLANG_SUPPRESS_WARNING("-Wnonportable-system-include-path") DOCTEST_CLANG_SUPPRESS_WARNING("-Wnonportable-system-include-path")
DOCTEST_GCC_SUPPRESS_WARNING_PUSH DOCTEST_GCC_SUPPRESS_WARNING_PUSH
DOCTEST_GCC_SUPPRESS_WARNING("-Wunknown-pragmas")
DOCTEST_GCC_SUPPRESS_WARNING("-Wpragmas")
DOCTEST_GCC_SUPPRESS_WARNING("-Wconversion") DOCTEST_GCC_SUPPRESS_WARNING("-Wconversion")
DOCTEST_GCC_SUPPRESS_WARNING("-Weffc++")
DOCTEST_GCC_SUPPRESS_WARNING("-Wsign-conversion") DOCTEST_GCC_SUPPRESS_WARNING("-Wsign-conversion")
DOCTEST_GCC_SUPPRESS_WARNING("-Wstrict-overflow")
DOCTEST_GCC_SUPPRESS_WARNING("-Wstrict-aliasing")
DOCTEST_GCC_SUPPRESS_WARNING("-Wmissing-field-initializers") DOCTEST_GCC_SUPPRESS_WARNING("-Wmissing-field-initializers")
DOCTEST_GCC_SUPPRESS_WARNING("-Wmissing-braces") DOCTEST_GCC_SUPPRESS_WARNING("-Wmissing-braces")
DOCTEST_GCC_SUPPRESS_WARNING("-Wmissing-declarations")
DOCTEST_GCC_SUPPRESS_WARNING("-Wswitch") DOCTEST_GCC_SUPPRESS_WARNING("-Wswitch")
DOCTEST_GCC_SUPPRESS_WARNING("-Wswitch-enum") DOCTEST_GCC_SUPPRESS_WARNING("-Wswitch-enum")
DOCTEST_GCC_SUPPRESS_WARNING("-Wswitch-default") DOCTEST_GCC_SUPPRESS_WARNING("-Wswitch-default")
DOCTEST_GCC_SUPPRESS_WARNING("-Wunsafe-loop-optimizations") DOCTEST_GCC_SUPPRESS_WARNING("-Wunsafe-loop-optimizations")
DOCTEST_GCC_SUPPRESS_WARNING("-Wold-style-cast") DOCTEST_GCC_SUPPRESS_WARNING("-Wold-style-cast")
DOCTEST_GCC_SUPPRESS_WARNING("-Wunused-local-typedefs")
DOCTEST_GCC_SUPPRESS_WARNING("-Wuseless-cast")
DOCTEST_GCC_SUPPRESS_WARNING("-Wunused-function") DOCTEST_GCC_SUPPRESS_WARNING("-Wunused-function")
DOCTEST_GCC_SUPPRESS_WARNING("-Wmultiple-inheritance") DOCTEST_GCC_SUPPRESS_WARNING("-Wmultiple-inheritance")
DOCTEST_GCC_SUPPRESS_WARNING("-Wnoexcept")
DOCTEST_GCC_SUPPRESS_WARNING("-Wsuggest-attribute") DOCTEST_GCC_SUPPRESS_WARNING("-Wsuggest-attribute")
DOCTEST_MSVC_SUPPRESS_WARNING_PUSH DOCTEST_MSVC_SUPPRESS_WARNING_PUSH
DOCTEST_MSVC_SUPPRESS_WARNING(4616) // invalid compiler warning
DOCTEST_MSVC_SUPPRESS_WARNING(4619) // invalid compiler warning
DOCTEST_MSVC_SUPPRESS_WARNING(4996) // The compiler encountered a deprecated declaration
DOCTEST_MSVC_SUPPRESS_WARNING(4267) // 'var' : conversion from 'x' to 'y', possible loss of data DOCTEST_MSVC_SUPPRESS_WARNING(4267) // 'var' : conversion from 'x' to 'y', possible loss of data
DOCTEST_MSVC_SUPPRESS_WARNING(4706) // assignment within conditional expression
DOCTEST_MSVC_SUPPRESS_WARNING(4512) // 'class' : assignment operator could not be generated
DOCTEST_MSVC_SUPPRESS_WARNING(4127) // conditional expression is constant
DOCTEST_MSVC_SUPPRESS_WARNING(4530) // C++ exception handler used, but unwind semantics not enabled DOCTEST_MSVC_SUPPRESS_WARNING(4530) // C++ exception handler used, but unwind semantics not enabled
DOCTEST_MSVC_SUPPRESS_WARNING(4577) // 'noexcept' used with no exception handling mode specified DOCTEST_MSVC_SUPPRESS_WARNING(4577) // 'noexcept' used with no exception handling mode specified
DOCTEST_MSVC_SUPPRESS_WARNING(4774) // format string expected in argument is not a string literal DOCTEST_MSVC_SUPPRESS_WARNING(4774) // format string expected in argument is not a string literal
DOCTEST_MSVC_SUPPRESS_WARNING(4365) // conversion from 'int' to 'unsigned', signed/unsigned mismatch DOCTEST_MSVC_SUPPRESS_WARNING(4365) // conversion from 'int' to 'unsigned', signed/unsigned mismatch
DOCTEST_MSVC_SUPPRESS_WARNING(4820) // padding in structs
DOCTEST_MSVC_SUPPRESS_WARNING(4640) // construction of local static object is not thread-safe
DOCTEST_MSVC_SUPPRESS_WARNING(5039) // pointer to potentially throwing function passed to extern C DOCTEST_MSVC_SUPPRESS_WARNING(5039) // pointer to potentially throwing function passed to extern C
DOCTEST_MSVC_SUPPRESS_WARNING(5045) // Spectre mitigation stuff
DOCTEST_MSVC_SUPPRESS_WARNING(4626) // assignment operator was implicitly defined as deleted
DOCTEST_MSVC_SUPPRESS_WARNING(5027) // move assignment operator was implicitly defined as deleted
DOCTEST_MSVC_SUPPRESS_WARNING(5026) // move constructor was implicitly defined as deleted
DOCTEST_MSVC_SUPPRESS_WARNING(4625) // copy constructor was implicitly defined as deleted
DOCTEST_MSVC_SUPPRESS_WARNING(4800) // forcing value to bool 'true' or 'false' (performance warning) DOCTEST_MSVC_SUPPRESS_WARNING(4800) // forcing value to bool 'true' or 'false' (performance warning)
DOCTEST_MSVC_SUPPRESS_WARNING(5245) // unreferenced function with internal linkage has been removed DOCTEST_MSVC_SUPPRESS_WARNING(5245) // unreferenced function with internal linkage has been removed
// static analysis
DOCTEST_MSVC_SUPPRESS_WARNING(26439) // This kind of function may not throw. Declare it 'noexcept'
DOCTEST_MSVC_SUPPRESS_WARNING(26495) // Always initialize a member variable
DOCTEST_MSVC_SUPPRESS_WARNING(26451) // Arithmetic overflow ...
DOCTEST_MSVC_SUPPRESS_WARNING(26444) // Avoid unnamed objects with custom construction and dtor...
DOCTEST_MSVC_SUPPRESS_WARNING(26812) // Prefer 'enum class' over 'enum'
DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN
...@@ -2906,7 +2910,7 @@ DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN ...@@ -2906,7 +2910,7 @@ DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN
#include <ctime> #include <ctime>
#include <cmath> #include <cmath>
#include <climits> #include <climits>
// borland (Embarcadero) compiler requires math.h and not cmath - https://github.com/onqtam/doctest/pull/37 // borland (Embarcadero) compiler requires math.h and not cmath - https://github.com/doctest/doctest/pull/37
#ifdef __BORLANDC__ #ifdef __BORLANDC__
#include <math.h> #include <math.h>
#endif // __BORLANDC__ #endif // __BORLANDC__
...@@ -2964,7 +2968,7 @@ DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN ...@@ -2964,7 +2968,7 @@ DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN
#endif // DOCTEST_PLATFORM_WINDOWS #endif // DOCTEST_PLATFORM_WINDOWS
// this is a fix for https://github.com/onqtam/doctest/issues/348 // this is a fix for https://github.com/doctest/doctest/issues/348
// https://mail.gnome.org/archives/xml/2012-January/msg00000.html // https://mail.gnome.org/archives/xml/2012-January/msg00000.html
#if !defined(HAVE_UNISTD_H) && !defined(STDOUT_FILENO) #if !defined(HAVE_UNISTD_H) && !defined(STDOUT_FILENO)
#define STDOUT_FILENO fileno(stdout) #define STDOUT_FILENO fileno(stdout)
...@@ -3021,6 +3025,24 @@ bool is_running_in_test = false; ...@@ -3021,6 +3025,24 @@ bool is_running_in_test = false;
namespace { namespace {
using namespace detail; using namespace detail;
template <typename Ex>
DOCTEST_NORETURN void throw_exception(Ex const& e) {
#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
throw e;
#else // DOCTEST_CONFIG_NO_EXCEPTIONS
std::cerr << "doctest will terminate because it needed to throw an exception.\n"
<< "The message was: " << e.what() << '\n';
std::terminate();
#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
}
#ifndef DOCTEST_INTERNAL_ERROR
#define DOCTEST_INTERNAL_ERROR(msg) \
throw_exception(std::logic_error( \
__FILE__ ":" DOCTEST_TOSTR(__LINE__) ": Internal doctest error: " msg))
#endif // DOCTEST_INTERNAL_ERROR
// case insensitive strcmp // case insensitive strcmp
int stricmp(const char* a, const char* b) { int stricmp(const char* a, const char* b) {
for(;; a++, b++) { for(;; a++, b++) {
...@@ -3064,8 +3086,6 @@ namespace { ...@@ -3064,8 +3086,6 @@ namespace {
} // namespace } // namespace
namespace detail { namespace detail {
void my_memcpy(void* dest, const void* src, unsigned num) { memcpy(dest, src, num); }
String rawMemoryToString(const void* object, unsigned size) { String rawMemoryToString(const void* object, unsigned size) {
// Reverse order for little endian architectures // Reverse order for little endian architectures
int i = 0, end = static_cast<int>(size), inc = 1; int i = 0, end = static_cast<int>(size), inc = 1;
...@@ -3075,28 +3095,42 @@ namespace detail { ...@@ -3075,28 +3095,42 @@ namespace detail {
} }
unsigned const char* bytes = static_cast<unsigned const char*>(object); unsigned const char* bytes = static_cast<unsigned const char*>(object);
std::ostringstream oss; std::ostream* oss = tlssPush();
oss << "0x" << std::setfill('0') << std::hex; *oss << "0x" << std::setfill('0') << std::hex;
for(; i != end; i += inc) for(; i != end; i += inc)
oss << std::setw(2) << static_cast<unsigned>(bytes[i]); *oss << std::setw(2) << static_cast<unsigned>(bytes[i]);
return oss.str().c_str(); return tlssPop();
}
DOCTEST_THREAD_LOCAL class
{
std::vector<std::streampos> stack;
std::stringstream ss;
public:
std::ostream* push() {
stack.push_back(ss.tellp());
return &ss;
} }
DOCTEST_THREAD_LOCAL std::ostringstream g_oss; // NOLINT(cert-err58-cpp) String pop() {
if (stack.empty())
DOCTEST_INTERNAL_ERROR("TLSS was empty when trying to pop!");
//reset default value is true. getTlsOss(bool reset=true); std::streampos pos = stack.back();
std::ostream* getTlsOss(bool reset) { stack.pop_back();
if(reset) { unsigned sz = static_cast<unsigned>(ss.tellp() - pos);
g_oss.clear(); // there shouldn't be anything worth clearing in the flags ss.rdbuf()->pubseekpos(pos, std::ios::in | std::ios::out);
g_oss.str(""); // the slow way of resetting a string stream return String(ss, sz);
//g_oss.seekp(0); // optimal reset - as seen here: https://stackoverflow.com/a/624291/3162383
} }
return &g_oss; } g_oss;
std::ostream* tlssPush() {
return g_oss.push();
} }
String getTlsOssResult() { String tlssPop() {
//g_oss << std::ends; // needed - as shown here: https://stackoverflow.com/a/624291/3162383 return g_oss.pop();
return g_oss.str().c_str();
} }
#ifndef DOCTEST_CONFIG_DISABLE #ifndef DOCTEST_CONFIG_DISABLE
...@@ -3107,8 +3141,7 @@ namespace timer_large_integer ...@@ -3107,8 +3141,7 @@ namespace timer_large_integer
#if defined(DOCTEST_PLATFORM_WINDOWS) #if defined(DOCTEST_PLATFORM_WINDOWS)
typedef ULONGLONG type; typedef ULONGLONG type;
#else // DOCTEST_PLATFORM_WINDOWS #else // DOCTEST_PLATFORM_WINDOWS
using namespace std; typedef std::uint64_t type;
typedef uint64_t type;
#endif // DOCTEST_PLATFORM_WINDOWS #endif // DOCTEST_PLATFORM_WINDOWS
} }
...@@ -3326,19 +3359,29 @@ typedef timer_large_integer::type ticks_t; ...@@ -3326,19 +3359,29 @@ typedef timer_large_integer::type ticks_t;
#endif // DOCTEST_CONFIG_DISABLE #endif // DOCTEST_CONFIG_DISABLE
} // namespace detail } // namespace detail
char* String::allocate(unsigned sz) {
if (sz <= last) {
buf[sz] = '\0';
setLast(last - sz);
return buf;
} else {
setOnHeap();
data.size = sz;
data.capacity = data.size + 1;
data.ptr = new char[data.capacity];
data.ptr[sz] = '\0';
return data.ptr;
}
}
void String::setOnHeap() { *reinterpret_cast<unsigned char*>(&buf[last]) = 128; } void String::setOnHeap() { *reinterpret_cast<unsigned char*>(&buf[last]) = 128; }
void String::setLast(unsigned in) { buf[last] = char(in); } void String::setLast(unsigned in) { buf[last] = char(in); }
void String::copy(const String& other) { void String::copy(const String& other) {
using namespace std;
if(other.isOnStack()) { if(other.isOnStack()) {
memcpy(buf, other.buf, len); memcpy(buf, other.buf, len);
} else { } else {
setOnHeap(); memcpy(allocate(other.data.size), other.data.ptr, other.data.size);
data.size = other.data.size;
data.capacity = data.size + 1;
data.ptr = new char[data.capacity];
memcpy(data.ptr, other.data.ptr, data.size + 1);
} }
} }
...@@ -3357,19 +3400,11 @@ String::String(const char* in) ...@@ -3357,19 +3400,11 @@ String::String(const char* in)
: String(in, strlen(in)) {} : String(in, strlen(in)) {}
String::String(const char* in, unsigned in_size) { String::String(const char* in, unsigned in_size) {
using namespace std; memcpy(allocate(in_size), in, in_size);
if(in_size <= last) { }
memcpy(buf, in, in_size);
buf[in_size] = '\0'; String::String(std::istream& in, unsigned in_size) {
setLast(last - in_size); in.read(allocate(in_size), in_size);
} else {
setOnHeap();
data.size = in_size;
data.capacity = data.size + 1;
data.ptr = new char[data.capacity];
memcpy(data.ptr, in, in_size);
data.ptr[in_size] = '\0';
}
} }
String::String(const String& other) { copy(other); } String::String(const String& other) { copy(other); }
...@@ -3389,7 +3424,6 @@ String& String::operator+=(const String& other) { ...@@ -3389,7 +3424,6 @@ String& String::operator+=(const String& other) {
const unsigned my_old_size = size(); const unsigned my_old_size = size();
const unsigned other_size = other.size(); const unsigned other_size = other.size();
const unsigned total_size = my_old_size + other_size; const unsigned total_size = my_old_size + other_size;
using namespace std;
if(isOnStack()) { if(isOnStack()) {
if(total_size < len) { if(total_size < len) {
// append to the current stack space // append to the current stack space
...@@ -3437,14 +3471,12 @@ String& String::operator+=(const String& other) { ...@@ -3437,14 +3471,12 @@ String& String::operator+=(const String& other) {
} }
String::String(String&& other) { String::String(String&& other) {
using namespace std;
memcpy(buf, other.buf, len); memcpy(buf, other.buf, len);
other.buf[0] = '\0'; other.buf[0] = '\0';
other.setLast(); other.setLast();
} }
String& String::operator=(String&& other) { String& String::operator=(String&& other) {
using namespace std;
if(this != &other) { if(this != &other) {
if(!isOnStack()) if(!isOnStack())
delete[] data.ptr; delete[] data.ptr;
...@@ -3650,7 +3682,7 @@ DOCTEST_TO_STRING_OVERLOAD(int long long unsigned, "%llu") ...@@ -3650,7 +3682,7 @@ DOCTEST_TO_STRING_OVERLOAD(int long long unsigned, "%llu")
String toString(std::nullptr_t) { return "NULL"; } String toString(std::nullptr_t) { return "NULL"; }
#if DOCTEST_MSVC >= DOCTEST_COMPILER(19, 20, 0) #if DOCTEST_MSVC >= DOCTEST_COMPILER(19, 20, 0)
// see this issue on why this is needed: https://github.com/onqtam/doctest/issues/183 // see this issue on why this is needed: https://github.com/doctest/doctest/issues/183
String toString(const std::string& in) { return in.c_str(); } String toString(const std::string& in) { return in.c_str(); }
#endif // VS 2019 #endif // VS 2019
...@@ -4031,29 +4063,6 @@ namespace { ...@@ -4031,29 +4063,6 @@ namespace {
return suiteOrderComparator(lhs, rhs); return suiteOrderComparator(lhs, rhs);
} }
#ifdef DOCTEST_CONFIG_COLORS_WINDOWS
HANDLE g_stdoutHandle;
WORD g_origFgAttrs;
WORD g_origBgAttrs;
bool g_attrsInited = false;
int colors_init() {
if(!g_attrsInited) {
g_stdoutHandle = GetStdHandle(STD_OUTPUT_HANDLE);
g_attrsInited = true;
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
GetConsoleScreenBufferInfo(g_stdoutHandle, &csbiInfo);
g_origFgAttrs = csbiInfo.wAttributes & ~(BACKGROUND_GREEN | BACKGROUND_RED |
BACKGROUND_BLUE | BACKGROUND_INTENSITY);
g_origBgAttrs = csbiInfo.wAttributes & ~(FOREGROUND_GREEN | FOREGROUND_RED |
FOREGROUND_BLUE | FOREGROUND_INTENSITY);
}
return 0;
}
int dummy_init_console_colors = colors_init();
#endif // DOCTEST_CONFIG_COLORS_WINDOWS
DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wdeprecated-declarations") DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wdeprecated-declarations")
void color_to_stream(std::ostream& s, Color::Enum code) { void color_to_stream(std::ostream& s, Color::Enum code) {
static_cast<void>(s); // for DOCTEST_CONFIG_COLORS_NONE or DOCTEST_CONFIG_COLORS_WINDOWS static_cast<void>(s); // for DOCTEST_CONFIG_COLORS_NONE or DOCTEST_CONFIG_COLORS_WINDOWS
...@@ -4090,7 +4099,23 @@ namespace { ...@@ -4090,7 +4099,23 @@ namespace {
(_isatty(_fileno(stdout)) == false && getContextOptions()->force_colors == false)) (_isatty(_fileno(stdout)) == false && getContextOptions()->force_colors == false))
return; return;
#define DOCTEST_SET_ATTR(x) SetConsoleTextAttribute(g_stdoutHandle, x | g_origBgAttrs) static struct ConsoleHelper {
HANDLE stdoutHandle;
WORD origFgAttrs;
WORD origBgAttrs;
ConsoleHelper() {
stdoutHandle = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
GetConsoleScreenBufferInfo(stdoutHandle, &csbiInfo);
origFgAttrs = csbiInfo.wAttributes & ~(BACKGROUND_GREEN | BACKGROUND_RED |
BACKGROUND_BLUE | BACKGROUND_INTENSITY);
origBgAttrs = csbiInfo.wAttributes & ~(FOREGROUND_GREEN | FOREGROUND_RED |
FOREGROUND_BLUE | FOREGROUND_INTENSITY);
}
} ch;
#define DOCTEST_SET_ATTR(x) SetConsoleTextAttribute(ch.stdoutHandle, x | ch.origBgAttrs)
// clang-format off // clang-format off
switch (code) { switch (code) {
...@@ -4107,7 +4132,7 @@ namespace { ...@@ -4107,7 +4132,7 @@ namespace {
case Color::BrightWhite: DOCTEST_SET_ATTR(FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE); break; case Color::BrightWhite: DOCTEST_SET_ATTR(FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE); break;
case Color::None: case Color::None:
case Color::Bright: // invalid case Color::Bright: // invalid
default: DOCTEST_SET_ATTR(g_origFgAttrs); default: DOCTEST_SET_ATTR(ch.origFgAttrs);
} }
// clang-format on // clang-format on
#endif // DOCTEST_CONFIG_COLORS_WINDOWS #endif // DOCTEST_CONFIG_COLORS_WINDOWS
...@@ -4640,7 +4665,7 @@ namespace detail { ...@@ -4640,7 +4665,7 @@ namespace detail {
std::abort(); std::abort();
} }
void decomp_assert(assertType::Enum at, const char* file, int line, const char* expr, bool decomp_assert(assertType::Enum at, const char* file, int line, const char* expr,
Result result) { Result result) {
bool failed = !result.m_passed; bool failed = !result.m_passed;
...@@ -4651,20 +4676,30 @@ namespace detail { ...@@ -4651,20 +4676,30 @@ namespace detail {
DOCTEST_ASSERT_OUT_OF_TESTS(result.m_decomp); DOCTEST_ASSERT_OUT_OF_TESTS(result.m_decomp);
DOCTEST_ASSERT_IN_TESTS(result.m_decomp); DOCTEST_ASSERT_IN_TESTS(result.m_decomp);
// NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks) // NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks)
return !failed;
} }
MessageBuilder::MessageBuilder(const char* file, int line, assertType::Enum severity) { MessageBuilder::MessageBuilder(const char* file, int line, assertType::Enum severity) {
m_stream = getTlsOss(); m_stream = tlssPush();
m_file = file; m_file = file;
m_line = line; m_line = line;
m_severity = severity; m_severity = severity;
} }
MessageBuilder::~MessageBuilder() {
if (!logged)
tlssPop();
}
IExceptionTranslator::IExceptionTranslator() = default; IExceptionTranslator::IExceptionTranslator() = default;
IExceptionTranslator::~IExceptionTranslator() = default; IExceptionTranslator::~IExceptionTranslator() = default;
bool MessageBuilder::log() { bool MessageBuilder::log() {
m_string = getTlsOssResult(); if (!logged) {
m_string = tlssPop();
logged = true;
}
DOCTEST_ITERATE_THROUGH_REPORTERS(log_message, *this); DOCTEST_ITERATE_THROUGH_REPORTERS(log_message, *this);
const bool isWarn = m_severity & assertType::is_warn; const bool isWarn = m_severity & assertType::is_warn;
...@@ -4683,29 +4718,10 @@ namespace detail { ...@@ -4683,29 +4718,10 @@ namespace detail {
if(m_severity & assertType::is_require) //!OCLINT bitwise operator in conditional if(m_severity & assertType::is_require) //!OCLINT bitwise operator in conditional
throwException(); throwException();
} }
MessageBuilder::~MessageBuilder() = default;
} // namespace detail } // namespace detail
namespace { namespace {
using namespace detail; using namespace detail;
template <typename Ex>
DOCTEST_NORETURN void throw_exception(Ex const& e) {
#ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
throw e;
#else // DOCTEST_CONFIG_NO_EXCEPTIONS
std::cerr << "doctest will terminate because it needed to throw an exception.\n"
<< "The message was: " << e.what() << '\n';
std::terminate();
#endif // DOCTEST_CONFIG_NO_EXCEPTIONS
}
#ifndef DOCTEST_INTERNAL_ERROR
#define DOCTEST_INTERNAL_ERROR(msg) \
throw_exception(std::logic_error( \
__FILE__ ":" DOCTEST_TOSTR(__LINE__) ": Internal doctest error: " msg))
#endif // DOCTEST_INTERNAL_ERROR
// clang-format off // clang-format off
// ================================================================================================= // =================================================================================================
...@@ -6701,13 +6717,6 @@ DOCTEST_MSVC_SUPPRESS_WARNING_POP ...@@ -6701,13 +6717,6 @@ DOCTEST_MSVC_SUPPRESS_WARNING_POP
DOCTEST_ITERATE_THROUGH_REPORTERS(report_query, qdata); DOCTEST_ITERATE_THROUGH_REPORTERS(report_query, qdata);
} }
// see these issues on the reasoning for this:
// - https://github.com/onqtam/doctest/issues/143#issuecomment-414418903
// - https://github.com/onqtam/doctest/issues/126
auto DOCTEST_FIX_FOR_MACOS_LIBCPP_IOSFWD_STRING_LINK_ERRORS = []() DOCTEST_NOINLINE
{ std::cout << std::string(); };
DOCTEST_FIX_FOR_MACOS_LIBCPP_IOSFWD_STRING_LINK_ERRORS();
return cleanup_and_return(); return cleanup_and_return();
} }
...@@ -6746,5 +6755,7 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP ...@@ -6746,5 +6755,7 @@ DOCTEST_CLANG_SUPPRESS_WARNING_POP
DOCTEST_MSVC_SUPPRESS_WARNING_POP DOCTEST_MSVC_SUPPRESS_WARNING_POP
DOCTEST_GCC_SUPPRESS_WARNING_POP DOCTEST_GCC_SUPPRESS_WARNING_POP
DOCTEST_SUPPRESS_COMMON_WARNINGS_POP
#endif // DOCTEST_LIBRARY_IMPLEMENTATION #endif // DOCTEST_LIBRARY_IMPLEMENTATION
#endif // DOCTEST_CONFIG_IMPLEMENT #endif // DOCTEST_CONFIG_IMPLEMENT
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment