2
0

test-set.c 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224
  1. /*
  2. * Copyright © 2013 Google, Inc.
  3. *
  4. * This is part of HarfBuzz, a text shaping library.
  5. *
  6. * Permission is hereby granted, without written agreement and without
  7. * license or royalty fees, to use, copy, modify, and distribute this
  8. * software and its documentation for any purpose, provided that the
  9. * above copyright notice and the following two paragraphs appear in
  10. * all copies of this software.
  11. *
  12. * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
  13. * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
  14. * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
  15. * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
  16. * DAMAGE.
  17. *
  18. * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
  19. * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  20. * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
  21. * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
  22. * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  23. *
  24. * Google Author(s): Behdad Esfahbod
  25. */
  26. #include "hb-test.h"
  27. /* Unit tests for hb-set.h */
  28. static void
  29. test_empty (hb_set_t *s)
  30. {
  31. hb_codepoint_t next;
  32. g_assert_cmpint (hb_set_get_population (s), ==, 0);
  33. g_assert_cmpint (hb_set_get_min (s), ==, HB_SET_VALUE_INVALID);
  34. g_assert_cmpint (hb_set_get_max (s), ==, HB_SET_VALUE_INVALID);
  35. g_assert (!hb_set_has (s, 13));
  36. next = 53043;
  37. g_assert (!hb_set_next (s, &next));
  38. g_assert_cmpint (next, ==, HB_SET_VALUE_INVALID);
  39. next = 07734;
  40. g_assert (!hb_set_previous (s, &next));
  41. g_assert_cmpint (next, ==, HB_SET_VALUE_INVALID);
  42. g_assert (hb_set_is_empty (s));
  43. }
  44. static void
  45. test_not_empty (hb_set_t *s)
  46. {
  47. hb_codepoint_t next;
  48. g_assert_cmpint (hb_set_get_population (s), !=, 0);
  49. g_assert_cmpint (hb_set_get_min (s), !=, HB_SET_VALUE_INVALID);
  50. g_assert_cmpint (hb_set_get_max (s), !=, HB_SET_VALUE_INVALID);
  51. next = HB_SET_VALUE_INVALID;
  52. g_assert (hb_set_next (s, &next));
  53. g_assert_cmpint (next, !=, HB_SET_VALUE_INVALID);
  54. next = HB_SET_VALUE_INVALID;
  55. g_assert (hb_set_previous (s, &next));
  56. g_assert_cmpint (next, !=, HB_SET_VALUE_INVALID);
  57. }
  58. static void
  59. test_set_basic (void)
  60. {
  61. hb_set_t *s = hb_set_create ();
  62. test_empty (s);
  63. hb_set_add (s, 13);
  64. test_not_empty (s);
  65. hb_set_clear (s);
  66. test_empty (s);
  67. hb_set_add (s, 33000);
  68. test_not_empty (s);
  69. hb_set_clear (s);
  70. hb_set_add_range (s, 10, 29);
  71. test_not_empty (s);
  72. g_assert (hb_set_has (s, 13));
  73. g_assert_cmpint (hb_set_get_population (s), ==, 20);
  74. g_assert_cmpint (hb_set_get_min (s), ==, 10);
  75. g_assert_cmpint (hb_set_get_max (s), ==, 29);
  76. test_not_empty (s);
  77. g_assert (hb_set_has (s, 13));
  78. g_assert_cmpint (hb_set_get_population (s), ==, 20);
  79. g_assert_cmpint (hb_set_get_min (s), ==, 10);
  80. g_assert_cmpint (hb_set_get_max (s), ==, 29);
  81. hb_set_del_range (s, 10, 18);
  82. test_not_empty (s);
  83. g_assert (!hb_set_has (s, 13));
  84. hb_set_add_range (s, 200, 800);
  85. test_not_empty (s);
  86. g_assert (!hb_set_has (s, 100));
  87. g_assert (!hb_set_has (s, 199));
  88. g_assert (hb_set_has (s, 200));
  89. g_assert (hb_set_has (s, 201));
  90. g_assert (hb_set_has (s, 243));
  91. g_assert (hb_set_has (s, 254));
  92. g_assert (hb_set_has (s, 255));
  93. g_assert (hb_set_has (s, 256));
  94. g_assert (hb_set_has (s, 257));
  95. g_assert (hb_set_has (s, 511));
  96. g_assert (hb_set_has (s, 512));
  97. g_assert (hb_set_has (s, 600));
  98. g_assert (hb_set_has (s, 767));
  99. g_assert (hb_set_has (s, 768));
  100. g_assert (hb_set_has (s, 769));
  101. g_assert (hb_set_has (s, 782));
  102. g_assert (hb_set_has (s, 798));
  103. g_assert (hb_set_has (s, 799));
  104. g_assert (hb_set_has (s, 800));
  105. g_assert (!hb_set_has (s, 801));
  106. g_assert (!hb_set_has (s, 802));
  107. hb_set_del (s, 800);
  108. g_assert (!hb_set_has (s, 800));
  109. g_assert_cmpint (hb_set_get_max (s), ==, 799);
  110. hb_set_del_range (s, 0, 799);
  111. g_assert_cmpint (hb_set_get_max (s), ==, HB_SET_VALUE_INVALID);
  112. hb_set_destroy (s);
  113. }
  114. // static inline void
  115. // print_set (hb_set_t *s)
  116. // {
  117. // hb_codepoint_t next;
  118. // printf ("{");
  119. // for (next = HB_SET_VALUE_INVALID; hb_set_next (s, &next); )
  120. // printf ("%d, ", next);
  121. // printf ("}\n");
  122. // }
  123. static void test_set_intersect_empty (void)
  124. {
  125. hb_set_t* a = hb_set_create ();
  126. hb_set_add (a, 3585);
  127. hb_set_add (a, 21333);
  128. hb_set_add (a, 24405);
  129. hb_set_t* b = hb_set_create();
  130. hb_set_add (b, 21483);
  131. hb_set_add (b, 24064);
  132. hb_set_intersect (a, b);
  133. g_assert (hb_set_is_empty (a));
  134. hb_set_destroy (a);
  135. hb_set_destroy (b);
  136. a = hb_set_create ();
  137. hb_set_add (a, 16777216);
  138. b = hb_set_create();
  139. hb_set_add (b, 0);
  140. hb_set_intersect (a, b);
  141. g_assert (hb_set_is_empty (a));
  142. hb_set_destroy (a);
  143. hb_set_destroy (b);
  144. }
  145. static void test_set_intersect_page_reduction (void)
  146. {
  147. hb_set_t* a = hb_set_create ();
  148. hb_set_add (a, 3585);
  149. hb_set_add (a, 21333);
  150. hb_set_add (a, 24405);
  151. hb_set_t* b = hb_set_create();
  152. hb_set_add (b, 3585);
  153. hb_set_add (b, 24405);
  154. hb_set_intersect(a, b);
  155. g_assert (hb_set_is_equal (a, b));
  156. hb_set_destroy (a);
  157. hb_set_destroy (b);
  158. }
  159. static void test_set_union (void)
  160. {
  161. hb_set_t* a = hb_set_create();
  162. hb_set_add (a, 3585);
  163. hb_set_add (a, 21333);
  164. hb_set_add (a, 24405);
  165. hb_set_t* b = hb_set_create();
  166. hb_set_add (b, 21483);
  167. hb_set_add (b, 24064);
  168. hb_set_t* u = hb_set_create ();
  169. hb_set_add (u, 3585);
  170. hb_set_add (u, 21333);
  171. hb_set_add (u, 21483);
  172. hb_set_add (u, 24064);
  173. hb_set_add (u, 24405);
  174. hb_set_union(b, a);
  175. g_assert (hb_set_is_equal (u, b));
  176. hb_set_destroy (a);
  177. hb_set_destroy (b);
  178. hb_set_destroy (u);
  179. }
  180. static void
  181. test_set_subsets (void)
  182. {
  183. hb_set_t *s = hb_set_create ();
  184. hb_set_t *l = hb_set_create ();
  185. hb_set_add (l, 0x0FFFF);
  186. hb_set_add (s, 0x1FFFF);
  187. g_assert (!hb_set_is_subset (s, l));
  188. hb_set_clear (s);
  189. hb_set_add (s, 0x0FFF0);
  190. g_assert (!hb_set_is_subset (s, l));
  191. hb_set_clear (s);
  192. hb_set_add (s, 0x0AFFF);
  193. g_assert (!hb_set_is_subset (s, l));
  194. hb_set_clear (s);
  195. g_assert (hb_set_is_subset (s, l));
  196. hb_set_clear (l);
  197. g_assert (hb_set_is_subset (s, l));
  198. hb_set_add (s, 0x1FFFF);
  199. g_assert (!hb_set_is_subset (s, l));
  200. hb_set_clear (s);
  201. hb_set_add (s, 0xFF);
  202. hb_set_add (s, 0x1FFFF);
  203. hb_set_add (s, 0x2FFFF);
  204. hb_set_add (l, 0xFF);
  205. hb_set_add (l, 0x1FFFF);
  206. hb_set_add (l, 0x2FFFF);
  207. g_assert (hb_set_is_subset (s, l));
  208. hb_set_del (l, 0xFF);
  209. g_assert (!hb_set_is_subset (s, l));
  210. hb_set_add (l, 0xFF);
  211. hb_set_del (l, 0x2FFFF);
  212. g_assert (!hb_set_is_subset (s, l));
  213. hb_set_add (l, 0x2FFFF);
  214. hb_set_del (l, 0x1FFFF);
  215. g_assert (!hb_set_is_subset (s, l));
  216. hb_set_destroy (s);
  217. hb_set_destroy (l);
  218. }
  219. static void
  220. test_set_algebra (void)
  221. {
  222. hb_set_t *s = hb_set_create ();
  223. hb_set_t *o = hb_set_create ();
  224. hb_set_t *o2 = hb_set_create ();
  225. hb_set_add (o, 13);
  226. hb_set_add (o, 19);
  227. hb_set_add (o2, 0x660E);
  228. test_empty (s);
  229. g_assert (!hb_set_is_equal (s, o));
  230. g_assert (hb_set_is_subset (s, o));
  231. g_assert (!hb_set_is_subset (o, s));
  232. hb_set_set (s, o);
  233. g_assert (hb_set_is_equal (s, o));
  234. g_assert (hb_set_is_subset (s, o));
  235. g_assert (hb_set_is_subset (o, s));
  236. test_not_empty (s);
  237. g_assert_cmpint (hb_set_get_population (s), ==, 2);
  238. hb_set_clear (s);
  239. test_empty (s);
  240. hb_set_add (s, 10);
  241. g_assert_cmpint (hb_set_get_population (s), ==, 1);
  242. hb_set_union (s, o);
  243. g_assert_cmpint (hb_set_get_population (s), ==, 3);
  244. g_assert (hb_set_has (s, 10));
  245. g_assert (hb_set_has (s, 13));
  246. hb_set_clear (s);
  247. test_empty (s);
  248. g_assert_cmpint (hb_set_get_population (s), ==, 0);
  249. hb_set_union (s, o2);
  250. g_assert_cmpint (hb_set_get_population (s), ==, 1);
  251. g_assert (hb_set_has (s, 0x660E));
  252. hb_set_clear (s);
  253. test_empty (s);
  254. hb_set_add_range (s, 10, 17);
  255. g_assert (!hb_set_is_equal (s, o));
  256. hb_set_intersect (s, o);
  257. g_assert (!hb_set_is_equal (s, o));
  258. test_not_empty (s);
  259. g_assert_cmpint (hb_set_get_population (s), ==, 1);
  260. g_assert (!hb_set_has (s, 10));
  261. g_assert (hb_set_has (s, 13));
  262. hb_set_clear (s);
  263. test_empty (s);
  264. hb_set_add_range (s, 10, 17);
  265. g_assert (!hb_set_is_equal (s, o));
  266. hb_set_subtract (s, o);
  267. g_assert (!hb_set_is_equal (s, o));
  268. test_not_empty (s);
  269. g_assert_cmpint (hb_set_get_population (s), ==, 7);
  270. g_assert (hb_set_has (s, 12));
  271. g_assert (!hb_set_has (s, 13));
  272. g_assert (!hb_set_has (s, 19));
  273. hb_set_clear (s);
  274. test_empty (s);
  275. hb_set_add_range (s, 10, 17);
  276. g_assert (!hb_set_is_equal (s, o));
  277. hb_set_symmetric_difference (s, o);
  278. g_assert (!hb_set_is_equal (s, o));
  279. test_not_empty (s);
  280. g_assert_cmpint (hb_set_get_population (s), ==, 8);
  281. g_assert (hb_set_has (s, 12));
  282. g_assert (!hb_set_has (s, 13));
  283. g_assert (hb_set_has (s, 19));
  284. /* https://github.com/harfbuzz/harfbuzz/issues/579 */
  285. hb_set_clear (s);
  286. test_empty (s);
  287. hb_set_add_range (s, 886, 895);
  288. hb_set_add (s, 1024);
  289. hb_set_add (s, 1152);
  290. hb_set_clear (o);
  291. test_empty (o);
  292. hb_set_add (o, 889);
  293. hb_set_add (o, 1024);
  294. g_assert (!hb_set_is_equal (s, o));
  295. hb_set_intersect (o, s);
  296. test_not_empty (o);
  297. g_assert (!hb_set_is_equal (s, o));
  298. g_assert_cmpint (hb_set_get_population (o), ==, 2);
  299. g_assert (hb_set_has (o, 889));
  300. g_assert (hb_set_has (o, 1024));
  301. hb_set_clear (o);
  302. test_empty (o);
  303. hb_set_add_range (o, 887, 889);
  304. hb_set_add (o, 1121);
  305. g_assert (!hb_set_is_equal (s, o));
  306. hb_set_intersect (o, s);
  307. test_not_empty (o);
  308. g_assert (!hb_set_is_equal (s, o));
  309. g_assert_cmpint (hb_set_get_population (o), ==, 3);
  310. g_assert (hb_set_has (o, 887));
  311. g_assert (hb_set_has (o, 888));
  312. g_assert (hb_set_has (o, 889));
  313. hb_set_clear (s);
  314. test_empty (s);
  315. hb_set_add_range (s, 886, 895);
  316. hb_set_add (s, 1014);
  317. hb_set_add (s, 1017);
  318. hb_set_add (s, 1024);
  319. hb_set_add (s, 1113);
  320. hb_set_add (s, 1121);
  321. g_assert_cmpint (hb_set_get_population (s), ==, 15);
  322. hb_set_clear (o);
  323. test_empty (o);
  324. hb_set_add (o, 889);
  325. g_assert_cmpint (hb_set_get_population (o), ==, 1);
  326. hb_set_intersect (o, s);
  327. g_assert_cmpint (hb_set_get_population (o), ==, 1);
  328. g_assert (hb_set_has (o, 889));
  329. hb_set_add (o, 511);
  330. g_assert_cmpint (hb_set_get_population (o), ==, 2);
  331. hb_set_intersect (o, s);
  332. g_assert_cmpint (hb_set_get_population (o), ==, 1);
  333. g_assert (hb_set_has (o, 889));
  334. hb_set_destroy (s);
  335. hb_set_destroy (o);
  336. hb_set_destroy (o2);
  337. }
  338. static void
  339. test_set_iter (void)
  340. {
  341. hb_codepoint_t next, first, last;
  342. hb_set_t *s = hb_set_create ();
  343. hb_set_add (s, 13);
  344. hb_set_add_range (s, 6, 6);
  345. hb_set_add_range (s, 10, 15);
  346. hb_set_add (s, 1100);
  347. hb_set_add (s, 1200);
  348. hb_set_add (s, 20005);
  349. test_not_empty (s);
  350. next = HB_SET_VALUE_INVALID;
  351. g_assert (hb_set_next (s, &next));
  352. g_assert_cmpint (next, ==, 6);
  353. g_assert (hb_set_next (s, &next));
  354. g_assert_cmpint (next, ==, 10);
  355. g_assert (hb_set_next (s, &next));
  356. g_assert (hb_set_next (s, &next));
  357. g_assert (hb_set_next (s, &next));
  358. g_assert_cmpint (next, ==, 13);
  359. g_assert (hb_set_next (s, &next));
  360. g_assert (hb_set_next (s, &next));
  361. g_assert_cmpint (next, ==, 15);
  362. g_assert (hb_set_next (s, &next));
  363. g_assert_cmpint (next, ==, 1100);
  364. g_assert (hb_set_next (s, &next));
  365. g_assert_cmpint (next, ==, 1200);
  366. g_assert (hb_set_next (s, &next));
  367. g_assert_cmpint (next, ==, 20005);
  368. g_assert (!hb_set_next (s, &next));
  369. g_assert_cmpint (next, ==, HB_SET_VALUE_INVALID);
  370. next = HB_SET_VALUE_INVALID;
  371. g_assert (hb_set_previous (s, &next));
  372. g_assert_cmpint (next, ==, 20005);
  373. g_assert (hb_set_previous (s, &next));
  374. g_assert_cmpint (next, ==, 1200);
  375. g_assert (hb_set_previous (s, &next));
  376. g_assert_cmpint (next, ==, 1100);
  377. g_assert (hb_set_previous (s, &next));
  378. g_assert_cmpint (next, ==, 15);
  379. g_assert (hb_set_previous (s, &next));
  380. g_assert (hb_set_previous (s, &next));
  381. g_assert_cmpint (next, ==, 13);
  382. g_assert (hb_set_previous (s, &next));
  383. g_assert (hb_set_previous (s, &next));
  384. g_assert (hb_set_previous (s, &next));
  385. g_assert_cmpint (next, ==, 10);
  386. g_assert (hb_set_previous (s, &next));
  387. g_assert_cmpint (next, ==, 6);
  388. g_assert (!hb_set_previous (s, &next));
  389. g_assert_cmpint (next, ==, HB_SET_VALUE_INVALID);
  390. first = last = HB_SET_VALUE_INVALID;
  391. g_assert (hb_set_next_range (s, &first, &last));
  392. g_assert_cmpint (first, ==, 6);
  393. g_assert_cmpint (last, ==, 6);
  394. g_assert (hb_set_next_range (s, &first, &last));
  395. g_assert_cmpint (first, ==, 10);
  396. g_assert_cmpint (last, ==, 15);
  397. g_assert (hb_set_next_range (s, &first, &last));
  398. g_assert_cmpint (first, ==, 1100);
  399. g_assert_cmpint (last, ==, 1100);
  400. g_assert (hb_set_next_range (s, &first, &last));
  401. g_assert_cmpint (first, ==, 1200);
  402. g_assert_cmpint (last, ==, 1200);
  403. g_assert (hb_set_next_range (s, &first, &last));
  404. g_assert_cmpint (first, ==, 20005);
  405. g_assert_cmpint (last, ==, 20005);
  406. g_assert (!hb_set_next_range (s, &first, &last));
  407. g_assert_cmpint (first, ==, HB_SET_VALUE_INVALID);
  408. g_assert_cmpint (last, ==, HB_SET_VALUE_INVALID);
  409. first = last = HB_SET_VALUE_INVALID;
  410. g_assert (hb_set_previous_range (s, &first, &last));
  411. g_assert_cmpint (first, ==, 20005);
  412. g_assert_cmpint (last, ==, 20005);
  413. g_assert (hb_set_previous_range (s, &first, &last));
  414. g_assert_cmpint (first, ==, 1200);
  415. g_assert_cmpint (last, ==, 1200);
  416. g_assert (hb_set_previous_range (s, &first, &last));
  417. g_assert_cmpint (first, ==, 1100);
  418. g_assert_cmpint (last, ==, 1100);
  419. g_assert (hb_set_previous_range (s, &first, &last));
  420. g_assert_cmpint (first, ==, 10);
  421. g_assert_cmpint (last, ==, 15);
  422. g_assert (hb_set_previous_range (s, &first, &last));
  423. g_assert_cmpint (first, ==, 6);
  424. g_assert_cmpint (last, ==, 6);
  425. g_assert (!hb_set_previous_range (s, &first, &last));
  426. g_assert_cmpint (first, ==, HB_SET_VALUE_INVALID);
  427. g_assert_cmpint (last, ==, HB_SET_VALUE_INVALID);
  428. hb_set_destroy (s);
  429. }
  430. static void
  431. test_set_empty (void)
  432. {
  433. hb_set_t *b = hb_set_get_empty ();
  434. g_assert (hb_set_get_empty ());
  435. g_assert (hb_set_get_empty () == b);
  436. g_assert (!hb_set_allocation_successful (b));
  437. test_empty (b);
  438. hb_set_add (b, 13);
  439. test_empty (b);
  440. g_assert (!hb_set_allocation_successful (b));
  441. hb_set_clear (b);
  442. test_empty (b);
  443. g_assert (!hb_set_allocation_successful (b));
  444. hb_set_destroy (b);
  445. }
  446. static void
  447. test_set_delrange (void)
  448. {
  449. const unsigned P = 512; /* Page size. */
  450. struct { unsigned b, e; } ranges[] = {
  451. { 35, P-15 }, /* From page middle thru middle. */
  452. { P, P+100 }, /* From page start thru middle. */
  453. { P+300, P*2-1 }, /* From page middle thru end. */
  454. { P*3, P*4+100 }, /* From page start thru next page middle. */
  455. { P*4+300, P*6-1 }, /* From page middle thru next page end. */
  456. { P*6+200,P*8+100 }, /* From page middle covering one page thru page middle. */
  457. { P*9, P*10+105 }, /* From page start covering one page thru page middle. */
  458. { P*10+305, P*12-1 }, /* From page middle covering one page thru page end. */
  459. { P*13, P*15-1 }, /* From page start covering two pages thru page end. */
  460. { P*15+100, P*18+100 } /* From page middle covering two pages thru page middle. */
  461. };
  462. unsigned n = sizeof (ranges) / sizeof(ranges[0]);
  463. hb_set_t *s = hb_set_create ();
  464. test_empty (s);
  465. for (unsigned int g = 0; g < ranges[n - 1].e + P; g += 2)
  466. hb_set_add (s, g);
  467. hb_set_add (s, P*2-1);
  468. hb_set_add (s, P*6-1);
  469. hb_set_add (s, P*12-1);
  470. hb_set_add (s, P*15-1);
  471. for (unsigned i = 0; i < n; i++)
  472. hb_set_del_range (s, ranges[i].b, ranges[i].e);
  473. hb_set_del_range (s, P*13+5, P*15-10); /* Deletion from deleted pages. */
  474. for (unsigned i = 0; i < n; i++)
  475. {
  476. unsigned b = ranges[i].b;
  477. unsigned e = ranges[i].e;
  478. g_assert (hb_set_has (s, (b-2)&~1));
  479. while (b <= e)
  480. g_assert (!hb_set_has (s, b++));
  481. g_assert (hb_set_has (s, (e+2)&~1));
  482. }
  483. hb_set_destroy (s);
  484. }
  485. static const unsigned max_set_elements = -1;
  486. static void
  487. test_set_inverted_basics (void)
  488. {
  489. // Tests:
  490. // add, del, has, get_population, is_empty, get_min, get_max
  491. // for inverted sets.
  492. hb_set_t *s = hb_set_create ();
  493. hb_set_invert (s);
  494. g_assert_cmpint (hb_set_get_population (s), ==, max_set_elements);
  495. g_assert (hb_set_has (s, 0));
  496. g_assert (hb_set_has (s, 13));
  497. g_assert (hb_set_has (s, max_set_elements - 1));
  498. g_assert (!hb_set_is_empty (s));
  499. g_assert_cmpint (hb_set_get_min (s), ==, 0);
  500. g_assert_cmpint (hb_set_get_max (s), ==, max_set_elements - 1);
  501. hb_set_del (s, 13);
  502. g_assert (!hb_set_has (s, 13));
  503. g_assert_cmpint (hb_set_get_population (s), ==, max_set_elements - 1);
  504. g_assert_cmpint (hb_set_get_min (s), ==, 0);
  505. g_assert_cmpint (hb_set_get_max (s), ==, max_set_elements - 1);
  506. hb_set_add (s, 13);
  507. g_assert (hb_set_has (s, 13));
  508. g_assert_cmpint (hb_set_get_population (s), ==, max_set_elements);
  509. hb_set_del (s, 0);
  510. hb_set_del (s, max_set_elements - 1);
  511. g_assert (!hb_set_has (s, 0));
  512. g_assert (hb_set_has (s, 13));
  513. g_assert (!hb_set_has (s, max_set_elements - 1));
  514. g_assert (!hb_set_is_empty (s));
  515. g_assert_cmpint (hb_set_get_population (s), ==, max_set_elements - 2);
  516. g_assert_cmpint (hb_set_get_min (s), ==, 1);
  517. g_assert_cmpint (hb_set_get_max (s), ==, max_set_elements - 2);
  518. hb_set_destroy (s);
  519. }
  520. static void
  521. test_set_inverted_ranges (void)
  522. {
  523. // Tests:
  524. // add_range, del_range, has, get_population, is_empty, get_min, get_max
  525. // for inverted sets.
  526. hb_set_t *s = hb_set_create ();
  527. hb_set_invert (s);
  528. hb_set_del_range (s, 41, 4000);
  529. hb_set_add_range (s, 78, 601);
  530. g_assert (hb_set_has (s, 40));
  531. g_assert (!hb_set_has (s, 41));
  532. g_assert (!hb_set_has (s, 64));
  533. g_assert (!hb_set_has (s, 77));
  534. g_assert (hb_set_has (s, 78));
  535. g_assert (hb_set_has (s, 300));
  536. g_assert (hb_set_has (s, 601));
  537. g_assert (!hb_set_has (s, 602));
  538. g_assert (!hb_set_has (s, 3000));
  539. g_assert (!hb_set_has (s, 4000));
  540. g_assert (hb_set_has (s, 4001));
  541. g_assert (!hb_set_is_empty (s));
  542. g_assert_cmpint (hb_set_get_population (s), ==, max_set_elements - 3436);
  543. g_assert_cmpint (hb_set_get_min (s), ==, 0);
  544. g_assert_cmpint (hb_set_get_max (s), ==, max_set_elements - 1);
  545. hb_set_del_range (s, 0, 37);
  546. g_assert (!hb_set_has (s, 0));
  547. g_assert (!hb_set_has (s, 37));
  548. g_assert (hb_set_has (s, 38));
  549. g_assert (!hb_set_is_empty (s));
  550. g_assert_cmpint (hb_set_get_population (s), ==,
  551. max_set_elements - 3436 - 38);
  552. g_assert_cmpint (hb_set_get_min (s), ==, 38);
  553. g_assert_cmpint (hb_set_get_max (s), ==, max_set_elements - 1);
  554. hb_set_del_range (s, max_set_elements - 13, max_set_elements - 1);
  555. g_assert (!hb_set_has (s, max_set_elements - 1));
  556. g_assert (!hb_set_has (s, max_set_elements - 13));
  557. g_assert (hb_set_has (s, max_set_elements - 14));
  558. g_assert (!hb_set_is_empty (s));
  559. g_assert_cmpint (hb_set_get_population (s), ==,
  560. max_set_elements - 3436 - 38 - 13);
  561. g_assert_cmpint (hb_set_get_min (s), ==, 38);
  562. g_assert_cmpint (hb_set_get_max (s), ==, max_set_elements - 14);
  563. hb_set_destroy (s);
  564. }
  565. static void
  566. test_set_inverted_iteration_next (void)
  567. {
  568. // Tests:
  569. // next, next_range
  570. hb_set_t *s = hb_set_create ();
  571. hb_set_invert (s);
  572. hb_set_del_range (s, 41, 4000);
  573. hb_set_add_range (s, 78, 601);
  574. hb_codepoint_t cp = HB_SET_VALUE_INVALID;
  575. hb_codepoint_t start = 0;
  576. hb_codepoint_t end = 0;
  577. g_assert (hb_set_next (s, &cp));
  578. g_assert_cmpint (cp, ==, 0);
  579. g_assert (hb_set_next (s, &cp));
  580. g_assert_cmpint (cp, ==, 1);
  581. g_assert (hb_set_next_range (s, &start, &end));
  582. g_assert_cmpint (start, ==, 1);
  583. g_assert_cmpint (end, ==, 40);
  584. start = 40;
  585. end = 40;
  586. g_assert (hb_set_next_range (s, &start, &end));
  587. g_assert_cmpint (start, ==, 78);
  588. g_assert_cmpint (end, ==, 601);
  589. start = 40;
  590. end = 57;
  591. g_assert (hb_set_next_range (s, &start, &end));
  592. g_assert_cmpint (start, ==, 78);
  593. g_assert_cmpint (end, ==, 601);
  594. cp = 39;
  595. g_assert (hb_set_next (s, &cp));
  596. g_assert_cmpint (cp, ==, 40);
  597. g_assert (hb_set_next (s, &cp));
  598. g_assert_cmpint (cp, ==, 78);
  599. cp = 56;
  600. g_assert (hb_set_next (s, &cp));
  601. g_assert_cmpint (cp, ==, 78);
  602. cp = 78;
  603. g_assert (hb_set_next (s, &cp));
  604. g_assert_cmpint (cp, ==, 79);
  605. cp = 601;
  606. g_assert (hb_set_next (s, &cp));
  607. g_assert_cmpint (cp, ==, 4001);
  608. cp = HB_SET_VALUE_INVALID;
  609. hb_set_del (s, 0);
  610. g_assert (hb_set_next (s, &cp));
  611. g_assert_cmpint (cp, ==, 1);
  612. start = 0;
  613. end = 0;
  614. g_assert (hb_set_next_range (s, &start, &end));
  615. g_assert_cmpint (start, ==, 1);
  616. g_assert_cmpint (end, ==, 40);
  617. cp = max_set_elements - 1;
  618. g_assert (!hb_set_next (s, &cp));
  619. g_assert_cmpint (cp, ==, HB_SET_VALUE_INVALID);
  620. start = 4000;
  621. end = 4000;
  622. g_assert (hb_set_next_range (s, &start, &end));
  623. g_assert_cmpint (start, ==, 4001);
  624. g_assert_cmpint (end, ==, max_set_elements - 1);
  625. start = max_set_elements - 1;
  626. end = max_set_elements - 1;
  627. g_assert (!hb_set_next_range (s, &start, &end));
  628. g_assert_cmpint (start, ==, HB_SET_VALUE_INVALID);
  629. g_assert_cmpint (end, ==, HB_SET_VALUE_INVALID);
  630. cp = max_set_elements - 3;
  631. hb_set_del (s, max_set_elements - 1);
  632. g_assert (hb_set_next (s, &cp));
  633. g_assert_cmpint (cp, ==, max_set_elements - 2);
  634. g_assert (!hb_set_next (s, &cp));
  635. g_assert_cmpint (cp, ==, HB_SET_VALUE_INVALID);
  636. start = max_set_elements - 2;
  637. end = max_set_elements - 2;
  638. g_assert (!hb_set_next_range (s, &start, &end));
  639. g_assert_cmpint (start, ==, HB_SET_VALUE_INVALID);
  640. g_assert_cmpint (end, ==, HB_SET_VALUE_INVALID);
  641. start = max_set_elements - 3;
  642. end = max_set_elements - 3;
  643. g_assert (hb_set_next_range (s, &start, &end));
  644. g_assert_cmpint (start, ==, max_set_elements - 2);
  645. g_assert_cmpint (end, ==, max_set_elements - 2);
  646. hb_set_destroy (s);
  647. }
  648. static void
  649. test_set_inverted_iteration_prev (void)
  650. {
  651. // Tests:
  652. // previous, previous_range
  653. hb_set_t *s = hb_set_create ();
  654. hb_set_invert (s);
  655. hb_set_del_range (s, 41, 4000);
  656. hb_set_add_range (s, 78, 601);
  657. hb_codepoint_t cp = HB_SET_VALUE_INVALID;
  658. hb_codepoint_t start = max_set_elements - 1;
  659. hb_codepoint_t end = max_set_elements - 1;
  660. g_assert (hb_set_previous (s, &cp));
  661. g_assert_cmpint (cp, ==, max_set_elements - 1);
  662. g_assert (hb_set_previous (s, &cp));
  663. g_assert_cmpint (cp, ==, max_set_elements - 2);
  664. g_assert (hb_set_previous_range (s, &start, &end));
  665. g_assert_cmpint (start, ==, 4001);
  666. g_assert_cmpint (end, ==, max_set_elements - 2);
  667. start = 4001;
  668. end = 4001;
  669. g_assert (hb_set_previous_range (s, &start, &end));
  670. g_assert_cmpint (start, ==, 78);
  671. g_assert_cmpint (end, ==, 601);
  672. start = 2500;
  673. end = 3000;
  674. g_assert (hb_set_previous_range (s, &start, &end));
  675. g_assert_cmpint (start, ==, 78);
  676. g_assert_cmpint (end, ==, 601);
  677. cp = 4002;
  678. g_assert (hb_set_previous (s, &cp));
  679. g_assert_cmpint (cp, ==, 4001);
  680. g_assert (hb_set_previous (s, &cp));
  681. g_assert_cmpint (cp, ==, 601);
  682. cp = 3500;
  683. g_assert (hb_set_previous (s, &cp));
  684. g_assert_cmpint (cp, ==, 601);
  685. cp = 601;
  686. g_assert (hb_set_previous (s, &cp));
  687. g_assert_cmpint (cp, ==, 600);
  688. cp = 78;
  689. g_assert (hb_set_previous (s, &cp));
  690. g_assert_cmpint (cp, ==, 40);
  691. cp = HB_SET_VALUE_INVALID;
  692. hb_set_del (s, max_set_elements - 1);
  693. g_assert (hb_set_previous (s, &cp));
  694. g_assert_cmpint (cp, ==, max_set_elements - 2);
  695. start = max_set_elements - 1;
  696. end = max_set_elements - 1;
  697. g_assert (hb_set_previous_range (s, &start, &end));
  698. g_assert_cmpint (start, ==, 4001);
  699. g_assert_cmpint (end, ==, max_set_elements - 2);
  700. cp = 0;
  701. g_assert (!hb_set_previous (s, &cp));
  702. g_assert_cmpint (cp, ==, HB_SET_VALUE_INVALID);
  703. cp = 40;
  704. g_assert (hb_set_previous (s, &cp));
  705. g_assert_cmpint (cp, ==, 39);
  706. start = 40;
  707. end = 40;
  708. g_assert (hb_set_previous_range (s, &start, &end));
  709. g_assert_cmpint (start, ==, 0);
  710. g_assert_cmpint (end, ==, 39);
  711. start = 0;
  712. end = 0;
  713. g_assert (!hb_set_previous_range (s, &start, &end));
  714. g_assert_cmpint (start, ==, HB_SET_VALUE_INVALID);
  715. g_assert_cmpint (end, ==, HB_SET_VALUE_INVALID);
  716. cp = 2;
  717. hb_set_del (s, 0);
  718. g_assert (hb_set_previous (s, &cp));
  719. g_assert_cmpint (cp, ==, 1);
  720. g_assert (!hb_set_previous (s, &cp));
  721. g_assert_cmpint (cp, ==, HB_SET_VALUE_INVALID);
  722. start = 1;
  723. end = 1;
  724. g_assert (!hb_set_previous_range (s, &start, &end));
  725. g_assert_cmpint (start, ==, HB_SET_VALUE_INVALID);
  726. g_assert_cmpint (end, ==, HB_SET_VALUE_INVALID);
  727. start = 2;
  728. end = 2;
  729. g_assert (hb_set_previous_range (s, &start, &end));
  730. g_assert_cmpint (start, ==, 1);
  731. g_assert_cmpint (end, ==, 1);
  732. hb_set_destroy (s);
  733. }
  734. static void
  735. test_set_inverted_equality (void)
  736. {
  737. hb_set_t *a = hb_set_create ();
  738. hb_set_t *b = hb_set_create ();
  739. hb_set_invert (a);
  740. hb_set_invert (b);
  741. g_assert (hb_set_is_equal (a, b));
  742. g_assert (hb_set_is_equal (b, a));
  743. hb_set_add (a, 10);
  744. g_assert (hb_set_is_equal (a, b));
  745. g_assert (hb_set_is_equal (b, a));
  746. hb_set_del (a, 42);
  747. g_assert (!hb_set_is_equal (a, b));
  748. g_assert (!hb_set_is_equal (b, a));
  749. hb_set_del (b, 42);
  750. g_assert (hb_set_is_equal (a, b));
  751. g_assert (hb_set_is_equal (b, a));
  752. hb_set_del_range (a, 43, 50);
  753. hb_set_del_range (a, 51, 76);
  754. hb_set_del_range (b, 43, 76);
  755. g_assert (hb_set_is_equal (a, b));
  756. g_assert (hb_set_is_equal (b, a));
  757. hb_set_del (a, 0);
  758. g_assert (!hb_set_is_equal (a, b));
  759. g_assert (!hb_set_is_equal (b, a));
  760. hb_set_del (b, 0);
  761. g_assert (hb_set_is_equal (a, b));
  762. g_assert (hb_set_is_equal (b, a));
  763. hb_set_del (a, max_set_elements - 1);
  764. g_assert (!hb_set_is_equal (a, b));
  765. g_assert (!hb_set_is_equal (b, a));
  766. hb_set_del (b, max_set_elements - 1);
  767. g_assert (hb_set_is_equal (a, b));
  768. g_assert (hb_set_is_equal (b, a));
  769. hb_set_invert (a);
  770. g_assert (!hb_set_is_equal (a, b));
  771. g_assert (!hb_set_is_equal (b, a));
  772. hb_set_invert (b);
  773. g_assert (hb_set_is_equal (a, b));
  774. g_assert (hb_set_is_equal (b, a));
  775. hb_set_destroy (a);
  776. hb_set_destroy (b);
  777. }
  778. typedef enum {
  779. UNION = 0,
  780. INTERSECT,
  781. SUBTRACT,
  782. SYM_DIFF,
  783. LAST,
  784. } set_operation;
  785. static hb_set_t* prepare_set(hb_bool_t has_x,
  786. hb_bool_t inverted,
  787. hb_bool_t has_page,
  788. hb_bool_t is_null)
  789. {
  790. static const hb_codepoint_t x = 13;
  791. if (is_null)
  792. return hb_set_get_empty ();
  793. hb_set_t* s = hb_set_create ();
  794. if (inverted) hb_set_invert (s);
  795. if (has_page)
  796. {
  797. // Ensure a page exists for x.
  798. inverted ? hb_set_del (s, x) : hb_set_add (s, x);
  799. }
  800. if (has_x)
  801. hb_set_add (s, x);
  802. else
  803. hb_set_del (s, x);
  804. return s;
  805. }
  806. static hb_bool_t
  807. check_set_operations(hb_bool_t a_has_x,
  808. hb_bool_t a_inverted,
  809. hb_bool_t a_has_page,
  810. hb_bool_t a_is_null,
  811. hb_bool_t b_has_x,
  812. hb_bool_t b_inverted,
  813. hb_bool_t b_has_page,
  814. hb_bool_t b_is_null,
  815. set_operation op)
  816. {
  817. hb_codepoint_t x = 13;
  818. hb_set_t* a = prepare_set (a_has_x, a_inverted, a_has_page, a_is_null);
  819. hb_set_t* b = prepare_set (b_has_x, b_inverted, b_has_page, b_is_null);
  820. const char* op_name;
  821. hb_bool_t has_expected;
  822. hb_bool_t should_have_x;
  823. switch (op) {
  824. default:
  825. case LAST:
  826. case UNION:
  827. op_name = "union";
  828. should_have_x = (a_has_x || b_has_x) && !a_is_null;
  829. hb_set_union (a, b);
  830. has_expected = (hb_set_has (a, x) == should_have_x);
  831. break;
  832. case INTERSECT:
  833. op_name = "intersect";
  834. should_have_x = (a_has_x && b_has_x) && !a_is_null;
  835. hb_set_intersect (a, b);
  836. has_expected = (hb_set_has (a, x) == should_have_x);
  837. break;
  838. case SUBTRACT:
  839. op_name = "subtract";
  840. should_have_x = (a_has_x && !b_has_x) && !a_is_null;
  841. hb_set_subtract (a, b);
  842. has_expected = (hb_set_has (a, x) == should_have_x);
  843. break;
  844. case SYM_DIFF:
  845. op_name = "sym_diff";
  846. should_have_x = (a_has_x ^ b_has_x) && !a_is_null;
  847. hb_set_symmetric_difference (a, b);
  848. has_expected = (hb_set_has (a, x) == should_have_x);
  849. break;
  850. }
  851. printf ("%s%s%s%s %-9s %s%s%s%s == %s [%s]\n",
  852. a_inverted ? "i" : " ",
  853. a_has_page ? "p" : " ",
  854. a_is_null ? "n" : " ",
  855. a_has_x ? "{13}" : "{} ",
  856. op_name,
  857. b_inverted ? "i" : " ",
  858. b_has_page ? "p" : " ",
  859. b_is_null ? "n" : " ",
  860. b_has_x ? "{13}" : "{} ",
  861. should_have_x ? "{13}" : "{} ",
  862. has_expected ? "succeeded" : "failed");
  863. hb_set_destroy (a);
  864. hb_set_destroy (b);
  865. return has_expected;
  866. }
  867. static void
  868. test_set_inverted_operations (void)
  869. {
  870. hb_bool_t all_succeeded = 1;
  871. for (hb_bool_t a_has_x = 0; a_has_x <= 1; a_has_x++) {
  872. for (hb_bool_t a_inverted = 0; a_inverted <= 1; a_inverted++) {
  873. for (hb_bool_t b_has_x = 0; b_has_x <= 1; b_has_x++) {
  874. for (hb_bool_t b_inverted = 0; b_inverted <= 1; b_inverted++) {
  875. for (hb_bool_t a_has_page = 0; a_has_page <= !(a_has_x ^ a_inverted); a_has_page++) {
  876. for (hb_bool_t b_has_page = 0; b_has_page <= !(b_has_x ^ b_inverted); b_has_page++) {
  877. for (hb_bool_t a_is_null = 0; a_is_null <= (!a_has_x && !a_has_page && !a_inverted); a_is_null++) {
  878. for (hb_bool_t b_is_null = 0; b_is_null <= (!b_has_x && !b_has_page && !b_inverted); b_is_null++) {
  879. for (set_operation op = UNION; op < LAST; op++) {
  880. all_succeeded = check_set_operations (a_has_x, a_inverted, a_has_page, a_is_null,
  881. b_has_x, b_inverted, b_has_page, b_is_null,
  882. op)
  883. && all_succeeded;
  884. }
  885. }
  886. }
  887. }
  888. }
  889. }
  890. }
  891. }
  892. }
  893. g_assert (all_succeeded);
  894. }
  895. static void
  896. test_hb_set_add_sorted_array (void)
  897. {
  898. hb_set_t *set = hb_set_create ();
  899. hb_codepoint_t array[7] = {1, 2, 3, 1000, 2000, 2001, 2002};
  900. hb_set_add_sorted_array (set, array, 7);
  901. g_assert_cmpint (hb_set_get_population (set), ==, 7);
  902. g_assert (hb_set_has (set, 1));
  903. g_assert (hb_set_has (set, 2));
  904. g_assert (hb_set_has (set, 3));
  905. g_assert (hb_set_has (set, 1000));
  906. g_assert (hb_set_has (set, 2000));
  907. g_assert (hb_set_has (set, 2001));
  908. g_assert (hb_set_has (set, 2002));
  909. hb_set_destroy (set);
  910. }
  911. static void
  912. test_set_next_many (void)
  913. {
  914. hb_set_t *set = hb_set_create ();
  915. for (unsigned i=0; i<600; i++)
  916. hb_set_add (set, i);
  917. for (unsigned i=6000; i<6100; i++)
  918. hb_set_add (set, i);
  919. g_assert (hb_set_get_population (set) == 700);
  920. hb_codepoint_t array[700];
  921. unsigned int n = hb_set_next_many (set, HB_SET_VALUE_INVALID, array, 700);
  922. g_assert_cmpint(n, ==, 700);
  923. for (unsigned i=0; i<600; i++)
  924. g_assert_cmpint (array[i], ==, i);
  925. for (unsigned i=0; i<100; i++)
  926. g_assert (array[600 + i] == 6000u + i);
  927. // Try skipping initial values.
  928. for (unsigned i = 0; i < 700; i++)
  929. array[i] = 0;
  930. n = hb_set_next_many (set, 42, array, 700);
  931. g_assert_cmpint (n, ==, 657);
  932. g_assert_cmpint (array[0], ==, 43);
  933. g_assert_cmpint (array[n - 1], ==, 6099);
  934. hb_set_destroy (set);
  935. }
  936. static void
  937. test_set_next_many_restricted (void)
  938. {
  939. hb_set_t *set = hb_set_create ();
  940. for (int i=0; i<600; i++)
  941. hb_set_add (set, i);
  942. for (int i=6000; i<6100; i++)
  943. hb_set_add (set, i);
  944. g_assert (hb_set_get_population (set) == 700);
  945. hb_codepoint_t array[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  946. hb_set_next_many (set, HB_SET_VALUE_INVALID, array, 9);
  947. for (int i=0; i<9; i++)
  948. g_assert_cmpint (array[i], ==, i);
  949. g_assert_cmpint (array[9], ==, 0);
  950. hb_set_destroy (set);
  951. }
  952. static void
  953. test_set_next_many_inverted (void)
  954. {
  955. hb_set_t *set = hb_set_create ();
  956. hb_set_add (set, 1);
  957. hb_set_add (set, 3);
  958. hb_set_invert (set);
  959. hb_codepoint_t array[] = {0, 0, 0, 0, 0, 999};
  960. // Single page.
  961. hb_set_next_many (set, HB_SET_VALUE_INVALID, array, 5);
  962. g_assert_cmpint (array[0], ==, 0);
  963. g_assert_cmpint (array[1], ==, 2);
  964. g_assert_cmpint (array[2], ==, 4);
  965. g_assert_cmpint (array[3], ==, 5);
  966. g_assert_cmpint (array[4], ==, 6);
  967. g_assert_cmpint (array[5], ==, 999);
  968. // Multiple pages.
  969. hb_set_invert (set);
  970. hb_set_add (set, 1000);
  971. hb_set_invert (set);
  972. hb_codepoint_t array2[1000];
  973. hb_set_next_many (set, HB_SET_VALUE_INVALID, array2, 1000);
  974. g_assert_cmpint (array2[0], ==, 0);
  975. g_assert_cmpint (array2[1], ==, 2);
  976. g_assert_cmpint (array2[2], ==, 4);
  977. g_assert_cmpint (array2[3], ==, 5);
  978. for (int i=4; i<997; i++)
  979. {
  980. g_assert_cmpint (array2[i], ==, i + 2);
  981. }
  982. g_assert_cmpint (array2[997], ==, 999);
  983. // Value 1000 skipped.
  984. g_assert_cmpint (array2[998], ==, 1001);
  985. g_assert_cmpint (array2[999], ==, 1002);
  986. hb_set_destroy (set);
  987. }
  988. static void
  989. test_set_next_many_out_of_order_pages (void) {
  990. hb_set_t* set = hb_set_create();
  991. hb_set_add(set, 1957);
  992. hb_set_add(set, 69);
  993. hb_codepoint_t results[2];
  994. unsigned int result_size = hb_set_next_many(set, HB_SET_VALUE_INVALID, results, 2);
  995. g_assert_cmpint(result_size, == , 2);
  996. g_assert_cmpint(results[0], == , 69);
  997. g_assert_cmpint(results[1], == , 1957);
  998. hb_set_destroy(set);
  999. }
  1000. int
  1001. main (int argc, char **argv)
  1002. {
  1003. hb_test_init (&argc, &argv);
  1004. hb_test_add (test_set_basic);
  1005. hb_test_add (test_set_subsets);
  1006. hb_test_add (test_set_algebra);
  1007. hb_test_add (test_set_iter);
  1008. hb_test_add (test_set_empty);
  1009. hb_test_add (test_set_delrange);
  1010. hb_test_add (test_set_intersect_empty);
  1011. hb_test_add (test_set_intersect_page_reduction);
  1012. hb_test_add (test_set_union);
  1013. hb_test_add (test_set_inverted_basics);
  1014. hb_test_add (test_set_inverted_ranges);
  1015. hb_test_add (test_set_inverted_iteration_next);
  1016. hb_test_add (test_set_inverted_iteration_prev);
  1017. hb_test_add (test_set_inverted_equality);
  1018. hb_test_add (test_set_inverted_operations);
  1019. hb_test_add (test_hb_set_add_sorted_array);
  1020. hb_test_add (test_set_next_many);
  1021. hb_test_add (test_set_next_many_restricted);
  1022. hb_test_add (test_set_next_many_inverted);
  1023. hb_test_add (test_set_next_many_out_of_order_pages);
  1024. return hb_test_run();
  1025. }