DivMod_test.cc 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #include "catch.hpp"
  2. #include "DivModByConst.hh"
  3. #include "DivModBySame.hh"
  4. using namespace openmsx;
  5. template<uint32_t DIVISOR>
  6. static void test(const DivModByConst<DIVISOR>& c, const DivModBySame& s,
  7. uint64_t dividend)
  8. {
  9. uint64_t rd = dividend / DIVISOR;
  10. if (uint32_t(rd) == rd) {
  11. CHECK(c.div(dividend) == (dividend / DIVISOR));
  12. CHECK(s.div(dividend) == (dividend / DIVISOR));
  13. CHECK(c.mod(dividend) == (dividend % DIVISOR));
  14. CHECK(s.mod(dividend) == (dividend % DIVISOR));
  15. }
  16. }
  17. template<uint32_t DIVISOR>
  18. static void test()
  19. {
  20. DivModByConst<DIVISOR> c;
  21. DivModBySame s; s.setDivisor(DIVISOR);
  22. for (uint64_t dividend : {0ull, 1ull, 2ull, 3ull, 4ull, 5ull, 7ull,
  23. 100ull, 10015ull, 12410015ull, 0x1234567890ull,
  24. 0x7FFFFFFFFFFFFFFFull, 0x8000000000000000ull,
  25. 0xFFFFFFFF00000000ull, 0xFFFFFFFFFFFFFFFFull}) {
  26. test(c, s, dividend);
  27. }
  28. }
  29. TEST_CASE("DivModByConst, DivModBySame")
  30. {
  31. test<1>();
  32. test<2>();
  33. test<3>();
  34. test<4>();
  35. test<5>();
  36. test<7>();
  37. test<10>();
  38. test<128>();
  39. test<1000>();
  40. test<90000>();
  41. test<90017>();
  42. }