forked from catchorg/Catch2
Compare commits
17 Commits
devel-pipe
...
devel-unre
Author | SHA1 | Date | |
---|---|---|---|
|
6146a104b8 | ||
|
506276c592 | ||
|
f5cee49c71 | ||
|
7bbd4b9075 | ||
|
119a7bbe53 | ||
|
9c5a4cf44e | ||
|
e260288807 | ||
|
7c2e1fb1b2 | ||
|
a6ee7e20cd | ||
|
0b2af56271 | ||
|
69d62abc9a | ||
|
1e0ccb1b21 | ||
|
5ad66ada7b | ||
|
fa43b77429 | ||
|
79f2d66ea3 | ||
|
e200443b84 | ||
|
ce22c0fe8a |
@@ -34,7 +34,7 @@ Checks: >-
|
||||
-modernize-pass-by-value,
|
||||
|
||||
performance-*,
|
||||
-performance-enum-size,
|
||||
performance-enum-size,
|
||||
|
||||
portability-*,
|
||||
|
||||
@@ -49,6 +49,7 @@ Checks: >-
|
||||
-readability-implicit-bool-conversion,
|
||||
-readability-isolate-declaration,
|
||||
-readability-magic-numbers,
|
||||
-readability-math-missing-parentheses, #no, 'a + B * C' obeying math rules is not confusing,
|
||||
-readability-named-parameter,
|
||||
-readability-qualified-auto,
|
||||
-readability-redundant-access-specifiers,
|
||||
|
2
.github/workflows/mac-builds-m1.yml
vendored
2
.github/workflows/mac-builds-m1.yml
vendored
@@ -1,4 +1,4 @@
|
||||
name: M1 Mac builds
|
||||
name: Arm Mac builds
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
|
8
.github/workflows/mac-builds.yml
vendored
8
.github/workflows/mac-builds.yml
vendored
@@ -1,10 +1,14 @@
|
||||
name: Mac builds
|
||||
name: Intel Mac builds
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: macos-12
|
||||
# From macos-14 forward, the baseline "macos-X" image is Arm based,
|
||||
# and not Intel based. Thus this is the newest image we can use for
|
||||
# Intel MacOS CI, and there don't seem to be any plans to keep providing
|
||||
# the Intel based images for free to OSS projects.
|
||||
runs-on: macos-13
|
||||
strategy:
|
||||
matrix:
|
||||
cxx:
|
||||
|
@@ -56,6 +56,8 @@ expand_template(
|
||||
"#cmakedefine CATCH_CONFIG_WCHAR": "",
|
||||
"#cmakedefine CATCH_CONFIG_WINDOWS_CRTDBG": "",
|
||||
"#cmakedefine CATCH_CONFIG_WINDOWS_SEH": "",
|
||||
"#cmakedefine CATCH_CONFIG_USE_BUILTIN_CONSTANT_P": "",
|
||||
"#cmakedefine CATCH_CONFIG_NO_USE_BUILTIN_CONSTANT_P": "",
|
||||
},
|
||||
template = "src/catch2/catch_user_config.hpp.in",
|
||||
)
|
||||
|
@@ -44,6 +44,7 @@ set(_OverridableOptions
|
||||
"WINDOWS_SEH"
|
||||
"GETENV"
|
||||
"EXPERIMENTAL_STATIC_ANALYSIS_SUPPORT"
|
||||
"USE_BUILTIN_CONSTANT_P"
|
||||
)
|
||||
|
||||
foreach(OptionName ${_OverridableOptions})
|
||||
|
@@ -8,6 +8,8 @@ else()
|
||||
set(NOT_SUBPROJECT OFF)
|
||||
endif()
|
||||
|
||||
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||
|
||||
option(CATCH_INSTALL_DOCS "Install documentation alongside library" ON)
|
||||
option(CATCH_INSTALL_EXTRAS "Install extras (CMake scripts, debugger helpers) alongside library" ON)
|
||||
option(CATCH_DEVELOPMENT_BUILD "Build tests, enable warnings, enable Werror, etc" OFF)
|
||||
@@ -33,7 +35,7 @@ if (CMAKE_BINARY_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
||||
endif()
|
||||
|
||||
project(Catch2
|
||||
VERSION 3.7.0 # CML version placeholder, don't delete
|
||||
VERSION 3.7.1 # CML version placeholder, don't delete
|
||||
LANGUAGES CXX
|
||||
# HOMEPAGE_URL is not supported until CMake version 3.12, which
|
||||
# we do not target yet.
|
||||
@@ -41,7 +43,6 @@ project(Catch2
|
||||
DESCRIPTION "A modern, C++-native, unit test framework."
|
||||
)
|
||||
|
||||
|
||||
# Provide path for scripts. We first add path to the scripts we don't use,
|
||||
# but projects including us might, and set the path up to parent scope.
|
||||
# Then we also add path that we use to configure the project, but is of
|
||||
@@ -86,18 +87,22 @@ if (BUILD_TESTING AND CATCH_BUILD_TESTING AND NOT_SUBPROJECT)
|
||||
if (NOT PYTHONINTERP_FOUND)
|
||||
message(FATAL_ERROR "Python not found, but required for tests")
|
||||
endif()
|
||||
set(CMAKE_FOLDER "tests")
|
||||
add_subdirectory(tests)
|
||||
endif()
|
||||
|
||||
if(CATCH_BUILD_EXAMPLES)
|
||||
set(CMAKE_FOLDER "Examples")
|
||||
add_subdirectory(examples)
|
||||
endif()
|
||||
|
||||
if(CATCH_BUILD_EXTRA_TESTS)
|
||||
set(CMAKE_FOLDER "tests/ExtraTests")
|
||||
add_subdirectory(tests/ExtraTests)
|
||||
endif()
|
||||
|
||||
if(CATCH_BUILD_FUZZERS)
|
||||
set(CMAKE_FOLDER "fuzzing")
|
||||
add_subdirectory(fuzzing)
|
||||
endif()
|
||||
|
||||
|
@@ -158,11 +158,14 @@ by using `_NO_` in the macro, e.g. `CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS`.
|
||||
CATCH_CONFIG_ANDROID_LOGWRITE // Use android's logging system for debug output
|
||||
CATCH_CONFIG_GLOBAL_NEXTAFTER // Use nextafter{,f,l} instead of std::nextafter
|
||||
CATCH_CONFIG_GETENV // System has a working `getenv`
|
||||
CATCH_CONFIG_USE_BUILTIN_CONSTANT_P // Use __builtin_constant_p to trigger warnings
|
||||
|
||||
> [`CATCH_CONFIG_ANDROID_LOGWRITE`](https://github.com/catchorg/Catch2/issues/1743) and [`CATCH_CONFIG_GLOBAL_NEXTAFTER`](https://github.com/catchorg/Catch2/pull/1739) were introduced in Catch2 2.10.0
|
||||
|
||||
> `CATCH_CONFIG_GETENV` was [introduced](https://github.com/catchorg/Catch2/pull/2562) in Catch2 3.2.0
|
||||
|
||||
> `CATCH_CONFIG_USE_BUILTIN_CONSTANT_P` was introduced in Catch2 vX.Y.Z
|
||||
|
||||
Currently Catch enables `CATCH_CONFIG_WINDOWS_SEH` only when compiled with MSVC, because some versions of MinGW do not have the necessary Win32 API support.
|
||||
|
||||
`CATCH_CONFIG_POSIX_SIGNALS` is on by default, except when Catch is compiled under `Cygwin`, where it is disabled by default (but can be force-enabled by defining `CATCH_CONFIG_POSIX_SIGNALS`).
|
||||
@@ -183,6 +186,12 @@ With the exception of `CATCH_CONFIG_EXPERIMENTAL_REDIRECT`,
|
||||
these toggles can be disabled by using `_NO_` form of the toggle,
|
||||
e.g. `CATCH_CONFIG_NO_WINDOWS_SEH`.
|
||||
|
||||
`CATCH_CONFIG_USE_BUILTIN_CONSTANT_P` is ON by default for Clang and GCC
|
||||
(but as far as possible, not for other compilers masquerading for these
|
||||
two). However, it can cause bugs where the enclosed code is evaluated, even
|
||||
though it should not be, e.g. in [#2925](https://github.com/catchorg/Catch2/issues/2925).
|
||||
|
||||
|
||||
### `CATCH_CONFIG_FAST_COMPILE`
|
||||
This compile-time flag speeds up compilation of assertion macros by ~20%,
|
||||
by disabling the generation of assertion-local try-catch blocks for
|
||||
|
@@ -2,6 +2,7 @@
|
||||
|
||||
# Release notes
|
||||
**Contents**<br>
|
||||
[3.7.1](#371)<br>
|
||||
[3.7.0](#370)<br>
|
||||
[3.6.0](#360)<br>
|
||||
[3.5.4](#354)<br>
|
||||
@@ -64,6 +65,26 @@
|
||||
[Even Older versions](#even-older-versions)<br>
|
||||
|
||||
|
||||
## 3.7.1
|
||||
|
||||
### Improvements
|
||||
* Applied the JUnit reporter's optimization from last release to the SonarQube reporter
|
||||
* Suppressed `-Wuseless-cast` in `CHECK_THROWS_MATCHES` (#2904)
|
||||
* Standardize exit codes for various failures
|
||||
* Running no tests is now guaranteed to exit with 2 (without the `--allow-running-no-tests` flag)
|
||||
* All tests skipped is now always 4 (...)
|
||||
* Assertion failures are now always 42
|
||||
* and so on
|
||||
|
||||
### Fixes
|
||||
* Fixed out-of-bounds access when the arg parser encounters single `-` as an argument (#2905)
|
||||
|
||||
### Miscellaneous
|
||||
* Added `catch_config_prefix_messages.hpp` to meson build (#2903)
|
||||
* `catch_discover_tests` now supports skipped tests (#2873)
|
||||
* You can get the old behaviour by calling `catch_discover_tests` with `SKIP_IS_FAILURE` option.
|
||||
|
||||
|
||||
## 3.7.0
|
||||
|
||||
### Improvements
|
||||
|
@@ -75,7 +75,7 @@ CATCH_TRANSLATE_EXCEPTION( MyType const& ex ) {
|
||||
|
||||
Enums that already have a `<<` overload for `std::ostream` will convert to strings as expected.
|
||||
If you only need to convert enums to strings for test reporting purposes you can provide a `StringMaker` specialisations as any other type.
|
||||
However, as a convenience, Catch provides the `REGISTER_ENUM` helper macro that will generate the `StringMaker` specialisation for you with minimal code.
|
||||
However, as a convenience, Catch provides the `CATCH_REGISTER_ENUM` helper macro that will generate the `StringMaker` specialisation for you with minimal code.
|
||||
Simply provide it the (qualified) enum name, followed by all the enum values, and you're done!
|
||||
|
||||
E.g.
|
||||
|
@@ -38,6 +38,7 @@ same as the Catch name; see also ``TEST_PREFIX`` and ``TEST_SUFFIX``.
|
||||
[OUTPUT_PREFIX prefix]
|
||||
[OUTPUT_SUFFIX suffix]
|
||||
[DISCOVERY_MODE <POST_BUILD|PRE_TEST>]
|
||||
[SKIP_IS_FAILURE]
|
||||
)
|
||||
|
||||
``catch_discover_tests`` sets up a post-build command on the test executable
|
||||
@@ -131,7 +132,7 @@ same as the Catch name; see also ``TEST_PREFIX`` and ``TEST_SUFFIX``.
|
||||
of test cases from the test executable and when the tests are executed themselves.
|
||||
This requires cmake/ctest >= 3.22.
|
||||
|
||||
`DISCOVERY_MODE mode``
|
||||
``DISCOVERY_MODE mode``
|
||||
Provides control over when ``catch_discover_tests`` performs test discovery.
|
||||
By default, ``POST_BUILD`` sets up a post-build command to perform test discovery
|
||||
at build time. In certain scenarios, like cross-compiling, this ``POST_BUILD``
|
||||
@@ -143,6 +144,9 @@ same as the Catch name; see also ``TEST_PREFIX`` and ``TEST_SUFFIX``.
|
||||
``CMAKE_CATCH_DISCOVER_TESTS_DISCOVERY_MODE`` variable if it is not passed when
|
||||
calling ``catch_discover_tests``. This provides a mechanism for globally selecting
|
||||
a preferred test discovery behavior without having to modify each call site.
|
||||
|
||||
``SKIP_IS_FAILURE``
|
||||
Disables skipped test detection.
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
@@ -151,7 +155,7 @@ function(catch_discover_tests TARGET)
|
||||
|
||||
cmake_parse_arguments(
|
||||
""
|
||||
""
|
||||
"SKIP_IS_FAILURE"
|
||||
"TEST_PREFIX;TEST_SUFFIX;WORKING_DIRECTORY;TEST_LIST;REPORTER;OUTPUT_DIR;OUTPUT_PREFIX;OUTPUT_SUFFIX;DISCOVERY_MODE"
|
||||
"TEST_SPEC;EXTRA_ARGS;PROPERTIES;DL_PATHS;DL_FRAMEWORK_PATHS"
|
||||
${ARGN}
|
||||
@@ -192,6 +196,9 @@ function(catch_discover_tests TARGET)
|
||||
TARGET ${TARGET}
|
||||
PROPERTY CROSSCOMPILING_EMULATOR
|
||||
)
|
||||
if (NOT _SKIP_IS_FAILURE)
|
||||
set(_PROPERTIES ${_PROPERTIES} SKIP_RETURN_CODE 4)
|
||||
endif()
|
||||
|
||||
if(_DISCOVERY_MODE STREQUAL "POST_BUILD")
|
||||
add_custom_command(
|
||||
|
@@ -6,8 +6,8 @@
|
||||
|
||||
// SPDX-License-Identifier: BSL-1.0
|
||||
|
||||
// Catch v3.7.0
|
||||
// Generated: 2024-08-14 12:04:53.604337
|
||||
// Catch v3.7.1
|
||||
// Generated: 2024-09-17 10:36:45.608896
|
||||
// ----------------------------------------------------------
|
||||
// This file is an amalgamation of multiple different files.
|
||||
// You probably shouldn't edit it directly.
|
||||
@@ -627,7 +627,7 @@ std::string StringMaker<Catch::Approx>::convert(Catch::Approx const& value) {
|
||||
|
||||
namespace Catch {
|
||||
|
||||
AssertionResultData::AssertionResultData(ResultWas::OfType _resultType, LazyExpression const & _lazyExpression):
|
||||
AssertionResultData::AssertionResultData(ResultWas::OfType _resultType, LazyExpression const& _lazyExpression):
|
||||
lazyExpression(_lazyExpression),
|
||||
resultType(_resultType) {}
|
||||
|
||||
@@ -1170,7 +1170,13 @@ namespace Catch {
|
||||
namespace Catch {
|
||||
|
||||
namespace {
|
||||
const int MaxExitCode = 255;
|
||||
static constexpr int TestFailureExitCode = 42;
|
||||
static constexpr int UnspecifiedErrorExitCode = 1;
|
||||
static constexpr int AllTestsSkippedExitCode = 4;
|
||||
static constexpr int NoTestsRunExitCode = 2;
|
||||
static constexpr int UnmatchedTestSpecExitCode = 3;
|
||||
static constexpr int InvalidTestSpecExitCode = 5;
|
||||
|
||||
|
||||
IEventListenerPtr createReporter(std::string const& reporterName, ReporterConfig&& config) {
|
||||
auto reporter = Catch::getRegistryHub().getReporterRegistry().create(reporterName, CATCH_MOVE(config));
|
||||
@@ -1334,8 +1340,7 @@ namespace Catch {
|
||||
}
|
||||
|
||||
int Session::applyCommandLine( int argc, char const * const * argv ) {
|
||||
if( m_startupExceptions )
|
||||
return 1;
|
||||
if ( m_startupExceptions ) { return UnspecifiedErrorExitCode; }
|
||||
|
||||
auto result = m_cli.parse( Clara::Args( argc, argv ) );
|
||||
|
||||
@@ -1351,7 +1356,7 @@ namespace Catch {
|
||||
<< TextFlow::Column( result.errorMessage() ).indent( 2 )
|
||||
<< "\n\n";
|
||||
errStream->stream() << "Run with -? for usage\n\n" << std::flush;
|
||||
return MaxExitCode;
|
||||
return UnspecifiedErrorExitCode;
|
||||
}
|
||||
|
||||
if( m_configData.showHelp )
|
||||
@@ -1421,8 +1426,7 @@ namespace Catch {
|
||||
}
|
||||
|
||||
int Session::runInternal() {
|
||||
if( m_startupExceptions )
|
||||
return 1;
|
||||
if ( m_startupExceptions ) { return UnspecifiedErrorExitCode; }
|
||||
|
||||
if (m_configData.showHelp || m_configData.libIdentify) {
|
||||
return 0;
|
||||
@@ -1433,7 +1437,7 @@ namespace Catch {
|
||||
<< ") must be greater than the shard index ("
|
||||
<< m_configData.shardIndex << ")\n"
|
||||
<< std::flush;
|
||||
return 1;
|
||||
return UnspecifiedErrorExitCode;
|
||||
}
|
||||
|
||||
CATCH_TRY {
|
||||
@@ -1456,7 +1460,7 @@ namespace Catch {
|
||||
for ( auto const& spec : invalidSpecs ) {
|
||||
reporter->reportInvalidTestSpec( spec );
|
||||
}
|
||||
return 1;
|
||||
return InvalidTestSpecExitCode;
|
||||
}
|
||||
|
||||
|
||||
@@ -1470,29 +1474,29 @@ namespace Catch {
|
||||
|
||||
if ( tests.hadUnmatchedTestSpecs()
|
||||
&& m_config->warnAboutUnmatchedTestSpecs() ) {
|
||||
return 3;
|
||||
// UnmatchedTestSpecExitCode
|
||||
return UnmatchedTestSpecExitCode;
|
||||
}
|
||||
|
||||
if ( totals.testCases.total() == 0
|
||||
&& !m_config->zeroTestsCountAsSuccess() ) {
|
||||
return 2;
|
||||
return NoTestsRunExitCode;
|
||||
}
|
||||
|
||||
if ( totals.testCases.total() > 0 &&
|
||||
totals.testCases.total() == totals.testCases.skipped
|
||||
&& !m_config->zeroTestsCountAsSuccess() ) {
|
||||
return 4;
|
||||
return AllTestsSkippedExitCode;
|
||||
}
|
||||
|
||||
// Note that on unices only the lower 8 bits are usually used, clamping
|
||||
// the return value to 255 prevents false negative when some multiple
|
||||
// of 256 tests has failed
|
||||
return (std::min) (MaxExitCode, static_cast<int>(totals.assertions.failed));
|
||||
if ( totals.assertions.failed ) { return TestFailureExitCode; }
|
||||
return 0;
|
||||
|
||||
}
|
||||
#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
|
||||
catch( std::exception& ex ) {
|
||||
Catch::cerr() << ex.what() << '\n' << std::flush;
|
||||
return MaxExitCode;
|
||||
return UnspecifiedErrorExitCode;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -1528,26 +1532,26 @@ namespace Catch {
|
||||
static_assert(sizeof(TestCaseProperties) == sizeof(TCP_underlying_type),
|
||||
"The size of the TestCaseProperties is different from the assumed size");
|
||||
|
||||
TestCaseProperties operator|(TestCaseProperties lhs, TestCaseProperties rhs) {
|
||||
constexpr TestCaseProperties operator|(TestCaseProperties lhs, TestCaseProperties rhs) {
|
||||
return static_cast<TestCaseProperties>(
|
||||
static_cast<TCP_underlying_type>(lhs) | static_cast<TCP_underlying_type>(rhs)
|
||||
);
|
||||
}
|
||||
|
||||
TestCaseProperties& operator|=(TestCaseProperties& lhs, TestCaseProperties rhs) {
|
||||
constexpr TestCaseProperties& operator|=(TestCaseProperties& lhs, TestCaseProperties rhs) {
|
||||
lhs = static_cast<TestCaseProperties>(
|
||||
static_cast<TCP_underlying_type>(lhs) | static_cast<TCP_underlying_type>(rhs)
|
||||
);
|
||||
return lhs;
|
||||
}
|
||||
|
||||
TestCaseProperties operator&(TestCaseProperties lhs, TestCaseProperties rhs) {
|
||||
constexpr TestCaseProperties operator&(TestCaseProperties lhs, TestCaseProperties rhs) {
|
||||
return static_cast<TestCaseProperties>(
|
||||
static_cast<TCP_underlying_type>(lhs) & static_cast<TCP_underlying_type>(rhs)
|
||||
);
|
||||
}
|
||||
|
||||
bool applies(TestCaseProperties tcp) {
|
||||
constexpr bool applies(TestCaseProperties tcp) {
|
||||
static_assert(static_cast<TCP_underlying_type>(TestCaseProperties::None) == 0,
|
||||
"TestCaseProperties::None must be equal to 0");
|
||||
return tcp != TestCaseProperties::None;
|
||||
@@ -1586,7 +1590,7 @@ namespace Catch {
|
||||
return "Anonymous test case " + std::to_string(++counter);
|
||||
}
|
||||
|
||||
StringRef extractFilenamePart(StringRef filename) {
|
||||
constexpr StringRef extractFilenamePart(StringRef filename) {
|
||||
size_t lastDot = filename.size();
|
||||
while (lastDot > 0 && filename[lastDot - 1] != '.') {
|
||||
--lastDot;
|
||||
@@ -1604,7 +1608,7 @@ namespace Catch {
|
||||
}
|
||||
|
||||
// Returns the upper bound on size of extra tags ([#file]+[.])
|
||||
size_t sizeOfExtraTags(StringRef filepath) {
|
||||
constexpr size_t sizeOfExtraTags(StringRef filepath) {
|
||||
// [.] is 3, [#] is another 3
|
||||
const size_t extras = 3 + 3;
|
||||
return extractFilenamePart(filepath).size() + extras;
|
||||
@@ -1765,10 +1769,6 @@ namespace Catch {
|
||||
return lhs.tags < rhs.tags;
|
||||
}
|
||||
|
||||
TestCaseInfo const& TestCaseHandle::getTestCaseInfo() const {
|
||||
return *m_info;
|
||||
}
|
||||
|
||||
} // end namespace Catch
|
||||
|
||||
|
||||
@@ -1909,7 +1909,7 @@ namespace Catch {
|
||||
|
||||
namespace {
|
||||
static auto getCurrentNanosecondsSinceEpoch() -> uint64_t {
|
||||
return std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock::now().time_since_epoch()).count();
|
||||
return std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::steady_clock::now().time_since_epoch()).count();
|
||||
}
|
||||
} // end unnamed namespace
|
||||
|
||||
@@ -2280,7 +2280,7 @@ namespace Catch {
|
||||
}
|
||||
|
||||
Version const& libraryVersion() {
|
||||
static Version version( 3, 7, 0, "", 0 );
|
||||
static Version version( 3, 7, 1, "", 0 );
|
||||
return version;
|
||||
}
|
||||
|
||||
@@ -2536,8 +2536,8 @@ namespace Catch {
|
||||
void AssertionHandler::handleExpr( ITransientExpression const& expr ) {
|
||||
m_resultCapture.handleExpr( m_assertionInfo, expr, m_reaction );
|
||||
}
|
||||
void AssertionHandler::handleMessage(ResultWas::OfType resultType, StringRef message) {
|
||||
m_resultCapture.handleMessage( m_assertionInfo, resultType, message, m_reaction );
|
||||
void AssertionHandler::handleMessage(ResultWas::OfType resultType, std::string&& message) {
|
||||
m_resultCapture.handleMessage( m_assertionInfo, resultType, CATCH_MOVE(message), m_reaction );
|
||||
}
|
||||
|
||||
auto AssertionHandler::allowThrows() const -> bool {
|
||||
@@ -2683,7 +2683,7 @@ namespace Catch {
|
||||
{ TokenType::Argument,
|
||||
next.substr( delimiterPos + 1, next.size() ) } );
|
||||
} else {
|
||||
if ( next[1] != '-' && next.size() > 2 ) {
|
||||
if ( next.size() > 1 && next[1] != '-' && next.size() > 2 ) {
|
||||
// Combined short args, e.g. "-ab" for "-a -b"
|
||||
for ( size_t i = 1; i < next.size(); ++i ) {
|
||||
m_tokenBuffer.push_back(
|
||||
@@ -3656,12 +3656,6 @@ namespace Catch {
|
||||
return *Context::currentContext;
|
||||
}
|
||||
|
||||
void Context::setResultCapture( IResultCapture* resultCapture ) {
|
||||
m_resultCapture = resultCapture;
|
||||
}
|
||||
|
||||
void Context::setConfig( IConfig const* config ) { m_config = config; }
|
||||
|
||||
SimplePcg32& sharedRng() {
|
||||
static SimplePcg32 s_rng;
|
||||
return s_rng;
|
||||
@@ -5547,26 +5541,6 @@ ReporterSpec::ReporterSpec(
|
||||
|
||||
|
||||
|
||||
namespace Catch {
|
||||
|
||||
bool isOk( ResultWas::OfType resultType ) {
|
||||
return ( resultType & ResultWas::FailureBit ) == 0;
|
||||
}
|
||||
bool isJustInfo( int flags ) {
|
||||
return flags == ResultWas::Info;
|
||||
}
|
||||
|
||||
ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ) {
|
||||
return static_cast<ResultDisposition::Flags>( static_cast<int>( lhs ) | static_cast<int>( rhs ) );
|
||||
}
|
||||
|
||||
bool shouldContinueOnFailure( int flags ) { return ( flags & ResultDisposition::ContinueOnFailure ) != 0; }
|
||||
bool shouldSuppressFailure( int flags ) { return ( flags & ResultDisposition::SuppressFail ) != 0; }
|
||||
|
||||
} // end namespace Catch
|
||||
|
||||
|
||||
|
||||
#include <cstdio>
|
||||
#include <sstream>
|
||||
#include <vector>
|
||||
@@ -6232,13 +6206,13 @@ namespace Catch {
|
||||
void RunContext::handleMessage(
|
||||
AssertionInfo const& info,
|
||||
ResultWas::OfType resultType,
|
||||
StringRef message,
|
||||
std::string&& message,
|
||||
AssertionReaction& reaction
|
||||
) {
|
||||
m_lastAssertionInfo = info;
|
||||
|
||||
AssertionResultData data( resultType, LazyExpression( false ) );
|
||||
data.message = static_cast<std::string>(message);
|
||||
data.message = CATCH_MOVE( message );
|
||||
AssertionResult assertionResult{ m_lastAssertionInfo,
|
||||
CATCH_MOVE( data ) };
|
||||
|
||||
@@ -7153,7 +7127,7 @@ namespace Catch {
|
||||
TestType m_testAsFunction;
|
||||
|
||||
public:
|
||||
TestInvokerAsFunction( TestType testAsFunction ) noexcept:
|
||||
constexpr TestInvokerAsFunction( TestType testAsFunction ) noexcept:
|
||||
m_testAsFunction( testAsFunction ) {}
|
||||
|
||||
void invoke() const override { m_testAsFunction(); }
|
||||
@@ -7888,36 +7862,16 @@ namespace {
|
||||
os.flags(f);
|
||||
}
|
||||
|
||||
bool shouldNewline(XmlFormatting fmt) {
|
||||
constexpr bool shouldNewline(XmlFormatting fmt) {
|
||||
return !!(static_cast<std::underlying_type_t<XmlFormatting>>(fmt & XmlFormatting::Newline));
|
||||
}
|
||||
|
||||
bool shouldIndent(XmlFormatting fmt) {
|
||||
constexpr bool shouldIndent(XmlFormatting fmt) {
|
||||
return !!(static_cast<std::underlying_type_t<XmlFormatting>>(fmt & XmlFormatting::Indent));
|
||||
}
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
XmlFormatting operator | (XmlFormatting lhs, XmlFormatting rhs) {
|
||||
return static_cast<XmlFormatting>(
|
||||
static_cast<std::underlying_type_t<XmlFormatting>>(lhs) |
|
||||
static_cast<std::underlying_type_t<XmlFormatting>>(rhs)
|
||||
);
|
||||
}
|
||||
|
||||
XmlFormatting operator & (XmlFormatting lhs, XmlFormatting rhs) {
|
||||
return static_cast<XmlFormatting>(
|
||||
static_cast<std::underlying_type_t<XmlFormatting>>(lhs) &
|
||||
static_cast<std::underlying_type_t<XmlFormatting>>(rhs)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
XmlEncode::XmlEncode( StringRef str, ForWhat forWhat )
|
||||
: m_str( str ),
|
||||
m_forWhat( forWhat )
|
||||
{}
|
||||
|
||||
void XmlEncode::encodeTo( std::ostream& os ) const {
|
||||
// Apostrophe escaping not necessary if we always use " to write attributes
|
||||
// (see: http://www.w3.org/TR/xml/#syntax)
|
||||
@@ -11050,9 +11004,9 @@ namespace Catch {
|
||||
if (!rootName.empty())
|
||||
name = rootName + '/' + name;
|
||||
|
||||
if ( sectionNode.hasAnyAssertions()
|
||||
if ( sectionNode.stats.assertions.total() > 0
|
||||
|| !sectionNode.stdOut.empty()
|
||||
|| !sectionNode.stdErr.empty() ) {
|
||||
|| !sectionNode.stdErr.empty() ) {
|
||||
XmlWriter::ScopedElement e = xml.scopedElement("testCase");
|
||||
xml.writeAttribute("name"_sr, name);
|
||||
xml.writeAttribute("duration"_sr, static_cast<long>(sectionNode.stats.durationInSeconds * 1000));
|
||||
|
@@ -6,8 +6,8 @@
|
||||
|
||||
// SPDX-License-Identifier: BSL-1.0
|
||||
|
||||
// Catch v3.7.0
|
||||
// Generated: 2024-08-14 12:04:53.220567
|
||||
// Catch v3.7.1
|
||||
// Generated: 2024-09-17 10:36:40.974985
|
||||
// ----------------------------------------------------------
|
||||
// This file is an amalgamation of multiple different files.
|
||||
// You probably shouldn't edit it directly.
|
||||
@@ -555,10 +555,15 @@ namespace Catch {
|
||||
friend void cleanUpContext();
|
||||
|
||||
public:
|
||||
IResultCapture* getResultCapture() const { return m_resultCapture; }
|
||||
IConfig const* getConfig() const { return m_config; }
|
||||
void setResultCapture( IResultCapture* resultCapture );
|
||||
void setConfig( IConfig const* config );
|
||||
constexpr IResultCapture* getResultCapture() const {
|
||||
return m_resultCapture;
|
||||
}
|
||||
constexpr IConfig const* getConfig() const { return m_config; }
|
||||
constexpr void setResultCapture( IResultCapture* resultCapture ) {
|
||||
m_resultCapture = resultCapture;
|
||||
}
|
||||
constexpr void setConfig( IConfig const* config ) { m_config = config; }
|
||||
|
||||
};
|
||||
|
||||
Context& getCurrentMutableContext();
|
||||
@@ -669,7 +674,6 @@ namespace Catch {
|
||||
#define CATCH_INTERFACES_CAPTURE_HPP_INCLUDED
|
||||
|
||||
#include <string>
|
||||
#include <chrono>
|
||||
|
||||
|
||||
|
||||
@@ -819,8 +823,10 @@ namespace Catch {
|
||||
|
||||
}; };
|
||||
|
||||
bool isOk( ResultWas::OfType resultType );
|
||||
bool isJustInfo( int flags );
|
||||
constexpr bool isOk( ResultWas::OfType resultType ) {
|
||||
return ( resultType & ResultWas::FailureBit ) == 0;
|
||||
}
|
||||
constexpr bool isJustInfo( int flags ) { return flags == ResultWas::Info; }
|
||||
|
||||
|
||||
// ResultDisposition::Flags enum
|
||||
@@ -832,11 +838,18 @@ namespace Catch {
|
||||
SuppressFail = 0x08 // Failures are reported but do not fail the test
|
||||
}; };
|
||||
|
||||
ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs );
|
||||
constexpr ResultDisposition::Flags operator|( ResultDisposition::Flags lhs,
|
||||
ResultDisposition::Flags rhs ) {
|
||||
return static_cast<ResultDisposition::Flags>( static_cast<int>( lhs ) |
|
||||
static_cast<int>( rhs ) );
|
||||
}
|
||||
|
||||
bool shouldContinueOnFailure( int flags );
|
||||
inline bool isFalseTest( int flags ) { return ( flags & ResultDisposition::FalseTest ) != 0; }
|
||||
bool shouldSuppressFailure( int flags );
|
||||
constexpr bool isFalseTest( int flags ) {
|
||||
return ( flags & ResultDisposition::FalseTest ) != 0;
|
||||
}
|
||||
constexpr bool shouldSuppressFailure( int flags ) {
|
||||
return ( flags & ResultDisposition::SuppressFail ) != 0;
|
||||
}
|
||||
|
||||
} // end namespace Catch
|
||||
|
||||
@@ -1054,7 +1067,7 @@ namespace Catch {
|
||||
virtual void handleMessage
|
||||
( AssertionInfo const& info,
|
||||
ResultWas::OfType resultType,
|
||||
StringRef message,
|
||||
std::string&& message,
|
||||
AssertionReaction& reaction ) = 0;
|
||||
virtual void handleUnexpectedExceptionNotThrown
|
||||
( AssertionInfo const& info,
|
||||
@@ -1302,7 +1315,7 @@ namespace Catch {
|
||||
int high_mild = 0; // 1.5 to 3 times IQR above Q3
|
||||
int high_severe = 0; // more than 3 times IQR above Q3
|
||||
|
||||
int total() const {
|
||||
constexpr int total() const {
|
||||
return low_severe + low_mild + high_mild + high_severe;
|
||||
}
|
||||
};
|
||||
@@ -3267,13 +3280,13 @@ namespace Catch {
|
||||
ITransientExpression const* m_transientExpression = nullptr;
|
||||
bool m_isNegated;
|
||||
public:
|
||||
LazyExpression( bool isNegated ):
|
||||
constexpr LazyExpression( bool isNegated ):
|
||||
m_isNegated(isNegated)
|
||||
{}
|
||||
LazyExpression(LazyExpression const& other) = default;
|
||||
constexpr LazyExpression(LazyExpression const& other) = default;
|
||||
LazyExpression& operator = ( LazyExpression const& ) = delete;
|
||||
|
||||
explicit operator bool() const {
|
||||
constexpr explicit operator bool() const {
|
||||
return m_transientExpression != nullptr;
|
||||
}
|
||||
|
||||
@@ -4012,7 +4025,7 @@ namespace Catch {
|
||||
do { \
|
||||
Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::StringRef(), resultDisposition ); \
|
||||
catchAssertionHandler.handleMessage( messageType, ( Catch::MessageStream() << __VA_ARGS__ + ::Catch::StreamEndStop() ).m_stream.str() ); \
|
||||
INTERNAL_CATCH_REACT( catchAssertionHandler ) \
|
||||
catchAssertionHandler.complete(); \
|
||||
} while( false )
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
@@ -5272,6 +5285,9 @@ namespace Catch {
|
||||
bool m_isBinaryExpression;
|
||||
bool m_result;
|
||||
|
||||
protected:
|
||||
~ITransientExpression() = default;
|
||||
|
||||
public:
|
||||
constexpr auto isBinaryExpression() const -> bool { return m_isBinaryExpression; }
|
||||
constexpr auto getResult() const -> bool { return m_result; }
|
||||
@@ -5283,17 +5299,13 @@ namespace Catch {
|
||||
m_result( result )
|
||||
{}
|
||||
|
||||
ITransientExpression() = default;
|
||||
ITransientExpression(ITransientExpression const&) = default;
|
||||
ITransientExpression& operator=(ITransientExpression const&) = default;
|
||||
constexpr ITransientExpression( ITransientExpression const& ) = default;
|
||||
constexpr ITransientExpression& operator=( ITransientExpression const& ) = default;
|
||||
|
||||
friend std::ostream& operator<<(std::ostream& out, ITransientExpression const& expr) {
|
||||
expr.streamReconstructedExpression(out);
|
||||
return out;
|
||||
}
|
||||
|
||||
protected:
|
||||
~ITransientExpression() = default;
|
||||
};
|
||||
|
||||
void formatReconstructedExpression( std::ostream &os, std::string const& lhs, StringRef op, std::string const& rhs );
|
||||
@@ -5602,12 +5614,12 @@ namespace Catch {
|
||||
|
||||
|
||||
template<typename T>
|
||||
void handleExpr( ExprLhs<T> const& expr ) {
|
||||
constexpr void handleExpr( ExprLhs<T> const& expr ) {
|
||||
handleExpr( expr.makeUnaryExpr() );
|
||||
}
|
||||
void handleExpr( ITransientExpression const& expr );
|
||||
|
||||
void handleMessage(ResultWas::OfType resultType, StringRef message);
|
||||
void handleMessage(ResultWas::OfType resultType, std::string&& message);
|
||||
|
||||
void handleExceptionThrownAsExpected();
|
||||
void handleUnexpectedExceptionNotThrown();
|
||||
@@ -5663,8 +5675,6 @@ namespace Catch {
|
||||
|
||||
#endif
|
||||
|
||||
#define INTERNAL_CATCH_REACT( handler ) handler.complete();
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
#define INTERNAL_CATCH_TEST( macroName, resultDisposition, ... ) \
|
||||
do { /* NOLINT(bugprone-infinite-loop) */ \
|
||||
@@ -5677,7 +5687,7 @@ namespace Catch {
|
||||
catchAssertionHandler.handleExpr( Catch::Decomposer() <= __VA_ARGS__ ); /* NOLINT(bugprone-chained-comparison) */ \
|
||||
CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
|
||||
} INTERNAL_CATCH_CATCH( catchAssertionHandler ) \
|
||||
INTERNAL_CATCH_REACT( catchAssertionHandler ) \
|
||||
catchAssertionHandler.complete(); \
|
||||
} while( (void)0, (false) && static_cast<const bool&>( !!(__VA_ARGS__) ) ) // the expression here is never evaluated at runtime but it forces the compiler to give it a look
|
||||
// The double negation silences MSVC's C4800 warning, the static_cast forces short-circuit evaluation if the type has overloaded &&.
|
||||
|
||||
@@ -5705,7 +5715,7 @@ namespace Catch {
|
||||
catch( ... ) { \
|
||||
catchAssertionHandler.handleUnexpectedInflightException(); \
|
||||
} \
|
||||
INTERNAL_CATCH_REACT( catchAssertionHandler ) \
|
||||
catchAssertionHandler.complete(); \
|
||||
} while( false )
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
@@ -5726,7 +5736,7 @@ namespace Catch {
|
||||
} \
|
||||
else \
|
||||
catchAssertionHandler.handleThrowingCallSkipped(); \
|
||||
INTERNAL_CATCH_REACT( catchAssertionHandler ) \
|
||||
catchAssertionHandler.complete(); \
|
||||
} while( false )
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
@@ -5750,7 +5760,7 @@ namespace Catch {
|
||||
} \
|
||||
else \
|
||||
catchAssertionHandler.handleThrowingCallSkipped(); \
|
||||
INTERNAL_CATCH_REACT( catchAssertionHandler ) \
|
||||
catchAssertionHandler.complete(); \
|
||||
} while( false )
|
||||
|
||||
|
||||
@@ -5774,7 +5784,7 @@ namespace Catch {
|
||||
} \
|
||||
else \
|
||||
catchAssertionHandler.handleThrowingCallSkipped(); \
|
||||
INTERNAL_CATCH_REACT( catchAssertionHandler ) \
|
||||
catchAssertionHandler.complete(); \
|
||||
} while( false )
|
||||
|
||||
#endif // CATCH_CONFIG_DISABLE
|
||||
@@ -5975,7 +5985,8 @@ template<typename C>
|
||||
class TestInvokerAsMethod : public ITestInvoker {
|
||||
void (C::*m_testAsMethod)();
|
||||
public:
|
||||
TestInvokerAsMethod( void (C::*testAsMethod)() ) noexcept : m_testAsMethod( testAsMethod ) {}
|
||||
constexpr TestInvokerAsMethod( void ( C::*testAsMethod )() ) noexcept:
|
||||
m_testAsMethod( testAsMethod ) {}
|
||||
|
||||
void invoke() const override {
|
||||
C obj;
|
||||
@@ -5996,7 +6007,8 @@ class TestInvokerFixture : public ITestInvoker {
|
||||
Detail::unique_ptr<C> m_fixture = nullptr;
|
||||
|
||||
public:
|
||||
TestInvokerFixture( void ( C::*testAsMethod )() const) noexcept : m_testAsMethod( testAsMethod ) {}
|
||||
constexpr TestInvokerFixture( void ( C::*testAsMethod )() const ) noexcept:
|
||||
m_testAsMethod( testAsMethod ) {}
|
||||
|
||||
void prepareTestCase() override {
|
||||
m_fixture = Detail::make_unique<C>();
|
||||
@@ -7136,7 +7148,7 @@ namespace Catch {
|
||||
TestCaseInfo* m_info;
|
||||
ITestInvoker* m_invoker;
|
||||
public:
|
||||
TestCaseHandle(TestCaseInfo* info, ITestInvoker* invoker) :
|
||||
constexpr TestCaseHandle(TestCaseInfo* info, ITestInvoker* invoker) :
|
||||
m_info(info), m_invoker(invoker) {}
|
||||
|
||||
void prepareTestCase() const {
|
||||
@@ -7151,7 +7163,9 @@ namespace Catch {
|
||||
m_invoker->invoke();
|
||||
}
|
||||
|
||||
TestCaseInfo const& getTestCaseInfo() const;
|
||||
constexpr TestCaseInfo const& getTestCaseInfo() const {
|
||||
return *m_info;
|
||||
}
|
||||
};
|
||||
|
||||
Detail::unique_ptr<TestCaseInfo>
|
||||
@@ -7214,7 +7228,7 @@ namespace Catch {
|
||||
class ExceptionTranslator : public IExceptionTranslator {
|
||||
public:
|
||||
|
||||
ExceptionTranslator( std::string(*translateFunction)( T const& ) )
|
||||
constexpr ExceptionTranslator( std::string(*translateFunction)( T const& ) )
|
||||
: m_translateFunction( translateFunction )
|
||||
{}
|
||||
|
||||
@@ -7316,7 +7330,7 @@ namespace Catch {
|
||||
|
||||
#define CATCH_VERSION_MAJOR 3
|
||||
#define CATCH_VERSION_MINOR 7
|
||||
#define CATCH_VERSION_PATCH 0
|
||||
#define CATCH_VERSION_PATCH 1
|
||||
|
||||
#endif // CATCH_VERSION_MACROS_HPP_INCLUDED
|
||||
|
||||
@@ -8043,7 +8057,7 @@ namespace Catch {
|
||||
struct ExtendedMultResult {
|
||||
T upper;
|
||||
T lower;
|
||||
bool operator==( ExtendedMultResult const& rhs ) const {
|
||||
constexpr bool operator==( ExtendedMultResult const& rhs ) const {
|
||||
return upper == rhs.upper && lower == rhs.lower;
|
||||
}
|
||||
};
|
||||
@@ -8161,6 +8175,7 @@ namespace Catch {
|
||||
* get by simple casting ([0, ..., INT_MAX, INT_MIN, ..., -1])
|
||||
*/
|
||||
template <typename OriginalType, typename UnsignedType>
|
||||
constexpr
|
||||
std::enable_if_t<std::is_signed<OriginalType>::value, UnsignedType>
|
||||
transposeToNaturalOrder( UnsignedType in ) {
|
||||
static_assert(
|
||||
@@ -8181,6 +8196,7 @@ namespace Catch {
|
||||
|
||||
template <typename OriginalType,
|
||||
typename UnsignedType>
|
||||
constexpr
|
||||
std::enable_if_t<std::is_unsigned<OriginalType>::value, UnsignedType>
|
||||
transposeToNaturalOrder(UnsignedType in) {
|
||||
static_assert(
|
||||
@@ -8232,24 +8248,24 @@ class uniform_integer_distribution {
|
||||
// distribution will be reused many times and this is an optimization.
|
||||
UnsignedIntegerType m_rejection_threshold = 0;
|
||||
|
||||
UnsignedIntegerType computeDistance(IntegerType a, IntegerType b) const {
|
||||
static constexpr UnsignedIntegerType computeDistance(IntegerType a, IntegerType b) {
|
||||
// This overflows and returns 0 if a == 0 and b == TYPE_MAX.
|
||||
// We handle that later when generating the number.
|
||||
return transposeTo(b) - transposeTo(a) + 1;
|
||||
}
|
||||
|
||||
static UnsignedIntegerType computeRejectionThreshold(UnsignedIntegerType ab_distance) {
|
||||
static constexpr UnsignedIntegerType computeRejectionThreshold(UnsignedIntegerType ab_distance) {
|
||||
// distance == 0 means that we will return all possible values from
|
||||
// the type's range, and that we shouldn't reject anything.
|
||||
if ( ab_distance == 0 ) { return 0; }
|
||||
return ( ~ab_distance + 1 ) % ab_distance;
|
||||
}
|
||||
|
||||
static UnsignedIntegerType transposeTo(IntegerType in) {
|
||||
static constexpr UnsignedIntegerType transposeTo(IntegerType in) {
|
||||
return Detail::transposeToNaturalOrder<IntegerType>(
|
||||
static_cast<UnsignedIntegerType>( in ) );
|
||||
}
|
||||
static IntegerType transposeBack(UnsignedIntegerType in) {
|
||||
static constexpr IntegerType transposeBack(UnsignedIntegerType in) {
|
||||
return static_cast<IntegerType>(
|
||||
Detail::transposeToNaturalOrder<IntegerType>(in) );
|
||||
}
|
||||
@@ -8257,7 +8273,7 @@ class uniform_integer_distribution {
|
||||
public:
|
||||
using result_type = IntegerType;
|
||||
|
||||
uniform_integer_distribution( IntegerType a, IntegerType b ):
|
||||
constexpr uniform_integer_distribution( IntegerType a, IntegerType b ):
|
||||
m_a( transposeTo(a) ),
|
||||
m_ab_distance( computeDistance(a, b) ),
|
||||
m_rejection_threshold( computeRejectionThreshold(m_ab_distance) ) {
|
||||
@@ -8265,7 +8281,7 @@ public:
|
||||
}
|
||||
|
||||
template <typename Generator>
|
||||
result_type operator()( Generator& g ) {
|
||||
constexpr result_type operator()( Generator& g ) {
|
||||
// All possible values of result_type are valid.
|
||||
if ( m_ab_distance == 0 ) {
|
||||
return transposeBack( Detail::fillBitsFrom<UnsignedIntegerType>( g ) );
|
||||
@@ -8283,8 +8299,8 @@ public:
|
||||
return transposeBack(m_a + emul.upper);
|
||||
}
|
||||
|
||||
result_type a() const { return transposeBack(m_a); }
|
||||
result_type b() const { return transposeBack(m_ab_distance + m_a - 1); }
|
||||
constexpr result_type a() const { return transposeBack(m_a); }
|
||||
constexpr result_type b() const { return transposeBack(m_ab_distance + m_a - 1); }
|
||||
};
|
||||
|
||||
} // end namespace Catch
|
||||
@@ -9742,6 +9758,7 @@ namespace Catch {
|
||||
typename Sentinel,
|
||||
typename T,
|
||||
typename Comparator>
|
||||
constexpr
|
||||
ForwardIter find_sentinel( ForwardIter start,
|
||||
Sentinel sentinel,
|
||||
T const& value,
|
||||
@@ -9757,6 +9774,7 @@ namespace Catch {
|
||||
typename Sentinel,
|
||||
typename T,
|
||||
typename Comparator>
|
||||
constexpr
|
||||
std::ptrdiff_t count_sentinel( ForwardIter start,
|
||||
Sentinel sentinel,
|
||||
T const& value,
|
||||
@@ -9770,6 +9788,7 @@ namespace Catch {
|
||||
}
|
||||
|
||||
template <typename ForwardIter, typename Sentinel>
|
||||
constexpr
|
||||
std::enable_if_t<!std::is_same<ForwardIter, Sentinel>::value,
|
||||
std::ptrdiff_t>
|
||||
sentinel_distance( ForwardIter iter, const Sentinel sentinel ) {
|
||||
@@ -9782,8 +9801,8 @@ namespace Catch {
|
||||
}
|
||||
|
||||
template <typename ForwardIter>
|
||||
std::ptrdiff_t sentinel_distance( ForwardIter first,
|
||||
ForwardIter last ) {
|
||||
constexpr std::ptrdiff_t sentinel_distance( ForwardIter first,
|
||||
ForwardIter last ) {
|
||||
return std::distance( first, last );
|
||||
}
|
||||
|
||||
@@ -9792,11 +9811,11 @@ namespace Catch {
|
||||
typename ForwardIter2,
|
||||
typename Sentinel2,
|
||||
typename Comparator>
|
||||
bool check_element_counts( ForwardIter1 first_1,
|
||||
const Sentinel1 end_1,
|
||||
ForwardIter2 first_2,
|
||||
const Sentinel2 end_2,
|
||||
Comparator cmp ) {
|
||||
constexpr bool check_element_counts( ForwardIter1 first_1,
|
||||
const Sentinel1 end_1,
|
||||
ForwardIter2 first_2,
|
||||
const Sentinel2 end_2,
|
||||
Comparator cmp ) {
|
||||
auto cursor = first_1;
|
||||
while ( cursor != end_1 ) {
|
||||
if ( find_sentinel( first_1, cursor, *cursor, cmp ) ==
|
||||
@@ -9826,11 +9845,11 @@ namespace Catch {
|
||||
typename ForwardIter2,
|
||||
typename Sentinel2,
|
||||
typename Comparator>
|
||||
bool is_permutation( ForwardIter1 first_1,
|
||||
const Sentinel1 end_1,
|
||||
ForwardIter2 first_2,
|
||||
const Sentinel2 end_2,
|
||||
Comparator cmp ) {
|
||||
constexpr bool is_permutation( ForwardIter1 first_1,
|
||||
const Sentinel1 end_1,
|
||||
ForwardIter2 first_2,
|
||||
const Sentinel2 end_2,
|
||||
Comparator cmp ) {
|
||||
// TODO: no optimization for stronger iterators, because we would also have to constrain on sentinel vs not sentinel types
|
||||
// TODO: Comparator has to be "both sides", e.g. a == b => b == a
|
||||
// This skips shared prefix of the two ranges
|
||||
@@ -10486,7 +10505,7 @@ namespace Catch {
|
||||
void handleMessage
|
||||
( AssertionInfo const& info,
|
||||
ResultWas::OfType resultType,
|
||||
StringRef message,
|
||||
std::string&& message,
|
||||
AssertionReaction& reaction ) override;
|
||||
void handleUnexpectedExceptionNotThrown
|
||||
( AssertionInfo const& info,
|
||||
@@ -11271,16 +11290,25 @@ namespace Catch {
|
||||
|
||||
#include <iosfwd>
|
||||
#include <vector>
|
||||
#include <cstdint>
|
||||
|
||||
namespace Catch {
|
||||
enum class XmlFormatting {
|
||||
enum class XmlFormatting : std::uint8_t {
|
||||
None = 0x00,
|
||||
Indent = 0x01,
|
||||
Newline = 0x02,
|
||||
};
|
||||
|
||||
XmlFormatting operator | (XmlFormatting lhs, XmlFormatting rhs);
|
||||
XmlFormatting operator & (XmlFormatting lhs, XmlFormatting rhs);
|
||||
constexpr XmlFormatting operator|( XmlFormatting lhs, XmlFormatting rhs ) {
|
||||
return static_cast<XmlFormatting>( static_cast<std::uint8_t>( lhs ) |
|
||||
static_cast<std::uint8_t>( rhs ) );
|
||||
}
|
||||
|
||||
constexpr XmlFormatting operator&( XmlFormatting lhs, XmlFormatting rhs ) {
|
||||
return static_cast<XmlFormatting>( static_cast<std::uint8_t>( lhs ) &
|
||||
static_cast<std::uint8_t>( rhs ) );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Helper for XML-encoding text (escaping angle brackets, quotes, etc)
|
||||
@@ -11292,7 +11320,9 @@ namespace Catch {
|
||||
public:
|
||||
enum ForWhat { ForTextNodes, ForAttributes };
|
||||
|
||||
XmlEncode( StringRef str, ForWhat forWhat = ForTextNodes );
|
||||
constexpr XmlEncode( StringRef str, ForWhat forWhat = ForTextNodes ):
|
||||
m_str( str ), m_forWhat( forWhat ) {}
|
||||
|
||||
|
||||
void encodeTo( std::ostream& os ) const;
|
||||
|
||||
@@ -11455,7 +11485,7 @@ namespace Catch {
|
||||
ArgT && m_arg;
|
||||
MatcherT const& m_matcher;
|
||||
public:
|
||||
MatchExpr( ArgT && arg, MatcherT const& matcher )
|
||||
constexpr MatchExpr( ArgT && arg, MatcherT const& matcher )
|
||||
: ITransientExpression{ true, matcher.match( arg ) }, // not forwarding arg here on purpose
|
||||
m_arg( CATCH_FORWARD(arg) ),
|
||||
m_matcher( matcher )
|
||||
@@ -11485,7 +11515,8 @@ namespace Catch {
|
||||
void handleExceptionMatchExpr( AssertionHandler& handler, StringMatcher const& matcher );
|
||||
|
||||
template<typename ArgT, typename MatcherT>
|
||||
auto makeMatchExpr( ArgT && arg, MatcherT const& matcher ) -> MatchExpr<ArgT, MatcherT> {
|
||||
constexpr MatchExpr<ArgT, MatcherT>
|
||||
makeMatchExpr( ArgT&& arg, MatcherT const& matcher ) {
|
||||
return MatchExpr<ArgT, MatcherT>( CATCH_FORWARD(arg), matcher );
|
||||
}
|
||||
|
||||
@@ -11499,7 +11530,7 @@ namespace Catch {
|
||||
INTERNAL_CATCH_TRY { \
|
||||
catchAssertionHandler.handleExpr( Catch::makeMatchExpr( arg, matcher ) ); \
|
||||
} INTERNAL_CATCH_CATCH( catchAssertionHandler ) \
|
||||
INTERNAL_CATCH_REACT( catchAssertionHandler ) \
|
||||
catchAssertionHandler.complete(); \
|
||||
} while( false )
|
||||
|
||||
|
||||
@@ -11509,7 +11540,10 @@ namespace Catch {
|
||||
Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__) ", " CATCH_INTERNAL_STRINGIFY(exceptionType) ", " CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \
|
||||
if( catchAssertionHandler.allowThrows() ) \
|
||||
try { \
|
||||
CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
|
||||
CATCH_INTERNAL_SUPPRESS_USELESS_CAST_WARNINGS \
|
||||
static_cast<void>(__VA_ARGS__ ); \
|
||||
CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
|
||||
catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \
|
||||
} \
|
||||
catch( exceptionType const& ex ) { \
|
||||
@@ -11520,7 +11554,7 @@ namespace Catch {
|
||||
} \
|
||||
else \
|
||||
catchAssertionHandler.handleThrowingCallSkipped(); \
|
||||
INTERNAL_CATCH_REACT( catchAssertionHandler ) \
|
||||
catchAssertionHandler.complete(); \
|
||||
} while( false )
|
||||
|
||||
|
||||
@@ -12589,12 +12623,14 @@ namespace Catch {
|
||||
|
||||
public:
|
||||
template <typename TargetRangeLike2, typename Equality2>
|
||||
constexpr
|
||||
RangeEqualsMatcher( TargetRangeLike2&& range,
|
||||
Equality2&& predicate ):
|
||||
m_desired( CATCH_FORWARD( range ) ),
|
||||
m_predicate( CATCH_FORWARD( predicate ) ) {}
|
||||
|
||||
template <typename RangeLike>
|
||||
constexpr
|
||||
bool match( RangeLike&& rng ) const {
|
||||
auto rng_start = begin( rng );
|
||||
const auto rng_end = end( rng );
|
||||
@@ -12627,12 +12663,14 @@ namespace Catch {
|
||||
|
||||
public:
|
||||
template <typename TargetRangeLike2, typename Equality2>
|
||||
constexpr
|
||||
UnorderedRangeEqualsMatcher( TargetRangeLike2&& range,
|
||||
Equality2&& predicate ):
|
||||
m_desired( CATCH_FORWARD( range ) ),
|
||||
m_predicate( CATCH_FORWARD( predicate ) ) {}
|
||||
|
||||
template <typename RangeLike>
|
||||
constexpr
|
||||
bool match( RangeLike&& rng ) const {
|
||||
using std::begin;
|
||||
using std::end;
|
||||
@@ -12656,6 +12694,7 @@ namespace Catch {
|
||||
* Uses `std::equal_to` to do the comparison
|
||||
*/
|
||||
template <typename RangeLike>
|
||||
constexpr
|
||||
std::enable_if_t<!Detail::is_matcher<RangeLike>::value,
|
||||
RangeEqualsMatcher<RangeLike, std::equal_to<>>>
|
||||
RangeEquals( RangeLike&& range ) {
|
||||
@@ -12669,6 +12708,7 @@ namespace Catch {
|
||||
* Uses to provided predicate `predicate` to do the comparisons
|
||||
*/
|
||||
template <typename RangeLike, typename Equality>
|
||||
constexpr
|
||||
RangeEqualsMatcher<RangeLike, Equality>
|
||||
RangeEquals( RangeLike&& range, Equality&& predicate ) {
|
||||
return { CATCH_FORWARD( range ), CATCH_FORWARD( predicate ) };
|
||||
@@ -12681,6 +12721,7 @@ namespace Catch {
|
||||
* Uses `std::equal_to` to do the comparison
|
||||
*/
|
||||
template <typename RangeLike>
|
||||
constexpr
|
||||
std::enable_if_t<
|
||||
!Detail::is_matcher<RangeLike>::value,
|
||||
UnorderedRangeEqualsMatcher<RangeLike, std::equal_to<>>>
|
||||
@@ -12695,6 +12736,7 @@ namespace Catch {
|
||||
* Uses to provided predicate `predicate` to do the comparisons
|
||||
*/
|
||||
template <typename RangeLike, typename Equality>
|
||||
constexpr
|
||||
UnorderedRangeEqualsMatcher<RangeLike, Equality>
|
||||
UnorderedRangeEquals( RangeLike&& range, Equality&& predicate ) {
|
||||
return { CATCH_FORWARD( range ), CATCH_FORWARD( predicate ) };
|
||||
@@ -13869,7 +13911,7 @@ namespace Catch {
|
||||
: CumulativeReporterBase(CATCH_MOVE(config))
|
||||
, xml(m_stream) {
|
||||
m_preferences.shouldRedirectStdOut = true;
|
||||
m_preferences.shouldReportAllAssertions = true;
|
||||
m_preferences.shouldReportAllAssertions = false;
|
||||
m_shouldStoreSuccesfulAssertions = false;
|
||||
}
|
||||
|
||||
|
@@ -8,7 +8,7 @@
|
||||
project(
|
||||
'catch2',
|
||||
'cpp',
|
||||
version: '3.7.0', # CML version placeholder, don't delete
|
||||
version: '3.7.1', # CML version placeholder, don't delete
|
||||
license: 'BSL-1.0',
|
||||
meson_version: '>=0.54.1',
|
||||
)
|
||||
|
@@ -178,7 +178,7 @@ namespace Catch {
|
||||
double diff = b - m;
|
||||
return a + diff * diff;
|
||||
} ) /
|
||||
( last - first );
|
||||
static_cast<double>( last - first );
|
||||
return std::sqrt( variance );
|
||||
}
|
||||
|
||||
@@ -213,7 +213,7 @@ namespace Catch {
|
||||
double* first,
|
||||
double* last ) {
|
||||
auto count = last - first;
|
||||
double idx = (count - 1) * k / static_cast<double>(q);
|
||||
double idx = static_cast<double>((count - 1) * k) / static_cast<double>(q);
|
||||
int j = static_cast<int>(idx);
|
||||
double g = idx - j;
|
||||
std::nth_element(first, first + j, last);
|
||||
@@ -316,10 +316,10 @@ namespace Catch {
|
||||
|
||||
double accel = sum_cubes / ( 6 * std::pow( sum_squares, 1.5 ) );
|
||||
long n = static_cast<long>( resample.size() );
|
||||
double prob_n =
|
||||
double prob_n = static_cast<double>(
|
||||
std::count_if( resample.begin(),
|
||||
resample.end(),
|
||||
[point]( double x ) { return x < point; } ) /
|
||||
[point]( double x ) { return x < point; } )) /
|
||||
static_cast<double>( n );
|
||||
// degenerate case with uniform samples
|
||||
if ( Catch::Detail::directCompare( prob_n, 0. ) ) {
|
||||
|
@@ -34,7 +34,13 @@
|
||||
namespace Catch {
|
||||
|
||||
namespace {
|
||||
const int MaxExitCode = 255;
|
||||
static constexpr int TestFailureExitCode = 42;
|
||||
static constexpr int UnspecifiedErrorExitCode = 1;
|
||||
static constexpr int AllTestsSkippedExitCode = 4;
|
||||
static constexpr int NoTestsRunExitCode = 2;
|
||||
static constexpr int UnmatchedTestSpecExitCode = 3;
|
||||
static constexpr int InvalidTestSpecExitCode = 5;
|
||||
|
||||
|
||||
IEventListenerPtr createReporter(std::string const& reporterName, ReporterConfig&& config) {
|
||||
auto reporter = Catch::getRegistryHub().getReporterRegistry().create(reporterName, CATCH_MOVE(config));
|
||||
@@ -198,8 +204,7 @@ namespace Catch {
|
||||
}
|
||||
|
||||
int Session::applyCommandLine( int argc, char const * const * argv ) {
|
||||
if( m_startupExceptions )
|
||||
return 1;
|
||||
if ( m_startupExceptions ) { return UnspecifiedErrorExitCode; }
|
||||
|
||||
auto result = m_cli.parse( Clara::Args( argc, argv ) );
|
||||
|
||||
@@ -215,7 +220,7 @@ namespace Catch {
|
||||
<< TextFlow::Column( result.errorMessage() ).indent( 2 )
|
||||
<< "\n\n";
|
||||
errStream->stream() << "Run with -? for usage\n\n" << std::flush;
|
||||
return MaxExitCode;
|
||||
return UnspecifiedErrorExitCode;
|
||||
}
|
||||
|
||||
if( m_configData.showHelp )
|
||||
@@ -285,8 +290,7 @@ namespace Catch {
|
||||
}
|
||||
|
||||
int Session::runInternal() {
|
||||
if( m_startupExceptions )
|
||||
return 1;
|
||||
if ( m_startupExceptions ) { return UnspecifiedErrorExitCode; }
|
||||
|
||||
if (m_configData.showHelp || m_configData.libIdentify) {
|
||||
return 0;
|
||||
@@ -297,7 +301,7 @@ namespace Catch {
|
||||
<< ") must be greater than the shard index ("
|
||||
<< m_configData.shardIndex << ")\n"
|
||||
<< std::flush;
|
||||
return 1;
|
||||
return UnspecifiedErrorExitCode;
|
||||
}
|
||||
|
||||
CATCH_TRY {
|
||||
@@ -320,7 +324,7 @@ namespace Catch {
|
||||
for ( auto const& spec : invalidSpecs ) {
|
||||
reporter->reportInvalidTestSpec( spec );
|
||||
}
|
||||
return 1;
|
||||
return InvalidTestSpecExitCode;
|
||||
}
|
||||
|
||||
|
||||
@@ -334,29 +338,29 @@ namespace Catch {
|
||||
|
||||
if ( tests.hadUnmatchedTestSpecs()
|
||||
&& m_config->warnAboutUnmatchedTestSpecs() ) {
|
||||
return 3;
|
||||
// UnmatchedTestSpecExitCode
|
||||
return UnmatchedTestSpecExitCode;
|
||||
}
|
||||
|
||||
if ( totals.testCases.total() == 0
|
||||
&& !m_config->zeroTestsCountAsSuccess() ) {
|
||||
return 2;
|
||||
return NoTestsRunExitCode;
|
||||
}
|
||||
|
||||
if ( totals.testCases.total() > 0 &&
|
||||
totals.testCases.total() == totals.testCases.skipped
|
||||
&& !m_config->zeroTestsCountAsSuccess() ) {
|
||||
return 4;
|
||||
return AllTestsSkippedExitCode;
|
||||
}
|
||||
|
||||
// Note that on unices only the lower 8 bits are usually used, clamping
|
||||
// the return value to 255 prevents false negative when some multiple
|
||||
// of 256 tests has failed
|
||||
return (std::min) (MaxExitCode, static_cast<int>(totals.assertions.failed));
|
||||
if ( totals.assertions.failed ) { return TestFailureExitCode; }
|
||||
return 0;
|
||||
|
||||
}
|
||||
#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
|
||||
catch( std::exception& ex ) {
|
||||
Catch::cerr() << ex.what() << '\n' << std::flush;
|
||||
return MaxExitCode;
|
||||
return UnspecifiedErrorExitCode;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
@@ -30,7 +30,7 @@ namespace Catch {
|
||||
return static_cast<unsigned int>(getElapsedMicroseconds()/1000);
|
||||
}
|
||||
auto Timer::getElapsedSeconds() const -> double {
|
||||
return getElapsedMicroseconds()/1000000.0;
|
||||
return static_cast<double>(getElapsedMicroseconds())/1000000.0;
|
||||
}
|
||||
|
||||
|
||||
|
@@ -22,7 +22,10 @@ namespace Detail {
|
||||
const int hexThreshold = 255;
|
||||
|
||||
struct Endianness {
|
||||
enum Arch { Big, Little };
|
||||
enum Arch : uint8_t {
|
||||
Big,
|
||||
Little
|
||||
};
|
||||
|
||||
static Arch which() {
|
||||
int one = 1;
|
||||
|
@@ -178,6 +178,15 @@
|
||||
#endif
|
||||
|
||||
|
||||
#cmakedefine CATCH_CONFIG_USE_BUILTIN_CONSTANT_P
|
||||
#cmakedefine CATCH_CONFIG_NO_USE_BUILTIN_CONSTANT_P
|
||||
|
||||
#if defined( CATCH_CONFIG_USE_BUILTIN_CONSTANT_P ) && \
|
||||
defined( CATCH_CONFIG_NO_USE_BUILTIN_CONSTANT_P )
|
||||
# error Cannot force USE_BUILTIN_CONSTANT_P to both ON and OFF
|
||||
#endif
|
||||
|
||||
|
||||
// ------
|
||||
// Simple toggle defines
|
||||
// their value is never used and they cannot be overridden
|
||||
|
@@ -36,7 +36,7 @@ namespace Catch {
|
||||
}
|
||||
|
||||
Version const& libraryVersion() {
|
||||
static Version version( 3, 7, 0, "", 0 );
|
||||
static Version version( 3, 7, 1, "", 0 );
|
||||
return version;
|
||||
}
|
||||
|
||||
|
@@ -10,6 +10,6 @@
|
||||
|
||||
#define CATCH_VERSION_MAJOR 3
|
||||
#define CATCH_VERSION_MINOR 7
|
||||
#define CATCH_VERSION_PATCH 0
|
||||
#define CATCH_VERSION_PATCH 1
|
||||
|
||||
#endif // CATCH_VERSION_MACROS_HPP_INCLUDED
|
||||
|
@@ -91,7 +91,7 @@ public:
|
||||
|
||||
template <typename InputIterator,
|
||||
typename InputSentinel,
|
||||
typename ResultType = typename std::iterator_traits<InputIterator>::value_type>
|
||||
typename ResultType = std::remove_const_t<typename std::iterator_traits<InputIterator>::value_type>>
|
||||
GeneratorWrapper<ResultType> from_range(InputIterator from, InputSentinel to) {
|
||||
return GeneratorWrapper<ResultType>(Catch::Detail::make_unique<IteratorGenerator<ResultType>>(from, to));
|
||||
}
|
||||
|
@@ -62,7 +62,7 @@
|
||||
# define CATCH_INTERNAL_SUPPRESS_SHADOW_WARNINGS \
|
||||
_Pragma( "GCC diagnostic ignored \"-Wshadow\"" )
|
||||
|
||||
# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__)
|
||||
# define CATCH_INTERNAL_CONFIG_USE_BUILTIN_CONSTANT_P
|
||||
|
||||
#endif
|
||||
|
||||
@@ -86,35 +86,13 @@
|
||||
// clang-cl defines _MSC_VER as well as __clang__, which could cause the
|
||||
// start/stop internal suppression macros to be double defined.
|
||||
#if defined(__clang__) && !defined(_MSC_VER)
|
||||
|
||||
# define CATCH_INTERNAL_CONFIG_USE_BUILTIN_CONSTANT_P
|
||||
# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic push" )
|
||||
# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic pop" )
|
||||
|
||||
#endif // __clang__ && !_MSC_VER
|
||||
|
||||
#if defined(__clang__)
|
||||
|
||||
// As of this writing, IBM XL's implementation of __builtin_constant_p has a bug
|
||||
// which results in calls to destructors being emitted for each temporary,
|
||||
// without a matching initialization. In practice, this can result in something
|
||||
// like `std::string::~string` being called on an uninitialized value.
|
||||
//
|
||||
// For example, this code will likely segfault under IBM XL:
|
||||
// ```
|
||||
// REQUIRE(std::string("12") + "34" == "1234")
|
||||
// ```
|
||||
//
|
||||
// Similarly, NVHPC's implementation of `__builtin_constant_p` has a bug which
|
||||
// results in calls to the immediately evaluated lambda expressions to be
|
||||
// reported as unevaluated lambdas.
|
||||
// https://developer.nvidia.com/nvidia_bug/3321845.
|
||||
//
|
||||
// Therefore, `CATCH_INTERNAL_IGNORE_BUT_WARN` is not implemented.
|
||||
# if !defined(__ibmxl__) && !defined(__CUDACC__) && !defined( __NVCOMPILER )
|
||||
# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__) /* NOLINT(cppcoreguidelines-pro-type-vararg, hicpp-vararg) */
|
||||
# endif
|
||||
|
||||
|
||||
# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
|
||||
_Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) \
|
||||
_Pragma( "clang diagnostic ignored \"-Wglobal-constructors\"")
|
||||
@@ -139,6 +117,27 @@
|
||||
|
||||
#endif // __clang__
|
||||
|
||||
// As of this writing, IBM XL's implementation of __builtin_constant_p has a bug
|
||||
// which results in calls to destructors being emitted for each temporary,
|
||||
// without a matching initialization. In practice, this can result in something
|
||||
// like `std::string::~string` being called on an uninitialized value.
|
||||
//
|
||||
// For example, this code will likely segfault under IBM XL:
|
||||
// ```
|
||||
// REQUIRE(std::string("12") + "34" == "1234")
|
||||
// ```
|
||||
//
|
||||
// Similarly, NVHPC's implementation of `__builtin_constant_p` has a bug which
|
||||
// results in calls to the immediately evaluated lambda expressions to be
|
||||
// reported as unevaluated lambdas.
|
||||
// https://developer.nvidia.com/nvidia_bug/3321845.
|
||||
//
|
||||
// Therefore, `CATCH_INTERNAL_IGNORE_BUT_WARN` is not implemented.
|
||||
#if defined( __ibmxl__ ) || defined( __CUDACC__ ) || defined( __NVCOMPILER )
|
||||
# define CATCH_INTERNAL_CONFIG_NO_USE_BUILTIN_CONSTANT_P
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// We know some environments not to support full POSIX signals
|
||||
@@ -362,6 +361,22 @@
|
||||
#endif
|
||||
|
||||
|
||||
// The goal of this macro is to avoid evaluation of the arguments, but
|
||||
// still have the compiler warn on problems inside...
|
||||
#if defined( CATCH_INTERNAL_CONFIG_USE_BUILTIN_CONSTANT_P ) && \
|
||||
!defined( CATCH_INTERNAL_CONFIG_NO_USE_BUILTIN_CONSTANT_P ) && !defined(CATCH_CONFIG_USE_BUILTIN_CONSTANT_P)
|
||||
#define CATCH_CONFIG_USE_BUILTIN_CONSTANT_P
|
||||
#endif
|
||||
|
||||
#if defined( CATCH_CONFIG_USE_BUILTIN_CONSTANT_P ) && \
|
||||
!defined( CATCH_CONFIG_NO_USE_BUILTIN_CONSTANT_P )
|
||||
# define CATCH_INTERNAL_IGNORE_BUT_WARN( ... ) \
|
||||
(void)__builtin_constant_p( __VA_ARGS__ ) /* NOLINT(cppcoreguidelines-pro-type-vararg, \
|
||||
hicpp-vararg) */
|
||||
#else
|
||||
# define CATCH_INTERNAL_IGNORE_BUT_WARN( ... )
|
||||
#endif
|
||||
|
||||
// Even if we do not think the compiler has that warning, we still have
|
||||
// to provide a macro that can be used by the code.
|
||||
#if !defined(CATCH_INTERNAL_START_WARNINGS_SUPPRESSION)
|
||||
@@ -398,13 +413,6 @@
|
||||
# define CATCH_INTERNAL_SUPPRESS_SHADOW_WARNINGS
|
||||
#endif
|
||||
|
||||
|
||||
// The goal of this macro is to avoid evaluation of the arguments, but
|
||||
// still have the compiler warn on problems inside...
|
||||
#if !defined(CATCH_INTERNAL_IGNORE_BUT_WARN)
|
||||
# define CATCH_INTERNAL_IGNORE_BUT_WARN(...)
|
||||
#endif
|
||||
|
||||
#if defined(__APPLE__) && defined(__apple_build_version__) && (__clang_major__ < 10)
|
||||
# undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS
|
||||
#elif defined(__clang__) && (__clang_major__ < 5)
|
||||
|
@@ -161,7 +161,7 @@ namespace {
|
||||
#endif // Windows/ ANSI/ None
|
||||
|
||||
|
||||
#if defined( CATCH_PLATFORM_LINUX ) || defined( CATCH_PLATFORM_MAC )
|
||||
#if defined( CATCH_PLATFORM_LINUX ) || defined( CATCH_PLATFORM_MAC ) || defined( __GLIBC__ )
|
||||
# define CATCH_INTERNAL_HAS_ISATTY
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
@@ -52,7 +52,7 @@ namespace {
|
||||
SimplePcg32::result_type SimplePcg32::operator()() {
|
||||
// prepare the output value
|
||||
const uint32_t xorshifted = static_cast<uint32_t>(((m_state >> 18u) ^ m_state) >> 27u);
|
||||
const auto output = rotate_right(xorshifted, m_state >> 59u);
|
||||
const auto output = rotate_right(xorshifted, static_cast<uint32_t>(m_state >> 59u));
|
||||
|
||||
// advance state
|
||||
m_state = m_state * 6364136223846793005ULL + s_inc;
|
||||
|
17
src/catch2/internal/catch_unreachable.cpp
Normal file
17
src/catch2/internal/catch_unreachable.cpp
Normal file
@@ -0,0 +1,17 @@
|
||||
|
||||
// Copyright Catch2 Authors
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE.txt or copy at
|
||||
// https://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// SPDX-License-Identifier: BSL-1.0
|
||||
|
||||
#include <catch2/internal/catch_unreachable.hpp>
|
||||
|
||||
namespace Catch {
|
||||
namespace Detail {
|
||||
|
||||
void unreachable(){}
|
||||
|
||||
}
|
||||
} // end namespace Catch
|
21
src/catch2/internal/catch_unreachable.hpp
Normal file
21
src/catch2/internal/catch_unreachable.hpp
Normal file
@@ -0,0 +1,21 @@
|
||||
|
||||
// Copyright Catch2 Authors
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE.txt or copy at
|
||||
// https://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// SPDX-License-Identifier: BSL-1.0
|
||||
#ifndef CATCH_UNREACHABLE_HPP_INCLUDED
|
||||
#define CATCH_UNREACHABLE_HPP_INCLUDED
|
||||
|
||||
namespace Catch {
|
||||
|
||||
namespace Detail {
|
||||
// TODO: explain
|
||||
[[noreturn]] void unreachable();
|
||||
|
||||
}
|
||||
|
||||
} // end namespace Catch
|
||||
|
||||
#endif // CATCH_UNREACHABLE_HPP_INCLUDED
|
@@ -13,22 +13,23 @@
|
||||
|
||||
#include <iosfwd>
|
||||
#include <vector>
|
||||
#include <cstdint>
|
||||
|
||||
namespace Catch {
|
||||
enum class XmlFormatting : uint8_t {
|
||||
enum class XmlFormatting : std::uint8_t {
|
||||
None = 0x00,
|
||||
Indent = 0x01,
|
||||
Newline = 0x02,
|
||||
};
|
||||
|
||||
constexpr XmlFormatting operator|( XmlFormatting lhs, XmlFormatting rhs ) {
|
||||
return static_cast<XmlFormatting>( static_cast<uint8_t>( lhs ) |
|
||||
static_cast<uint8_t>( rhs ) );
|
||||
return static_cast<XmlFormatting>( static_cast<std::uint8_t>( lhs ) |
|
||||
static_cast<std::uint8_t>( rhs ) );
|
||||
}
|
||||
|
||||
constexpr XmlFormatting operator&( XmlFormatting lhs, XmlFormatting rhs ) {
|
||||
return static_cast<XmlFormatting>( static_cast<uint8_t>( lhs ) &
|
||||
static_cast<uint8_t>( rhs ) );
|
||||
return static_cast<XmlFormatting>( static_cast<std::uint8_t>( lhs ) &
|
||||
static_cast<std::uint8_t>( rhs ) );
|
||||
}
|
||||
|
||||
|
||||
|
@@ -96,56 +96,65 @@ namespace Catch {
|
||||
* Creates a matcher that checks if all elements in a range are equal
|
||||
* to all elements in another range.
|
||||
*
|
||||
* Uses `std::equal_to` to do the comparison
|
||||
* Uses the provided predicate `predicate` to do the comparisons
|
||||
* (defaulting to `std::equal_to`)
|
||||
*/
|
||||
template <typename RangeLike>
|
||||
constexpr
|
||||
std::enable_if_t<!Detail::is_matcher<RangeLike>::value,
|
||||
RangeEqualsMatcher<RangeLike, std::equal_to<>>>
|
||||
RangeEquals( RangeLike&& range ) {
|
||||
return { CATCH_FORWARD( range ), std::equal_to<>{} };
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a matcher that checks if all elements in a range are equal
|
||||
* to all elements in another range.
|
||||
*
|
||||
* Uses to provided predicate `predicate` to do the comparisons
|
||||
*/
|
||||
template <typename RangeLike, typename Equality>
|
||||
template <typename RangeLike,
|
||||
typename Equality = decltype( std::equal_to<>{} )>
|
||||
constexpr
|
||||
RangeEqualsMatcher<RangeLike, Equality>
|
||||
RangeEquals( RangeLike&& range, Equality&& predicate ) {
|
||||
RangeEquals( RangeLike&& range,
|
||||
Equality&& predicate = std::equal_to<>{} ) {
|
||||
return { CATCH_FORWARD( range ), CATCH_FORWARD( predicate ) };
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a matcher that checks if all elements in a range are equal
|
||||
* to all elements in another range, in some permutation
|
||||
* to all elements in an initializer list.
|
||||
*
|
||||
* Uses `std::equal_to` to do the comparison
|
||||
* Uses the provided predicate `predicate` to do the comparisons
|
||||
* (defaulting to `std::equal_to`)
|
||||
*/
|
||||
template <typename RangeLike>
|
||||
template <typename T,
|
||||
typename Equality = decltype( std::equal_to<>{} )>
|
||||
constexpr
|
||||
std::enable_if_t<
|
||||
!Detail::is_matcher<RangeLike>::value,
|
||||
UnorderedRangeEqualsMatcher<RangeLike, std::equal_to<>>>
|
||||
UnorderedRangeEquals( RangeLike&& range ) {
|
||||
return { CATCH_FORWARD( range ), std::equal_to<>{} };
|
||||
RangeEqualsMatcher<std::initializer_list<T>, Equality>
|
||||
RangeEquals( std::initializer_list<T> range,
|
||||
Equality&& predicate = std::equal_to<>{} ) {
|
||||
return { range, CATCH_FORWARD( predicate ) };
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a matcher that checks if all elements in a range are equal
|
||||
* to all elements in another range, in some permutation.
|
||||
*
|
||||
* Uses to provided predicate `predicate` to do the comparisons
|
||||
* Uses the provided predicate `predicate` to do the comparisons
|
||||
* (defaulting to `std::equal_to`)
|
||||
*/
|
||||
template <typename RangeLike, typename Equality>
|
||||
template <typename RangeLike,
|
||||
typename Equality = decltype( std::equal_to<>{} )>
|
||||
constexpr
|
||||
UnorderedRangeEqualsMatcher<RangeLike, Equality>
|
||||
UnorderedRangeEquals( RangeLike&& range, Equality&& predicate ) {
|
||||
UnorderedRangeEquals( RangeLike&& range,
|
||||
Equality&& predicate = std::equal_to<>{} ) {
|
||||
return { CATCH_FORWARD( range ), CATCH_FORWARD( predicate ) };
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a matcher that checks if all elements in a range are equal
|
||||
* to all elements in an initializer list, in some permutation.
|
||||
*
|
||||
* Uses the provided predicate `predicate` to do the comparisons
|
||||
* (defaulting to `std::equal_to`)
|
||||
*/
|
||||
template <typename T,
|
||||
typename Equality = decltype( std::equal_to<>{} )>
|
||||
constexpr
|
||||
UnorderedRangeEqualsMatcher<std::initializer_list<T>, Equality>
|
||||
UnorderedRangeEquals( std::initializer_list<T> range,
|
||||
Equality&& predicate = std::equal_to<>{} ) {
|
||||
return { range, CATCH_FORWARD( predicate ) };
|
||||
}
|
||||
} // namespace Matchers
|
||||
} // namespace Catch
|
||||
|
||||
|
@@ -214,7 +214,7 @@ struct RowBreak {};
|
||||
struct OutputFlush {};
|
||||
|
||||
class Duration {
|
||||
enum class Unit {
|
||||
enum class Unit : uint8_t {
|
||||
Auto,
|
||||
Nanoseconds,
|
||||
Microseconds,
|
||||
@@ -286,7 +286,10 @@ public:
|
||||
};
|
||||
} // end anon namespace
|
||||
|
||||
enum class Justification { Left, Right };
|
||||
enum class Justification : uint8_t {
|
||||
Left,
|
||||
Right
|
||||
};
|
||||
|
||||
struct ColumnInfo {
|
||||
std::string name;
|
||||
|
@@ -8,7 +8,6 @@ project( Catch2ExtraTests LANGUAGES CXX )
|
||||
|
||||
message( STATUS "Extra tests included" )
|
||||
|
||||
|
||||
add_test(
|
||||
NAME TestShardingIntegration
|
||||
COMMAND ${PYTHON_EXECUTABLE} ${CATCH_DIR}/tests/TestScripts/testSharding.py $<TARGET_FILE:SelfTest>
|
||||
|
@@ -136,8 +136,8 @@ Nor would this
|
||||
:test-result: SKIP Empty generators can SKIP in constructor
|
||||
:test-result: PASS Empty stream name opens cout stream
|
||||
:test-result: FAIL EndsWith string matcher
|
||||
:test-result: PASS Enums can quickly have stringification enabled using REGISTER_ENUM
|
||||
:test-result: PASS Enums in namespaces can quickly have stringification enabled using REGISTER_ENUM
|
||||
:test-result: PASS Enums can quickly have stringification enabled using CATCH_REGISTER_ENUM
|
||||
:test-result: PASS Enums in namespaces can quickly have stringification enabled using CATCH_REGISTER_ENUM
|
||||
:test-result: PASS Epsilon only applies to Approx's value
|
||||
:test-result: XFAIL Equality checks that should fail
|
||||
:test-result: PASS Equality checks that should succeed
|
||||
|
@@ -134,8 +134,8 @@
|
||||
:test-result: SKIP Empty generators can SKIP in constructor
|
||||
:test-result: PASS Empty stream name opens cout stream
|
||||
:test-result: FAIL EndsWith string matcher
|
||||
:test-result: PASS Enums can quickly have stringification enabled using REGISTER_ENUM
|
||||
:test-result: PASS Enums in namespaces can quickly have stringification enabled using REGISTER_ENUM
|
||||
:test-result: PASS Enums can quickly have stringification enabled using CATCH_REGISTER_ENUM
|
||||
:test-result: PASS Enums in namespaces can quickly have stringification enabled using CATCH_REGISTER_ENUM
|
||||
:test-result: PASS Epsilon only applies to Approx's value
|
||||
:test-result: XFAIL Equality checks that should fail
|
||||
:test-result: PASS Equality checks that should succeed
|
||||
|
@@ -2284,6 +2284,8 @@ MatchersRanges.tests.cpp:<line number>: passed: vector_a, RangeEquals( vector_a_
|
||||
MatchersRanges.tests.cpp:<line number>: passed: vector_a, !RangeEquals( vector_b, close_enough ) for: { 1, 2, 3 } not elements are { 3, 3, 4 }
|
||||
MatchersRanges.tests.cpp:<line number>: passed: needs_adl1, RangeEquals( needs_adl2 ) for: { 1, 2, 3, 4, 5 } elements are { 1, 2, 3, 4, 5 }
|
||||
MatchersRanges.tests.cpp:<line number>: passed: needs_adl1, RangeEquals( needs_adl3, []( int l, int r ) { return l + 1 == r; } ) for: { 1, 2, 3, 4, 5 } elements are { 2, 3, 4, 5, 6 }
|
||||
MatchersRanges.tests.cpp:<line number>: passed: array_a, RangeEquals( { 1, 2, 3 } ) for: { 1, 2, 3 } elements are { 1, 2, 3 }
|
||||
MatchersRanges.tests.cpp:<line number>: passed: array_a, RangeEquals( { 2, 4, 6 }, []( int l, int r ) { return l * 2 == r; } ) for: { 1, 2, 3 } elements are { 2, 4, 6 }
|
||||
MatchersRanges.tests.cpp:<line number>: passed: mocked1, !RangeEquals( arr ) for: { 1, 2, 3, 4 } not elements are { 1, 2, 4, 4 }
|
||||
MatchersRanges.tests.cpp:<line number>: passed: mocked1.m_derefed[0] for: true
|
||||
MatchersRanges.tests.cpp:<line number>: passed: mocked1.m_derefed[1] for: true
|
||||
@@ -2304,6 +2306,8 @@ MatchersRanges.tests.cpp:<line number>: passed: vector_a, !UnorderedRangeEquals(
|
||||
MatchersRanges.tests.cpp:<line number>: passed: vector_a, UnorderedRangeEquals( vector_a_plus_1, close_enough ) for: { 1, 10, 20 } unordered elements are { 11, 21, 2 }
|
||||
MatchersRanges.tests.cpp:<line number>: passed: vector_a, !UnorderedRangeEquals( vector_b, close_enough ) for: { 1, 10, 21 } not unordered elements are { 11, 21, 3 }
|
||||
MatchersRanges.tests.cpp:<line number>: passed: needs_adl1, UnorderedRangeEquals( needs_adl2 ) for: { 1, 2, 3, 4, 5 } unordered elements are { 1, 2, 3, 4, 5 }
|
||||
MatchersRanges.tests.cpp:<line number>: passed: array_a, UnorderedRangeEquals( { 10, 20, 1 } ) for: { 1, 10, 20 } unordered elements are { 10, 20, 1 }
|
||||
MatchersRanges.tests.cpp:<line number>: passed: array_a, UnorderedRangeEquals( { 11, 21, 2 }, []( int l, int r ) { return std::abs( l - r ) <= 1; } ) for: { 1, 10, 20 } unordered elements are { 11, 21, 2 }
|
||||
MatchersRanges.tests.cpp:<line number>: passed: empty_vec, SizeIs(0) for: { } has size == 0
|
||||
MatchersRanges.tests.cpp:<line number>: passed: empty_vec, !SizeIs(2) for: { } not has size == 2
|
||||
MatchersRanges.tests.cpp:<line number>: passed: empty_vec, SizeIs(Lt(2)) for: { } size matches is less than 2
|
||||
@@ -2851,6 +2855,6 @@ InternalBenchmark.tests.cpp:<line number>: passed: q3 == 23. for: 23.0 == 23.0
|
||||
Misc.tests.cpp:<line number>: passed:
|
||||
Misc.tests.cpp:<line number>: passed:
|
||||
test cases: 419 | 313 passed | 86 failed | 6 skipped | 14 failed as expected
|
||||
assertions: 2265 | 2083 passed | 147 failed | 35 failed as expected
|
||||
assertions: 2269 | 2087 passed | 147 failed | 35 failed as expected
|
||||
|
||||
|
||||
|
@@ -2277,6 +2277,8 @@ MatchersRanges.tests.cpp:<line number>: passed: vector_a, RangeEquals( vector_a_
|
||||
MatchersRanges.tests.cpp:<line number>: passed: vector_a, !RangeEquals( vector_b, close_enough ) for: { 1, 2, 3 } not elements are { 3, 3, 4 }
|
||||
MatchersRanges.tests.cpp:<line number>: passed: needs_adl1, RangeEquals( needs_adl2 ) for: { 1, 2, 3, 4, 5 } elements are { 1, 2, 3, 4, 5 }
|
||||
MatchersRanges.tests.cpp:<line number>: passed: needs_adl1, RangeEquals( needs_adl3, []( int l, int r ) { return l + 1 == r; } ) for: { 1, 2, 3, 4, 5 } elements are { 2, 3, 4, 5, 6 }
|
||||
MatchersRanges.tests.cpp:<line number>: passed: array_a, RangeEquals( { 1, 2, 3 } ) for: { 1, 2, 3 } elements are { 1, 2, 3 }
|
||||
MatchersRanges.tests.cpp:<line number>: passed: array_a, RangeEquals( { 2, 4, 6 }, []( int l, int r ) { return l * 2 == r; } ) for: { 1, 2, 3 } elements are { 2, 4, 6 }
|
||||
MatchersRanges.tests.cpp:<line number>: passed: mocked1, !RangeEquals( arr ) for: { 1, 2, 3, 4 } not elements are { 1, 2, 4, 4 }
|
||||
MatchersRanges.tests.cpp:<line number>: passed: mocked1.m_derefed[0] for: true
|
||||
MatchersRanges.tests.cpp:<line number>: passed: mocked1.m_derefed[1] for: true
|
||||
@@ -2297,6 +2299,8 @@ MatchersRanges.tests.cpp:<line number>: passed: vector_a, !UnorderedRangeEquals(
|
||||
MatchersRanges.tests.cpp:<line number>: passed: vector_a, UnorderedRangeEquals( vector_a_plus_1, close_enough ) for: { 1, 10, 20 } unordered elements are { 11, 21, 2 }
|
||||
MatchersRanges.tests.cpp:<line number>: passed: vector_a, !UnorderedRangeEquals( vector_b, close_enough ) for: { 1, 10, 21 } not unordered elements are { 11, 21, 3 }
|
||||
MatchersRanges.tests.cpp:<line number>: passed: needs_adl1, UnorderedRangeEquals( needs_adl2 ) for: { 1, 2, 3, 4, 5 } unordered elements are { 1, 2, 3, 4, 5 }
|
||||
MatchersRanges.tests.cpp:<line number>: passed: array_a, UnorderedRangeEquals( { 10, 20, 1 } ) for: { 1, 10, 20 } unordered elements are { 10, 20, 1 }
|
||||
MatchersRanges.tests.cpp:<line number>: passed: array_a, UnorderedRangeEquals( { 11, 21, 2 }, []( int l, int r ) { return std::abs( l - r ) <= 1; } ) for: { 1, 10, 20 } unordered elements are { 11, 21, 2 }
|
||||
MatchersRanges.tests.cpp:<line number>: passed: empty_vec, SizeIs(0) for: { } has size == 0
|
||||
MatchersRanges.tests.cpp:<line number>: passed: empty_vec, !SizeIs(2) for: { } not has size == 2
|
||||
MatchersRanges.tests.cpp:<line number>: passed: empty_vec, SizeIs(Lt(2)) for: { } size matches is less than 2
|
||||
@@ -2840,6 +2844,6 @@ InternalBenchmark.tests.cpp:<line number>: passed: q3 == 23. for: 23.0 == 23.0
|
||||
Misc.tests.cpp:<line number>: passed:
|
||||
Misc.tests.cpp:<line number>: passed:
|
||||
test cases: 419 | 313 passed | 86 failed | 6 skipped | 14 failed as expected
|
||||
assertions: 2265 | 2083 passed | 147 failed | 35 failed as expected
|
||||
assertions: 2269 | 2087 passed | 147 failed | 35 failed as expected
|
||||
|
||||
|
||||
|
@@ -1611,5 +1611,5 @@ due to unexpected exception with message:
|
||||
|
||||
===============================================================================
|
||||
test cases: 419 | 327 passed | 71 failed | 7 skipped | 14 failed as expected
|
||||
assertions: 2248 | 2083 passed | 130 failed | 35 failed as expected
|
||||
assertions: 2252 | 2087 passed | 130 failed | 35 failed as expected
|
||||
|
||||
|
@@ -4083,7 +4083,7 @@ with expansion:
|
||||
insensitive)
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
Enums can quickly have stringification enabled using REGISTER_ENUM
|
||||
Enums can quickly have stringification enabled using CATCH_REGISTER_ENUM
|
||||
-------------------------------------------------------------------------------
|
||||
EnumToString.tests.cpp:<line number>
|
||||
...............................................................................
|
||||
@@ -4117,7 +4117,7 @@ with expansion:
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
Enums in namespaces can quickly have stringification enabled using
|
||||
REGISTER_ENUM
|
||||
CATCH_REGISTER_ENUM
|
||||
-------------------------------------------------------------------------------
|
||||
EnumToString.tests.cpp:<line number>
|
||||
...............................................................................
|
||||
@@ -14981,6 +14981,23 @@ MatchersRanges.tests.cpp:<line number>: PASSED:
|
||||
with expansion:
|
||||
{ 1, 2, 3, 4, 5 } elements are { 2, 3, 4, 5, 6 }
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
Usage of RangeEquals range matcher
|
||||
Compare against std::initializer_list
|
||||
-------------------------------------------------------------------------------
|
||||
MatchersRanges.tests.cpp:<line number>
|
||||
...............................................................................
|
||||
|
||||
MatchersRanges.tests.cpp:<line number>: PASSED:
|
||||
REQUIRE_THAT( array_a, RangeEquals( { 1, 2, 3 } ) )
|
||||
with expansion:
|
||||
{ 1, 2, 3 } elements are { 1, 2, 3 }
|
||||
|
||||
MatchersRanges.tests.cpp:<line number>: PASSED:
|
||||
REQUIRE_THAT( array_a, RangeEquals( { 2, 4, 6 }, []( int l, int r ) { return l * 2 == r; } ) )
|
||||
with expansion:
|
||||
{ 1, 2, 3 } elements are { 2, 4, 6 }
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
Usage of RangeEquals range matcher
|
||||
Check short-circuiting behaviour
|
||||
@@ -15168,6 +15185,23 @@ MatchersRanges.tests.cpp:<line number>: PASSED:
|
||||
with expansion:
|
||||
{ 1, 2, 3, 4, 5 } unordered elements are { 1, 2, 3, 4, 5 }
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
Usage of UnorderedRangeEquals range matcher
|
||||
Compare against std::initializer_list
|
||||
-------------------------------------------------------------------------------
|
||||
MatchersRanges.tests.cpp:<line number>
|
||||
...............................................................................
|
||||
|
||||
MatchersRanges.tests.cpp:<line number>: PASSED:
|
||||
REQUIRE_THAT( array_a, UnorderedRangeEquals( { 10, 20, 1 } ) )
|
||||
with expansion:
|
||||
{ 1, 10, 20 } unordered elements are { 10, 20, 1 }
|
||||
|
||||
MatchersRanges.tests.cpp:<line number>: PASSED:
|
||||
REQUIRE_THAT( array_a, UnorderedRangeEquals( { 11, 21, 2 }, []( int l, int r ) { return std::abs( l - r ) <= 1; } ) )
|
||||
with expansion:
|
||||
{ 1, 10, 20 } unordered elements are { 11, 21, 2 }
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
Usage of the SizeIs range matcher
|
||||
Some with stdlib containers
|
||||
@@ -18979,5 +19013,5 @@ Misc.tests.cpp:<line number>: PASSED:
|
||||
|
||||
===============================================================================
|
||||
test cases: 419 | 313 passed | 86 failed | 6 skipped | 14 failed as expected
|
||||
assertions: 2265 | 2083 passed | 147 failed | 35 failed as expected
|
||||
assertions: 2269 | 2087 passed | 147 failed | 35 failed as expected
|
||||
|
||||
|
@@ -4081,7 +4081,7 @@ with expansion:
|
||||
insensitive)
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
Enums can quickly have stringification enabled using REGISTER_ENUM
|
||||
Enums can quickly have stringification enabled using CATCH_REGISTER_ENUM
|
||||
-------------------------------------------------------------------------------
|
||||
EnumToString.tests.cpp:<line number>
|
||||
...............................................................................
|
||||
@@ -4115,7 +4115,7 @@ with expansion:
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
Enums in namespaces can quickly have stringification enabled using
|
||||
REGISTER_ENUM
|
||||
CATCH_REGISTER_ENUM
|
||||
-------------------------------------------------------------------------------
|
||||
EnumToString.tests.cpp:<line number>
|
||||
...............................................................................
|
||||
@@ -14974,6 +14974,23 @@ MatchersRanges.tests.cpp:<line number>: PASSED:
|
||||
with expansion:
|
||||
{ 1, 2, 3, 4, 5 } elements are { 2, 3, 4, 5, 6 }
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
Usage of RangeEquals range matcher
|
||||
Compare against std::initializer_list
|
||||
-------------------------------------------------------------------------------
|
||||
MatchersRanges.tests.cpp:<line number>
|
||||
...............................................................................
|
||||
|
||||
MatchersRanges.tests.cpp:<line number>: PASSED:
|
||||
REQUIRE_THAT( array_a, RangeEquals( { 1, 2, 3 } ) )
|
||||
with expansion:
|
||||
{ 1, 2, 3 } elements are { 1, 2, 3 }
|
||||
|
||||
MatchersRanges.tests.cpp:<line number>: PASSED:
|
||||
REQUIRE_THAT( array_a, RangeEquals( { 2, 4, 6 }, []( int l, int r ) { return l * 2 == r; } ) )
|
||||
with expansion:
|
||||
{ 1, 2, 3 } elements are { 2, 4, 6 }
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
Usage of RangeEquals range matcher
|
||||
Check short-circuiting behaviour
|
||||
@@ -15161,6 +15178,23 @@ MatchersRanges.tests.cpp:<line number>: PASSED:
|
||||
with expansion:
|
||||
{ 1, 2, 3, 4, 5 } unordered elements are { 1, 2, 3, 4, 5 }
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
Usage of UnorderedRangeEquals range matcher
|
||||
Compare against std::initializer_list
|
||||
-------------------------------------------------------------------------------
|
||||
MatchersRanges.tests.cpp:<line number>
|
||||
...............................................................................
|
||||
|
||||
MatchersRanges.tests.cpp:<line number>: PASSED:
|
||||
REQUIRE_THAT( array_a, UnorderedRangeEquals( { 10, 20, 1 } ) )
|
||||
with expansion:
|
||||
{ 1, 10, 20 } unordered elements are { 10, 20, 1 }
|
||||
|
||||
MatchersRanges.tests.cpp:<line number>: PASSED:
|
||||
REQUIRE_THAT( array_a, UnorderedRangeEquals( { 11, 21, 2 }, []( int l, int r ) { return std::abs( l - r ) <= 1; } ) )
|
||||
with expansion:
|
||||
{ 1, 10, 20 } unordered elements are { 11, 21, 2 }
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
Usage of the SizeIs range matcher
|
||||
Some with stdlib containers
|
||||
@@ -18968,5 +19002,5 @@ Misc.tests.cpp:<line number>: PASSED:
|
||||
|
||||
===============================================================================
|
||||
test cases: 419 | 313 passed | 86 failed | 6 skipped | 14 failed as expected
|
||||
assertions: 2265 | 2083 passed | 147 failed | 35 failed as expected
|
||||
assertions: 2269 | 2087 passed | 147 failed | 35 failed as expected
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<testsuitesloose text artifact
|
||||
>
|
||||
<testsuite name="<exe-name>" errors="17" failures="130" skipped="12" tests="2277" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
|
||||
<testsuite name="<exe-name>" errors="17" failures="130" skipped="12" tests="2281" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
|
||||
<properties>
|
||||
<property name="random-seed" value="1"/>
|
||||
<property name="filters" value=""*" ~[!nonportable] ~[!benchmark] ~[approvals]"/>
|
||||
@@ -521,8 +521,8 @@ with expansion:
|
||||
at Matchers.tests.cpp:<line number>
|
||||
</failure>
|
||||
</testcase>
|
||||
<testcase classname="<exe-name>.global" name="Enums can quickly have stringification enabled using REGISTER_ENUM" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Enums in namespaces can quickly have stringification enabled using REGISTER_ENUM" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Enums can quickly have stringification enabled using CATCH_REGISTER_ENUM" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Enums in namespaces can quickly have stringification enabled using CATCH_REGISTER_ENUM" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Epsilon only applies to Approx's value" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Equality checks that should fail" time="{duration}" status="run">
|
||||
<skipped message="TEST_CASE tagged with !mayfail"/>
|
||||
@@ -1652,6 +1652,7 @@ at Exception.tests.cpp:<line number>
|
||||
<testcase classname="<exe-name>.global" name="Usage of RangeEquals range matcher/Custom predicate/Two equal non-empty containers (close enough)" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Usage of RangeEquals range matcher/Custom predicate/Two non-equal non-empty containers (close enough)" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Usage of RangeEquals range matcher/Ranges that need ADL begin/end" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Usage of RangeEquals range matcher/Compare against std::initializer_list" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Usage of RangeEquals range matcher/Check short-circuiting behaviour" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Usage of RangeEquals range matcher/Check short-circuiting behaviour/Check short-circuits on failure" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Usage of RangeEquals range matcher/Check short-circuiting behaviour/All elements are checked on success" time="{duration}" status="run"/>
|
||||
@@ -1667,6 +1668,7 @@ at Exception.tests.cpp:<line number>
|
||||
<testcase classname="<exe-name>.global" name="Usage of UnorderedRangeEquals range matcher/Custom predicate/Two equal non-empty containers (close enough)" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Usage of UnorderedRangeEquals range matcher/Custom predicate/Two non-equal non-empty containers (close enough)" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Usage of UnorderedRangeEquals range matcher/Ranges that need ADL begin/end" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Usage of UnorderedRangeEquals range matcher/Compare against std::initializer_list" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Usage of the SizeIs range matcher" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Usage of the SizeIs range matcher/Some with stdlib containers" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Usage of the SizeIs range matcher/Type requires ADL found size free function" time="{duration}" status="run"/>
|
||||
|
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<testsuites>
|
||||
<testsuite name="<exe-name>" errors="17" failures="130" skipped="12" tests="2277" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
|
||||
<testsuite name="<exe-name>" errors="17" failures="130" skipped="12" tests="2281" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
|
||||
<properties>
|
||||
<property name="random-seed" value="1"/>
|
||||
<property name="filters" value=""*" ~[!nonportable] ~[!benchmark] ~[approvals]"/>
|
||||
@@ -520,8 +520,8 @@ with expansion:
|
||||
at Matchers.tests.cpp:<line number>
|
||||
</failure>
|
||||
</testcase>
|
||||
<testcase classname="<exe-name>.global" name="Enums can quickly have stringification enabled using REGISTER_ENUM" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Enums in namespaces can quickly have stringification enabled using REGISTER_ENUM" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Enums can quickly have stringification enabled using CATCH_REGISTER_ENUM" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Enums in namespaces can quickly have stringification enabled using CATCH_REGISTER_ENUM" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Epsilon only applies to Approx's value" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Equality checks that should fail" time="{duration}" status="run">
|
||||
<skipped message="TEST_CASE tagged with !mayfail"/>
|
||||
@@ -1651,6 +1651,7 @@ at Exception.tests.cpp:<line number>
|
||||
<testcase classname="<exe-name>.global" name="Usage of RangeEquals range matcher/Custom predicate/Two equal non-empty containers (close enough)" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Usage of RangeEquals range matcher/Custom predicate/Two non-equal non-empty containers (close enough)" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Usage of RangeEquals range matcher/Ranges that need ADL begin/end" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Usage of RangeEquals range matcher/Compare against std::initializer_list" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Usage of RangeEquals range matcher/Check short-circuiting behaviour" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Usage of RangeEquals range matcher/Check short-circuiting behaviour/Check short-circuits on failure" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Usage of RangeEquals range matcher/Check short-circuiting behaviour/All elements are checked on success" time="{duration}" status="run"/>
|
||||
@@ -1666,6 +1667,7 @@ at Exception.tests.cpp:<line number>
|
||||
<testcase classname="<exe-name>.global" name="Usage of UnorderedRangeEquals range matcher/Custom predicate/Two equal non-empty containers (close enough)" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Usage of UnorderedRangeEquals range matcher/Custom predicate/Two non-equal non-empty containers (close enough)" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Usage of UnorderedRangeEquals range matcher/Ranges that need ADL begin/end" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Usage of UnorderedRangeEquals range matcher/Compare against std::initializer_list" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Usage of the SizeIs range matcher" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Usage of the SizeIs range matcher/Some with stdlib containers" time="{duration}" status="run"/>
|
||||
<testcase classname="<exe-name>.global" name="Usage of the SizeIs range matcher/Type requires ADL found size free function" time="{duration}" status="run"/>
|
||||
|
@@ -998,8 +998,8 @@ at Decomposition.tests.cpp:<line number>
|
||||
</testCase>
|
||||
</file>
|
||||
<file path="tests/<exe-name>/UsageTests/EnumToString.tests.cpp">
|
||||
<testCase name="Enums can quickly have stringification enabled using REGISTER_ENUM" duration="{duration}"/>
|
||||
<testCase name="Enums in namespaces can quickly have stringification enabled using REGISTER_ENUM" duration="{duration}"/>
|
||||
<testCase name="Enums can quickly have stringification enabled using CATCH_REGISTER_ENUM" duration="{duration}"/>
|
||||
<testCase name="Enums in namespaces can quickly have stringification enabled using CATCH_REGISTER_ENUM" duration="{duration}"/>
|
||||
<testCase name="toString(enum class w/operator<<)" duration="{duration}"/>
|
||||
<testCase name="toString(enum class)" duration="{duration}"/>
|
||||
<testCase name="toString(enum w/operator<<)" duration="{duration}"/>
|
||||
@@ -1607,6 +1607,7 @@ at Matchers.tests.cpp:<line number>
|
||||
<testCase name="Usage of RangeEquals range matcher/Custom predicate/Two equal non-empty containers (close enough)" duration="{duration}"/>
|
||||
<testCase name="Usage of RangeEquals range matcher/Custom predicate/Two non-equal non-empty containers (close enough)" duration="{duration}"/>
|
||||
<testCase name="Usage of RangeEquals range matcher/Ranges that need ADL begin/end" duration="{duration}"/>
|
||||
<testCase name="Usage of RangeEquals range matcher/Compare against std::initializer_list" duration="{duration}"/>
|
||||
<testCase name="Usage of RangeEquals range matcher/Check short-circuiting behaviour" duration="{duration}"/>
|
||||
<testCase name="Usage of RangeEquals range matcher/Check short-circuiting behaviour/Check short-circuits on failure" duration="{duration}"/>
|
||||
<testCase name="Usage of RangeEquals range matcher/Check short-circuiting behaviour/All elements are checked on success" duration="{duration}"/>
|
||||
@@ -1622,6 +1623,7 @@ at Matchers.tests.cpp:<line number>
|
||||
<testCase name="Usage of UnorderedRangeEquals range matcher/Custom predicate/Two equal non-empty containers (close enough)" duration="{duration}"/>
|
||||
<testCase name="Usage of UnorderedRangeEquals range matcher/Custom predicate/Two non-equal non-empty containers (close enough)" duration="{duration}"/>
|
||||
<testCase name="Usage of UnorderedRangeEquals range matcher/Ranges that need ADL begin/end" duration="{duration}"/>
|
||||
<testCase name="Usage of UnorderedRangeEquals range matcher/Compare against std::initializer_list" duration="{duration}"/>
|
||||
<testCase name="Usage of the SizeIs range matcher" duration="{duration}"/>
|
||||
<testCase name="Usage of the SizeIs range matcher/Some with stdlib containers" duration="{duration}"/>
|
||||
<testCase name="Usage of the SizeIs range matcher/Type requires ADL found size free function" duration="{duration}"/>
|
||||
|
@@ -997,8 +997,8 @@ at Decomposition.tests.cpp:<line number>
|
||||
</testCase>
|
||||
</file>
|
||||
<file path="tests/<exe-name>/UsageTests/EnumToString.tests.cpp">
|
||||
<testCase name="Enums can quickly have stringification enabled using REGISTER_ENUM" duration="{duration}"/>
|
||||
<testCase name="Enums in namespaces can quickly have stringification enabled using REGISTER_ENUM" duration="{duration}"/>
|
||||
<testCase name="Enums can quickly have stringification enabled using CATCH_REGISTER_ENUM" duration="{duration}"/>
|
||||
<testCase name="Enums in namespaces can quickly have stringification enabled using CATCH_REGISTER_ENUM" duration="{duration}"/>
|
||||
<testCase name="toString(enum class w/operator<<)" duration="{duration}"/>
|
||||
<testCase name="toString(enum class)" duration="{duration}"/>
|
||||
<testCase name="toString(enum w/operator<<)" duration="{duration}"/>
|
||||
@@ -1606,6 +1606,7 @@ at Matchers.tests.cpp:<line number>
|
||||
<testCase name="Usage of RangeEquals range matcher/Custom predicate/Two equal non-empty containers (close enough)" duration="{duration}"/>
|
||||
<testCase name="Usage of RangeEquals range matcher/Custom predicate/Two non-equal non-empty containers (close enough)" duration="{duration}"/>
|
||||
<testCase name="Usage of RangeEquals range matcher/Ranges that need ADL begin/end" duration="{duration}"/>
|
||||
<testCase name="Usage of RangeEquals range matcher/Compare against std::initializer_list" duration="{duration}"/>
|
||||
<testCase name="Usage of RangeEquals range matcher/Check short-circuiting behaviour" duration="{duration}"/>
|
||||
<testCase name="Usage of RangeEquals range matcher/Check short-circuiting behaviour/Check short-circuits on failure" duration="{duration}"/>
|
||||
<testCase name="Usage of RangeEquals range matcher/Check short-circuiting behaviour/All elements are checked on success" duration="{duration}"/>
|
||||
@@ -1621,6 +1622,7 @@ at Matchers.tests.cpp:<line number>
|
||||
<testCase name="Usage of UnorderedRangeEquals range matcher/Custom predicate/Two equal non-empty containers (close enough)" duration="{duration}"/>
|
||||
<testCase name="Usage of UnorderedRangeEquals range matcher/Custom predicate/Two non-equal non-empty containers (close enough)" duration="{duration}"/>
|
||||
<testCase name="Usage of UnorderedRangeEquals range matcher/Ranges that need ADL begin/end" duration="{duration}"/>
|
||||
<testCase name="Usage of UnorderedRangeEquals range matcher/Compare against std::initializer_list" duration="{duration}"/>
|
||||
<testCase name="Usage of the SizeIs range matcher" duration="{duration}"/>
|
||||
<testCase name="Usage of the SizeIs range matcher/Some with stdlib containers" duration="{duration}"/>
|
||||
<testCase name="Usage of the SizeIs range matcher/Type requires ADL found size free function" duration="{duration}"/>
|
||||
|
@@ -1004,19 +1004,19 @@ ok {test-number} - Catch::makeStream( "" )->isConsole() for: true
|
||||
not ok {test-number} - testStringForMatching(), EndsWith( "Substring" ) for: "this string contains 'abc' as a substring" ends with: "Substring"
|
||||
# EndsWith string matcher
|
||||
not ok {test-number} - testStringForMatching(), EndsWith( "this", Catch::CaseSensitive::No ) for: "this string contains 'abc' as a substring" ends with: "this" (case insensitive)
|
||||
# Enums can quickly have stringification enabled using REGISTER_ENUM
|
||||
# Enums can quickly have stringification enabled using CATCH_REGISTER_ENUM
|
||||
ok {test-number} - stringify( EnumClass3::Value1 ) == "Value1" for: "Value1" == "Value1"
|
||||
# Enums can quickly have stringification enabled using REGISTER_ENUM
|
||||
# Enums can quickly have stringification enabled using CATCH_REGISTER_ENUM
|
||||
ok {test-number} - stringify( EnumClass3::Value2 ) == "Value2" for: "Value2" == "Value2"
|
||||
# Enums can quickly have stringification enabled using REGISTER_ENUM
|
||||
# Enums can quickly have stringification enabled using CATCH_REGISTER_ENUM
|
||||
ok {test-number} - stringify( EnumClass3::Value3 ) == "Value3" for: "Value3" == "Value3"
|
||||
# Enums can quickly have stringification enabled using REGISTER_ENUM
|
||||
# Enums can quickly have stringification enabled using CATCH_REGISTER_ENUM
|
||||
ok {test-number} - stringify( EnumClass3::Value4 ) == "{** unexpected enum value **}" for: "{** unexpected enum value **}" == "{** unexpected enum value **}"
|
||||
# Enums can quickly have stringification enabled using REGISTER_ENUM
|
||||
# Enums can quickly have stringification enabled using CATCH_REGISTER_ENUM
|
||||
ok {test-number} - stringify( ec3 ) == "Value2" for: "Value2" == "Value2"
|
||||
# Enums in namespaces can quickly have stringification enabled using REGISTER_ENUM
|
||||
# Enums in namespaces can quickly have stringification enabled using CATCH_REGISTER_ENUM
|
||||
ok {test-number} - stringify( Bikeshed::Colours::Red ) == "Red" for: "Red" == "Red"
|
||||
# Enums in namespaces can quickly have stringification enabled using REGISTER_ENUM
|
||||
# Enums in namespaces can quickly have stringification enabled using CATCH_REGISTER_ENUM
|
||||
ok {test-number} - stringify( Bikeshed::Colours::Blue ) == "Blue" for: "Blue" == "Blue"
|
||||
# Epsilon only applies to Approx's value
|
||||
ok {test-number} - 101.01 != Approx(100).epsilon(0.01) for: 101.01000000000000512 != Approx( 100.0 )
|
||||
@@ -3580,6 +3580,10 @@ ok {test-number} - needs_adl1, RangeEquals( needs_adl2 ) for: { 1, 2, 3, 4, 5 }
|
||||
# Usage of RangeEquals range matcher
|
||||
ok {test-number} - needs_adl1, RangeEquals( needs_adl3, []( int l, int r ) { return l + 1 == r; } ) for: { 1, 2, 3, 4, 5 } elements are { 2, 3, 4, 5, 6 }
|
||||
# Usage of RangeEquals range matcher
|
||||
ok {test-number} - array_a, RangeEquals( { 1, 2, 3 } ) for: { 1, 2, 3 } elements are { 1, 2, 3 }
|
||||
# Usage of RangeEquals range matcher
|
||||
ok {test-number} - array_a, RangeEquals( { 2, 4, 6 }, []( int l, int r ) { return l * 2 == r; } ) for: { 1, 2, 3 } elements are { 2, 4, 6 }
|
||||
# Usage of RangeEquals range matcher
|
||||
ok {test-number} - mocked1, !RangeEquals( arr ) for: { 1, 2, 3, 4 } not elements are { 1, 2, 4, 4 }
|
||||
# Usage of RangeEquals range matcher
|
||||
ok {test-number} - mocked1.m_derefed[0] for: true
|
||||
@@ -3619,6 +3623,10 @@ ok {test-number} - vector_a, UnorderedRangeEquals( vector_a_plus_1, close_enough
|
||||
ok {test-number} - vector_a, !UnorderedRangeEquals( vector_b, close_enough ) for: { 1, 10, 21 } not unordered elements are { 11, 21, 3 }
|
||||
# Usage of UnorderedRangeEquals range matcher
|
||||
ok {test-number} - needs_adl1, UnorderedRangeEquals( needs_adl2 ) for: { 1, 2, 3, 4, 5 } unordered elements are { 1, 2, 3, 4, 5 }
|
||||
# Usage of UnorderedRangeEquals range matcher
|
||||
ok {test-number} - array_a, UnorderedRangeEquals( { 10, 20, 1 } ) for: { 1, 10, 20 } unordered elements are { 10, 20, 1 }
|
||||
# Usage of UnorderedRangeEquals range matcher
|
||||
ok {test-number} - array_a, UnorderedRangeEquals( { 11, 21, 2 }, []( int l, int r ) { return std::abs( l - r ) <= 1; } ) for: { 1, 10, 20 } unordered elements are { 11, 21, 2 }
|
||||
# Usage of the SizeIs range matcher
|
||||
ok {test-number} - empty_vec, SizeIs(0) for: { } has size == 0
|
||||
# Usage of the SizeIs range matcher
|
||||
@@ -4559,5 +4567,5 @@ ok {test-number} - q3 == 23. for: 23.0 == 23.0
|
||||
ok {test-number} -
|
||||
# xmlentitycheck
|
||||
ok {test-number} -
|
||||
1..2277
|
||||
1..2281
|
||||
|
||||
|
@@ -1002,19 +1002,19 @@ ok {test-number} - Catch::makeStream( "" )->isConsole() for: true
|
||||
not ok {test-number} - testStringForMatching(), EndsWith( "Substring" ) for: "this string contains 'abc' as a substring" ends with: "Substring"
|
||||
# EndsWith string matcher
|
||||
not ok {test-number} - testStringForMatching(), EndsWith( "this", Catch::CaseSensitive::No ) for: "this string contains 'abc' as a substring" ends with: "this" (case insensitive)
|
||||
# Enums can quickly have stringification enabled using REGISTER_ENUM
|
||||
# Enums can quickly have stringification enabled using CATCH_REGISTER_ENUM
|
||||
ok {test-number} - stringify( EnumClass3::Value1 ) == "Value1" for: "Value1" == "Value1"
|
||||
# Enums can quickly have stringification enabled using REGISTER_ENUM
|
||||
# Enums can quickly have stringification enabled using CATCH_REGISTER_ENUM
|
||||
ok {test-number} - stringify( EnumClass3::Value2 ) == "Value2" for: "Value2" == "Value2"
|
||||
# Enums can quickly have stringification enabled using REGISTER_ENUM
|
||||
# Enums can quickly have stringification enabled using CATCH_REGISTER_ENUM
|
||||
ok {test-number} - stringify( EnumClass3::Value3 ) == "Value3" for: "Value3" == "Value3"
|
||||
# Enums can quickly have stringification enabled using REGISTER_ENUM
|
||||
# Enums can quickly have stringification enabled using CATCH_REGISTER_ENUM
|
||||
ok {test-number} - stringify( EnumClass3::Value4 ) == "{** unexpected enum value **}" for: "{** unexpected enum value **}" == "{** unexpected enum value **}"
|
||||
# Enums can quickly have stringification enabled using REGISTER_ENUM
|
||||
# Enums can quickly have stringification enabled using CATCH_REGISTER_ENUM
|
||||
ok {test-number} - stringify( ec3 ) == "Value2" for: "Value2" == "Value2"
|
||||
# Enums in namespaces can quickly have stringification enabled using REGISTER_ENUM
|
||||
# Enums in namespaces can quickly have stringification enabled using CATCH_REGISTER_ENUM
|
||||
ok {test-number} - stringify( Bikeshed::Colours::Red ) == "Red" for: "Red" == "Red"
|
||||
# Enums in namespaces can quickly have stringification enabled using REGISTER_ENUM
|
||||
# Enums in namespaces can quickly have stringification enabled using CATCH_REGISTER_ENUM
|
||||
ok {test-number} - stringify( Bikeshed::Colours::Blue ) == "Blue" for: "Blue" == "Blue"
|
||||
# Epsilon only applies to Approx's value
|
||||
ok {test-number} - 101.01 != Approx(100).epsilon(0.01) for: 101.01000000000000512 != Approx( 100.0 )
|
||||
@@ -3573,6 +3573,10 @@ ok {test-number} - needs_adl1, RangeEquals( needs_adl2 ) for: { 1, 2, 3, 4, 5 }
|
||||
# Usage of RangeEquals range matcher
|
||||
ok {test-number} - needs_adl1, RangeEquals( needs_adl3, []( int l, int r ) { return l + 1 == r; } ) for: { 1, 2, 3, 4, 5 } elements are { 2, 3, 4, 5, 6 }
|
||||
# Usage of RangeEquals range matcher
|
||||
ok {test-number} - array_a, RangeEquals( { 1, 2, 3 } ) for: { 1, 2, 3 } elements are { 1, 2, 3 }
|
||||
# Usage of RangeEquals range matcher
|
||||
ok {test-number} - array_a, RangeEquals( { 2, 4, 6 }, []( int l, int r ) { return l * 2 == r; } ) for: { 1, 2, 3 } elements are { 2, 4, 6 }
|
||||
# Usage of RangeEquals range matcher
|
||||
ok {test-number} - mocked1, !RangeEquals( arr ) for: { 1, 2, 3, 4 } not elements are { 1, 2, 4, 4 }
|
||||
# Usage of RangeEquals range matcher
|
||||
ok {test-number} - mocked1.m_derefed[0] for: true
|
||||
@@ -3612,6 +3616,10 @@ ok {test-number} - vector_a, UnorderedRangeEquals( vector_a_plus_1, close_enough
|
||||
ok {test-number} - vector_a, !UnorderedRangeEquals( vector_b, close_enough ) for: { 1, 10, 21 } not unordered elements are { 11, 21, 3 }
|
||||
# Usage of UnorderedRangeEquals range matcher
|
||||
ok {test-number} - needs_adl1, UnorderedRangeEquals( needs_adl2 ) for: { 1, 2, 3, 4, 5 } unordered elements are { 1, 2, 3, 4, 5 }
|
||||
# Usage of UnorderedRangeEquals range matcher
|
||||
ok {test-number} - array_a, UnorderedRangeEquals( { 10, 20, 1 } ) for: { 1, 10, 20 } unordered elements are { 10, 20, 1 }
|
||||
# Usage of UnorderedRangeEquals range matcher
|
||||
ok {test-number} - array_a, UnorderedRangeEquals( { 11, 21, 2 }, []( int l, int r ) { return std::abs( l - r ) <= 1; } ) for: { 1, 10, 20 } unordered elements are { 11, 21, 2 }
|
||||
# Usage of the SizeIs range matcher
|
||||
ok {test-number} - empty_vec, SizeIs(0) for: { } has size == 0
|
||||
# Usage of the SizeIs range matcher
|
||||
@@ -4548,5 +4556,5 @@ ok {test-number} - q3 == 23. for: 23.0 == 23.0
|
||||
ok {test-number} -
|
||||
# xmlentitycheck
|
||||
ok {test-number} -
|
||||
1..2277
|
||||
1..2281
|
||||
|
||||
|
@@ -315,10 +315,10 @@
|
||||
##teamcity[testFailed name='EndsWith string matcher' message='Matchers.tests.cpp:<line number>|n...............................................................................|n|nMatchers.tests.cpp:<line number>|nexpression failed|n CHECK_THAT( testStringForMatching(), EndsWith( "Substring" ) )|nwith expansion:|n "this string contains |'abc|' as a substring" ends with: "Substring"|n']
|
||||
##teamcity[testFailed name='EndsWith string matcher' message='Matchers.tests.cpp:<line number>|nexpression failed|n CHECK_THAT( testStringForMatching(), EndsWith( "this", Catch::CaseSensitive::No ) )|nwith expansion:|n "this string contains |'abc|' as a substring" ends with: "this" (case insensitive)|n']
|
||||
##teamcity[testFinished name='EndsWith string matcher' duration="{duration}"]
|
||||
##teamcity[testStarted name='Enums can quickly have stringification enabled using REGISTER_ENUM']
|
||||
##teamcity[testFinished name='Enums can quickly have stringification enabled using REGISTER_ENUM' duration="{duration}"]
|
||||
##teamcity[testStarted name='Enums in namespaces can quickly have stringification enabled using REGISTER_ENUM']
|
||||
##teamcity[testFinished name='Enums in namespaces can quickly have stringification enabled using REGISTER_ENUM' duration="{duration}"]
|
||||
##teamcity[testStarted name='Enums can quickly have stringification enabled using CATCH_REGISTER_ENUM']
|
||||
##teamcity[testFinished name='Enums can quickly have stringification enabled using CATCH_REGISTER_ENUM' duration="{duration}"]
|
||||
##teamcity[testStarted name='Enums in namespaces can quickly have stringification enabled using CATCH_REGISTER_ENUM']
|
||||
##teamcity[testFinished name='Enums in namespaces can quickly have stringification enabled using CATCH_REGISTER_ENUM' duration="{duration}"]
|
||||
##teamcity[testStarted name='Epsilon only applies to Approx|'s value']
|
||||
##teamcity[testFinished name='Epsilon only applies to Approx|'s value' duration="{duration}"]
|
||||
##teamcity[testStarted name='Equality checks that should fail']
|
||||
|
@@ -315,10 +315,10 @@
|
||||
##teamcity[testFailed name='EndsWith string matcher' message='Matchers.tests.cpp:<line number>|n...............................................................................|n|nMatchers.tests.cpp:<line number>|nexpression failed|n CHECK_THAT( testStringForMatching(), EndsWith( "Substring" ) )|nwith expansion:|n "this string contains |'abc|' as a substring" ends with: "Substring"|n']
|
||||
##teamcity[testFailed name='EndsWith string matcher' message='Matchers.tests.cpp:<line number>|nexpression failed|n CHECK_THAT( testStringForMatching(), EndsWith( "this", Catch::CaseSensitive::No ) )|nwith expansion:|n "this string contains |'abc|' as a substring" ends with: "this" (case insensitive)|n']
|
||||
##teamcity[testFinished name='EndsWith string matcher' duration="{duration}"]
|
||||
##teamcity[testStarted name='Enums can quickly have stringification enabled using REGISTER_ENUM']
|
||||
##teamcity[testFinished name='Enums can quickly have stringification enabled using REGISTER_ENUM' duration="{duration}"]
|
||||
##teamcity[testStarted name='Enums in namespaces can quickly have stringification enabled using REGISTER_ENUM']
|
||||
##teamcity[testFinished name='Enums in namespaces can quickly have stringification enabled using REGISTER_ENUM' duration="{duration}"]
|
||||
##teamcity[testStarted name='Enums can quickly have stringification enabled using CATCH_REGISTER_ENUM']
|
||||
##teamcity[testFinished name='Enums can quickly have stringification enabled using CATCH_REGISTER_ENUM' duration="{duration}"]
|
||||
##teamcity[testStarted name='Enums in namespaces can quickly have stringification enabled using CATCH_REGISTER_ENUM']
|
||||
##teamcity[testFinished name='Enums in namespaces can quickly have stringification enabled using CATCH_REGISTER_ENUM' duration="{duration}"]
|
||||
##teamcity[testStarted name='Epsilon only applies to Approx|'s value']
|
||||
##teamcity[testFinished name='Epsilon only applies to Approx|'s value' duration="{duration}"]
|
||||
##teamcity[testStarted name='Equality checks that should fail']
|
||||
|
@@ -4493,7 +4493,7 @@ C
|
||||
</Expression>
|
||||
<OverallResult success="false" skips="0"/>
|
||||
</TestCase>
|
||||
<TestCase name="Enums can quickly have stringification enabled using REGISTER_ENUM" filename="tests/<exe-name>/UsageTests/EnumToString.tests.cpp" >
|
||||
<TestCase name="Enums can quickly have stringification enabled using CATCH_REGISTER_ENUM" filename="tests/<exe-name>/UsageTests/EnumToString.tests.cpp" >
|
||||
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/UsageTests/EnumToString.tests.cpp" >
|
||||
<Original>
|
||||
stringify( EnumClass3::Value1 ) == "Value1"
|
||||
@@ -4538,7 +4538,7 @@ C
|
||||
</Expression>
|
||||
<OverallResult success="true" skips="0"/>
|
||||
</TestCase>
|
||||
<TestCase name="Enums in namespaces can quickly have stringification enabled using REGISTER_ENUM" filename="tests/<exe-name>/UsageTests/EnumToString.tests.cpp" >
|
||||
<TestCase name="Enums in namespaces can quickly have stringification enabled using CATCH_REGISTER_ENUM" filename="tests/<exe-name>/UsageTests/EnumToString.tests.cpp" >
|
||||
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/UsageTests/EnumToString.tests.cpp" >
|
||||
<Original>
|
||||
stringify( Bikeshed::Colours::Red ) == "Red"
|
||||
@@ -17383,6 +17383,25 @@ There is no extra whitespace here
|
||||
</Expression>
|
||||
<OverallResults successes="2" failures="0" expectedFailures="0" skipped="false"/>
|
||||
</Section>
|
||||
<Section name="Compare against std::initializer_list" filename="tests/<exe-name>/UsageTests/MatchersRanges.tests.cpp" >
|
||||
<Expression success="true" type="REQUIRE_THAT" filename="tests/<exe-name>/UsageTests/MatchersRanges.tests.cpp" >
|
||||
<Original>
|
||||
array_a, RangeEquals( { 1, 2, 3 } )
|
||||
</Original>
|
||||
<Expanded>
|
||||
{ 1, 2, 3 } elements are { 1, 2, 3 }
|
||||
</Expanded>
|
||||
</Expression>
|
||||
<Expression success="true" type="REQUIRE_THAT" filename="tests/<exe-name>/UsageTests/MatchersRanges.tests.cpp" >
|
||||
<Original>
|
||||
array_a, RangeEquals( { 2, 4, 6 }, []( int l, int r ) { return l * 2 == r; } )
|
||||
</Original>
|
||||
<Expanded>
|
||||
{ 1, 2, 3 } elements are { 2, 4, 6 }
|
||||
</Expanded>
|
||||
</Expression>
|
||||
<OverallResults successes="2" failures="0" expectedFailures="0" skipped="false"/>
|
||||
</Section>
|
||||
<Section name="Check short-circuiting behaviour" filename="tests/<exe-name>/UsageTests/MatchersRanges.tests.cpp" >
|
||||
<Section name="Check short-circuits on failure" filename="tests/<exe-name>/UsageTests/MatchersRanges.tests.cpp" >
|
||||
<Expression success="true" type="REQUIRE_THAT" filename="tests/<exe-name>/UsageTests/MatchersRanges.tests.cpp" >
|
||||
@@ -17609,6 +17628,25 @@ There is no extra whitespace here
|
||||
</Expression>
|
||||
<OverallResults successes="1" failures="0" expectedFailures="0" skipped="false"/>
|
||||
</Section>
|
||||
<Section name="Compare against std::initializer_list" filename="tests/<exe-name>/UsageTests/MatchersRanges.tests.cpp" >
|
||||
<Expression success="true" type="REQUIRE_THAT" filename="tests/<exe-name>/UsageTests/MatchersRanges.tests.cpp" >
|
||||
<Original>
|
||||
array_a, UnorderedRangeEquals( { 10, 20, 1 } )
|
||||
</Original>
|
||||
<Expanded>
|
||||
{ 1, 10, 20 } unordered elements are { 10, 20, 1 }
|
||||
</Expanded>
|
||||
</Expression>
|
||||
<Expression success="true" type="REQUIRE_THAT" filename="tests/<exe-name>/UsageTests/MatchersRanges.tests.cpp" >
|
||||
<Original>
|
||||
array_a, UnorderedRangeEquals( { 11, 21, 2 }, []( int l, int r ) { return std::abs( l - r ) <= 1; } )
|
||||
</Original>
|
||||
<Expanded>
|
||||
{ 1, 10, 20 } unordered elements are { 11, 21, 2 }
|
||||
</Expanded>
|
||||
</Expression>
|
||||
<OverallResults successes="2" failures="0" expectedFailures="0" skipped="false"/>
|
||||
</Section>
|
||||
<OverallResult success="true" skips="0"/>
|
||||
</TestCase>
|
||||
<TestCase name="Usage of the SizeIs range matcher" tags="[matchers][size][templated]" filename="tests/<exe-name>/UsageTests/MatchersRanges.tests.cpp" >
|
||||
@@ -21933,6 +21971,6 @@ Approx( -1.95996398454005449 )
|
||||
</Section>
|
||||
<OverallResult success="true" skips="0"/>
|
||||
</TestCase>
|
||||
<OverallResults successes="2083" failures="147" expectedFailures="35" skips="12"/>
|
||||
<OverallResults successes="2087" failures="147" expectedFailures="35" skips="12"/>
|
||||
<OverallResultsCases successes="313" failures="86" expectedFailures="14" skips="6"/>
|
||||
</Catch2TestRun>
|
||||
|
@@ -4493,7 +4493,7 @@ C
|
||||
</Expression>
|
||||
<OverallResult success="false" skips="0"/>
|
||||
</TestCase>
|
||||
<TestCase name="Enums can quickly have stringification enabled using REGISTER_ENUM" filename="tests/<exe-name>/UsageTests/EnumToString.tests.cpp" >
|
||||
<TestCase name="Enums can quickly have stringification enabled using CATCH_REGISTER_ENUM" filename="tests/<exe-name>/UsageTests/EnumToString.tests.cpp" >
|
||||
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/UsageTests/EnumToString.tests.cpp" >
|
||||
<Original>
|
||||
stringify( EnumClass3::Value1 ) == "Value1"
|
||||
@@ -4538,7 +4538,7 @@ C
|
||||
</Expression>
|
||||
<OverallResult success="true" skips="0"/>
|
||||
</TestCase>
|
||||
<TestCase name="Enums in namespaces can quickly have stringification enabled using REGISTER_ENUM" filename="tests/<exe-name>/UsageTests/EnumToString.tests.cpp" >
|
||||
<TestCase name="Enums in namespaces can quickly have stringification enabled using CATCH_REGISTER_ENUM" filename="tests/<exe-name>/UsageTests/EnumToString.tests.cpp" >
|
||||
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/UsageTests/EnumToString.tests.cpp" >
|
||||
<Original>
|
||||
stringify( Bikeshed::Colours::Red ) == "Red"
|
||||
@@ -17383,6 +17383,25 @@ There is no extra whitespace here
|
||||
</Expression>
|
||||
<OverallResults successes="2" failures="0" expectedFailures="0" skipped="false"/>
|
||||
</Section>
|
||||
<Section name="Compare against std::initializer_list" filename="tests/<exe-name>/UsageTests/MatchersRanges.tests.cpp" >
|
||||
<Expression success="true" type="REQUIRE_THAT" filename="tests/<exe-name>/UsageTests/MatchersRanges.tests.cpp" >
|
||||
<Original>
|
||||
array_a, RangeEquals( { 1, 2, 3 } )
|
||||
</Original>
|
||||
<Expanded>
|
||||
{ 1, 2, 3 } elements are { 1, 2, 3 }
|
||||
</Expanded>
|
||||
</Expression>
|
||||
<Expression success="true" type="REQUIRE_THAT" filename="tests/<exe-name>/UsageTests/MatchersRanges.tests.cpp" >
|
||||
<Original>
|
||||
array_a, RangeEquals( { 2, 4, 6 }, []( int l, int r ) { return l * 2 == r; } )
|
||||
</Original>
|
||||
<Expanded>
|
||||
{ 1, 2, 3 } elements are { 2, 4, 6 }
|
||||
</Expanded>
|
||||
</Expression>
|
||||
<OverallResults successes="2" failures="0" expectedFailures="0" skipped="false"/>
|
||||
</Section>
|
||||
<Section name="Check short-circuiting behaviour" filename="tests/<exe-name>/UsageTests/MatchersRanges.tests.cpp" >
|
||||
<Section name="Check short-circuits on failure" filename="tests/<exe-name>/UsageTests/MatchersRanges.tests.cpp" >
|
||||
<Expression success="true" type="REQUIRE_THAT" filename="tests/<exe-name>/UsageTests/MatchersRanges.tests.cpp" >
|
||||
@@ -17609,6 +17628,25 @@ There is no extra whitespace here
|
||||
</Expression>
|
||||
<OverallResults successes="1" failures="0" expectedFailures="0" skipped="false"/>
|
||||
</Section>
|
||||
<Section name="Compare against std::initializer_list" filename="tests/<exe-name>/UsageTests/MatchersRanges.tests.cpp" >
|
||||
<Expression success="true" type="REQUIRE_THAT" filename="tests/<exe-name>/UsageTests/MatchersRanges.tests.cpp" >
|
||||
<Original>
|
||||
array_a, UnorderedRangeEquals( { 10, 20, 1 } )
|
||||
</Original>
|
||||
<Expanded>
|
||||
{ 1, 10, 20 } unordered elements are { 10, 20, 1 }
|
||||
</Expanded>
|
||||
</Expression>
|
||||
<Expression success="true" type="REQUIRE_THAT" filename="tests/<exe-name>/UsageTests/MatchersRanges.tests.cpp" >
|
||||
<Original>
|
||||
array_a, UnorderedRangeEquals( { 11, 21, 2 }, []( int l, int r ) { return std::abs( l - r ) <= 1; } )
|
||||
</Original>
|
||||
<Expanded>
|
||||
{ 1, 10, 20 } unordered elements are { 11, 21, 2 }
|
||||
</Expanded>
|
||||
</Expression>
|
||||
<OverallResults successes="2" failures="0" expectedFailures="0" skipped="false"/>
|
||||
</Section>
|
||||
<OverallResult success="true" skips="0"/>
|
||||
</TestCase>
|
||||
<TestCase name="Usage of the SizeIs range matcher" tags="[matchers][size][templated]" filename="tests/<exe-name>/UsageTests/MatchersRanges.tests.cpp" >
|
||||
@@ -21932,6 +21970,6 @@ Approx( -1.95996398454005449 )
|
||||
</Section>
|
||||
<OverallResult success="true" skips="0"/>
|
||||
</TestCase>
|
||||
<OverallResults successes="2083" failures="147" expectedFailures="35" skips="12"/>
|
||||
<OverallResults successes="2087" failures="147" expectedFailures="35" skips="12"/>
|
||||
<OverallResultsCases successes="313" failures="86" expectedFailures="14" skips="6"/>
|
||||
</Catch2TestRun>
|
||||
|
@@ -8,6 +8,7 @@
|
||||
|
||||
#include <helpers/type_with_lit_0_comparisons.hpp>
|
||||
|
||||
#include <array>
|
||||
#include <type_traits>
|
||||
|
||||
// Setup for #1403 -- look for global overloads of operator << for classes
|
||||
@@ -34,6 +35,7 @@ static std::ostream& operator<<(std::ostream& out, foo::helper_1403 const&) {
|
||||
///////////////////////////////
|
||||
|
||||
#include <catch2/catch_test_macros.hpp>
|
||||
#include <catch2/generators/catch_generators_range.hpp>
|
||||
#include <catch2/matchers/catch_matchers_string.hpp>
|
||||
|
||||
#include <cstring>
|
||||
@@ -467,3 +469,57 @@ TEST_CASE( "Comparing const std::weak_ordering instances must compile",
|
||||
REQUIRE( plain_ordering_1 == const_ordering_1 );
|
||||
}
|
||||
#endif
|
||||
|
||||
// Reproduce issue with yaml-cpp iterators, where the `const_iterator`
|
||||
// for Node type has `const T` as the value_type. This is wrong for
|
||||
// multitude of reasons, but there might be other libraries in the wild
|
||||
// that share this issue, and the workaround needed to support
|
||||
// `from_range(iter, iter)` helper with those libraries is easy enough.
|
||||
class HasBadIterator {
|
||||
std::array<int, 10> m_arr{};
|
||||
|
||||
public:
|
||||
class iterator {
|
||||
const int* m_ptr = nullptr;
|
||||
|
||||
public:
|
||||
iterator( const int* ptr ): m_ptr( ptr ) {}
|
||||
|
||||
using difference_type = std::ptrdiff_t;
|
||||
using value_type = const int;
|
||||
using pointer = const int*;
|
||||
using reference = const int&;
|
||||
using iterator_category = std::input_iterator_tag;
|
||||
|
||||
iterator& operator++() {
|
||||
++m_ptr;
|
||||
return *this;
|
||||
}
|
||||
|
||||
iterator operator++( int ) {
|
||||
auto ret( *this );
|
||||
++( *this );
|
||||
return ret;
|
||||
}
|
||||
|
||||
friend bool operator==( iterator lhs, iterator rhs ) {
|
||||
return lhs.m_ptr == rhs.m_ptr;
|
||||
}
|
||||
friend bool operator!=( iterator lhs, iterator rhs ) {
|
||||
return !( lhs == rhs );
|
||||
}
|
||||
|
||||
int operator*() const { return *m_ptr; }
|
||||
};
|
||||
|
||||
iterator cbegin() const { return { m_arr.data() }; }
|
||||
iterator cend() const { return { m_arr.data() + m_arr.size() }; }
|
||||
};
|
||||
|
||||
TEST_CASE("from_range(iter, iter) supports const_iterators", "[generators][from-range][approvals]") {
|
||||
using namespace Catch::Generators;
|
||||
|
||||
HasBadIterator data;
|
||||
auto gen = from_range(data.cbegin(), data.cend());
|
||||
(void)gen;
|
||||
}
|
||||
|
@@ -79,7 +79,7 @@ enum class EnumClass3 { Value1, Value2, Value3, Value4 };
|
||||
CATCH_REGISTER_ENUM( EnumClass3, EnumClass3::Value1, EnumClass3::Value2, EnumClass3::Value3 )
|
||||
|
||||
|
||||
TEST_CASE( "Enums can quickly have stringification enabled using REGISTER_ENUM" ) {
|
||||
TEST_CASE( "Enums can quickly have stringification enabled using CATCH_REGISTER_ENUM" ) {
|
||||
using Catch::Detail::stringify;
|
||||
REQUIRE( stringify( EnumClass3::Value1 ) == "Value1" );
|
||||
REQUIRE( stringify( EnumClass3::Value2 ) == "Value2" );
|
||||
@@ -101,7 +101,7 @@ CATCH_REGISTER_ENUM( Bikeshed::Colours,
|
||||
Bikeshed::Colours::Green,
|
||||
Bikeshed::Colours::Blue )
|
||||
|
||||
TEST_CASE( "Enums in namespaces can quickly have stringification enabled using REGISTER_ENUM" ) {
|
||||
TEST_CASE( "Enums in namespaces can quickly have stringification enabled using CATCH_REGISTER_ENUM" ) {
|
||||
using Catch::Detail::stringify;
|
||||
REQUIRE( stringify( Bikeshed::Colours::Red ) == "Red" );
|
||||
REQUIRE( stringify( Bikeshed::Colours::Blue ) == "Blue" );
|
||||
|
@@ -727,6 +727,15 @@ TEST_CASE( "Usage of RangeEquals range matcher", "[matchers][templated][quantifi
|
||||
} ) );
|
||||
}
|
||||
|
||||
SECTION( "Compare against std::initializer_list" ) {
|
||||
const std::array<int, 3> array_a{ { 1, 2, 3 } };
|
||||
|
||||
REQUIRE_THAT( array_a, RangeEquals( { 1, 2, 3 } ) );
|
||||
REQUIRE_THAT( array_a, RangeEquals( { 2, 4, 6 }, []( int l, int r ) {
|
||||
return l * 2 == r;
|
||||
} ) );
|
||||
}
|
||||
|
||||
SECTION("Check short-circuiting behaviour") {
|
||||
with_mocked_iterator_access<int> const mocked1{ 1, 2, 3, 4 };
|
||||
|
||||
@@ -820,6 +829,16 @@ TEST_CASE( "Usage of UnorderedRangeEquals range matcher",
|
||||
|
||||
REQUIRE_THAT( needs_adl1, UnorderedRangeEquals( needs_adl2 ) );
|
||||
}
|
||||
|
||||
SECTION( "Compare against std::initializer_list" ) {
|
||||
const std::array<int, 3> array_a{ { 1, 10, 20 } };
|
||||
|
||||
REQUIRE_THAT( array_a, UnorderedRangeEquals( { 10, 20, 1 } ) );
|
||||
REQUIRE_THAT( array_a,
|
||||
UnorderedRangeEquals( { 11, 21, 2 }, []( int l, int r ) {
|
||||
return std::abs( l - r ) <= 1;
|
||||
} ) );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -52,7 +52,7 @@ try:
|
||||
)
|
||||
stdout = ret.stdout
|
||||
except subprocess.SubprocessError as ex:
|
||||
if ex.returncode == 1:
|
||||
if ex.returncode == 42:
|
||||
# The test cases are allowed to fail.
|
||||
test_passing = False
|
||||
stdout = ex.stdout
|
||||
|
Reference in New Issue
Block a user