]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | |
2 | // Copyright 2008-2009 Daniel James. | |
3 | // Distributed under the Boost Software License, Version 1.0. (See accompanying | |
4 | // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |
5 | ||
b32b8144 | 6 | // clang-format off |
7c673cae FG |
7 | #include "../helpers/prefix.hpp" |
8 | #include <boost/unordered_set.hpp> | |
9 | #include <boost/unordered_map.hpp> | |
10 | #include "../helpers/postfix.hpp" | |
b32b8144 | 11 | // clang-format on |
7c673cae FG |
12 | |
13 | #include <boost/preprocessor/seq.hpp> | |
14 | #include <list> | |
15 | #include "../helpers/test.hpp" | |
16 | ||
b32b8144 FG |
17 | namespace equality_tests { |
18 | struct mod_compare | |
19 | { | |
20 | bool alt_hash_; | |
7c673cae | 21 | |
b32b8144 | 22 | explicit mod_compare(bool alt_hash = false) : alt_hash_(alt_hash) {} |
7c673cae | 23 | |
b32b8144 | 24 | bool operator()(int x, int y) const { return x % 1000 == y % 1000; } |
7c673cae | 25 | |
b32b8144 | 26 | std::size_t operator()(int x) const |
7c673cae | 27 | { |
b32b8144 FG |
28 | return alt_hash_ ? static_cast<std::size_t>(x % 250) |
29 | : static_cast<std::size_t>((x + 5) % 250); | |
7c673cae | 30 | } |
b32b8144 FG |
31 | }; |
32 | ||
33 | #define UNORDERED_EQUALITY_SET_TEST(seq1, op, seq2) \ | |
11fdf7f2 | 34 | { \ |
b32b8144 FG |
35 | boost::unordered_set<int, mod_compare, mod_compare> set1, set2; \ |
36 | BOOST_PP_SEQ_FOR_EACH(UNORDERED_SET_INSERT, set1, seq1) \ | |
37 | BOOST_PP_SEQ_FOR_EACH(UNORDERED_SET_INSERT, set2, seq2) \ | |
38 | BOOST_TEST(set1 op set2); \ | |
11fdf7f2 | 39 | } |
b32b8144 FG |
40 | |
41 | #define UNORDERED_EQUALITY_MULTISET_TEST(seq1, op, seq2) \ | |
11fdf7f2 | 42 | { \ |
b32b8144 FG |
43 | boost::unordered_multiset<int, mod_compare, mod_compare> set1, set2; \ |
44 | BOOST_PP_SEQ_FOR_EACH(UNORDERED_SET_INSERT, set1, seq1) \ | |
45 | BOOST_PP_SEQ_FOR_EACH(UNORDERED_SET_INSERT, set2, seq2) \ | |
46 | BOOST_TEST(set1 op set2); \ | |
11fdf7f2 | 47 | } |
b32b8144 FG |
48 | |
49 | #define UNORDERED_EQUALITY_MAP_TEST(seq1, op, seq2) \ | |
11fdf7f2 | 50 | { \ |
b32b8144 FG |
51 | boost::unordered_map<int, int, mod_compare, mod_compare> map1, map2; \ |
52 | BOOST_PP_SEQ_FOR_EACH(UNORDERED_MAP_INSERT, map1, seq1) \ | |
53 | BOOST_PP_SEQ_FOR_EACH(UNORDERED_MAP_INSERT, map2, seq2) \ | |
54 | BOOST_TEST(map1 op map2); \ | |
11fdf7f2 | 55 | } |
b32b8144 FG |
56 | |
57 | #define UNORDERED_EQUALITY_MULTIMAP_TEST(seq1, op, seq2) \ | |
11fdf7f2 | 58 | { \ |
b32b8144 FG |
59 | boost::unordered_multimap<int, int, mod_compare, mod_compare> map1, map2; \ |
60 | BOOST_PP_SEQ_FOR_EACH(UNORDERED_MAP_INSERT, map1, seq1) \ | |
61 | BOOST_PP_SEQ_FOR_EACH(UNORDERED_MAP_INSERT, map2, seq2) \ | |
62 | BOOST_TEST(map1 op map2); \ | |
11fdf7f2 | 63 | } |
7c673cae | 64 | |
b32b8144 FG |
65 | #define UNORDERED_SET_INSERT(r, set, item) set.insert(item); |
66 | #define UNORDERED_MAP_INSERT(r, map, item) \ | |
67 | map.insert(std::pair<int const, int> BOOST_PP_SEQ_TO_TUPLE(item)); | |
68 | ||
69 | UNORDERED_AUTO_TEST (equality_size_tests) { | |
70 | boost::unordered_set<int> x1, x2; | |
71 | BOOST_TEST(x1 == x2); | |
72 | BOOST_TEST(!(x1 != x2)); | |
73 | ||
74 | x1.insert(1); | |
75 | BOOST_TEST(x1 != x2); | |
76 | BOOST_TEST(!(x1 == x2)); | |
77 | BOOST_TEST(x2 != x1); | |
78 | BOOST_TEST(!(x2 == x1)); | |
79 | ||
80 | x2.insert(1); | |
81 | BOOST_TEST(x1 == x2); | |
82 | BOOST_TEST(!(x1 != x2)); | |
83 | ||
84 | x2.insert(2); | |
85 | BOOST_TEST(x1 != x2); | |
86 | BOOST_TEST(!(x1 == x2)); | |
87 | BOOST_TEST(x2 != x1); | |
88 | BOOST_TEST(!(x2 == x1)); | |
89 | } | |
90 | ||
91 | UNORDERED_AUTO_TEST (equality_key_value_tests) { | |
11fdf7f2 TL |
92 | UNORDERED_EQUALITY_MULTISET_TEST((1), !=, (2)) |
93 | UNORDERED_EQUALITY_SET_TEST((2), ==, (2)) | |
94 | UNORDERED_EQUALITY_MAP_TEST(((1)(1))((2)(1)), !=, ((1)(1))((3)(1))) | |
b32b8144 FG |
95 | } |
96 | ||
97 | UNORDERED_AUTO_TEST (equality_collision_test) { | |
11fdf7f2 TL |
98 | UNORDERED_EQUALITY_MULTISET_TEST((1), !=, (501)) |
99 | UNORDERED_EQUALITY_MULTISET_TEST((1)(251), !=, (1)(501)) | |
100 | UNORDERED_EQUALITY_MULTIMAP_TEST(((251)(1))((1)(1)), !=, ((501)(1))((1)(1))) | |
101 | UNORDERED_EQUALITY_MULTISET_TEST((1)(501), ==, (1)(501)) | |
102 | UNORDERED_EQUALITY_SET_TEST((1)(501), ==, (501)(1)) | |
b32b8144 FG |
103 | } |
104 | ||
105 | UNORDERED_AUTO_TEST (equality_group_size_test) { | |
11fdf7f2 | 106 | UNORDERED_EQUALITY_MULTISET_TEST((10)(20)(20), !=, (10)(10)(20)) |
b32b8144 | 107 | UNORDERED_EQUALITY_MULTIMAP_TEST( |
11fdf7f2 | 108 | ((10)(1))((20)(1))((20)(1)), !=, ((10)(1))((20)(1))((10)(1))) |
b32b8144 | 109 | UNORDERED_EQUALITY_MULTIMAP_TEST( |
11fdf7f2 | 110 | ((20)(1))((10)(1))((10)(1)), ==, ((10)(1))((20)(1))((10)(1))) |
b32b8144 FG |
111 | } |
112 | ||
113 | UNORDERED_AUTO_TEST (equality_map_value_test) { | |
11fdf7f2 TL |
114 | UNORDERED_EQUALITY_MAP_TEST(((1)(1)), !=, ((1)(2))) |
115 | UNORDERED_EQUALITY_MAP_TEST(((1)(1)), ==, ((1)(1))) | |
116 | UNORDERED_EQUALITY_MULTIMAP_TEST(((1)(1)), !=, ((1)(2))) | |
117 | UNORDERED_EQUALITY_MULTIMAP_TEST(((1)(1))((1)(1)), !=, ((1)(1))((1)(2))) | |
118 | UNORDERED_EQUALITY_MULTIMAP_TEST(((1)(2))((1)(1)), ==, ((1)(1))((1)(2))) | |
119 | UNORDERED_EQUALITY_MULTIMAP_TEST(((1)(2))((1)(1)), !=, ((1)(1))((1)(3))) | |
b32b8144 FG |
120 | } |
121 | ||
122 | UNORDERED_AUTO_TEST (equality_predicate_test) { | |
11fdf7f2 TL |
123 | UNORDERED_EQUALITY_SET_TEST((1), !=, (1001)) |
124 | UNORDERED_EQUALITY_MAP_TEST(((1)(2))((1001)(1)), !=, ((1001)(2))((1)(1))) | |
b32b8144 FG |
125 | } |
126 | ||
127 | UNORDERED_AUTO_TEST (equality_multiple_group_test) { | |
128 | UNORDERED_EQUALITY_MULTISET_TEST( | |
129 | (1)(1)(1)(1001)(2001)(2001)(2)(1002)(3)(1003)(2003), ==, | |
11fdf7f2 | 130 | (3)(1003)(2003)(1002)(2)(2001)(2001)(1)(1001)(1)(1)) |
b32b8144 FG |
131 | } |
132 | ||
133 | // Test that equality still works when the two containers have | |
134 | // different hash functions but the same equality predicate. | |
135 | ||
136 | UNORDERED_AUTO_TEST (equality_different_hash_test) { | |
137 | typedef boost::unordered_set<int, mod_compare, mod_compare> set; | |
138 | set set1(0, mod_compare(false), mod_compare(false)); | |
139 | set set2(0, mod_compare(true), mod_compare(true)); | |
140 | BOOST_TEST(set1 == set2); | |
141 | set1.insert(1); | |
142 | set2.insert(2); | |
143 | BOOST_TEST(set1 != set2); | |
144 | set1.insert(2); | |
145 | set2.insert(1); | |
146 | BOOST_TEST(set1 == set2); | |
147 | set1.insert(10); | |
148 | set2.insert(20); | |
149 | BOOST_TEST(set1 != set2); | |
150 | set1.insert(20); | |
151 | set2.insert(10); | |
152 | BOOST_TEST(set1 == set2); | |
153 | } | |
7c673cae FG |
154 | } |
155 | ||
156 | RUN_TESTS() |