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