opaque_typedef_test.cpp 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. //
  2. // opaque_typedef_test.cpp
  3. // opaque_typedef
  4. //
  5. // Created by Sam Jaffe on 6/3/18.
  6. //
  7. #include <gmock/gmock.h>
  8. #include <cmath>
  9. #include "opaque_typedef/opaque_typedef.hpp"
  10. using degree = types::opaque_typedef<double, struct degree_tag, types::Comparable>;
  11. using radian = types::opaque_typedef<double, struct radian_tag, types::Comparable>;
  12. template <> template <>radian::opaque_typedef(degree const & other)
  13. : radian(other.get() * M_PI_2 / 90.0) {}
  14. template <> template <> degree::opaque_typedef(radian const & other)
  15. : degree(other.get() * 90.0 / M_PI_2) {}
  16. void PrintTo(radian const & ot, std::ostream * os) {
  17. (*os) << double(ot)/M_PI << "π";
  18. }
  19. void PrintTo(degree const & ot, std::ostream * os) {
  20. (*os) << double(ot) << "°";
  21. }
  22. TEST(OpaqueTypedefTest, Conversion) {
  23. degree deg{90.0};
  24. radian rad{M_PI_2};
  25. EXPECT_THAT(radian(deg), rad);
  26. EXPECT_THAT(degree(rad), deg);
  27. EXPECT_THAT(radian(double(deg)), ::testing::Not(rad));
  28. EXPECT_THAT(degree(double(rad)), ::testing::Not(deg));
  29. }
  30. using meters = types::opaque_typedef<double, struct meters_tag, types::Comparable>;
  31. using seconds = types::opaque_typedef<double, struct seconds_tag, types::Comparable>;
  32. using meter_per_second = types::opaque_typedef<double, struct mps_tag, types::Comparable>;
  33. meter_per_second operator/(meters m, seconds s) {
  34. return meter_per_second{m.get() / s.get()};
  35. }
  36. TEST(OpaqueTypedefTest, MixedFunctions) {
  37. meters m{10.0};
  38. seconds s{0.5};
  39. EXPECT_THAT(m/s, meter_per_second{20.0});
  40. }