xref: /aosp_15_r20/external/harfbuzz_ng/src/graph/test-classdef-graph.cc (revision 2d1272b857b1f7575e6e246373e1cb218663db8a)
1*2d1272b8SAndroid Build Coastguard Worker /*
2*2d1272b8SAndroid Build Coastguard Worker  * Copyright © 2022  Google, Inc.
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  * Google Author(s): Garret Rieger
25*2d1272b8SAndroid Build Coastguard Worker  */
26*2d1272b8SAndroid Build Coastguard Worker 
27*2d1272b8SAndroid Build Coastguard Worker #include "gsubgpos-context.hh"
28*2d1272b8SAndroid Build Coastguard Worker #include "classdef-graph.hh"
29*2d1272b8SAndroid Build Coastguard Worker #include "hb-iter.hh"
30*2d1272b8SAndroid Build Coastguard Worker #include "hb-serialize.hh"
31*2d1272b8SAndroid Build Coastguard Worker 
32*2d1272b8SAndroid Build Coastguard Worker typedef hb_codepoint_pair_t gid_and_class_t;
33*2d1272b8SAndroid Build Coastguard Worker typedef hb_vector_t<gid_and_class_t> gid_and_class_list_t;
34*2d1272b8SAndroid Build Coastguard Worker 
35*2d1272b8SAndroid Build Coastguard Worker template<typename It>
actual_class_def_size(It glyph_and_class)36*2d1272b8SAndroid Build Coastguard Worker static unsigned actual_class_def_size(It glyph_and_class) {
37*2d1272b8SAndroid Build Coastguard Worker   char buffer[100];
38*2d1272b8SAndroid Build Coastguard Worker   hb_serialize_context_t serializer(buffer, 100);
39*2d1272b8SAndroid Build Coastguard Worker   OT::ClassDef_serialize (&serializer, glyph_and_class);
40*2d1272b8SAndroid Build Coastguard Worker   serializer.end_serialize ();
41*2d1272b8SAndroid Build Coastguard Worker   assert(!serializer.in_error());
42*2d1272b8SAndroid Build Coastguard Worker 
43*2d1272b8SAndroid Build Coastguard Worker   hb_blob_t* blob = serializer.copy_blob();
44*2d1272b8SAndroid Build Coastguard Worker   unsigned size = hb_blob_get_length(blob);
45*2d1272b8SAndroid Build Coastguard Worker   hb_blob_destroy(blob);
46*2d1272b8SAndroid Build Coastguard Worker   return size;
47*2d1272b8SAndroid Build Coastguard Worker }
48*2d1272b8SAndroid Build Coastguard Worker 
actual_class_def_size(gid_and_class_list_t consecutive_map,hb_vector_t<unsigned> classes)49*2d1272b8SAndroid Build Coastguard Worker static unsigned actual_class_def_size(gid_and_class_list_t consecutive_map, hb_vector_t<unsigned> classes) {
50*2d1272b8SAndroid Build Coastguard Worker   auto filtered_it =
51*2d1272b8SAndroid Build Coastguard Worker     + consecutive_map.as_sorted_array().iter()
52*2d1272b8SAndroid Build Coastguard Worker     | hb_filter([&] (unsigned c) {
53*2d1272b8SAndroid Build Coastguard Worker       for (unsigned klass : classes) {
54*2d1272b8SAndroid Build Coastguard Worker         if (c == klass) {
55*2d1272b8SAndroid Build Coastguard Worker           return true;
56*2d1272b8SAndroid Build Coastguard Worker         }
57*2d1272b8SAndroid Build Coastguard Worker       }
58*2d1272b8SAndroid Build Coastguard Worker       return false;
59*2d1272b8SAndroid Build Coastguard Worker     }, hb_second);
60*2d1272b8SAndroid Build Coastguard Worker   return actual_class_def_size(+ filtered_it);
61*2d1272b8SAndroid Build Coastguard Worker }
62*2d1272b8SAndroid Build Coastguard Worker 
63*2d1272b8SAndroid Build Coastguard Worker template<typename It>
actual_coverage_size(It glyphs)64*2d1272b8SAndroid Build Coastguard Worker static unsigned actual_coverage_size(It glyphs) {
65*2d1272b8SAndroid Build Coastguard Worker   char buffer[100];
66*2d1272b8SAndroid Build Coastguard Worker   hb_serialize_context_t serializer(buffer, 100);
67*2d1272b8SAndroid Build Coastguard Worker   OT::Layout::Common::Coverage_serialize (&serializer, glyphs);
68*2d1272b8SAndroid Build Coastguard Worker   serializer.end_serialize ();
69*2d1272b8SAndroid Build Coastguard Worker   assert(!serializer.in_error());
70*2d1272b8SAndroid Build Coastguard Worker 
71*2d1272b8SAndroid Build Coastguard Worker   hb_blob_t* blob = serializer.copy_blob();
72*2d1272b8SAndroid Build Coastguard Worker   unsigned size = hb_blob_get_length(blob);
73*2d1272b8SAndroid Build Coastguard Worker   hb_blob_destroy(blob);
74*2d1272b8SAndroid Build Coastguard Worker   return size;
75*2d1272b8SAndroid Build Coastguard Worker }
76*2d1272b8SAndroid Build Coastguard Worker 
actual_coverage_size(gid_and_class_list_t consecutive_map,hb_vector_t<unsigned> classes)77*2d1272b8SAndroid Build Coastguard Worker static unsigned actual_coverage_size(gid_and_class_list_t consecutive_map, hb_vector_t<unsigned> classes) {
78*2d1272b8SAndroid Build Coastguard Worker   auto filtered_it =
79*2d1272b8SAndroid Build Coastguard Worker     + consecutive_map.as_sorted_array().iter()
80*2d1272b8SAndroid Build Coastguard Worker     | hb_filter([&] (unsigned c) {
81*2d1272b8SAndroid Build Coastguard Worker       for (unsigned klass : classes) {
82*2d1272b8SAndroid Build Coastguard Worker         if (c == klass) {
83*2d1272b8SAndroid Build Coastguard Worker           return true;
84*2d1272b8SAndroid Build Coastguard Worker         }
85*2d1272b8SAndroid Build Coastguard Worker       }
86*2d1272b8SAndroid Build Coastguard Worker       return false;
87*2d1272b8SAndroid Build Coastguard Worker     }, hb_second);
88*2d1272b8SAndroid Build Coastguard Worker   return actual_coverage_size(+ filtered_it | hb_map_retains_sorting(hb_first));
89*2d1272b8SAndroid Build Coastguard Worker }
90*2d1272b8SAndroid Build Coastguard Worker 
check_coverage_size(graph::class_def_size_estimator_t & estimator,const gid_and_class_list_t & map,hb_vector_t<unsigned> klasses)91*2d1272b8SAndroid Build Coastguard Worker static bool check_coverage_size(graph::class_def_size_estimator_t& estimator,
92*2d1272b8SAndroid Build Coastguard Worker                                 const gid_and_class_list_t& map,
93*2d1272b8SAndroid Build Coastguard Worker                                 hb_vector_t<unsigned> klasses)
94*2d1272b8SAndroid Build Coastguard Worker {
95*2d1272b8SAndroid Build Coastguard Worker   unsigned result = estimator.coverage_size();
96*2d1272b8SAndroid Build Coastguard Worker   unsigned expected = actual_coverage_size(map, klasses);
97*2d1272b8SAndroid Build Coastguard Worker   if (result != expected) {
98*2d1272b8SAndroid Build Coastguard Worker     printf ("FAIL: estimated coverage expected size %u but was %u\n", expected, result);
99*2d1272b8SAndroid Build Coastguard Worker     return false;
100*2d1272b8SAndroid Build Coastguard Worker   }
101*2d1272b8SAndroid Build Coastguard Worker   return true;
102*2d1272b8SAndroid Build Coastguard Worker }
103*2d1272b8SAndroid Build Coastguard Worker 
check_add_class_def_size(graph::class_def_size_estimator_t & estimator,const gid_and_class_list_t & map,unsigned klass,hb_vector_t<unsigned> klasses)104*2d1272b8SAndroid Build Coastguard Worker static bool check_add_class_def_size(graph::class_def_size_estimator_t& estimator,
105*2d1272b8SAndroid Build Coastguard Worker                                      const gid_and_class_list_t& map,
106*2d1272b8SAndroid Build Coastguard Worker                                      unsigned klass, hb_vector_t<unsigned> klasses)
107*2d1272b8SAndroid Build Coastguard Worker {
108*2d1272b8SAndroid Build Coastguard Worker   unsigned result = estimator.add_class_def_size(klass);
109*2d1272b8SAndroid Build Coastguard Worker   unsigned expected = actual_class_def_size(map, klasses);
110*2d1272b8SAndroid Build Coastguard Worker   if (result != expected) {
111*2d1272b8SAndroid Build Coastguard Worker     printf ("FAIL: estimated class def expected size %u but was %u\n", expected, result);
112*2d1272b8SAndroid Build Coastguard Worker     return false;
113*2d1272b8SAndroid Build Coastguard Worker   }
114*2d1272b8SAndroid Build Coastguard Worker 
115*2d1272b8SAndroid Build Coastguard Worker   return check_coverage_size(estimator, map, klasses);
116*2d1272b8SAndroid Build Coastguard Worker }
117*2d1272b8SAndroid Build Coastguard Worker 
check_add_class_def_size(const gid_and_class_list_t & list,unsigned klass)118*2d1272b8SAndroid Build Coastguard Worker static bool check_add_class_def_size (const gid_and_class_list_t& list, unsigned klass)
119*2d1272b8SAndroid Build Coastguard Worker {
120*2d1272b8SAndroid Build Coastguard Worker   graph::class_def_size_estimator_t estimator (list.iter ());
121*2d1272b8SAndroid Build Coastguard Worker 
122*2d1272b8SAndroid Build Coastguard Worker   unsigned result = estimator.add_class_def_size (klass);
123*2d1272b8SAndroid Build Coastguard Worker   auto filtered_it =
124*2d1272b8SAndroid Build Coastguard Worker     + list.as_sorted_array().iter()
125*2d1272b8SAndroid Build Coastguard Worker     | hb_filter([&] (unsigned c) {
126*2d1272b8SAndroid Build Coastguard Worker       return c == klass;
127*2d1272b8SAndroid Build Coastguard Worker     }, hb_second);
128*2d1272b8SAndroid Build Coastguard Worker 
129*2d1272b8SAndroid Build Coastguard Worker   unsigned expected = actual_class_def_size(filtered_it);
130*2d1272b8SAndroid Build Coastguard Worker   if (result != expected)
131*2d1272b8SAndroid Build Coastguard Worker   {
132*2d1272b8SAndroid Build Coastguard Worker     printf ("FAIL: class def expected size %u but was %u\n", expected, result);
133*2d1272b8SAndroid Build Coastguard Worker     return false;
134*2d1272b8SAndroid Build Coastguard Worker   }
135*2d1272b8SAndroid Build Coastguard Worker 
136*2d1272b8SAndroid Build Coastguard Worker   auto cov_it = + filtered_it | hb_map_retains_sorting(hb_first);
137*2d1272b8SAndroid Build Coastguard Worker   result = estimator.coverage_size ();
138*2d1272b8SAndroid Build Coastguard Worker   expected = actual_coverage_size(cov_it);
139*2d1272b8SAndroid Build Coastguard Worker   if (result != expected)
140*2d1272b8SAndroid Build Coastguard Worker   {
141*2d1272b8SAndroid Build Coastguard Worker     printf ("FAIL: coverage expected size %u but was %u\n", expected, result);
142*2d1272b8SAndroid Build Coastguard Worker     return false;
143*2d1272b8SAndroid Build Coastguard Worker   }
144*2d1272b8SAndroid Build Coastguard Worker 
145*2d1272b8SAndroid Build Coastguard Worker   return true;
146*2d1272b8SAndroid Build Coastguard Worker }
147*2d1272b8SAndroid Build Coastguard Worker 
test_class_and_coverage_size_estimates()148*2d1272b8SAndroid Build Coastguard Worker static void test_class_and_coverage_size_estimates ()
149*2d1272b8SAndroid Build Coastguard Worker {
150*2d1272b8SAndroid Build Coastguard Worker   gid_and_class_list_t empty = {
151*2d1272b8SAndroid Build Coastguard Worker   };
152*2d1272b8SAndroid Build Coastguard Worker   assert (check_add_class_def_size (empty, 0));
153*2d1272b8SAndroid Build Coastguard Worker   assert (check_add_class_def_size (empty, 1));
154*2d1272b8SAndroid Build Coastguard Worker 
155*2d1272b8SAndroid Build Coastguard Worker   gid_and_class_list_t class_zero = {
156*2d1272b8SAndroid Build Coastguard Worker     {5, 0},
157*2d1272b8SAndroid Build Coastguard Worker   };
158*2d1272b8SAndroid Build Coastguard Worker   assert (check_add_class_def_size (class_zero, 0));
159*2d1272b8SAndroid Build Coastguard Worker 
160*2d1272b8SAndroid Build Coastguard Worker   gid_and_class_list_t consecutive = {
161*2d1272b8SAndroid Build Coastguard Worker     {4, 0},
162*2d1272b8SAndroid Build Coastguard Worker     {5, 0},
163*2d1272b8SAndroid Build Coastguard Worker 
164*2d1272b8SAndroid Build Coastguard Worker     {6, 1},
165*2d1272b8SAndroid Build Coastguard Worker     {7, 1},
166*2d1272b8SAndroid Build Coastguard Worker 
167*2d1272b8SAndroid Build Coastguard Worker     {8, 2},
168*2d1272b8SAndroid Build Coastguard Worker     {9, 2},
169*2d1272b8SAndroid Build Coastguard Worker     {10, 2},
170*2d1272b8SAndroid Build Coastguard Worker     {11, 2},
171*2d1272b8SAndroid Build Coastguard Worker   };
172*2d1272b8SAndroid Build Coastguard Worker   assert (check_add_class_def_size (consecutive, 0));
173*2d1272b8SAndroid Build Coastguard Worker   assert (check_add_class_def_size (consecutive, 1));
174*2d1272b8SAndroid Build Coastguard Worker   assert (check_add_class_def_size (consecutive, 2));
175*2d1272b8SAndroid Build Coastguard Worker 
176*2d1272b8SAndroid Build Coastguard Worker   gid_and_class_list_t non_consecutive = {
177*2d1272b8SAndroid Build Coastguard Worker     {4, 0},
178*2d1272b8SAndroid Build Coastguard Worker     {6, 0},
179*2d1272b8SAndroid Build Coastguard Worker 
180*2d1272b8SAndroid Build Coastguard Worker     {8, 1},
181*2d1272b8SAndroid Build Coastguard Worker     {10, 1},
182*2d1272b8SAndroid Build Coastguard Worker 
183*2d1272b8SAndroid Build Coastguard Worker     {9, 2},
184*2d1272b8SAndroid Build Coastguard Worker     {10, 2},
185*2d1272b8SAndroid Build Coastguard Worker     {11, 2},
186*2d1272b8SAndroid Build Coastguard Worker     {13, 2},
187*2d1272b8SAndroid Build Coastguard Worker   };
188*2d1272b8SAndroid Build Coastguard Worker   assert (check_add_class_def_size (non_consecutive, 0));
189*2d1272b8SAndroid Build Coastguard Worker   assert (check_add_class_def_size (non_consecutive, 1));
190*2d1272b8SAndroid Build Coastguard Worker   assert (check_add_class_def_size (non_consecutive, 2));
191*2d1272b8SAndroid Build Coastguard Worker 
192*2d1272b8SAndroid Build Coastguard Worker   gid_and_class_list_t multiple_ranges = {
193*2d1272b8SAndroid Build Coastguard Worker     {4, 0},
194*2d1272b8SAndroid Build Coastguard Worker     {5, 0},
195*2d1272b8SAndroid Build Coastguard Worker 
196*2d1272b8SAndroid Build Coastguard Worker     {6, 1},
197*2d1272b8SAndroid Build Coastguard Worker     {7, 1},
198*2d1272b8SAndroid Build Coastguard Worker 
199*2d1272b8SAndroid Build Coastguard Worker     {9, 1},
200*2d1272b8SAndroid Build Coastguard Worker 
201*2d1272b8SAndroid Build Coastguard Worker     {11, 1},
202*2d1272b8SAndroid Build Coastguard Worker     {12, 1},
203*2d1272b8SAndroid Build Coastguard Worker     {13, 1},
204*2d1272b8SAndroid Build Coastguard Worker   };
205*2d1272b8SAndroid Build Coastguard Worker   assert (check_add_class_def_size (multiple_ranges, 0));
206*2d1272b8SAndroid Build Coastguard Worker   assert (check_add_class_def_size (multiple_ranges, 1));
207*2d1272b8SAndroid Build Coastguard Worker }
208*2d1272b8SAndroid Build Coastguard Worker 
test_running_class_and_coverage_size_estimates()209*2d1272b8SAndroid Build Coastguard Worker static void test_running_class_and_coverage_size_estimates () {
210*2d1272b8SAndroid Build Coastguard Worker   // #### With consecutive gids: switches formats ###
211*2d1272b8SAndroid Build Coastguard Worker   gid_and_class_list_t consecutive_map = {
212*2d1272b8SAndroid Build Coastguard Worker     // range 1-4 (f1: 8 bytes), (f2: 6 bytes)
213*2d1272b8SAndroid Build Coastguard Worker     {1, 1},
214*2d1272b8SAndroid Build Coastguard Worker     {2, 1},
215*2d1272b8SAndroid Build Coastguard Worker     {3, 1},
216*2d1272b8SAndroid Build Coastguard Worker     {4, 1},
217*2d1272b8SAndroid Build Coastguard Worker 
218*2d1272b8SAndroid Build Coastguard Worker     // (f1: 2 bytes), (f2: 6 bytes)
219*2d1272b8SAndroid Build Coastguard Worker     {5, 2},
220*2d1272b8SAndroid Build Coastguard Worker 
221*2d1272b8SAndroid Build Coastguard Worker     // (f1: 14 bytes), (f2: 6 bytes)
222*2d1272b8SAndroid Build Coastguard Worker     {6, 3},
223*2d1272b8SAndroid Build Coastguard Worker     {7, 3},
224*2d1272b8SAndroid Build Coastguard Worker     {8, 3},
225*2d1272b8SAndroid Build Coastguard Worker     {9, 3},
226*2d1272b8SAndroid Build Coastguard Worker     {10, 3},
227*2d1272b8SAndroid Build Coastguard Worker     {11, 3},
228*2d1272b8SAndroid Build Coastguard Worker     {12, 3},
229*2d1272b8SAndroid Build Coastguard Worker   };
230*2d1272b8SAndroid Build Coastguard Worker 
231*2d1272b8SAndroid Build Coastguard Worker   graph::class_def_size_estimator_t estimator1(consecutive_map.iter());
232*2d1272b8SAndroid Build Coastguard Worker   assert(check_add_class_def_size(estimator1, consecutive_map, 1, {1}));
233*2d1272b8SAndroid Build Coastguard Worker   assert(check_add_class_def_size(estimator1, consecutive_map, 2, {1, 2}));
234*2d1272b8SAndroid Build Coastguard Worker   assert(check_add_class_def_size(estimator1, consecutive_map, 2, {1, 2})); // check that adding the same class again works
235*2d1272b8SAndroid Build Coastguard Worker   assert(check_add_class_def_size(estimator1, consecutive_map, 3, {1, 2, 3}));
236*2d1272b8SAndroid Build Coastguard Worker 
237*2d1272b8SAndroid Build Coastguard Worker   estimator1.reset();
238*2d1272b8SAndroid Build Coastguard Worker   assert(check_add_class_def_size(estimator1, consecutive_map, 2, {2}));
239*2d1272b8SAndroid Build Coastguard Worker   assert(check_add_class_def_size(estimator1, consecutive_map, 3, {2, 3}));
240*2d1272b8SAndroid Build Coastguard Worker 
241*2d1272b8SAndroid Build Coastguard Worker   // #### With non-consecutive gids: always uses format 2 ###
242*2d1272b8SAndroid Build Coastguard Worker   gid_and_class_list_t non_consecutive_map = {
243*2d1272b8SAndroid Build Coastguard Worker     // range 1-4 (f1: 8 bytes), (f2: 6 bytes)
244*2d1272b8SAndroid Build Coastguard Worker     {1, 1},
245*2d1272b8SAndroid Build Coastguard Worker     {2, 1},
246*2d1272b8SAndroid Build Coastguard Worker     {3, 1},
247*2d1272b8SAndroid Build Coastguard Worker     {4, 1},
248*2d1272b8SAndroid Build Coastguard Worker 
249*2d1272b8SAndroid Build Coastguard Worker     // (f1: 2 bytes), (f2: 12 bytes)
250*2d1272b8SAndroid Build Coastguard Worker     {6, 2},
251*2d1272b8SAndroid Build Coastguard Worker     {8, 2},
252*2d1272b8SAndroid Build Coastguard Worker 
253*2d1272b8SAndroid Build Coastguard Worker     // (f1: 14 bytes), (f2: 6 bytes)
254*2d1272b8SAndroid Build Coastguard Worker     {9, 3},
255*2d1272b8SAndroid Build Coastguard Worker     {10, 3},
256*2d1272b8SAndroid Build Coastguard Worker     {11, 3},
257*2d1272b8SAndroid Build Coastguard Worker     {12, 3},
258*2d1272b8SAndroid Build Coastguard Worker     {13, 3},
259*2d1272b8SAndroid Build Coastguard Worker     {14, 3},
260*2d1272b8SAndroid Build Coastguard Worker     {15, 3},
261*2d1272b8SAndroid Build Coastguard Worker   };
262*2d1272b8SAndroid Build Coastguard Worker 
263*2d1272b8SAndroid Build Coastguard Worker   graph::class_def_size_estimator_t estimator2(non_consecutive_map.iter());
264*2d1272b8SAndroid Build Coastguard Worker   assert(check_add_class_def_size(estimator2, non_consecutive_map, 1, {1}));
265*2d1272b8SAndroid Build Coastguard Worker   assert(check_add_class_def_size(estimator2, non_consecutive_map, 2, {1, 2}));
266*2d1272b8SAndroid Build Coastguard Worker   assert(check_add_class_def_size(estimator2, non_consecutive_map, 3, {1, 2, 3}));
267*2d1272b8SAndroid Build Coastguard Worker 
268*2d1272b8SAndroid Build Coastguard Worker   estimator2.reset();
269*2d1272b8SAndroid Build Coastguard Worker   assert(check_add_class_def_size(estimator2, non_consecutive_map, 2, {2}));
270*2d1272b8SAndroid Build Coastguard Worker   assert(check_add_class_def_size(estimator2, non_consecutive_map, 3, {2, 3}));
271*2d1272b8SAndroid Build Coastguard Worker }
272*2d1272b8SAndroid Build Coastguard Worker 
test_running_class_size_estimates_with_locally_consecutive_glyphs()273*2d1272b8SAndroid Build Coastguard Worker static void test_running_class_size_estimates_with_locally_consecutive_glyphs () {
274*2d1272b8SAndroid Build Coastguard Worker   gid_and_class_list_t map = {
275*2d1272b8SAndroid Build Coastguard Worker     {1, 1},
276*2d1272b8SAndroid Build Coastguard Worker     {6, 2},
277*2d1272b8SAndroid Build Coastguard Worker     {7, 3},
278*2d1272b8SAndroid Build Coastguard Worker   };
279*2d1272b8SAndroid Build Coastguard Worker 
280*2d1272b8SAndroid Build Coastguard Worker   graph::class_def_size_estimator_t estimator(map.iter());
281*2d1272b8SAndroid Build Coastguard Worker   assert(check_add_class_def_size(estimator, map, 1, {1}));
282*2d1272b8SAndroid Build Coastguard Worker   assert(check_add_class_def_size(estimator, map, 2, {1, 2}));
283*2d1272b8SAndroid Build Coastguard Worker   assert(check_add_class_def_size(estimator, map, 3, {1, 2, 3}));
284*2d1272b8SAndroid Build Coastguard Worker 
285*2d1272b8SAndroid Build Coastguard Worker   estimator.reset();
286*2d1272b8SAndroid Build Coastguard Worker   assert(check_add_class_def_size(estimator, map, 2, {2}));
287*2d1272b8SAndroid Build Coastguard Worker   assert(check_add_class_def_size(estimator, map, 3, {2, 3}));
288*2d1272b8SAndroid Build Coastguard Worker }
289*2d1272b8SAndroid Build Coastguard Worker 
290*2d1272b8SAndroid Build Coastguard Worker int
main(int argc,char ** argv)291*2d1272b8SAndroid Build Coastguard Worker main (int argc, char **argv)
292*2d1272b8SAndroid Build Coastguard Worker {
293*2d1272b8SAndroid Build Coastguard Worker   test_class_and_coverage_size_estimates ();
294*2d1272b8SAndroid Build Coastguard Worker   test_running_class_and_coverage_size_estimates ();
295*2d1272b8SAndroid Build Coastguard Worker   test_running_class_size_estimates_with_locally_consecutive_glyphs ();
296*2d1272b8SAndroid Build Coastguard Worker }
297