| 4 | using namespace OpenLoco; |
| 5 | |
| 6 | TEST(PrngTests, misc) |
| 7 | { |
| 8 | Core::Prng prng; |
| 9 | EXPECT_EQ(prng.randNext(), 0); |
| 10 | EXPECT_EQ(prng.srand_0(), 0xFE2468AC); |
| 11 | EXPECT_EQ(prng.srand_1(), 0); |
| 12 | |
| 13 | prng = Core::Prng(0x1234, 0x4321); |
| 14 | EXPECT_EQ(prng.srand_0(), 0x1234); |
| 15 | EXPECT_EQ(prng.srand_1(), 0x4321); |
| 16 | EXPECT_EQ(prng.randNext(), 0x80000246); |
| 17 | EXPECT_EQ(prng.srand_0(), 0xBC247A5E); |
| 18 | EXPECT_EQ(prng.srand_1(), 0x80000246); |
| 19 | |
| 20 | for (auto i = 0; i < 1000; ++i) |
| 21 | { |
| 22 | prng.randNext(); |
| 23 | } |
| 24 | EXPECT_EQ(prng.srand_0(), 0x0A597A43); |
| 25 | EXPECT_EQ(prng.srand_1(), 0x12FC0827); |
| 26 | |
| 27 | { |
| 28 | constexpr size_t kMaxVal = 30; |
| 29 | EXPECT_EQ(prng.randNext(kMaxVal), 11); |
| 30 | for (auto i = 0; i < 1000; ++i) |
| 31 | { |
| 32 | EXPECT_LE(prng.randNext(kMaxVal), kMaxVal); |
| 33 | } |
| 34 | |
| 35 | constexpr size_t kMinVal = 10; |
| 36 | EXPECT_EQ(prng.randNext(kMinVal, kMaxVal), 26); |
| 37 | for (auto i = 0; i < 1000; ++i) |
| 38 | { |
| 39 | const auto randVal = prng.randNext(kMinVal, kMaxVal); |
| 40 | EXPECT_LE(randVal, kMaxVal); |
| 41 | EXPECT_GE(randVal, kMinVal); |
| 42 | } |
| 43 | } |
| 44 | { |
| 45 | constexpr int32_t kMaxVal = -1; |
| 46 | constexpr int32_t kMinVal = -10; |
| 47 | EXPECT_EQ(prng.randNext(kMinVal, kMaxVal), -4); |
| 48 | for (auto i = 0; i < 1000; ++i) |
| 49 | { |
| 50 | const auto randVal = prng.randNext(kMinVal, kMaxVal); |
| 51 | EXPECT_LE(randVal, kMaxVal); |
| 52 | EXPECT_GE(randVal, kMinVal); |
| 53 | } |
| 54 | } |
| 55 | // These tests fail. Never call randNext with back to front min/max |
| 56 | //{ |
| 57 | // constexpr int32_t kMaxVal = -30; |
| 58 | // EXPECT_EQ(prng.randNext(kMaxVal), 12); |
| 59 | // for (auto i = 0; i < 1000; ++i) |
| 60 | // { |
| 61 | // EXPECT_LE(prng.randNext(kMaxVal), kMaxVal); |
| 62 | // } |
| 63 | |