1 /********************************************************************
2 * COPYRIGHT:
3 * Copyright (c) 1997-2009, International Business Machines Corporation and
4 * others. All Rights Reserved.
5 ********************************************************************/
6
7 #include "unicode/utypes.h"
8
9 #if !UCONFIG_NO_COLLATION
10
11 #include "unicode/coll.h"
12 #include "unicode/tblcoll.h"
13 #include "unicode/unistr.h"
14 #include "unicode/sortkey.h"
15 #include "jacoll.h"
16
17 #include "sfwdchit.h"
18
CollationKanaTest()19 CollationKanaTest::CollationKanaTest()
20 : myCollation(0)
21 {
22 UErrorCode status = U_ZERO_ERROR;
23 myCollation = Collator::createInstance(Locale::getJapan(), status);
24 if(!myCollation || U_FAILURE(status)) {
25 errcheckln(status, __FILE__ "failed to create! err " + UnicodeString(u_errorName(status)));
26 /* if it wasn't already: */
27 delete myCollation;
28 myCollation = NULL;
29 return;
30 }
31 }
32
~CollationKanaTest()33 CollationKanaTest::~CollationKanaTest()
34 {
35 delete myCollation;
36 }
37
38 const UChar CollationKanaTest::testSourceCases[][CollationKanaTest::MAX_TOKEN_LEN] = {
39 {0xff9E, 0x0000},
40 {0x3042, 0x0000},
41 {0x30A2, 0x0000},
42 {0x3042, 0x3042, 0x0000},
43 {0x30A2, 0x30FC, 0x0000},
44 {0x30A2, 0x30FC, 0x30C8, 0x0000} /* 6 */
45 };
46
47 const UChar CollationKanaTest::testTargetCases[][CollationKanaTest::MAX_TOKEN_LEN] = {
48 {0xFF9F, 0x0000},
49 {0x30A2, 0x0000},
50 {0x3042, 0x3042, 0x0000},
51 {0x30A2, 0x30FC, 0x0000},
52 {0x30A2, 0x30FC, 0x30C8, 0x0000},
53 {0x3042, 0x3042, 0x3068, 0x0000} /* 6 */
54 };
55
56 const Collator::EComparisonResult CollationKanaTest::results[] = {
57 Collator::LESS,
58 Collator::EQUAL, //Collator::LESS, /* Katakanas and Hiraganas are equal on tertiary level(ICU 2.0)*/
59 Collator::LESS,
60 Collator::GREATER, // Collator::LESS, /* Prolonged sound mark sorts BEFORE equivalent vowel (ICU 2.0)*/
61 Collator::LESS,
62 Collator::LESS, //Collator::GREATER /* Prolonged sound mark sorts BEFORE equivalent vowel (ICU 2.0)*//* 6 */
63 };
64
65 const UChar CollationKanaTest::testBaseCases[][CollationKanaTest::MAX_TOKEN_LEN] = {
66 {0x30AB, 0x0000},
67 {0x30AB, 0x30AD, 0x0000},
68 {0x30AD, 0x0000},
69 {0x30AD, 0x30AD, 0x0000}
70 };
71
72 const UChar CollationKanaTest::testPlainDakutenHandakutenCases[][CollationKanaTest::MAX_TOKEN_LEN] = {
73 {0x30CF, 0x30AB, 0x0000},
74 {0x30D0, 0x30AB, 0x0000},
75 {0x30CF, 0x30AD, 0x0000},
76 {0x30D0, 0x30AD, 0x0000}
77 };
78
79 const UChar CollationKanaTest::testSmallLargeCases[][CollationKanaTest::MAX_TOKEN_LEN] = {
80 {0x30C3, 0x30CF, 0x0000},
81 {0x30C4, 0x30CF, 0x0000},
82 {0x30C3, 0x30D0, 0x0000},
83 {0x30C4, 0x30D0, 0x0000}
84 };
85
86 const UChar CollationKanaTest::testKatakanaHiraganaCases[][CollationKanaTest::MAX_TOKEN_LEN] = {
87 {0x3042, 0x30C3, 0x0000},
88 {0x30A2, 0x30C3, 0x0000},
89 {0x3042, 0x30C4, 0x0000},
90 {0x30A2, 0x30C4, 0x0000}
91 };
92
93 const UChar CollationKanaTest::testChooonKigooCases[][CollationKanaTest::MAX_TOKEN_LEN] = {
94 /*0*/ {0x30AB, 0x30FC, 0x3042, 0x0000},
95 /*1*/ {0x30AB, 0x30FC, 0x30A2, 0x0000},
96 /*2*/ {0x30AB, 0x30A4, 0x3042, 0x0000},
97 /*3*/ {0x30AB, 0x30A4, 0x30A2, 0x0000},
98 /*6*/ {0x30AD, 0x30FC, 0x3042, 0x0000}, /* Prolonged sound mark sorts BEFORE equivalent vowel (ICU 2.0)*/
99 /*7*/ {0x30AD, 0x30FC, 0x30A2, 0x0000}, /* Prolonged sound mark sorts BEFORE equivalent vowel (ICU 2.0)*/
100 /*4*/ {0x30AD, 0x30A4, 0x3042, 0x0000},
101 /*5*/ {0x30AD, 0x30A4, 0x30A2, 0x0000},
102 };
103
TestTertiary()104 void CollationKanaTest::TestTertiary(/* char* par */)
105 {
106 int32_t i = 0;
107 UErrorCode status = U_ZERO_ERROR;
108 myCollation->setStrength(Collator::TERTIARY);
109 /* for one case, strcollinc fails, since it doesn't have good handling of contractions*/
110 /* normalization is turned off to stop strcollinc from executing */
111 myCollation->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status);
112 myCollation->setAttribute(UCOL_CASE_LEVEL, UCOL_ON, status);
113 for (i = 0; i < 6; i++) {
114 doTest(myCollation, testSourceCases[i], testTargetCases[i], results[i]);
115 }
116 }
117
118 /* Testing base letters */
TestBase()119 void CollationKanaTest::TestBase()
120 {
121 int32_t i;
122 myCollation->setStrength(Collator::PRIMARY);
123 for (i = 0; i < 3 ; i++)
124 doTest(myCollation, testBaseCases[i], testBaseCases[i + 1], Collator::LESS);
125 }
126
127 /* Testing plain, Daku-ten, Handaku-ten letters */
TestPlainDakutenHandakuten(void)128 void CollationKanaTest::TestPlainDakutenHandakuten(void)
129 {
130 int32_t i;
131 myCollation->setStrength(Collator::SECONDARY);
132 for (i = 0; i < 3 ; i++)
133 doTest(myCollation, testPlainDakutenHandakutenCases[i], testPlainDakutenHandakutenCases[i + 1],
134 Collator::LESS);
135 }
136
137 /*
138 * Test Small, Large letters
139 */
TestSmallLarge(void)140 void CollationKanaTest::TestSmallLarge(void)
141 {
142 int32_t i;
143 UErrorCode status = U_ZERO_ERROR;
144 myCollation->setStrength(Collator::TERTIARY);
145 myCollation->setAttribute(UCOL_CASE_LEVEL, UCOL_ON, status);
146 for (i = 0; i < 3 ; i++)
147 doTest(myCollation, testSmallLargeCases[i], testSmallLargeCases[i + 1], Collator::LESS);
148 }
149
150 /*
151 * Test Katakana, Hiragana letters
152 */
TestKatakanaHiragana(void)153 void CollationKanaTest::TestKatakanaHiragana(void)
154 {
155 int32_t i;
156 UErrorCode status = U_ZERO_ERROR;
157 myCollation->setStrength(Collator::QUATERNARY);
158 myCollation->setAttribute(UCOL_CASE_LEVEL, UCOL_ON, status);
159 for (i = 0; i < 3 ; i++) {
160 doTest(myCollation, testKatakanaHiraganaCases[i], testKatakanaHiraganaCases[i + 1],
161 Collator::LESS);
162 }
163 }
164
165 /*
166 * Test Choo-on kigoo
167 */
TestChooonKigoo(void)168 void CollationKanaTest::TestChooonKigoo(void)
169 {
170 int32_t i;
171 UErrorCode status = U_ZERO_ERROR;
172 myCollation->setStrength(Collator::QUATERNARY);
173 myCollation->setAttribute(UCOL_CASE_LEVEL, UCOL_ON, status);
174 for (i = 0; i < 7 ; i++) {
175 doTest(myCollation, testChooonKigooCases[i], testChooonKigooCases[i + 1], Collator::LESS);
176 }
177 }
178
179
runIndexedTest(int32_t index,UBool exec,const char * & name,char *)180 void CollationKanaTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
181 {
182 if (exec) logln("TestSuite CollationKanaTest: ");
183 if(myCollation) {
184 switch (index) {
185 case 0: name = "TestTertiary"; if (exec) TestTertiary(/* par */); break;
186 case 1: name = "TestBase"; if (exec) TestBase(/* par */); break;
187 case 2: name = "TestSmallLarge"; if (exec) TestSmallLarge(/* par */); break;
188 case 3: name = "TestTestPlainDakutenHandakuten"; if (exec) TestPlainDakutenHandakuten(/* par */); break;
189 case 4: name = "TestKatakanaHiragana"; if (exec) TestKatakanaHiragana(/* par */); break;
190 case 5: name = "TestChooonKigoo"; if (exec) TestChooonKigoo(/* par */); break;
191 default: name = ""; break;
192 }
193 } else {
194 dataerrln("Collator couldn't be instantiated!");
195 name = "";
196 }
197 }
198
199 #endif /* #if !UCONFIG_NO_COLLATION */
200