1 /**
2  * test-symbol.c
3  *
4  * Copyright (c) 2012
5  *      libchewing Core Team. See ChangeLog for details.
6  *
7  * See the file "COPYING" for information on usage and redistribution
8  * of this file.
9  */
10 
11 #ifdef HAVE_CONFIG_H
12 #    include <config.h>
13 #endif
14 
15 #include <assert.h>
16 #include <stdlib.h>
17 #include <string.h>
18 
19 #include "chewing.h"
20 #include "testhelper.h"
21 
22 static const TestData SYMBOL[] = {
23     {"`1<E>", "\xE2\x80\xA6" /* … */ },
24     {"`2<E>", "\xE2\x80\xBB" /* ※ */ },
25     {"`31<E>", "\xEF\xBC\x8C" /* , */ },
26     {"`32<E>", "\xE3\x80\x81" /* 、 */ },
27     {"`33<E>", "\xE3\x80\x82" /* 。 */ },
28     {"`34<E>", "\xEF\xBC\x8E" /* . */ },
29     {"`35<E>", "\xEF\xBC\x9F" /* ? */ },
30     {"`36<E>", "\xEF\xBC\x81" /* ! */ },
31     {"`37<E>", "\xEF\xBC\x9B" /* ; */ },
32     {"`38<E>", "\xEF\xB8\xB0" /* ︰ */ },
33     {"`39<E>", "\xE2\x80\xA7" /* ‧ */ },
34     {"`30<E>", "\xE2\x80\xA5" /* ‥ */ },
35     {"`3<R>1<E>", "\xEF\xB9\x90" /* ﹐ */ },
36     {"`3<R>2<E>", "\xEF\xB9\x92" /* ﹒ */ },
37     {"`3<R>3<E>", "\xCB\x99" /* ˙ */ },
38     {"`3<R>4<E>", "\xC2\xB7" /* · */ },
39     {"`3<R>5<E>", "\xE2\x80\x98" /* ‘ */ },
40     {"`3<R>6<E>", "\xE2\x80\x99" /* ’ */ },
41     {"`3<R>7<E>", "\xE2\x80\x9C" /* “ */ },
42     {"`3<R>8<E>", "\xE2\x80\x9D" /* ” */ },
43     {"`3<R>9<E>", "\xE3\x80\x9D" /* 〝 */ },
44     {"`3<R>0<E>", "\xE3\x80\x9E" /* 〞 */ },
45     {"`3<R><R>1<E>", "\xE2\x80\xB5" /* ‵ */ },
46     {"`3<R><R>2<E>", "\xE2\x80\xB2" /* ′ */ },
47     {"`3<R><R>3<E>", "\xE3\x80\x83" /* 〃 */ },
48     {"`3<R><R>4<E>", "\xEF\xBD\x9E" /* ~ */ },
49     {"`3<R><R>5<E>", "\xEF\xBC\x84" /* $ */ },
50     {"`3<R><R>6<E>", "\xEF\xBC\x85" /* % */ },
51     {"`3<R><R>7<E>", "\xEF\xBC\xA0" /* @ */ },
52     {"`3<R><R>8<E>", "\xEF\xBC\x86" /* & */ },
53     {"`3<R><R>9<E>", "\xEF\xBC\x83" /* # */ },
54     {"`3<R><R>0<E>", "\xEF\xBC\x8A" /* * */ },
55     {"`41<E>", "\xEF\xBC\x88" /* ( */ },
56     {"`42<E>", "\xEF\xBC\x89" /* ) */ },
57     {"`43<E>", "\xE3\x80\x8C" /* 「 */ },
58     {"`44<E>", "\xE3\x80\x8D" /* 」 */ },
59     {"`45<E>", "\xE3\x80\x94" /* 〔 */ },
60     {"`46<E>", "\xE3\x80\x95" /* 〕 */ },
61     {"`47<E>", "\xEF\xBD\x9B" /* { */ },
62     {"`48<E>", "\xEF\xBD\x9D" /* } */ },
63     {"`49<E>", "\xE3\x80\x88" /* 〈 */ },
64     {"`40<E>", "\xE3\x80\x89" /* 〉 */ },
65     {"`4<R>1<E>", "\xE3\x80\x8E" /* 『 */ },
66     {"`4<R>2<E>", "\xE3\x80\x8F" /* 』 */ },
67     {"`4<R>3<E>", "\xE3\x80\x8A" /* 《 */ },
68     {"`4<R>4<E>", "\xE3\x80\x8B" /* 》 */ },
69     {"`4<R>5<E>", "\xE3\x80\x90" /* 【 */ },
70     {"`4<R>6<E>", "\xE3\x80\x91" /* 】 */ },
71     {"`4<R>7<E>", "\xEF\xB9\x99" /* ﹙ */ },
72     {"`4<R>8<E>", "\xEF\xB9\x9A" /* ﹚ */ },
73     {"`4<R>9<E>", "\xEF\xB9\x9D" /* ﹝ */ },
74     {"`4<R>0<E>", "\xEF\xB9\x9E" /* ﹞ */ },
75     {"`4<R><R>1<E>", "\xEF\xB9\x9B" /* ﹛ */ },
76     {"`4<R><R>2<E>", "\xEF\xB9\x9C" /* ﹜ */ },
77     {"`51<E>", "\xEF\xB8\xB5" /* ︵ */ },
78     {"`52<E>", "\xEF\xB8\xB6" /* ︶ */ },
79     {"`53<E>", "\xEF\xB9\x81" /* ﹁ */ },
80     {"`54<E>", "\xEF\xB9\x82" /* ﹂ */ },
81     {"`55<E>", "\xEF\xB8\xB9" /* ︹ */ },
82     {"`56<E>", "\xEF\xB8\xBA" /* ︺ */ },
83     {"`57<E>", "\xEF\xB8\xB7" /* ︷ */ },
84     {"`58<E>", "\xEF\xB8\xB8" /* ︸ */ },
85     {"`59<E>", "\xEF\xB8\xBF" /* ︿ */ },
86     {"`50<E>", "\xEF\xB9\x80" /* ﹀ */ },
87     {"`5<R>1<E>", "\xEF\xB9\x83" /* ﹃ */ },
88     {"`5<R>2<E>", "\xEF\xB9\x84" /* ﹄ */ },
89     {"`5<R>3<E>", "\xEF\xB8\xBD" /* ︽ */ },
90     {"`5<R>4<E>", "\xEF\xB8\xBE" /* ︾ */ },
91     {"`5<R>5<E>", "\xEF\xB8\xBB" /* ︻ */ },
92     {"`5<R>6<E>", "\xEF\xB8\xBC" /* ︼ */ },
93     {"`61<E>", "\xCE\xB1" /* α */ },
94     {"`62<E>", "\xCE\xB2" /* β */ },
95     {"`63<E>", "\xCE\xB3" /* γ */ },
96     {"`64<E>", "\xCE\xB4" /* δ */ },
97     {"`65<E>", "\xCE\xB5" /* ε */ },
98     {"`66<E>", "\xCE\xB6" /* ζ */ },
99     {"`67<E>", "\xCE\xB7" /* η */ },
100     {"`68<E>", "\xCE\xB8" /* θ */ },
101     {"`69<E>", "\xCE\xB9" /* ι */ },
102     {"`60<E>", "\xCE\xBA" /* κ */ },
103     {"`6<R>1<E>", "\xCE\xBB" /* λ */ },
104     {"`6<R>2<E>", "\xCE\xBC" /* μ */ },
105     {"`6<R>3<E>", "\xCE\xBD" /* ν */ },
106     {"`6<R>4<E>", "\xCE\xBE" /* ξ */ },
107     {"`6<R>5<E>", "\xCE\xBF" /* ο */ },
108     {"`6<R>6<E>", "\xCF\x80" /* π */ },
109     {"`6<R>7<E>", "\xCF\x81" /* ρ */ },
110     {"`6<R>8<E>", "\xCF\x83" /* σ */ },
111     {"`6<R>9<E>", "\xCF\x84" /* τ */ },
112     {"`6<R>0<E>", "\xCF\x85" /* υ */ },
113     {"`6<R><R>1<E>", "\xCF\x86" /* φ */ },
114     {"`6<R><R>2<E>", "\xCF\x87" /* χ */ },
115     {"`6<R><R>3<E>", "\xCF\x88" /* ψ */ },
116     {"`6<R><R>4<E>", "\xCF\x89" /* ω */ },
117     {"`6<R><R>5<E>", "\xCE\x91" /* Α */ },
118     {"`6<R><R>6<E>", "\xCE\x92" /* Β */ },
119     {"`6<R><R>7<E>", "\xCE\x93" /* Γ */ },
120     {"`6<R><R>8<E>", "\xCE\x94" /* Δ */ },
121     {"`6<R><R>9<E>", "\xCE\x95" /* Ε */ },
122     {"`6<R><R>0<E>", "\xCE\x96" /* Ζ */ },
123     {"`6<R><R><R>1<E>", "\xCE\x97" /* Η */ },
124     {"`6<R><R><R>2<E>", "\xCE\x98" /* Θ */ },
125     {"`6<R><R><R>3<E>", "\xCE\x99" /* Ι */ },
126     {"`6<R><R><R>4<E>", "\xCE\x9A" /* Κ */ },
127     {"`6<R><R><R>5<E>", "\xCE\x9B" /* Λ */ },
128     {"`6<R><R><R>6<E>", "\xCE\x9C" /* Μ */ },
129     {"`6<R><R><R>7<E>", "\xCE\x9D" /* Ν */ },
130     {"`6<R><R><R>8<E>", "\xCE\x9E" /* Ξ */ },
131     {"`6<R><R><R>9<E>", "\xCE\x9F" /* Ο */ },
132     {"`6<R><R><R>0<E>", "\xCE\xA0" /* Π */ },
133     {"`6<R><R><R><R>1<E>", "\xCE\xA1" /* Ρ */ },
134     {"`6<R><R><R><R>2<E>", "\xCE\xA3" /* Σ */ },
135     {"`6<R><R><R><R>3<E>", "\xCE\xA4" /* Τ */ },
136     {"`6<R><R><R><R>4<E>", "\xCE\xA5" /* Υ */ },
137     {"`6<R><R><R><R>5<E>", "\xCE\xA6" /* Φ */ },
138     {"`6<R><R><R><R>6<E>", "\xCE\xA7" /* Χ */ },
139     {"`6<R><R><R><R>7<E>", "\xCE\xA8" /* Ψ */ },
140     {"`6<R><R><R><R>8<E>", "\xCE\xA9" /* Ω */ },
141     {"`71<E>", "\xEF\xBC\x8B" /* + */ },
142     {"`72<E>", "\xEF\xBC\x8D" /* - */ },
143     {"`73<E>", "\xC3\x97" /* × */ },
144     {"`74<E>", "\xC3\xB7" /* ÷ */ },
145     {"`75<E>", "\xEF\xBC\x9D" /* = */ },
146     {"`76<E>", "\xE2\x89\xA0" /* ≠ */ },
147     {"`77<E>", "\xE2\x89\x92" /* ≒ */ },
148     {"`78<E>", "\xE2\x88\x9E" /* ∞ */ },
149     {"`79<E>", "\xC2\xB1" /* ± */ },
150     {"`70<E>", "\xE2\x88\x9A" /* √ */ },
151     {"`7<R>1<E>", "\xEF\xBC\x9C" /* < */ },
152     {"`7<R>2<E>", "\xEF\xBC\x9E" /* > */ },
153     {"`7<R>3<E>", "\xEF\xB9\xA4" /* ﹤ */ },
154     {"`7<R>4<E>", "\xEF\xB9\xA5" /* ﹥ */ },
155     {"`7<R>5<E>", "\xE2\x89\xA6" /* ≦ */ },
156     {"`7<R>6<E>", "\xE2\x89\xA7" /* ≧ */ },
157     {"`7<R>7<E>", "\xE2\x88\xA9" /* ∩ */ },
158     {"`7<R>8<E>", "\xE2\x88\xAA" /* ∪ */ },
159     {"`7<R>9<E>", "\xCB\x87" /* ˇ */ },
160     {"`7<R>0<E>", "\xE2\x8A\xA5" /* ⊥ */ },
161     {"`7<R><R>1<E>", "\xE2\x88\xA0" /* ∠ */ },
162     {"`7<R><R>2<E>", "\xE2\x88\x9F" /* ∟ */ },
163     {"`7<R><R>3<E>", "\xE2\x8A\xBF" /* ⊿ */ },
164     {"`7<R><R>4<E>", "\xE3\x8F\x92" /* ㏒ */ },
165     {"`7<R><R>5<E>", "\xE3\x8F\x91" /* ㏑ */ },
166     {"`7<R><R>6<E>", "\xE2\x88\xAB" /* ∫ */ },
167     {"`7<R><R>7<E>", "\xE2\x88\xAE" /* ∮ */ },
168     {"`7<R><R>8<E>", "\xE2\x88\xB5" /* ∵ */ },
169     {"`7<R><R>9<E>", "\xE2\x88\xB4" /* ∴ */ },
170     {"`7<R><R>0<E>", "\xE2\x95\xB3" /* ╳ */ },
171     {"`7<R><R><R>1<E>", "\xEF\xB9\xA2" /* ﹢ */ },
172     {"`81<E>", "\xE2\x86\x91" /* ↑ */ },
173     {"`82<E>", "\xE2\x86\x93" /* ↓ */ },
174     {"`83<E>", "\xE2\x86\x90" /* ← */ },
175     {"`84<E>", "\xE2\x86\x92" /* → */ },
176     {"`85<E>", "\xE2\x86\x96" /* ↖ */ },
177     {"`86<E>", "\xE2\x86\x97" /* ↗ */ },
178     {"`87<E>", "\xE2\x86\x99" /* ↙ */ },
179     {"`88<E>", "\xE2\x86\x98" /* ↘ */ },
180     {"`89<E>", "\xE3\x8A\xA3" /* ㊣ */ },
181     {"`80<E>", "\xE2\x97\x8E" /* ◎ */ },
182     {"`8<R>1<E>", "\xE2\x97\x8B" /* ○ */ },
183     {"`8<R>2<E>", "\xE2\x97\x8F" /* ● */ },
184     {"`8<R>3<E>", "\xE2\x8A\x95" /* ⊕ */ },
185     {"`8<R>4<E>", "\xE2\x8A\x99" /* ⊙ */ },
186     {"`8<R>5<E>", "\xE2\x97\x8B" /* ○ */ },
187     {"`8<R>6<E>", "\xE2\x97\x8F" /* ● */ },
188     {"`8<R>7<E>", "\xE2\x96\xB3" /* △ */ },
189     {"`8<R>8<E>", "\xE2\x96\xB2" /* ▲ */ },
190     {"`8<R>9<E>", "\xE2\x98\x86" /* ☆ */ },
191     {"`8<R>0<E>", "\xE2\x98\x85" /* ★ */ },
192     {"`8<R><R>1<E>", "\xE2\x97\x87" /* ◇ */ },
193     {"`8<R><R>2<E>", "\xE2\x97\x86" /* ◆ */ },
194     {"`8<R><R>3<E>", "\xE2\x96\xA1" /* □ */ },
195     {"`8<R><R>4<E>", "\xE2\x96\xA0" /* ■ */ },
196     {"`8<R><R>5<E>", "\xE2\x96\xBD" /* ▽ */ },
197     {"`8<R><R>6<E>", "\xE2\x96\xBC" /* ▼ */ },
198     {"`8<R><R>7<E>", "\xC2\xA7" /* § */ },
199     {"`8<R><R>8<E>", "\xEF\xBF\xA5" /* ¥ */ },
200     {"`8<R><R>9<E>", "\xE3\x80\x92" /* 〒 */ },
201     {"`8<R><R>0<E>", "\xEF\xBF\xA0" /* ¢ */ },
202     {"`8<R><R><R>1<E>", "\xEF\xBF\xA1" /* £ */ },
203     {"`8<R><R><R>2<E>", "\xE2\x80\xBB" /* ※ */ },
204     {"`8<R><R><R>3<E>", "\xE2\x99\x80" /* ♀ */ },
205     {"`8<R><R><R>4<E>", "\xE2\x99\x82" /* ♂ */ },
206     {"`91<E>", "\xE2\x99\xA8" /* ♨ */ },
207     {"`92<E>", "\xE2\x98\x80" /* ☀ */ },
208     {"`93<E>", "\xE2\x98\x81" /* ☁ */ },
209     {"`94<E>", "\xE2\x98\x82" /* ☂ */ },
210     {"`95<E>", "\xE2\x98\x83" /* ☃ */ },
211     {"`96<E>", "\xE2\x99\xA0" /* ♠ */ },
212     {"`97<E>", "\xE2\x99\xA5" /* ♥ */ },
213     {"`98<E>", "\xE2\x99\xA3" /* ♣ */ },
214     {"`99<E>", "\xE2\x99\xA6" /* ♦ */ },
215     {"`90<E>", "\xE2\x99\xA9" /* ♩ */ },
216     {"`9<R>1<E>", "\xE2\x99\xAA" /* ♪ */ },
217     {"`9<R>2<E>", "\xE2\x99\xAB" /* ♫ */ },
218     {"`9<R>3<E>", "\xE2\x99\xAC" /* ♬ */ },
219     {"`9<R>4<E>", "\xE2\x98\xBA" /* ☺ */ },
220     {"`9<R>5<E>", "\xE2\x98\xBB" /* ☻ */ },
221     {"`01<E>", "\xE2\x94\x9C" /* ├ */ },
222     {"`02<E>", "\xE2\x94\x80" /* ─ */ },
223     {"`03<E>", "\xE2\x94\xBC" /* ┼ */ },
224     {"`04<E>", "\xE2\x94\xB4" /* ┴ */ },
225     {"`05<E>", "\xE2\x94\xAC" /* ┬ */ },
226     {"`06<E>", "\xE2\x94\xA4" /* ┤ */ },
227     {"`07<E>", "\xE2\x94\x8C" /* ┌ */ },
228     {"`08<E>", "\xE2\x94\x90" /* ┐ */ },
229     {"`09<E>", "\xE2\x95\x9E" /* ╞ */ },
230     {"`00<E>", "\xE2\x95\x90" /* ═ */ },
231     {"`0<R>1<E>", "\xE2\x95\xAA" /* ╪ */ },
232     {"`0<R>2<E>", "\xE2\x95\xA1" /* ╡ */ },
233     {"`0<R>3<E>", "\xE2\x94\x82" /* │ */ },
234     {"`0<R>4<E>", "\xE2\x96\x95" /* ▕ */ },
235     {"`0<R>5<E>", "\xE2\x94\x94" /* └ */ },
236     {"`0<R>6<E>", "\xE2\x94\x98" /* ┘ */ },
237     {"`0<R>7<E>", "\xE2\x95\xAD" /* ╭ */ },
238     {"`0<R>8<E>", "\xE2\x95\xAE" /* ╮ */ },
239     {"`0<R>9<E>", "\xE2\x95\xB0" /* ╰ */ },
240     {"`0<R>0<E>", "\xE2\x95\xAF" /* ╯ */ },
241     {"`<R>11<E>", "\xE2\x95\x94" /* ╔ */ },
242     {"`<R>12<E>", "\xE2\x95\xA6" /* ╦ */ },
243     {"`<R>13<E>", "\xE2\x95\x97" /* ╗ */ },
244     {"`<R>14<E>", "\xE2\x95\xA0" /* ╠ */ },
245     {"`<R>15<E>", "\xE2\x95\x90" /* ═ */ },
246     {"`<R>16<E>", "\xE2\x95\xAC" /* ╬ */ },
247     {"`<R>17<E>", "\xE2\x95\xA3" /* ╣ */ },
248     {"`<R>18<E>", "\xE2\x95\x93" /* ╓ */ },
249     {"`<R>19<E>", "\xE2\x95\xA5" /* ╥ */ },
250     {"`<R>10<E>", "\xE2\x95\x96" /* ╖ */ },
251     {"`<R>1<R>1<E>", "\xE2\x95\x92" /* ╒ */ },
252     {"`<R>1<R>2<E>", "\xE2\x95\xA4" /* ╤ */ },
253     {"`<R>1<R>3<E>", "\xE2\x95\x95" /* ╕ */ },
254     {"`<R>1<R>4<E>", "\xE2\x95\x91" /* ║ */ },
255     {"`<R>1<R>5<E>", "\xE2\x95\x9A" /* ╚ */ },
256     {"`<R>1<R>6<E>", "\xE2\x95\xA9" /* ╩ */ },
257     {"`<R>1<R>7<E>", "\xE2\x95\x9D" /* ╝ */ },
258     {"`<R>1<R>8<E>", "\xE2\x95\x9F" /* ╟ */ },
259     {"`<R>1<R>9<E>", "\xE2\x95\xAB" /* ╫ */ },
260     {"`<R>1<R>0<E>", "\xE2\x95\xA2" /* ╢ */ },
261     {"`<R>1<R><R>1<E>", "\xE2\x95\x99" /* ╙ */ },
262     {"`<R>1<R><R>2<E>", "\xE2\x95\xA8" /* ╨ */ },
263     {"`<R>1<R><R>3<E>", "\xE2\x95\x9C" /* ╜ */ },
264     {"`<R>1<R><R>4<E>", "\xE2\x95\x9E" /* ╞ */ },
265     {"`<R>1<R><R>5<E>", "\xE2\x95\xAA" /* ╪ */ },
266     {"`<R>1<R><R>6<E>", "\xE2\x95\xA1" /* ╡ */ },
267     {"`<R>1<R><R>7<E>", "\xE2\x95\x98" /* ╘ */ },
268     {"`<R>1<R><R>8<E>", "\xE2\x95\xA7" /* ╧ */ },
269     {"`<R>1<R><R>9<E>", "\xE2\x95\x9B" /* ╛ */ },
270     {"`<R>21<E>", "\xEF\xBC\xBF" /* _ */ },
271     {"`<R>22<E>", "\xCB\x8D" /* ˍ */ },
272     {"`<R>23<E>", "\xE2\x96\x81" /* ▁ */ },
273     {"`<R>24<E>", "\xE2\x96\x82" /* ▂ */ },
274     {"`<R>25<E>", "\xE2\x96\x83" /* ▃ */ },
275     {"`<R>26<E>", "\xE2\x96\x84" /* ▄ */ },
276     {"`<R>27<E>", "\xE2\x96\x85" /* ▅ */ },
277     {"`<R>28<E>", "\xE2\x96\x86" /* ▆ */ },
278     {"`<R>29<E>", "\xE2\x96\x87" /* ▇ */ },
279     {"`<R>20<E>", "\xE2\x96\x88" /* █ */ },
280     {"`<R>2<R>1<E>", "\xE2\x96\x8F" /* ▏ */ },
281     {"`<R>2<R>2<E>", "\xE2\x96\x8E" /* ▎ */ },
282     {"`<R>2<R>3<E>", "\xE2\x96\x8D" /* ▍ */ },
283     {"`<R>2<R>4<E>", "\xE2\x96\x8C" /* ▌ */ },
284     {"`<R>2<R>5<E>", "\xE2\x96\x8B" /* ▋ */ },
285     {"`<R>2<R>6<E>", "\xE2\x96\x8A" /* ▊ */ },
286     {"`<R>2<R>7<E>", "\xE2\x96\x89" /* ▉ */ },
287     {"`<R>2<R>8<E>", "\xE2\x97\xA2" /* ◢ */ },
288     {"`<R>2<R>9<E>", "\xE2\x97\xA3" /* ◣ */ },
289     {"`<R>2<R>0<E>", "\xE2\x97\xA5" /* ◥ */ },
290     {"`<R>2<R><R>1<E>", "\xE2\x97\xA4" /* ◤ */ },
291     {"`<R>31<E>", "\xEF\xB9\xA3" /* ﹣ */ },
292     {"`<R>32<E>", "\xEF\xB9\xA6" /* ﹦ */ },
293     {"`<R>33<E>", "\xE2\x89\xA1" /* ≡ */ },
294     {"`<R>34<E>", "\xEF\xBD\x9C" /* | */ },
295     {"`<R>35<E>", "\xE2\x88\xA3" /* ∣ */ },
296     {"`<R>36<E>", "\xE2\x88\xA5" /* ∥ */ },
297     {"`<R>37<E>", "\xE2\x80\x93" /* – */ },
298     {"`<R>38<E>", "\xEF\xB8\xB1" /* ︱ */ },
299     {"`<R>39<E>", "\xE2\x80\x94" /* — */ },
300     {"`<R>30<E>", "\xEF\xB8\xB3" /* ︳ */ },
301     {"`<R>3<R>1<E>", "\xE2\x95\xB4" /* ╴ */ },
302     {"`<R>3<R>2<E>", "\xC2\xAF" /* ¯ */ },
303     {"`<R>3<R>3<E>", "\xEF\xBF\xA3" /*  ̄ */ },
304     {"`<R>3<R>4<E>", "\xEF\xB9\x89" /* ﹉ */ },
305     {"`<R>3<R>5<E>", "\xEF\xB9\x8A" /* ﹊ */ },
306     {"`<R>3<R>6<E>", "\xEF\xB9\x8D" /* ﹍ */ },
307     {"`<R>3<R>7<E>", "\xEF\xB9\x8E" /* ﹎ */ },
308     {"`<R>3<R>8<E>", "\xEF\xB9\x8B" /* ﹋ */ },
309     {"`<R>3<R>9<E>", "\xEF\xB9\x8C" /* ﹌ */ },
310     {"`<R>3<R>0<E>", "\xEF\xB9\x8F" /* ﹏ */ },
311     {"`<R>3<R><R>1<E>", "\xEF\xB8\xB4" /* ︴ */ },
312     {"`<R>3<R><R>2<E>", "\xE2\x88\x95" /* ∕ */ },
313     {"`<R>3<R><R>3<E>", "\xEF\xB9\xA8" /* ﹨ */ },
314     {"`<R>3<R><R>4<E>", "\xE2\x95\xB1" /* ╱ */ },
315     {"`<R>3<R><R>5<E>", "\xE2\x95\xB2" /* ╲ */ },
316     {"`<R>3<R><R>6<E>", "\xEF\xBC\x8F" /* / */ },
317     {"`<R>3<R><R>7<E>", "\xEF\xBC\xBC" /* \ */ },
318 };
319 
320 static const char *CAND[] = {
321     "\xE2\x80\xA6" /* … */ ,
322     "\xE2\x80\xBB" /* ※ */ ,
323     "\xE5\xB8\xB8\xE7\x94\xA8\xE7\xAC\xA6\xE8\x99\x9F" /* 常用符號 */ ,
324     "\xE5\xB7\xA6\xE5\x8F\xB3\xE6\x8B\xAC\xE8\x99\x9F" /* 左右括號 */ ,
325     "\xE4\xB8\x8A\xE4\xB8\x8B\xE6\x8B\xAC\xE8\x99\x9F" /* 上下括號 */ ,
326     "\xE5\xB8\x8C\xE8\x87\x98\xE5\xAD\x97\xE6\xAF\x8D" /* 希臘字母 */ ,
327     "\xE6\x95\xB8\xE5\xAD\xB8\xE7\xAC\xA6\xE8\x99\x9F" /* 數學符號 */ ,
328     "\xE7\x89\xB9\xE6\xAE\x8A\xE5\x9C\x96\xE5\xBD\xA2" /* 特殊圖形 */ ,
329     "\x55\x6E\x69\x63\x6F\x64\x65" /* Unicode */ ,
330     "\xE5\x96\xAE\xE7\xB7\x9A\xE6\xA1\x86" /* 單線框 */ ,
331     "\xE9\x9B\x99\xE7\xB7\x9A\xE6\xA1\x86" /* 雙線框 */ ,
332     "\xE5\xA1\xAB\xE8\x89\xB2\xE6\x96\xB9\xE5\xA1\x8A" /* 填色方塊 */ ,
333     "\xE7\xB7\x9A\xE6\xAE\xB5" /* 線段 */ ,
334 };
335 
336 FILE *fd;
337 
test_type_symbol()338 void test_type_symbol()
339 {
340     ChewingContext *ctx;
341     size_t i;
342 
343     ctx = chewing_new();
344     start_testcase(ctx, fd);
345 
346     chewing_set_candPerPage(ctx, 10);
347     chewing_set_maxChiSymbolLen(ctx, 16);
348 
349     for (i = 0; i < ARRAY_SIZE(SYMBOL); ++i) {
350         type_keystroke_by_string(ctx, SYMBOL[i].token);
351         ok_preedit_buffer(ctx, "");
352         ok_commit_buffer(ctx, SYMBOL[i].expected);
353     }
354 
355     chewing_delete(ctx);
356 }
357 
test_symbol_cand_page()358 void test_symbol_cand_page()
359 {
360     ChewingContext *ctx;
361 
362     ctx = chewing_new();
363     start_testcase(ctx, fd);
364 
365     chewing_set_candPerPage(ctx, 10);
366     chewing_set_maxChiSymbolLen(ctx, 16);
367 
368     chewing_handle_Default(ctx, '`');
369     ok(chewing_cand_CurrentPage(ctx) == 0, "current page shall be 0");
370     ok(chewing_cand_TotalPage(ctx) == 2, "total page shall be 2");
371 
372     ok_candidate(ctx, CAND, ARRAY_SIZE(CAND));
373 
374     chewing_delete(ctx);
375 }
376 
test_symbol_count()377 void test_symbol_count()
378 {
379     ChewingContext *ctx;
380     int total;
381 
382     ctx = chewing_new();
383     start_testcase(ctx, fd);
384 
385     type_keystroke_by_string(ctx, "`3");
386     total = chewing_cand_TotalChoice(ctx);
387     ok(total == 30, "total candidate for `3 is %d, shall be %d", total, 30);
388 
389     chewing_delete(ctx);
390 }
391 
test_symbol()392 void test_symbol()
393 {
394     test_symbol_cand_page();
395     test_symbol_count();
396 }
397 
test_nocand_symbol()398 void test_nocand_symbol()
399 {
400     ChewingContext *ctx;
401 
402     ctx = chewing_new();
403     start_testcase(ctx, fd);
404 
405     chewing_set_candPerPage(ctx, 10);
406     chewing_set_maxChiSymbolLen(ctx, 16);
407 
408     type_keystroke_by_string(ctx, "`<R>20");
409     ok_preedit_buffer(ctx, "\xE2\x96\x88"); /* █ */
410 
411     type_keystroke_by_string(ctx, "<D>");
412     ok_candidate(ctx, CAND, ARRAY_SIZE(CAND));
413 
414     type_keystroke_by_string(ctx, "1<E>"); /* select … */
415     ok_commit_buffer(ctx, "\xE2\x80\xA6");
416 
417     chewing_delete(ctx);
418 }
419 
main(int argc,char * argv[])420 int main(int argc, char *argv[])
421 {
422     char *logname;
423     int ret;
424 
425     putenv("CHEWING_PATH=" CHEWING_DATA_PREFIX);
426     putenv("CHEWING_USER_PATH=" TEST_HASH_DIR);
427 
428     ret = asprintf(&logname, "%s.log", argv[0]);
429     if (ret == -1)
430         return -1;
431     fd = fopen(logname, "w");
432     assert(fd);
433     free(logname);
434 
435     test_type_symbol();
436     test_symbol();
437     test_nocand_symbol();
438 
439     fclose(fd);
440 
441     return exit_status();
442 }
443