mersenne_ut.cpp 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #include "mersenne.h"
  2. #include <library/cpp/testing/unittest/registar.h>
  3. #include <util/stream/output.h>
  4. #define UI32(x) x##ul
  5. Y_UNIT_TEST_SUITE(TMersenneRndTest) {
  6. template <class T>
  7. inline void Test(const T* res, size_t len) {
  8. TMersenne<T> m;
  9. for (size_t i = 0; i < len; ++i) {
  10. UNIT_ASSERT_EQUAL(m.GenRand(), res[i]);
  11. }
  12. }
  13. Y_UNIT_TEST(Test32) {
  14. const ui32 res[] = {
  15. UI32(2325592414),
  16. UI32(482149846),
  17. UI32(4177211283),
  18. UI32(3872387439),
  19. UI32(1663027210),
  20. UI32(2005191859),
  21. UI32(666881213),
  22. UI32(3289399202),
  23. UI32(2514534568),
  24. UI32(3882134983),
  25. };
  26. Test<ui32>(res, Y_ARRAY_SIZE(res));
  27. }
  28. Y_UNIT_TEST(Test64) {
  29. const ui64 res[] = {
  30. ULL(13735441942630277712),
  31. ULL(10468394322237346228),
  32. ULL(5051557175812687784),
  33. ULL(8252857936377966838),
  34. ULL(4330799099585512958),
  35. ULL(327094098846779408),
  36. ULL(6143667654738189122),
  37. ULL(6387112078486713335),
  38. ULL(3862502196831460488),
  39. ULL(11231499428520958715),
  40. };
  41. Test<ui64>(res, Y_ARRAY_SIZE(res));
  42. }
  43. Y_UNIT_TEST(TestGenRand64) {
  44. TMersenne<ui32> rng;
  45. for (size_t i = 0; i < 100; ++i) {
  46. UNIT_ASSERT(rng.GenRand64() > ULL(12345678912));
  47. }
  48. }
  49. Y_UNIT_TEST(TestCopy32) {
  50. TMersenne<ui32> r1(1);
  51. TMersenne<ui32> r2(2);
  52. UNIT_ASSERT_VALUES_UNEQUAL(r1.GenRand(), r2.GenRand());
  53. r2 = r1;
  54. UNIT_ASSERT_VALUES_EQUAL(r1.GenRand(), r2.GenRand());
  55. }
  56. Y_UNIT_TEST(TestCopy64) {
  57. TMersenne<ui64> r1(1);
  58. TMersenne<ui64> r2(2);
  59. UNIT_ASSERT_VALUES_UNEQUAL(r1.GenRand(), r2.GenRand());
  60. r2 = r1;
  61. UNIT_ASSERT_VALUES_EQUAL(r1.GenRand(), r2.GenRand());
  62. }
  63. }