tape_test.cxx 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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 <cstdlib>
  10. #include <scope_guard/scope_guard.hpp>
  11. #include "random/random.h"
  12. #include "xcode_gtest_helper.h"
  13. using testing::ElementsAre;
  14. using testing::FieldsAre;
  15. class StubDistribution : public engine::random::Distribution<int> {
  16. public:
  17. StubDistribution(int value) : value_(value) {}
  18. result_type operator()(engine::random::Device &) const { return value_; }
  19. private:
  20. int value_;
  21. };
  22. TEST(TapeTest, CanRecord) {
  23. engine::random::Tape tape;
  24. tape(50u);
  25. EXPECT_EQ(tape(), 50);
  26. }
  27. TEST(TapeTest, ThrowsOnOverFetch) {
  28. engine::random::Tape tape;
  29. tape(50);
  30. EXPECT_EQ(tape(), 50);
  31. EXPECT_THROW(tape(), std::out_of_range);
  32. }
  33. TEST(TapeTest, IsOrdered) {
  34. engine::random::Tape tape;
  35. tape(1);
  36. tape(2);
  37. EXPECT_EQ(tape(), 1);
  38. EXPECT_EQ(tape(), 2);
  39. }
  40. TEST(TapeTest, IsSerializable) {
  41. engine::random::Tape tape;
  42. tape(1);
  43. tape(2);
  44. tape(3);
  45. auto serial = engine::random::Tape::serial_type(tape);
  46. EXPECT_THAT(serial, ElementsAre(1, 2, 3));
  47. tape = engine::random::Tape(serial);
  48. EXPECT_EQ(tape(), 1);
  49. EXPECT_EQ(tape(), 2);
  50. EXPECT_EQ(tape(), 3);
  51. }
  52. TEST(TapeTest, IndexNotIncludedInSerialization) {
  53. engine::random::Tape tape;
  54. tape(1);
  55. tape(2);
  56. tape(3);
  57. EXPECT_EQ(tape(), 1);
  58. EXPECT_EQ(tape(), 2);
  59. auto serial = engine::random::Tape::serial_type(tape);
  60. EXPECT_THAT(serial, ElementsAre(1, 2, 3));
  61. tape = engine::random::Tape(serial);
  62. EXPECT_EQ(tape(), 1);
  63. EXPECT_EQ(tape(), 2);
  64. EXPECT_EQ(tape(), 3);
  65. }
  66. TEST(TapeTest, CanAttachToRandom) {
  67. engine::random::Random random;
  68. auto tape = std::make_shared<engine::random::Tape>();
  69. auto scope = random.record(tape);
  70. auto result = random(StubDistribution(5));
  71. EXPECT_EQ(result, 5);
  72. EXPECT_EQ((*tape)(), 5);
  73. }
  74. TEST(TapeTest, StopsRecordingOnScopeExit) {
  75. engine::random::Random random;
  76. auto tape = std::make_shared<engine::random::Tape>();
  77. {
  78. auto scope = random.record(tape);
  79. random(StubDistribution(2));
  80. }
  81. random(StubDistribution(1));
  82. EXPECT_NO_THROW((*tape)());
  83. EXPECT_THROW((*tape)(), std::out_of_range);
  84. }