#include "kblib/random.h" #include "catch.hpp" #include template struct print; TEST_CASE("Random engine seeding") { SECTION("Mersenne Twister Engine") { std::clog << "MT: "; KBLIB_UNUSED auto gen = kblib::seeded(); std::clog << '\n'; static_assert(kblib::state_size_v == 624, "."); static_assert(kblib::state_size_v == 624, "."); } SECTION("Linear Congruential Engine") { std::clog << "LCG: "; KBLIB_UNUSED auto gen = kblib::seeded(); std::clog << '\n'; static_assert(kblib::state_size_v == 1, "."); static_assert(kblib::state_size_v == 1, "."); using java_rand = std::linear_congruential_engine; std::clog << "LCG(64): "; KBLIB_UNUSED auto gen2 = kblib::seeded(); std::clog << '\n'; static_assert(kblib::state_size_v == 2, "."); } SECTION("Subtract with Carry Engine") { std::clog << "SwCE 24: "; KBLIB_UNUSED auto gen = kblib::seeded(); std::clog << "SwCE 48: "; KBLIB_UNUSED auto gen2 = kblib::seeded(); std::clog << '\n'; static_assert(kblib::state_size_v == 24, "."); static_assert(kblib::state_size_v == 24, "."); } SECTION("Discard Block Engine") { std::clog << "DBE: "; KBLIB_UNUSED auto gen = kblib::seeded>(); std::clog << '\n'; std::clog << "RANLUX 24: "; KBLIB_UNUSED auto gen2 = kblib::seeded(); std::clog << '\n'; static_assert( kblib::state_size_v< std::discard_block_engine> == 1, "."); static_assert(kblib::state_size_v< std::discard_block_engine> == 624, "."); static_assert(kblib::state_size_v == 24, "."); } SECTION("Independent Bits Engine") { std::clog << "IBE: "; KBLIB_UNUSED auto gen = kblib::seeded>(); std::clog << '\n'; static_assert(kblib::state_size_v> == 24, "."); static_assert(kblib::state_size_v> == 624, "."); static_assert(kblib::state_size_v> == 1, "."); } SECTION("Shuffle Order Engine") { std::clog << "SOE: "; KBLIB_UNUSED auto gen = kblib::seeded>(); std::clog << '\n'; static_assert(kblib::state_size_v< std::shuffle_order_engine> == 24, "."); static_assert(kblib::state_size_v< std::shuffle_order_engine> == 624, "."); static_assert(kblib::state_size_v< std::shuffle_order_engine> == 1, "."); } } TEST_CASE("transform_engine") { using E = kblib::transform_engine>; auto gen = kblib::seeded(); static_assert(E::min() == 0, "."); static_assert(E::max() == ((std::ranlux24::max() >> 16u)), "."); SECTION("copying") { auto gen1 = gen; REQUIRE(gen == gen1); } SECTION("i/o") { decltype(gen) gen1, gen2; REQUIRE(gen1 == gen2); REQUIRE(gen != gen1); REQUIRE(gen != gen2); std::stringstream ss; ss << gen; ss >> gen1; REQUIRE(gen == gen1); REQUIRE(gen != gen2); REQUIRE(gen1 != gen2); } std::uniform_int_distribution dist; (void)dist(gen); }