ordered-hash-map-tests.cc revision 1.1 1 1.1 mrg /* Unit tests for ordered-hash-map.h.
2 1.1 mrg Copyright (C) 2015-2020 Free Software Foundation, Inc.
3 1.1 mrg
4 1.1 mrg This file is part of GCC.
5 1.1 mrg
6 1.1 mrg GCC is free software; you can redistribute it and/or modify it under
7 1.1 mrg the terms of the GNU General Public License as published by the Free
8 1.1 mrg Software Foundation; either version 3, or (at your option) any later
9 1.1 mrg version.
10 1.1 mrg
11 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 1.1 mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 1.1 mrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 1.1 mrg for more details.
15 1.1 mrg
16 1.1 mrg You should have received a copy of the GNU General Public License
17 1.1 mrg along with GCC; see the file COPYING3. If not see
18 1.1 mrg <http://www.gnu.org/licenses/>. */
19 1.1 mrg
20 1.1 mrg #include "config.h"
21 1.1 mrg #include "system.h"
22 1.1 mrg #include "coretypes.h"
23 1.1 mrg #include "tm.h"
24 1.1 mrg #include "opts.h"
25 1.1 mrg #include "hash-set.h"
26 1.1 mrg #include "fixed-value.h"
27 1.1 mrg #include "alias.h"
28 1.1 mrg #include "flags.h"
29 1.1 mrg #include "symtab.h"
30 1.1 mrg #include "tree-core.h"
31 1.1 mrg #include "stor-layout.h"
32 1.1 mrg #include "tree.h"
33 1.1 mrg #include "stringpool.h"
34 1.1 mrg #include "ordered-hash-map.h"
35 1.1 mrg #include "selftest.h"
36 1.1 mrg
37 1.1 mrg #if CHECKING_P
38 1.1 mrg
39 1.1 mrg namespace selftest {
40 1.1 mrg
41 1.1 mrg /* Populate *OUT_KVS with the key/value pairs of M. */
42 1.1 mrg
43 1.1 mrg template <typename HashMap, typename Key, typename Value>
44 1.1 mrg static void
45 1.1 mrg get_kv_pairs (const HashMap &m,
46 1.1 mrg auto_vec<std::pair<Key, Value> > *out_kvs)
47 1.1 mrg {
48 1.1 mrg for (typename HashMap::iterator iter = m.begin ();
49 1.1 mrg iter != m.end ();
50 1.1 mrg ++iter)
51 1.1 mrg out_kvs->safe_push (std::make_pair ((*iter).first, (*iter).second));
52 1.1 mrg }
53 1.1 mrg
54 1.1 mrg /* Construct an ordered_hash_map <const char *, int> and verify that
55 1.1 mrg various operations work correctly. */
56 1.1 mrg
57 1.1 mrg static void
58 1.1 mrg test_map_of_strings_to_int ()
59 1.1 mrg {
60 1.1 mrg ordered_hash_map <const char *, int> m;
61 1.1 mrg
62 1.1 mrg const char *ostrich = "ostrich";
63 1.1 mrg const char *elephant = "elephant";
64 1.1 mrg const char *ant = "ant";
65 1.1 mrg const char *spider = "spider";
66 1.1 mrg const char *millipede = "Illacme plenipes";
67 1.1 mrg const char *eric = "half a bee";
68 1.1 mrg
69 1.1 mrg /* A fresh hash_map should be empty. */
70 1.1 mrg ASSERT_EQ (0, m.elements ());
71 1.1 mrg ASSERT_EQ (NULL, m.get (ostrich));
72 1.1 mrg
73 1.1 mrg /* Populate the hash_map. */
74 1.1 mrg ASSERT_EQ (false, m.put (ostrich, 2));
75 1.1 mrg ASSERT_EQ (false, m.put (elephant, 4));
76 1.1 mrg ASSERT_EQ (false, m.put (ant, 6));
77 1.1 mrg ASSERT_EQ (false, m.put (spider, 8));
78 1.1 mrg ASSERT_EQ (false, m.put (millipede, 750));
79 1.1 mrg ASSERT_EQ (false, m.put (eric, 3));
80 1.1 mrg
81 1.1 mrg /* Verify that we can recover the stored values. */
82 1.1 mrg ASSERT_EQ (6, m.elements ());
83 1.1 mrg ASSERT_EQ (2, *m.get (ostrich));
84 1.1 mrg ASSERT_EQ (4, *m.get (elephant));
85 1.1 mrg ASSERT_EQ (6, *m.get (ant));
86 1.1 mrg ASSERT_EQ (8, *m.get (spider));
87 1.1 mrg ASSERT_EQ (750, *m.get (millipede));
88 1.1 mrg ASSERT_EQ (3, *m.get (eric));
89 1.1 mrg
90 1.1 mrg /* Verify that the order of insertion is preserved. */
91 1.1 mrg auto_vec<std::pair<const char *, int> > kvs;
92 1.1 mrg get_kv_pairs (m, &kvs);
93 1.1 mrg ASSERT_EQ (kvs.length (), 6);
94 1.1 mrg ASSERT_EQ (kvs[0].first, ostrich);
95 1.1 mrg ASSERT_EQ (kvs[0].second, 2);
96 1.1 mrg ASSERT_EQ (kvs[1].first, elephant);
97 1.1 mrg ASSERT_EQ (kvs[1].second, 4);
98 1.1 mrg ASSERT_EQ (kvs[2].first, ant);
99 1.1 mrg ASSERT_EQ (kvs[2].second, 6);
100 1.1 mrg ASSERT_EQ (kvs[3].first, spider);
101 1.1 mrg ASSERT_EQ (kvs[3].second, 8);
102 1.1 mrg ASSERT_EQ (kvs[4].first, millipede);
103 1.1 mrg ASSERT_EQ (kvs[4].second, 750);
104 1.1 mrg ASSERT_EQ (kvs[5].first, eric);
105 1.1 mrg ASSERT_EQ (kvs[5].second, 3);
106 1.1 mrg }
107 1.1 mrg
108 1.1 mrg /* Construct an ordered_hash_map using int_hash and verify that various
109 1.1 mrg operations work correctly. */
110 1.1 mrg
111 1.1 mrg static void
112 1.1 mrg test_map_of_int_to_strings ()
113 1.1 mrg {
114 1.1 mrg const int EMPTY = -1;
115 1.1 mrg const int DELETED = -2;
116 1.1 mrg typedef int_hash <int, EMPTY, DELETED> int_hash_t;
117 1.1 mrg ordered_hash_map <int_hash_t, const char *> m;
118 1.1 mrg
119 1.1 mrg const char *ostrich = "ostrich";
120 1.1 mrg const char *elephant = "elephant";
121 1.1 mrg const char *ant = "ant";
122 1.1 mrg const char *spider = "spider";
123 1.1 mrg const char *millipede = "Illacme plenipes";
124 1.1 mrg const char *eric = "half a bee";
125 1.1 mrg
126 1.1 mrg /* A fresh hash_map should be empty. */
127 1.1 mrg ASSERT_EQ (0, m.elements ());
128 1.1 mrg ASSERT_EQ (NULL, m.get (2));
129 1.1 mrg
130 1.1 mrg /* Populate the hash_map. */
131 1.1 mrg ASSERT_EQ (false, m.put (2, ostrich));
132 1.1 mrg ASSERT_EQ (false, m.put (4, elephant));
133 1.1 mrg ASSERT_EQ (false, m.put (6, ant));
134 1.1 mrg ASSERT_EQ (false, m.put (8, spider));
135 1.1 mrg ASSERT_EQ (false, m.put (750, millipede));
136 1.1 mrg ASSERT_EQ (false, m.put (3, eric));
137 1.1 mrg
138 1.1 mrg /* Verify that we can recover the stored values. */
139 1.1 mrg ASSERT_EQ (6, m.elements ());
140 1.1 mrg ASSERT_EQ (*m.get (2), ostrich);
141 1.1 mrg ASSERT_EQ (*m.get (4), elephant);
142 1.1 mrg ASSERT_EQ (*m.get (6), ant);
143 1.1 mrg ASSERT_EQ (*m.get (8), spider);
144 1.1 mrg ASSERT_EQ (*m.get (750), millipede);
145 1.1 mrg ASSERT_EQ (*m.get (3), eric);
146 1.1 mrg
147 1.1 mrg /* Verify that the order of insertion is preserved. */
148 1.1 mrg auto_vec<std::pair<int, const char *> > kvs;
149 1.1 mrg get_kv_pairs (m, &kvs);
150 1.1 mrg ASSERT_EQ (kvs.length (), 6);
151 1.1 mrg ASSERT_EQ (kvs[0].first, 2);
152 1.1 mrg ASSERT_EQ (kvs[0].second, ostrich);
153 1.1 mrg ASSERT_EQ (kvs[1].first, 4);
154 1.1 mrg ASSERT_EQ (kvs[1].second, elephant);
155 1.1 mrg ASSERT_EQ (kvs[2].first, 6);
156 1.1 mrg ASSERT_EQ (kvs[2].second, ant);
157 1.1 mrg ASSERT_EQ (kvs[3].first, 8);
158 1.1 mrg ASSERT_EQ (kvs[3].second, spider);
159 1.1 mrg ASSERT_EQ (kvs[4].first, 750);
160 1.1 mrg ASSERT_EQ (kvs[4].second, millipede);
161 1.1 mrg ASSERT_EQ (kvs[5].first, 3);
162 1.1 mrg ASSERT_EQ (kvs[5].second, eric);
163 1.1 mrg }
164 1.1 mrg
165 1.1 mrg /* Verify that we can remove items from an ordered_hash_map. */
166 1.1 mrg
167 1.1 mrg static void
168 1.1 mrg test_removal ()
169 1.1 mrg {
170 1.1 mrg ordered_hash_map <const char *, int> m;
171 1.1 mrg
172 1.1 mrg const char *ostrich = "ostrich";
173 1.1 mrg ASSERT_EQ (false, m.put (ostrich, 2));
174 1.1 mrg
175 1.1 mrg ASSERT_EQ (1, m.elements ());
176 1.1 mrg ASSERT_EQ (2, *m.get (ostrich));
177 1.1 mrg
178 1.1 mrg {
179 1.1 mrg auto_vec<std::pair<const char *, int> > kvs;
180 1.1 mrg get_kv_pairs (m, &kvs);
181 1.1 mrg ASSERT_EQ (kvs.length (), 1);
182 1.1 mrg ASSERT_EQ (kvs[0].first, ostrich);
183 1.1 mrg ASSERT_EQ (kvs[0].second, 2);
184 1.1 mrg }
185 1.1 mrg
186 1.1 mrg m.remove (ostrich);
187 1.1 mrg
188 1.1 mrg ASSERT_EQ (0, m.elements ());
189 1.1 mrg {
190 1.1 mrg auto_vec<std::pair<const char *, int> > kvs;
191 1.1 mrg get_kv_pairs (m, &kvs);
192 1.1 mrg ASSERT_EQ (kvs.length (), 0);
193 1.1 mrg }
194 1.1 mrg
195 1.1 mrg /* Reinsertion (with a different value). */
196 1.1 mrg ASSERT_EQ (false, m.put (ostrich, 42));
197 1.1 mrg ASSERT_EQ (1, m.elements ());
198 1.1 mrg ASSERT_EQ (42, *m.get (ostrich));
199 1.1 mrg {
200 1.1 mrg auto_vec<std::pair<const char *, int> > kvs;
201 1.1 mrg get_kv_pairs (m, &kvs);
202 1.1 mrg ASSERT_EQ (kvs.length (), 1);
203 1.1 mrg ASSERT_EQ (kvs[0].first, ostrich);
204 1.1 mrg ASSERT_EQ (kvs[0].second, 42);
205 1.1 mrg }
206 1.1 mrg }
207 1.1 mrg
208 1.1 mrg /* Verify that ordered_hash_map's copy-ctor works. */
209 1.1 mrg
210 1.1 mrg static void
211 1.1 mrg test_copy_ctor ()
212 1.1 mrg {
213 1.1 mrg ordered_hash_map <const char *, int> m;
214 1.1 mrg
215 1.1 mrg const char *ostrich = "ostrich";
216 1.1 mrg ASSERT_EQ (false, m.put (ostrich, 2));
217 1.1 mrg
218 1.1 mrg ASSERT_EQ (1, m.elements ());
219 1.1 mrg ASSERT_EQ (2, *m.get (ostrich));
220 1.1 mrg
221 1.1 mrg ordered_hash_map <const char *, int> copy (m);
222 1.1 mrg ASSERT_EQ (1, copy.elements ());
223 1.1 mrg ASSERT_EQ (2, *copy.get (ostrich));
224 1.1 mrg
225 1.1 mrg /* Remove from source. */
226 1.1 mrg m.remove (ostrich);
227 1.1 mrg ASSERT_EQ (0, m.elements ());
228 1.1 mrg
229 1.1 mrg /* Copy should be unaffected. */
230 1.1 mrg ASSERT_EQ (1, copy.elements ());
231 1.1 mrg ASSERT_EQ (2, *copy.get (ostrich));
232 1.1 mrg }
233 1.1 mrg
234 1.1 mrg /* Run all of the selftests within this file. */
235 1.1 mrg
236 1.1 mrg void
237 1.1 mrg ordered_hash_map_tests_cc_tests ()
238 1.1 mrg {
239 1.1 mrg test_map_of_strings_to_int ();
240 1.1 mrg test_map_of_int_to_strings ();
241 1.1 mrg test_removal ();
242 1.1 mrg test_copy_ctor ();
243 1.1 mrg }
244 1.1 mrg
245 1.1 mrg } // namespace selftest
246 1.1 mrg
247 1.1 mrg #endif /* CHECKING_P */
248