[test] Remove disabled code
[apps/home/video-player.git] / test / test-shape-complex.c
1 /*
2  * Copyright © 2011  Google, Inc.
3  * Copyright © 2008  Nokia Corporation and/or its subsidiary(-ies)
4  *
5  *  This is part of HarfBuzz, a text shaping library.
6  *
7  * Permission is hereby granted, without written agreement and without
8  * license or royalty fees, to use, copy, modify, and distribute this
9  * software and its documentation for any purpose, provided that the
10  * above copyright notice and the following two paragraphs appear in
11  * all copies of this software.
12  *
13  * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
14  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
15  * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
16  * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
17  * DAMAGE.
18  *
19  * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
20  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
21  * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
22  * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
23  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
24  *
25  * Google Author(s): Behdad Esfahbod
26  */
27
28 #include "hb-test.h"
29
30 /* Unit tests for complex text shaping */
31
32 /*
33  * This test provides a framework to test aspects of hb_shape() that are
34  * font-dependent.  Please add tests for any feature that fits that
35  * description.
36  */
37
38 #ifdef HAVE_FREETYPE
39 #include <hb-ft.h>
40 #endif
41
42 typedef struct
43 {
44   const char *font_file;
45   unsigned int face_index;
46   /* TODO add min/max face version */
47 } font_data_t;
48
49 typedef struct
50 {
51   char           comments[64];
52   hb_codepoint_t characters[16];
53   hb_codepoint_t glyphs[16];
54 } test_data_t;
55
56 typedef struct
57 {
58   const font_data_t font_data;
59   const test_data_t tests[];
60 } test_set_t;
61
62 typedef struct
63 {
64   const font_data_t font_data;
65   const test_data_t tests[];
66 } test_t;
67
68 static const test_set_t tests_greek = {
69   {"DejaVuSans.ttf", 0},
70   {
71     { "",
72       { 0x3b1, 0x300, 0x313, 0 },
73       { 0xb8, 0x3d3, 0x3c7, 0 }
74     },
75     { "",
76       { 0x3b1, 0x313, 0x300, 0 },
77       { 0xd4, 0 }
78     },
79     {{0}}
80   }
81 };
82
83 static const test_set_t tests_devanagari_1 = {
84   {"raghu.ttf", 0},
85   {
86     { "Ka",
87       { 0x0915, 0 },
88       { 0x0080, 0 }
89     },
90     { "Ka Halant",
91       { 0x0915, 0x094d, 0 },
92       { 0x0080, 0x0051, 0 }
93     },
94     { "Ka Halant Ka",
95       { 0x0915, 0x094d, 0x0915, 0 },
96       { 0x00c8, 0x0080, 0 }
97     },
98     { "Ka MatraI",
99       { 0x0915, 0x093f, 0 },
100       { 0x01d1, 0x0080, 0 }
101     },
102     { "Ra Halant Ka",
103       { 0x0930, 0x094d, 0x0915, 0 },
104       { 0x0080, 0x005b, 0 }
105     },
106     { "Ra Halant Ka MatraI",
107       { 0x0930, 0x094d, 0x0915, 0x093f, 0 },
108       { 0x01d1, 0x0080, 0x005b, 0 }
109     },
110     { "MatraI",
111       { 0x093f, 0 },
112       { 0x01d4, 0x029c, 0 }
113     },
114     { "Ka Nukta",
115       { 0x0915, 0x093c, 0 },
116       { 0x00a4, 0 }
117     },
118     { "Ka Halant Ra",
119       { 0x0915, 0x094d, 0x0930, 0 },
120       { 0x0110, 0 }
121     },
122     { "Ka Halant Ra Halant Ka",
123       { 0x0915, 0x094d, 0x0930, 0x094d, 0x0915, 0 },
124       { 0x0158, 0x0080, 0 }
125     },
126     { "",
127       { 0x0930, 0x094d, 0x200d, 0 },
128       { 0x00e2, 0 }
129     },
130     { "",
131       { 0x0915, 0x094d, 0x0930, 0x094d, 0x200d, 0 },
132       { 0x0158, 0 }
133     },
134     {{0}}
135   }
136 };
137
138 static const test_set_t tests_devanagari_2 = {
139   {"mangal.ttf", 0},
140   {
141     { "Ka",
142       { 0x0915, 0 },
143       { 0x0080, 0 }
144     },
145     { "Ka Halant",
146       { 0x0915, 0x094d, 0 },
147       { 0x0080, 0x0051, 0 }
148     },
149     { "Ka Halant Ka",
150       { 0x0915, 0x094d, 0x0915, 0 },
151       { 0x00c8, 0x0080, 0 }
152     },
153     { "Ka MatraI",
154       { 0x0915, 0x093f, 0 },
155       { 0x01d1, 0x0080, 0 }
156     },
157     { "Ra Halant Ka",
158       { 0x0930, 0x094d, 0x0915, 0 },
159       { 0x0080, 0x005b, 0 }
160     },
161     { "Ra Halant Ka MatraI",
162       { 0x0930, 0x094d, 0x0915, 0x093f, 0 },
163       { 0x01d1, 0x0080, 0x005b, 0 }
164     },
165     { "MatraI",
166       { 0x093f, 0 },
167       { 0x01d4, 0x029c, 0 }
168     },
169     { "Ka Nukta",
170       { 0x0915, 0x093c, 0 },
171       { 0x00a4, 0 }
172     },
173     { "Ka Halant Ra",
174       { 0x0915, 0x094d, 0x0930, 0 },
175       { 0x0110, 0 }
176     },
177     { "Ka Halant Ra Halant Ka",
178       { 0x0915, 0x094d, 0x0930, 0x094d, 0x0915, 0 },
179       { 0x0158, 0x0080, 0 }
180     },
181     { "",
182       { 0x92b, 0x94d, 0x930, 0 },
183       { 0x125, 0 }
184     },
185     { "",
186       { 0x92b, 0x93c, 0x94d, 0x930, 0 },
187       { 0x149, 0 }
188     },
189     {{0}}
190   }
191 };
192
193 static const test_set_t tests_bengali_1 = {
194   {"AkaashNormal.ttf", 0},
195   {
196     { "Ka",
197       { 0x0995, 0 },
198       { 0x0151, 0 }
199     },
200     { "Ka Halant",
201       { 0x0995, 0x09cd, 0 },
202       { 0x0151, 0x017d, 0 }
203     },
204     { "Ka Halant Ka",
205       { 0x0995, 0x09cd, 0x0995, 0 },
206       { 0x019b, 0 }
207     },
208     { "Ka MatraI",
209       { 0x0995, 0x09bf, 0 },
210       { 0x0173, 0x0151, 0 }
211     },
212     { "Ra Halant Ka",
213       { 0x09b0, 0x09cd, 0x0995, 0 },
214       { 0x0151, 0x0276, 0 }
215     },
216     { "Ra Halant Ka MatraI",
217       { 0x09b0, 0x09cd, 0x0995, 0x09bf, 0 },
218       { 0x0173, 0x0151, 0x0276, 0 }
219     },
220     { "Ka Nukta",
221       { 0x0995, 0x09bc, 0 },
222       { 0x0151, 0x0171, 0 }
223     },
224     { "Ka Halant Ra",
225       { 0x0995, 0x09cd, 0x09b0, 0 },
226       { 0x01f4, 0 }
227     },
228     { "Ka Halant Ra Halant Ka",
229       { 0x0995, 0x09cd, 0x09b0, 0x09cd, 0x0995, 0 },
230       { 0x025c, 0x0276, 0x0151, 0 }
231     },
232     { "Ya + Halant",
233       { 0x09af, 0x09cd, 0 },
234       { 0x016a, 0x017d, 0 }
235     },
236     { "Da Halant Ya -> Da Ya-Phala",
237       { 0x09a6, 0x09cd, 0x09af, 0 },
238       { 0x01e5, 0 }
239     },
240     { "A Halant Ya -> A Ya-phala",
241       { 0x0985, 0x09cd, 0x09af, 0 },
242       { 0x0145, 0x01cf, 0 }
243     },
244     { "Na Halant Ka",
245       { 0x09a8, 0x09cd, 0x0995, 0 },
246       { 0x026f, 0x0151, 0 }
247     },
248     { "Na Halant ZWNJ Ka",
249       { 0x09a8, 0x09cd, 0x200c, 0x0995, 0 },
250       { 0x0164, 0x017d, 0x0151, 0 }
251     },
252     { "Na Halant ZWJ Ka",
253       { 0x09a8, 0x09cd, 0x200d, 0x0995, 0 },
254       { 0x026f, 0x0151, 0 }
255     },
256     { "Ka Halant ZWNJ Ka",
257       { 0x0995, 0x09cd, 0x200c, 0x0995, 0 },
258       { 0x0151, 0x017d, 0x0151, 0 }
259     },
260     { "Ka Halant ZWJ Ka",
261       { 0x0995, 0x09cd, 0x200d, 0x0995, 0 },
262       { 0x025c, 0x0151, 0 }
263     },
264     { "Na Halant Ra",
265       { 0x09a8, 0x09cd, 0x09b0, 0 },
266       { 0x0207, 0 }
267     },
268     { "Na Halant ZWNJ Ra",
269       { 0x09a8, 0x09cd, 0x200c, 0x09b0, 0 },
270       { 0x0164, 0x017d, 0x016b, 0 }
271     },
272     { "Na Halant ZWJ Ra",
273       { 0x09a8, 0x09cd, 0x200d, 0x09b0, 0 },
274       { 0x026f, 0x016b, 0 }
275     },
276     { "Na Halant Ba",
277       { 0x09a8, 0x09cd, 0x09ac, 0 },
278       { 0x022f, 0 }
279     },
280     { "Na Halant ZWNJ Ba",
281       { 0x09a8, 0x09cd, 0x200c, 0x09ac, 0 },
282       { 0x0164, 0x017d, 0x0167, 0 }
283     },
284     { "Na Halant ZWJ Ba",
285       { 0x09a8, 0x09cd, 0x200d, 0x09ac, 0 },
286       { 0x026f, 0x0167, 0 }
287     },
288     { "Na Halant Dha",
289       { 0x09a8, 0x09cd, 0x09a7, 0 },
290       { 0x01d3, 0 }
291     },
292     { "Na Halant ZWNJ Dha",
293       { 0x09a8, 0x09cd, 0x200c, 0x09a7, 0 },
294       { 0x0164, 0x017d, 0x0163, 0 }
295     },
296     { "Na Halant ZWJ Dha",
297       { 0x09a8, 0x09cd, 0x200d, 0x09a7, 0 },
298       { 0x026f, 0x0163, 0 }
299     },
300     { "Ra Halant Ka MatraAU",
301       { 0x09b0, 0x09cd, 0x0995, 0x09cc, 0 },
302       { 0x0179, 0x0151, 0x0276, 0x017e, 0 }
303     },
304     { "Ra Halant Ba Halant Ba",
305       { 0x09b0, 0x09cd, 0x09ac, 0x09cd, 0x09ac, 0 },
306       { 0x0232, 0x0276, 0 }
307     },
308     { "",
309       { 0x9b0, 0x9cd, 0x995, 0x9be, 0x982, 0 },
310       { 0x151, 0x276, 0x172, 0x143, 0 }
311     },
312     { "",
313       { 0x9b0, 0x9cd, 0x995, 0x9be, 0x983, 0 },
314       { 0x151, 0x276, 0x172, 0x144, 0 }
315     },
316     /*  Test decomposed two part matras */
317     { "",
318       { 0x995, 0x9c7, 0x9be, 0 },
319       { 0x179, 0x151, 0x172, 0 }
320     },
321     { "",
322       { 0x995, 0x9c7, 0x9d7, 0 },
323       { 0x179, 0x151, 0x17e, 0 }
324     },
325     { "",
326       { 0x9b0, 0x9cd, 0x9ad, 0 },
327       { 0x168, 0x276, 0 }
328     },
329     { "",
330       { 0x9f0, 0x9cd, 0x9ad, 0 },
331       { 0x168, 0x276, 0 }
332     },
333     { "",
334       { 0x9f1, 0x9cd, 0x9ad, 0 },
335       { 0x191, 0x17d, 0x168, 0 }
336     },
337     {{0}}
338   }
339 };
340
341 static const test_set_t tests_bengali_2 = {
342   {"MuktiNarrow.ttf", 0},
343   {
344     { "Ka",
345       { 0x0995, 0 },
346       { 0x0073, 0 }
347     },
348     { "Ka Halant",
349       { 0x0995, 0x09cd, 0 },
350       { 0x00b9, 0 }
351     },
352     { "Ka Halant Ka",
353       { 0x0995, 0x09cd, 0x0995, 0 },
354       { 0x0109, 0 }
355     },
356     { "Ka MatraI",
357       { 0x0995, 0x09bf, 0 },
358       { 0x0095, 0x0073, 0 }
359     },
360     { "Ra Halant Ka",
361       { 0x09b0, 0x09cd, 0x0995, 0 },
362       { 0x0073, 0x00e1, 0 }
363     },
364     { "Ra Halant Ka MatraI",
365       { 0x09b0, 0x09cd, 0x0995, 0x09bf, 0 },
366       { 0x0095, 0x0073, 0x00e1, 0 }
367     },
368     { "MatraI",
369       { 0x09bf, 0 },
370       { 0x0095, 0x01c8, 0 }
371     },
372     { "Ka Nukta",
373       { 0x0995, 0x09bc, 0 },
374       { 0x0073, 0x0093, 0 }
375     },
376     { "Ka Halant Ra",
377       { 0x0995, 0x09cd, 0x09b0, 0 },
378       { 0x00e5, 0 }
379     },
380     { "Ka Halant Ra Halant Ka",
381       { 0x995, 0x9cd, 0x9b0, 0x9cd, 0x995, 0 },
382       { 0x234, 0x24e, 0x73, 0 }
383     },
384     { "Ya + Halant",
385       { 0x09af, 0x09cd, 0 },
386       { 0x00d2, 0 }
387     },
388     { "Da Halant Ya -> Da Ya-Phala",
389       { 0x09a6, 0x09cd, 0x09af, 0 },
390       { 0x0084, 0x00e2, 0 }
391     },
392     { "A Halant Ya -> A Ya-phala",
393       { 0x0985, 0x09cd, 0x09af, 0 },
394       { 0x0067, 0x00e2, 0 }
395     },
396     { "Na Halant Ka",
397       { 0x09a8, 0x09cd, 0x0995, 0 },
398       { 0x0188, 0 }
399     },
400     { "Na Halant ZWNJ Ka",
401       { 0x9a8, 0x9cd, 0x200c, 0x995, 0 },
402       { 0xcc, 0x73, 0 }
403     },
404     { "Na Halant ZWJ Ka",
405       { 0x9a8, 0x9cd, 0x200d, 0x995, 0 },
406       { 0x247, 0x73, 0 }
407     },
408     { "Ka Halant ZWNJ Ka",
409       { 0x9a8, 0x9cd, 0x200d, 0x995, 0 },
410       { 0x247, 0x73, 0 }
411     },
412     { "Ka Halant ZWJ Ka",
413       { 0x9a8, 0x9cd, 0x200d, 0x995, 0 },
414       { 0x247, 0x73, 0 }
415     },
416     { "Na Halant Ra",
417       { 0x09a8, 0x09cd, 0x09b0, 0 },
418       { 0x00f8, 0 }
419     },
420     { "Na Halant ZWNJ Ra",
421       { 0x09a8, 0x09cd, 0x200c, 0x09b0, 0 },
422       { 0xcc, 0x8d, 0 }
423     },
424     { "Na Halant ZWJ Ra",
425       { 0x9a8, 0x9cd, 0x200d, 0x9b0, 0 },
426       { 0x247, 0x8d, 0 }
427     },
428     { "Na Halant Ba",
429       { 0x09a8, 0x09cd, 0x09ac, 0 },
430       { 0x0139, 0 }
431     },
432     { "Na Halant ZWNJ Ba",
433       { 0x9a8, 0x9cd, 0x200c, 0x9ac, 0 },
434       { 0xcc, 0x89, 0 }
435     },
436     { "Na Halant ZWJ Ba",
437       { 0x9a8, 0x9cd, 0x200d, 0x9ac, 0 },
438       { 0x247, 0x89, 0 }
439     },
440     { "Na Halant Dha",
441       { 0x09a8, 0x09cd, 0x09a7, 0 },
442       { 0x0145, 0 }
443     },
444     { "Na Halant ZWNJ Dha",
445       { 0x09a8, 0x09cd, 0x200c, 0x09a7, 0 },
446       { 0xcc, 0x85, 0 }
447     },
448     { "Na Halant ZWJ Dha",
449       { 0x09a8, 0x09cd, 0x200d, 0x09a7, 0 },
450       { 0x247, 0x85, 0 }
451     },
452     { "Ra Halant Ka MatraAU",
453       { 0x9b0, 0x9cd, 0x995, 0x9cc, 0 },
454       { 0x232, 0x73, 0xe1, 0xa0, 0 }
455     },
456     { "Ra Halant Ba Halant Ba",
457       { 0x09b0, 0x09cd, 0x09ac, 0x09cd, 0x09ac, 0 },
458       { 0x013b, 0x00e1, 0 }
459     },
460     {{0}}
461   }
462 };
463
464 static const test_set_t tests_bengali_3 = {
465   {"LikhanNormal.ttf", 0},
466   {
467     { "",
468       { 0x09a8, 0x09cd, 0x09af, 0 },
469       { 0x01ca, 0 }
470     },
471     { "",
472       { 0x09b8, 0x09cd, 0x09af, 0 },
473       { 0x020e, 0 }
474     },
475     { "",
476       { 0x09b6, 0x09cd, 0x09af, 0 },
477       { 0x01f4, 0 }
478     },
479     { "",
480       { 0x09b7, 0x09cd, 0x09af, 0 },
481       { 0x01fe, 0 }
482     },
483     { "",
484       { 0x09b0, 0x09cd, 0x09a8, 0x09cd, 0x200d, 0 },
485       { 0x10b, 0x167, 0 }
486     },
487     { "",
488       { 0x9b0, 0x9cd, 0x9ad, 0 },
489       { 0xa1, 0x167, 0 }
490     },
491     { "",
492       { 0x9f0, 0x9cd, 0x9ad, 0 },
493       { 0xa1, 0x167, 0 }
494     },
495     { "",
496       { 0x9f1, 0x9cd, 0x9ad, 0 },
497       { 0x11c, 0xa1, 0 }
498     },
499     {{0}}
500   }
501 };
502
503 static const test_set_t tests_gurmukhi = {
504   {"lohit_pa.ttf", 0},
505   {
506     { "",
507       { 0xA15, 0xA4D, 0xa39, 0 },
508       { 0x3b, 0x8b, 0 }
509     },
510     {{0}}
511   }
512 };
513
514 static const test_set_t tests_oriya = {
515   {"utkalm.ttf", 0},
516   {
517     { "",
518       { 0xb15, 0xb4d, 0xb24, 0xb4d, 0xb30, 0 },
519       { 0x150, 0x125, 0 }
520     },
521     { "",
522       { 0xb24, 0xb4d, 0xb24, 0xb4d, 0xb2c, 0 },
523       { 0x151, 0x120, 0 }
524     },
525     { "",
526       { 0xb28, 0xb4d, 0xb24, 0xb4d, 0xb2c, 0 },
527       { 0x152, 0x120, 0 }
528     },
529     { "",
530       { 0xb28, 0xb4d, 0xb24, 0xb4d, 0xb2c, 0 },
531       { 0x152, 0x120, 0 }
532     },
533     { "",
534       { 0xb28, 0xb4d, 0xb24, 0xb4d, 0xb30, 0 },
535       { 0x176, 0 }
536     },
537     { "",
538       { 0xb38, 0xb4d, 0xb24, 0xb4d, 0xb30, 0 },
539       { 0x177, 0 }
540     },
541     { "",
542       { 0xb28, 0xb4d, 0xb24, 0xb4d, 0xb30, 0xb4d, 0xb2f, 0 },
543       { 0x176, 0x124, 0 }
544     },
545     {{0}}
546   }
547 };
548
549 static const test_set_t tests_tamil = {
550   {"akruti1.ttf", 0},
551   {
552     { "",
553       { 0x0b95, 0x0bc2, 0 },
554       { 0x004e, 0 }
555     },
556     { "",
557       { 0x0bae, 0x0bc2, 0 },
558       { 0x009e, 0 }
559     },
560     { "",
561       { 0x0b9a, 0x0bc2, 0 },
562       { 0x0058, 0 }
563     },
564     { "",
565       { 0x0b99, 0x0bc2, 0 },
566       { 0x0053, 0 }
567     },
568     { "",
569       { 0x0bb0, 0x0bc2, 0 },
570       { 0x00a8, 0 }
571     },
572     { "",
573       { 0x0ba4, 0x0bc2, 0 },
574       { 0x008e, 0 }
575     },
576     { "",
577       { 0x0b9f, 0x0bc2, 0 },
578       { 0x0062, 0 }
579     },
580     { "",
581       { 0x0b95, 0x0bc6, 0 },
582       { 0x000a, 0x0031, 0 }
583     },
584     { "",
585       { 0x0b95, 0x0bca, 0 },
586       { 0x000a, 0x0031, 0x0007, 0 }
587     },
588     { "",
589       { 0x0b95, 0x0bc6, 0x0bbe, 0 },
590       { 0x000a, 0x0031, 0x007, 0 }
591     },
592     { "",
593       { 0x0b95, 0x0bcd, 0x0bb7, 0 },
594       { 0x0049, 0 }
595     },
596     { "",
597       { 0x0b95, 0x0bcd, 0x0bb7, 0x0bca, 0 },
598       { 0x000a, 0x0049, 0x007, 0 }
599     },
600     { "",
601       { 0x0b95, 0x0bcd, 0x0bb7, 0x0bc6, 0x0bbe, 0 },
602       { 0x000a, 0x0049, 0x007, 0 }
603     },
604     { "",
605       { 0x0b9f, 0x0bbf, 0 },
606       { 0x005f, 0 }
607     },
608     { "",
609       { 0x0b9f, 0x0bc0, 0 },
610       { 0x0060, 0 }
611     },
612     { "",
613       { 0x0bb2, 0x0bc0, 0 },
614       { 0x00ab, 0 }
615     },
616     { "",
617       { 0x0bb2, 0x0bbf, 0 },
618       { 0x00aa, 0 }
619     },
620     { "",
621       { 0x0bb0, 0x0bcd, 0 },
622       { 0x00a4, 0 }
623     },
624     { "",
625       { 0x0bb0, 0x0bbf, 0 },
626       { 0x00a5, 0 }
627     },
628     { "",
629       { 0x0bb0, 0x0bc0, 0 },
630       { 0x00a6, 0 }
631     },
632     { "",
633       { 0x0b83, 0 },
634       { 0x0025, 0 }
635     },
636     { "",
637       { 0x0b83, 0x0b95, 0 },
638       { 0x0025, 0x0031, 0 }
639     },
640     {{0}}
641   }
642 };
643
644 static const test_set_t tests_telugu = {
645   {"Pothana2000.ttf", 0},
646   {
647     { "",
648       { 0xc15, 0xc4d, 0 },
649       { 0xbb, 0 }
650     },
651     { "",
652       { 0xc15, 0xc4d, 0xc37, 0 },
653       { 0x4b, 0 }
654     },
655     { "",
656       { 0xc15, 0xc4d, 0xc37, 0xc4d, 0 },
657       { 0xe0, 0 }
658     },
659     { "",
660       { 0xc15, 0xc4d, 0xc37, 0xc4d, 0xc23, 0 },
661       { 0x4b, 0x91, 0 }
662     },
663     { "",
664       { 0xc15, 0xc4d, 0xc30, 0 },
665       { 0x5a, 0xb2, 0 }
666     },
667     { "",
668       { 0xc15, 0xc4d, 0xc30, 0xc4d, 0 },
669       { 0xbb, 0xb2, 0 }
670     },
671     { "",
672       { 0xc15, 0xc4d, 0xc30, 0xc4d, 0xc15, 0 },
673       { 0x5a, 0xb2, 0x83, 0 }
674     },
675     { "",
676       { 0xc15, 0xc4d, 0xc30, 0xc3f, 0 },
677       { 0xe2, 0xb2, 0 }
678     },
679     { "",
680       { 0xc15, 0xc4d, 0xc15, 0xc48, 0 },
681       { 0xe6, 0xb3, 0x83, 0 }
682     },
683     { "",
684       { 0xc15, 0xc4d, 0xc30, 0xc48, 0 },
685       { 0xe6, 0xb3, 0x9f, 0 }
686     },
687     { "",
688       { 0xc15, 0xc46, 0xc56, 0 },
689       { 0xe6, 0xb3, 0 }
690     },
691     {{0}}
692   }
693 };
694
695 static const test_set_t tests_kannada_1 = {
696   {"Sampige.ttf", 0},
697   {
698     { "",
699       { 0x0ca8, 0x0ccd, 0x0ca8, 0 },
700       { 0x0049, 0x00ba, 0 }
701     },
702     { "",
703       { 0x0ca8, 0x0ccd, 0x0ca1, 0 },
704       { 0x0049, 0x00b3, 0 }
705     },
706     { "",
707       { 0x0caf, 0x0cc2, 0 },
708       { 0x004f, 0x005d, 0 }
709     },
710     { "",
711       { 0x0ce0, 0 },
712       { 0x006a, 0 }
713     },
714     { "",
715       { 0x0ce6, 0x0ce7, 0x0ce8, 0 },
716       { 0x006b, 0x006c, 0x006d, 0 }
717     },
718     { "",
719       { 0x0cb5, 0x0ccb, 0 },
720       { 0x015f, 0x0067, 0 }
721     },
722     { "",
723       { 0x0cb0, 0x0ccd, 0x0cae, 0 },
724       { 0x004e, 0x0082, 0 }
725     },
726     { "",
727       { 0x0cb0, 0x0ccd, 0x0c95, 0 },
728       { 0x0036, 0x0082, 0 }
729     },
730     { "",
731       { 0x0c95, 0x0ccd, 0x0cb0, 0 },
732       { 0x0036, 0x00c1, 0 }
733     },
734     { "",
735       { 0x0cb0, 0x0ccd, 0x200d, 0x0c95, 0 },
736       { 0x0050, 0x00a7, 0 }
737     },
738     {{0}}
739   }
740 };
741
742 static const test_set_t tests_kannada_2 = {
743   {"tunga.ttf", 0},
744   {
745     { "",
746       { 0x0cb7, 0x0cc6, 0 },
747       { 0x00b0, 0x006c, 0 }
748     },
749     { "",
750       { 0x0cb7, 0x0ccd, 0 },
751       { 0x0163, 0 }
752     },
753     { "",
754       { 0xc95, 0xcbf, 0xcd5, 0 },
755       { 0x114, 0x73, 0 }
756     },
757     { "",
758       { 0xc95, 0xcc6, 0xcd5, 0 },
759       { 0x90, 0x6c, 0x73, 0 }
760     },
761     { "",
762       { 0xc95, 0xcc6, 0xcd6, 0 },
763       { 0x90, 0x6c, 0x74, 0 }
764     },
765     { "",
766       { 0xc95, 0xcc6, 0xcc2, 0 },
767       { 0x90, 0x6c, 0x69, 0 }
768     },
769     { "",
770       { 0xc95, 0xcca, 0xcd5, 0 },
771       { 0x90, 0x6c, 0x69, 0x73, 0 }
772     },
773     {{0}}
774   }
775 };
776
777 static const test_set_t tests_malayalam_1 = {
778   {"AkrutiMal2Normal.ttf", 0},
779   {
780     { "",
781       { 0x0d15, 0x0d46, 0 },
782       { 0x005e, 0x0034, 0 }
783     },
784     { "",
785       { 0x0d15, 0x0d47, 0 },
786       { 0x005f, 0x0034, 0 }
787     },
788     { "",
789       { 0x0d15, 0x0d4b, 0 },
790       { 0x005f, 0x0034, 0x0058, 0 }
791     },
792     { "",
793       { 0x0d15, 0x0d48, 0 },
794       { 0x0060, 0x0034, 0 }
795     },
796     { "",
797       { 0x0d15, 0x0d4a, 0 },
798       { 0x005e, 0x0034, 0x0058, 0 }
799     },
800     { "",
801       { 0x0d30, 0x0d4d, 0x0d15, 0 },
802       { 0x009e, 0x0034, 0 }
803     },
804     { "",
805       { 0x0d15, 0x0d4d, 0x0d35, 0 },
806       { 0x0034, 0x007a, 0 }
807     },
808     { "",
809       { 0x0d15, 0x0d4d, 0x0d2f, 0 },
810       { 0x0034, 0x00a2, 0 }
811     },
812     { "",
813       { 0x0d1f, 0x0d4d, 0x0d1f, 0 },
814       { 0x0069, 0 }
815     },
816     { "",
817       { 0x0d26, 0x0d4d, 0x0d26, 0 },
818       { 0x0074, 0 }
819     },
820     { "",
821       { 0x0d30, 0x0d4d, 0 },
822       { 0x009e, 0 }
823     },
824     { "",
825       { 0x0d30, 0x0d4d, 0x200c, 0 },
826       { 0x009e, 0 }
827     },
828     { "",
829       { 0x0d30, 0x0d4d, 0x200d, 0 },
830       { 0x009e, 0 }
831     },
832     { "",
833       { 0xd15, 0xd46, 0xd3e, 0 },
834       { 0x5e, 0x34, 0x58, 0 }
835     },
836     { "",
837       { 0xd15, 0xd47, 0xd3e, 0 },
838       { 0x5f, 0x34, 0x58, 0 }
839     },
840     { "",
841       { 0xd15, 0xd46, 0xd57, 0 },
842       { 0x5e, 0x34, 0x65, 0 }
843     },
844     { "",
845       { 0xd15, 0xd57, 0 },
846       { 0x34, 0x65, 0 }
847     },
848     { "",
849       { 0xd1f, 0xd4d, 0xd1f, 0xd41, 0xd4d, 0 },
850       { 0x69, 0x5b, 0x64, 0 }
851     },
852
853     {{0}}
854   }
855 };
856
857 static const test_set_t tests_malayalam_2 = {
858   {"Rachana.ttf", 0},
859   {
860     { "",
861       { 0xd37, 0xd4d, 0xd1f, 0xd4d, 0xd30, 0xd40, 0 },
862       { 0x385, 0xa3, 0 }
863     },
864     { "",
865       { 0xd2f, 0xd4d, 0xd15, 0xd4d, 0xd15, 0xd41, 0 },
866       { 0x2ff, 0 }
867     },
868     { "",
869       { 0xd33, 0xd4d, 0xd33, 0 },
870       { 0x3f8, 0 }
871     },
872     { "",
873       { 0xd2f, 0xd4d, 0xd15, 0xd4d, 0xd15, 0xd41, 0 },
874       { 0x2ff, 0 }
875     },
876     { "",
877       { 0xd30, 0xd4d, 0x200d, 0xd35, 0xd4d, 0xd35, 0 },
878       { 0xf3, 0x350, 0 }
879     },
880
881     {{0}}
882   }
883 };
884
885 static const test_set_t tests_sinhala = {
886   {"FM-MalithiUW46.ttf", 0},
887   {
888     { "",
889       { 0xd9a, 0xdd9, 0xdcf, 0 },
890       { 0x4a, 0x61, 0x42, 0 }
891     },
892     { "",
893       { 0xd9a, 0xdd9, 0xddf, 0 },
894       { 0x4a, 0x61, 0x50, 0 }
895     },
896     { "",
897       { 0xd9a, 0xdd9, 0xdca, 0 },
898       { 0x4a, 0x62, 0 }
899     },
900     { "",
901       { 0xd9a, 0xddc, 0xdca, 0 },
902       { 0x4a, 0x61, 0x42, 0x41, 0 }
903     },
904     { "",
905       { 0xd9a, 0xdda, 0 },
906       { 0x4a, 0x62, 0 }
907     },
908     { "",
909       { 0xd9a, 0xddd, 0 },
910       { 0x4a, 0x61, 0x42, 0x41, 0 }
911     },
912     {{0}}
913   }
914 };
915
916 static const test_set_t tests_khmer = {
917   {"KhmerOS.ttf", 0},
918   {
919     { "",
920       { 0x179a, 0x17cd, 0 },
921       { 0x24c, 0x27f, 0 }
922     },
923     { "",
924       { 0x179f, 0x17c5, 0 },
925       { 0x273, 0x203, 0 }
926     },
927     { "",
928       { 0x1790, 0x17d2, 0x1784, 0x17c3, 0 },
929       { 0x275, 0x242, 0x182, 0 }
930     },
931     { "",
932       { 0x179a, 0 },
933       { 0x24c, 0 }
934     },
935     { "",
936       { 0x1781, 0x17d2, 0x1798, 0x17c2, 0 },
937       { 0x274, 0x233, 0x197, 0 }
938     },
939     { "",
940       { 0x1798, 0x17b6, 0 },
941       { 0x1cb, 0 }
942     },
943     { "",
944       { 0x179a, 0x17b8, 0 },
945       { 0x24c, 0x26a, 0 }
946     },
947     { "",
948       { 0x1787, 0x17b6, 0 },
949       { 0x1ba, 0 }
950     },
951     { "",
952       { 0x1798, 0x17d2, 0x1796, 0x17bb, 0 },
953       { 0x24a, 0x195, 0x26d, 0 }
954     },
955     {{0}}
956   }
957 };
958
959 static const test_set_t tests_nko = {
960   {"DejaVuSans.ttf", 0},
961   {
962     { "",
963       { 0x7ca, 0 },
964       { 0x5c1, 0 }
965     },
966     { "",
967       { 0x7ca, 0x7ca, 0 },
968       { 0x14db, 0x14d9, 0 }
969     },
970     { "",
971       { 0x7ca, 0x7fa, 0x7ca, 0 },
972       { 0x14db, 0x5ec, 0x14d9, 0 }
973     },
974     { "",
975       { 0x7ca, 0x7f3, 0x7ca, 0 },
976       { 0x14db, 0x5e7, 0x14d9, 0 }
977     },
978     { "",
979       { 0x7ca, 0x7f3, 0x7fa, 0x7ca, 0 },
980       { 0x14db, 0x5e7, 0x5ec, 0x14d9, 0 }
981     },
982     {{0}}
983   }
984 };
985
986 static const test_set_t tests_linearb = {
987   {"penuture.ttf", 0},
988   {
989     { "",
990       { 0xd800, 0xdc01, 0xd800, 0xdc02, 0xd800, 0xdc03,  0 },
991       { 0x5, 0x6, 0x7, 0 },
992     },
993     {{0}}
994   }
995 };
996
997
998
999 typedef struct {
1000   FT_Library ft_library;
1001   FT_Face ft_face;
1002   hb_font_t *font;
1003 } ft_fixture_t;
1004
1005 static void
1006 ft_fixture_init (ft_fixture_t *f, gconstpointer user_data)
1007 {
1008   const test_set_t *test = user_data;
1009   char *font_file = g_strdup_printf ("%s/fonts/%s", srcdir (), test->font_data.font_file);
1010
1011   FT_Init_FreeType (&f->ft_library);
1012
1013   if (FT_New_Face (f->ft_library, font_file, test->font_data.face_index, &f->ft_face))
1014     g_test_message ("Font file %s not found.  Skipping test.", font_file);
1015   else
1016     f->font = hb_ft_font_create (f->ft_face, NULL);
1017
1018   g_free (font_file);
1019 }
1020
1021 static void
1022 ft_fixture_finish (ft_fixture_t *f, gconstpointer user_data)
1023 {
1024   hb_font_destroy (f->font);
1025
1026   FT_Done_Face (f->ft_face);
1027   FT_Done_FreeType (f->ft_library);
1028 }
1029
1030 static void
1031 test_shape_complex (ft_fixture_t *f, gconstpointer user_data)
1032 {
1033   const test_set_t *test_set = user_data;
1034   const test_data_t *data;
1035
1036   if (!f->font)
1037     return; /* Skip test */
1038
1039   for (data = test_set->tests; data->characters[0]; data++) {
1040     hb_buffer_t *buffer;
1041     unsigned int i, len, expected_len;
1042     hb_glyph_info_t *glyphs;
1043
1044     if (data->comments[0])
1045       g_test_message ("Test comments: %s", data->comments);
1046
1047     buffer =  hb_buffer_create (0);
1048     for (len = 0; data->characters[len]; len++) ;
1049     hb_buffer_add_utf32 (buffer, data->characters, len, 0, len);
1050
1051     hb_shape (f->font, buffer, NULL, 0);
1052
1053     for (len = 0; data->glyphs[len]; len++) ;
1054     expected_len = len;
1055
1056     glyphs = hb_buffer_get_glyph_infos (buffer, &len);
1057     g_assert_cmpint (len, ==, expected_len);
1058     for (i = 0; i < len; i++)
1059       g_assert_cmphex (glyphs[i].codepoint, ==, data->glyphs[i]);
1060
1061     hb_buffer_destroy (buffer);
1062   }
1063 }
1064
1065
1066
1067
1068 int
1069 main (int argc, char **argv)
1070 {
1071   hb_test_init (&argc, &argv);
1072
1073 #define TEST_SET(name) hb_test_add_fixture_flavor (ft_fixture, (const void *) &tests_##name, #name, test_shape_complex)
1074
1075   TEST_SET (greek);
1076
1077   TEST_SET (devanagari_1);
1078   TEST_SET (devanagari_2);
1079   TEST_SET (bengali_1);
1080   TEST_SET (bengali_2);
1081   TEST_SET (bengali_3);
1082   TEST_SET (gurmukhi);
1083   TEST_SET (oriya);
1084   TEST_SET (tamil);
1085   TEST_SET (telugu);
1086   TEST_SET (kannada_1);
1087   TEST_SET (kannada_2);
1088   TEST_SET (malayalam_1);
1089   TEST_SET (malayalam_2);
1090   TEST_SET (sinhala);
1091
1092   TEST_SET (khmer);
1093
1094   TEST_SET (nko);
1095   TEST_SET (linearb);
1096
1097   return hb_test_run();
1098 }