Skip to content

Commit 69d62ab

Browse files
Stefan Hallerhorenmar
Stefan Haller
authored andcommitted
Provide overloads for {Unordered}RangeEquals taking a std::initializer_list
This allows writing something like const auto v = calculateSomeVectorOfInts(); CHECK_THAT(v, RangeEquals({1, 2, 3})); Fixes #2915.
1 parent 1e0ccb1 commit 69d62ab

15 files changed

+238
-11
lines changed

src/catch2/matchers/catch_matchers_range_equals.hpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,22 @@ namespace Catch {
108108
return { CATCH_FORWARD( range ), CATCH_FORWARD( predicate ) };
109109
}
110110

111+
/**
112+
* Creates a matcher that checks if all elements in a range are equal
113+
* to all elements in an initializer list.
114+
*
115+
* Uses the provided predicate `predicate` to do the comparisons
116+
* (defaulting to `std::equal_to`)
117+
*/
118+
template <typename T,
119+
typename Equality = decltype( std::equal_to<>{} )>
120+
constexpr
121+
RangeEqualsMatcher<std::initializer_list<T>, Equality>
122+
RangeEquals( std::initializer_list<T> range,
123+
Equality&& predicate = std::equal_to<>{} ) {
124+
return { range, CATCH_FORWARD( predicate ) };
125+
}
126+
111127
/**
112128
* Creates a matcher that checks if all elements in a range are equal
113129
* to all elements in another range, in some permutation.
@@ -123,6 +139,22 @@ namespace Catch {
123139
Equality&& predicate = std::equal_to<>{} ) {
124140
return { CATCH_FORWARD( range ), CATCH_FORWARD( predicate ) };
125141
}
142+
143+
/**
144+
* Creates a matcher that checks if all elements in a range are equal
145+
* to all elements in an initializer list, in some permutation.
146+
*
147+
* Uses the provided predicate `predicate` to do the comparisons
148+
* (defaulting to `std::equal_to`)
149+
*/
150+
template <typename T,
151+
typename Equality = decltype( std::equal_to<>{} )>
152+
constexpr
153+
UnorderedRangeEqualsMatcher<std::initializer_list<T>, Equality>
154+
UnorderedRangeEquals( std::initializer_list<T> range,
155+
Equality&& predicate = std::equal_to<>{} ) {
156+
return { range, CATCH_FORWARD( predicate ) };
157+
}
126158
} // namespace Matchers
127159
} // namespace Catch
128160

tests/SelfTest/Baselines/compact.sw.approved.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2284,6 +2284,8 @@ MatchersRanges.tests.cpp:<line number>: passed: vector_a, RangeEquals( vector_a_
22842284
MatchersRanges.tests.cpp:<line number>: passed: vector_a, !RangeEquals( vector_b, close_enough ) for: { 1, 2, 3 } not elements are { 3, 3, 4 }
22852285
MatchersRanges.tests.cpp:<line number>: passed: needs_adl1, RangeEquals( needs_adl2 ) for: { 1, 2, 3, 4, 5 } elements are { 1, 2, 3, 4, 5 }
22862286
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 }
2287+
MatchersRanges.tests.cpp:<line number>: passed: array_a, RangeEquals( { 1, 2, 3 } ) for: { 1, 2, 3 } elements are { 1, 2, 3 }
2288+
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 }
22872289
MatchersRanges.tests.cpp:<line number>: passed: mocked1, !RangeEquals( arr ) for: { 1, 2, 3, 4 } not elements are { 1, 2, 4, 4 }
22882290
MatchersRanges.tests.cpp:<line number>: passed: mocked1.m_derefed[0] for: true
22892291
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(
23042306
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 }
23052307
MatchersRanges.tests.cpp:<line number>: passed: vector_a, !UnorderedRangeEquals( vector_b, close_enough ) for: { 1, 10, 21 } not unordered elements are { 11, 21, 3 }
23062308
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 }
2309+
MatchersRanges.tests.cpp:<line number>: passed: array_a, UnorderedRangeEquals( { 10, 20, 1 } ) for: { 1, 10, 20 } unordered elements are { 10, 20, 1 }
2310+
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 }
23072311
MatchersRanges.tests.cpp:<line number>: passed: empty_vec, SizeIs(0) for: { } has size == 0
23082312
MatchersRanges.tests.cpp:<line number>: passed: empty_vec, !SizeIs(2) for: { } not has size == 2
23092313
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
28512855
Misc.tests.cpp:<line number>: passed:
28522856
Misc.tests.cpp:<line number>: passed:
28532857
test cases: 419 | 313 passed | 86 failed | 6 skipped | 14 failed as expected
2854-
assertions: 2265 | 2083 passed | 147 failed | 35 failed as expected
2858+
assertions: 2269 | 2087 passed | 147 failed | 35 failed as expected
28552859

