00001 #include <cstdlib>
00002
00003 #include "util/random.hh"
00004
00005 #define BOOST_TEST_MODULE RandomTest
00006 #include <boost/test/unit_test.hpp>
00007
00008 namespace util
00009 {
00010 namespace
00011 {
00012
00013 BOOST_AUTO_TEST_CASE(rand_int_returns_positive_no_greater_than_RAND_MAX)
00014 {
00015 rand_init();
00016 for (int i=0; i<100; i++)
00017 {
00018 const int random_number = rand<int>();
00019 BOOST_CHECK(random_number >= 0);
00020 BOOST_CHECK(random_number <= RAND_MAX);
00021 }
00022 }
00023
00024 BOOST_AUTO_TEST_CASE(rand_int_returns_different_consecutive_numbers)
00025 {
00026 rand_init(99);
00027 const int first = rand<int>(), second = rand<int>(), third = rand<int>();
00028
00029
00030 BOOST_CHECK(second != first || third != first);
00031 }
00032
00033 BOOST_AUTO_TEST_CASE(rand_int_returns_different_numbers_for_different_seeds)
00034 {
00035 rand_init(1);
00036 const int one1 = rand<int>(), one2 = rand<int>();
00037 rand_init(2);
00038 const int two1 = rand<int>(), two2 = rand<int>();
00039 BOOST_CHECK(two1 != one1 || two2 != one2);
00040 }
00041
00042 BOOST_AUTO_TEST_CASE(rand_int_returns_same_sequence_for_same_seed)
00043 {
00044 rand_init(1);
00045 const int first = rand<int>();
00046 rand_init(1);
00047 const int second = rand<int>();
00048 BOOST_CHECK_EQUAL(first, second);
00049 }
00050
00051 BOOST_AUTO_TEST_CASE(rand_excl_int_returns_number_in_range)
00052 {
00053 const int bottom = 10, top = 50;
00054 for (int i=0; i<100; i++)
00055 {
00056 const int random_number = rand_excl(bottom, top);
00057 BOOST_CHECK(random_number >= bottom);
00058 BOOST_CHECK(random_number < top);
00059 }
00060 }
00061
00062 BOOST_AUTO_TEST_CASE(rand_excl_int_covers_full_range)
00063 {
00064
00065
00066
00067
00068 const int bottom = 1, top = 4;
00069 int lowest = 99, highest = -1;
00070 for (int i=0; i<100; i++)
00071 {
00072 const int random_number = rand_excl(bottom, top);
00073 lowest = std::min(lowest, random_number);
00074 highest = std::max(highest, random_number);
00075 }
00076
00077 BOOST_CHECK_EQUAL(lowest, bottom);
00078 BOOST_CHECK_EQUAL(highest, top - 1);
00079 }
00080
00081 BOOST_AUTO_TEST_CASE(rand_incl_int_returns_number_in_range)
00082 {
00083 const int bottom = 10, top = 50;
00084 for (int i=0; i<100; i++)
00085 {
00086 const int random_number = rand_incl(bottom, top);
00087 BOOST_CHECK(random_number >= 0);
00088 BOOST_CHECK(random_number <= top);
00089 }
00090 }
00091
00092 BOOST_AUTO_TEST_CASE(rand_incl_int_covers_full_range)
00093 {
00094
00095
00096
00097
00098 const int bottom = 1, top = 4;
00099 int lowest = 99, highest = -1;
00100 for (int i=0; i<100; i++)
00101 {
00102 const int random_number = rand_incl(bottom, top);
00103 lowest = std::min(lowest, random_number);
00104 highest = std::max(highest, random_number);
00105 }
00106
00107 BOOST_CHECK_EQUAL(lowest, bottom);
00108 BOOST_CHECK_EQUAL(highest, top);
00109 }
00110
00111 BOOST_AUTO_TEST_CASE(rand_excl_float_returns_float_in_range)
00112 {
00113 const float bottom = 5, top = 10;
00114 for (int i=0; i<100; i++)
00115 {
00116 const float random_number = rand_excl(bottom, top);
00117 BOOST_CHECK(random_number >= bottom);
00118 BOOST_CHECK(random_number < top);
00119 }
00120 }
00121
00122 BOOST_AUTO_TEST_CASE(rand_excl_float_returns_different_values)
00123 {
00124 const float bottom = 5, top = 10;
00125 float lowest = 99, highest = -1;
00126 for (int i=0; i<10; i++)
00127 {
00128 const float random_number = rand_excl(bottom, top);
00129 lowest = std::min(lowest, random_number);
00130 highest = std::max(highest, random_number);
00131 }
00132 BOOST_CHECK(lowest < highest);
00133 }
00134
00135 BOOST_AUTO_TEST_CASE(rand_float_incl_returns_float_in_range)
00136 {
00137 const float bottom = 5, top = 10;
00138 for (int i=0; i<1000; i++)
00139 {
00140 const float random_number = rand_excl(bottom, top);
00141 BOOST_CHECK(random_number >= bottom);
00142 BOOST_CHECK(random_number <= top);
00143 }
00144 }
00145
00146 BOOST_AUTO_TEST_CASE(rand_float_incl_returns_different_values)
00147 {
00148 const float bottom = 0, top = 10;
00149 float lowest = 99, highest = -1;
00150 for (int i=0; i<10; i++)
00151 {
00152 const float random_number = rand_excl(bottom, top);
00153 lowest = std::min(lowest, random_number);
00154 highest = std::max(highest, random_number);
00155 }
00156 BOOST_CHECK(lowest < highest);
00157 }
00158
00159 BOOST_AUTO_TEST_CASE(wide_rand_int_returns_different_numbers_in_range)
00160 {
00161 for (int i=0; i<100; i++)
00162 {
00163 const int random_number = wide_rand<int>();
00164 BOOST_CHECK(random_number >= 0);
00165 BOOST_CHECK(random_number <= RAND_MAX);
00166 }
00167 }
00168
00169 BOOST_AUTO_TEST_CASE(wide_rand_long_long_returns_big_numbers)
00170 {
00171 long long one = wide_rand<long long>(), two = wide_rand<long long>();
00172
00173
00174 BOOST_CHECK(one > RAND_MAX || two > RAND_MAX);
00175 }
00176
00177 BOOST_AUTO_TEST_CASE(wide_rand_excl_supports_larger_range)
00178 {
00179 const long long top = 1000 * (long long)RAND_MAX;
00180 long long
00181 one = wide_rand_excl<long long>(top),
00182 two = wide_rand_excl<long long>(top);
00183 BOOST_CHECK(one < top);
00184 BOOST_CHECK(two < top);
00185
00186
00187 BOOST_CHECK(one > RAND_MAX || two > RAND_MAX);
00188 }
00189
00190 }
00191 }