Home | History | Annotate | Line # | Download | only in gcc
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