#ifdef TESTS_BUILD #define CATCH_CONFIG_MAIN #include "../extern/catch.hpp" #include "../src/Random.hpp" TEST_CASE("Random ints", "[Utilities]") { auto rand = Arbutils::Random(10); CHECK(rand.Get() == 1656398469); CHECK(rand.Get() == 641584702); CHECK(rand.Get() == 44564466); CHECK(rand.Get() == 1062123783); CHECK(rand.Get() == 1360749216); CHECK(rand.Get() == 951367352); CHECK(rand.Get() == 1608044094); CHECK(rand.Get() == 1786516046); CHECK(rand.Get() == 1070535660); CHECK(rand.Get() == 1252673902); } TEST_CASE("Random ints with limit", "[Utilities]") { auto rand = Arbutils::Random(10); CHECK(rand.Get(10) == 7); CHECK(rand.Get(10) == 2); CHECK(rand.Get(10) == 0); CHECK(rand.Get(10) == 4); CHECK(rand.Get(10) == 6); CHECK(rand.Get(10) == 4); CHECK(rand.Get(10) == 7); CHECK(rand.Get(10) == 8); CHECK(rand.Get(10) == 4); CHECK(rand.Get(10) == 5); CHECK(rand.Get(2) == 0); CHECK(rand.Get(2) == 0); CHECK(rand.Get(2) == 0); CHECK(rand.Get(2) == 1); CHECK(rand.Get(2) == 1); CHECK(rand.Get(2) == 0); CHECK(rand.Get(2) == 0); CHECK(rand.Get(2) == 0); CHECK(rand.Get(2) == 0); } TEST_CASE("Random ints with upper and bottom", "[Utilities]") { auto rand = Arbutils::Random(10); CHECK(rand.Get(10, 30) == 25); CHECK(rand.Get(10, 30) == 15); CHECK(rand.Get(10, 30) == 10); CHECK(rand.Get(10, 30) == 19); CHECK(rand.Get(10, 30) == 22); CHECK(rand.Get(10, 30) == 18); CHECK(rand.Get(10, 30) == 24); CHECK(rand.Get(10, 30) == 26); CHECK(rand.Get(10, 30) == 19); CHECK(rand.Get(10, 30) == 21); } TEST_CASE("Random distribution (max 0, min 1)", "[Utilities]") { auto rand = Arbutils::Random(10); const int size = 100000; int arr[size]; for (size_t i = 0; i < size; i++) { arr[i] = rand.Get(0, 1); } for (size_t i = 0; i < size; i++) { if (arr[i] != 0) FAIL("We expected a value of 0 here, but got a " + std::to_string(arr[i])); } } TEST_CASE("Random distribution (max 0, min 2)", "[Utilities]") { auto rand = Arbutils::Random(10); const int size = 100000; int arr[size]; for (size_t i = 0; i < size; i++) { arr[i] = rand.Get(0, 2); } auto numZeros = 0; auto numOnes = 0; for (size_t i = 0; i < size; i++) { if (arr[i] != 0 && arr[i] != 1) FAIL("We expected a value of 0 or 1 here, but got a " + std::to_string(arr[i])); if (arr[i] == 0) numZeros++; else numOnes++; } auto div = static_cast(numZeros) / static_cast(numOnes); INFO("Distribution: " << numZeros << "/" << numOnes); CHECK(Approx(div).margin(0.01) == 1); } TEST_CASE("Random distribution (max 0, min 3)", "[Utilities]") { auto rand = Arbutils::Random(10); const int size = 100000; int arr[size]; for (size_t i = 0; i < size; i++) { arr[i] = rand.Get(0, 3); } auto numZeros = 0; auto numOnes = 0; auto numTwos = 0; for (size_t i = 0; i < size; i++) { if (arr[i] != 0 && arr[i] != 1 && arr[i] != 2) FAIL("We expected a value between 0 and 2 here, but got a " + std::to_string(arr[i])); if (arr[i] == 0) numZeros++; else if (arr[i] == 1) numOnes++; else numTwos++; } INFO("Distribution: " << numZeros << "/" << numOnes << "/" << numTwos); CHECK(Approx(static_cast(numZeros) / static_cast(numOnes)).margin(0.01) == 1); CHECK(Approx(static_cast(numZeros) / static_cast(numTwos)).margin(0.01) == 1); CHECK(Approx(static_cast(numOnes) / static_cast(numTwos)).margin(0.01) == 1); } #endif