Home | History | Annotate | Line # | Download | only in gcc
ordered-hash-map-tests.cc revision 1.1.1.2
      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