28562860

tests/SelfTest/Baselines/compact.sw.multi.approved.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2277,6 +2277,8 @@ MatchersRanges.tests.cpp:<line number>: passed: vector_a, RangeEquals( vector_a_
22772277
MatchersRanges.tests.cpp:<line number>: passed: vector_a, !RangeEquals( vector_b, close_enough ) for: { 1, 2, 3 } not elements are { 3, 3, 4 }
22782278
MatchersRanges.tests.cpp:<line number>: passed: needs_adl1, RangeEquals( needs_adl2 ) for: { 1, 2, 3, 4, 5 } elements are { 1, 2, 3, 4, 5 }
22792279
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 }
2280+
MatchersRanges.tests.cpp:<line number>: passed: array_a, RangeEquals( { 1, 2, 3 } ) for: { 1, 2, 3 } elements are { 1, 2, 3 }
2281+
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 }
22802282
MatchersRanges.tests.cpp:<line number>: passed: mocked1, !RangeEquals( arr ) for: { 1, 2, 3, 4 } not elements are { 1, 2, 4, 4 }
22812283
MatchersRanges.tests.cpp:<line number>: passed: mocked1.m_derefed[0] for: true
22822284
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(
22972299
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 }
22982300
MatchersRanges.tests.cpp:<line number>: passed: vector_a, !UnorderedRangeEquals( vector_b, close_enough ) for: { 1, 10, 21 } not unordered elements are { 11, 21, 3 }
22992301
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 }
2302+
MatchersRanges.tests.cpp:<line number>: passed: array_a, UnorderedRangeEquals( { 10, 20, 1 } ) for: { 1, 10, 20 } unordered elements are { 10, 20, 1 }
2303+
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 }
23002304
MatchersRanges.tests.cpp:<line number>: passed: empty_vec, SizeIs(0) for: { } has size == 0
23012305
MatchersRanges.tests.cpp:<line number>: passed: empty_vec, !SizeIs(2) for: { } not has size == 2
23022306
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
28402844
Misc.tests.cpp:<line number>: passed:
28412845
Misc.tests.cpp:<line number>: passed:
28422846
test cases: 419 | 313 passed | 86 failed | 6 skipped | 14 failed as expected
2843-
assertions: 2265 | 2083 passed | 147 failed | 35 failed as expected
2847+
assertions: 2269 | 2087 passed | 147 failed | 35 failed as expected
28442848

28452849

tests/SelfTest/Baselines/console.std.approved.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1611,5 +1611,5 @@ due to unexpected exception with message:
16111611

16121612
===============================================================================
16131613
test cases: 419 | 327 passed | 71 failed | 7 skipped | 14 failed as expected
1614-
assertions: 2248 | 2083 passed | 130 failed | 35 failed as expected
1614+
assertions: 2252 | 2087 passed | 130 failed | 35 failed as expected
16151615

tests/SelfTest/Baselines/console.sw.approved.txt

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14981,6 +14981,23 @@ MatchersRanges.tests.cpp:<line number>: PASSED:
1498114981
with expansion:
1498214982
{ 1, 2, 3, 4, 5 } elements are { 2, 3, 4, 5, 6 }
1498314983

14984+
-------------------------------------------------------------------------------
14985+
Usage of RangeEquals range matcher
14986+
Compare against std::initializer_list
14987+
-------------------------------------------------------------------------------
14988+
MatchersRanges.tests.cpp:<line number>
14989+
...............................................................................
14990+
14991+
MatchersRanges.tests.cpp:<line number>: PASSED:
14992+
REQUIRE_THAT( array_a, RangeEquals( { 1, 2, 3 } ) )
14993+
with expansion:
14994+
{ 1, 2, 3 } elements are { 1, 2, 3 }
14995+
14996+
MatchersRanges.tests.cpp:<line number>: PASSED:
14997+
REQUIRE_THAT( array_a, RangeEquals( { 2, 4, 6 }, []( int l, int r ) { return l * 2 == r; } ) )
14998+
with expansion:
14999+
{ 1, 2, 3 } elements are { 2, 4, 6 }
15000+
1498415001
-------------------------------------------------------------------------------
1498515002
Usage of RangeEquals range matcher
1498615003
Check short-circuiting behaviour
@@ -15168,6 +15185,23 @@ MatchersRanges.tests.cpp:<line number>: PASSED:
1516815185
with expansion:
1516915186
{ 1, 2, 3, 4, 5 } unordered elements are { 1, 2, 3, 4, 5 }
1517015187

