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 21CollationKanaTest::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 35CollationKanaTest::~CollationKanaTest() 36{ 37 delete myCollation; 38} 39 40const 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 49const 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 58const 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 67const UChar CollationKanaTest::testBaseCases[][CollationKanaTest::MAX_TOKEN_LEN] = { 68 {0x30AB, 0x0000}, 69 {0x30AB, 0x30AD, 0x0000}, 70 {0x30AD, 0x0000}, 71 {0x30AD, 0x30AD, 0x0000} 72}; 73 74const 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 81const 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 88const 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 95const 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 106void 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 */ 121void 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 */ 130void 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*/ 142void 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*/ 155void 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*/ 170void 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 182void 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