diff --git a/test/helpers/fwd.hpp b/test/helpers/fwd.hpp index ddff09c5..14476dda 100644 --- a/test/helpers/fwd.hpp +++ b/test/helpers/fwd.hpp @@ -10,11 +10,17 @@ namespace test { - int generate(int const*); - char generate(char const*); - signed char generate(signed char const*); - std::string generate(std::string*); - float generate(float const*); + typedef enum { + default_generator, + generate_collisions, + limited_range + } random_generator; + + int generate(int const*, random_generator); + char generate(char const*, random_generator); + signed char generate(signed char const*, random_generator); + std::string generate(std::string const*, random_generator); + float generate(float const*, random_generator); struct base_type {} base; struct derived_type : base_type {} derived; diff --git a/test/helpers/generators.hpp b/test/helpers/generators.hpp index 15441524..3265a77b 100644 --- a/test/helpers/generators.hpp +++ b/test/helpers/generators.hpp @@ -27,25 +27,32 @@ namespace test } }; - inline int generate(int const*) - { + std::size_t random_value(std::size_t max) { using namespace std; - return rand(); + return static_cast(rand()) % max; } - inline char generate(char const*) + inline int generate(int const*, random_generator g) + { + using namespace std; + int value = rand(); + if (g == limited_range) { value = value % 100; } + return value; + } + + inline char generate(char const*, random_generator) { using namespace std; return static_cast((rand() >> 1) % (128-32) + 32); } - inline signed char generate(signed char const*) + inline signed char generate(signed char const*, random_generator) { using namespace std; return static_cast(rand()); } - inline std::string generate(std::string const*) + inline std::string generate(std::string const*, random_generator g) { using namespace std; @@ -53,17 +60,30 @@ namespace test std::string result; - int length = rand() % 10; - for(int i = 0; i < length; ++i) - result += generate(char_ptr); + if (g == limited_range) { + std::size_t length = test::random_value(2) + 2; + + char const* strings[] = { "'vZh(3~ms", "%m", "_Y%U", "N'Y", "4,J_J" }; + for (std::size_t i = 0; i < length; ++i) { + result += strings[random_value(sizeof(strings) / sizeof(strings[0]))]; + } + } + else { + std::size_t length = test::random_value(10) + 1; + for (std::size_t i = 0; i < length; ++i) { + result += generate(char_ptr, g); + } + } return result; } - float generate(float const*) + float generate(float const*, random_generator g) { using namespace std; - return (float) rand() / (float) RAND_MAX; + int x = 0; + int value = generate(&x, g); + return (float) value / (float) RAND_MAX; } } diff --git a/test/helpers/random_values.hpp b/test/helpers/random_values.hpp index e22eb36c..7628514d 100644 --- a/test/helpers/random_values.hpp +++ b/test/helpers/random_values.hpp @@ -14,11 +14,6 @@ namespace test { - typedef enum { - default_generator, - generate_collisions - } random_generator; - template struct unordered_generator_set { @@ -32,16 +27,15 @@ namespace test template void fill(T& x, std::size_t len) { value_type* value_ptr = 0; - int* int_ptr = 0; len += x.size(); for (std::size_t i = 0; i < len; ++i) { - value_type value = generate(value_ptr); + value_type value = generate(value_ptr, type_); - int count = type_ == generate_collisions ? - 1 + (generate(int_ptr) % 5) : 1; + std::size_t count = type_ == generate_collisions ? + random_value(5) + 1 : 1; - for(int j = 0; j < count; ++j) { + for(std::size_t j = 0; j < count; ++j) { x.push_back(value); } } @@ -63,17 +57,16 @@ namespace test void fill(T& x, std::size_t len) { key_type* key_ptr = 0; mapped_type* mapped_ptr = 0; - int* int_ptr = 0; for (std::size_t i = 0; i < len; ++i) { - key_type key = generate(key_ptr); + key_type key = generate(key_ptr, type_); - int count = type_ == generate_collisions ? - 1 + (generate(int_ptr) % 5) : 1; + std::size_t count = type_ == generate_collisions ? + random_value(5) + 1 : 1; - for(int j = 0; j < count; ++j) { + for(std::size_t j = 0; j < count; ++j) { x.push_back(std::pair( - key, generate(mapped_ptr))); + key, generate(mapped_ptr, type_))); } } } diff --git a/test/objects/exception.hpp b/test/objects/exception.hpp index b3c4bacb..7ffe8f4c 100644 --- a/test/objects/exception.hpp +++ b/test/objects/exception.hpp @@ -23,7 +23,7 @@ namespace exception class hash; class equal_to; template class allocator; - object generate(object const*); + object generate(object const*, random_generator); struct true_type { @@ -101,9 +101,9 @@ namespace exception (x1.tag1_ == x2.tag1_ && x1.tag2_ < x2.tag2_); } - friend object generate(object const*) { + friend object generate(object const*, random_generator g) { int* x = 0; - return object(::test::generate(x), ::test::generate(x)); + return object(::test::generate(x, g), ::test::generate(x, g)); } friend std::ostream& operator<<(std::ostream& out, object const& o) @@ -590,8 +590,9 @@ namespace exception #if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP) namespace test { - test::exception::object generate(test::exception::object const* x) { - return test::exception::generate(x); + test::exception::object generate(test::exception::object const* x, + random_generator g) { + return test::exception::generate(x, g); } } #endif diff --git a/test/objects/test.hpp b/test/objects/test.hpp index a8c81263..2fe4b1f3 100644 --- a/test/objects/test.hpp +++ b/test/objects/test.hpp @@ -25,9 +25,9 @@ namespace test class equal_to; template class allocator1; template class allocator2; - object generate(object const*); - movable generate(movable const*); - implicitly_convertible generate(implicitly_convertible const*); + object generate(object const*, random_generator); + movable generate(movable const*, random_generator); + implicitly_convertible generate(implicitly_convertible const*, random_generator); inline void ignore_variable(void const*) {} @@ -58,9 +58,9 @@ namespace test (x1.tag1_ == x2.tag1_ && x1.tag2_ < x2.tag2_); } - friend object generate(object const*) { + friend object generate(object const*, random_generator g) { int* x = 0; - return object(generate(x), generate(x)); + return object(generate(x, g), generate(x, g)); } friend std::ostream& operator<<(std::ostream& out, object const& o) @@ -133,9 +133,9 @@ namespace test (x1.tag1_ == x2.tag1_ && x1.tag2_ < x2.tag2_); } - friend movable generate(movable const*) { + friend movable generate(movable const*, random_generator g) { int* x = 0; - return movable(generate(x), generate(x)); + return movable(generate(x, g), generate(x, g)); } friend std::ostream& operator<<(std::ostream& out, movable const& o) @@ -163,9 +163,9 @@ namespace test return movable(tag1_, tag2_); } - friend implicitly_convertible generate(implicitly_convertible const*) { + friend implicitly_convertible generate(implicitly_convertible const*, random_generator g) { int* x = 0; - return implicitly_convertible(generate(x), generate(x)); + return implicitly_convertible(generate(x, g), generate(x, g)); } friend std::ostream& operator<<(std::ostream& out, implicitly_convertible const& o) diff --git a/test/unordered/assign_tests.cpp b/test/unordered/assign_tests.cpp index e66967c6..aa0f579f 100644 --- a/test/unordered/assign_tests.cpp +++ b/test/unordered/assign_tests.cpp @@ -236,6 +236,7 @@ boost::unordered_multimap bool is_propagate(T*) @@ -256,7 +257,7 @@ UNORDERED_TEST(assign_tests1, ( (test_set_prop_assign)(test_multiset_prop_assign)(test_map_prop_assign)(test_multimap_prop_assign) (test_set_no_prop_assign)(test_multiset_no_prop_assign)(test_map_no_prop_assign)(test_multimap_no_prop_assign) ) - ((default_generator)(generate_collisions)) + ((default_generator)(generate_collisions)(limited_range)) ) UNORDERED_TEST(assign_tests2, ( @@ -264,7 +265,7 @@ UNORDERED_TEST(assign_tests2, ( (test_set_prop_assign)(test_multiset_prop_assign)(test_map_prop_assign)(test_multimap_prop_assign) (test_set_no_prop_assign)(test_multiset_no_prop_assign)(test_map_no_prop_assign)(test_multimap_no_prop_assign) ) - ((default_generator)(generate_collisions)) + ((default_generator)(generate_collisions)(limited_range)) ) #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) diff --git a/test/unordered/bucket_tests.cpp b/test/unordered/bucket_tests.cpp index 7c6ff2d3..4417f2d5 100644 --- a/test/unordered/bucket_tests.cpp +++ b/test/unordered/bucket_tests.cpp @@ -89,10 +89,11 @@ boost::unordered_multimap(rand()) % max; -} - template void erase_tests1(Container*, test::random_generator generator) { @@ -90,7 +85,7 @@ void erase_tests1(Container*, test::random_generator generator) int iterations = 0; while(size > 0 && !x.empty()) { - std::size_t index = random_value(x.size()); + std::size_t index = test::random_value(x.size()); c_iterator prev, pos, next; if(index == 0) { prev = pos = x.begin(); @@ -163,8 +158,8 @@ void erase_tests1(Container*, test::random_generator generator) iterators.push_back(x.cend()); while(iterators.size() > 1) { - std::size_t start = random_value(iterators.size()); - std::size_t length = random_value(iterators.size() - start); + std::size_t start = test::random_value(iterators.size()); + std::size_t length = test::random_value(iterators.size() - start); x.erase(iterators[start], iterators[start + length]); iterators.erase( boost::next(iterators.begin(), @@ -219,7 +214,7 @@ void erase_tests1(Container*, test::random_generator generator) int iterations = 0; while(size > 0 && !x.empty()) { - std::size_t index = random_value(x.size()); + std::size_t index = test::random_value(x.size()); BOOST_DEDUCED_TYPENAME Container::const_iterator prev, pos, next; if(index == 0) { prev = pos = x.begin(); @@ -278,10 +273,11 @@ boost::unordered_multimap(rand()) % max; -} - template void unique_insert_tests1(X*, test::random_generator generator) { @@ -319,7 +314,7 @@ void insert_tests2(X*, test::random_generator generator) BOOST_DEDUCED_TYPENAME test::random_values::iterator next = it; - for (std::size_t j = random_value(20); j > 0; ++j) { + for (std::size_t j = test::random_value(20); j > 0; ++j) { ++next; if (next == v.end()) { break; } } @@ -566,57 +561,58 @@ boost::unordered_multimap* int_multimap_ptr; using test::default_generator; using test::generate_collisions; +using test::limited_range; UNORDERED_TEST(set_load_factor_tests, ((int_set_ptr)(int_multiset_ptr)(int_map_ptr)(int_multimap_ptr)) @@ -85,7 +86,7 @@ UNORDERED_TEST(set_load_factor_tests, UNORDERED_TEST(load_factor_insert_tests, ((int_set_ptr)(int_multiset_ptr)(int_map_ptr)(int_multimap_ptr)) - ((default_generator)(generate_collisions)) + ((default_generator)(generate_collisions)(limited_range)) ) } diff --git a/test/unordered/move_tests.cpp b/test/unordered/move_tests.cpp index 8c7e8702..b04f33b0 100644 --- a/test/unordered/move_tests.cpp +++ b/test/unordered/move_tests.cpp @@ -369,6 +369,7 @@ boost::unordered_multimap* int_multimap_ptr; using test::default_generator; using test::generate_collisions; +using test::limited_range; UNORDERED_TEST(rehash_empty_test1, ((int_set_ptr)(test_multiset_ptr)(test_map_ptr)(int_multimap_ptr)) ) UNORDERED_TEST(rehash_empty_test2, ((int_set_ptr)(test_multiset_ptr)(test_map_ptr)(int_multimap_ptr)) - ((default_generator)(generate_collisions)) + ((default_generator)(generate_collisions)(limited_range)) ) UNORDERED_TEST(rehash_empty_test3, ((int_set_ptr)(test_multiset_ptr)(test_map_ptr)(int_multimap_ptr)) - ((default_generator)(generate_collisions)) + ((default_generator)(generate_collisions)(limited_range)) ) UNORDERED_TEST(rehash_test1, ((int_set_ptr)(test_multiset_ptr)(test_map_ptr)(int_multimap_ptr)) - ((default_generator)(generate_collisions)) + ((default_generator)(generate_collisions)(limited_range)) ) UNORDERED_TEST(reserve_empty_test1, ((int_set_ptr)(test_multiset_ptr)(test_map_ptr)(int_multimap_ptr)) @@ -232,11 +233,11 @@ UNORDERED_TEST(reserve_empty_test2, ) UNORDERED_TEST(reserve_test1, ((int_set_ptr)(test_multiset_ptr)(test_map_ptr)(int_multimap_ptr)) - ((default_generator)(generate_collisions)) + ((default_generator)(generate_collisions)(limited_range)) ) UNORDERED_TEST(reserve_test2, ((int_set_ptr)(test_multiset_ptr)(test_map_ptr)(int_multimap_ptr)) - ((default_generator)(generate_collisions)) + ((default_generator)(generate_collisions)(limited_range)) ) } diff --git a/test/unordered/swap_tests.cpp b/test/unordered/swap_tests.cpp index d967af03..7814a26a 100644 --- a/test/unordered/swap_tests.cpp +++ b/test/unordered/swap_tests.cpp @@ -206,6 +206,7 @@ bool is_propagate(T*) using test::default_generator; using test::generate_collisions; +using test::limited_range; UNORDERED_AUTO_TEST(check_traits) { @@ -220,7 +221,7 @@ UNORDERED_TEST(swap_tests1, ( (test_set_prop_swap)(test_multiset_prop_swap)(test_map_prop_swap)(test_multimap_prop_swap) (test_set_no_prop_swap)(test_multiset_no_prop_swap)(test_map_no_prop_swap)(test_multimap_no_prop_swap) ) - ((default_generator)(generate_collisions)) + ((default_generator)(generate_collisions)(limited_range)) ) UNORDERED_TEST(swap_tests2, ( @@ -228,7 +229,7 @@ UNORDERED_TEST(swap_tests2, ( (test_set_prop_swap)(test_multiset_prop_swap)(test_map_prop_swap)(test_multimap_prop_swap) (test_set_no_prop_swap)(test_multiset_no_prop_swap)(test_map_no_prop_swap)(test_multimap_no_prop_swap) ) - ((default_generator)(generate_collisions)) + ((default_generator)(generate_collisions)(limited_range)) ) }