xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/hash-set-tests.c (revision 9fb66d812c00ebfb445c0b47dea128f32aa6fe96)
1 /* Unit tests for hash-set.h.
2    Copyright (C) 2015-2019 Free Software Foundation, Inc.
3 
4 This file is part of GCC.
5 
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10 
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19 
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "tm.h"
24 #include "opts.h"
25 #include "hash-set.h"
26 #include "selftest.h"
27 
28 #if CHECKING_P
29 
30 namespace selftest {
31 
32 /* Construct a hash_set <const char *> and verify that various operations
33    work correctly.  */
34 
35 static void
36 test_set_of_strings ()
37 {
38   hash_set <const char *> s;
39   ASSERT_EQ (0, s.elements ());
40 
41   const char *red = "red";
42   const char *green = "green";
43   const char *blue = "blue";
44 
45   ASSERT_EQ (false, s.contains (red));
46 
47   for (hash_set<const char *>::iterator it = s.begin (); it != s.end (); ++it)
48     ASSERT_EQ (true, false);
49 
50   /* Populate the hash_set.  */
51   ASSERT_EQ (false, s.add (red));
52   ASSERT_EQ (false, s.add (green));
53   ASSERT_EQ (false, s.add (blue));
54   ASSERT_EQ (true, s.add (green));
55 
56   /* Verify that the values are now within the set.  */
57   ASSERT_EQ (true, s.contains (red));
58   ASSERT_EQ (true, s.contains (green));
59   ASSERT_EQ (true, s.contains (blue));
60   ASSERT_EQ (3, s.elements ());
61 
62   /* Test removal.  */
63   s.remove (red);
64   ASSERT_EQ (false, s.contains (red));
65   ASSERT_EQ (true, s.contains (green));
66   ASSERT_EQ (true, s.contains (blue));
67   ASSERT_EQ (2, s.elements ());
68 
69   s.remove (red);
70   ASSERT_EQ (false, s.contains (red));
71   ASSERT_EQ (true, s.contains (green));
72   ASSERT_EQ (true, s.contains (blue));
73   ASSERT_EQ (2, s.elements ());
74 
75   int seen = 0;
76   for (hash_set<const char *>::iterator it = s.begin (); it != s.end (); ++it)
77     {
78       int n = *it == green;
79       if (n == 0)
80 	ASSERT_EQ (*it, blue);
81       ASSERT_EQ (seen & (1 << n), 0);
82       seen |= 1 << n;
83     }
84   ASSERT_EQ (seen, 3);
85 
86   hash_set <const char *, true> t;
87   ASSERT_EQ (0, t.elements ());
88 
89   ASSERT_EQ (false, t.contains (red));
90 
91   for (hash_set<const char *, true>::iterator it = t.begin ();
92        it != t.end (); ++it)
93     ASSERT_EQ (true, false);
94 
95   /* Populate the hash_set.  */
96   ASSERT_EQ (false, t.add (red));
97   ASSERT_EQ (false, t.add (green));
98   ASSERT_EQ (false, t.add (blue));
99   ASSERT_EQ (true, t.add (green));
100 
101   /* Verify that the values are now within the set.  */
102   ASSERT_EQ (true, t.contains (red));
103   ASSERT_EQ (true, t.contains (green));
104   ASSERT_EQ (true, t.contains (blue));
105   ASSERT_EQ (3, t.elements ());
106 
107   seen = 0;
108   for (hash_set<const char *, true>::iterator it = t.begin ();
109        it != t.end (); ++it)
110     {
111       int n = 2;
112       if (*it == green)
113 	n = 0;
114       else if (*it == blue)
115 	n = 1;
116       else
117 	ASSERT_EQ (*it, red);
118       ASSERT_EQ (seen & (1 << n), 0);
119       seen |= 1 << n;
120     }
121   ASSERT_EQ (seen, 7);
122 
123   /* Test removal.  */
124   t.remove (red);
125   ASSERT_EQ (false, t.contains (red));
126   ASSERT_EQ (true, t.contains (green));
127   ASSERT_EQ (true, t.contains (blue));
128   ASSERT_EQ (2, t.elements ());
129 
130   t.remove (red);
131   ASSERT_EQ (false, t.contains (red));
132   ASSERT_EQ (true, t.contains (green));
133   ASSERT_EQ (true, t.contains (blue));
134   ASSERT_EQ (2, t.elements ());
135 }
136 
137 /* Run all of the selftests within this file.  */
138 
139 void
140 hash_set_tests_c_tests ()
141 {
142   test_set_of_strings ();
143 }
144 
145 } // namespace selftest
146 
147 #endif /* #if CHECKING_P */
148