2 *******************************************************************************
\r
3 * Copyright (C) 2002-2010, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
9 * Port From: ICU4C v2.1 : Collate/CollationKanaTest
\r
10 * Source File: $ICU4CRoot/source/test/intltest/jacoll.cpp
\r
13 package com.ibm.icu.dev.test.collator;
\r
15 import java.util.Locale;
\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
23 public class CollationKanaTest extends TestFmwk{
\r
24 public static void main(String[] args) throws Exception{
\r
25 new CollationKanaTest().run(args);
\r
28 private static char[][] testSourceCases = {
\r
34 {0x30A2, 0x30FC, 0x30C8} /* 6 */
\r
37 private static char[][] testTargetCases = {
\r
42 {0x30A2, 0x30FC, 0x30C8},
\r
43 {0x3042, 0x3042, 0x3068} /* 6 */
\r
46 private static int[] results = {
\r
48 0, //Collator::LESS, /* Katakanas and Hiraganas are equal on tertiary level(ICU 2.0)*/
\r
50 1, // Collator::LESS, /* Prolonged sound mark sorts BEFORE equivalent vowel (ICU 2.0)*/
\r
52 -1, //Collator::GREATER /* Prolonged sound mark sorts BEFORE equivalent vowel (ICU 2.0)*//* 6 */
\r
55 private static char[][] testBaseCases = {
\r
62 private static char[][] testPlainDakutenHandakutenCases = {
\r
69 private static char[][] testSmallLargeCases = {
\r
76 private static char[][] testKatakanaHiraganaCases = {
\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
94 private Collator myCollation = null;
\r
96 public CollationKanaTest() {
\r
98 protected void init()throws Exception{
\r
99 if(myCollation==null){
\r
100 myCollation = Collator.getInstance(Locale.JAPANESE);
\r
103 // performs test with strength TERIARY
\r
104 public void TestTertiary() {
\r
106 myCollation.setStrength(Collator.TERTIARY);
\r
108 for (i = 0; i < 6; i++) {
\r
109 doTest(testSourceCases[i], testTargetCases[i], results[i]);
\r
113 /* Testing base letters */
\r
114 public void TestBase() {
\r
116 myCollation.setStrength(Collator.PRIMARY);
\r
117 for (i = 0; i < 3 ; i++) {
\r
118 doTest(testBaseCases[i], testBaseCases[i + 1], -1);
\r
122 /* Testing plain, Daku-ten, Handaku-ten letters */
\r
123 public void TestPlainDakutenHandakuten() {
\r
125 myCollation.setStrength(Collator.SECONDARY);
\r
126 for (i = 0; i < 3 ; i++) {
\r
127 doTest(testPlainDakutenHandakutenCases[i], testPlainDakutenHandakutenCases[i + 1], -1);
\r
132 * Test Small, Large letters
\r
134 public void TestSmallLarge() {
\r
136 myCollation.setStrength(Collator.TERTIARY);
\r
138 for (i = 0; i < 3 ; i++) {
\r
139 doTest(testSmallLargeCases[i], testSmallLargeCases[i + 1], -1);
\r
144 * Test Katakana, Hiragana letters
\r
146 public void TestKatakanaHiragana() {
\r
148 myCollation.setStrength(Collator.QUATERNARY);
\r
149 for (i = 0; i < 3 ; i++) {
\r
150 doTest(testKatakanaHiraganaCases[i], testKatakanaHiraganaCases[i + 1], -1);
\r
155 * Test Choo-on kigoo
\r
157 public void TestChooonKigoo() {
\r
159 myCollation.setStrength(Collator.QUATERNARY);
\r
160 for (i = 0; i < 7 ; i++) {
\r
161 doTest(testChooonKigooCases[i], testChooonKigooCases[i + 1], -1);
\r
166 * Test common Hiragana and Katakana characters (e.g. 0x3099) (ticket:6140)
\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
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
180 result = rb.compare(string1, string2);
\r
182 key1 = rb.getCollationKey(string1);
\r
183 key2 = rb.getCollationKey(string2);
\r
185 if ( result != 0 || !key1.equals(key2)) {
\r
186 errln("Failed Hiragana and Katakana common characters test. Expected results to be equal.");
\r
190 // main test routine, tests rules specific to "Kana" locale
\r
191 private void doTest(char[] source, char[] target, int result){
\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
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
211 boolean ok1 = (compareResult == expectedResult);
\r
212 boolean ok2 = (keyResult == expectedResult);
\r
213 boolean ok3 = (incResult == expectedResult);
\r
215 if (ok1 && ok2 && ok3 && !isVerbose()){
\r
218 String msg1 = ok1? "Ok: compare(\"" : "FAIL: compare(\"";
\r
219 String msg2 = "\", \"";
\r
220 String msg3 = "\") returned ";
\r
221 String msg4 = "; expected ";
\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
228 logln(msg1 + source + msg2 + target + msg3 + sResult);
\r
230 errln(msg1 + source + msg2 + target + msg3 + sResult + msg4 + sExpect);
\r
233 msg1 = ok2 ? "Ok: key(\"" : "FAIL: key(\"";
\r
234 msg2 = "\").compareTo(key(\"";
\r
235 msg3 = "\")) returned ";
\r
236 sResult = appendCompareResult(keyResult, sResult);
\r
238 logln(msg1 + source + msg2 + target + msg3 + sResult);
\r
240 errln(msg1 + source + msg2 + target + msg3 + sResult + msg4 + sExpect);
\r
243 errln(msg1 + prettify(sourceKey) + msg2 + prettify(targetKey));
\r
246 msg1 = ok3 ? "Ok: incCompare(\"" : "FAIL: incCompare(\"";
\r
248 msg3 = "\") returned ";
\r
250 sResult = appendCompareResult(incResult, sResult);
\r
253 logln(msg1 + source + msg2 + target + msg3 + sResult);
\r
255 errln(msg1 + source + msg2 + target + msg3 + sResult + msg4 + sExpect);
\r
260 private String appendCompareResult(int result, String target){
\r
261 if (result == -1) {
\r
263 } else if (result == 0) {
\r
265 } else if (result == 1) {
\r
266 target += "GREATER";
\r
269 target += huh + result;
\r
274 String prettify(CollationKey sourceKey) {
\r
276 byte[] bytes= sourceKey.toByteArray();
\r
277 String target = "[";
\r
279 for (i = 0; i < bytes.length; i++) {
\r
280 target += Integer.toHexString(bytes[i]);
\r