15188+
-------------------------------------------------------------------------------
15189+
Usage of UnorderedRangeEquals range matcher
15190+
Compare against std::initializer_list
15191+
-------------------------------------------------------------------------------
15192+
MatchersRanges.tests.cpp:<line number>
15193+
...............................................................................
15194+
15195+
MatchersRanges.tests.cpp:<line number>: PASSED:
15196+
REQUIRE_THAT( array_a, UnorderedRangeEquals( { 10, 20, 1 } ) )
15197+
with expansion:
15198+
{ 1, 10, 20 } unordered elements are { 10, 20, 1 }
15199+
15200+
MatchersRanges.tests.cpp:<line number>: PASSED:
15201+
REQUIRE_THAT( array_a, UnorderedRangeEquals( { 11, 21, 2 }, []( int l, int r ) { return std::abs( l - r ) <= 1; } ) )
15202+
with expansion:
15203+
{ 1, 10, 20 } unordered elements are { 11, 21, 2 }
15204+
1517115205
-------------------------------------------------------------------------------
1517215206
Usage of the SizeIs range matcher
1517315207
Some with stdlib containers
@@ -18979,5 +19013,5 @@ Misc.tests.cpp:<line number>: PASSED:
1897919013

1898019014
===============================================================================
1898119015
test cases: 419 | 313 passed | 86 failed | 6 skipped | 14 failed as expected
18982-
assertions: 2265 | 2083 passed | 147 failed | 35 failed as expected
19016+
assertions: 2269 | 2087 passed | 147 failed | 35 failed as expected
1898319017

tests/SelfTest/Baselines/console.sw.multi.approved.txt

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14974,6 +14974,23 @@ MatchersRanges.tests.cpp:<line number>: PASSED:
1497414974
with expansion:
1497514975
{ 1, 2, 3, 4, 5 } elements are { 2, 3, 4, 5, 6 }
1497614976

14977+
-------------------------------------------------------------------------------
14978+
Usage of RangeEquals range matcher
14979+
Compare against std::initializer_list
14980+
-------------------------------------------------------------------------------
14981+
MatchersRanges.tests.cpp:<line number>
14982+
...............................................................................
14983+
14984+
MatchersRanges.tests.cpp:<line number>: PASSED:
14985+
REQUIRE_THAT( array_a, RangeEquals( { 1, 2, 3 } ) )
14986+
with expansion:
14987+
{ 1, 2, 3 } elements are { 1, 2, 3 }
14988+
14989+
MatchersRanges.tests.cpp:<line number>: PASSED:
14990+
REQUIRE_THAT( array_a, RangeEquals( { 2, 4, 6 }, []( int l, int r ) { return l * 2 == r; } ) )
14991+
with expansion:
14992+
{ 1, 2, 3 } elements are { 2, 4, 6 }
14993+
1497714994
-------------------------------------------------------------------------------
1497814995
Usage of RangeEquals range matcher
1497914996
Check short-circuiting behaviour
@@ -15161,6 +15178,23 @@ MatchersRanges.tests.cpp:<line number>: PASSED:
1516115178
with expansion:
1516215179
{ 1, 2, 3, 4, 5 } unordered elements are { 1, 2, 3, 4, 5 }
1516315180

15181+
-------------------------------------------------------------------------------
15182+
Usage of UnorderedRangeEquals range matcher
15183+
Compare against std::initializer_list
15184+
-------------------------------------------------------------------------------
15185+
MatchersRanges.tests.cpp:<line number>
15186+
...............................................................................
15187+
15188+
MatchersRanges.tests.cpp:<line number>: PASSED:
15189+
REQUIRE_THAT( array_a, UnorderedRangeEquals( { 10, 20, 1 } ) )
15190+
with expansion:
15191+
{ 1, 10, 20 } unordered elements are { 10, 20, 1 }
15192+
15193+
MatchersRanges.tests.cpp:<line number>: PASSED:
15194+
REQUIRE_THAT( array_a, UnorderedRangeEquals( { 11, 21, 2 }, []( int l, int r ) { return std::abs( l - r ) <= 1; } ) )
15195+
with expansion:
15196+
{ 1, 10, 20 } unordered elements are { 11, 21, 2 }
15197+
1516415198
-------------------------------------------------------------------------------
1516515199
Usage of the SizeIs range matcher
1516615200
Some with stdlib containers
@@ -18968,5 +19002,5 @@ Misc.tests.cpp:<line number>: PASSED:
1896819002

1896919003
===============================================================================
1897019004
test cases: 419 | 313 passed | 86 failed | 6 skipped | 14 failed as expected
18971-
assertions: 2265 | 2083 passed | 147 failed | 35 failed as expected
19005+
assertions: 2269 | 2087 passed | 147 failed | 35 failed as expected
1897219006

