mirror of
https://github.com/catchorg/Catch2.git
synced 2024-11-26 07:16:10 +01:00
Add test for shortcircuiting behaviour of generic matcher combinators
This commit is contained in:
parent
95c0c88d84
commit
ac54ba7e12
@ -113,6 +113,7 @@ Nor would this
|
|||||||
:test-result: PASS Comparisons between ints where one side is computed
|
:test-result: PASS Comparisons between ints where one side is computed
|
||||||
:test-result: PASS Comparisons between unsigned ints and negative signed ints match c++ standard behaviour
|
:test-result: PASS Comparisons between unsigned ints and negative signed ints match c++ standard behaviour
|
||||||
:test-result: PASS Comparisons with int literals don't warn when mixing signed/ unsigned
|
:test-result: PASS Comparisons with int literals don't warn when mixing signed/ unsigned
|
||||||
|
:test-result: PASS Composed generic matchers shortcircuit
|
||||||
:test-result: PASS Composed matchers shortcircuit
|
:test-result: PASS Composed matchers shortcircuit
|
||||||
:test-result: FAIL Contains string matcher
|
:test-result: FAIL Contains string matcher
|
||||||
:test-result: PASS Copy and then generate a range
|
:test-result: PASS Copy and then generate a range
|
||||||
|
@ -429,6 +429,12 @@ Condition.tests.cpp:<line number>: passed: 4 == ul for: 4 == 4
|
|||||||
Condition.tests.cpp:<line number>: passed: 5 == c for: 5 == 5
|
Condition.tests.cpp:<line number>: passed: 5 == c for: 5 == 5
|
||||||
Condition.tests.cpp:<line number>: passed: 6 == uc for: 6 == 6
|
Condition.tests.cpp:<line number>: passed: 6 == uc for: 6 == 6
|
||||||
Condition.tests.cpp:<line number>: passed: (std::numeric_limits<uint32_t>::max)() > ul for: 4294967295 (0x<hex digits>) > 4
|
Condition.tests.cpp:<line number>: passed: (std::numeric_limits<uint32_t>::max)() > ul for: 4294967295 (0x<hex digits>) > 4
|
||||||
|
Matchers.tests.cpp:<line number>: passed: !(matcher.match( 1 )) for: !false
|
||||||
|
Matchers.tests.cpp:<line number>: passed: first.matchCalled for: true
|
||||||
|
Matchers.tests.cpp:<line number>: passed: !second.matchCalled for: true
|
||||||
|
Matchers.tests.cpp:<line number>: passed: matcher.match(1) for: true
|
||||||
|
Matchers.tests.cpp:<line number>: passed: first.matchCalled for: true
|
||||||
|
Matchers.tests.cpp:<line number>: passed: !second.matchCalled for: true
|
||||||
Matchers.tests.cpp:<line number>: passed: 1, !(first && second) for: 1 not ( CheckedTestingMatcher set to fail and CheckedTestingMatcher set to fail )
|
Matchers.tests.cpp:<line number>: passed: 1, !(first && second) for: 1 not ( CheckedTestingMatcher set to fail and CheckedTestingMatcher set to fail )
|
||||||
Matchers.tests.cpp:<line number>: passed: first.matchCalled for: true
|
Matchers.tests.cpp:<line number>: passed: first.matchCalled for: true
|
||||||
Matchers.tests.cpp:<line number>: passed: !second.matchCalled for: true
|
Matchers.tests.cpp:<line number>: passed: !second.matchCalled for: true
|
||||||
|
@ -1380,6 +1380,6 @@ due to unexpected exception with message:
|
|||||||
Why would you throw a std::string?
|
Why would you throw a std::string?
|
||||||
|
|
||||||
===============================================================================
|
===============================================================================
|
||||||
test cases: 348 | 274 passed | 70 failed | 4 failed as expected
|
test cases: 349 | 275 passed | 70 failed | 4 failed as expected
|
||||||
assertions: 1983 | 1831 passed | 131 failed | 21 failed as expected
|
assertions: 1989 | 1837 passed | 131 failed | 21 failed as expected
|
||||||
|
|
||||||
|
@ -3373,6 +3373,50 @@ Condition.tests.cpp:<line number>: PASSED:
|
|||||||
with expansion:
|
with expansion:
|
||||||
4294967295 (0x<hex digits>) > 4
|
4294967295 (0x<hex digits>) > 4
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Composed generic matchers shortcircuit
|
||||||
|
MatchAllOf
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Matchers.tests.cpp:<line number>
|
||||||
|
...............................................................................
|
||||||
|
|
||||||
|
Matchers.tests.cpp:<line number>: PASSED:
|
||||||
|
CHECK_FALSE( matcher.match( 1 ) )
|
||||||
|
with expansion:
|
||||||
|
!false
|
||||||
|
|
||||||
|
Matchers.tests.cpp:<line number>: PASSED:
|
||||||
|
REQUIRE( first.matchCalled )
|
||||||
|
with expansion:
|
||||||
|
true
|
||||||
|
|
||||||
|
Matchers.tests.cpp:<line number>: PASSED:
|
||||||
|
REQUIRE( !second.matchCalled )
|
||||||
|
with expansion:
|
||||||
|
true
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Composed generic matchers shortcircuit
|
||||||
|
MatchAnyOf
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Matchers.tests.cpp:<line number>
|
||||||
|
...............................................................................
|
||||||
|
|
||||||
|
Matchers.tests.cpp:<line number>: PASSED:
|
||||||
|
CHECK( matcher.match(1) )
|
||||||
|
with expansion:
|
||||||
|
true
|
||||||
|
|
||||||
|
Matchers.tests.cpp:<line number>: PASSED:
|
||||||
|
REQUIRE( first.matchCalled )
|
||||||
|
with expansion:
|
||||||
|
true
|
||||||
|
|
||||||
|
Matchers.tests.cpp:<line number>: PASSED:
|
||||||
|
REQUIRE( !second.matchCalled )
|
||||||
|
with expansion:
|
||||||
|
true
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Composed matchers shortcircuit
|
Composed matchers shortcircuit
|
||||||
&&
|
&&
|
||||||
@ -15612,6 +15656,6 @@ Misc.tests.cpp:<line number>
|
|||||||
Misc.tests.cpp:<line number>: PASSED:
|
Misc.tests.cpp:<line number>: PASSED:
|
||||||
|
|
||||||
===============================================================================
|
===============================================================================
|
||||||
test cases: 348 | 258 passed | 86 failed | 4 failed as expected
|
test cases: 349 | 259 passed | 86 failed | 4 failed as expected
|
||||||
assertions: 2000 | 1831 passed | 148 failed | 21 failed as expected
|
assertions: 2006 | 1837 passed | 148 failed | 21 failed as expected
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<testsuitesloose text artifact
|
<testsuitesloose text artifact
|
||||||
>
|
>
|
||||||
<testsuite name="<exe-name>" errors="17" failures="132" tests="2001" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
|
<testsuite name="<exe-name>" errors="17" failures="132" tests="2007" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
|
||||||
<properties>
|
<properties>
|
||||||
<property name="filters" value="~[!nonportable]~[!benchmark]~[approvals] *"/>
|
<property name="filters" value="~[!nonportable]~[!benchmark]~[approvals] *"/>
|
||||||
<property name="random-seed" value="1"/>
|
<property name="random-seed" value="1"/>
|
||||||
@ -390,6 +390,8 @@ Exception.tests.cpp:<line number>
|
|||||||
<testcase classname="<exe-name>.global" name="Comparisons between ints where one side is computed" time="{duration}" status="run"/>
|
<testcase classname="<exe-name>.global" name="Comparisons between ints where one side is computed" time="{duration}" status="run"/>
|
||||||
<testcase classname="<exe-name>.global" name="Comparisons between unsigned ints and negative signed ints match c++ standard behaviour" time="{duration}" status="run"/>
|
<testcase classname="<exe-name>.global" name="Comparisons between unsigned ints and negative signed ints match c++ standard behaviour" time="{duration}" status="run"/>
|
||||||
<testcase classname="<exe-name>.global" name="Comparisons with int literals don't warn when mixing signed/ unsigned" time="{duration}" status="run"/>
|
<testcase classname="<exe-name>.global" name="Comparisons with int literals don't warn when mixing signed/ unsigned" time="{duration}" status="run"/>
|
||||||
|
<testcase classname="<exe-name>.global" name="Composed generic matchers shortcircuit/MatchAllOf" time="{duration}" status="run"/>
|
||||||
|
<testcase classname="<exe-name>.global" name="Composed generic matchers shortcircuit/MatchAnyOf" time="{duration}" status="run"/>
|
||||||
<testcase classname="<exe-name>.global" name="Composed matchers shortcircuit/&&" time="{duration}" status="run"/>
|
<testcase classname="<exe-name>.global" name="Composed matchers shortcircuit/&&" time="{duration}" status="run"/>
|
||||||
<testcase classname="<exe-name>.global" name="Composed matchers shortcircuit/||" time="{duration}" status="run"/>
|
<testcase classname="<exe-name>.global" name="Composed matchers shortcircuit/||" time="{duration}" status="run"/>
|
||||||
<testcase classname="<exe-name>.global" name="Contains string matcher" time="{duration}" status="run">
|
<testcase classname="<exe-name>.global" name="Contains string matcher" time="{duration}" status="run">
|
||||||
|
@ -957,6 +957,8 @@ Exception.tests.cpp:<line number>
|
|||||||
<testCase name="Combining only templated matchers" duration="{duration}"/>
|
<testCase name="Combining only templated matchers" duration="{duration}"/>
|
||||||
<testCase name="Combining templated and concrete matchers" duration="{duration}"/>
|
<testCase name="Combining templated and concrete matchers" duration="{duration}"/>
|
||||||
<testCase name="Combining templated matchers" duration="{duration}"/>
|
<testCase name="Combining templated matchers" duration="{duration}"/>
|
||||||
|
<testCase name="Composed generic matchers shortcircuit/MatchAllOf" duration="{duration}"/>
|
||||||
|
<testCase name="Composed generic matchers shortcircuit/MatchAnyOf" duration="{duration}"/>
|
||||||
<testCase name="Composed matchers shortcircuit/&&" duration="{duration}"/>
|
<testCase name="Composed matchers shortcircuit/&&" duration="{duration}"/>
|
||||||
<testCase name="Composed matchers shortcircuit/||" duration="{duration}"/>
|
<testCase name="Composed matchers shortcircuit/||" duration="{duration}"/>
|
||||||
<testCase name="Contains string matcher" duration="{duration}">
|
<testCase name="Contains string matcher" duration="{duration}">
|
||||||
|
@ -856,6 +856,18 @@ ok {test-number} - 5 == c for: 5 == 5
|
|||||||
ok {test-number} - 6 == uc for: 6 == 6
|
ok {test-number} - 6 == uc for: 6 == 6
|
||||||
# Comparisons with int literals don't warn when mixing signed/ unsigned
|
# Comparisons with int literals don't warn when mixing signed/ unsigned
|
||||||
ok {test-number} - (std::numeric_limits<uint32_t>::max)() > ul for: 4294967295 (0x<hex digits>) > 4
|
ok {test-number} - (std::numeric_limits<uint32_t>::max)() > ul for: 4294967295 (0x<hex digits>) > 4
|
||||||
|
# Composed generic matchers shortcircuit
|
||||||
|
ok {test-number} - !(matcher.match( 1 )) for: !false
|
||||||
|
# Composed generic matchers shortcircuit
|
||||||
|
ok {test-number} - first.matchCalled for: true
|
||||||
|
# Composed generic matchers shortcircuit
|
||||||
|
ok {test-number} - !second.matchCalled for: true
|
||||||
|
# Composed generic matchers shortcircuit
|
||||||
|
ok {test-number} - matcher.match(1) for: true
|
||||||
|
# Composed generic matchers shortcircuit
|
||||||
|
ok {test-number} - first.matchCalled for: true
|
||||||
|
# Composed generic matchers shortcircuit
|
||||||
|
ok {test-number} - !second.matchCalled for: true
|
||||||
# Composed matchers shortcircuit
|
# Composed matchers shortcircuit
|
||||||
ok {test-number} - 1, !(first && second) for: 1 not ( CheckedTestingMatcher set to fail and CheckedTestingMatcher set to fail )
|
ok {test-number} - 1, !(first && second) for: 1 not ( CheckedTestingMatcher set to fail and CheckedTestingMatcher set to fail )
|
||||||
# Composed matchers shortcircuit
|
# Composed matchers shortcircuit
|
||||||
@ -3992,5 +4004,5 @@ ok {test-number} - q3 == 23. for: 23.0 == 23.0
|
|||||||
ok {test-number} -
|
ok {test-number} -
|
||||||
# xmlentitycheck
|
# xmlentitycheck
|
||||||
ok {test-number} -
|
ok {test-number} -
|
||||||
1..2000
|
1..2006
|
||||||
|
|
||||||
|
@ -259,6 +259,8 @@ Exception.tests.cpp:<line number>|nunexpected exception with message:|n "unexpe
|
|||||||
##teamcity[testFinished name='Comparisons between unsigned ints and negative signed ints match c++ standard behaviour' duration="{duration}"]
|
##teamcity[testFinished name='Comparisons between unsigned ints and negative signed ints match c++ standard behaviour' duration="{duration}"]
|
||||||
##teamcity[testStarted name='Comparisons with int literals don|'t warn when mixing signed/ unsigned']
|
##teamcity[testStarted name='Comparisons with int literals don|'t warn when mixing signed/ unsigned']
|
||||||
##teamcity[testFinished name='Comparisons with int literals don|'t warn when mixing signed/ unsigned' duration="{duration}"]
|
##teamcity[testFinished name='Comparisons with int literals don|'t warn when mixing signed/ unsigned' duration="{duration}"]
|
||||||
|
##teamcity[testStarted name='Composed generic matchers shortcircuit']
|
||||||
|
##teamcity[testFinished name='Composed generic matchers shortcircuit' duration="{duration}"]
|
||||||
##teamcity[testStarted name='Composed matchers shortcircuit']
|
##teamcity[testStarted name='Composed matchers shortcircuit']
|
||||||
##teamcity[testFinished name='Composed matchers shortcircuit' duration="{duration}"]
|
##teamcity[testFinished name='Composed matchers shortcircuit' duration="{duration}"]
|
||||||
##teamcity[testStarted name='Contains string matcher']
|
##teamcity[testStarted name='Contains string matcher']
|
||||||
|
@ -3711,6 +3711,63 @@ Nor would this
|
|||||||
</Expression>
|
</Expression>
|
||||||
<OverallResult success="true"/>
|
<OverallResult success="true"/>
|
||||||
</TestCase>
|
</TestCase>
|
||||||
|
<TestCase name="Composed generic matchers shortcircuit" tags="[composed][generic][matchers]" filename="tests/<exe-name>/UsageTests/Matchers.tests.cpp" >
|
||||||
|
<Section name="MatchAllOf" filename="tests/<exe-name>/UsageTests/Matchers.tests.cpp" >
|
||||||
|
<Expression success="true" type="CHECK_FALSE" filename="tests/<exe-name>/UsageTests/Matchers.tests.cpp" >
|
||||||
|
<Original>
|
||||||
|
!(matcher.match( 1 ))
|
||||||
|
</Original>
|
||||||
|
<Expanded>
|
||||||
|
!false
|
||||||
|
</Expanded>
|
||||||
|
</Expression>
|
||||||
|
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/UsageTests/Matchers.tests.cpp" >
|
||||||
|
<Original>
|
||||||
|
first.matchCalled
|
||||||
|
</Original>
|
||||||
|
<Expanded>
|
||||||
|
true
|
||||||
|
</Expanded>
|
||||||
|
</Expression>
|
||||||
|
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/UsageTests/Matchers.tests.cpp" >
|
||||||
|
<Original>
|
||||||
|
!second.matchCalled
|
||||||
|
</Original>
|
||||||
|
<Expanded>
|
||||||
|
true
|
||||||
|
</Expanded>
|
||||||
|
</Expression>
|
||||||
|
<OverallResults successes="3" failures="0" expectedFailures="0"/>
|
||||||
|
</Section>
|
||||||
|
<Section name="MatchAnyOf" filename="tests/<exe-name>/UsageTests/Matchers.tests.cpp" >
|
||||||
|
<Expression success="true" type="CHECK" filename="tests/<exe-name>/UsageTests/Matchers.tests.cpp" >
|
||||||
|
<Original>
|
||||||
|
matcher.match(1)
|
||||||
|
</Original>
|
||||||
|
<Expanded>
|
||||||
|
true
|
||||||
|
</Expanded>
|
||||||
|
</Expression>
|
||||||
|
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/UsageTests/Matchers.tests.cpp" >
|
||||||
|
<Original>
|
||||||
|
first.matchCalled
|
||||||
|
</Original>
|
||||||
|
<Expanded>
|
||||||
|
true
|
||||||
|
</Expanded>
|
||||||
|
</Expression>
|
||||||
|
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/UsageTests/Matchers.tests.cpp" >
|
||||||
|
<Original>
|
||||||
|
!second.matchCalled
|
||||||
|
</Original>
|
||||||
|
<Expanded>
|
||||||
|
true
|
||||||
|
</Expanded>
|
||||||
|
</Expression>
|
||||||
|
<OverallResults successes="3" failures="0" expectedFailures="0"/>
|
||||||
|
</Section>
|
||||||
|
<OverallResult success="true"/>
|
||||||
|
</TestCase>
|
||||||
<TestCase name="Composed matchers shortcircuit" tags="[composed][matchers]" filename="tests/<exe-name>/UsageTests/Matchers.tests.cpp" >
|
<TestCase name="Composed matchers shortcircuit" tags="[composed][matchers]" filename="tests/<exe-name>/UsageTests/Matchers.tests.cpp" >
|
||||||
<Section name="&&" filename="tests/<exe-name>/UsageTests/Matchers.tests.cpp" >
|
<Section name="&&" filename="tests/<exe-name>/UsageTests/Matchers.tests.cpp" >
|
||||||
<Expression success="true" type="CHECK_THAT" filename="tests/<exe-name>/UsageTests/Matchers.tests.cpp" >
|
<Expression success="true" type="CHECK_THAT" filename="tests/<exe-name>/UsageTests/Matchers.tests.cpp" >
|
||||||
@ -18511,9 +18568,9 @@ loose text artifact
|
|||||||
</Section>
|
</Section>
|
||||||
<OverallResult success="true"/>
|
<OverallResult success="true"/>
|
||||||
</TestCase>
|
</TestCase>
|
||||||
<OverallResults successes="1831" failures="149" expectedFailures="21"/>
|
<OverallResults successes="1837" failures="149" expectedFailures="21"/>
|
||||||
<OverallResultsCases successes="258" failures="86" expectedFailures="4"/>
|
<OverallResultsCases successes="259" failures="86" expectedFailures="4"/>
|
||||||
</Group>
|
</Group>
|
||||||
<OverallResults successes="1831" failures="148" expectedFailures="21"/>
|
<OverallResults successes="1837" failures="148" expectedFailures="21"/>
|
||||||
<OverallResultsCases successes="258" failures="86" expectedFailures="4"/>
|
<OverallResultsCases successes="259" failures="86" expectedFailures="4"/>
|
||||||
</Catch>
|
</Catch>
|
||||||
|
@ -661,6 +661,49 @@ namespace { namespace MatchersTests {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct CheckedTestingGenericMatcher : Catch::Matchers::MatcherGenericBase {
|
||||||
|
mutable bool matchCalled = false;
|
||||||
|
bool matchSucceeds = false;
|
||||||
|
|
||||||
|
bool match(int const&) const {
|
||||||
|
matchCalled = true;
|
||||||
|
return matchSucceeds;
|
||||||
|
}
|
||||||
|
std::string describe() const override {
|
||||||
|
return "CheckedTestingGenericMatcher set to " + (matchSucceeds ? std::string("succeed") : std::string("fail"));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_CASE("Composed generic matchers shortcircuit", "[matchers][composed][generic]") {
|
||||||
|
// Check that if first returns false, second is not touched
|
||||||
|
CheckedTestingGenericMatcher first, second;
|
||||||
|
SECTION("MatchAllOf") {
|
||||||
|
first.matchSucceeds = false;
|
||||||
|
|
||||||
|
Detail::MatchAllOfGeneric<CheckedTestingGenericMatcher,
|
||||||
|
CheckedTestingGenericMatcher>
|
||||||
|
matcher{ first, second };
|
||||||
|
|
||||||
|
CHECK_FALSE( matcher.match( 1 ) );
|
||||||
|
|
||||||
|
// These two assertions are the important ones
|
||||||
|
REQUIRE(first.matchCalled);
|
||||||
|
REQUIRE(!second.matchCalled);
|
||||||
|
}
|
||||||
|
// Check that if first returns true, second is not touched
|
||||||
|
SECTION("MatchAnyOf") {
|
||||||
|
first.matchSucceeds = true;
|
||||||
|
|
||||||
|
Detail::MatchAnyOfGeneric<CheckedTestingGenericMatcher,
|
||||||
|
CheckedTestingGenericMatcher>
|
||||||
|
matcher{ first, second };
|
||||||
|
CHECK(matcher.match(1));
|
||||||
|
|
||||||
|
// These two assertions are the important ones
|
||||||
|
REQUIRE(first.matchCalled);
|
||||||
|
REQUIRE(!second.matchCalled);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template<typename Range>
|
template<typename Range>
|
||||||
|
Loading…
Reference in New Issue
Block a user