// // opaque_typedef_test.cpp // opaque_typedef // // Created by Sam Jaffe on 6/3/18. // #include #include #include "opaque_typedef/opaque_typedef.hpp" using degree = types::opaque_typedef; using radian = types::opaque_typedef; template <> template <>radian::opaque_typedef(degree const & other) : radian(other.get() * M_PI_2 / 90.0) {} template <> template <> degree::opaque_typedef(radian const & other) : degree(other.get() * 90.0 / M_PI_2) {} void PrintTo(radian const & ot, std::ostream * os) { (*os) << double(ot)/M_PI << "π"; } void PrintTo(degree const & ot, std::ostream * os) { (*os) << double(ot) << "°"; } TEST(OpaqueTypedefTest, Conversion) { degree deg{90.0}; radian rad{M_PI_2}; EXPECT_THAT(radian(deg), rad); EXPECT_THAT(degree(rad), deg); EXPECT_THAT(radian(double(deg)), ::testing::Not(rad)); EXPECT_THAT(degree(double(rad)), ::testing::Not(deg)); } using meters = types::opaque_typedef; using seconds = types::opaque_typedef; using meter_per_second = types::opaque_typedef; meter_per_second operator/(meters m, seconds s) { return meter_per_second{m.get() / s.get()}; } TEST(OpaqueTypedefTest, MixedFunctions) { meters m{10.0}; seconds s{0.5}; EXPECT_THAT(m/s, meter_per_second{20.0}); }