tests/SelfTest/Baselines/junit.sw.approved.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<testsuitesloose text artifact
33
>
4-
<testsuite name="<exe-name>" errors="17" failures="130" skipped="12" tests="2277" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
4+
<testsuite name="<exe-name>" errors="17" failures="130" skipped="12" tests="2281" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
55
<properties>
66
<property name="random-seed" value="1"/>
77
<property name="filters" value="&quot;*&quot; ~[!nonportable] ~[!benchmark] ~[approvals]"/>
@@ -1652,6 +1652,7 @@ at Exception.tests.cpp:<line number>
16521652
<testcase classname="<exe-name>.global" name="Usage of RangeEquals range matcher/Custom predicate/Two equal non-empty containers (close enough)" time="{duration}" status="run"/>
16531653
<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"/>
16541654
<testcase classname="<exe-name>.global" name="Usage of RangeEquals range matcher/Ranges that need ADL begin/end" time="{duration}" status="run"/>
1655+
<testcase classname="<exe-name>.global" name="Usage of RangeEquals range matcher/Compare against std::initializer_list" time="{duration}" status="run"/>
16551656
<testcase classname="<exe-name>.global" name="Usage of RangeEquals range matcher/Check short-circuiting behaviour" time="{duration}" status="run"/>
16561657
<testcase classname="<exe-name>.global" name="Usage of RangeEquals range matcher/Check short-circuiting behaviour/Check short-circuits on failure" time="{duration}" status="run"/>
16571658
<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>
16671668
<testcase classname="<exe-name>.global" name="Usage of UnorderedRangeEquals range matcher/Custom predicate/Two equal non-empty containers (close enough)" time="{duration}" status="run"/>
16681669
<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"/>
16691670
<testcase classname="<exe-name>.global" name="Usage of UnorderedRangeEquals range matcher/Ranges that need ADL begin/end" time="{duration}" status="run"/>
1671+
<testcase classname="<exe-name>.global" name="Usage of UnorderedRangeEquals range matcher/Compare against std::initializer_list" time="{duration}" status="run"/>
16701672
<testcase classname="<exe-name>.global" name="Usage of the SizeIs range matcher" time="{duration}" status="run"/>
16711673
<testcase classname="<exe-name>.global" name="Usage of the SizeIs range matcher/Some with stdlib containers" time="{duration}" status="run"/>
16721674
<testcase classname="<exe-name>.global" name="Usage of the SizeIs range matcher/Type requires ADL found size free function" time="{duration}" status="run"/>

tests/SelfTest/Baselines/junit.sw.multi.approved.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<testsuites>
3-
<testsuite name="<exe-name>" errors="17" failures="130" skipped="12" tests="2277" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
3+
<testsuite name="<exe-name>" errors="17" failures="130" skipped="12" tests="2281" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
44
<properties>
55
<property name="random-seed" value="1"/>
66
<property name="filters" value="&quot;*&quot; ~[!nonportable] ~[!benchmark] ~[approvals]"/>
@@ -1651,6 +1651,7 @@ at Exception.tests.cpp:<line number>
16511651
<testcase classname="<exe-name>.global" name="Usage of RangeEquals range matcher/Custom predicate/Two equal non-empty containers (close enough)" time="{duration}" status="run"/>
16521652
<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"/>
16531653
<testcase classname="<exe-name>.global" name="Usage of RangeEquals range matcher/Ranges that need ADL begin/end" time="{duration}" status="run"/>
1654+
<testcase classname="<exe-name>.global" name="Usage of RangeEquals range matcher/Compare against std::initializer_list" time="{duration}" status="run"/>
16541655
<testcase classname="<exe-name>.global" name="Usage of RangeEquals range matcher/Check short-circuiting behaviour" time="{duration}" status="run"/>
16551656
<testcase classname="<exe-name>.global" name="Usage of RangeEquals range matcher/Check short-circuiting behaviour/Check short-circuits on failure" time="{duration}" status="run"/>
16561657
<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>
16661667
<testcase classname="<exe-name>.global" name="Usage of UnorderedRangeEquals range matcher/Custom predicate/Two equal non-empty containers (close enough)" time="{duration}" status="run"/>
16671668
<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"/>
16681669
<testcase classname="<exe-name>.global" name="Usage of UnorderedRangeEquals range matcher/Ranges that need ADL begin/end" time="{duration}" status="run"/>
1670+
<testcase classname="<exe-name>.global" name="Usage of UnorderedRangeEquals range matcher/Compare against std::initializer_list" time="{duration}" status="run"/>
16691671
<testcase classname="<exe-name>.global" name="Usage of the SizeIs range matcher" time="{duration}" status="run"/>
16701672
<testcase classname="<exe-name>.global" name="Usage of the SizeIs range matcher/Some with stdlib containers" time="{duration}" status="run"/>
16711673
<testcase classname="<exe-name>.global" name="Usage of the SizeIs range matcher/Type requires ADL found size free function" time="{duration}" status="run"/>

0 commit comments

Comments
 (0)