|
|
#include <cstdlib> |
|
|
|
|
|
#include "util/random.hh" |
|
|
|
|
|
#define BOOST_TEST_MODULE RandomTest |
|
|
#include <boost/test/unit_test.hpp> |
|
|
|
|
|
namespace util |
|
|
{ |
|
|
namespace |
|
|
{ |
|
|
|
|
|
BOOST_AUTO_TEST_CASE(rand_int_returns_positive_no_greater_than_RAND_MAX) |
|
|
{ |
|
|
rand_init(); |
|
|
for (int i=0; i<100; i++) |
|
|
{ |
|
|
const int random_number = rand<int>(); |
|
|
BOOST_CHECK(random_number >= 0); |
|
|
BOOST_CHECK(random_number <= RAND_MAX); |
|
|
} |
|
|
} |
|
|
|
|
|
BOOST_AUTO_TEST_CASE(rand_int_returns_different_consecutive_numbers) |
|
|
{ |
|
|
rand_init(99); |
|
|
const int first = rand<int>(), second = rand<int>(), third = rand<int>(); |
|
|
|
|
|
|
|
|
BOOST_CHECK(second != first || third != first); |
|
|
} |
|
|
|
|
|
BOOST_AUTO_TEST_CASE(rand_int_returns_different_numbers_for_different_seeds) |
|
|
{ |
|
|
rand_init(1); |
|
|
const int one1 = rand<int>(), one2 = rand<int>(); |
|
|
rand_init(2); |
|
|
const int two1 = rand<int>(), two2 = rand<int>(); |
|
|
BOOST_CHECK(two1 != one1 || two2 != one2); |
|
|
} |
|
|
|
|
|
BOOST_AUTO_TEST_CASE(rand_int_returns_same_sequence_for_same_seed) |
|
|
{ |
|
|
rand_init(1); |
|
|
const int first = rand<int>(); |
|
|
rand_init(1); |
|
|
const int second = rand<int>(); |
|
|
BOOST_CHECK_EQUAL(first, second); |
|
|
} |
|
|
|
|
|
BOOST_AUTO_TEST_CASE(rand_excl_int_returns_number_in_range) |
|
|
{ |
|
|
const int bottom = 10, top = 50; |
|
|
for (int i=0; i<100; i++) |
|
|
{ |
|
|
const int random_number = rand_excl(bottom, top); |
|
|
BOOST_CHECK(random_number >= bottom); |
|
|
BOOST_CHECK(random_number < top); |
|
|
} |
|
|
} |
|
|
|
|
|
BOOST_AUTO_TEST_CASE(rand_excl_int_covers_full_range) |
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const int bottom = 1, top = 4; |
|
|
int lowest = 99, highest = -1; |
|
|
for (int i=0; i<100; i++) |
|
|
{ |
|
|
const int random_number = rand_excl(bottom, top); |
|
|
lowest = std::min(lowest, random_number); |
|
|
highest = std::max(highest, random_number); |
|
|
} |
|
|
|
|
|
BOOST_CHECK_EQUAL(lowest, bottom); |
|
|
BOOST_CHECK_EQUAL(highest, top - 1); |
|
|
} |
|
|
|
|
|
BOOST_AUTO_TEST_CASE(rand_incl_int_returns_number_in_range) |
|
|
{ |
|
|
const int bottom = 10, top = 50; |
|
|
for (int i=0; i<100; i++) |
|
|
{ |
|
|
const int random_number = rand_incl(bottom, top); |
|
|
BOOST_CHECK(random_number >= 0); |
|
|
BOOST_CHECK(random_number <= top); |
|
|
} |
|
|
} |
|
|
|
|
|
BOOST_AUTO_TEST_CASE(rand_incl_int_covers_full_range) |
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const int bottom = 1, top = 4; |
|
|
int lowest = 99, highest = -1; |
|
|
for (int i=0; i<100; i++) |
|
|
{ |
|
|
const int random_number = rand_incl(bottom, top); |
|
|
lowest = std::min(lowest, random_number); |
|
|
highest = std::max(highest, random_number); |
|
|
} |
|
|
|
|
|
BOOST_CHECK_EQUAL(lowest, bottom); |
|
|
BOOST_CHECK_EQUAL(highest, top); |
|
|
} |
|
|
|
|
|
BOOST_AUTO_TEST_CASE(rand_excl_float_returns_float_in_range) |
|
|
{ |
|
|
const float bottom = 5, top = 10; |
|
|
for (int i=0; i<100; i++) |
|
|
{ |
|
|
const float random_number = rand_excl(bottom, top); |
|
|
BOOST_CHECK(random_number >= bottom); |
|
|
BOOST_CHECK(random_number < top); |
|
|
} |
|
|
} |
|
|
|
|
|
BOOST_AUTO_TEST_CASE(rand_excl_float_returns_different_values) |
|
|
{ |
|
|
const float bottom = 5, top = 10; |
|
|
float lowest = 99, highest = -1; |
|
|
for (int i=0; i<10; i++) |
|
|
{ |
|
|
const float random_number = rand_excl(bottom, top); |
|
|
lowest = std::min(lowest, random_number); |
|
|
highest = std::max(highest, random_number); |
|
|
} |
|
|
BOOST_CHECK(lowest < highest); |
|
|
} |
|
|
|
|
|
BOOST_AUTO_TEST_CASE(rand_float_incl_returns_float_in_range) |
|
|
{ |
|
|
const float bottom = 5, top = 10; |
|
|
for (int i=0; i<1000; i++) |
|
|
{ |
|
|
const float random_number = rand_excl(bottom, top); |
|
|
BOOST_CHECK(random_number >= bottom); |
|
|
BOOST_CHECK(random_number <= top); |
|
|
} |
|
|
} |
|
|
|
|
|
BOOST_AUTO_TEST_CASE(rand_float_incl_returns_different_values) |
|
|
{ |
|
|
const float bottom = 0, top = 10; |
|
|
float lowest = 99, highest = -1; |
|
|
for (int i=0; i<10; i++) |
|
|
{ |
|
|
const float random_number = rand_excl(bottom, top); |
|
|
lowest = std::min(lowest, random_number); |
|
|
highest = std::max(highest, random_number); |
|
|
} |
|
|
BOOST_CHECK(lowest < highest); |
|
|
} |
|
|
|
|
|
BOOST_AUTO_TEST_CASE(wide_rand_int_returns_different_numbers_in_range) |
|
|
{ |
|
|
for (int i=0; i<100; i++) |
|
|
{ |
|
|
const int random_number = wide_rand<int>(); |
|
|
BOOST_CHECK(random_number >= 0); |
|
|
BOOST_CHECK(random_number <= RAND_MAX); |
|
|
} |
|
|
} |
|
|
|
|
|
BOOST_AUTO_TEST_CASE(wide_rand_long_long_returns_big_numbers) |
|
|
{ |
|
|
long long one = wide_rand<long long>(), two = wide_rand<long long>(); |
|
|
|
|
|
|
|
|
BOOST_CHECK(one > RAND_MAX || two > RAND_MAX); |
|
|
} |
|
|
|
|
|
BOOST_AUTO_TEST_CASE(wide_rand_excl_supports_larger_range) |
|
|
{ |
|
|
const long long top = 1000 * (long long)RAND_MAX; |
|
|
long long |
|
|
one = wide_rand_excl<long long>(top), |
|
|
two = wide_rand_excl<long long>(top); |
|
|
BOOST_CHECK(one < top); |
|
|
BOOST_CHECK(two < top); |
|
|
|
|
|
|
|
|
BOOST_CHECK(one > RAND_MAX || two > RAND_MAX); |
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
|