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