// Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include #include #include #include #include #include #include namespace unrelated { class needs_ADL_begin { std::array elements{ {1, 2, 3, 4, 5} }; public: using iterator = std::array::iterator; using const_iterator = std::array::const_iterator; const_iterator Begin() const { return elements.begin(); } const_iterator End() const { return elements.end(); } friend const_iterator begin(needs_ADL_begin const& lhs) { return lhs.Begin(); } friend const_iterator end(needs_ADL_begin const& rhs) { return rhs.End(); } }; } // end anon namespace struct MoveOnlyTestElement { int num = 0; MoveOnlyTestElement(int n) :num(n) {} MoveOnlyTestElement(MoveOnlyTestElement&& rhs) = default; MoveOnlyTestElement& operator=(MoveOnlyTestElement&& rhs) = default; friend bool operator==(MoveOnlyTestElement const& lhs, MoveOnlyTestElement const& rhs) { return lhs.num == rhs.num; } friend std::ostream& operator<<(std::ostream& out, MoveOnlyTestElement const& elem) { out << elem.num; return out; } }; TEST_CASE("Basic use of the Contains range matcher", "[matchers][templated][contains]") { using Catch::Matchers::Contains; SECTION("Different argument ranges, same element type, default comparison") { std::array a{ { 1,2,3 } }; std::vector b{ 0,1,2 }; std::list c{ 4,5,6 }; // A contains 1 REQUIRE_THAT(a, Contains(1)); // B contains 1 REQUIRE_THAT(b, Contains(1)); // C does not contain 1 REQUIRE_THAT(c, !Contains(1)); } SECTION("Different argument ranges, same element type, custom comparison") { std::array a{ { 1,2,3 } }; std::vector b{ 0,1,2 }; std::list c{ 4,5,6 }; auto close_enough = [](int lhs, int rhs) { return std::abs(lhs - rhs) <= 1; }; // A contains 1, which is "close enough" to 0 REQUIRE_THAT(a, Contains(0, close_enough)); // B contains 0 directly REQUIRE_THAT(b, Contains(0, close_enough)); // C does not contain anything "close enough" to 0 REQUIRE_THAT(c, !Contains(0, close_enough)); } SECTION("Different element type, custom comparisons") { std::array a{ { "abc", "abcd" , "abcde" } }; REQUIRE_THAT(a, Contains(4, [](auto&& lhs, size_t sz) { return lhs.size() == sz; })); } SECTION("Can handle type that requires ADL-found free function begin and end") { unrelated::needs_ADL_begin in; REQUIRE_THAT(in, Contains(1)); REQUIRE_THAT(in, !Contains(8)); } SECTION("Initialization with move only types") { std::array in{ { MoveOnlyTestElement{ 1 }, MoveOnlyTestElement{ 2 }, MoveOnlyTestElement{ 3 } } }; REQUIRE_THAT(in, Contains(MoveOnlyTestElement{ 2 })); REQUIRE_THAT(in, !Contains(MoveOnlyTestElement{ 9 })); } SECTION("Matching using matcher") { std::array in{ {1, 2, 3} }; REQUIRE_THAT(in, Contains(Catch::Matchers::WithinAbs(0.5, 0.5))); } }