diff --git a/test/.gitignore b/test/.gitignore index 1a484d1b..d7467331 100644 --- a/test/.gitignore +++ b/test/.gitignore @@ -13,6 +13,7 @@ /md[245]* /options /pool* +/random* /range* /region* /sha1* diff --git a/test/Makefile.am b/test/Makefile.am index 6a0215f6..93e160d3 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -22,6 +22,7 @@ TEST_BIN = \ md5 \ options \ pool \ + random \ range \ region \ signal \ diff --git a/test/random.cpp b/test/random.cpp new file mode 100644 index 00000000..32047079 --- /dev/null +++ b/test/random.cpp @@ -0,0 +1,56 @@ +#include "random.hpp" +#include "debug.hpp" + +#include +#include +#include + +using namespace std; + + +// TODO: Use a more robust test like Chi-Square +void +test_bool (void) { + static const unsigned ITERATIONS = 1024; + static const unsigned THRESHOLD = ITERATIONS * 0.1; + + unsigned counts[2] = { 0, 0 }; + for (unsigned i = 0; i < ITERATIONS; ++i) + ++counts[util::random () ? 0 : 1]; + + unsigned diff = counts[0] > counts[1] ? + counts[0] - counts[1] : + counts[1] - counts[0]; + + CHECK_LT (diff, THRESHOLD); +} + + +// TODO: Use a more robust test like Kolmogorov-Smirnov +void +test_float (void) { + static const unsigned BUCKETS = 8; + static const unsigned ITERATIONS = 4096; + static const unsigned EXPECTED = ITERATIONS / BUCKETS; + static const float THRESHOLD = EXPECTED * 0.1; + + unsigned counts[BUCKETS] = { 0 }; + for (unsigned i = 0; i < ITERATIONS; ++i) + ++counts[unsigned (util::random () * BUCKETS)]; + + for (unsigned c: counts) { + unsigned diff = EXPECTED > c ? + EXPECTED - c : + c - EXPECTED; + + CHECK_LT (diff, THRESHOLD); + } +} + + +int +main (int, char **) { + srand (time (NULL)); + test_bool (); + test_float (); +}