Implements tests for randomness distributions.
continuous-integration/drone/push Build is passing Details

This commit is contained in:
Deukhoofd 2019-11-17 11:05:31 +01:00
parent 3e81784f6f
commit 5e71c59f77
Signed by: Deukhoofd
GPG Key ID: ADF2E9256009EDCE
2 changed files with 60 additions and 0 deletions

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
/cmake-build-debug/ /cmake-build-debug/
/cmake-build-release/
/.idea/ /.idea/

View File

@ -1,6 +1,7 @@
#ifdef TESTS_BUILD #ifdef TESTS_BUILD
#include "../extern/catch.hpp" #include "../extern/catch.hpp"
#include "../src/Core/Random.hpp" #include "../src/Core/Random.hpp"
#include "../src/Core/Exceptions/CreatureException.hpp"
TEST_CASE( "Random ints", "[Utilities]" ) { TEST_CASE( "Random ints", "[Utilities]" ) {
auto rand = CreatureLib::Core::Random(10); auto rand = CreatureLib::Core::Random(10);
@ -55,4 +56,62 @@ TEST_CASE( "Random ints with upper and bottom", "[Utilities]" ) {
CHECK(rand.Get(10, 30) == 21); CHECK(rand.Get(10, 30) == 21);
} }
TEST_CASE( "Random distribution (max 0, min 1)", "[Utilities]" ) {
auto rand = CreatureLib::Core::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)
throw CreatureException("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 = CreatureLib::Core::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)
throw CreatureException("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 = CreatureLib::Core::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)
throw CreatureException("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 #endif