OLD | NEW |
(Empty) | |
| 1 /******************************************************************** |
| 2 * COPYRIGHT: |
| 3 * Copyright (c) 1997-2010, International Business Machines Corporation and |
| 4 * others. All Rights Reserved. |
| 5 ******************************************************************** |
| 6 ************************************************************************ |
| 7 * Date Name Description |
| 8 * 02/28/2001 aliu Creation |
| 9 * 03/01/2001 George port to HP/UX |
| 10 ************************************************************************/ |
| 11 |
| 12 #include "unicode/utypes.h" |
| 13 |
| 14 #if !UCONFIG_NO_TRANSLITERATION |
| 15 |
| 16 #include "jamotest.h" |
| 17 #include "unicode/utypes.h" |
| 18 #include "unicode/translit.h" |
| 19 #include "cpdtrans.h" |
| 20 |
| 21 // SEP is the disambiguation separator used by Latin-Jamo and Jamo-Latin |
| 22 #define SEP "-" |
| 23 |
| 24 JamoTest::JamoTest() |
| 25 { |
| 26 UParseError parseError; |
| 27 UErrorCode status = U_ZERO_ERROR; |
| 28 NAME_JAMO = Transliterator::createFromRules("Name-Jamo", |
| 29 UnicodeString(JAMO_NAMES_RULES, -1,
US_INV), |
| 30 UTRANS_FORWARD, parseError, status); |
| 31 |
| 32 if (U_FAILURE(status)) { |
| 33 delete NAME_JAMO; |
| 34 NAME_JAMO = NULL; |
| 35 } |
| 36 status = U_ZERO_ERROR; |
| 37 JAMO_NAME = Transliterator::createFromRules("Jamo-Name", |
| 38 UnicodeString(JAMO_NAMES_RULES, -1,
US_INV), |
| 39 UTRANS_REVERSE, parseError, status); |
| 40 if (U_FAILURE(status)) { |
| 41 delete JAMO_NAME; |
| 42 JAMO_NAME = NULL; |
| 43 } |
| 44 } |
| 45 |
| 46 JamoTest::~JamoTest() |
| 47 { |
| 48 delete NAME_JAMO; |
| 49 delete JAMO_NAME; |
| 50 } |
| 51 |
| 52 void |
| 53 JamoTest::runIndexedTest(int32_t index, UBool exec, |
| 54 const char* &name, char* /*par*/) { |
| 55 switch (index) { |
| 56 TESTCASE(0,TestJamo); |
| 57 TESTCASE(1,TestRealText); |
| 58 TESTCASE(2,TestPiecemeal); |
| 59 default: name = ""; break; |
| 60 } |
| 61 } |
| 62 |
| 63 void |
| 64 JamoTest::TestJamo() { |
| 65 UParseError parseError; |
| 66 UErrorCode status = U_ZERO_ERROR; |
| 67 Transliterator* latinJamo = Transliterator::createInstance("Latin-Jamo", UTR
ANS_FORWARD, parseError, status); |
| 68 |
| 69 if (latinJamo == 0 || U_FAILURE(status)) { |
| 70 dataerrln("FAIL: createInstance() returned 0 - %s", u_errorName(status))
; |
| 71 return; |
| 72 } |
| 73 |
| 74 Transliterator* jamoLatin = latinJamo->createInverse(status); |
| 75 |
| 76 if (jamoLatin == 0) { |
| 77 delete latinJamo; |
| 78 errln("FAIL: createInverse() returned 0"); |
| 79 return; |
| 80 } |
| 81 |
| 82 static const char* CASE[] = { |
| 83 // Column 1 is the latin text L1 to be fed to Latin-Jamo |
| 84 // to yield output J. |
| 85 |
| 86 // Column 2 is expected value of J. J is fed to |
| 87 // Jamo-Latin to yield output L2. |
| 88 |
| 89 // Column 3 is expected value of L2. If the expected |
| 90 // value of L2 is L1, then L2 is NULL. |
| 91 |
| 92 // add tests for the update to fix problems where it didn't foll
ow the standard |
| 93 // see also http://www.unicode.org/cldr/data/charts/transforms/L
atin-Hangul.html |
| 94 "gach", "(Gi)(A)(Cf)", NULL, |
| 95 "geumhui", "(Gi)(EU)(Mf)(Hi)(YI)", NULL, |
| 96 "choe", "(Ci)(OE)", NULL, |
| 97 "wo", "(IEUNG)(WEO)", NULL, |
| 98 "Wonpil", "(IEUNG)(WEO)(Nf)(Pi)(I)(L)", "wonpil", |
| 99 "GIPPEUM", "(Gi)(I)(BB)(EU)(Mf)", "gippeum", |
| 100 "EUTTEUM", "(IEUNG)(EU)(DD)(EU)(Mf)", "eutteum", |
| 101 "KKOTNAE", "(GGi)(O)(Tf)(Ni)(AE)", "kkotnae", |
| 102 "gaga", "(Gi)(A)(Gi)(A)", NULL, |
| 103 "gag-a", "(Gi)(A)(Gf)(IEUNG)(A)", NULL, |
| 104 "gak-ka", "(Gi)(A)(Kf)(Ki)(A)", NULL, |
| 105 "gakka", "(Gi)(A)(GGi)(A)", NULL, |
| 106 "gakk-a", "(Gi)(A)(GGf)(IEUNG)(A)", NULL, |
| 107 "gakkka", "(Gi)(A)(GGf)(Ki)(A)", NULL, |
| 108 "gak-kka", "(Gi)(A)(Kf)(GGi)(A)", NULL, |
| 109 |
| 110 "bab", "(Bi)(A)(Bf)", NULL, |
| 111 "babb", "(Bi)(A)(Bf)(Bi)(EU)", "babbeu", |
| 112 "babbba", "(Bi)(A)(Bf)(Bi)(EU)(Bi)(A)", "babbeuba", |
| 113 "bagg", "(Bi)(A)(Gf)(Gi)(EU)", "baggeu", |
| 114 "baggga", "(Bi)(A)(Gf)(Gi)(EU)(Gi)(A)", "baggeuga", |
| 115 //"bag" SEP "gga", "(Bi)(A)(Gf)" SEP "(Gi)(EU)(Gi)(A)", "bag" SEP "geuga
", |
| 116 "kabsa", "(Ki)(A)(Bf)(Si)(A)", NULL, |
| 117 "kabska", "(Ki)(A)(BS)(Ki)(A)", NULL, |
| 118 "gabsbka", "(Gi)(A)(BS)(Bi)(EU)(Ki)(A)", "gabsbeuka", // not (Kf) |
| 119 "gga", "(Gi)(EU)(Gi)(A)", "geuga", |
| 120 "bsa", "(Bi)(EU)(Si)(A)", "beusa", |
| 121 "agg", "(IEUNG)(A)(Gf)(Gi)(EU)", "aggeu", |
| 122 "agga", "(IEUNG)(A)(Gf)(Gi)(A)", NULL, |
| 123 "la", "(R)(A)", NULL, |
| 124 "bs", "(Bi)(EU)(Sf)", "beus", |
| 125 "kalgga", "(Ki)(A)(L)(Gi)(EU)(Gi)(A)", "kalgeuga", |
| 126 |
| 127 // 'r' in a final position is treated like 'l' |
| 128 "karka", "(Ki)(A)(L)(Ki)(A)", "kalka", |
| 129 }; |
| 130 |
| 131 enum { CASE_length = sizeof(CASE) / sizeof(CASE[0]) }; |
| 132 |
| 133 int32_t i; |
| 134 for (i=0; i<CASE_length; i+=3) { |
| 135 UnicodeString jamo = nameToJamo(CASE[i+1]); |
| 136 if (CASE[i+2] == NULL) { |
| 137 expect(*latinJamo, CASE[i], jamo, *jamoLatin); |
| 138 } else { |
| 139 // Handle case where round-trip is expected to fail |
| 140 expect(*latinJamo, CASE[i], jamo); |
| 141 expect(*jamoLatin, jamo, CASE[i+2]); |
| 142 } |
| 143 } |
| 144 |
| 145 delete latinJamo; |
| 146 delete jamoLatin; |
| 147 } |
| 148 |
| 149 /** |
| 150 * Test various step-at-a-time transformation of hangul to jamo to |
| 151 * latin and back. |
| 152 */ |
| 153 void JamoTest::TestPiecemeal(void) { |
| 154 UnicodeString hangul; hangul.append((UChar)0xBC0F); |
| 155 UnicodeString jamo = nameToJamo("(Mi)(I)(Cf)"); |
| 156 UnicodeString latin("mic"); |
| 157 UnicodeString latin2("mich"); |
| 158 |
| 159 Transliterator *t = NULL; |
| 160 UErrorCode status = U_ZERO_ERROR; |
| 161 |
| 162 t = Transliterator::createInstance("NFD", UTRANS_FORWARD, status); // was Ha
ngul-Jamo |
| 163 if (U_FAILURE(status) || t == 0) { |
| 164 dataerrln("FAIL: createInstance failed"); |
| 165 return; |
| 166 } |
| 167 expect(*t, hangul, jamo); |
| 168 delete t; |
| 169 |
| 170 t = Transliterator::createInstance("NFC", UTRANS_FORWARD, status); // was Ja
mo-Hangul |
| 171 if (U_FAILURE(status) || t == 0) { |
| 172 errln("FAIL: createInstance failed"); |
| 173 return; |
| 174 } |
| 175 expect(*t, jamo, hangul); |
| 176 delete t; |
| 177 |
| 178 t = Transliterator::createInstance("Latin-Jamo", UTRANS_FORWARD, status); |
| 179 if (U_FAILURE(status) || t == 0) { |
| 180 dataerrln("FAIL: createInstance failed - %s", u_errorName(status)); |
| 181 return; |
| 182 } |
| 183 expect(*t, latin, jamo); |
| 184 delete t; |
| 185 |
| 186 t = Transliterator::createInstance("Jamo-Latin", UTRANS_FORWARD, status); |
| 187 if (U_FAILURE(status) || t == 0) { |
| 188 errln("FAIL: createInstance failed"); |
| 189 return; |
| 190 } |
| 191 expect(*t, jamo, latin2); |
| 192 delete t; |
| 193 |
| 194 t = Transliterator::createInstance("Hangul-Latin", UTRANS_FORWARD, status); |
| 195 if (U_FAILURE(status) || t == 0) { |
| 196 errln("FAIL: createInstance failed"); |
| 197 return; |
| 198 } |
| 199 expect(*t, hangul, latin2); |
| 200 delete t; |
| 201 |
| 202 t = Transliterator::createInstance("Latin-Hangul", UTRANS_FORWARD, status); |
| 203 if (U_FAILURE(status) || t == 0) { |
| 204 errln("FAIL: createInstance failed"); |
| 205 return; |
| 206 } |
| 207 expect(*t, latin, hangul); |
| 208 delete t; |
| 209 |
| 210 t = Transliterator::createInstance("Hangul-Latin; Latin-Jamo", UTRANS_FORWAR
D, status); |
| 211 if (U_FAILURE(status) || t == 0) { |
| 212 errln("FAIL: createInstance failed"); |
| 213 return; |
| 214 } |
| 215 expect(*t, hangul, jamo); |
| 216 delete t; |
| 217 |
| 218 t = Transliterator::createInstance("Jamo-Latin; Latin-Hangul", UTRANS_FORWAR
D, status); |
| 219 if (U_FAILURE(status) || t == 0) { |
| 220 errln("FAIL: createInstance failed"); |
| 221 return; |
| 222 } |
| 223 expect(*t, jamo, hangul); |
| 224 delete t; |
| 225 |
| 226 t = Transliterator::createInstance("Hangul-Latin; Latin-Hangul", UTRANS_FORW
ARD, status); |
| 227 if (U_FAILURE(status) || t == 0) { |
| 228 errln("FAIL: createInstance failed"); |
| 229 return; |
| 230 } |
| 231 expect(*t, hangul, hangul); |
| 232 delete t; |
| 233 } |
| 234 |
| 235 void |
| 236 JamoTest::TestRealText() { |
| 237 // Test text taken from the Unicode web site |
| 238 static const char* const WHAT_IS_UNICODE[] = { |
| 239 "\\uc720\\ub2c8\\ucf54\\ub4dc\\uc5d0", "\\ub300\\ud574", "?", |
| 240 |
| 241 "\\uc5b4\\ub5a4", "\\ud50c\\ub7ab\\ud3fc,", "\\uc5b4\\ub5a4", |
| 242 "\\ud504\\ub85c\\uadf8\\ub7a8,", "\\uc5b4\\ub5a4", "\\uc5b8\\uc5b4\\uc5d0\
\ub3c4", |
| 243 "\\uc0c1\\uad00\\uc5c6\\uc774", "\\uc720\\ub2c8\\ucf54\\ub4dc\\ub294", "\\
ubaa8\\ub4e0", |
| 244 "\\ubb38\\uc790\\uc5d0", "\\ub300\\ud574", "\\uace0\\uc720", "\\ubc88\\ud6
38\\ub97c", |
| 245 "\\uc81c\\uacf5\\ud569\\ub2c8\\ub2e4.", |
| 246 |
| 247 "\\uae30\\ubcf8\\uc801\\uc73c\\ub85c", "\\ucef4\\ud4e8\\ud130\\ub294", |
| 248 "\\uc22b\\uc790\\ub9cc", "\\ucc98\\ub9ac\\ud569\\ub2c8\\ub2e4.", "\\uae00\
\uc790\\ub098", |
| 249 "\\ub2e4\\ub978", "\\ubb38\\uc790\\uc5d0\\ub3c4", "\\uc22b\\uc790\\ub97c", |
| 250 "\\uc9c0\\uc815\\ud558\\uc5ec", |
| 251 "\\uc800\\uc7a5\\ud569\\ub2c8\\ub2e4.", "\\uc720\\ub2c8\\ucf54\\ub4dc\\uac
00", |
| 252 "\\uac1c\\ubc1c\\ub418\\uae30", "\\uc804\\uc5d0\\ub294", "\\uc774\\ub7ec\\
ud55c", |
| 253 "\\uc22b\\uc790\\ub97c", "\\uc9c0\\uc815\\ud558\\uae30", "\\uc704\\ud574",
"\\uc218\\ubc31", |
| 254 "\\uac00\\uc9c0\\uc758", "\\ub2e4\\ub978", "\\uae30\\ud638\\ud654", |
| 255 "\\uc2dc\\uc2a4\\ud15c\\uc744", |
| 256 "\\uc0ac\\uc6a9\\ud588\\uc2b5\\ub2c8\\ub2e4.", "\\ub2e8\\uc77c", "\\uae30\
\ud638\\ud654", |
| 257 "\\ubc29\\ubc95\\uc73c\\ub85c\\ub294", "\\ubaa8\\ub4e0", "\\ubb38\\uc790\\
ub97c", |
| 258 "\\ud3ec\\ud568\\ud560", "\\uc218", "\\uc5c6\\uc5c8\\uc2b5\\ub2c8\\ub2e4."
, "\\uc608\\ub97c", |
| 259 "\\ub4e4\\uc5b4", "\\uc720\\ub7fd", "\\uc5f0\\ud569\\uc5d0\\uc11c\\ub9cc", |
| 260 "\\ubcf4\\ub354\\ub77c\\ub3c4", "\\ubaa8\\ub4e0", "\\uac01", "\\ub098\\ub7
7c\\ubcc4", |
| 261 "\\uc5b8\\uc5b4\\ub97c", "\\ucc98\\ub9ac\\ud558\\ub824\\uba74", "\\uc5ec\\
ub7ec", |
| 262 "\\uac1c\\uc758", "\\ub2e4\\ub978", "\\uae30\\ud638\\ud654", "\\ubc29\\ubc
95\\uc774", |
| 263 "\\ud544\\uc694\\ud569\\ub2c8\\ub2e4.", "\\uc601\\uc5b4\\uc640", "\\uac19\
\uc740", |
| 264 "\\ub2e8\\uc77c", "\\uc5b8\\uc5b4\\uc758", "\\uacbd\\uc6b0\\ub3c4", |
| 265 "\\uacf5\\ud1b5\\uc801\\uc73c\\ub85c", "\\uc0ac\\uc6a9\\ub418\\ub294", "\\
ubaa8\\ub4e0", |
| 266 "\\uae00\\uc790,", "\\ubb38\\uc7a5", "\\ubd80\\ud638", "\\ubc0f", |
| 267 "\\ud14c\\ud06c\\ub2c8\\uceec", "\\uae30\\ud638\\uc5d0", "\\ub9de\\ub294",
"\\ub2e8\\uc77c", |
| 268 "\\uae30\\ud638\\ud654", "\\ubc29\\ubc95\\uc744", "\\uac16\\uace0", "\\uc7
88\\uc9c0", |
| 269 "\\ubabb\\ud558\\uc600\\uc2b5\\ub2c8\\ub2e4.", |
| 270 |
| 271 "\\uc774\\ub7ec\\ud55c", "\\uae30\\ud638\\ud654", "\\uc2dc\\uc2a4\\ud15c\\
uc740", |
| 272 "\\ub610\\ud55c", "\\ub2e4\\ub978", "\\uae30\\ud638\\ud654", "\\uc2dc\\uc2
a4\\ud15c\\uacfc", |
| 273 "\\ucda9\\ub3cc\\ud569\\ub2c8\\ub2e4.", "\\uc989", "\\ub450", "\\uac00\\uc
9c0", |
| 274 "\\uae30\\ud638\\ud654", "\\ubc29\\ubc95\\uc774", "\\ub450", "\\uac1c\\uc7
58", "\\ub2e4\\ub978", |
| 275 "\\ubb38\\uc790\\uc5d0", "\\ub300\\ud574", "\\uac19\\uc740", "\\ubc88\\ud6
38\\ub97c", |
| 276 "\\uc0ac\\uc6a9\\ud558\\uac70\\ub098", "\\uac19\\uc740", "\\ubb38\\uc790\\
uc5d0", |
| 277 "\\ub300\\ud574", "\\ub2e4\\ub978", "\\ubc88\\ud638\\ub97c", "\\uc0ac\\uc6
a9\\ud560", "\\uc218", |
| 278 "\\uc788\\uc2b5\\ub2c8\\ub2e4.", "\\uc8fc\\uc5b4\\uc9c4", "\\ubaa8\\ub4e0"
, |
| 279 "\\ucef4\\ud4e8\\ud130(\\ud2b9\\ud788", "\\uc11c\\ubc84)\\ub294", "\\uc11c
\\ub85c", |
| 280 "\\ub2e4\\ub978", "\\uc5ec\\ub7ec", "\\uac00\\uc9c0", "\\uae30\\ud638\\ud6
54", |
| 281 "\\ubc29\\ubc95\\uc744", "\\uc9c0\\uc6d0\\ud574\\uc57c", |
| 282 "\\ud569\\ub2c8\\ub2e4.", "\\uadf8\\ub7ec\\ub098,", "\\ub370\\uc774\\ud130
\\ub97c", |
| 283 "\\uc11c\\ub85c", "\\ub2e4\\ub978", "\\uae30\\ud638\\ud654", "\\ubc29\\ubc
95\\uc774\\ub098", |
| 284 "\\ud50c\\ub7ab\\ud3fc", "\\uac04\\uc5d0", "\\uc804\\ub2ec\\ud560", "\\ub5
4c\\ub9c8\\ub2e4", |
| 285 "\\uadf8", "\\ub370\\uc774\\ud130\\ub294", "\\ud56d\\uc0c1", "\\uc190\\uc0
c1\\uc758", |
| 286 "\\uc704\\ud5d8\\uc744", "\\uacaa\\uac8c", "\\ub429\\ub2c8\\ub2e4.", |
| 287 |
| 288 "\\uc720\\ub2c8\\ucf54\\ub4dc\\ub85c", "\\ubaa8\\ub4e0", "\\uac83\\uc744", |
| 289 "\\ud574\\uacb0\\ud560", "\\uc218", "\\uc788\\uc2b5\\ub2c8\\ub2e4!", |
| 290 "\\uc720\\ub2c8\\ucf54\\ub4dc\\ub294", "\\uc0ac\\uc6a9", "\\uc911\\uc778", |
| 291 "\\ud50c\\ub7ab\\ud3fc,", "\\ud504\\ub85c\\uadf8\\ub7a8,", "\\uc5b8\\uc5b4
\\uc5d0", |
| 292 "\\uad00\\uacc4\\uc5c6\\uc774", "\\ubb38\\uc790\\ub9c8\\ub2e4", "\\uace0\\
uc720\\ud55c", |
| 293 "\\uc22b\\uc790\\ub97c", |
| 294 "\\uc81c\\uacf5\\ud569\\ub2c8\\ub2e4.", "\\uc720\\ub2c8\\ucf54\\ub4dc", |
| 295 "\\ud45c\\uc900\\uc740", // "Apple, HP, IBM, JustSystem, Microsoft, Oracle
, SAP, " |
| 296 // "Sun, Sybase, Unisys " |
| 297 "\\ubc0f", "\\uae30\\ud0c0", "\\uc5ec\\ub7ec", |
| 298 "\\ud68c\\uc0ac\\uc640", "\\uac19\\uc740", "\\uc5c5\\uacc4", |
| 299 "\\uc120\\ub450\\uc8fc\\uc790\\uc5d0", "\\uc758\\ud574", |
| 300 "\\ucc44\\ud0dd\\ub418\\uc5c8\\uc2b5\\ub2c8\\ub2e4.", "\\uc720\\ub2c8\\ucf
54\\ub4dc\\ub294", |
| 301 // "XML, Java, ECMAScript(JavaScript), LDAP, CORBA 3.0, WML " |
| 302 "\\ub4f1\\uacfc", |
| 303 "\\uac19\\uc774", "\\ud604\\uc7ac", "\\ub110\\ub9ac", "\\uc0ac\\uc6a9\\ub4
18\\ub294", |
| 304 "\\ud45c\\uc900\\uc5d0\\uc11c", "\\ud544\\uc694\\ud558\\uba70", "\\uc774\\
ub294", // "ISO/IEC", |
| 305 "10646\\uc744", "\\uad6c\\ud604\\ud558\\ub294", "\\uacf5\\uc2dd\\uc801\\uc
778", |
| 306 "\\ubc29\\ubc95\\uc785\\ub2c8\\ub2e4.", "\\uc774\\ub294", "\\ub9ce\\uc740"
, "\\uc6b4\\uc601", |
| 307 "\\uccb4\\uc81c,", "\\uc694\\uc998", "\\uc0ac\\uc6a9\\ub418\\ub294", "\\ub
aa8\\ub4e0", |
| 308 "\\ube0c\\ub77c\\uc6b0\\uc800", "\\ubc0f", "\\uae30\\ud0c0", "\\ub9ce\\uc7
40", |
| 309 "\\uc81c\\ud488\\uc5d0\\uc11c", |
| 310 "\\uc9c0\\uc6d0\\ub429\\ub2c8\\ub2e4.", "\\uc720\\ub2c8\\ucf54\\ub4dc", |
| 311 "\\ud45c\\uc900\\uc758", "\\ubd80\\uc0c1\\uacfc", "\\uc774\\ub97c", |
| 312 "\\uc9c0\\uc6d0\\ud558\\ub294", "\\ub3c4\\uad6c\\uc758", "\\uac00\\uc6a9\\
uc131\\uc740", |
| 313 "\\ucd5c\\uadfc", "\\uc804", "\\uc138\\uacc4\\uc5d0", "\\ubd88\\uace0", "\
\uc788\\ub294", |
| 314 "\\uae30\\uc220", "\\uacbd\\ud5a5\\uc5d0\\uc11c", "\\uac00\\uc7a5", "\\uc9
11\\uc694\\ud55c", |
| 315 "\\ubd80\\ubd84\\uc744", "\\ucc28\\uc9c0\\ud558\\uace0", "\\uc788\\uc2b5\\
ub2c8\\ub2e4.", |
| 316 |
| 317 "\\uc720\\ub2c8\\ucf54\\ub4dc\\ub97c", |
| 318 // Replaced a hyphen with a space to make the test case work with CLDR1.5
|
| 319 //"\\ud074\\ub77c\\uc774\\uc5b8\\ud2b8-\\uc11c\\ubc84", "\\ub610\\ub294", |
| 320 "\\ud074\\ub77c\\uc774\\uc5b8\\ud2b8 \\uc11c\\ubc84", "\\ub610\\ub294", |
| 321 // Replaced a hyphen with a space. |
| 322 //"\\ub2e4\\uc911-\\uc5f0\\uacb0", "\\uc751\\uc6a9", "\\ud504\\ub85c\\uadf
8\\ub7a8\\uacfc", |
| 323 "\\ub2e4\\uc911 \\uc5f0\\uacb0", "\\uc751\\uc6a9", "\\ud504\\ub85c\\uadf8\
\ub7a8\\uacfc", |
| 324 "\\uc6f9", "\\uc0ac\\uc774\\ud2b8\\uc5d0", "\\ud1b5\\ud569\\ud558\\uba74", |
| 325 "\\ub808\\uac70\\uc2dc", "\\ubb38\\uc790", "\\uc138\\ud2b8", "\\uc0ac\\uc6
a9\\uc5d0", |
| 326 "\\uc788\\uc5b4\\uc11c", "\\uc0c1\\ub2f9\\ud55c", "\\ube44\\uc6a9", "\\uc8
08\\uac10", |
| 327 "\\ud6a8\\uacfc\\uac00", |
| 328 "\\ub098\\ud0c0\\ub0a9\\ub2c8\\ub2e4.", "\\uc720\\ub2c8\\ucf54\\ub4dc\\ub9
7c", |
| 329 "\\ud1b5\\ud574", "\\ub9ac\\uc5d4\\uc9c0\\ub2c8\\uc5b4\\ub9c1", "\\uc5c6\\
uc774", |
| 330 "\\ub2e4\\uc911", "\\ud50c\\ub7ab\\ud3fc,", "\\uc5b8\\uc5b4", "\\ubc0f", "
\\uad6d\\uac00", |
| 331 "\\uac04\\uc5d0", "\\ub2e8\\uc77c", "\\uc18c\\ud504\\ud2b8\\uc6e8\\uc5b4", |
| 332 "\\ud50c\\ub7ab\\ud3fc", "\\ub610\\ub294", "\\ub2e8\\uc77c", "\\uc6f9", |
| 333 "\\uc0ac\\uc774\\ud2b8\\ub97c", "\\ubaa9\\ud45c\\ub85c", "\\uc0bc\\uc744",
"\\uc218", |
| 334 "\\uc788\\uc2b5\\ub2c8\\ub2e4.", "\\uc774\\ub97c", "\\uc0ac\\uc6a9\\ud558\
\uba74", |
| 335 "\\ub370\\uc774\\ud130\\ub97c", "\\uc190\\uc0c1", "\\uc5c6\\uc774", "\\uc5
ec\\ub7ec", |
| 336 "\\uc2dc\\uc2a4\\ud15c\\uc744", "\\ud1b5\\ud574", "\\uc804\\uc1a1\\ud560",
"\\uc218", |
| 337 "\\uc788\\uc2b5\\ub2c8\\ub2e4.", |
| 338 |
| 339 "\\uc720\\ub2c8\\ucf54\\ub4dc", "\\ucf58\\uc18c\\uc2dc\\uc5c4\\uc5d0", "\\
ub300\\ud574", |
| 340 "\\uc720\\ub2c8\\ucf54\\ub4dc", "\\ucf58\\uc18c\\uc2dc\\uc5c4\\uc740", |
| 341 "\\ube44\\uc601\\ub9ac", "\\uc870\\uc9c1\\uc73c\\ub85c\\uc11c", "\\ud604\\
ub300", |
| 342 "\\uc18c\\ud504\\ud2b8\\uc6e8\\uc5b4", "\\uc81c\\ud488\\uacfc", |
| 343 "\\ud45c\\uc900\\uc5d0\\uc11c", "\\ud14d\\uc2a4\\ud2b8\\uc758", "\\ud45c\\
ud604\\uc744", |
| 344 "\\uc9c0\\uc815\\ud558\\ub294", "\\uc720\\ub2c8\\ucf54\\ub4dc", "\\ud45c\\
uc900\\uc758", |
| 345 "\\uc0ac\\uc6a9\\uc744", "\\uac1c\\ubc1c\\ud558\\uace0", "\\ud655\\uc7a5\\
ud558\\uba70", |
| 346 "\\uc7a5\\ub824\\ud558\\uae30", "\\uc704\\ud574", |
| 347 "\\uc138\\uc6cc\\uc84c\\uc2b5\\ub2c8\\ub2e4.", "\\ucf58\\uc18c\\uc2dc\\uc5
c4", |
| 348 "\\uba64\\ubc84\\uc27d\\uc740", "\\ucef4\\ud4e8\\ud130\\uc640", "\\uc815\\
ubcf4", |
| 349 "\\ucc98\\ub9ac", "\\uc0b0\\uc5c5\\uc5d0", "\\uc885\\uc0ac\\ud558\\uace0",
"\\uc788\\ub294", |
| 350 "\\uad11\\ubc94\\uc704\\ud55c", "\\ud68c\\uc0ac", "\\ubc0f", "\\uc870\\uc9
c1\\uc758", |
| 351 "\\ubc94\\uc704\\ub97c", |
| 352 "\\ub098\\ud0c0\\ub0c5\\ub2c8\\ub2e4.", "\\ucf58\\uc18c\\uc2dc\\uc5c4\\uc7
58", |
| 353 "\\uc7ac\\uc815\\uc740", "\\uc804\\uc801\\uc73c\\ub85c", "\\ud68c\\ube44\\
uc5d0", |
| 354 "\\uc758\\ud574", "\\ucda9\\ub2f9\\ub429\\ub2c8\\ub2e4.", "\\uc720\\ub2c8\
\ucf54\\ub4dc", |
| 355 "\\ucee8\\uc18c\\uc2dc\\uc5c4\\uc5d0\\uc11c\\uc758", "\\uba64\\ubc84\\uc27
d\\uc740", |
| 356 "\\uc804", "\\uc138\\uacc4", "\\uc5b4\\ub290", "\\uacf3\\uc5d0\\uc11c\\ub0
98", |
| 357 "\\uc720\\ub2c8\\ucf54\\ub4dc", "\\ud45c\\uc900\\uc744", "\\uc9c0\\uc6d0\\
ud558\\uace0", |
| 358 "\\uadf8", "\\ud655\\uc7a5\\uacfc", "\\uad6c\\ud604\\uc744", |
| 359 "\\uc9c0\\uc6d0\\ud558\\uace0\\uc790\\ud558\\ub294", "\\uc870\\uc9c1\\uacf
c", |
| 360 "\\uac1c\\uc778\\uc5d0\\uac8c", "\\uac1c\\ubc29\\ub418\\uc5b4", |
| 361 "\\uc788\\uc2b5\\ub2c8\\ub2e4.", |
| 362 |
| 363 "\\ub354", "\\uc790\\uc138\\ud55c", "\\ub0b4\\uc6a9\\uc740", "\\uc6a9\\uc5
b4\\uc9d1,", |
| 364 "\\uc608\\uc81c", "\\uc720\\ub2c8\\ucf54\\ub4dc", "\\uc0ac\\uc6a9", "\\uac
00\\ub2a5", |
| 365 "\\uc81c\\ud488,", "\\uae30\\uc220", "\\uc815\\ubcf4", "\\ubc0f", "\\uae30
\\ud0c0", |
| 366 "\\uc720\\uc6a9\\ud55c", "\\uc815\\ubcf4\\ub97c", |
| 367 "\\ucc38\\uc870\\ud558\\uc2ed\\uc2dc\\uc624." |
| 368 }; |
| 369 |
| 370 enum { WHAT_IS_UNICODE_length = sizeof(WHAT_IS_UNICODE) / sizeof(WHAT_IS_UNI
CODE[0]) }; |
| 371 |
| 372 UParseError parseError; |
| 373 UErrorCode status = U_ZERO_ERROR; |
| 374 Transliterator* latinJamo = Transliterator::createInstance("Latin-Jamo", UTR
ANS_FORWARD, parseError, status); |
| 375 Transliterator* jamoHangul = Transliterator::createInstance("NFC(NFD)", UTRA
NS_FORWARD, parseError, status); |
| 376 if (latinJamo == 0 || jamoHangul == 0 || U_FAILURE(status)) { |
| 377 delete latinJamo; |
| 378 delete jamoHangul; |
| 379 dataerrln("FAIL: createInstance returned NULL - %s", u_errorName(status)
); |
| 380 return; |
| 381 } |
| 382 Transliterator* jamoLatin = latinJamo->createInverse(status); |
| 383 Transliterator* hangulJamo = jamoHangul->createInverse(status); |
| 384 if (jamoLatin == 0 || hangulJamo == 0) { |
| 385 errln("FAIL: createInverse returned NULL"); |
| 386 delete latinJamo; |
| 387 delete jamoLatin; |
| 388 delete jamoHangul; |
| 389 delete hangulJamo; |
| 390 return; |
| 391 } |
| 392 |
| 393 Transliterator* tarray[4] = |
| 394 { hangulJamo, jamoLatin, latinJamo, jamoHangul }; |
| 395 CompoundTransliterator rt(tarray, 4); |
| 396 |
| 397 UnicodeString buf; |
| 398 int32_t total = 0; |
| 399 int32_t errors = 0; |
| 400 int32_t i; |
| 401 for (i=0; i < WHAT_IS_UNICODE_length; ++i) { |
| 402 ++total; |
| 403 UnicodeString hangul = UnicodeString(WHAT_IS_UNICODE[i], -1, US_INV); |
| 404 hangul = hangul.unescape(); // Parse backslash-u escapes |
| 405 UnicodeString hangulX = hangul; |
| 406 rt.transliterate(hangulX); |
| 407 if (hangul != hangulX) { |
| 408 ++errors; |
| 409 UnicodeString jamo = hangul; hangulJamo->transliterate(jamo); |
| 410 UnicodeString latin = jamo; jamoLatin->transliterate(latin); |
| 411 UnicodeString jamo2 = latin; latinJamo->transliterate(jamo2); |
| 412 UnicodeString hangul2 = jamo2; jamoHangul->transliterate(hangul2); |
| 413 |
| 414 buf.remove(0); |
| 415 buf.append("FAIL: "); |
| 416 if (hangul2 != hangulX) { |
| 417 buf.append((UnicodeString)"(Weird: " + hangulX + " != " + hangul
2 + ")"); |
| 418 } |
| 419 // The Hangul-Jamo conversion is not usually the |
| 420 // bug here, so we hide it from display. |
| 421 // Uncomment lines to see the Hangul. |
| 422 buf.append(//hangul + " => " + |
| 423 jamoToName(jamo) + " => " + |
| 424 latin + " => " + jamoToName(jamo2) |
| 425 //+ " => " + hangul2 |
| 426 ); |
| 427 errln(prettify(buf)); |
| 428 } |
| 429 } |
| 430 if (errors != 0) { |
| 431 errln((UnicodeString)"Test word failures: " + errors + " out of " + tota
l); |
| 432 } else { |
| 433 logln((UnicodeString)"All " + total + " test words passed"); |
| 434 } |
| 435 |
| 436 delete latinJamo; |
| 437 delete jamoLatin; |
| 438 delete jamoHangul; |
| 439 delete hangulJamo; |
| 440 } |
| 441 |
| 442 // Override TransliteratorTest |
| 443 void |
| 444 JamoTest::expectAux(const UnicodeString& tag, |
| 445 const UnicodeString& summary, UBool pass, |
| 446 const UnicodeString& expectedResult) { |
| 447 UnicodeString jsum = jamoToName(summary); |
| 448 UnicodeString jexp = jamoToName(expectedResult); |
| 449 TransliteratorTest::expectAux(tag, jsum, pass, jexp); |
| 450 } |
| 451 |
| 452 const char* JamoTest::JAMO_NAMES_RULES = |
| 453 "'(Gi)' <> \\u1100;" |
| 454 "'(GGi)' <> \\u1101;" |
| 455 "'(Ni)' <> \\u1102;" |
| 456 "'(Di)' <> \\u1103;" |
| 457 "'(DD)' <> \\u1104;" |
| 458 "'(R)' <> \\u1105;" |
| 459 "'(Mi)' <> \\u1106;" |
| 460 "'(Bi)' <> \\u1107;" |
| 461 "'(BB)' <> \\u1108;" |
| 462 "'(Si)' <> \\u1109;" |
| 463 "'(SSi)' <> \\u110A;" |
| 464 "'(IEUNG)' <> \\u110B;" |
| 465 "'(Ji)' <> \\u110C;" |
| 466 "'(JJ)' <> \\u110D;" |
| 467 "'(Ci)' <> \\u110E;" |
| 468 "'(Ki)' <> \\u110F;" |
| 469 "'(Ti)' <> \\u1110;" |
| 470 "'(Pi)' <> \\u1111;" |
| 471 "'(Hi)' <> \\u1112;" |
| 472 |
| 473 "'(A)' <> \\u1161;" |
| 474 "'(AE)' <> \\u1162;" |
| 475 "'(YA)' <> \\u1163;" |
| 476 "'(YAE)' <> \\u1164;" |
| 477 "'(EO)' <> \\u1165;" |
| 478 "'(E)' <> \\u1166;" |
| 479 "'(YEO)' <> \\u1167;" |
| 480 "'(YE)' <> \\u1168;" |
| 481 "'(O)' <> \\u1169;" |
| 482 "'(WA)' <> \\u116A;" |
| 483 "'(WAE)' <> \\u116B;" |
| 484 "'(OE)' <> \\u116C;" |
| 485 "'(YO)' <> \\u116D;" |
| 486 "'(U)' <> \\u116E;" |
| 487 "'(WEO)' <> \\u116F;" |
| 488 "'(WE)' <> \\u1170;" |
| 489 "'(WI)' <> \\u1171;" |
| 490 "'(YU)' <> \\u1172;" |
| 491 "'(EU)' <> \\u1173;" |
| 492 "'(YI)' <> \\u1174;" |
| 493 "'(I)' <> \\u1175;" |
| 494 |
| 495 "'(Gf)' <> \\u11A8;" |
| 496 "'(GGf)' <> \\u11A9;" |
| 497 "'(GS)' <> \\u11AA;" |
| 498 "'(Nf)' <> \\u11AB;" |
| 499 "'(NJ)' <> \\u11AC;" |
| 500 "'(NH)' <> \\u11AD;" |
| 501 "'(Df)' <> \\u11AE;" |
| 502 "'(L)' <> \\u11AF;" |
| 503 "'(LG)' <> \\u11B0;" |
| 504 "'(LM)' <> \\u11B1;" |
| 505 "'(LB)' <> \\u11B2;" |
| 506 "'(LS)' <> \\u11B3;" |
| 507 "'(LT)' <> \\u11B4;" |
| 508 "'(LP)' <> \\u11B5;" |
| 509 "'(LH)' <> \\u11B6;" |
| 510 "'(Mf)' <> \\u11B7;" |
| 511 "'(Bf)' <> \\u11B8;" |
| 512 "'(BS)' <> \\u11B9;" |
| 513 "'(Sf)' <> \\u11BA;" |
| 514 "'(SSf)' <> \\u11BB;" |
| 515 "'(NG)' <> \\u11BC;" |
| 516 "'(Jf)' <> \\u11BD;" |
| 517 "'(Cf)' <> \\u11BE;" |
| 518 "'(Kf)' <> \\u11BF;" |
| 519 "'(Tf)' <> \\u11C0;" |
| 520 "'(Pf)' <> \\u11C1;" |
| 521 "'(Hf)' <> \\u11C2;"; |
| 522 |
| 523 /** |
| 524 * Convert short names to actual jamo. E.g., "x(LG)y" returns |
| 525 * "x\u11B0y". See JAMO_NAMES for table of names. |
| 526 */ |
| 527 UnicodeString |
| 528 JamoTest::nameToJamo(const UnicodeString& input) { |
| 529 if (NAME_JAMO == 0) { |
| 530 errln("Failed to create NAME_JAMO"); |
| 531 return input; /* failure! */ |
| 532 } |
| 533 UnicodeString result(input); |
| 534 NAME_JAMO->transliterate(result); |
| 535 return result; |
| 536 } |
| 537 |
| 538 /** |
| 539 * Convert jamo to short names. E.g., "x\u11B0y" returns |
| 540 * "x(LG)y". See JAMO_NAMES for table of names. |
| 541 */ |
| 542 UnicodeString |
| 543 JamoTest::jamoToName(const UnicodeString& input) { |
| 544 if (NAME_JAMO == 0) { |
| 545 errln("Failed to create NAME_JAMO"); |
| 546 return input; /* failure! */ |
| 547 } |
| 548 UnicodeString result(input); |
| 549 JAMO_NAME->transliterate(result); |
| 550 return result; |
| 551 } |
| 552 |
| 553 #endif /* #if !UCONFIG_NO_TRANSLITERATION */ |
OLD | NEW |