diff options
| author | Raphael Schaller | 2021-11-14 17:05:31 +0100 |
|---|---|---|
| committer | Martin Hořeňovský | 2022-07-16 16:16:05 +0200 |
| commit | 1bd233866c5ba1d94fbea34b260685b4b4ecb796 (patch) | |
| tree | f12a6ec27174d50af450a537ed49f006de505301 | |
| parent | f993b702c694211690a01de19e6d9eaa9912cae8 (diff) | |
| download | catch3-1bd233866c5ba1d94fbea34b260685b4b4ecb796.tar.gz | |
Add AllTrue, AnyTrue, NoneTrue matchers
22 files changed, 3104 insertions, 27 deletions
diff --git a/docs/matchers.md b/docs/matchers.md index 3d0f8f11..0060bfd1 100644 --- a/docs/matchers.md +++ b/docs/matchers.md @@ -258,6 +258,12 @@ definitions to handle generic range-like types. These are: * `SizeIs(Matcher size_matcher)` * `Contains(T&& target_element, Comparator = std::equal_to<>{})` * `Contains(Matcher element_matcher)` +* `AllMatch(Matcher element_matcher)` +* `NoneMatch(Matcher element_matcher)` +* `AnyMatch(Matcher element_matcher)` +* `AllTrue()` +* `NoneTrue()` +* `AnyTrue()` `IsEmpty` should be self-explanatory. It successfully matches objects that are empty according to either `std::empty`, or ADL-found `empty` @@ -275,6 +281,14 @@ the target element. The other variant is constructed from a matcher, in which case a range is accepted if any of its elements is accepted by the provided matcher. +`AllMatch`, `NoneMatch`, and `AnyMatch` match ranges for which either +all, none, or any of the contained elements matches the given matcher, +respectively. + +`AllTrue`, `NoneTrue`, and `AnyTrue` match ranges for which either +all, none, or any of the contained elements are `true`, respectively. +It works for ranges of `bool`s and ranges of elements (explicitly) +convertible to `bool`. ## Writing custom matchers (old style) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2aa67b8f..b3dc5570 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -187,6 +187,7 @@ set(IMPL_SOURCES ${SOURCES_DIR}/interfaces/catch_interfaces_reporter.cpp ${SOURCES_DIR}/internal/catch_list.cpp ${SOURCES_DIR}/matchers/catch_matchers_floating_point.cpp + ${SOURCES_DIR}/matchers/catch_matchers_quantifiers.cpp ${SOURCES_DIR}/matchers/catch_matchers_string.cpp ${SOURCES_DIR}/matchers/catch_matchers_templated.cpp ${SOURCES_DIR}/catch_message.cpp diff --git a/src/catch2/matchers/catch_matchers_quantifiers.cpp b/src/catch2/matchers/catch_matchers_quantifiers.cpp new file mode 100644 index 00000000..1f2e48d8 --- /dev/null +++ b/src/catch2/matchers/catch_matchers_quantifiers.cpp @@ -0,0 +1,24 @@ + +// Copyright Catch2 Authors +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// https://www.boost.org/LICENSE_1_0.txt) + +// SPDX-License-Identifier: BSL-1.0 +#include <catch2/matchers/catch_matchers_quantifiers.hpp> + +namespace Catch { + namespace Matchers { + std::string AllTrueMatcher::describe() const { return "contains only true"; } + + AllTrueMatcher AllTrue() { return AllTrueMatcher{}; } + + std::string NoneTrueMatcher::describe() const { return "contains no true"; } + + NoneTrueMatcher NoneTrue() { return NoneTrueMatcher{}; } + + std::string AnyTrueMatcher::describe() const { return "contains at least one true"; } + + AnyTrueMatcher AnyTrue() { return AnyTrueMatcher{}; } + } // namespace Matchers +} // namespace Catch diff --git a/src/catch2/matchers/catch_matchers_quantifiers.hpp b/src/catch2/matchers/catch_matchers_quantifiers.hpp index e0e1a62d..8833440f 100644 --- a/src/catch2/matchers/catch_matchers_quantifiers.hpp +++ b/src/catch2/matchers/catch_matchers_quantifiers.hpp @@ -85,7 +85,55 @@ namespace Catch { } }; - // Creates a matcher that checks whether a range contains element matching a matcher + // Matcher for checking that all elements in range are true. + class AllTrueMatcher final : public MatcherGenericBase { + public: + std::string describe() const override; + + template <typename RangeLike> + bool match(RangeLike&& rng) const { + for (auto&& elem : rng) { + if (!elem) { + return false; + } + } + return true; + } + }; + + // Matcher for checking that no element in range is true. + class NoneTrueMatcher final : public MatcherGenericBase { + public: + std::string describe() const override; + + template <typename RangeLike> + bool match(RangeLike&& rng) const { + for (auto&& elem : rng) { + if (elem) { + return false; + } + } + return true; + } + }; + + // Matcher for checking that any element in range is true. + class AnyTrueMatcher final : public MatcherGenericBase { + public: + std::string describe() const override; + + template <typename RangeLike> + bool match(RangeLike&& rng) const { + for (auto&& elem : rng) { + if (elem) { + return true; + } + } + return false; + } + }; + + // Creates a matcher that checks whether all elements in a range match a matcher template <typename Matcher> AllMatchMatcher<Matcher> AllMatch(Matcher&& matcher) { return { CATCH_FORWARD(matcher) }; @@ -102,6 +150,15 @@ namespace Catch { AnyMatchMatcher<Matcher> AnyMatch(Matcher&& matcher) { return { CATCH_FORWARD(matcher) }; } + + // Creates a matcher that checks whether all elements in a range are true + AllTrueMatcher AllTrue(); + + // Creates a matcher that checks whether no element in a range is true + NoneTrueMatcher NoneTrue(); + + // Creates a matcher that checks whether any element in a range is true + AnyTrueMatcher AnyTrue(); } } diff --git a/tests/SelfTest/Baselines/automake.sw.approved.txt b/tests/SelfTest/Baselines/automake.sw.approved.txt index a0e83826..b8b59566 100644 --- a/tests/SelfTest/Baselines/automake.sw.approved.txt +++ b/tests/SelfTest/Baselines/automake.sw.approved.txt @@ -271,8 +271,11 @@ Message from section two :test-result: FAIL Unexpected exceptions can be translated :test-result: PASS Upcasting special member functions :test-result: PASS Usage of AllMatch range matcher +:test-result: PASS Usage of AllTrue range matcher :test-result: PASS Usage of AnyMatch range matcher +:test-result: PASS Usage of AnyTrue range matcher :test-result: PASS Usage of NoneMatch range matcher +:test-result: PASS Usage of NoneTrue range matcher :test-result: PASS Usage of the SizeIs range matcher :test-result: PASS Use a custom approx :test-result: PASS Variadic macros diff --git a/tests/SelfTest/Baselines/automake.sw.multi.approved.txt b/tests/SelfTest/Baselines/automake.sw.multi.approved.txt index a1dd3ffc..2afd308b 100644 --- a/tests/SelfTest/Baselines/automake.sw.multi.approved.txt +++ b/tests/SelfTest/Baselines/automake.sw.multi.approved.txt @@ -264,8 +264,11 @@ :test-result: FAIL Unexpected exceptions can be translated :test-result: PASS Upcasting special member functions :test-result: PASS Usage of AllMatch range matcher +:test-result: PASS Usage of AllTrue range matcher :test-result: PASS Usage of AnyMatch range matcher +:test-result: PASS Usage of AnyTrue range matcher :test-result: PASS Usage of NoneMatch range matcher +:test-result: PASS Usage of NoneTrue range matcher :test-result: PASS Usage of the SizeIs range matcher :test-result: PASS Use a custom approx :test-result: PASS Variadic macros diff --git a/tests/SelfTest/Baselines/compact.sw.approved.txt b/tests/SelfTest/Baselines/compact.sw.approved.txt index 1d2bf38b..6d23d01d 100644 --- a/tests/SelfTest/Baselines/compact.sw.approved.txt +++ b/tests/SelfTest/Baselines/compact.sw.approved.txt @@ -2013,6 +2013,25 @@ MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[1] for: true MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[2] for: true MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[3]) for: !false MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[4]) for: !false +MatchersRanges.tests.cpp:<line number>: passed: data, AllTrue() for: { true, true, true, true, true } contains only true +MatchersRanges.tests.cpp:<line number>: passed: data, AllTrue() for: { } contains only true +MatchersRanges.tests.cpp:<line number>: passed: data, !AllTrue() for: { true, true, false, true, true } not contains only true +MatchersRanges.tests.cpp:<line number>: passed: data, !AllTrue() for: { false, false, false, false, false } not contains only true +MatchersRanges.tests.cpp:<line number>: passed: data, AllTrue() for: { true, true, true, true, true } contains only true +MatchersRanges.tests.cpp:<line number>: passed: data, !AllTrue() for: { true, true, false, true, true } not contains only true +MatchersRanges.tests.cpp:<line number>: passed: data, !AllTrue() for: { false, false, false, false, false } not contains only true +MatchersRanges.tests.cpp:<line number>: passed: mocked, AllTrue() for: { true, true, true, true, true } contains only true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[0] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[1] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[2] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[3] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[4] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked, !AllTrue() for: { true, true, false, true, true } not contains only true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[0] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[1] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[2] for: true +MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[3]) for: !false +MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[4]) for: !false MatchersRanges.tests.cpp:<line number>: passed: data, AnyMatch(SizeIs(5)) for: { { 0, 1, 2, 3, 5 }, { 4, -3, -2, 5, 0 }, { 0, 0, 0, 5, 0 }, { 0, -5, 0, 5, 0 }, { 1, 0, 0, -1, 5 } } any match has size == 5 MatchersRanges.tests.cpp:<line number>: passed: data, !AnyMatch(Contains(0) && Contains(10)) for: { { 0, 1, 2, 3, 5 }, { 4, -3, -2, 5, 0 }, { 0, 0, 0, 5, 0 }, { 0, -5, 0, 5, 0 }, { 1, 0, 0, -1, 5 } } not any match ( contains element 0 and contains element 10 ) MatchersRanges.tests.cpp:<line number>: passed: needs_adl, AnyMatch( Predicate<int>( []( int elem ) { return elem < 3; } ) ) for: { 1, 2, 3, 4, 5 } any match matches undescribed predicate @@ -2028,6 +2047,25 @@ MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[1]) for: !fal MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[2]) for: !false MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[3]) for: !false MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[4]) for: !false +MatchersRanges.tests.cpp:<line number>: passed: data, AnyTrue() for: { true, true, true, true, true } contains at least one true +MatchersRanges.tests.cpp:<line number>: passed: data, !AnyTrue() for: { } not contains at least one true +MatchersRanges.tests.cpp:<line number>: passed: data, AnyTrue() for: { false, false, true, false, false } contains at least one true +MatchersRanges.tests.cpp:<line number>: passed: data, !AnyTrue() for: { false, false, false, false, false } not contains at least one true +MatchersRanges.tests.cpp:<line number>: passed: data, AnyTrue() for: { true, true, true, true, true } contains at least one true +MatchersRanges.tests.cpp:<line number>: passed: data, AnyTrue() for: { false, false, true, false, false } contains at least one true +MatchersRanges.tests.cpp:<line number>: passed: data, !AnyTrue() for: { false, false, false, false, false } not contains at least one true +MatchersRanges.tests.cpp:<line number>: passed: mocked, AnyTrue() for: { false, false, false, false, true } contains at least one true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[0] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[1] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[2] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[3] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[4] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked, AnyTrue() for: { false, false, true, true, true } contains at least one true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[0] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[1] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[2] for: true +MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[3]) for: !false +MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[4]) for: !false MatchersRanges.tests.cpp:<line number>: passed: data, NoneMatch(SizeIs(6)) for: { { 0, 1, 2, 3, 5 }, { 4, -3, -2, 5, 0 }, { 0, 0, 0, 5, 0 }, { 0, -5, 0, 5, 0 }, { 1, 0, 0, -1, 5 } } none match has size == 6 MatchersRanges.tests.cpp:<line number>: passed: data, !NoneMatch(Contains(0) && Contains(1)) for: { { 0, 1, 2, 3, 5 }, { 4, -3, -2, 5, 0 }, { 0, 0, 0, 5, 0 }, { 0, -5, 0, 5, 0 }, { 1, 0, 0, -1, 5 } } not none match ( contains element 0 and contains element 1 ) MatchersRanges.tests.cpp:<line number>: passed: needs_adl, NoneMatch( Predicate<int>( []( int elem ) { return elem > 6; } ) ) for: { 1, 2, 3, 4, 5 } none match matches undescribed predicate @@ -2043,6 +2081,25 @@ MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[1]) for: !fal MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[2]) for: !false MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[3]) for: !false MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[4]) for: !false +MatchersRanges.tests.cpp:<line number>: passed: data, !NoneTrue() for: { true, true, true, true, true } not contains no true +MatchersRanges.tests.cpp:<line number>: passed: data, NoneTrue() for: { } contains no true +MatchersRanges.tests.cpp:<line number>: passed: data, !NoneTrue() for: { false, false, true, false, false } not contains no true +MatchersRanges.tests.cpp:<line number>: passed: data, NoneTrue() for: { false, false, false, false, false } contains no true +MatchersRanges.tests.cpp:<line number>: passed: data, !NoneTrue() for: { true, true, true, true, true } not contains no true +MatchersRanges.tests.cpp:<line number>: passed: data, !NoneTrue() for: { false, false, true, false, false } not contains no true +MatchersRanges.tests.cpp:<line number>: passed: data, NoneTrue() for: { false, false, false, false, false } contains no true +MatchersRanges.tests.cpp:<line number>: passed: mocked, NoneTrue() for: { false, false, false, false, false } contains no true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[0] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[1] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[2] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[3] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[4] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked, !NoneTrue() for: { false, false, true, true, true } not contains no true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[0] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[1] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[2] for: true +MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[3]) for: !false +MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[4]) for: !false MatchersRanges.tests.cpp:<line number>: passed: empty_vec, SizeIs(0) for: { } has size == 0 MatchersRanges.tests.cpp:<line number>: passed: empty_vec, !SizeIs(2) for: { } not has size == 2 MatchersRanges.tests.cpp:<line number>: passed: empty_vec, SizeIs(Lt(2)) for: { } size matches is less than 2 diff --git a/tests/SelfTest/Baselines/compact.sw.multi.approved.txt b/tests/SelfTest/Baselines/compact.sw.multi.approved.txt index fbce2de2..a3500a35 100644 --- a/tests/SelfTest/Baselines/compact.sw.multi.approved.txt +++ b/tests/SelfTest/Baselines/compact.sw.multi.approved.txt @@ -2006,6 +2006,25 @@ MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[1] for: true MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[2] for: true MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[3]) for: !false MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[4]) for: !false +MatchersRanges.tests.cpp:<line number>: passed: data, AllTrue() for: { true, true, true, true, true } contains only true +MatchersRanges.tests.cpp:<line number>: passed: data, AllTrue() for: { } contains only true +MatchersRanges.tests.cpp:<line number>: passed: data, !AllTrue() for: { true, true, false, true, true } not contains only true +MatchersRanges.tests.cpp:<line number>: passed: data, !AllTrue() for: { false, false, false, false, false } not contains only true +MatchersRanges.tests.cpp:<line number>: passed: data, AllTrue() for: { true, true, true, true, true } contains only true +MatchersRanges.tests.cpp:<line number>: passed: data, !AllTrue() for: { true, true, false, true, true } not contains only true +MatchersRanges.tests.cpp:<line number>: passed: data, !AllTrue() for: { false, false, false, false, false } not contains only true +MatchersRanges.tests.cpp:<line number>: passed: mocked, AllTrue() for: { true, true, true, true, true } contains only true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[0] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[1] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[2] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[3] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[4] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked, !AllTrue() for: { true, true, false, true, true } not contains only true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[0] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[1] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[2] for: true +MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[3]) for: !false +MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[4]) for: !false MatchersRanges.tests.cpp:<line number>: passed: data, AnyMatch(SizeIs(5)) for: { { 0, 1, 2, 3, 5 }, { 4, -3, -2, 5, 0 }, { 0, 0, 0, 5, 0 }, { 0, -5, 0, 5, 0 }, { 1, 0, 0, -1, 5 } } any match has size == 5 MatchersRanges.tests.cpp:<line number>: passed: data, !AnyMatch(Contains(0) && Contains(10)) for: { { 0, 1, 2, 3, 5 }, { 4, -3, -2, 5, 0 }, { 0, 0, 0, 5, 0 }, { 0, -5, 0, 5, 0 }, { 1, 0, 0, -1, 5 } } not any match ( contains element 0 and contains element 10 ) MatchersRanges.tests.cpp:<line number>: passed: needs_adl, AnyMatch( Predicate<int>( []( int elem ) { return elem < 3; } ) ) for: { 1, 2, 3, 4, 5 } any match matches undescribed predicate @@ -2021,6 +2040,25 @@ MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[1]) for: !fal MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[2]) for: !false MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[3]) for: !false MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[4]) for: !false +MatchersRanges.tests.cpp:<line number>: passed: data, AnyTrue() for: { true, true, true, true, true } contains at least one true +MatchersRanges.tests.cpp:<line number>: passed: data, !AnyTrue() for: { } not contains at least one true +MatchersRanges.tests.cpp:<line number>: passed: data, AnyTrue() for: { false, false, true, false, false } contains at least one true +MatchersRanges.tests.cpp:<line number>: passed: data, !AnyTrue() for: { false, false, false, false, false } not contains at least one true +MatchersRanges.tests.cpp:<line number>: passed: data, AnyTrue() for: { true, true, true, true, true } contains at least one true +MatchersRanges.tests.cpp:<line number>: passed: data, AnyTrue() for: { false, false, true, false, false } contains at least one true +MatchersRanges.tests.cpp:<line number>: passed: data, !AnyTrue() for: { false, false, false, false, false } not contains at least one true +MatchersRanges.tests.cpp:<line number>: passed: mocked, AnyTrue() for: { false, false, false, false, true } contains at least one true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[0] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[1] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[2] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[3] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[4] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked, AnyTrue() for: { false, false, true, true, true } contains at least one true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[0] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[1] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[2] for: true +MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[3]) for: !false +MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[4]) for: !false MatchersRanges.tests.cpp:<line number>: passed: data, NoneMatch(SizeIs(6)) for: { { 0, 1, 2, 3, 5 }, { 4, -3, -2, 5, 0 }, { 0, 0, 0, 5, 0 }, { 0, -5, 0, 5, 0 }, { 1, 0, 0, -1, 5 } } none match has size == 6 MatchersRanges.tests.cpp:<line number>: passed: data, !NoneMatch(Contains(0) && Contains(1)) for: { { 0, 1, 2, 3, 5 }, { 4, -3, -2, 5, 0 }, { 0, 0, 0, 5, 0 }, { 0, -5, 0, 5, 0 }, { 1, 0, 0, -1, 5 } } not none match ( contains element 0 and contains element 1 ) MatchersRanges.tests.cpp:<line number>: passed: needs_adl, NoneMatch( Predicate<int>( []( int elem ) { return elem > 6; } ) ) for: { 1, 2, 3, 4, 5 } none match matches undescribed predicate @@ -2036,6 +2074,25 @@ MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[1]) for: !fal MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[2]) for: !false MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[3]) for: !false MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[4]) for: !false +MatchersRanges.tests.cpp:<line number>: passed: data, !NoneTrue() for: { true, true, true, true, true } not contains no true +MatchersRanges.tests.cpp:<line number>: passed: data, NoneTrue() for: { } contains no true +MatchersRanges.tests.cpp:<line number>: passed: data, !NoneTrue() for: { false, false, true, false, false } not contains no true +MatchersRanges.tests.cpp:<line number>: passed: data, NoneTrue() for: { false, false, false, false, false } contains no true +MatchersRanges.tests.cpp:<line number>: passed: data, !NoneTrue() for: { true, true, true, true, true } not contains no true +MatchersRanges.tests.cpp:<line number>: passed: data, !NoneTrue() for: { false, false, true, false, false } not contains no true +MatchersRanges.tests.cpp:<line number>: passed: data, NoneTrue() for: { false, false, false, false, false } contains no true +MatchersRanges.tests.cpp:<line number>: passed: mocked, NoneTrue() for: { false, false, false, false, false } contains no true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[0] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[1] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[2] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[3] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[4] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked, !NoneTrue() for: { false, false, true, true, true } not contains no true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[0] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[1] for: true +MatchersRanges.tests.cpp:<line number>: passed: mocked.m_derefed[2] for: true +MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[3]) for: !false +MatchersRanges.tests.cpp:<line number>: passed: !(mocked.m_derefed[4]) for: !false MatchersRanges.tests.cpp:<line number>: passed: empty_vec, SizeIs(0) for: { } has size == 0 MatchersRanges.tests.cpp:<line number>: passed: empty_vec, !SizeIs(2) for: { } not has size == 2 MatchersRanges.tests.cpp:<line number>: passed: empty_vec, SizeIs(Lt(2)) for: { } size matches is less than 2 diff --git a/tests/SelfTest/Baselines/console.std.approved.txt b/tests/SelfTest/Baselines/console.std.approved.txt index 0ad308be..6962e508 100644 --- a/tests/SelfTest/Baselines/console.std.approved.txt +++ b/tests/SelfTest/Baselines/console.std.approved.txt @@ -1394,6 +1394,6 @@ due to unexpected exception with message: Why would you throw a std::string? =============================================================================== -test cases: 391 | 315 passed | 69 failed | 7 failed as expected -assertions: 2227 | 2072 passed | 128 failed | 27 failed as expected +test cases: 394 | 318 passed | 69 failed | 7 failed as expected +assertions: 2284 | 2129 passed | 128 failed | 27 failed as expected diff --git a/tests/SelfTest/Baselines/console.sw.approved.txt b/tests/SelfTest/Baselines/console.sw.approved.txt index ae8af438..63dd231e 100644 --- a/tests/SelfTest/Baselines/console.sw.approved.txt +++ b/tests/SelfTest/Baselines/console.sw.approved.txt @@ -14147,6 +14147,173 @@ with expansion: !false ------------------------------------------------------------------------------- +Usage of AllTrue range matcher + Basic usage + All true evaluates to true +------------------------------------------------------------------------------- +MatchersRanges.tests.cpp:<line number> +............................................................................... + +MatchersRanges.tests.cpp:<line number>: PASSED: + REQUIRE_THAT( data, AllTrue() ) +with expansion: + { true, true, true, true, true } contains only true + +------------------------------------------------------------------------------- +Usage of AllTrue range matcher + Basic usage + Empty evaluates to true +------------------------------------------------------------------------------- +MatchersRanges.tests.cpp:<line number> +............................................................................... + +MatchersRanges.tests.cpp:<line number>: PASSED: + REQUIRE_THAT( data, AllTrue() ) +with expansion: + { } contains only true + +------------------------------------------------------------------------------- +Usage of AllTrue range matcher + Basic usage + One false evalutes to false +------------------------------------------------------------------------------- +MatchersRanges.tests.cpp:<line number> +............................................................................... + +MatchersRanges.tests.cpp:<line number>: PASSED: + REQUIRE_THAT( data, !AllTrue() ) +with expansion: + { true, true, false, true, true } not contains only true + +------------------------------------------------------------------------------- +Usage of AllTrue range matcher + Basic usage + All false evaluates to false +------------------------------------------------------------------------------- +MatchersRanges.tests.cpp:<line number> +............................................................................... + +MatchersRanges.tests.cpp:<line number>: PASSED: + REQUIRE_THAT( data, !AllTrue() ) +with expansion: + { false, false, false, false, false } not contains only true + +------------------------------------------------------------------------------- +Usage of AllTrue range matcher + Contained type is convertible to bool + All true evaluates to true +------------------------------------------------------------------------------- +MatchersRanges.tests.cpp:<line number> +............................................................................... + +MatchersRanges.tests.cpp:<line number>: PASSED: + REQUIRE_THAT( data, AllTrue() ) +with expansion: + { true, true, true, true, true } contains only true + +------------------------------------------------------------------------------- +Usage of AllTrue range matcher + Contained type is convertible to bool + One false evalutes to false +------------------------------------------------------------------------------- +MatchersRanges.tests.cpp:<line number> +............................................................................... + +MatchersRanges.tests.cpp:<line number>: PASSED: + REQUIRE_THAT( data, !AllTrue() ) +with expansion: + { true, true, false, true, true } not contains only true + +------------------------------------------------------------------------------- +Usage of AllTrue range matcher + Contained type is convertible to bool + All false evaluates to false +------------------------------------------------------------------------------- +MatchersRanges.tests.cpp:<line number> +............................................................................... + +MatchersRanges.tests.cpp:<line number>: PASSED: + REQUIRE_THAT( data, !AllTrue() ) +with expansion: + { false, false, false, false, false } not contains only true + +------------------------------------------------------------------------------- +Usage of AllTrue range matcher + Shortcircuiting + All are read +------------------------------------------------------------------------------- +MatchersRanges.tests.cpp:<line number> +............................................................................... + +MatchersRanges.tests.cpp:<line number>: PASSED: + REQUIRE_THAT( mocked, AllTrue() ) +with expansion: + { true, true, true, true, true } contains only true + +MatchersRanges.tests.cpp:<line number>: PASSED: + REQUIRE( mocked.m_derefed[0] ) +with expansion: + true + +MatchersRanges.tests.cpp:<line number>: PASSED: + REQUIRE( mocked.m_derefed[1] ) +with expansion: + true + +MatchersRanges.tests.cpp:<line number>: PASSED: + REQUIRE( mocked.m_derefed[2] ) +with expansion: + true + +MatchersRanges.tests.cpp:<line number>: PASSED: + REQUIRE( mocked.m_derefed[3] ) +with expansion: + true + +MatchersRanges.tests.cpp:<line number>: PASSED: + REQUIRE( mocked.m_derefed[4] ) +with expansion: + true + +------------------------------------------------------------------------------- +Usage of AllTrue range matcher + Shortcircuiting + Short-circuited +------------------------------------------------------------------------------- +MatchersRanges.tests.cpp:<line number> +............................................................................... + +MatchersRanges.tests.cpp:<line number>: PASSED: + REQUIRE_THAT |