* Add new SKIP macro for skipping tests at runtime This adds a new `SKIP` macro for dynamically skipping tests at runtime. The "skipped" status of a test case is treated as a first-class citizen, like "succeeded" or "failed", and is reported with a new color on the console. * Don't show "skipped assertions" in console/compact reporters Also extend skip tests to cover a few more use cases. * Return exit code 4 if all test cases are skipped * Use LightGrey for the skip colour This isn't great, but is better than the deep blue that was borderline invisible on dark backgrounds. The fix is to redo the colouring a bit, including introducing light-blue that is actually visible. * Add support for explicit skips in all reporters * --allow-running-no-tests also allows all tests to be skipped * Add docs for SKIP macro, deprecate IEventListener::skipTest Co-authored-by: Martin Hořeňovský <martin.horenovsky@gmail.com>
91 lines
3.5 KiB
C++
91 lines
3.5 KiB
C++
|
|
// 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_assertion_handler.hpp>
|
|
#include <catch2/interfaces/catch_interfaces_config.hpp>
|
|
#include <catch2/internal/catch_context.hpp>
|
|
#include <catch2/internal/catch_enforce.hpp>
|
|
#include <catch2/internal/catch_debugger.hpp>
|
|
#include <catch2/internal/catch_test_failure_exception.hpp>
|
|
#include <catch2/interfaces/catch_interfaces_registry_hub.hpp>
|
|
#include <catch2/internal/catch_run_context.hpp>
|
|
#include <catch2/matchers/catch_matchers_string.hpp>
|
|
|
|
namespace Catch {
|
|
|
|
AssertionHandler::AssertionHandler
|
|
( StringRef macroName,
|
|
SourceLineInfo const& lineInfo,
|
|
StringRef capturedExpression,
|
|
ResultDisposition::Flags resultDisposition )
|
|
: m_assertionInfo{ macroName, lineInfo, capturedExpression, resultDisposition },
|
|
m_resultCapture( getResultCapture() )
|
|
{}
|
|
|
|
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 );
|
|
}
|
|
|
|
auto AssertionHandler::allowThrows() const -> bool {
|
|
return getCurrentContext().getConfig()->allowThrows();
|
|
}
|
|
|
|
void AssertionHandler::complete() {
|
|
setCompleted();
|
|
if( m_reaction.shouldDebugBreak ) {
|
|
|
|
// If you find your debugger stopping you here then go one level up on the
|
|
// call-stack for the code that caused it (typically a failed assertion)
|
|
|
|
// (To go back to the test and change execution, jump over the throw, next)
|
|
CATCH_BREAK_INTO_DEBUGGER();
|
|
}
|
|
if (m_reaction.shouldThrow) {
|
|
throw_test_failure_exception();
|
|
}
|
|
if ( m_reaction.shouldSkip ) {
|
|
#if !defined( CATCH_CONFIG_DISABLE_EXCEPTIONS )
|
|
throw Catch::TestSkipException();
|
|
#else
|
|
CATCH_ERROR( "Explicitly skipping tests during runtime requires exceptions" );
|
|
#endif
|
|
}
|
|
}
|
|
void AssertionHandler::setCompleted() {
|
|
m_completed = true;
|
|
}
|
|
|
|
void AssertionHandler::handleUnexpectedInflightException() {
|
|
m_resultCapture.handleUnexpectedInflightException( m_assertionInfo, Catch::translateActiveException(), m_reaction );
|
|
}
|
|
|
|
void AssertionHandler::handleExceptionThrownAsExpected() {
|
|
m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction);
|
|
}
|
|
void AssertionHandler::handleExceptionNotThrownAsExpected() {
|
|
m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction);
|
|
}
|
|
|
|
void AssertionHandler::handleUnexpectedExceptionNotThrown() {
|
|
m_resultCapture.handleUnexpectedExceptionNotThrown( m_assertionInfo, m_reaction );
|
|
}
|
|
|
|
void AssertionHandler::handleThrowingCallSkipped() {
|
|
m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction);
|
|
}
|
|
|
|
// This is the overload that takes a string and infers the Equals matcher from it
|
|
// The more general overload, that takes any string matcher, is in catch_capture_matchers.cpp
|
|
void handleExceptionMatchExpr( AssertionHandler& handler, std::string const& str ) {
|
|
handleExceptionMatchExpr( handler, Matchers::Equals( str ) );
|
|
}
|
|
|
|
} // namespace Catch
|