]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/main/tests/collate/src/com/ibm/icu/dev/test/collator/CollationKanaTest.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / main / tests / collate / src / com / ibm / icu / dev / test / collator / CollationKanaTest.java
1 /*\r
2  *******************************************************************************\r
3  * Copyright (C) 2002-2010, International Business Machines Corporation and    *\r
4  * others. All Rights Reserved.                                                *\r
5  *******************************************************************************\r
6  */\r
7 \r
8 /** \r
9  * Port From:   ICU4C v2.1 : Collate/CollationKanaTest\r
10  * Source File: $ICU4CRoot/source/test/intltest/jacoll.cpp\r
11  **/\r
12  \r
13 package com.ibm.icu.dev.test.collator;\r
14  \r
15 import java.util.Locale;\r
16 \r
17 import com.ibm.icu.dev.test.TestFmwk;\r
18 import com.ibm.icu.text.CollationKey;\r
19 import com.ibm.icu.text.Collator;\r
20 import com.ibm.icu.text.RuleBasedCollator;\r
21 import com.ibm.icu.util.ULocale;\r
22  \r
23 public class CollationKanaTest extends TestFmwk{\r
24     public static void main(String[] args) throws Exception{\r
25         new CollationKanaTest().run(args);\r
26     }\r
27 \r
28     private static char[][] testSourceCases = {\r
29         {0xff9E},\r
30         {0x3042},\r
31         {0x30A2},\r
32         {0x3042, 0x3042},\r
33         {0x30A2, 0x30FC},\r
34         {0x30A2, 0x30FC, 0x30C8}                               /*  6 */\r
35     };\r
36 \r
37     private static char[][] testTargetCases = {\r
38         {0xFF9F},\r
39         {0x30A2},\r
40         {0x3042, 0x3042},\r
41         {0x30A2, 0x30FC},\r
42         {0x30A2, 0x30FC, 0x30C8},\r
43         {0x3042, 0x3042, 0x3068}                              /*  6 */\r
44     };\r
45 \r
46     private static int[] results = {\r
47         -1,\r
48         0,   //Collator::LESS, /* Katakanas and Hiraganas are equal on tertiary level(ICU 2.0)*/\r
49         -1,\r
50         1, // Collator::LESS, /* Prolonged sound mark sorts BEFORE equivalent vowel (ICU 2.0)*/\r
51         -1,\r
52         -1,    //Collator::GREATER /* Prolonged sound mark sorts BEFORE equivalent vowel (ICU 2.0)*//*  6 */\r
53     };\r
54 \r
55     private static char[][] testBaseCases = {\r
56         {0x30AB},\r
57         {0x30AB, 0x30AD},\r
58         {0x30AD},\r
59         {0x30AD, 0x30AD}\r
60     };\r
61 \r
62     private static char[][] testPlainDakutenHandakutenCases = {\r
63         {0x30CF, 0x30AB},\r
64         {0x30D0, 0x30AB},\r
65         {0x30CF, 0x30AD},\r
66         {0x30D0, 0x30AD}\r
67     };\r
68 \r
69     private static char[][] testSmallLargeCases = {\r
70         {0x30C3, 0x30CF},\r
71         {0x30C4, 0x30CF},\r
72         {0x30C3, 0x30D0},\r
73         {0x30C4, 0x30D0}\r
74     };\r
75 \r
76     private static char[][] testKatakanaHiraganaCases = {\r
77         {0x3042, 0x30C3},\r
78         {0x30A2, 0x30C3},\r
79         {0x3042, 0x30C4},\r
80         {0x30A2, 0x30C4}\r
81     };\r
82 \r
83     private static char[][] testChooonKigooCases = {\r
84         /*0*/ {0x30AB, 0x30FC, 0x3042},\r
85         /*1*/ {0x30AB, 0x30FC, 0x30A2},\r
86         /*2*/ {0x30AB, 0x30A4, 0x3042},\r
87         /*3*/ {0x30AB, 0x30A4, 0x30A2},\r
88         /*6*/ {0x30AD, 0x30FC, 0x3042}, /* Prolonged sound mark sorts BEFORE equivalent vowel (ICU 2.0)*/\r
89         /*7*/ {0x30AD, 0x30FC, 0x30A2}, /* Prolonged sound mark sorts BEFORE equivalent vowel (ICU 2.0)*/\r
90         /*4*/ {0x30AD, 0x30A4, 0x3042},\r
91         /*5*/ {0x30AD, 0x30A4, 0x30A2}\r
92     };\r
93         \r
94     private Collator myCollation = null;\r
95     \r
96     public CollationKanaTest() {\r
97     }\r
98     protected void init()throws Exception{ \r
99         if(myCollation==null){\r
100             myCollation = Collator.getInstance(Locale.JAPANESE); \r
101         }\r
102     }\r
103     // performs test with strength TERIARY\r
104     public void TestTertiary() {\r
105         int i = 0;\r
106         myCollation.setStrength(Collator.TERTIARY);\r
107         \r
108         for (i = 0; i < 6; i++) {\r
109             doTest(testSourceCases[i], testTargetCases[i], results[i]);\r
110         }\r
111     }\r
112 \r
113     /* Testing base letters */\r
114     public void TestBase() {\r
115         int i;\r
116         myCollation.setStrength(Collator.PRIMARY);\r
117         for (i = 0; i < 3 ; i++) {\r
118             doTest(testBaseCases[i], testBaseCases[i + 1], -1);\r
119         }\r
120     }\r
121 \r
122     /* Testing plain, Daku-ten, Handaku-ten letters */\r
123     public void TestPlainDakutenHandakuten() {\r
124         int i;\r
125         myCollation.setStrength(Collator.SECONDARY);\r
126         for (i = 0; i < 3 ; i++) {\r
127             doTest(testPlainDakutenHandakutenCases[i], testPlainDakutenHandakutenCases[i + 1], -1);\r
128         }\r
129     }\r
130 \r
131     /* \r
132     * Test Small, Large letters\r
133     */\r
134     public void TestSmallLarge() {\r
135         int i;\r
136         myCollation.setStrength(Collator.TERTIARY);\r
137 \r
138         for (i = 0; i < 3 ; i++) {\r
139             doTest(testSmallLargeCases[i], testSmallLargeCases[i + 1], -1);\r
140         }\r
141     }\r
142 \r
143     /*\r
144     * Test Katakana, Hiragana letters\r
145     */\r
146     public void TestKatakanaHiragana() {\r
147         int i;\r
148         myCollation.setStrength(Collator.QUATERNARY);\r
149         for (i = 0; i < 3 ; i++) {\r
150             doTest(testKatakanaHiraganaCases[i], testKatakanaHiraganaCases[i + 1], -1);\r
151         }\r
152     }\r
153 \r
154     /*\r
155     * Test Choo-on kigoo\r
156     */\r
157     public void TestChooonKigoo() {\r
158         int i;\r
159         myCollation.setStrength(Collator.QUATERNARY);\r
160         for (i = 0; i < 7 ; i++) {\r
161             doTest(testChooonKigooCases[i], testChooonKigooCases[i + 1], -1);\r
162         }\r
163     }\r
164     \r
165     /*\r
166      * Test common Hiragana and Katakana characters (e.g. 0x3099) (ticket:6140)\r
167      */\r
168     public void TestCommonCharacters() {\r
169         char[] tmp1 = { 0x3058, 0x30B8 };\r
170         char[] tmp2 = { 0x3057, 0x3099, 0x30B7, 0x3099 };\r
171         CollationKey key1, key2;\r
172         int result;\r
173         String string1 = new String(tmp1);\r
174         String string2 = new String(tmp2);\r
175         RuleBasedCollator rb = (RuleBasedCollator)Collator.getInstance(ULocale.JAPAN);\r
176         rb.setHiraganaQuaternary(true);\r
177         rb.setStrength(Collator.QUATERNARY);\r
178         rb.setAlternateHandlingShifted(false);\r
179         \r
180         result = rb.compare(string1, string2);\r
181         \r
182         key1 = rb.getCollationKey(string1);\r
183         key2 = rb.getCollationKey(string2);\r
184         \r
185         if ( result != 0 || !key1.equals(key2)) {\r
186             errln("Failed Hiragana and Katakana common characters test. Expected results to be equal.");\r
187         }\r
188         \r
189     }\r
190     // main test routine, tests rules specific to "Kana" locale\r
191     private void doTest(char[] source, char[] target, int result){\r
192         \r
193         String s = new String(source);\r
194         String t = new String(target);\r
195         int compareResult = myCollation.compare(s, t);\r
196         CollationKey sortKey1, sortKey2;\r
197         sortKey1 = myCollation.getCollationKey(s);\r
198         sortKey2 = myCollation.getCollationKey(t);\r
199         int keyResult = sortKey1.compareTo(sortKey2);\r
200         reportCResult(s, t, sortKey1, sortKey2, compareResult, keyResult, compareResult, result);\r
201         \r
202     }\r
203     \r
204     private void reportCResult( String source, String target, CollationKey sourceKey, CollationKey targetKey,\r
205                                 int compareResult, int keyResult, int incResult, int expectedResult ){\r
206         if (expectedResult < -1 || expectedResult > 1) {\r
207             errln("***** invalid call to reportCResult ****");\r
208             return;\r
209         }\r
210 \r
211         boolean ok1 = (compareResult == expectedResult);\r
212         boolean ok2 = (keyResult == expectedResult);\r
213         boolean ok3 = (incResult == expectedResult);\r
214 \r
215         if (ok1 && ok2 && ok3 && !isVerbose()){\r
216             return;    \r
217         } else {\r
218             String msg1 = ok1? "Ok: compare(\"" : "FAIL: compare(\"";\r
219             String msg2 = "\", \"";\r
220             String msg3 = "\") returned ";\r
221             String msg4 = "; expected ";\r
222             \r
223             String sExpect = new String("");\r
224             String sResult = new String("");\r
225             sResult = appendCompareResult(compareResult, sResult);\r
226             sExpect = appendCompareResult(expectedResult, sExpect);\r
227             if (ok1) {\r
228                 logln(msg1 + source + msg2 + target + msg3 + sResult);\r
229             } else {\r
230                 errln(msg1 + source + msg2 + target + msg3 + sResult + msg4 + sExpect);\r
231             }\r
232             \r
233             msg1 = ok2 ? "Ok: key(\"" : "FAIL: key(\"";\r
234             msg2 = "\").compareTo(key(\"";\r
235             msg3 = "\")) returned ";\r
236             sResult = appendCompareResult(keyResult, sResult);\r
237             if (ok2) {\r
238                 logln(msg1 + source + msg2 + target + msg3 + sResult);\r
239             } else {\r
240                 errln(msg1 + source + msg2 + target + msg3 + sResult + msg4 + sExpect);\r
241                 msg1 = "  ";\r
242                 msg2 = " vs. ";\r
243                 errln(msg1 + prettify(sourceKey) + msg2 + prettify(targetKey));\r
244             }\r
245             \r
246             msg1 = ok3 ? "Ok: incCompare(\"" : "FAIL: incCompare(\"";\r
247             msg2 = "\", \"";\r
248             msg3 = "\") returned ";\r
249 \r
250             sResult = appendCompareResult(incResult, sResult);\r
251 \r
252             if (ok3) {\r
253                 logln(msg1 + source + msg2 + target + msg3 + sResult);\r
254             } else {\r
255                 errln(msg1 + source + msg2 + target + msg3 + sResult + msg4 + sExpect);\r
256             }                \r
257         }\r
258     }\r
259     \r
260     private String appendCompareResult(int result, String target){\r
261         if (result == -1) {\r
262             target += "LESS";\r
263         } else if (result == 0) {\r
264             target += "EQUAL";\r
265         } else if (result == 1) {\r
266             target += "GREATER";\r
267         } else {\r
268             String huh = "?";\r
269             target += huh + result;\r
270         }\r
271         return target;\r
272     }\r
273     \r
274     String prettify(CollationKey sourceKey) {\r
275         int i;\r
276         byte[] bytes= sourceKey.toByteArray();\r
277         String target = "[";\r
278     \r
279         for (i = 0; i < bytes.length; i++) {\r
280             target += Integer.toHexString(bytes[i]);\r
281             target += " ";\r
282         }\r
283         target += "]";\r
284         return target;\r
285     }\r
286 }