tape_test.cxx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. //
  2. // tape_test.cpp
  3. // shared_random_generator-test
  4. //
  5. // Created by Sam Jaffe on 3/19/23.
  6. // Copyright © 2023 Sam Jaffe. All rights reserved.
  7. //
  8. #include "random/tape.h"
  9. #include "random/random.h"
  10. #include "xcode_gtest_helper.h"
  11. using testing::ElementsAre;
  12. using testing::FieldsAre;
  13. TEST(TapeTest, CanRecordIntData) {
  14. engine::random::Tape tape;
  15. tape.exclusive(100u, 50);
  16. EXPECT_EQ(tape.exclusive(100), 50);
  17. }
  18. TEST(TapeTest, CanRecordDoubleData) {
  19. engine::random::Tape tape;
  20. tape.exclusive(0.0, 100.0, 50.0);
  21. EXPECT_EQ(tape.exclusive(0.0, 100.0), 50.0);
  22. tape.inclusive(0.0, 100.0, 50.0);
  23. EXPECT_EQ(tape.inclusive(0.0, 100.0), 50.0);
  24. }
  25. TEST(TapeTest, ThrowsOnOverFetch) {
  26. engine::random::Tape tape;
  27. tape.exclusive(100u, 50);
  28. EXPECT_EQ(tape.exclusive(100), 50);
  29. EXPECT_THROW(tape.exclusive(100), std::out_of_range);
  30. }
  31. TEST(TapeTest, BadRequestIsNoOp) {
  32. engine::random::Tape tape;
  33. tape.exclusive(100u, 50);
  34. EXPECT_ANY_THROW(tape.exclusive(1));
  35. EXPECT_EQ(tape.exclusive(100), 50);
  36. }
  37. TEST(TapeTest, ThrowsOnTypeMismatch) {
  38. engine::random::Tape tape;
  39. tape.exclusive(100u, 50);
  40. EXPECT_THROW(tape.exclusive(0.0, 100.0), std::domain_error);
  41. }
  42. TEST(TapeTest, ThrowsOnInclusiveExclusiveMismatch) {
  43. engine::random::Tape tape;
  44. tape.exclusive(0.0, 100.0, 50.0);
  45. EXPECT_THROW(tape.inclusive(0.0, 100.0), std::domain_error);
  46. }
  47. TEST(TapeTest, ThrowsOnBoundsMismatch) {
  48. engine::random::Tape tape;
  49. tape.exclusive(0.0, 100.0, 50.0);
  50. EXPECT_THROW(tape.exclusive(0.0, 1.0), std::logic_error);
  51. }
  52. TEST(TapeTest, IsOrdered) {
  53. engine::random::Tape tape;
  54. tape.exclusive(0.0, 100.0, 50.0);
  55. tape.inclusive(0.0, 100.0, 50.0);
  56. EXPECT_THROW(tape.inclusive(0.0, 100.0), std::domain_error);
  57. EXPECT_EQ(tape.exclusive(0.0, 100.0), 50.0);
  58. EXPECT_EQ(tape.inclusive(0.0, 100.0), 50.0);
  59. }
  60. TEST(TapeTest, IsSerializable) {
  61. engine::random::Tape tape;
  62. tape.exclusive(100u, 50);
  63. tape.exclusive(0.0, 100.0, 50.0);
  64. tape.inclusive(0.0, 100.0, 50.0);
  65. auto serial = engine::random::Tape::serial_type(tape);
  66. EXPECT_THAT(serial, ElementsAre(FieldsAre(true, "j", 0, 100, 50),
  67. FieldsAre(true, "d", 0, 100, 50),
  68. FieldsAre(false, "d", 0, 100, 50)));
  69. tape = engine::random::Tape(serial);
  70. EXPECT_EQ(tape.exclusive(100), 50);
  71. EXPECT_EQ(tape.exclusive(0.0, 100.0), 50.0);
  72. EXPECT_EQ(tape.inclusive(0.0, 100.0), 50.0);
  73. }
  74. TEST(TapeTest, IndexNotIncludedInSerialization) {
  75. engine::random::Tape tape;
  76. tape.exclusive(100u, 50);
  77. tape.exclusive(0.0, 100.0, 50.0);
  78. tape.inclusive(0.0, 100.0, 50.0);
  79. EXPECT_EQ(tape.exclusive(100), 50);
  80. EXPECT_EQ(tape.exclusive(0.0, 100.0), 50.0);
  81. auto serial = engine::random::Tape::serial_type(tape);
  82. EXPECT_THAT(serial, ElementsAre(FieldsAre(true, "j", 0, 100, 50),
  83. FieldsAre(true, "d", 0, 100, 50),
  84. FieldsAre(false, "d", 0, 100, 50)));
  85. tape = engine::random::Tape(serial);
  86. EXPECT_EQ(tape.exclusive(100), 50);
  87. EXPECT_EQ(tape.exclusive(0.0, 100.0), 50.0);
  88. EXPECT_EQ(tape.inclusive(0.0, 100.0), 50.0);
  89. }
  90. TEST(TapeTest, CanAttachToRandom) {
  91. engine::random::Random random;
  92. auto tape = std::make_shared<engine::random::Tape>();
  93. auto scope = random.record(tape);
  94. auto result = random.exclusive(100);
  95. EXPECT_EQ(tape->exclusive(100), result);
  96. }
  97. TEST(TapeTest, StopsRecordingOnScopeExit) {
  98. engine::random::Random random;
  99. auto tape = std::make_shared<engine::random::Tape>();
  100. {
  101. auto scope = random.record(tape);
  102. random.exclusive(100);
  103. }
  104. random.exclusive(100);
  105. EXPECT_NO_THROW(tape->exclusive(100));
  106. EXPECT_THROW(tape->exclusive(100), std::out_of_range);
  107. }