1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
3 /********************************************************************
4 * COPYRIGHT:
5 * Copyright (c) 1997-2009, International Business Machines Corporation and
6 * others. All Rights Reserved.
7 ********************************************************************/
8 /********************************************************************************
9 *
10 * File CJAPTST.C
11 *
12 * Modification History:
13 * Name Description
14 * Madhu Katragadda Ported for C API
15 * synwee Added TestBase, TestPlainDakutenHandakuten,
16 * TestSmallLarge, TestKatakanaHiragana,
17 * TestChooonKigoo
18 *********************************************************************************/
19 /**
20 * CollationKannaTest is a third level test class. This tests the locale
21 * specific primary, secondary and tertiary rules. For example, the ignorable
22 * character '-' in string "black-bird". The en_US locale uses the default
23 * collation rules as its sorting sequence.
24 */
25
26 #include <stdlib.h>
27
28 #include "unicode/utypes.h"
29
30 #if !UCONFIG_NO_COLLATION
31
32 #include "unicode/ucol.h"
33 #include "unicode/uloc.h"
34 #include "cintltst.h"
35 #include "ccolltst.h"
36 #include "callcoll.h"
37 #include "cjaptst.h"
38 #include "unicode/ustring.h"
39 #include "string.h"
40
41 static UCollator *myCollation;
42 const static UChar testSourceCases[][MAX_TOKEN_LEN] = {
43 {0xff9E, 0x0000},
44 {0x3042, 0x0000},
45 {0x30A2, 0x0000},
46 {0x3042, 0x3042, 0x0000},
47 {0x30A2, 0x30FC, 0x0000},
48 {0x30A2, 0x30FC, 0x30C8, 0x0000} /* 6 */
49 };
50
51 const static UChar testTargetCases[][MAX_TOKEN_LEN] = {
52 {0xFF9F, 0x0000},
53 {0x30A2, 0x0000},
54 {0x3042, 0x3042, 0x0000},
55 {0x30A2, 0x30FC, 0x0000},
56 {0x30A2, 0x30FC, 0x30C8, 0x0000},
57 {0x3042, 0x3042, 0x3068, 0x0000} /* 6 */
58 };
59
60 const static UCollationResult results[] = {
61 UCOL_LESS,
62 UCOL_EQUAL, /*UCOL_LESS*/ /* Katakanas and Hiraganas are equal on tertiary level(ICU 2.0)*/
63 UCOL_LESS,
64 UCOL_GREATER, /*UCOL_LESS*/ /* Prolonged sound mark sorts BEFORE equivalent vowel (ICU 2.0)*/
65 UCOL_LESS,
66 UCOL_LESS, /*UCOL_GREATER*/ /* Prolonged sound mark sorts BEFORE equivalent vowel (ICU 2.0)*//* 6 */
67 };
68
69 const static UChar testBaseCases[][MAX_TOKEN_LEN] = {
70 {0x30AB, 0x0000},
71 {0x30AB, 0x30AD, 0x0000},
72 {0x30AD, 0x0000},
73 {0x30AD, 0x30AD, 0x0000}
74 };
75
76 const static UChar testPlainDakutenHandakutenCases[][MAX_TOKEN_LEN] = {
77 {0x30CF, 0x30AB, 0x0000},
78 {0x30D0, 0x30AB, 0x0000},
79 {0x30CF, 0x30AD, 0x0000},
80 {0x30D0, 0x30AD, 0x0000}
81 };
82
83 const static UChar testSmallLargeCases[][MAX_TOKEN_LEN] = {
84 {0x30C3, 0x30CF, 0x0000},
85 {0x30C4, 0x30CF, 0x0000},
86 {0x30C3, 0x30D0, 0x0000},
87 {0x30C4, 0x30D0, 0x0000}
88 };
89
90 const static UChar testKatakanaHiraganaCases[][MAX_TOKEN_LEN] = {
91 {0x3042, 0x30C3, 0x0000},
92 {0x30A2, 0x30C3, 0x0000},
93 {0x3042, 0x30C4, 0x0000},
94 {0x30A2, 0x30C4, 0x0000}
95 };
96
97 const static UChar testChooonKigooCases[][MAX_TOKEN_LEN] = {
98 /*0*/ {0x30AB, 0x30FC, 0x3042, 0x0000},
99 /*1*/ {0x30AB, 0x30FC, 0x30A2, 0x0000},
100 /*2*/ {0x30AB, 0x30A4, 0x3042, 0x0000},
101 /*3*/ {0x30AB, 0x30A4, 0x30A2, 0x0000},
102 /*6*/ {0x30AD, 0x30FC, 0x3042, 0x0000}, /* Prolonged sound mark sorts BEFORE equivalent vowel (ICU 2.0)*/
103 /*7*/ {0x30AD, 0x30FC, 0x30A2, 0x0000}, /* Prolonged sound mark sorts BEFORE equivalent vowel (ICU 2.0)*/
104 /*4*/ {0x30AD, 0x30A4, 0x3042, 0x0000},
105 /*5*/ {0x30AD, 0x30A4, 0x30A2, 0x0000},
106 };
107
addKannaCollTest(TestNode ** root)108 void addKannaCollTest(TestNode** root)
109 {
110 addTest(root, &TestTertiary, "tscoll/cjacoll/TestTertiary");
111 addTest(root, &TestBase, "tscoll/cjacoll/TestBase");
112 addTest(root, &TestPlainDakutenHandakuten, "tscoll/cjacoll/TestPlainDakutenHandakuten");
113 addTest(root, &TestSmallLarge, "tscoll/cjacoll/TestSmallLarge");
114 addTest(root, &TestKatakanaHiragana, "tscoll/cjacoll/TestKatakanaHiragana");
115 addTest(root, &TestChooonKigoo, "tscoll/cjacoll/TestChooonKigoo");
116 }
117
TestTertiary()118 static void TestTertiary( )
119 {
120 int32_t i;
121 UErrorCode status = U_ZERO_ERROR;
122 myCollation = ucol_open("ja_JP", &status);
123 if(U_FAILURE(status)){
124 log_err_status(status, "ERROR: in creation of rule based collator: %s\n", myErrorName(status));
125 return;
126 }
127 log_verbose("Testing Kanna(Japan) Collation with Tertiary strength\n");
128 ucol_setStrength(myCollation, UCOL_TERTIARY);
129 ucol_setAttribute(myCollation, UCOL_CASE_LEVEL, UCOL_ON, &status);
130 for (i = 0; i < 6 ; i++)
131 {
132 doTest(myCollation, testSourceCases[i], testTargetCases[i], results[i]);
133 }
134 ucol_close(myCollation);
135 }
136
137 /* Testing base letters */
TestBase()138 static void TestBase()
139 {
140 int32_t i;
141 UErrorCode status = U_ZERO_ERROR;
142 myCollation = ucol_open("ja_JP", &status);
143 if (U_FAILURE(status))
144 {
145 log_err_status(status, "ERROR: in creation of rule based collator: %s\n",
146 myErrorName(status));
147 return;
148 }
149
150 log_verbose("Testing Japanese Base Characters Collation\n");
151 ucol_setStrength(myCollation, UCOL_PRIMARY);
152 for (i = 0; i < 3 ; i++)
153 doTest(myCollation, testBaseCases[i], testBaseCases[i + 1], UCOL_LESS);
154
155 ucol_close(myCollation);
156 }
157
158 /* Testing plain, Daku-ten, Handaku-ten letters */
TestPlainDakutenHandakuten(void)159 static void TestPlainDakutenHandakuten(void)
160 {
161 int32_t i;
162 UErrorCode status = U_ZERO_ERROR;
163 myCollation = ucol_open("ja_JP", &status);
164 if (U_FAILURE(status))
165 {
166 log_err_status(status, "ERROR: in creation of rule based collator: %s\n",
167 myErrorName(status));
168 return;
169 }
170
171 log_verbose("Testing plain, Daku-ten, Handaku-ten letters Japanese Characters Collation\n");
172 ucol_setStrength(myCollation, UCOL_SECONDARY);
173 for (i = 0; i < 3 ; i++)
174 doTest(myCollation, testPlainDakutenHandakutenCases[i],
175 testPlainDakutenHandakutenCases[i + 1], UCOL_LESS);
176
177 ucol_close(myCollation);
178 }
179
180 /*
181 * Test Small, Large letters
182 */
TestSmallLarge(void)183 static void TestSmallLarge(void)
184 {
185 int32_t i;
186 UErrorCode status = U_ZERO_ERROR;
187 myCollation = ucol_open("ja_JP", &status);
188 if (U_FAILURE(status))
189 {
190 log_err_status(status, "ERROR: in creation of rule based collator: %s\n",
191 myErrorName(status));
192 return;
193 }
194
195 log_verbose("Testing Japanese Small and Large Characters Collation\n");
196 ucol_setStrength(myCollation, UCOL_TERTIARY);
197 ucol_setAttribute(myCollation, UCOL_CASE_LEVEL, UCOL_ON, &status);
198 for (i = 0; i < 3 ; i++)
199 doTest(myCollation, testSmallLargeCases[i], testSmallLargeCases[i + 1],
200 UCOL_LESS);
201
202 ucol_close(myCollation);
203 }
204
205 /*
206 * Test Katakana, Hiragana letters
207 */
TestKatakanaHiragana(void)208 static void TestKatakanaHiragana(void)
209 {
210 int32_t i;
211 UErrorCode status = U_ZERO_ERROR;
212 myCollation = ucol_open("ja_JP", &status);
213 if (U_FAILURE(status))
214 {
215 log_err_status(status, "ERROR: in creation of rule based collator: %s\n",
216 myErrorName(status));
217 return;
218 }
219
220 log_verbose("Testing Japanese Katakana, Hiragana Characters Collation\n");
221 ucol_setStrength(myCollation, UCOL_QUATERNARY);
222 ucol_setAttribute(myCollation, UCOL_CASE_LEVEL, UCOL_ON, &status);
223 for (i = 0; i < 3 ; i++) {
224 doTest(myCollation, testKatakanaHiraganaCases[i],
225 testKatakanaHiraganaCases[i + 1], UCOL_LESS);
226 }
227
228 ucol_close(myCollation);
229 }
230
231 /*
232 * Test Choo-on kigoo
233 */
TestChooonKigoo(void)234 static void TestChooonKigoo(void)
235 {
236 int32_t i;
237 UErrorCode status = U_ZERO_ERROR;
238 myCollation = ucol_open("ja_JP", &status);
239 if (U_FAILURE(status))
240 {
241 log_err_status(status, "ERROR: in creation of rule based collator: %s\n",
242 myErrorName(status));
243 return;
244 }
245
246 log_verbose("Testing Japanese Choo-on Kigoo Characters Collation\n");
247 ucol_setAttribute(myCollation, UCOL_STRENGTH, UCOL_QUATERNARY, &status);
248 ucol_setAttribute(myCollation, UCOL_CASE_LEVEL, UCOL_ON, &status);
249 for (i = 0; i < 7 ; i++) {
250 doTest(myCollation, testChooonKigooCases[i], testChooonKigooCases[i + 1],
251 UCOL_LESS);
252 }
253
254 ucol_close(myCollation);
255 }
256
257 #endif /* #if !UCONFIG_NO_COLLATION */
258