Skip to content

Instantly share code, notes, and snippets.

@melak47
Created February 12, 2020 19:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save melak47/8d8429c102fda933ce98dca31cb400fc to your computer and use it in GitHub Desktop.
Save melak47/8d8429c102fda933ce98dca31cb400fc to your computer and use it in GitHub Desktop.
catch2 benchmark
#include <catch2/catch.hpp>
#include <catch2/catch_matchers_string.h>
#include <catch2/catch_matchers_vector.h>
template<typename Range>
struct EqualsRangeMatcher : Catch::MatcherBaseGeneric<EqualsRangeMatcher<Range>> {
EqualsRangeMatcher(Range const& range) : range{range} {}
template<typename OtherRange>
bool match(OtherRange const& other) const {
using std::begin;
using std::end;
return std::equal(begin(range), end(range), begin(other), end(other));
}
std::string describe() const {
return "Equals: " + Catch::rangeToString(range);
}
private:
Range const& range;
};
template<typename Range>
auto EqualsRange(const Range& range) -> EqualsRangeMatcher<Range> {
return EqualsRangeMatcher<Range>{range};
}
#include <array>
#include <vector>
#include <list>
TEST_CASE("example") {
std::array<int, 3> container{1,2,3};
std::array<int, 3> a{1,2,3};
std::vector<int> b{0,1,2};
std::list<int> c{4,5,6};
CHECK_THAT(container, EqualsRange(a) || EqualsRange(b) || EqualsRange(c));
CHECK_THAT(container, EqualsRange(a) || EqualsRange(b));
CHECK_THAT(container, EqualsRange(a) && EqualsRange(b) && EqualsRange(c));
CHECK_THAT(container, EqualsRange(a) || EqualsRange(b) && EqualsRange(b) || EqualsRange(c));
CHECK_THAT(container,
(!!EqualsRange(c) || EqualsRange(c)) || (EqualsRange(c) || EqualsRange(c))
);
CHECK_THAT(container,
!EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c)
&& !EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c)
|| !EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c)
|| !(EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c))
&& !!(EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c))
|| !!(EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c)) &&
!EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c)
&& !EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c)
|| !EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c)
|| !(EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c))
&& !!(EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c))
|| !!(EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c)) &&
!(!EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c)
&& !EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c)
|| !EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c)
|| !(EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c))
&& !!(EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c))
|| !!(EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c)))
);
}
TEST_CASE("old and new matchers") {
using Catch::Matchers::EndsWith;
using Catch::Matchers::Equals;
std::string text = "foobar";
std::array<char, 6> arr{'f', 'o', 'o', 'b', 'a', 'r'};
std::vector<char> vec(text.begin(), text.end());
CHECK_THAT(text, EqualsRange(arr) && EndsWith("bar") );
CHECK_THAT(text, EndsWith("bar") || EqualsRange(arr) );
}
TEST_CASE("a", "[matchers][templated]") {
std::array<int, 3> container{{ 1,2,3 }};
std::array<int, 3> a{{ 1,2,3 }};
std::vector<int> b{ 0,1,2 };
std::list<int> c{ 4,5,6 };
for(int i = 0; i < 1'000'000; ++i) {
REQUIRE_THAT(container, EqualsRange(a) || EqualsRange(b) || EqualsRange(c));
}
}
TEST_CASE("b", "[matchers][templated]") {
const std::string str = "foobar";
const std::array<char, 6> arr{{ 'f', 'o', 'o', 'b', 'a', 'r' }};
const std::array<char, 6> bad_arr{{ 'o', 'o', 'f', 'b', 'a', 'r' }};
using Catch::Matchers::StartsWith;
using Catch::Matchers::EndsWith;
for(int i = 0; i < 1'000'000; ++i) {
REQUIRE_THAT(str, StartsWith("foo") && EqualsRange(arr) && EndsWith("bar"));
REQUIRE_THAT(str, StartsWith("foo") && !EqualsRange(bad_arr) && EndsWith("bar"));
}
}
#include <catch2/catch.hpp>
#include <catch2/catch_matchers_string.h>
#include <catch2/catch_matchers_vector.h>
#include <catch2/catch_matchers_templates.hpp>
template<typename Range>
struct EqualsRangeMatcher final : Catch::MatcherGenericBase {
EqualsRangeMatcher(Range const& range) : range{range} {}
template<typename OtherRange>
bool match(OtherRange const& other) const {
using std::begin;
using std::end;
return std::equal(begin(range), end(range), begin(other), end(other));
}
std::string describe() const override {
return "Equals: " + Catch::rangeToString(range);
}
private:
Range const& range;
};
template<typename Range>
auto EqualsRange(const Range& range) -> EqualsRangeMatcher<Range> {
return EqualsRangeMatcher<Range>{range};
}
#include <array>
#include <vector>
#include <list>
TEST_CASE("example") {
std::array<int, 3> container{1,2,3};
std::array<int, 3> a{1,2,3};
std::vector<int> b{0,1,2};
std::list<int> c{4,5,6};
CHECK_THAT(container, EqualsRange(a) || EqualsRange(b) || EqualsRange(c));
CHECK_THAT(container, EqualsRange(a) || EqualsRange(b));
CHECK_THAT(container, EqualsRange(a) && EqualsRange(b) && EqualsRange(c));
CHECK_THAT(container, EqualsRange(a) || EqualsRange(b) && EqualsRange(b) || EqualsRange(c));
CHECK_THAT(container,
(!!EqualsRange(c) || EqualsRange(c)) || (EqualsRange(c) || EqualsRange(c))
);
CHECK_THAT(container,
!EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c)
&& !EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c)
|| !EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c)
|| !(EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c))
&& !!(EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c))
|| !!(EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c)) &&
!EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c)
&& !EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c)
|| !EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c)
|| !(EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c))
&& !!(EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c))
|| !!(EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c)) &&
!(!EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c)
&& !EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c)
|| !EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c)
|| !(EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c))
&& !!(EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c))
|| !!(EqualsRange(b) && EqualsRange(c) || EqualsRange(b) && EqualsRange(c) || !EqualsRange(c)))
);
}
TEST_CASE("old and new matchers") {
using Catch::Matchers::EndsWith;
using Catch::Matchers::Equals;
std::string text = "foobar";
std::array<char, 6> arr{'f', 'o', 'o', 'b', 'a', 'r'};
std::vector<char> vec(text.begin(), text.end());
CHECK_THAT(text, EqualsRange(arr) && EndsWith("bar") );
CHECK_THAT(text, EndsWith("bar") || EqualsRange(arr) );
}
TEST_CASE("a", "[matchers][templated]") {
std::array<int, 3> container{{ 1,2,3 }};
std::array<int, 3> a{{ 1,2,3 }};
std::vector<int> b{ 0,1,2 };
std::list<int> c{ 4,5,6 };
for(int i = 0; i < 1'000'000; ++i) {
REQUIRE_THAT(container, EqualsRange(a) || EqualsRange(b) || EqualsRange(c));
}
}
TEST_CASE("b", "[matchers][templated]") {
const std::string str = "foobar";
const std::array<char, 6> arr{{ 'f', 'o', 'o', 'b', 'a', 'r' }};
const std::array<char, 6> bad_arr{{ 'o', 'o', 'f', 'b', 'a', 'r' }};
using Catch::Matchers::StartsWith;
using Catch::Matchers::EndsWith;
for(int i = 0; i < 1'000'000; ++i) {
REQUIRE_THAT(str, StartsWith("foo") && EqualsRange(arr) && EndsWith("bar"));
REQUIRE_THAT(str, StartsWith("foo") && !EqualsRange(bad_arr) && EndsWith("bar"));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment