|
|
@@ -8,14 +8,25 @@
|
|
|
|
|
|
#include <gmock/gmock.h>
|
|
|
|
|
|
+#include "opaque_typedef/comparable.hpp"
|
|
|
#include "opaque_typedef/opaque_typedef.hpp"
|
|
|
|
|
|
-using namespace types;
|
|
|
+// Make compilation (but not linking) possible for StaticAssertTypeEq to check
|
|
|
+// 'does a real version of this function exist'
|
|
|
+template <typename T> void operator==(T const &, T const &);
|
|
|
+template <typename T> void operator!=(T const &, T const &);
|
|
|
+template <typename T> void operator<(T const &, T const &);
|
|
|
+template <typename T> void operator<=(T const &, T const &);
|
|
|
+template <typename T> void operator>(T const &, T const &);
|
|
|
+template <typename T> void operator>=(T const &, T const &);
|
|
|
|
|
|
+// Types for Test Cases
|
|
|
+using namespace types;
|
|
|
using incomparible = opaque_typedef<int, struct incomparible_tag>;
|
|
|
using port = opaque_typedef<int, struct port_tag, EqualityComparable>;
|
|
|
using x_pos = opaque_typedef<int, struct x_pos_tag, Comparable>;
|
|
|
|
|
|
+// Testing Printers
|
|
|
void PrintTo(incomparible const & ot, std::ostream * os) {
|
|
|
(*os) << "incomparible";
|
|
|
}
|
|
|
@@ -28,71 +39,61 @@ void PrintTo(x_pos const & ot, std::ostream * os) {
|
|
|
(*os) << "x:" << int(ot);
|
|
|
}
|
|
|
|
|
|
-using testing::StaticAssertTypeEq;
|
|
|
-using testing::Eq;
|
|
|
-using testing::Ne;
|
|
|
-using testing::Gt;
|
|
|
-using testing::Ge;
|
|
|
-using testing::Lt;
|
|
|
-using testing::Le;
|
|
|
-
|
|
|
-template <typename T> void operator==(T const &, T const &);
|
|
|
-template <typename T> void operator!=(T const &, T const &);
|
|
|
-template <typename T> void operator<(T const &, T const &);
|
|
|
-template <typename T> void operator<=(T const &, T const &);
|
|
|
-template <typename T> void operator>(T const &, T const &);
|
|
|
-template <typename T> void operator>=(T const &, T const &);
|
|
|
-
|
|
|
-TEST(OpaqueTypedefCompareTest, CannotCompareWithoutSkill) {
|
|
|
+// Actual Test Bodies
|
|
|
+TEST(OpaqueTypedefNotComparableTest, CannotCompareAny) {
|
|
|
incomparible i(1);
|
|
|
- EXPECT_TRUE((StaticAssertTypeEq<void, decltype(i == i)>()));
|
|
|
- EXPECT_TRUE((StaticAssertTypeEq<void, decltype(i != i)>()));
|
|
|
- EXPECT_TRUE((StaticAssertTypeEq<void, decltype(i < i)>()));
|
|
|
- EXPECT_TRUE((StaticAssertTypeEq<void, decltype(i <= i)>()));
|
|
|
- EXPECT_TRUE((StaticAssertTypeEq<void, decltype(i > i)>()));
|
|
|
- EXPECT_TRUE((StaticAssertTypeEq<void, decltype(i >= i)>()));
|
|
|
+ EXPECT_TRUE((testing::StaticAssertTypeEq<void, decltype(i == i)>()));
|
|
|
+ EXPECT_TRUE((testing::StaticAssertTypeEq<void, decltype(i != i)>()));
|
|
|
+ EXPECT_TRUE((testing::StaticAssertTypeEq<void, decltype(i < i)>()));
|
|
|
+ EXPECT_TRUE((testing::StaticAssertTypeEq<void, decltype(i <= i)>()));
|
|
|
+ EXPECT_TRUE((testing::StaticAssertTypeEq<void, decltype(i > i)>()));
|
|
|
+ EXPECT_TRUE((testing::StaticAssertTypeEq<void, decltype(i >= i)>()));
|
|
|
}
|
|
|
|
|
|
-TEST(OpaqueTypedefCompareTest, CanCheckEqWithEqCompSkill) {
|
|
|
+TEST(OpaqueTypedefEqualityComparableTest, CanCheckEq) {
|
|
|
port p(80);
|
|
|
- EXPECT_TRUE((StaticAssertTypeEq<bool, decltype(p == p)>()));
|
|
|
- EXPECT_TRUE((StaticAssertTypeEq<bool, decltype(p != p)>()));
|
|
|
+ EXPECT_TRUE((testing::StaticAssertTypeEq<bool, decltype(p == p)>()));
|
|
|
}
|
|
|
|
|
|
-TEST(OpaqueTypedefCompareTest, CannotOrderWithoutComparableSkill) {
|
|
|
+TEST(OpaqueTypedefEqualityComparableTest, CanCheckNotEq) {
|
|
|
port p(80);
|
|
|
- EXPECT_TRUE((StaticAssertTypeEq<void, decltype(p < p)>()));
|
|
|
- EXPECT_TRUE((StaticAssertTypeEq<void, decltype(p <= p)>()));
|
|
|
- EXPECT_TRUE((StaticAssertTypeEq<void, decltype(p > p)>()));
|
|
|
- EXPECT_TRUE((StaticAssertTypeEq<void, decltype(p >= p)>()));
|
|
|
+ EXPECT_TRUE((testing::StaticAssertTypeEq<bool, decltype(p != p)>()));
|
|
|
}
|
|
|
|
|
|
-TEST(OpaqueTypedefCompareTest, CanOrderWithComparableSkill) {
|
|
|
- x_pos x(0);
|
|
|
- EXPECT_TRUE((StaticAssertTypeEq<bool, decltype(x == x)>()));
|
|
|
- EXPECT_TRUE((StaticAssertTypeEq<bool, decltype(x != x)>()));
|
|
|
- EXPECT_TRUE((StaticAssertTypeEq<bool, decltype(x < x)>()));
|
|
|
- EXPECT_TRUE((StaticAssertTypeEq<bool, decltype(x <= x)>()));
|
|
|
- EXPECT_TRUE((StaticAssertTypeEq<bool, decltype(x > x)>()));
|
|
|
- EXPECT_TRUE((StaticAssertTypeEq<bool, decltype(x >= x)>()));
|
|
|
+TEST(OpaqueTypedefEqualityComparableTest, CannotCompareOrder) {
|
|
|
+ port p(80);
|
|
|
+ EXPECT_TRUE((testing::StaticAssertTypeEq<void, decltype(p < p)>()));
|
|
|
+ EXPECT_TRUE((testing::StaticAssertTypeEq<void, decltype(p <= p)>()));
|
|
|
+ EXPECT_TRUE((testing::StaticAssertTypeEq<void, decltype(p > p)>()));
|
|
|
+ EXPECT_TRUE((testing::StaticAssertTypeEq<void, decltype(p >= p)>()));
|
|
|
}
|
|
|
|
|
|
-TEST(OpaqueTypedefCompareTest, CanCompareEqualityWithEqCompSkill) {
|
|
|
+TEST(OpaqueTypedefEqualityComparableTest, EqAndNePassThroughToBaseType) {
|
|
|
port http{80};
|
|
|
port https{443};
|
|
|
- EXPECT_THAT(http, Eq(port{80}));
|
|
|
- EXPECT_THAT(http, Ne(https));
|
|
|
+ EXPECT_THAT(http, testing::Eq(port{80}));
|
|
|
+ EXPECT_THAT(http, testing::Ne(https));
|
|
|
+}
|
|
|
+
|
|
|
+TEST(OpaqueTypedefCompareableTest, CanCompareAll) {
|
|
|
+ x_pos x(0);
|
|
|
+ EXPECT_TRUE((testing::StaticAssertTypeEq<bool, decltype(x == x)>()));
|
|
|
+ EXPECT_TRUE((testing::StaticAssertTypeEq<bool, decltype(x != x)>()));
|
|
|
+ EXPECT_TRUE((testing::StaticAssertTypeEq<bool, decltype(x < x)>()));
|
|
|
+ EXPECT_TRUE((testing::StaticAssertTypeEq<bool, decltype(x <= x)>()));
|
|
|
+ EXPECT_TRUE((testing::StaticAssertTypeEq<bool, decltype(x > x)>()));
|
|
|
+ EXPECT_TRUE((testing::StaticAssertTypeEq<bool, decltype(x >= x)>()));
|
|
|
}
|
|
|
|
|
|
-TEST(OpaqueTypedefCompareTest, CanCompareOrderingWithCompSkill) {
|
|
|
+TEST(OpaqueTypedefCompareableTest, ComparePassesThroughToBaseType) {
|
|
|
x_pos x1{0};
|
|
|
x_pos x2{1};
|
|
|
- EXPECT_THAT(x1, Eq(x1));
|
|
|
- EXPECT_THAT(x1, Ne(x2));
|
|
|
- EXPECT_THAT(x1, Lt(x2));
|
|
|
- EXPECT_THAT(x1, Le(x2));
|
|
|
- EXPECT_THAT(x1, Le(x1));
|
|
|
- EXPECT_THAT(x2, Gt(x1));
|
|
|
- EXPECT_THAT(x2, Ge(x1));
|
|
|
- EXPECT_THAT(x1, Ge(x1));
|
|
|
+ EXPECT_THAT(x1, testing::Eq(x1));
|
|
|
+ EXPECT_THAT(x1, testing::Ne(x2));
|
|
|
+ EXPECT_THAT(x1, testing::Lt(x2));
|
|
|
+ EXPECT_THAT(x1, testing::Le(x2));
|
|
|
+ EXPECT_THAT(x1, testing::Le(x1));
|
|
|
+ EXPECT_THAT(x2, testing::Gt(x1));
|
|
|
+ EXPECT_THAT(x2, testing::Ge(x1));
|
|
|
+ EXPECT_THAT(x1, testing::Ge(x1));
|
|
|
}
|