|
|
@@ -8,6 +8,10 @@
|
|
|
|
|
|
#include "random/tape.h"
|
|
|
|
|
|
+#include <cstdlib>
|
|
|
+
|
|
|
+#include <scope_guard/scope_guard.hpp>
|
|
|
+
|
|
|
#include "random/random.h"
|
|
|
|
|
|
#include "xcode_gtest_helper.h"
|
|
|
@@ -15,47 +19,48 @@
|
|
|
using testing::ElementsAre;
|
|
|
using testing::FieldsAre;
|
|
|
|
|
|
+MATCHER_P(BytesAre, value, "") {
|
|
|
+ *result_listener << "whose bytes are " << std::hex << arg;
|
|
|
+ return reinterpret_cast<double const &>(arg) == value;
|
|
|
+}
|
|
|
+
|
|
|
TEST(TapeTest, CanRecordIntData) {
|
|
|
engine::random::Tape tape;
|
|
|
-
|
|
|
- tape.exclusive(100u, 50);
|
|
|
- EXPECT_EQ(tape.exclusive(100), 50);
|
|
|
+
|
|
|
+ tape.inclusive(0u, 100u, 50u);
|
|
|
+ EXPECT_EQ(tape.inclusive(0u, 100u), 50);
|
|
|
}
|
|
|
|
|
|
TEST(TapeTest, CanRecordDoubleData) {
|
|
|
engine::random::Tape tape;
|
|
|
-
|
|
|
+
|
|
|
tape.exclusive(0.0, 100.0, 50.0);
|
|
|
EXPECT_EQ(tape.exclusive(0.0, 100.0), 50.0);
|
|
|
|
|
|
- tape.inclusive(0.0, 100.0, 50.0);
|
|
|
- EXPECT_EQ(tape.inclusive(0.0, 100.0), 50.0);
|
|
|
+ tape.exclusive(0.0, 100.0, 50.0);
|
|
|
+ EXPECT_EQ(tape.exclusive(0.0, 100.0), 50.0);
|
|
|
}
|
|
|
|
|
|
TEST(TapeTest, ThrowsOnOverFetch) {
|
|
|
engine::random::Tape tape;
|
|
|
- tape.exclusive(100u, 50);
|
|
|
- EXPECT_EQ(tape.exclusive(100), 50);
|
|
|
- EXPECT_THROW(tape.exclusive(100), std::out_of_range);
|
|
|
+ tape.inclusive(0, 100, 50);
|
|
|
+ EXPECT_EQ(tape.inclusive(0, 100), 50);
|
|
|
+ EXPECT_THROW(tape.inclusive(0, 100), std::out_of_range);
|
|
|
}
|
|
|
|
|
|
TEST(TapeTest, BadRequestIsNoOp) {
|
|
|
engine::random::Tape tape;
|
|
|
- tape.exclusive(100u, 50);
|
|
|
- EXPECT_ANY_THROW(tape.exclusive(1));
|
|
|
- EXPECT_EQ(tape.exclusive(100), 50);
|
|
|
+ tape.inclusive(0, 100, 50);
|
|
|
+ EXPECT_ANY_THROW(tape.inclusive(0, 1));
|
|
|
+ EXPECT_EQ(tape.inclusive(0, 100), 50);
|
|
|
}
|
|
|
|
|
|
TEST(TapeTest, ThrowsOnTypeMismatch) {
|
|
|
engine::random::Tape tape;
|
|
|
- tape.exclusive(100u, 50);
|
|
|
+ tape.inclusive(0u, 100u, 50u);
|
|
|
EXPECT_THROW(tape.exclusive(0.0, 100.0), std::domain_error);
|
|
|
-}
|
|
|
-
|
|
|
-TEST(TapeTest, ThrowsOnInclusiveExclusiveMismatch) {
|
|
|
- engine::random::Tape tape;
|
|
|
- tape.exclusive(0.0, 100.0, 50.0);
|
|
|
- EXPECT_THROW(tape.inclusive(0.0, 100.0), std::domain_error);
|
|
|
+ EXPECT_THROW(tape.inclusive(0, 100), std::domain_error);
|
|
|
+ EXPECT_NO_THROW(tape.inclusive(0u, 100u));
|
|
|
}
|
|
|
|
|
|
TEST(TapeTest, ThrowsOnBoundsMismatch) {
|
|
|
@@ -67,49 +72,51 @@ TEST(TapeTest, ThrowsOnBoundsMismatch) {
|
|
|
TEST(TapeTest, IsOrdered) {
|
|
|
engine::random::Tape tape;
|
|
|
tape.exclusive(0.0, 100.0, 50.0);
|
|
|
- tape.inclusive(0.0, 100.0, 50.0);
|
|
|
-
|
|
|
- EXPECT_THROW(tape.inclusive(0.0, 100.0), std::domain_error);
|
|
|
+ tape.exclusive(10.0, 90.0, 50.0);
|
|
|
+
|
|
|
+ EXPECT_THROW(tape.exclusive(10.0, 90.0), std::logic_error);
|
|
|
|
|
|
EXPECT_EQ(tape.exclusive(0.0, 100.0), 50.0);
|
|
|
- EXPECT_EQ(tape.inclusive(0.0, 100.0), 50.0);
|
|
|
+ EXPECT_EQ(tape.exclusive(10.0, 90.0), 50.0);
|
|
|
}
|
|
|
|
|
|
TEST(TapeTest, IsSerializable) {
|
|
|
engine::random::Tape tape;
|
|
|
- tape.exclusive(100u, 50);
|
|
|
+ tape.inclusive(0, 100, 50);
|
|
|
+ tape.inclusive(0u, 100u, 50u);
|
|
|
tape.exclusive(0.0, 100.0, 50.0);
|
|
|
- tape.inclusive(0.0, 100.0, 50.0);
|
|
|
-
|
|
|
+
|
|
|
auto serial = engine::random::Tape::serial_type(tape);
|
|
|
- EXPECT_THAT(serial, ElementsAre(FieldsAre(true, "j", 0, 100, 50),
|
|
|
- FieldsAre(true, "d", 0, 100, 50),
|
|
|
- FieldsAre(false, "d", 0, 100, 50)));
|
|
|
-
|
|
|
+ EXPECT_THAT(
|
|
|
+ serial,
|
|
|
+ ElementsAre(FieldsAre("i", 0, 100, 50), FieldsAre("j", 0, 100, 50),
|
|
|
+ FieldsAre("d", BytesAre(0), BytesAre(100), BytesAre(50))));
|
|
|
+
|
|
|
tape = engine::random::Tape(serial);
|
|
|
- EXPECT_EQ(tape.exclusive(100), 50);
|
|
|
+ EXPECT_EQ(tape.inclusive(0, 100), 50);
|
|
|
+ EXPECT_EQ(tape.inclusive(0u, 100u), 50u);
|
|
|
EXPECT_EQ(tape.exclusive(0.0, 100.0), 50.0);
|
|
|
- EXPECT_EQ(tape.inclusive(0.0, 100.0), 50.0);
|
|
|
}
|
|
|
|
|
|
TEST(TapeTest, IndexNotIncludedInSerialization) {
|
|
|
engine::random::Tape tape;
|
|
|
- tape.exclusive(100u, 50);
|
|
|
+ tape.inclusive(0, 100, 50);
|
|
|
+ tape.inclusive(0u, 100u, 50u);
|
|
|
tape.exclusive(0.0, 100.0, 50.0);
|
|
|
- tape.inclusive(0.0, 100.0, 50.0);
|
|
|
-
|
|
|
- EXPECT_EQ(tape.exclusive(100), 50);
|
|
|
- EXPECT_EQ(tape.exclusive(0.0, 100.0), 50.0);
|
|
|
-
|
|
|
+
|
|
|
+ EXPECT_EQ(tape.inclusive(0, 100), 50);
|
|
|
+ EXPECT_EQ(tape.inclusive(0u, 100u), 50u);
|
|
|
+
|
|
|
auto serial = engine::random::Tape::serial_type(tape);
|
|
|
- EXPECT_THAT(serial, ElementsAre(FieldsAre(true, "j", 0, 100, 50),
|
|
|
- FieldsAre(true, "d", 0, 100, 50),
|
|
|
- FieldsAre(false, "d", 0, 100, 50)));
|
|
|
-
|
|
|
+ EXPECT_THAT(
|
|
|
+ serial,
|
|
|
+ ElementsAre(FieldsAre("i", 0, 100, 50), FieldsAre("j", 0, 100, 50),
|
|
|
+ FieldsAre("d", BytesAre(0), BytesAre(100), BytesAre(50))));
|
|
|
+
|
|
|
tape = engine::random::Tape(serial);
|
|
|
- EXPECT_EQ(tape.exclusive(100), 50);
|
|
|
+ EXPECT_EQ(tape.inclusive(0, 100), 50);
|
|
|
+ EXPECT_EQ(tape.inclusive(0u, 100u), 50u);
|
|
|
EXPECT_EQ(tape.exclusive(0.0, 100.0), 50.0);
|
|
|
- EXPECT_EQ(tape.inclusive(0.0, 100.0), 50.0);
|
|
|
}
|
|
|
|
|
|
TEST(TapeTest, CanAttachToRandom) {
|
|
|
@@ -117,9 +124,9 @@ TEST(TapeTest, CanAttachToRandom) {
|
|
|
auto tape = std::make_shared<engine::random::Tape>();
|
|
|
|
|
|
auto scope = random.record(tape);
|
|
|
-
|
|
|
- auto result = random.exclusive(100);
|
|
|
- EXPECT_EQ(tape->exclusive(100), result);
|
|
|
+
|
|
|
+ auto result = random.inclusive(0, 100);
|
|
|
+ EXPECT_EQ(tape->inclusive(0, 100), result);
|
|
|
}
|
|
|
|
|
|
TEST(TapeTest, StopsRecordingOnScopeExit) {
|
|
|
@@ -128,10 +135,10 @@ TEST(TapeTest, StopsRecordingOnScopeExit) {
|
|
|
|
|
|
{
|
|
|
auto scope = random.record(tape);
|
|
|
- random.exclusive(100);
|
|
|
+ random.inclusive(0, 100);
|
|
|
}
|
|
|
- random.exclusive(100);
|
|
|
-
|
|
|
- EXPECT_NO_THROW(tape->exclusive(100));
|
|
|
- EXPECT_THROW(tape->exclusive(100), std::out_of_range);
|
|
|
+ random.inclusive(0, 100);
|
|
|
+
|
|
|
+ EXPECT_NO_THROW(tape->inclusive(0, 100));
|
|
|
+ EXPECT_THROW(tape->inclusive(0, 100), std::out_of_range);
|
|
|
}
|