2020-02-26 11:57:18 +00:00
|
|
|
#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);
|
2020-04-04 15:48:05 +00:00
|
|
|
CHECK(rand.Get() == -982170359);
|
|
|
|
CHECK(rand.Get() == 1283169405);
|
|
|
|
CHECK(rand.Get() == 89128932);
|
|
|
|
CHECK(rand.Get() == 2124247567);
|
|
|
|
CHECK(rand.Get() == -1573468864);
|
|
|
|
CHECK(rand.Get() == 1902734705);
|
|
|
|
CHECK(rand.Get() == -1078879109);
|
|
|
|
CHECK(rand.Get() == -721935204);
|
|
|
|
CHECK(rand.Get() == 2141071321);
|
|
|
|
CHECK(rand.Get() == -1789619491);
|
2020-02-26 11:57:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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<float>(numZeros) / static_cast<float>(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);
|
2020-04-04 16:01:35 +00:00
|
|
|
const size_t size = 100000;
|
2020-02-26 11:57:18 +00:00
|
|
|
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<float>(numZeros) / static_cast<float>(numOnes)).margin(0.01) == 1);
|
|
|
|
CHECK(Approx(static_cast<float>(numZeros) / static_cast<float>(numTwos)).margin(0.01) == 1);
|
|
|
|
CHECK(Approx(static_cast<float>(numOnes) / static_cast<float>(numTwos)).margin(0.01) == 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|