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