1 1.1 mrg /* Unit tests for ordered-hash-map.h. 2 1.1.1.2 mrg Copyright (C) 2015-2022 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