xref: /aosp_15_r20/external/harfbuzz_ng/src/test-map.cc (revision 2d1272b857b1f7575e6e246373e1cb218663db8a)
1*2d1272b8SAndroid Build Coastguard Worker /*
2*2d1272b8SAndroid Build Coastguard Worker  * Copyright © 2021  Behdad Esfahbod
3*2d1272b8SAndroid Build Coastguard Worker  *
4*2d1272b8SAndroid Build Coastguard Worker  *  This is part of HarfBuzz, a text shaping library.
5*2d1272b8SAndroid Build Coastguard Worker  *
6*2d1272b8SAndroid Build Coastguard Worker  * Permission is hereby granted, without written agreement and without
7*2d1272b8SAndroid Build Coastguard Worker  * license or royalty fees, to use, copy, modify, and distribute this
8*2d1272b8SAndroid Build Coastguard Worker  * software and its documentation for any purpose, provided that the
9*2d1272b8SAndroid Build Coastguard Worker  * above copyright notice and the following two paragraphs appear in
10*2d1272b8SAndroid Build Coastguard Worker  * all copies of this software.
11*2d1272b8SAndroid Build Coastguard Worker  *
12*2d1272b8SAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
13*2d1272b8SAndroid Build Coastguard Worker  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
14*2d1272b8SAndroid Build Coastguard Worker  * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
15*2d1272b8SAndroid Build Coastguard Worker  * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
16*2d1272b8SAndroid Build Coastguard Worker  * DAMAGE.
17*2d1272b8SAndroid Build Coastguard Worker  *
18*2d1272b8SAndroid Build Coastguard Worker  * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
19*2d1272b8SAndroid Build Coastguard Worker  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20*2d1272b8SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
21*2d1272b8SAndroid Build Coastguard Worker  * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
22*2d1272b8SAndroid Build Coastguard Worker  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
23*2d1272b8SAndroid Build Coastguard Worker  */
24*2d1272b8SAndroid Build Coastguard Worker 
25*2d1272b8SAndroid Build Coastguard Worker #include "hb.hh"
26*2d1272b8SAndroid Build Coastguard Worker #include "hb-map.hh"
27*2d1272b8SAndroid Build Coastguard Worker #include "hb-set.hh"
28*2d1272b8SAndroid Build Coastguard Worker #include <string>
29*2d1272b8SAndroid Build Coastguard Worker 
30*2d1272b8SAndroid Build Coastguard Worker int
main(int argc,char ** argv)31*2d1272b8SAndroid Build Coastguard Worker main (int argc, char **argv)
32*2d1272b8SAndroid Build Coastguard Worker {
33*2d1272b8SAndroid Build Coastguard Worker 
34*2d1272b8SAndroid Build Coastguard Worker   /* Test copy constructor. */
35*2d1272b8SAndroid Build Coastguard Worker   {
36*2d1272b8SAndroid Build Coastguard Worker     hb_map_t v1;
37*2d1272b8SAndroid Build Coastguard Worker     v1.set (1, 2);
38*2d1272b8SAndroid Build Coastguard Worker     hb_map_t v2 {v1};
39*2d1272b8SAndroid Build Coastguard Worker     assert (v1.get_population () == 1);
40*2d1272b8SAndroid Build Coastguard Worker     assert (v2.get_population () == 1);
41*2d1272b8SAndroid Build Coastguard Worker     assert (v1[1] == 2);
42*2d1272b8SAndroid Build Coastguard Worker     assert (v2[1] == 2);
43*2d1272b8SAndroid Build Coastguard Worker   }
44*2d1272b8SAndroid Build Coastguard Worker 
45*2d1272b8SAndroid Build Coastguard Worker   /* Test copy assignment. */
46*2d1272b8SAndroid Build Coastguard Worker   {
47*2d1272b8SAndroid Build Coastguard Worker     hb_map_t v1;
48*2d1272b8SAndroid Build Coastguard Worker     v1.set (1, 2);
49*2d1272b8SAndroid Build Coastguard Worker     hb_map_t v2 = v1;
50*2d1272b8SAndroid Build Coastguard Worker     assert (v1.get_population () == 1);
51*2d1272b8SAndroid Build Coastguard Worker     assert (v2.get_population () == 1);
52*2d1272b8SAndroid Build Coastguard Worker     assert (v1[1] == 2);
53*2d1272b8SAndroid Build Coastguard Worker     assert (v2[1] == 2);
54*2d1272b8SAndroid Build Coastguard Worker   }
55*2d1272b8SAndroid Build Coastguard Worker 
56*2d1272b8SAndroid Build Coastguard Worker   /* Test move constructor. */
57*2d1272b8SAndroid Build Coastguard Worker   {
58*2d1272b8SAndroid Build Coastguard Worker     hb_map_t s {};
59*2d1272b8SAndroid Build Coastguard Worker     s.set (1, 2);
60*2d1272b8SAndroid Build Coastguard Worker     hb_map_t v (std::move (s));
61*2d1272b8SAndroid Build Coastguard Worker     assert (s.get_population () == 0);
62*2d1272b8SAndroid Build Coastguard Worker     assert (v.get_population () == 1);
63*2d1272b8SAndroid Build Coastguard Worker   }
64*2d1272b8SAndroid Build Coastguard Worker 
65*2d1272b8SAndroid Build Coastguard Worker   /* Test move assignment. */
66*2d1272b8SAndroid Build Coastguard Worker   {
67*2d1272b8SAndroid Build Coastguard Worker     hb_map_t s {};
68*2d1272b8SAndroid Build Coastguard Worker     s.set (1, 2);
69*2d1272b8SAndroid Build Coastguard Worker     hb_map_t v;
70*2d1272b8SAndroid Build Coastguard Worker     v = std::move (s);
71*2d1272b8SAndroid Build Coastguard Worker     assert (s.get_population () == 0);
72*2d1272b8SAndroid Build Coastguard Worker     assert (v.get_population () == 1);
73*2d1272b8SAndroid Build Coastguard Worker   }
74*2d1272b8SAndroid Build Coastguard Worker 
75*2d1272b8SAndroid Build Coastguard Worker   /* Test initializing from iterable. */
76*2d1272b8SAndroid Build Coastguard Worker   {
77*2d1272b8SAndroid Build Coastguard Worker     hb_map_t s;
78*2d1272b8SAndroid Build Coastguard Worker 
79*2d1272b8SAndroid Build Coastguard Worker     s.set (1, 2);
80*2d1272b8SAndroid Build Coastguard Worker     s.set (3, 4);
81*2d1272b8SAndroid Build Coastguard Worker 
82*2d1272b8SAndroid Build Coastguard Worker     hb_vector_t<hb_codepoint_pair_t> v (s);
83*2d1272b8SAndroid Build Coastguard Worker     hb_map_t v0 (v);
84*2d1272b8SAndroid Build Coastguard Worker     hb_map_t v1 (s);
85*2d1272b8SAndroid Build Coastguard Worker     hb_map_t v2 (std::move (s));
86*2d1272b8SAndroid Build Coastguard Worker 
87*2d1272b8SAndroid Build Coastguard Worker     assert (s.get_population () == 0);
88*2d1272b8SAndroid Build Coastguard Worker     assert (v0.get_population () == 2);
89*2d1272b8SAndroid Build Coastguard Worker     assert (v1.get_population () == 2);
90*2d1272b8SAndroid Build Coastguard Worker     assert (v2.get_population () == 2);
91*2d1272b8SAndroid Build Coastguard Worker   }
92*2d1272b8SAndroid Build Coastguard Worker 
93*2d1272b8SAndroid Build Coastguard Worker   /* Test call fini() twice. */
94*2d1272b8SAndroid Build Coastguard Worker   {
95*2d1272b8SAndroid Build Coastguard Worker     hb_map_t s;
96*2d1272b8SAndroid Build Coastguard Worker     for (int i = 0; i < 16; i++)
97*2d1272b8SAndroid Build Coastguard Worker       s.set(i, i+1);
98*2d1272b8SAndroid Build Coastguard Worker     s.fini();
99*2d1272b8SAndroid Build Coastguard Worker   }
100*2d1272b8SAndroid Build Coastguard Worker 
101*2d1272b8SAndroid Build Coastguard Worker   /* Test initializing from iterator. */
102*2d1272b8SAndroid Build Coastguard Worker   {
103*2d1272b8SAndroid Build Coastguard Worker     hb_map_t s;
104*2d1272b8SAndroid Build Coastguard Worker 
105*2d1272b8SAndroid Build Coastguard Worker     s.set (1, 2);
106*2d1272b8SAndroid Build Coastguard Worker     s.set (3, 4);
107*2d1272b8SAndroid Build Coastguard Worker 
108*2d1272b8SAndroid Build Coastguard Worker     hb_map_t v (hb_iter (s));
109*2d1272b8SAndroid Build Coastguard Worker 
110*2d1272b8SAndroid Build Coastguard Worker     assert (v.get_population () == 2);
111*2d1272b8SAndroid Build Coastguard Worker   }
112*2d1272b8SAndroid Build Coastguard Worker 
113*2d1272b8SAndroid Build Coastguard Worker   /* Test initializing from initializer list and swapping. */
114*2d1272b8SAndroid Build Coastguard Worker   {
115*2d1272b8SAndroid Build Coastguard Worker     using pair_t = hb_codepoint_pair_t;
116*2d1272b8SAndroid Build Coastguard Worker     hb_map_t v1 {pair_t{1,2}, pair_t{4,5}};
117*2d1272b8SAndroid Build Coastguard Worker     hb_map_t v2 {pair_t{3,4}};
118*2d1272b8SAndroid Build Coastguard Worker     hb_swap (v1, v2);
119*2d1272b8SAndroid Build Coastguard Worker     assert (v1.get_population () == 1);
120*2d1272b8SAndroid Build Coastguard Worker     assert (v2.get_population () == 2);
121*2d1272b8SAndroid Build Coastguard Worker   }
122*2d1272b8SAndroid Build Coastguard Worker 
123*2d1272b8SAndroid Build Coastguard Worker   /* Test class key / value types. */
124*2d1272b8SAndroid Build Coastguard Worker   {
125*2d1272b8SAndroid Build Coastguard Worker     hb_hashmap_t<hb_bytes_t, int> m1;
126*2d1272b8SAndroid Build Coastguard Worker     hb_hashmap_t<int, hb_bytes_t> m2;
127*2d1272b8SAndroid Build Coastguard Worker     hb_hashmap_t<hb_bytes_t, hb_bytes_t> m3;
128*2d1272b8SAndroid Build Coastguard Worker     assert (m1.get_population () == 0);
129*2d1272b8SAndroid Build Coastguard Worker     assert (m2.get_population () == 0);
130*2d1272b8SAndroid Build Coastguard Worker     assert (m3.get_population () == 0);
131*2d1272b8SAndroid Build Coastguard Worker   }
132*2d1272b8SAndroid Build Coastguard Worker 
133*2d1272b8SAndroid Build Coastguard Worker   {
134*2d1272b8SAndroid Build Coastguard Worker     hb_hashmap_t<int, int> m0;
135*2d1272b8SAndroid Build Coastguard Worker     hb_hashmap_t<std::string, int> m1;
136*2d1272b8SAndroid Build Coastguard Worker     hb_hashmap_t<int, std::string> m2;
137*2d1272b8SAndroid Build Coastguard Worker     hb_hashmap_t<std::string, std::string> m3;
138*2d1272b8SAndroid Build Coastguard Worker 
139*2d1272b8SAndroid Build Coastguard Worker     std::string s;
140*2d1272b8SAndroid Build Coastguard Worker     for (unsigned i = 1; i < 1000; i++)
141*2d1272b8SAndroid Build Coastguard Worker     {
142*2d1272b8SAndroid Build Coastguard Worker       s += "x";
143*2d1272b8SAndroid Build Coastguard Worker       m0.set (i, i);
144*2d1272b8SAndroid Build Coastguard Worker       m1.set (s, i);
145*2d1272b8SAndroid Build Coastguard Worker       m2.set (i, s);
146*2d1272b8SAndroid Build Coastguard Worker       m3.set (s, s);
147*2d1272b8SAndroid Build Coastguard Worker     }
148*2d1272b8SAndroid Build Coastguard Worker   }
149*2d1272b8SAndroid Build Coastguard Worker 
150*2d1272b8SAndroid Build Coastguard Worker   /* Test hashing maps. */
151*2d1272b8SAndroid Build Coastguard Worker   {
152*2d1272b8SAndroid Build Coastguard Worker     using pair = hb_codepoint_pair_t;
153*2d1272b8SAndroid Build Coastguard Worker 
154*2d1272b8SAndroid Build Coastguard Worker     hb_hashmap_t<hb_map_t, hb_map_t> m1;
155*2d1272b8SAndroid Build Coastguard Worker 
156*2d1272b8SAndroid Build Coastguard Worker     m1.set (hb_map_t (), hb_map_t {});
157*2d1272b8SAndroid Build Coastguard Worker     m1.set (hb_map_t (), hb_map_t {pair (1u, 2u)});
158*2d1272b8SAndroid Build Coastguard Worker     m1.set (hb_map_t {pair (1u, 2u)}, hb_map_t {pair (2u, 3u)});
159*2d1272b8SAndroid Build Coastguard Worker 
160*2d1272b8SAndroid Build Coastguard Worker     assert (m1.get (hb_map_t ()) == hb_map_t {pair (1u, 2u)});
161*2d1272b8SAndroid Build Coastguard Worker     assert (m1.get (hb_map_t {pair (1u, 2u)}) == hb_map_t {pair (2u, 3u)});
162*2d1272b8SAndroid Build Coastguard Worker   }
163*2d1272b8SAndroid Build Coastguard Worker 
164*2d1272b8SAndroid Build Coastguard Worker   /* Test hashing sets. */
165*2d1272b8SAndroid Build Coastguard Worker   {
166*2d1272b8SAndroid Build Coastguard Worker     hb_hashmap_t<hb_set_t, hb_set_t> m1;
167*2d1272b8SAndroid Build Coastguard Worker 
168*2d1272b8SAndroid Build Coastguard Worker     m1.set (hb_set_t (), hb_set_t ());
169*2d1272b8SAndroid Build Coastguard Worker     m1.set (hb_set_t (), hb_set_t {1});
170*2d1272b8SAndroid Build Coastguard Worker     m1.set (hb_set_t {1, 1000}, hb_set_t {2});
171*2d1272b8SAndroid Build Coastguard Worker 
172*2d1272b8SAndroid Build Coastguard Worker     assert (m1.get (hb_set_t ()) == hb_set_t {1});
173*2d1272b8SAndroid Build Coastguard Worker     assert (m1.get (hb_set_t {1000, 1}) == hb_set_t {2});
174*2d1272b8SAndroid Build Coastguard Worker   }
175*2d1272b8SAndroid Build Coastguard Worker 
176*2d1272b8SAndroid Build Coastguard Worker   /* Test hashing vectors. */
177*2d1272b8SAndroid Build Coastguard Worker   {
178*2d1272b8SAndroid Build Coastguard Worker     using vector_t = hb_vector_t<unsigned>;
179*2d1272b8SAndroid Build Coastguard Worker 
180*2d1272b8SAndroid Build Coastguard Worker     hb_hashmap_t<vector_t, vector_t> m1;
181*2d1272b8SAndroid Build Coastguard Worker 
182*2d1272b8SAndroid Build Coastguard Worker     m1.set (vector_t (), vector_t {1});
183*2d1272b8SAndroid Build Coastguard Worker     m1.set (vector_t {1}, vector_t {2});
184*2d1272b8SAndroid Build Coastguard Worker 
185*2d1272b8SAndroid Build Coastguard Worker     m1 << hb_pair_t<vector_t, vector_t> {vector_t {2}, vector_t ()};
186*2d1272b8SAndroid Build Coastguard Worker 
187*2d1272b8SAndroid Build Coastguard Worker     assert (m1.get (vector_t ()) == vector_t {1});
188*2d1272b8SAndroid Build Coastguard Worker     assert (m1.get (vector_t {1}) == vector_t {2});
189*2d1272b8SAndroid Build Coastguard Worker   }
190*2d1272b8SAndroid Build Coastguard Worker 
191*2d1272b8SAndroid Build Coastguard Worker   /* Test moving values */
192*2d1272b8SAndroid Build Coastguard Worker   {
193*2d1272b8SAndroid Build Coastguard Worker     using vector_t = hb_vector_t<unsigned>;
194*2d1272b8SAndroid Build Coastguard Worker 
195*2d1272b8SAndroid Build Coastguard Worker     hb_hashmap_t<vector_t, vector_t> m1;
196*2d1272b8SAndroid Build Coastguard Worker     vector_t v {3};
197*2d1272b8SAndroid Build Coastguard Worker     assert (v.length == 1);
198*2d1272b8SAndroid Build Coastguard Worker     m1 << hb_pair_t<vector_t, vector_t> {vector_t {3}, v};
199*2d1272b8SAndroid Build Coastguard Worker     assert (v.length == 1);
200*2d1272b8SAndroid Build Coastguard Worker     m1 << hb_pair_t<vector_t, vector_t&&> {vector_t {4}, std::move (v)};
201*2d1272b8SAndroid Build Coastguard Worker     assert (v.length == 0);
202*2d1272b8SAndroid Build Coastguard Worker     m1 << hb_pair_t<vector_t&&, vector_t> {vector_t {4}, vector_t {5}};
203*2d1272b8SAndroid Build Coastguard Worker     m1 << hb_pair_t<vector_t&&, vector_t&&> {vector_t {4}, vector_t {5}};
204*2d1272b8SAndroid Build Coastguard Worker 
205*2d1272b8SAndroid Build Coastguard Worker     hb_hashmap_t<vector_t, vector_t> m2;
206*2d1272b8SAndroid Build Coastguard Worker     vector_t v2 {3};
207*2d1272b8SAndroid Build Coastguard Worker     m2.set (vector_t {4}, v2);
208*2d1272b8SAndroid Build Coastguard Worker     assert (v2.length == 1);
209*2d1272b8SAndroid Build Coastguard Worker     m2.set (vector_t {5}, std::move (v2));
210*2d1272b8SAndroid Build Coastguard Worker     assert (v2.length == 0);
211*2d1272b8SAndroid Build Coastguard Worker   }
212*2d1272b8SAndroid Build Coastguard Worker 
213*2d1272b8SAndroid Build Coastguard Worker   /* Test hb::shared_ptr. */
214*2d1272b8SAndroid Build Coastguard Worker   {
215*2d1272b8SAndroid Build Coastguard Worker     hb_hashmap_t<hb::shared_ptr<hb_set_t>, hb::shared_ptr<hb_set_t>> m;
216*2d1272b8SAndroid Build Coastguard Worker 
217*2d1272b8SAndroid Build Coastguard Worker     m.set (hb::shared_ptr<hb_set_t> (hb_set_get_empty ()),
218*2d1272b8SAndroid Build Coastguard Worker 	   hb::shared_ptr<hb_set_t> (hb_set_get_empty ()));
219*2d1272b8SAndroid Build Coastguard Worker     m.get (hb::shared_ptr<hb_set_t> (hb_set_get_empty ()));
220*2d1272b8SAndroid Build Coastguard Worker     m.iter ();
221*2d1272b8SAndroid Build Coastguard Worker     m.keys ();
222*2d1272b8SAndroid Build Coastguard Worker     m.values ();
223*2d1272b8SAndroid Build Coastguard Worker     m.iter_ref ();
224*2d1272b8SAndroid Build Coastguard Worker     m.keys_ref ();
225*2d1272b8SAndroid Build Coastguard Worker     m.values_ref ();
226*2d1272b8SAndroid Build Coastguard Worker   }
227*2d1272b8SAndroid Build Coastguard Worker   /* Test hb::unique_ptr. */
228*2d1272b8SAndroid Build Coastguard Worker   {
229*2d1272b8SAndroid Build Coastguard Worker     hb_hashmap_t<hb::unique_ptr<hb_set_t>, hb::unique_ptr<hb_set_t>> m;
230*2d1272b8SAndroid Build Coastguard Worker 
231*2d1272b8SAndroid Build Coastguard Worker     m.set (hb::unique_ptr<hb_set_t> (hb_set_get_empty ()),
232*2d1272b8SAndroid Build Coastguard Worker            hb::unique_ptr<hb_set_t> (hb_set_get_empty ()));
233*2d1272b8SAndroid Build Coastguard Worker     m.get (hb::unique_ptr<hb_set_t> (hb_set_get_empty ()));
234*2d1272b8SAndroid Build Coastguard Worker     hb::unique_ptr<hb_set_t> *v;
235*2d1272b8SAndroid Build Coastguard Worker     m.has (hb::unique_ptr<hb_set_t> (hb_set_get_empty ()), &v);
236*2d1272b8SAndroid Build Coastguard Worker     m.iter_ref ();
237*2d1272b8SAndroid Build Coastguard Worker     m.keys_ref ();
238*2d1272b8SAndroid Build Coastguard Worker     m.values_ref ();
239*2d1272b8SAndroid Build Coastguard Worker   }
240*2d1272b8SAndroid Build Coastguard Worker   /* Test hashmap with complex shared_ptrs as keys. */
241*2d1272b8SAndroid Build Coastguard Worker   {
242*2d1272b8SAndroid Build Coastguard Worker     hb_hashmap_t<hb::shared_ptr<hb_map_t>, unsigned> m;
243*2d1272b8SAndroid Build Coastguard Worker 
244*2d1272b8SAndroid Build Coastguard Worker     hb_map_t *m1 = hb_map_create ();
245*2d1272b8SAndroid Build Coastguard Worker     hb_map_t *m2 = hb_map_create ();
246*2d1272b8SAndroid Build Coastguard Worker     m1->set (1,3);
247*2d1272b8SAndroid Build Coastguard Worker     m2->set (1,3);
248*2d1272b8SAndroid Build Coastguard Worker 
249*2d1272b8SAndroid Build Coastguard Worker     hb::shared_ptr<hb_map_t> p1 {m1};
250*2d1272b8SAndroid Build Coastguard Worker     hb::shared_ptr<hb_map_t> p2 {m2};
251*2d1272b8SAndroid Build Coastguard Worker     m.set (p1,1);
252*2d1272b8SAndroid Build Coastguard Worker 
253*2d1272b8SAndroid Build Coastguard Worker     assert (m.has (p2));
254*2d1272b8SAndroid Build Coastguard Worker 
255*2d1272b8SAndroid Build Coastguard Worker     m1->set (2,4);
256*2d1272b8SAndroid Build Coastguard Worker     assert (!m.has (p2));
257*2d1272b8SAndroid Build Coastguard Worker   }
258*2d1272b8SAndroid Build Coastguard Worker   /* Test value type with hb_bytes_t. */
259*2d1272b8SAndroid Build Coastguard Worker   {
260*2d1272b8SAndroid Build Coastguard Worker     hb_hashmap_t<int, hb_bytes_t> m;
261*2d1272b8SAndroid Build Coastguard Worker     char c_str[] = "Test";
262*2d1272b8SAndroid Build Coastguard Worker     hb_bytes_t bytes (c_str);
263*2d1272b8SAndroid Build Coastguard Worker 
264*2d1272b8SAndroid Build Coastguard Worker     m.set (1, bytes);
265*2d1272b8SAndroid Build Coastguard Worker     assert (m.has (1));
266*2d1272b8SAndroid Build Coastguard Worker     assert (m.get (1) == hb_bytes_t {"Test"});
267*2d1272b8SAndroid Build Coastguard Worker   }
268*2d1272b8SAndroid Build Coastguard Worker   /* Test operators. */
269*2d1272b8SAndroid Build Coastguard Worker   {
270*2d1272b8SAndroid Build Coastguard Worker     hb_map_t m1, m2, m3;
271*2d1272b8SAndroid Build Coastguard Worker     m1.set (1, 2);
272*2d1272b8SAndroid Build Coastguard Worker     m1.set (2, 4);
273*2d1272b8SAndroid Build Coastguard Worker     m2.set (1, 2);
274*2d1272b8SAndroid Build Coastguard Worker     m2.set (2, 4);
275*2d1272b8SAndroid Build Coastguard Worker     m3.set (1, 3);
276*2d1272b8SAndroid Build Coastguard Worker     m3.set (3, 5);
277*2d1272b8SAndroid Build Coastguard Worker 
278*2d1272b8SAndroid Build Coastguard Worker     assert (m1 == m2);
279*2d1272b8SAndroid Build Coastguard Worker     assert (m1 != m3);
280*2d1272b8SAndroid Build Coastguard Worker     assert (!(m2 == m3));
281*2d1272b8SAndroid Build Coastguard Worker 
282*2d1272b8SAndroid Build Coastguard Worker     m2 = m3;
283*2d1272b8SAndroid Build Coastguard Worker     assert (m2.has (1));
284*2d1272b8SAndroid Build Coastguard Worker     assert (!m2.has (2));
285*2d1272b8SAndroid Build Coastguard Worker     assert (m2.has (3));
286*2d1272b8SAndroid Build Coastguard Worker 
287*2d1272b8SAndroid Build Coastguard Worker     assert (m3.has (3));
288*2d1272b8SAndroid Build Coastguard Worker   }
289*2d1272b8SAndroid Build Coastguard Worker   /* Test reset. */
290*2d1272b8SAndroid Build Coastguard Worker   {
291*2d1272b8SAndroid Build Coastguard Worker     hb_hashmap_t<int, hb_set_t> m;
292*2d1272b8SAndroid Build Coastguard Worker     m.set (1, hb_set_t {1, 2, 3});
293*2d1272b8SAndroid Build Coastguard Worker     m.reset ();
294*2d1272b8SAndroid Build Coastguard Worker   }
295*2d1272b8SAndroid Build Coastguard Worker   /* Test iteration. */
296*2d1272b8SAndroid Build Coastguard Worker   {
297*2d1272b8SAndroid Build Coastguard Worker     hb_map_t m;
298*2d1272b8SAndroid Build Coastguard Worker     m.set (1, 1);
299*2d1272b8SAndroid Build Coastguard Worker     m.set (4, 3);
300*2d1272b8SAndroid Build Coastguard Worker     m.set (5, 5);
301*2d1272b8SAndroid Build Coastguard Worker     m.set (2, 1);
302*2d1272b8SAndroid Build Coastguard Worker     m.set (3, 2);
303*2d1272b8SAndroid Build Coastguard Worker     m.set (6, 8);
304*2d1272b8SAndroid Build Coastguard Worker 
305*2d1272b8SAndroid Build Coastguard Worker     hb_codepoint_t k;
306*2d1272b8SAndroid Build Coastguard Worker     hb_codepoint_t v;
307*2d1272b8SAndroid Build Coastguard Worker     unsigned pop = 0;
308*2d1272b8SAndroid Build Coastguard Worker     for (signed i = -1;
309*2d1272b8SAndroid Build Coastguard Worker 	 m.next (&i, &k, &v);)
310*2d1272b8SAndroid Build Coastguard Worker     {
311*2d1272b8SAndroid Build Coastguard Worker       pop++;
312*2d1272b8SAndroid Build Coastguard Worker            if (k == 1) assert (v == 1);
313*2d1272b8SAndroid Build Coastguard Worker       else if (k == 2) assert (v == 1);
314*2d1272b8SAndroid Build Coastguard Worker       else if (k == 3) assert (v == 2);
315*2d1272b8SAndroid Build Coastguard Worker       else if (k == 4) assert (v == 3);
316*2d1272b8SAndroid Build Coastguard Worker       else if (k == 5) assert (v == 5);
317*2d1272b8SAndroid Build Coastguard Worker       else if (k == 6) assert (v == 8);
318*2d1272b8SAndroid Build Coastguard Worker       else assert (false);
319*2d1272b8SAndroid Build Coastguard Worker     }
320*2d1272b8SAndroid Build Coastguard Worker     assert (pop == m.get_population ());
321*2d1272b8SAndroid Build Coastguard Worker   }
322*2d1272b8SAndroid Build Coastguard Worker   /* Test update */
323*2d1272b8SAndroid Build Coastguard Worker   {
324*2d1272b8SAndroid Build Coastguard Worker     hb_map_t m1, m2;
325*2d1272b8SAndroid Build Coastguard Worker     m1.set (1, 2);
326*2d1272b8SAndroid Build Coastguard Worker     m1.set (2, 4);
327*2d1272b8SAndroid Build Coastguard Worker     m2.set (1, 3);
328*2d1272b8SAndroid Build Coastguard Worker 
329*2d1272b8SAndroid Build Coastguard Worker     m1.update (m2);
330*2d1272b8SAndroid Build Coastguard Worker     assert (m1.get_population () == 2);
331*2d1272b8SAndroid Build Coastguard Worker     assert (m1[1] == 3);
332*2d1272b8SAndroid Build Coastguard Worker     assert (m1[2] == 4);
333*2d1272b8SAndroid Build Coastguard Worker   }
334*2d1272b8SAndroid Build Coastguard Worker   /* Test keys / values */
335*2d1272b8SAndroid Build Coastguard Worker   {
336*2d1272b8SAndroid Build Coastguard Worker     hb_map_t m;
337*2d1272b8SAndroid Build Coastguard Worker     m.set (1, 1);
338*2d1272b8SAndroid Build Coastguard Worker     m.set (4, 3);
339*2d1272b8SAndroid Build Coastguard Worker     m.set (5, 5);
340*2d1272b8SAndroid Build Coastguard Worker     m.set (2, 1);
341*2d1272b8SAndroid Build Coastguard Worker     m.set (3, 2);
342*2d1272b8SAndroid Build Coastguard Worker     m.set (6, 8);
343*2d1272b8SAndroid Build Coastguard Worker 
344*2d1272b8SAndroid Build Coastguard Worker     hb_set_t keys;
345*2d1272b8SAndroid Build Coastguard Worker     hb_set_t values;
346*2d1272b8SAndroid Build Coastguard Worker 
347*2d1272b8SAndroid Build Coastguard Worker     hb_copy (m.keys (), keys);
348*2d1272b8SAndroid Build Coastguard Worker     hb_copy (m.values (), values);
349*2d1272b8SAndroid Build Coastguard Worker 
350*2d1272b8SAndroid Build Coastguard Worker     assert (keys.is_equal (hb_set_t ({1, 2, 3, 4, 5, 6})));
351*2d1272b8SAndroid Build Coastguard Worker     assert (values.is_equal (hb_set_t ({1, 1, 2, 3, 5, 8})));
352*2d1272b8SAndroid Build Coastguard Worker 
353*2d1272b8SAndroid Build Coastguard Worker     assert (keys.is_equal (hb_set_t (m.keys ())));
354*2d1272b8SAndroid Build Coastguard Worker     assert (values.is_equal (hb_set_t (m.values ())));
355*2d1272b8SAndroid Build Coastguard Worker   }
356*2d1272b8SAndroid Build Coastguard Worker 
357*2d1272b8SAndroid Build Coastguard Worker   return 0;
358*2d1272b8SAndroid Build Coastguard Worker }
359