247c5b1fcb11b4cd75ebb33eaf8bc030604faee4
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / platform / fonts / FontTest.cpp
1 /*
2  * Copyright (C) 2013 Google Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
18  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 // Tests for the Font class.
27
28 #include "config.h"
29
30 #include "platform/fonts/Font.h"
31
32 #include <gtest/gtest.h>
33
34 namespace WebCore {
35
36 static void TestSpecificUCharRange(UChar rangeStart, UChar rangeEnd)
37 {
38     UChar below[1];
39     UChar start[1];
40     UChar midway[1];
41     UChar end[1];
42     UChar above[1];
43
44     below[0] = rangeStart - 1;
45     start[0] = rangeStart;
46     midway[0] = ((int)rangeStart + (int)rangeEnd) / 2;
47     end[0] = rangeEnd;
48     above[0] = rangeEnd + 1;
49
50     EXPECT_EQ(SimplePath, Font::characterRangeCodePath(below, 1));
51     EXPECT_EQ(ComplexPath, Font::characterRangeCodePath(start, 1));
52     EXPECT_EQ(ComplexPath, Font::characterRangeCodePath(midway, 1));
53     EXPECT_EQ(ComplexPath, Font::characterRangeCodePath(end, 1));
54     EXPECT_EQ(SimplePath, Font::characterRangeCodePath(above, 1));
55 }
56
57 TEST(FontTest, TestCharacterRangeCodePath)
58 {
59     static UChar c1[] = { 0x0 };
60     EXPECT_EQ(SimplePath, Font::characterRangeCodePath(c1, 1));
61
62     TestSpecificUCharRange(0x2E5, 0x2E9);
63     TestSpecificUCharRange(0x300, 0x36F);
64     TestSpecificUCharRange(0x0591, 0x05BD);
65     TestSpecificUCharRange(0x05BF, 0x05CF);
66     TestSpecificUCharRange(0x0600, 0x109F);
67     TestSpecificUCharRange(0x1100, 0x11FF);
68     TestSpecificUCharRange(0x135D, 0x135F);
69     TestSpecificUCharRange(0x1700, 0x18AF);
70     TestSpecificUCharRange(0x1900, 0x194F);
71     TestSpecificUCharRange(0x1980, 0x19DF);
72     TestSpecificUCharRange(0x1A00, 0x1CFF);
73
74     static UChar c2[] = { 0x1DBF };
75     EXPECT_EQ(SimplePath, Font::characterRangeCodePath(c2, 1));
76     static UChar c3[] = { 0x1DC0 };
77     EXPECT_EQ(ComplexPath, Font::characterRangeCodePath(c3, 1));
78     static UChar c4[] = { 0x1DD0 };
79     EXPECT_EQ(ComplexPath, Font::characterRangeCodePath(c4, 1));
80     static UChar c5[] = { 0x1DFF };
81     EXPECT_EQ(ComplexPath, Font::characterRangeCodePath(c5, 1));
82     static UChar c6[] = { 0x1E00 };
83     EXPECT_EQ(SimpleWithGlyphOverflowPath, Font::characterRangeCodePath(c6, 1));
84     static UChar c7[] = { 0x2000 };
85     EXPECT_EQ(SimpleWithGlyphOverflowPath, Font::characterRangeCodePath(c7, 1));
86     static UChar c8[] = { 0x2001 };
87     EXPECT_EQ(SimplePath, Font::characterRangeCodePath(c8, 1));
88
89     TestSpecificUCharRange(0x20D0, 0x20FF);
90     TestSpecificUCharRange(0x2CEF, 0x2CF1);
91     TestSpecificUCharRange(0x302A, 0x302F);
92
93     TestSpecificUCharRange(0xA67C, 0xA67D);
94     TestSpecificUCharRange(0xA6F0, 0xA6F1);
95     TestSpecificUCharRange(0xA800, 0xABFF);
96
97     TestSpecificUCharRange(0xD7B0, 0xD7FF);
98     TestSpecificUCharRange(0xFE00, 0xFE0F);
99     TestSpecificUCharRange(0xFE20, 0xFE2F);
100 }
101
102 TEST(FontTest, TestCharacterRangeCodePathSurrogate1)
103 {
104     /* To be surrogate ... */
105     /* 1st character must be 0xD800 .. 0xDBFF */
106     /* 2nd character must be 0xdc00 .. 0xdfff */
107
108     /* The following 5 should all be Simple because they are not surrogate. */
109     static UChar c1[] = { 0xD800, 0xDBFE };
110     EXPECT_EQ(SimplePath, Font::characterRangeCodePath(c1, 2));
111     static UChar c2[] = { 0xD800, 0xE000 };
112     EXPECT_EQ(SimplePath, Font::characterRangeCodePath(c2, 2));
113     static UChar c3[] = { 0xDBFF, 0xDBFE };
114     EXPECT_EQ(SimplePath, Font::characterRangeCodePath(c3, 2));
115     static UChar c4[] = { 0xDBFF, 0xE000 };
116     EXPECT_EQ(SimplePath, Font::characterRangeCodePath(c4, 2));
117     static UChar c5[] = { 0xDC00, 0xDBFF };
118     EXPECT_EQ(SimplePath, Font::characterRangeCodePath(c5, 2));
119
120     /* To be Complex, the Supplementary Character must be in either */
121     /* U+1F1E6 through U+1F1FF or U+E0100 through U+E01EF. */
122     /* That is, a lead of 0xD83C with trail 0xDDE6 .. 0xDDFF or */
123     /* a lead of 0xDB40 with trail 0xDD00 .. 0xDDEF. */
124     static UChar c6[] = { 0xD83C, 0xDDE5 };
125     EXPECT_EQ(SimplePath, Font::characterRangeCodePath(c6, 2));
126     static UChar c7[] = { 0xD83C, 0xDDE6 };
127     EXPECT_EQ(ComplexPath, Font::characterRangeCodePath(c7, 2));
128     static UChar c8[] = { 0xD83C, 0xDDF0 };
129     EXPECT_EQ(ComplexPath, Font::characterRangeCodePath(c8, 2));
130     static UChar c9[] = { 0xD83C, 0xDDFF };
131     EXPECT_EQ(ComplexPath, Font::characterRangeCodePath(c9, 2));
132     static UChar c10[] = { 0xD83C, 0xDE00 };
133     EXPECT_EQ(SimplePath, Font::characterRangeCodePath(c10, 2));
134
135     static UChar c11[] = { 0xDB40, 0xDCFF };
136     EXPECT_EQ(SimplePath, Font::characterRangeCodePath(c11, 2));
137     static UChar c12[] = { 0xDB40, 0xDD00 };
138     EXPECT_EQ(ComplexPath, Font::characterRangeCodePath(c12, 2));
139     static UChar c13[] = { 0xDB40, 0xDDED };
140     EXPECT_EQ(ComplexPath, Font::characterRangeCodePath(c13, 2));
141     static UChar c14[] = { 0xDB40, 0xDDEF };
142     EXPECT_EQ(ComplexPath, Font::characterRangeCodePath(c14, 2));
143     static UChar c15[] = { 0xDB40, 0xDDF0 };
144     EXPECT_EQ(SimplePath, Font::characterRangeCodePath(c15, 2));
145 }
146
147 TEST(FontTest, TestCharacterRangeCodePathString)
148 {
149     // Simple-Simple is still simple
150     static UChar c1[] = { 0x2FF, 0x2FF };
151     EXPECT_EQ(SimplePath, Font::characterRangeCodePath(c1, 2));
152     // Complex-Simple is Complex
153     static UChar c2[] = { 0x300, 0x2FF };
154     EXPECT_EQ(ComplexPath, Font::characterRangeCodePath(c2, 2));
155     // Simple-Complex is Complex
156     static UChar c3[] = { 0x2FF, 0x330 };
157     EXPECT_EQ(ComplexPath, Font::characterRangeCodePath(c3, 2));
158     // Complex-Complex is Complex
159     static UChar c4[] = { 0x36F, 0x330 };
160     EXPECT_EQ(ComplexPath, Font::characterRangeCodePath(c4, 2));
161     // SimpleWithGlyphOverflow-Simple is SimpleWithGlyphOverflow
162     static UChar c5[] = { 0x1E00, 0x2FF };
163     EXPECT_EQ(SimpleWithGlyphOverflowPath, Font::characterRangeCodePath(c5, 2));
164     // Simple-SimpleWithGlyphOverflow is SimpleWithGlyphOverflow
165     static UChar c6[] = { 0x2FF, 0x2000 };
166     EXPECT_EQ(SimpleWithGlyphOverflowPath, Font::characterRangeCodePath(c6, 2));
167     // SimpleWithGlyphOverflow-Complex is Complex
168     static UChar c7[] = { 0x1E00, 0x330 };
169     EXPECT_EQ(ComplexPath, Font::characterRangeCodePath(c7, 2));
170     // Complex-SimpleWithGlyphOverflow is Complex
171     static UChar c8[] = { 0x330, 0x2000 };
172     EXPECT_EQ(ComplexPath, Font::characterRangeCodePath(c8, 2));
173     // Surrogate-Complex is Complex
174     static UChar c9[] = { 0xD83C, 0xDDE5, 0x330 };
175     EXPECT_EQ(ComplexPath, Font::characterRangeCodePath(c9, 3));
176     // Complex-Surrogate is Complex
177     static UChar c10[] = { 0x330, 0xD83C, 0xDDE5 };
178     EXPECT_EQ(ComplexPath, Font::characterRangeCodePath(c10, 3));
179 }
180
181 static void TestSpecificUChar32RangeIdeograph(UChar32 rangeStart, UChar32 rangeEnd)
182 {
183     EXPECT_FALSE(Font::isCJKIdeograph(rangeStart - 1));
184     EXPECT_TRUE(Font::isCJKIdeograph(rangeStart));
185     EXPECT_TRUE(Font::isCJKIdeograph((UChar32)((uint64_t)rangeStart + (uint64_t)rangeEnd) / 2));
186     EXPECT_TRUE(Font::isCJKIdeograph(rangeEnd));
187     EXPECT_FALSE(Font::isCJKIdeograph(rangeEnd + 1));
188 }
189
190 TEST(FontTest, TestIsCJKIdeograph)
191 {
192     // The basic CJK Unified Ideographs block.
193     TestSpecificUChar32RangeIdeograph(0x4E00, 0x9FFF);
194     // CJK Unified Ideographs Extension A.
195     TestSpecificUChar32RangeIdeograph(0x3400, 0x4DBF);
196     // CJK Unified Ideographs Extension A and Kangxi Radicals.
197     TestSpecificUChar32RangeIdeograph(0x2E80, 0x2FDF);
198     // CJK Strokes.
199     TestSpecificUChar32RangeIdeograph(0x31C0, 0x31EF);
200     // CJK Compatibility Ideographs.
201     TestSpecificUChar32RangeIdeograph(0xF900, 0xFAFF);
202     // CJK Unified Ideographs Extension B.
203     TestSpecificUChar32RangeIdeograph(0x20000, 0x2A6DF);
204     // CJK Unified Ideographs Extension C.
205     // CJK Unified Ideographs Extension D.
206     TestSpecificUChar32RangeIdeograph(0x2A700, 0x2B81F);
207     // CJK Compatibility Ideographs Supplement.
208     TestSpecificUChar32RangeIdeograph(0x2F800, 0x2FA1F);
209 }
210
211 static void TestSpecificUChar32RangeIdeographSymbol(UChar32 rangeStart, UChar32 rangeEnd)
212 {
213     EXPECT_FALSE(Font::isCJKIdeographOrSymbol(rangeStart - 1));
214     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(rangeStart));
215     EXPECT_TRUE(Font::isCJKIdeographOrSymbol((UChar32)((uint64_t)rangeStart + (uint64_t)rangeEnd) / 2));
216     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(rangeEnd));
217     EXPECT_FALSE(Font::isCJKIdeographOrSymbol(rangeEnd + 1));
218 }
219
220 TEST(FontTest, TestIsCJKIdeographOrSymbol)
221 {
222     // CJK Compatibility Ideographs Supplement.
223     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2C7));
224     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2CA));
225     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2CB));
226     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2D9));
227
228     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2020));
229     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2021));
230     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2030));
231     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x203B));
232     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x203C));
233     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2042));
234     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2047));
235     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2048));
236     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2049));
237     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2051));
238     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x20DD));
239     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x20DE));
240     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2100));
241     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2103));
242     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2105));
243     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2109));
244     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x210A));
245     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2113));
246     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2116));
247     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2121));
248     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x212B));
249     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x213B));
250     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2150));
251     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2151));
252     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2152));
253
254     TestSpecificUChar32RangeIdeographSymbol(0x2156, 0x215A);
255     TestSpecificUChar32RangeIdeographSymbol(0x2160, 0x216B);
256     TestSpecificUChar32RangeIdeographSymbol(0x2170, 0x217B);
257
258     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x217F));
259     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2189));
260     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2307));
261     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2312));
262
263     EXPECT_FALSE(Font::isCJKIdeographOrSymbol(0x23BD));
264     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x23BE));
265     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x23C4));
266     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x23CC));
267     EXPECT_FALSE(Font::isCJKIdeographOrSymbol(0x23CD));
268     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x23CE));
269     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2423));
270
271     TestSpecificUChar32RangeIdeographSymbol(0x2460, 0x2492);
272     TestSpecificUChar32RangeIdeographSymbol(0x249C, 0x24FF);
273
274     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x25A0));
275     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x25A1));
276     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x25A2));
277     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x25AA));
278     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x25AB));
279     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x25B1));
280     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x25B2));
281     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x25B3));
282     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x25B6));
283     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x25B7));
284     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x25BC));
285     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x25BD));
286     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x25C0));
287     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x25C1));
288     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x25C6));
289     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x25C7));
290     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x25C9));
291     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x25CB));
292     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x25CC));
293
294     TestSpecificUChar32RangeIdeographSymbol(0x25CE, 0x25D3);
295     TestSpecificUChar32RangeIdeographSymbol(0x25E2, 0x25E6);
296
297     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x25EF));
298
299     TestSpecificUChar32RangeIdeographSymbol(0x2600, 0x2603);
300
301     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2605));
302     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2606));
303     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x260E));
304     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2616));
305     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2617));
306     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2640));
307     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2642));
308
309     TestSpecificUChar32RangeIdeographSymbol(0x2660, 0x266F);
310     TestSpecificUChar32RangeIdeographSymbol(0x2672, 0x267D);
311
312     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x26A0));
313     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x26BD));
314     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x26BE));
315     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2713));
316     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x271A));
317     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x273F));
318     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2740));
319     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2756));
320
321     TestSpecificUChar32RangeIdeographSymbol(0x2776, 0x277F);
322
323     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x2B1A));
324
325     TestSpecificUChar32RangeIdeographSymbol(0x2FF0, 0x302F);
326     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x3031));
327     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x312F));
328     EXPECT_FALSE(Font::isCJKIdeographOrSymbol(0x3130));
329
330     EXPECT_FALSE(Font::isCJKIdeographOrSymbol(0x318F));
331     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x3190));
332     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x319F));
333     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x31BF));
334
335     EXPECT_FALSE(Font::isCJKIdeographOrSymbol(0x31FF));
336     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x3200));
337     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x3300));
338     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x33FF));
339
340     TestSpecificUChar32RangeIdeographSymbol(0xF860, 0xF862);
341     TestSpecificUChar32RangeIdeographSymbol(0xFE30, 0xFE4F);
342
343     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0xFE10));
344     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0xFE11));
345     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0xFE12));
346     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0xFE19));
347
348     EXPECT_FALSE(Font::isCJKIdeographOrSymbol(0xFF0D));
349     EXPECT_FALSE(Font::isCJKIdeographOrSymbol(0xFF1B));
350     EXPECT_FALSE(Font::isCJKIdeographOrSymbol(0xFF1C));
351     EXPECT_FALSE(Font::isCJKIdeographOrSymbol(0xFF1E));
352
353     TestSpecificUChar32RangeIdeographSymbol(0xFF00, 0xFFEF);
354
355     EXPECT_TRUE(Font::isCJKIdeographOrSymbol(0x1F100));
356
357     TestSpecificUChar32RangeIdeographSymbol(0x1F110, 0x1F129);
358     TestSpecificUChar32RangeIdeographSymbol(0x1F130, 0x1F149);
359     TestSpecificUChar32RangeIdeographSymbol(0x1F150, 0x1F169);
360     TestSpecificUChar32RangeIdeographSymbol(0x1F170, 0x1F189);
361     TestSpecificUChar32RangeIdeographSymbol(0x1F200, 0x1F6FF);
362 }
363
364 } // namespace WebCore
365