From ef2f8fb18b85f9f15e1d4b12cd75e34bf43fbd40 Mon Sep 17 00:00:00 2001 From: Stefan Haller Date: Sat, 12 Oct 2024 17:18:59 +0200 Subject: [PATCH] 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. --- .../matchers/catch_matchers_range_equals.hpp | 32 +++++++++++++++ .../Baselines/compact.sw.approved.txt | 6 ++- .../Baselines/compact.sw.multi.approved.txt | 6 ++- .../Baselines/console.std.approved.txt | 2 +- .../Baselines/console.sw.approved.txt | 36 ++++++++++++++++- .../Baselines/console.sw.multi.approved.txt | 36 ++++++++++++++++- .../SelfTest/Baselines/junit.sw.approved.txt | 4 +- .../Baselines/junit.sw.multi.approved.txt | 4 +- .../Baselines/sonarqube.sw.approved.txt | 2 + .../Baselines/sonarqube.sw.multi.approved.txt | 2 + tests/SelfTest/Baselines/tap.sw.approved.txt | 10 ++++- .../Baselines/tap.sw.multi.approved.txt | 10 ++++- tests/SelfTest/Baselines/xml.sw.approved.txt | 40 ++++++++++++++++++- .../Baselines/xml.sw.multi.approved.txt | 40 ++++++++++++++++++- .../UsageTests/MatchersRanges.tests.cpp | 19 +++++++++ 15 files changed, 238 insertions(+), 11 deletions(-) diff --git a/src/catch2/matchers/catch_matchers_range_equals.hpp b/src/catch2/matchers/catch_matchers_range_equals.hpp index 49ba19b51e..8130f604fd 100644 --- a/src/catch2/matchers/catch_matchers_range_equals.hpp +++ b/src/catch2/matchers/catch_matchers_range_equals.hpp @@ -108,6 +108,22 @@ namespace Catch { 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. + * + * Uses the provided predicate `predicate` to do the comparisons + * (defaulting to `std::equal_to`) + */ + template {} )> + constexpr + RangeEqualsMatcher, Equality> + RangeEquals( std::initializer_list 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. @@ -123,6 +139,22 @@ namespace Catch { 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 {} )> + constexpr + UnorderedRangeEqualsMatcher, Equality> + UnorderedRangeEquals( std::initializer_list range, + Equality&& predicate = std::equal_to<>{} ) { + return { range, CATCH_FORWARD( predicate ) }; + } } // namespace Matchers } // namespace Catch diff --git a/tests/SelfTest/Baselines/compact.sw.approved.txt b/tests/SelfTest/Baselines/compact.sw.approved.txt index 1f0dd01255..b7f48cbca4 100644 --- a/tests/SelfTest/Baselines/compact.sw.approved.txt +++ b/tests/SelfTest/Baselines/compact.sw.approved.txt @@ -2284,6 +2284,8 @@ MatchersRanges.tests.cpp:: passed: vector_a, RangeEquals( vector_a_ MatchersRanges.tests.cpp:: passed: vector_a, !RangeEquals( vector_b, close_enough ) for: { 1, 2, 3 } not elements are { 3, 3, 4 } MatchersRanges.tests.cpp:: passed: needs_adl1, RangeEquals( needs_adl2 ) for: { 1, 2, 3, 4, 5 } elements are { 1, 2, 3, 4, 5 } MatchersRanges.tests.cpp:: 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:: passed: array_a, RangeEquals( { 1, 2, 3 } ) for: { 1, 2, 3 } elements are { 1, 2, 3 } +MatchersRanges.tests.cpp:: 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:: passed: mocked1, !RangeEquals( arr ) for: { 1, 2, 3, 4 } not elements are { 1, 2, 4, 4 } MatchersRanges.tests.cpp:: passed: mocked1.m_derefed[0] for: true MatchersRanges.tests.cpp:: passed: mocked1.m_derefed[1] for: true @@ -2304,6 +2306,8 @@ MatchersRanges.tests.cpp:: passed: vector_a, !UnorderedRangeEquals( MatchersRanges.tests.cpp:: passed: vector_a, UnorderedRangeEquals( vector_a_plus_1, close_enough ) for: { 1, 10, 20 } unordered elements are { 11, 21, 2 } MatchersRanges.tests.cpp:: passed: vector_a, !UnorderedRangeEquals( vector_b, close_enough ) for: { 1, 10, 21 } not unordered elements are { 11, 21, 3 } MatchersRanges.tests.cpp:: passed: needs_adl1, UnorderedRangeEquals( needs_adl2 ) for: { 1, 2, 3, 4, 5 } unordered elements are { 1, 2, 3, 4, 5 } +MatchersRanges.tests.cpp:: passed: array_a, UnorderedRangeEquals( { 10, 20, 1 } ) for: { 1, 10, 20 } unordered elements are { 10, 20, 1 } +MatchersRanges.tests.cpp:: 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:: passed: empty_vec, SizeIs(0) for: { } has size == 0 MatchersRanges.tests.cpp:: passed: empty_vec, !SizeIs(2) for: { } not has size == 2 MatchersRanges.tests.cpp:: passed: empty_vec, SizeIs(Lt(2)) for: { } size matches is less than 2 @@ -2851,6 +2855,6 @@ InternalBenchmark.tests.cpp:: passed: q3 == 23. for: 23.0 == 23.0 Misc.tests.cpp:: passed: Misc.tests.cpp:: 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 diff --git a/tests/SelfTest/Baselines/compact.sw.multi.approved.txt b/tests/SelfTest/Baselines/compact.sw.multi.approved.txt index 77812a62a6..9e3e537231 100644 --- a/tests/SelfTest/Baselines/compact.sw.multi.approved.txt +++ b/tests/SelfTest/Baselines/compact.sw.multi.approved.txt @@ -2277,6 +2277,8 @@ MatchersRanges.tests.cpp:: passed: vector_a, RangeEquals( vector_a_ MatchersRanges.tests.cpp:: passed: vector_a, !RangeEquals( vector_b, close_enough ) for: { 1, 2, 3 } not elements are { 3, 3, 4 } MatchersRanges.tests.cpp:: passed: needs_adl1, RangeEquals( needs_adl2 ) for: { 1, 2, 3, 4, 5 } elements are { 1, 2, 3, 4, 5 } MatchersRanges.tests.cpp:: 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:: passed: array_a, RangeEquals( { 1, 2, 3 } ) for: { 1, 2, 3 } elements are { 1, 2, 3 } +MatchersRanges.tests.cpp:: 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:: passed: mocked1, !RangeEquals( arr ) for: { 1, 2, 3, 4 } not elements are { 1, 2, 4, 4 } MatchersRanges.tests.cpp:: passed: mocked1.m_derefed[0] for: true MatchersRanges.tests.cpp:: passed: mocked1.m_derefed[1] for: true @@ -2297,6 +2299,8 @@ MatchersRanges.tests.cpp:: passed: vector_a, !UnorderedRangeEquals( MatchersRanges.tests.cpp:: passed: vector_a, UnorderedRangeEquals( vector_a_plus_1, close_enough ) for: { 1, 10, 20 } unordered elements are { 11, 21, 2 } MatchersRanges.tests.cpp:: passed: vector_a, !UnorderedRangeEquals( vector_b, close_enough ) for: { 1, 10, 21 } not unordered elements are { 11, 21, 3 } MatchersRanges.tests.cpp:: passed: needs_adl1, UnorderedRangeEquals( needs_adl2 ) for: { 1, 2, 3, 4, 5 } unordered elements are { 1, 2, 3, 4, 5 } +MatchersRanges.tests.cpp:: passed: array_a, UnorderedRangeEquals( { 10, 20, 1 } ) for: { 1, 10, 20 } unordered elements are { 10, 20, 1 } +MatchersRanges.tests.cpp:: 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:: passed: empty_vec, SizeIs(0) for: { } has size == 0 MatchersRanges.tests.cpp:: passed: empty_vec, !SizeIs(2) for: { } not has size == 2 MatchersRanges.tests.cpp:: passed: empty_vec, SizeIs(Lt(2)) for: { } size matches is less than 2 @@ -2840,6 +2844,6 @@ InternalBenchmark.tests.cpp:: passed: q3 == 23. for: 23.0 == 23.0 Misc.tests.cpp:: passed: Misc.tests.cpp:: 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 diff --git a/tests/SelfTest/Baselines/console.std.approved.txt b/tests/SelfTest/Baselines/console.std.approved.txt index 1003e549af..495264b4dd 100644 --- a/tests/SelfTest/Baselines/console.std.approved.txt +++ b/tests/SelfTest/Baselines/console.std.approved.txt @@ -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 diff --git a/tests/SelfTest/Baselines/console.sw.approved.txt b/tests/SelfTest/Baselines/console.sw.approved.txt index 3519b7716a..d7e31e731e 100644 --- a/tests/SelfTest/Baselines/console.sw.approved.txt +++ b/tests/SelfTest/Baselines/console.sw.approved.txt @@ -14981,6 +14981,23 @@ MatchersRanges.tests.cpp:: 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: +............................................................................... + +MatchersRanges.tests.cpp:: PASSED: + REQUIRE_THAT( array_a, RangeEquals( { 1, 2, 3 } ) ) +with expansion: + { 1, 2, 3 } elements are { 1, 2, 3 } + +MatchersRanges.tests.cpp:: 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:: 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: +............................................................................... + +MatchersRanges.tests.cpp:: PASSED: + REQUIRE_THAT( array_a, UnorderedRangeEquals( { 10, 20, 1 } ) ) +with expansion: + { 1, 10, 20 } unordered elements are { 10, 20, 1 } + +MatchersRanges.tests.cpp:: 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:: 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 diff --git a/tests/SelfTest/Baselines/console.sw.multi.approved.txt b/tests/SelfTest/Baselines/console.sw.multi.approved.txt index 1fe0b73e68..2c1460af10 100644 --- a/tests/SelfTest/Baselines/console.sw.multi.approved.txt +++ b/tests/SelfTest/Baselines/console.sw.multi.approved.txt @@ -14974,6 +14974,23 @@ MatchersRanges.tests.cpp:: 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: +............................................................................... + +MatchersRanges.tests.cpp:: PASSED: + REQUIRE_THAT( array_a, RangeEquals( { 1, 2, 3 } ) ) +with expansion: + { 1, 2, 3 } elements are { 1, 2, 3 } + +MatchersRanges.tests.cpp:: 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:: 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: +............................................................................... + +MatchersRanges.tests.cpp:: PASSED: + REQUIRE_THAT( array_a, UnorderedRangeEquals( { 10, 20, 1 } ) ) +with expansion: + { 1, 10, 20 } unordered elements are { 10, 20, 1 } + +MatchersRanges.tests.cpp:: 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:: 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 diff --git a/tests/SelfTest/Baselines/junit.sw.approved.txt b/tests/SelfTest/Baselines/junit.sw.approved.txt index 33f207c5d2..5c5407ad1b 100644 --- a/tests/SelfTest/Baselines/junit.sw.approved.txt +++ b/tests/SelfTest/Baselines/junit.sw.approved.txt @@ -1,7 +1,7 @@ - + @@ -1652,6 +1652,7 @@ at Exception.tests.cpp: + @@ -1667,6 +1668,7 @@ at Exception.tests.cpp: + diff --git a/tests/SelfTest/Baselines/junit.sw.multi.approved.txt b/tests/SelfTest/Baselines/junit.sw.multi.approved.txt index 876a4db47d..f44369e5cd 100644 --- a/tests/SelfTest/Baselines/junit.sw.multi.approved.txt +++ b/tests/SelfTest/Baselines/junit.sw.multi.approved.txt @@ -1,6 +1,6 @@ - + @@ -1651,6 +1651,7 @@ at Exception.tests.cpp: + @@ -1666,6 +1667,7 @@ at Exception.tests.cpp: + diff --git a/tests/SelfTest/Baselines/sonarqube.sw.approved.txt b/tests/SelfTest/Baselines/sonarqube.sw.approved.txt index 1839724099..9e26a142c0 100644 --- a/tests/SelfTest/Baselines/sonarqube.sw.approved.txt +++ b/tests/SelfTest/Baselines/sonarqube.sw.approved.txt @@ -1607,6 +1607,7 @@ at Matchers.tests.cpp: + @@ -1622,6 +1623,7 @@ at Matchers.tests.cpp: + diff --git a/tests/SelfTest/Baselines/sonarqube.sw.multi.approved.txt b/tests/SelfTest/Baselines/sonarqube.sw.multi.approved.txt index 77348788ad..7e6a7502bb 100644 --- a/tests/SelfTest/Baselines/sonarqube.sw.multi.approved.txt +++ b/tests/SelfTest/Baselines/sonarqube.sw.multi.approved.txt @@ -1606,6 +1606,7 @@ at Matchers.tests.cpp: + @@ -1621,6 +1622,7 @@ at Matchers.tests.cpp: + diff --git a/tests/SelfTest/Baselines/tap.sw.approved.txt b/tests/SelfTest/Baselines/tap.sw.approved.txt index ea53d4210b..19b968b8d2 100644 --- a/tests/SelfTest/Baselines/tap.sw.approved.txt +++ b/tests/SelfTest/Baselines/tap.sw.approved.txt @@ -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 diff --git a/tests/SelfTest/Baselines/tap.sw.multi.approved.txt b/tests/SelfTest/Baselines/tap.sw.multi.approved.txt index 3f8f72ebb4..d92b12764e 100644 --- a/tests/SelfTest/Baselines/tap.sw.multi.approved.txt +++ b/tests/SelfTest/Baselines/tap.sw.multi.approved.txt @@ -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 diff --git a/tests/SelfTest/Baselines/xml.sw.approved.txt b/tests/SelfTest/Baselines/xml.sw.approved.txt index c64c5a7bf9..397eb4875b 100644 --- a/tests/SelfTest/Baselines/xml.sw.approved.txt +++ b/tests/SelfTest/Baselines/xml.sw.approved.txt @@ -17383,6 +17383,25 @@ There is no extra whitespace here +
+ + + array_a, RangeEquals( { 1, 2, 3 } ) + + + { 1, 2, 3 } elements are { 1, 2, 3 } + + + + + array_a, RangeEquals( { 2, 4, 6 }, []( int l, int r ) { return l * 2 == r; } ) + + + { 1, 2, 3 } elements are { 2, 4, 6 } + + + +
@@ -17609,6 +17628,25 @@ There is no extra whitespace here
+
+ + + array_a, UnorderedRangeEquals( { 10, 20, 1 } ) + + + { 1, 10, 20 } unordered elements are { 10, 20, 1 } + + + + + array_a, UnorderedRangeEquals( { 11, 21, 2 }, []( int l, int r ) { return std::abs( l - r ) <= 1; } ) + + + { 1, 10, 20 } unordered elements are { 11, 21, 2 } + + + +
@@ -21933,6 +21971,6 @@ Approx( -1.95996398454005449 )
- + diff --git a/tests/SelfTest/Baselines/xml.sw.multi.approved.txt b/tests/SelfTest/Baselines/xml.sw.multi.approved.txt index d35ba1af5a..56e3e8bf4c 100644 --- a/tests/SelfTest/Baselines/xml.sw.multi.approved.txt +++ b/tests/SelfTest/Baselines/xml.sw.multi.approved.txt @@ -17383,6 +17383,25 @@ There is no extra whitespace here +
+ + + array_a, RangeEquals( { 1, 2, 3 } ) + + + { 1, 2, 3 } elements are { 1, 2, 3 } + + + + + array_a, RangeEquals( { 2, 4, 6 }, []( int l, int r ) { return l * 2 == r; } ) + + + { 1, 2, 3 } elements are { 2, 4, 6 } + + + +
@@ -17609,6 +17628,25 @@ There is no extra whitespace here
+
+ + + array_a, UnorderedRangeEquals( { 10, 20, 1 } ) + + + { 1, 10, 20 } unordered elements are { 10, 20, 1 } + + + + + array_a, UnorderedRangeEquals( { 11, 21, 2 }, []( int l, int r ) { return std::abs( l - r ) <= 1; } ) + + + { 1, 10, 20 } unordered elements are { 11, 21, 2 } + + + +
@@ -21932,6 +21970,6 @@ Approx( -1.95996398454005449 )
- + diff --git a/tests/SelfTest/UsageTests/MatchersRanges.tests.cpp b/tests/SelfTest/UsageTests/MatchersRanges.tests.cpp index cc8c54f8bf..4f906b99af 100644 --- a/tests/SelfTest/UsageTests/MatchersRanges.tests.cpp +++ b/tests/SelfTest/UsageTests/MatchersRanges.tests.cpp @@ -727,6 +727,15 @@ TEST_CASE( "Usage of RangeEquals range matcher", "[matchers][templated][quantifi } ) ); } + SECTION( "Compare against std::initializer_list" ) { + const std::array 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 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 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; + } ) ); + } } /**