diff --git a/projects/SelfTest/Baselines/compact.sw.approved.txt b/projects/SelfTest/Baselines/compact.sw.approved.txt index 48bc91d1..cdff6666 100644 --- a/projects/SelfTest/Baselines/compact.sw.approved.txt +++ b/projects/SelfTest/Baselines/compact.sw.approved.txt @@ -335,6 +335,12 @@ Condition.tests.cpp:: passed: 6 == uc for: 6 == 6 Condition.tests.cpp:: passed: (std::numeric_limits::max)() > ul for: 4294967295 (0x) > 4 Matchers.tests.cpp:: passed: testStringForMatching2(), !composed1 for: "some completely different text that contains one common word" not ( contains: "string" or contains: "random" ) Matchers.tests.cpp:: passed: testStringForMatching2(), composed2 for: "some completely different text that contains one common word" ( contains: "string" or contains: "random" or contains: "different" ) +Matchers.tests.cpp:: passed: 1, !(first && second) for: 1 not ( CheckedTestingMatcher set to fail and CheckedTestingMatcher set to fail ) +Matchers.tests.cpp:: passed: first.matchCalled for: true +Matchers.tests.cpp:: passed: !second.matchCalled for: true +Matchers.tests.cpp:: passed: 1, first || second for: 1 ( CheckedTestingMatcher set to succeed or CheckedTestingMatcher set to fail ) +Matchers.tests.cpp:: passed: first.matchCalled for: true +Matchers.tests.cpp:: passed: !second.matchCalled for: true Matchers.tests.cpp:: failed: testStringForMatching(), Contains("not there", Catch::CaseSensitive::No) for: "this string contains 'abc' as a substring" contains: "not there" (case insensitive) Matchers.tests.cpp:: failed: testStringForMatching(), Contains("STRING") for: "this string contains 'abc' as a substring" contains: "STRING" Generators.tests.cpp:: passed: elem % 2 == 1 for: 1 == 1 diff --git a/projects/SelfTest/Baselines/console.std.approved.txt b/projects/SelfTest/Baselines/console.std.approved.txt index ff7f34b1..479fdafc 100644 --- a/projects/SelfTest/Baselines/console.std.approved.txt +++ b/projects/SelfTest/Baselines/console.std.approved.txt @@ -1380,6 +1380,6 @@ due to unexpected exception with message: Why would you throw a std::string? =============================================================================== -test cases: 315 | 241 passed | 70 failed | 4 failed as expected -assertions: 1710 | 1558 passed | 131 failed | 21 failed as expected +test cases: 316 | 242 passed | 70 failed | 4 failed as expected +assertions: 1716 | 1564 passed | 131 failed | 21 failed as expected diff --git a/projects/SelfTest/Baselines/console.sw.approved.txt b/projects/SelfTest/Baselines/console.sw.approved.txt index 19e3947f..521de74b 100644 --- a/projects/SelfTest/Baselines/console.sw.approved.txt +++ b/projects/SelfTest/Baselines/console.sw.approved.txt @@ -2584,6 +2584,52 @@ with expansion: "some completely different text that contains one common word" ( contains: "string" or contains: "random" or contains: "different" ) +------------------------------------------------------------------------------- +Composed matchers shortcircuit + && +------------------------------------------------------------------------------- +Matchers.tests.cpp: +............................................................................... + +Matchers.tests.cpp:: PASSED: + CHECK_THAT( 1, !(first && second) ) +with expansion: + 1 not ( CheckedTestingMatcher set to fail and CheckedTestingMatcher set to + fail ) + +Matchers.tests.cpp:: PASSED: + REQUIRE( first.matchCalled ) +with expansion: + true + +Matchers.tests.cpp:: PASSED: + REQUIRE( !second.matchCalled ) +with expansion: + true + +------------------------------------------------------------------------------- +Composed matchers shortcircuit + || +------------------------------------------------------------------------------- +Matchers.tests.cpp: +............................................................................... + +Matchers.tests.cpp:: PASSED: + CHECK_THAT( 1, first || second ) +with expansion: + 1 ( CheckedTestingMatcher set to succeed or CheckedTestingMatcher set to fail + ) + +Matchers.tests.cpp:: PASSED: + REQUIRE( first.matchCalled ) +with expansion: + true + +Matchers.tests.cpp:: PASSED: + REQUIRE( !second.matchCalled ) +with expansion: + true + ------------------------------------------------------------------------------- Contains string matcher ------------------------------------------------------------------------------- @@ -13663,6 +13709,6 @@ Misc.tests.cpp: Misc.tests.cpp:: PASSED: =============================================================================== -test cases: 315 | 225 passed | 86 failed | 4 failed as expected -assertions: 1727 | 1558 passed | 148 failed | 21 failed as expected +test cases: 316 | 226 passed | 86 failed | 4 failed as expected +assertions: 1733 | 1564 passed | 148 failed | 21 failed as expected diff --git a/projects/SelfTest/Baselines/junit.sw.approved.txt b/projects/SelfTest/Baselines/junit.sw.approved.txt index 19d9af0d..0a5ccecd 100644 --- a/projects/SelfTest/Baselines/junit.sw.approved.txt +++ b/projects/SelfTest/Baselines/junit.sw.approved.txt @@ -1,7 +1,7 @@ - + @@ -366,6 +366,8 @@ Exception.tests.cpp: + + FAILED: diff --git a/projects/SelfTest/Baselines/sonarqube.sw.approved.txt b/projects/SelfTest/Baselines/sonarqube.sw.approved.txt index 47d3b39f..9b161560 100644 --- a/projects/SelfTest/Baselines/sonarqube.sw.approved.txt +++ b/projects/SelfTest/Baselines/sonarqube.sw.approved.txt @@ -902,6 +902,8 @@ Exception.tests.cpp: + + FAILED: diff --git a/projects/SelfTest/Baselines/xml.sw.approved.txt b/projects/SelfTest/Baselines/xml.sw.approved.txt index 3cd5becd..784413d0 100644 --- a/projects/SelfTest/Baselines/xml.sw.approved.txt +++ b/projects/SelfTest/Baselines/xml.sw.approved.txt @@ -3025,6 +3025,63 @@ Nor would this + +
+ + + 1, !(first && second) + + + 1 not ( CheckedTestingMatcher set to fail and CheckedTestingMatcher set to fail ) + + + + + first.matchCalled + + + true + + + + + !second.matchCalled + + + true + + + +
+
+ + + 1, first || second + + + 1 ( CheckedTestingMatcher set to succeed or CheckedTestingMatcher set to fail ) + + + + + first.matchCalled + + + true + + + + + !second.matchCalled + + + true + + + +
+ +
@@ -16318,7 +16375,7 @@ loose text artifact - + - + diff --git a/projects/SelfTest/UsageTests/Matchers.tests.cpp b/projects/SelfTest/UsageTests/Matchers.tests.cpp index c4a8ebf9..1797d4a1 100644 --- a/projects/SelfTest/UsageTests/Matchers.tests.cpp +++ b/projects/SelfTest/UsageTests/Matchers.tests.cpp @@ -628,6 +628,45 @@ namespace { namespace MatchersTests { REQUIRE_THAT(testStringForMatching2(), composed2); } + struct CheckedTestingMatcher : Catch::MatcherBase { + mutable bool matchCalled = false; + bool matchSucceeds = false; + + bool match(int const&) const override { + matchCalled = true; + return matchSucceeds; + } + std::string describe() const override { + return "CheckedTestingMatcher set to " + (matchSucceeds ? std::string("succeed") : std::string("fail")); + } + }; + + TEST_CASE("Composed matchers shortcircuit", "[matchers][composed]") { + // Check that if first returns false, second is not touched + CheckedTestingMatcher first, second; + SECTION("&&") { + first.matchSucceeds = false; + // This assertion doesn't actually test anything, we just + // want the composed matcher's `match` being called. + CHECK_THAT(1, !(first && second)); + + // These two assertions are the important ones + REQUIRE(first.matchCalled); + REQUIRE(!second.matchCalled); + } + // Check that if first returns true, second is not touched + SECTION("||") { + first.matchSucceeds = true; + // This assertion doesn't actually test anything, we just + // want the composed matcher's `match` being called. + CHECK_THAT(1, first || second); + + // These two assertions are the important ones + REQUIRE(first.matchCalled); + REQUIRE(!second.matchCalled); + } + } + } } // namespace MatchersTests #endif // CATCH_CONFIG_DISABLE_MATCHERS