]>
Commit | Line | Data |
---|---|---|
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 | ||
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 | ||
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 | ||
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 */ | |
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 */ | |
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 | */ | |
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 | */ | |
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 | */ | |
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 | ||
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 */ |