16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org********************************************************************** 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Copyright (C) 2000-2013, International Business Machines 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Corporation and others. All Rights Reserved. 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org********************************************************************** 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Date Name Description 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 05/23/00 aliu Creation. 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org********************************************************************** 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h" 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_TRANSLITERATION 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/translit.h" 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "rbt.h" 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/calendar.h" 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uniset.h" 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uchar.h" 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/normlzr.h" 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uchar.h" 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/parseerr.h" 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/usetiter.h" 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/putil.h" 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uversion.h" 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/locid.h" 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ulocdata.h" 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utf8.h" 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utf16.h" 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "putilimp.h" 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h" 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "transrt.h" 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "testutil.h" 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <string.h> 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdio.h> 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define CASE(id,test) case id: \ 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org name = #test; \ 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (exec) { \ 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln(#test "---"); \ 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln((UnicodeString)""); \ 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UDate t = uprv_getUTCtime(); \ 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test(); \ 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org t = uprv_getUTCtime() - t; \ 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln((UnicodeString)#test " took " + t/U_MILLIS_PER_DAY + " seconds"); \ 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } \ 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define EXHAUSTIVE(id,test) case id: \ 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(quick==FALSE){ \ 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org name = #test; \ 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (exec){ \ 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln(#test "---"); \ 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln((UnicodeString)""); \ 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test(); \ 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } \ 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }else{ \ 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org name=""; \ 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } \ 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTransliteratorRoundTripTest::runIndexedTest(int32_t index, UBool exec, 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char* &name, char* /*par*/) { 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org switch (index) { 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(0, TestCyrillic); 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // CASE(0,TestKana); 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(1,TestHiragana); 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(2,TestKatakana); 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(3,TestJamo); 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(4,TestHangul); 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(5,TestGreek); 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(6,TestGreekUNGEGN); 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(7,Testel); 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(8,TestDevanagariLatin); 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(9,TestInterIndic); 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(10, TestHebrew); 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(11, TestArabic); 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(12, TestHan); 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org default: name = ""; break; 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//-------------------------------------------------------------------- 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// TransliteratorPointer 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//-------------------------------------------------------------------- 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * A transliterator pointer wrapper that deletes the contained 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * pointer automatically when the wrapper goes out of scope. 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Sometimes called a "janitor" or "smart pointer". 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass TransliteratorPointer { 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Transliterator* t; 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // disallowed: 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TransliteratorPointer(const TransliteratorPointer& rhs); 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TransliteratorPointer& operator=(const TransliteratorPointer& rhs); 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TransliteratorPointer(Transliterator* adopted) { 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org t = adopted; 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ~TransliteratorPointer() { 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete t; 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org inline Transliterator* operator->() { return t; } 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org inline operator const Transliterator*() const { return t; } 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org inline operator Transliterator*() { return t; } 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//-------------------------------------------------------------------- 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Legal 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//-------------------------------------------------------------------- 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass Legal { 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Legal() {} 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual ~Legal() {} 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UBool is(const UnicodeString& /*sourceString*/) const {return TRUE;} 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass LegalJamo : public Legal { 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // any initial must be followed by a medial (or initial) 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // any medial must follow an initial (or medial) 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // any final must follow a medial (or final) 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LegalJamo() {} 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual ~LegalJamo() {} 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UBool is(const UnicodeString& sourceString) const; 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int getType(UChar c) const; 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool LegalJamo::is(const UnicodeString& sourceString) const { 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int t; 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString decomp; 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode ec = U_ZERO_ERROR; 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Normalizer::decompose(sourceString, FALSE, 0, decomp, ec); 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(ec)) { 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int i = 0; i < decomp.length(); ++i) { // don't worry about surrogates 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org switch (getType(decomp.charAt(i))) { 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 0: t = getType(decomp.charAt(i+1)); 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (t != 0 && t != 1) { return FALSE; } 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 1: t = getType(decomp.charAt(i-1)); 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (t != 0 && t != 1) { return FALSE; } 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 2: t = getType(decomp.charAt(i-1)); 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (t != 1 && t != 2) { return FALSE; } 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint LegalJamo::getType(UChar c) const { 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (0x1100 <= c && c <= 0x1112) 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else if (0x1161 <= c && c <= 0x1175) 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 1; 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else if (0x11A8 <= c && c <= 0x11C2) 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 2; 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return -1; // other 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass LegalGreek : public Legal { 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool full; 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LegalGreek(UBool _full) { full = _full; } 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual ~LegalGreek() {} 1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UBool is(const UnicodeString& sourceString) const; 1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static UBool isVowel(UChar c); 1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static UBool isRho(UChar c); 1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool LegalGreek::is(const UnicodeString& sourceString) const { 1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString decomp; 1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode ec = U_ZERO_ERROR; 1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Normalizer::decompose(sourceString, FALSE, 0, decomp, ec); 1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // modern is simpler: don't care about anything but a grave 1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (full == FALSE) { 1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // A special case which is legal but should be 1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // excluded from round trip 1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // if (sourceString == UnicodeString("\\u039C\\u03C0", "")) { 1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // return FALSE; 1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // } 1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int32_t i = 0; i < decomp.length(); ++i) { 1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar c = decomp.charAt(i); 1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // exclude all the accents 1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (c == 0x0313 || c == 0x0314 || c == 0x0300 || c == 0x0302 1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org || c == 0x0342 || c == 0x0345 1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ) return FALSE; 1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Legal greek has breathing marks IFF there is a vowel or RHO at the start 2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // IF it has them, it has exactly one. 2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // IF it starts with a RHO, then the breathing mark must come before the second letter. 2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Since there are no surrogates in greek, don't worry about them 2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool firstIsVowel = FALSE; 2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool firstIsRho = FALSE; 2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool noLetterYet = TRUE; 2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t breathingCount = 0; 2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t letterCount = 0; 2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int32_t i = 0; i < decomp.length(); ++i) { 2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar c = decomp.charAt(i); 2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (u_isalpha(c)) { 2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++letterCount; 2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (noLetterYet) { 2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org noLetterYet = FALSE; 2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org firstIsVowel = isVowel(c); 2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org firstIsRho = isRho(c); 2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (firstIsRho && letterCount == 2 && breathingCount == 0) { 2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (c == 0x0313 || c == 0x0314) { 2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++breathingCount; 2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (firstIsVowel || firstIsRho) return breathingCount == 1; 2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return breathingCount == 0; 2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool LegalGreek::isVowel(UChar c) { 2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org switch (c) { 2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 0x03B1: 2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 0x03B5: 2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 0x03B7: 2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 0x03B9: 2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 0x03BF: 2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 0x03C5: 2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 0x03C9: 2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 0x0391: 2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 0x0395: 2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 0x0397: 2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 0x0399: 2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 0x039F: 2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 0x03A5: 2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 0x03A9: 2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool LegalGreek::isRho(UChar c) { 2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org switch (c) { 2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 0x03C1: 2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 0x03A1: 2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// AbbreviatedUnicodeSetIterator Interface --------------------------------------------- 2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Iterate over a UnicodeSet, only returning a sampling of the contained code points. 2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// density is the approximate total number of code points to returned for the entire set. 2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// 2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass AbbreviatedUnicodeSetIterator : public UnicodeSetIterator { 2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic : 2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org AbbreviatedUnicodeSetIterator(); 2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual ~AbbreviatedUnicodeSetIterator(); 2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void reset(UnicodeSet& set, UBool abb = FALSE, int32_t density = 100); 2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ICU "poor man's RTTI", returns a UClassID for this class. 2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } 2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ICU "poor man's RTTI", returns a UClassID for the actual class. 2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } 2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate : 2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool abbreviated; 2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t perRange; // The maximum number of code points to be returned from each range 2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual void loadRange(int32_t range); 2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The address of this static class variable serves as this class's ID 2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * for ICU "poor man's RTTI". 2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const char fgClassID; 2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// AbbreviatedUnicodeSetIterator Implementation --------------------------------------- 2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst char AbbreviatedUnicodeSetIterator::fgClassID=0; 3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgAbbreviatedUnicodeSetIterator::AbbreviatedUnicodeSetIterator() : 3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeSetIterator(), abbreviated(FALSE) { 3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgAbbreviatedUnicodeSetIterator::~AbbreviatedUnicodeSetIterator() { 3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid AbbreviatedUnicodeSetIterator::reset(UnicodeSet& newSet, UBool abb, int32_t density) { 3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeSetIterator::reset(newSet); 3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org abbreviated = abb; 3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org perRange = newSet.getRangeCount(); 3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (perRange != 0) { 3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org perRange = density / perRange; 3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid AbbreviatedUnicodeSetIterator::loadRange(int32_t myRange) { 3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeSetIterator::loadRange(myRange); 3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (abbreviated && (endElement > nextElement + perRange)) { 3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org endElement = nextElement + perRange; 3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//-------------------------------------------------------------------- 3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// RTTest Interface 3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//-------------------------------------------------------------------- 3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass RTTest : public IntlTest { 3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // PrintWriter out; 3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString transliteratorID; 3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t errorLimit; 3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t errorCount; 3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t pairLimit; 3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeSet sourceRange; 3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeSet targetRange; 3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeSet toSource; 3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeSet toTarget; 3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeSet roundtripExclusionsSet; 3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org IntlTest* parent; 3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Legal* legalSource; // NOT owned 3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeSet badCharacters; 3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * create a test for the given script transliterator. 3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RTTest(const UnicodeString& transliteratorIDStr); 3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual ~RTTest(); 3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void setErrorLimit(int32_t limit); 3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void setPairLimit(int32_t limit); 3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void test(const UnicodeString& sourceRange, 3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& targetRange, 3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char* roundtripExclusions, 3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org IntlTest* parent, 3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool quick, 3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Legal* adoptedLegal, 3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t density = 100); 3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate: 3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Added to do better equality check. 3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static UBool isSame(const UnicodeString& a, const UnicodeString& b); 3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static UBool isCamel(const UnicodeString& a); 3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool checkIrrelevants(Transliterator *t, const UnicodeString& irrelevants); 3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void test2(UBool quick, int32_t density); 3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void logWrongScript(const UnicodeString& label, 3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& from, 3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& to); 3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void logNotCanonical(const UnicodeString& label, 3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& from, 3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& to, 3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& fromCan, 3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& toCan); 3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void logFails(const UnicodeString& label); 3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void logToRulesFails(const UnicodeString& label, 3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& from, 3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& to, 3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& toCan); 3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void logRoundTripFailure(const UnicodeString& from, 3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& toID, 3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& to, 3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& backID, 3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& back); 4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//-------------------------------------------------------------------- 4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// RTTest Implementation 4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//-------------------------------------------------------------------- 4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * create a test for the given script transliterator. 4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgRTTest::RTTest(const UnicodeString& transliteratorIDStr) { 4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org transliteratorID = transliteratorIDStr; 4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorLimit = 500; 4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCount = 0; 4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pairLimit = 0x10000; 4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgRTTest::~RTTest() { 4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid RTTest::setErrorLimit(int32_t limit) { 4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorLimit = limit; 4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid RTTest::setPairLimit(int32_t limit) { 4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pairLimit = limit; 4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool RTTest::isSame(const UnicodeString& a, const UnicodeString& b) { 4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (a == b) return TRUE; 4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (a.caseCompare(b, U_FOLD_CASE_DEFAULT)==0 && isCamel(a)) return TRUE; 4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString aa, bb; 4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode ec = U_ZERO_ERROR; 4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Normalizer::decompose(a, FALSE, 0, aa, ec); 4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Normalizer::decompose(b, FALSE, 0, bb, ec); 4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (aa == bb) return TRUE; 4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (aa.caseCompare(bb, U_FOLD_CASE_DEFAULT)==0 && isCamel(aa)) return TRUE; 4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool RTTest::isCamel(const UnicodeString& a) { 4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // see if string is of the form aB; e.g. lower, then upper or title 4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 cp; 4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool haveLower = FALSE; 4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int32_t i = 0; i < a.length(); i += U16_LENGTH(cp)) { 4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org cp = a.char32At(i); 4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int8_t t = u_charType(cp); 4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org switch (t) { 4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case U_UPPERCASE_LETTER: 4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (haveLower) return TRUE; 4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case U_TITLECASE_LETTER: 4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (haveLower) return TRUE; 4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // drop through, since second letter is lower. 4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case U_LOWERCASE_LETTER: 4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org haveLower = TRUE; 4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid RTTest::test(const UnicodeString& sourceRangeVal, 4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& targetRangeVal, 4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char* roundtripExclusions, 4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org IntlTest* logVal, UBool quickRt, 4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Legal* adoptedLegal, 4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t density) 4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this->parent = logVal; 4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this->legalSource = adoptedLegal; 4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeSet neverOk("[:Other:]", status); 4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeSet okAnyway("[^[:Letter:]]", status); 4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->dataerrln("FAIL: Initializing UnicodeSet with [:Other:] or [^[:Letter:]] - Error: %s", u_errorName(status)); 4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this->sourceRange.clear(); 4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this->sourceRange.applyPattern(sourceRangeVal, status); 4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->errln("FAIL: UnicodeSet::applyPattern(" + 4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sourceRangeVal + ")"); 4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this->sourceRange.removeAll(neverOk); 4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this->targetRange.clear(); 4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this->targetRange.applyPattern(targetRangeVal, status); 4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->errln("FAIL: UnicodeSet::applyPattern(" + 4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org targetRangeVal + ")"); 4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this->targetRange.removeAll(neverOk); 4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this->toSource.clear(); 5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this->toSource.applyPattern(sourceRangeVal, status); 5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->errln("FAIL: UnicodeSet::applyPattern(" + 5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sourceRangeVal + ")"); 5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this->toSource.addAll(okAnyway); 5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this->toTarget.clear(); 5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this->toTarget.applyPattern(targetRangeVal, status); 5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->errln("FAIL: UnicodeSet::applyPattern(" + 5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org targetRangeVal + ")"); 5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this->toTarget.addAll(okAnyway); 5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this->roundtripExclusionsSet.clear(); 5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (roundtripExclusions != NULL && strlen(roundtripExclusions) > 0) { 5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this->roundtripExclusionsSet.applyPattern(UnicodeString(roundtripExclusions, -1, US_INV), status); 5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->errln("FAIL: UnicodeSet::applyPattern(%s)", roundtripExclusions); 5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org badCharacters.clear(); 5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org badCharacters.applyPattern("[:Other:]", status); 5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->errln("FAIL: UnicodeSet::applyPattern([:Other:])"); 5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test2(quickRt, density); 5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (errorCount > 0) { 5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char str[100]; 5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length = transliteratorID.extract(str, 100, NULL, status); 5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org str[length] = 0; 5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->errln("FAIL: %s errors: %d %s", str, errorCount, (errorCount > errorLimit ? " (at least!)" : " ")); // + ", see " + logFileName); 5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char str[100]; 5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length = transliteratorID.extract(str, 100, NULL, status); 5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org str[length] = 0; 5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->logln("%s ok", str); 5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool RTTest::checkIrrelevants(Transliterator *t, 5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& irrelevants) { 5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int i = 0; i < irrelevants.length(); ++i) { 5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar c = irrelevants.charAt(i); 5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString srcStr(c); 5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString targ = srcStr; 5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org t->transliterate(targ); 5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (srcStr == targ) return TRUE; 5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid RTTest::test2(UBool quickRt, int32_t density) { 5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString srcStr, targ, reverse; 5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UParseError parseError ; 5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TransliteratorPointer sourceToTarget( 5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Transliterator::createInstance(transliteratorID, UTRANS_FORWARD, parseError, 5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status)); 5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ((Transliterator *)sourceToTarget == NULL) { 5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->dataerrln("FAIL: createInstance(" + transliteratorID + 5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ") returned NULL. Error: " + u_errorName(status) 5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org + "\n\tpreContext : " + prettify(parseError.preContext) 5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org + "\n\tpostContext : " + prettify(parseError.postContext)); 5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TransliteratorPointer targetToSource(sourceToTarget->createInverse(status)); 5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ((Transliterator *)targetToSource == NULL) { 5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->errln("FAIL: " + transliteratorID + 5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ".createInverse() returned NULL. Error:" + u_errorName(status) 5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org + "\n\tpreContext : " + prettify(parseError.preContext) 5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org + "\n\tpostContext : " + prettify(parseError.postContext)); 5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org AbbreviatedUnicodeSetIterator usi; 5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org AbbreviatedUnicodeSetIterator usi2; 5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->logln("Checking that at least one irrelevant character is not NFC'ed"); 5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // string is from NFC_NO in the UCD 5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString irrelevants = CharsToUnicodeString("\\u2000\\u2001\\u2126\\u212A\\u212B\\u2329"); 5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (checkIrrelevants(sourceToTarget, irrelevants) == FALSE) { 5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logFails("Source-Target, irrelevants"); 5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (checkIrrelevants(targetToSource, irrelevants) == FALSE) { 5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logFails("Target-Source, irrelevants"); 5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!quickRt){ 6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->logln("Checking that toRules works"); 6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString rules = ""; 6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UParseError parseError; 6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rules = sourceToTarget->toRules(rules, TRUE); 6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // parent->logln((UnicodeString)"toRules => " + rules); 6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TransliteratorPointer sourceToTarget2(Transliterator::createFromRules( 6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "s2t2", rules, 6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UTRANS_FORWARD, 6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parseError, status)); 6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->errln("FAIL: createFromRules %s\n", u_errorName(status)); 6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org rules = targetToSource->toRules(rules, FALSE); 6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TransliteratorPointer targetToSource2(Transliterator::createFromRules( 6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "t2s2", rules, 6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UTRANS_FORWARD, 6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parseError, status)); 6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->errln("FAIL: createFromRules %s\n", u_errorName(status)); 6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org usi.reset(sourceRange); 6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (;;) { 6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!usi.next() || usi.isString()) break; 6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 c = usi.getCodepoint(); 6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString srcStr((UChar32)c); 6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString targ = srcStr; 6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sourceToTarget->transliterate(targ); 6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString targ2 = srcStr; 6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sourceToTarget2->transliterate(targ2); 6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (targ != targ2) { 6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logToRulesFails("Source-Target, toRules", srcStr, targ, targ2); 6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org usi.reset(targetRange); 6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (;;) { 6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!usi.next() || usi.isString()) break; 6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 c = usi.getCodepoint(); 6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString srcStr((UChar32)c); 6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString targ = srcStr; 6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org targetToSource->transliterate(targ); 6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString targ2 = srcStr; 6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org targetToSource2->transliterate(targ2); 6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (targ != targ2) { 6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logToRulesFails("Target-Source, toRules", srcStr, targ, targ2); 6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->logln("Checking that all source characters convert to target - Singles"); 6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeSet failSourceTarg; 6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org usi.reset(sourceRange); 6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (;;) { 6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!usi.next() || usi.isString()) break; 6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 c = usi.getCodepoint(); 6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString srcStr((UChar32)c); 6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString targ = srcStr; 6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sourceToTarget->transliterate(targ); 6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (toTarget.containsAll(targ) == FALSE 6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org || badCharacters.containsSome(targ) == TRUE) { 6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString targD; 6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Normalizer::decompose(targ, FALSE, 0, targD, status); 6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->errln("FAIL: Internal error during decomposition %s\n", u_errorName(status)); 6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (toTarget.containsAll(targD) == FALSE || 6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org badCharacters.containsSome(targD) == TRUE) { 6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logWrongScript("Source-Target", srcStr, targ); 6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org failSourceTarg.add(c); 6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString cs2; 6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Normalizer::decompose(srcStr, FALSE, 0, cs2, status); 6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->errln("FAIL: Internal error during decomposition %s\n", u_errorName(status)); 6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString targ2 = cs2; 6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sourceToTarget->transliterate(targ2); 6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (targ != targ2) { 6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logNotCanonical("Source-Target", srcStr, targ,cs2, targ2); 6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->logln("Checking that all source characters convert to target - Doubles"); 6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeSet sourceRangeMinusFailures(sourceRange); 7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sourceRangeMinusFailures.removeAll(failSourceTarg); 7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org usi.reset(sourceRangeMinusFailures, quickRt, density); 7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (;;) { 7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!usi.next() || usi.isString()) break; 7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 c = usi.getCodepoint(); 7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org usi2.reset(sourceRangeMinusFailures, quickRt, density); 7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (;;) { 7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!usi2.next() || usi2.isString()) break; 7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 d = usi2.getCodepoint(); 7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString srcStr; 7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcStr += (UChar32)c; 7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcStr += (UChar32)d; 7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString targ = srcStr; 7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sourceToTarget->transliterate(targ); 7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (toTarget.containsAll(targ) == FALSE || 7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org badCharacters.containsSome(targ) == TRUE) 7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString targD; 7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Normalizer::decompose(targ, FALSE, 0, targD, status); 7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->errln("FAIL: Internal error during decomposition %s\n", u_errorName(status)); 7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (toTarget.containsAll(targD) == FALSE || 7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org badCharacters.containsSome(targD) == TRUE) { 7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logWrongScript("Source-Target", srcStr, targ); 7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString cs2; 7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Normalizer::decompose(srcStr, FALSE, 0, cs2, status); 7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->errln("FAIL: Internal error during decomposition %s\n", u_errorName(status)); 7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString targ2 = cs2; 7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sourceToTarget->transliterate(targ2); 7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (targ != targ2) { 7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logNotCanonical("Source-Target", srcStr, targ, cs2,targ2); 7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->logln("Checking that target characters convert to source and back - Singles"); 7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeSet failTargSource; 7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeSet failRound; 7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org usi.reset(targetRange); 7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (;;) { 7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!usi.next()) break; 7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(usi.isString()){ 7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcStr = usi.getString(); 7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }else{ 7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcStr = (UnicodeString)usi.getCodepoint(); 7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 c = srcStr.char32At(0); 7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org targ = srcStr; 7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org targetToSource->transliterate(targ); 7656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org reverse = targ; 7666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sourceToTarget->transliterate(reverse); 7676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (toSource.containsAll(targ) == FALSE || 7696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org badCharacters.containsSome(targ) == TRUE) { 7706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString targD; 7716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Normalizer::decompose(targ, FALSE, 0, targD, status); 7726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 7736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->errln("FAIL: Internal error during decomposition%s\n", u_errorName(status)); 7746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 7756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (toSource.containsAll(targD) == FALSE) { 7776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logWrongScript("Target-Source", srcStr, targ); 7786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org failTargSource.add(c); 7796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 7806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (badCharacters.containsSome(targD) == TRUE) { 7826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logWrongScript("Target-Source*", srcStr, targ); 7836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org failTargSource.add(c); 7846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 7856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (isSame(srcStr, reverse) == FALSE && 7886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org roundtripExclusionsSet.contains(c) == FALSE 7896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org && roundtripExclusionsSet.contains(srcStr)==FALSE) { 7906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logRoundTripFailure(srcStr,targetToSource->getID(), targ,sourceToTarget->getID(), reverse); 7916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org failRound.add(c); 7926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 7936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString targ2; 7966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Normalizer::decompose(targ, FALSE, 0, targ2, status); 7976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 7986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->errln("FAIL: Internal error during decomposition%s\n", u_errorName(status)); 7996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 8006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString reverse2 = targ2; 8026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sourceToTarget->transliterate(reverse2); 8036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (reverse != reverse2) { 8046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logNotCanonical("Target-Source", targ, reverse, targ2, reverse2); 8056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->logln("Checking that target characters convert to source and back - Doubles"); 8096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t count = 0; 8106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeSet targetRangeMinusFailures(targetRange); 8126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org targetRangeMinusFailures.removeAll(failTargSource); 8136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org targetRangeMinusFailures.removeAll(failRound); 8146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org usi.reset(targetRangeMinusFailures, quickRt, density); 8166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString targ2; 8176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString reverse2; 8186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString targD; 8196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (;;) { 8206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!usi.next() || usi.isString()) break; 8216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 c = usi.getCodepoint(); 8226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (++count > pairLimit) { 8236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //throw new TestTruncated("Test truncated at " + pairLimit + " x 64k pairs"); 8246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->logln(""); 8256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->logln((UnicodeString)"Test truncated at " + pairLimit + " x 64k pairs"); 8266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 8276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org usi2.reset(targetRangeMinusFailures, quickRt, density); 8306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (;;) { 8316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!usi2.next() || usi2.isString()) 8326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 8336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 d = usi2.getCodepoint(); 8346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcStr.truncate(0); // empty the variable without construction/destruction 8356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcStr += c; 8366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srcStr += d; 8376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org targ = srcStr; 8396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org targetToSource->transliterate(targ); 8406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org reverse = targ; 8416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sourceToTarget->transliterate(reverse); 8426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (toSource.containsAll(targ) == FALSE || 8446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org badCharacters.containsSome(targ) == TRUE) 8456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 8466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org targD.truncate(0); // empty the variable without construction/destruction 8476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Normalizer::decompose(targ, FALSE, 0, targD, status); 8486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 8496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->errln("FAIL: Internal error during decomposition%s\n", 8506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_errorName(status)); 8516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 8526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (toSource.containsAll(targD) == FALSE 8546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org || badCharacters.containsSome(targD) == TRUE) 8556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 8566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logWrongScript("Target-Source", srcStr, targ); 8576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 8586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (isSame(srcStr, reverse) == FALSE && 8616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org roundtripExclusionsSet.contains(c) == FALSE&& 8626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org roundtripExclusionsSet.contains(d) == FALSE && 8636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org roundtripExclusionsSet.contains(srcStr)== FALSE) 8646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 8656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logRoundTripFailure(srcStr,targetToSource->getID(), targ, sourceToTarget->getID(),reverse); 8666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 8676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org targ2.truncate(0); // empty the variable without construction/destruction 8706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Normalizer::decompose(targ, FALSE, 0, targ2, status); 8716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 8726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->errln("FAIL: Internal error during decomposition%s\n", u_errorName(status)); 8736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 8746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org reverse2 = targ2; 8766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sourceToTarget->transliterate(reverse2); 8776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (reverse != reverse2) { 8786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logNotCanonical("Target-Source", targ,reverse, targ2, reverse2); 8796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->logln(""); 8836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 8846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid RTTest::logWrongScript(const UnicodeString& label, 8866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& from, 8876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& to) { 8886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->errln((UnicodeString)"FAIL " + 8896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org label + ": " + 8906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org from + "(" + TestUtility::hex(from) + ") => " + 8916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org to + "(" + TestUtility::hex(to) + ")"); 8926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++errorCount; 8936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 8946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid RTTest::logNotCanonical(const UnicodeString& label, 8966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& from, 8976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& to, 8986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& fromCan, 8996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& toCan) { 9006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->errln((UnicodeString)"FAIL (can.equiv)" + 9016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org label + ": " + 9026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org from + "(" + TestUtility::hex(from) + ") => " + 9036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org to + "(" + TestUtility::hex(to) + ")" + 9046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fromCan + "(" + TestUtility::hex(fromCan) + ") => " + 9056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org toCan + " (" + 9066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TestUtility::hex(toCan) + ")" 9076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ); 9086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++errorCount; 9096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 9106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid RTTest::logFails(const UnicodeString& label) { 9126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->errln((UnicodeString)"<br>FAIL " + label); 9136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++errorCount; 9146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 9156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid RTTest::logToRulesFails(const UnicodeString& label, 9176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& from, 9186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& to, 9196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& otherTo) 9206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 9216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->errln((UnicodeString)"FAIL: " + 9226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org label + ": " + 9236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org from + "(" + TestUtility::hex(from) + ") => " + 9246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org to + "(" + TestUtility::hex(to) + ")" + 9256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "!=" + 9266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org otherTo + " (" + 9276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TestUtility::hex(otherTo) + ")" 9286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ); 9296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++errorCount; 9306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 9316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid RTTest::logRoundTripFailure(const UnicodeString& from, 9346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& toID, 9356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& to, 9366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& backID, 9376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UnicodeString& back) { 9386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (legalSource->is(from) == FALSE) return; // skip illegals 9396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org parent->errln((UnicodeString)"FAIL Roundtrip: " + 9416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org from + "(" + TestUtility::hex(from) + ") => " + 9426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org to + "(" + TestUtility::hex(to) + ") "+toID+" => " + 9436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org back + "(" + TestUtility::hex(back) + ") "+backID+" => "); 9446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++errorCount; 9456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 9466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//-------------------------------------------------------------------- 9486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Specific Tests 9496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//-------------------------------------------------------------------- 9506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 9526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Note: Unicode 3.2 added new Hiragana/Katakana characters: 9536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org3095..3096 ; 3.2 # [2] HIRAGANA LETTER SMALL KA..HIRAGANA LETTER SMALL KE 9556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org309F..30A0 ; 3.2 # [2] HIRAGANA DIGRAPH YORI..KATAKANA-HIRAGANA DOUBLE HYPHEN 9566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org30FF ; 3.2 # KATAKANA DIGRAPH KOTO 9576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org31F0..31FF ; 3.2 # [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO 9586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Unicode 5.2 added another Hiragana character: 9606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org1F200 ; 5.2 # SQUARE HIRAGANA HOKA 9616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org We will not add them to the rules until they are more supported (e.g. in fonts on Windows) 9636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org A bug has been filed to remind us to do this: #1979. 9646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 9656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char KATAKANA[] = "[[[:katakana:][\\u30A1-\\u30FA\\u30FC]]-[\\u30FF\\u31F0-\\u31FF]-[:^age=5.2:]]"; 9676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char HIRAGANA[] = "[[[:hiragana:][\\u3040-\\u3094]]-[\\u3095-\\u3096\\u309F-\\u30A0\\U0001F200-\\U0001F2FF]-[:^age=5.2:]]"; 9686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char LENGTH[] = "[\\u30FC]"; 9696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char HALFWIDTH_KATAKANA[] = "[\\uFF65-\\uFF9D]"; 9706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char KATAKANA_ITERATION[] = "[\\u30FD\\u30FE]"; 9716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char HIRAGANA_ITERATION[] = "[\\u309D\\u309E]"; 9726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int32_t TEMP_MAX=256; 9736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TransliteratorRoundTripTest::TestKana() { 9756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RTTest test("Katakana-Hiragana"); 9766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Legal *legal = new Legal(); 9776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char temp[TEMP_MAX]; 9786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcpy(temp, "["); 9796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcat(temp, HALFWIDTH_KATAKANA); 9806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcat(temp, LENGTH); 9816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcat(temp, "]"); 9826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test.test(KATAKANA, UnicodeString("[") + HIRAGANA + LENGTH + UnicodeString("]"), 9836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org temp, 9846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this, quick, legal); 9856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete legal; 9866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 9876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TransliteratorRoundTripTest::TestHiragana() { 9896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RTTest test("Latin-Hiragana"); 9906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Legal *legal = new Legal(); 9916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test.test(UnicodeString("[a-zA-Z]", ""), 9926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString(HIRAGANA, -1, US_INV), 9936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org HIRAGANA_ITERATION, this, quick, legal); 9946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete legal; 9956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 9966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TransliteratorRoundTripTest::TestKatakana() { 9986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RTTest test("Latin-Katakana"); 9996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Legal *legal = new Legal(); 10006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char temp[TEMP_MAX]; 10016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcpy(temp, "["); 10026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcat(temp, KATAKANA_ITERATION); 10036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcat(temp, HALFWIDTH_KATAKANA); 10046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcat(temp, "]"); 10056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test.test(UnicodeString("[a-zA-Z]", ""), 10066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString(KATAKANA, -1, US_INV), 10076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org temp, 10086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this, quick, legal); 10096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete legal; 10106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 10116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TransliteratorRoundTripTest::TestJamo() { 10136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RTTest t("Latin-Jamo"); 10146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Legal *legal = new LegalJamo(); 10156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org t.test(UnicodeString("[a-zA-Z]", ""), 10166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString("[\\u1100-\\u1112 \\u1161-\\u1175 \\u11A8-\\u11C2]", 10176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ""), 10186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org NULL, this, quick, legal); 10196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete legal; 10206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 10216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TransliteratorRoundTripTest::TestHangul() { 10236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RTTest t("Latin-Hangul"); 10246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Legal *legal = new Legal(); 10256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (quick) t.setPairLimit(1000); 10266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org t.test(UnicodeString("[a-zA-Z]", ""), 10276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString("[\\uAC00-\\uD7A4]", ""), 10286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org NULL, this, quick, legal, 1); 10296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete legal; 10306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 10316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define ASSERT_SUCCESS(status) {if (U_FAILURE(status)) { \ 10346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errcheckln(status, "error at file %s, line %d, status = %s", __FILE__, __LINE__, \ 10356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_errorName(status)); \ 10366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return;}} 10376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void writeStringInU8(FILE *out, const UnicodeString &s) { 10406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int i; 10416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i=0; i<s.length(); i=s.moveIndex32(i, 1)) { 10426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 c = s.char32At(i); 10436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint8_t bufForOneChar[10]; 10446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool isError = FALSE; 10456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t destIdx = 0; 10466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U8_APPEND(bufForOneChar, destIdx, (int32_t)sizeof(bufForOneChar), c, isError); 10476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fwrite(bufForOneChar, 1, destIdx, out); 10486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 10506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TransliteratorRoundTripTest::TestHan() { 10556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 10566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LocalULocaleDataPointer uld(ulocdata_open("zh",&status)); 10576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LocalUSetPointer USetExemplars(ulocdata_getExemplarSet(uld.getAlias(), uset_openEmpty(), 0, ULOCDATA_ES_STANDARD, &status)); 10586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ASSERT_SUCCESS(status); 10596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString source; 10616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 c; 10626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int i; 10636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i=0; ;i++) { 10646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Add all of the Chinese exemplar chars to the string "source". 10656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org c = uset_charAt(USetExemplars.getAlias(), i); 10666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (c == (UChar32)-1) { 10676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 10686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org source.append(c); 10706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // transform with Han translit 10736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Transliterator *hanTL = Transliterator::createInstance("Han-Latin", UTRANS_FORWARD, status); 10746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ASSERT_SUCCESS(status); 10756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString target=source; 10766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org hanTL->transliterate(target); 10776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // now verify that there are no Han characters left 10786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeSet allHan("[:han:]", status); 10796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ASSERT_SUCCESS(status); 10806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (allHan.containsSome(target)) { 10816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("file %s, line %d, No Han must be left after Han-Latin transliteration", 10826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org __FILE__, __LINE__); 10836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // check the pinyin translit 10866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Transliterator *pn = Transliterator::createInstance("Latin-NumericPinyin", UTRANS_FORWARD, status); 10876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ASSERT_SUCCESS(status); 10886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString target2 = target; 10896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pn->transliterate(target2); 10906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // verify that there are no marks 10926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Transliterator *nfd = Transliterator::createInstance("nfd", UTRANS_FORWARD, status); 10936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ASSERT_SUCCESS(status); 10946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString nfded = target2; 10966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org nfd->transliterate(nfded); 10976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeSet allMarks(UNICODE_STRING_SIMPLE("[\\u0304\\u0301\\u030C\\u0300\\u0306]"), status); // look only for Pinyin tone marks, not all marks (there are some others in there) 10986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ASSERT_SUCCESS(status); 10996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertFalse("NumericPinyin must contain no marks", allMarks.containsSome(nfded)); 11006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // verify roundtrip 11026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Transliterator *np = pn->createInverse(status); 11036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ASSERT_SUCCESS(status); 11046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString target3 = target2; 11056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org np->transliterate(target3); 11066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool roundtripOK = (target3.compare(target) == 0); 11076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertTrue("NumericPinyin must roundtrip", roundtripOK); 11086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!roundtripOK) { 11096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *filename = "numeric-pinyin.log.txt"; 11106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FILE *out = fopen(filename, "w"); 11116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Creating log file %s\n", filename); 11126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(out, "Pinyin: "); 11136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org writeStringInU8(out, target); 11146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(out, "\nPinyin-Numeric-Pinyin: "); 11156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org writeStringInU8(out, target2); 11166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(out, "\nNumeric-Pinyin-Pinyin: "); 11176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org writeStringInU8(out, target3); 11186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fprintf(out, "\n"); 11196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fclose(out); 11206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete hanTL; 11236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete pn; 11246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete nfd; 11256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete np; 11266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 11276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TransliteratorRoundTripTest::TestGreek() { 11306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logKnownIssue( "cldrbug:1911"); 11316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // It is left in its current state as a regression test. 11326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RTTest test("Latin-Greek"); 11346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LegalGreek *legal = new LegalGreek(TRUE); 11356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test.test(UnicodeString("[a-zA-Z]", ""), 11376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString("[\\u003B\\u00B7[[:Greek:]&[:Letter:]]-[" 11386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u1D26-\\u1D2A" // L& [5] GREEK LETTER SMALL CAPITAL GAMMA..GREEK LETTER SMALL CAPITAL PSI 11396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u1D5D-\\u1D61" // Lm [5] MODIFIER LETTER SMALL BETA..MODIFIER LETTER SMALL CHI 11406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u1D66-\\u1D6A" // L& [5] GREEK SUBSCRIPT SMALL LETTER BETA..GREEK SUBSCRIPT SMALL LETTER CHI 11416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u03D7-\\u03EF" // \N{GREEK KAI SYMBOL}..\N{COPTIC SMALL LETTER DEI} 11426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "] & [:Age=4.0:]]", 11436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //UnicodeString("[[\\u003B\\u00B7[:Greek:]-[\\u0374\\u0385\\u1fcd\\u1fce\\u1fdd\\u1fde\\u1fed-\\u1fef\\u1ffd\\u03D7-\\u03EF]]&[:Age=3.2:]]", 11456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ""), 11466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u00B5\\u037A\\u03D0-\\u03F5\\u03f9]", /* exclusions */ 11476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this, quick, legal, 50); 11486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete legal; 11516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 11526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TransliteratorRoundTripTest::TestGreekUNGEGN() { 11556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logKnownIssue( "cldrbug:1911"); 11566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // It is left in its current state as a regression test. 11576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RTTest test("Latin-Greek/UNGEGN"); 11596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LegalGreek *legal = new LegalGreek(FALSE); 11606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test.test(UnicodeString("[a-zA-Z]", ""), 11626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString("[\\u003B\\u00B7[[:Greek:]&[:Letter:]]-[" 11636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u1D26-\\u1D2A" // L& [5] GREEK LETTER SMALL CAPITAL GAMMA..GREEK LETTER SMALL CAPITAL PSI 11646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u1D5D-\\u1D61" // Lm [5] MODIFIER LETTER SMALL BETA..MODIFIER LETTER SMALL CHI 11656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u1D66-\\u1D6A" // L& [5] GREEK SUBSCRIPT SMALL LETTER BETA..GREEK SUBSCRIPT SMALL LETTER CHI 11666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u03D7-\\u03EF" // \N{GREEK KAI SYMBOL}..\N{COPTIC SMALL LETTER DEI} 11676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "] & [:Age=4.0:]]", 11686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //UnicodeString("[[\\u003B\\u00B7[:Greek:]-[\\u0374\\u0385\\u1fce\\u1fde\\u03D7-\\u03EF]]&[:Age=3.2:]]", 11696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ""), 11706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0385\\u00B5\\u037A\\u03D0-\\uFFFF {\\u039C\\u03C0}]", /* roundtrip exclusions */ 11716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this, quick, legal); 11726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete legal; 11746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 11756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TransliteratorRoundTripTest::Testel() { 11776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logKnownIssue( "cldrbug:1911"); 11786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // It is left in its current state as a regression test. 11796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RTTest test("Latin-el"); 11816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LegalGreek *legal = new LegalGreek(FALSE); 11826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test.test(UnicodeString("[a-zA-Z]", ""), 11846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString("[\\u003B\\u00B7[[:Greek:]&[:Letter:]]-[" 11856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u1D26-\\u1D2A" // L& [5] GREEK LETTER SMALL CAPITAL GAMMA..GREEK LETTER SMALL CAPITAL PSI 11866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u1D5D-\\u1D61" // Lm [5] MODIFIER LETTER SMALL BETA..MODIFIER LETTER SMALL CHI 11876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u1D66-\\u1D6A" // L& [5] GREEK SUBSCRIPT SMALL LETTER BETA..GREEK SUBSCRIPT SMALL LETTER CHI 11886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u03D7-\\u03EF" // \N{GREEK KAI SYMBOL}..\N{COPTIC SMALL LETTER DEI} 11896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "] & [:Age=4.0:]]", 11906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //UnicodeString("[[\\u003B\\u00B7[:Greek:]-[\\u0374\\u0385\\u1fce\\u1fde\\u03D7-\\u03EF]]&[:Age=3.2:]]", 11916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ""), 11926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u00B5\\u037A\\u03D0-\\uFFFF {\\u039C\\u03C0}]", /* exclusions */ 11936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this, quick, legal); 11946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete legal; 11976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 11986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TransliteratorRoundTripTest::TestArabic() { 12016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString ARABIC("[\\u060C\\u061B\\u061F\\u0621\\u0627-\\u063A\\u0641-\\u0655\\u0660-\\u066C\\u067E\\u0686\\u0698\\u06A4\\u06AD\\u06AF\\u06CB-\\u06CC\\u06F0-\\u06F9]", -1, US_INV); 12026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Legal *legal = new Legal(); 12036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RTTest test("Latin-Arabic"); 12046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test.test(UNICODE_STRING_SIMPLE("[a-zA-Z\\u02BE\\u02BF\\u207F]"), ARABIC, "[a-zA-Z\\u02BE\\u02BF\\u207F]",this, quick, legal); // 12056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete legal; 12066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 12076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass LegalHebrew : public Legal { 12086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate: 12096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeSet FINAL; 12106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeSet NON_FINAL; 12116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeSet LETTER; 12126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 12136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LegalHebrew(UErrorCode& error); 12146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual ~LegalHebrew() {} 12156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UBool is(const UnicodeString& sourceString) const; 12166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 12176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgLegalHebrew::LegalHebrew(UErrorCode& error){ 12196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FINAL.applyPattern(UNICODE_STRING_SIMPLE("[\\u05DA\\u05DD\\u05DF\\u05E3\\u05E5]"), error); 12206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org NON_FINAL.applyPattern(UNICODE_STRING_SIMPLE("[\\u05DB\\u05DE\\u05E0\\u05E4\\u05E6]"), error); 12216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LETTER.applyPattern("[:letter:]", error); 12226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 12236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool LegalHebrew::is(const UnicodeString& sourceString)const{ 12246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (sourceString.length() == 0) return TRUE; 12266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // don't worry about surrogates. 12276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int i = 0; i < sourceString.length(); ++i) { 12286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar ch = sourceString.charAt(i); 12296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar next = i+1 == sourceString.length() ? 0x0000 : sourceString.charAt(i); 12306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (FINAL.contains(ch)) { 12316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (LETTER.contains(next)) return FALSE; 12326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else if (NON_FINAL.contains(ch)) { 12336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!LETTER.contains(next)) return FALSE; 12346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 12376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 12386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TransliteratorRoundTripTest::TestHebrew() { 12396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logKnownIssue( "cldrbug:1911"); 12406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // It is left in its current state as a regression test. 12416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //long start = System.currentTimeMillis(); 12436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode error = U_ZERO_ERROR; 12446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LegalHebrew* legal = new LegalHebrew(error); 12456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(error)){ 12466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dataerrln("Could not construct LegalHebrew object. Error: %s", u_errorName(error)); 12476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 12486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RTTest test("Latin-Hebrew"); 12506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test.test(UNICODE_STRING_SIMPLE("[a-zA-Z\\u02BC\\u02BB]"), UNICODE_STRING_SIMPLE("[[[:hebrew:]-[\\u05BD\\uFB00-\\uFBFF]]&[:Age=4.0:]]"), "[\\u05F0\\u05F1\\u05F2]", this, quick, legal); 12516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //showElapsed(start, "TestHebrew"); 12536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete legal; 12546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 12556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TransliteratorRoundTripTest::TestCyrillic() { 12566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RTTest test("Latin-Cyrillic"); 12576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Legal *legal = new Legal(); 12586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test.test(UnicodeString("[a-zA-Z\\u0110\\u0111\\u02BA\\u02B9]", ""), 12606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString("[[\\u0400-\\u045F] & [:Age=3.2:]]", ""), NULL, this, quick, 12616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org legal); 12626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete legal; 12646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 12656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Inter-Indic Tests ---------------------------------- 12686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass LegalIndic :public Legal{ 12696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeSet vowelSignSet; 12706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeSet avagraha; 12716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeSet nukta; 12726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeSet virama; 12736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeSet sanskritStressSigns; 12746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeSet chandrabindu; 12756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 12776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LegalIndic(); 12786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UBool is(const UnicodeString& sourceString) const; 12796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual ~LegalIndic() {}; 12806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 12816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool LegalIndic::is(const UnicodeString& sourceString) const{ 12826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int cp=sourceString.charAt(0); 12836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // A vowel sign cannot be the first char 12856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(vowelSignSet.contains(cp)){ 12866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 12876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }else if(avagraha.contains(cp)){ 12886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 12896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }else if(virama.contains(cp)){ 12906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 12916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }else if(nukta.contains(cp)){ 12926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 12936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }else if(sanskritStressSigns.contains(cp)){ 12946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 12956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }else if(chandrabindu.contains(cp) && 12966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ((sourceString.length()>1) && 12976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org vowelSignSet.contains(sourceString.charAt(1)))){ 12986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 12996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 13016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 13026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgLegalIndic::LegalIndic(){ 13036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 13046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org vowelSignSet.addAll( UnicodeSet("[\\u0902\\u0903\\u0904\\u093e-\\u094c\\u0962\\u0963]",status));/* Devanagari */ 13056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org vowelSignSet.addAll( UnicodeSet("[\\u0982\\u0983\\u09be-\\u09cc\\u09e2\\u09e3\\u09D7]",status));/* Bengali */ 13066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org vowelSignSet.addAll( UnicodeSet("[\\u0a02\\u0a03\\u0a3e-\\u0a4c\\u0a62\\u0a63\\u0a70\\u0a71]",status));/* Gurmukhi */ 13076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org vowelSignSet.addAll( UnicodeSet("[\\u0a82\\u0a83\\u0abe-\\u0acc\\u0ae2\\u0ae3]",status));/* Gujarati */ 13086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org vowelSignSet.addAll( UnicodeSet("[\\u0b02\\u0b03\\u0b3e-\\u0b4c\\u0b62\\u0b63\\u0b56\\u0b57]",status));/* Oriya */ 13096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org vowelSignSet.addAll( UnicodeSet("[\\u0b82\\u0b83\\u0bbe-\\u0bcc\\u0be2\\u0be3\\u0bd7]",status));/* Tamil */ 13106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org vowelSignSet.addAll( UnicodeSet("[\\u0c02\\u0c03\\u0c3e-\\u0c4c\\u0c62\\u0c63\\u0c55\\u0c56]",status));/* Telugu */ 13116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org vowelSignSet.addAll( UnicodeSet("[\\u0c82\\u0c83\\u0cbe-\\u0ccc\\u0ce2\\u0ce3\\u0cd5\\u0cd6]",status));/* Kannada */ 13126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org vowelSignSet.addAll( UnicodeSet("[\\u0d02\\u0d03\\u0d3e-\\u0d4c\\u0d62\\u0d63\\u0d57]",status));/* Malayalam */ 13136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org avagraha.addAll(UnicodeSet("[\\u093d\\u09bd\\u0abd\\u0b3d\\u0cbd]",status)); 13156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org nukta.addAll(UnicodeSet("[\\u093c\\u09bc\\u0a3c\\u0abc\\u0b3c\\u0cbc]",status)); 13166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virama.addAll(UnicodeSet("[\\u094d\\u09cd\\u0a4d\\u0acd\\u0b4d\\u0bcd\\u0c4d\\u0ccd\\u0d4d]",status)); 13176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sanskritStressSigns.addAll(UnicodeSet("[\\u0951\\u0952\\u0953\\u0954\\u097d]",status)); 13186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org chandrabindu.addAll(UnicodeSet("[\\u0901\\u0981\\u0A81\\u0b01\\u0c01]",status)); 13196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char latinForIndic[] = "[['.0-9A-Za-z~\\u00C0-\\u00C5\\u00C7-\\u00CF\\u00D1-\\u00D6\\u00D9-\\u00DD" 13236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u00E0-\\u00E5\\u00E7-\\u00EF\\u00F1-\\u00F6\\u00F9-\\u00FD\\u00FF-\\u010F" 13246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u0112-\\u0125\\u0128-\\u0130\\u0134-\\u0137\\u0139-\\u013E\\u0143-\\u0148" 13256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u014C-\\u0151\\u0154-\\u0165\\u0168-\\u017E\\u01A0-\\u01A1\\u01AF-\\u01B0" 13266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u01CD-\\u01DC\\u01DE-\\u01E3\\u01E6-\\u01ED\\u01F0\\u01F4-\\u01F5\\u01F8-\\u01FB" 13276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u0200-\\u021B\\u021E-\\u021F\\u0226-\\u0233\\u0294\\u0303-\\u0304\\u0306\\u0314-\\u0315" 13286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u0325\\u040E\\u0419\\u0439\\u045E\\u04C1-\\u04C2\\u04D0-\\u04D1\\u04D6-\\u04D7" 13296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u04E2-\\u04E3\\u04EE-\\u04EF\\u1E00-\\u1E99\\u1EA0-\\u1EF9\\u1F01\\u1F03\\u1F05" 13306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u1F07\\u1F09\\u1F0B\\u1F0D\\u1F0F\\u1F11\\u1F13\\u1F15\\u1F19\\u1F1B\\u1F1D\\u1F21" 13316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u1F23\\u1F25\\u1F27\\u1F29\\u1F2B\\u1F2D\\u1F2F\\u1F31\\u1F33\\u1F35\\u1F37\\u1F39" 13326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u1F3B\\u1F3D\\u1F3F\\u1F41\\u1F43\\u1F45\\u1F49\\u1F4B\\u1F4D\\u1F51\\u1F53\\u1F55" 13336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F\\u1F61\\u1F63\\u1F65\\u1F67\\u1F69\\u1F6B\\u1F6D" 13346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u1F6F\\u1F81\\u1F83\\u1F85\\u1F87\\u1F89\\u1F8B\\u1F8D\\u1F8F\\u1F91\\u1F93\\u1F95" 13356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u1F97\\u1F99\\u1F9B\\u1F9D\\u1F9F\\u1FA1\\u1FA3\\u1FA5\\u1FA7\\u1FA9\\u1FAB\\u1FAD" 13366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u1FAF-\\u1FB1\\u1FB8-\\u1FB9\\u1FD0-\\u1FD1\\u1FD8-\\u1FD9\\u1FE0-\\u1FE1\\u1FE5" 13376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "\\u1FE8-\\u1FE9\\u1FEC\\u212A-\\u212B\\uE04D\\uE064]" 13386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "-[\\uE000-\\uE080 \\u01E2\\u01E3]& [[:latin:][:mark:]]]"; 13396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TransliteratorRoundTripTest::TestDevanagariLatin() { 13416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 13426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 13436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UParseError parseError; 13446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TransliteratorPointer t1(Transliterator::createInstance("[\\u0964-\\u0965\\u0981-\\u0983\\u0985-\\u098C\\u098F-\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC\\u09BE-\\u09C4\\u09C7-\\u09C8\\u09CB-\\u09CD\\u09D7\\u09DC-\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09FA];NFD;Bengali-InterIndic;InterIndic-Gujarati;NFC;",UTRANS_FORWARD, parseError, status)); 13456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if((Transliterator *)t1 != NULL){ 13466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TransliteratorPointer t2(t1->createInverse(status)); 13476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)){ 13486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("FAIL: could not create the Inverse:-( \n"); 13496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }else { 13516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dataerrln("FAIL: could not create the transliterator. Error: %s\n", u_errorName(status)); 13526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RTTest test("Latin-Devanagari"); 13566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Legal *legal = new LegalIndic(); 13576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logKnownIssue( "cldrbug:1911"); 13586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // It is left in its current state as a regression test. 13596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test.test(UnicodeString(latinForIndic, ""), 13616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString("[[[:Devanagari:][\\u094d][\\u0964\\u0965]]&[:Age=4.1:]-[\\u0970]]", ""), "[\\u0965\\u0904]", this, quick, 13626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org legal, 50); 13636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete legal; 13656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 13666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Defined this way for HP/UX11CC :-( */ 13686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const int32_t INTER_INDIC_ARRAY_WIDTH = 4; 13696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char * const interIndicArray[] = { 13706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "BENGALI-DEVANAGARI", "[:BENGALI:]", "[[:Devanagari:]-[\\u0970]]", 13726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0904\\u0951-\\u0954\\u0943-\\u0949\\u094a\\u0962\\u0963\\u090D\\u090e\\u0911\\u0912\\u0929\\u0933\\u0934\\u0935\\u093d\\u0950\\u0958\\u0959\\u095a\\u095b\\u095e\\u097d]", /*roundtrip exclusions*/ 13736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "DEVANAGARI-BENGALI", "[[:Devanagari:]-[\\u0970]]", "[:BENGALI:]", 13756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0951-\\u0954\\u0951-\\u0954\\u09D7\\u090D\\u090e\\u0911\\u0912\\u0929\\u0933\\u0934\\u0935\\u093d\\u0950\\u0958\\u0959\\u095a\\u095b\\u095e\\u09f0\\u09f1\\u09f2-\\u09fa\\u09ce]", /*roundtrip exclusions*/ 13766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "GURMUKHI-DEVANAGARI", "[:GURMUKHI:]", "[[:Devanagari:]-[\\u0970]]", 13786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0904\\u0901\\u0902\\u0936\\u0933\\u0951-\\u0954\\u0902\\u0903\\u0943-\\u0949\\u094a\\u0962\\u0963\\u090B\\u090C\\u090D\\u090e\\u0911\\u0912\\u0934\\u0937\\u093D\\u0950\\u0960\\u0961\\u097d]", /*roundtrip exclusions*/ 13796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "DEVANAGARI-GURMUKHI", "[[:Devanagari:]-[\\u0970]]", "[:GURMUKHI:]", 13816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0904\\u0A02\\u0946\\u0A5C\\u0951-\\u0954\\u0A70\\u0A71\\u090B\\u090C\\u090D\\u090e\\u0911\\u0912\\u0934\\u0937\\u093D\\u0950\\u0960\\u0961\\u0a72\\u0a73\\u0a74]", /*roundtrip exclusions*/ 13826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "GUJARATI-DEVANAGARI", "[:GUJARATI:]", "[[:Devanagari:]-[\\u0970]]", 13846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0946\\u094A\\u0962\\u0963\\u0951-\\u0954\\u0961\\u090c\\u090e\\u0912\\u097d]", /*roundtrip exclusions*/ 13856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "DEVANAGARI-GUJARATI", "[[:Devanagari:]-[\\u0970]]", "[:GUJARATI:]", 13876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0951-\\u0954\\u0961\\u090c\\u090e\\u0912]", /*roundtrip exclusions*/ 13886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "ORIYA-DEVANAGARI", "[:ORIYA:]", "[[:Devanagari:]-[\\u0970]]", 13906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0904\\u0943-\\u094a\\u0962\\u0963\\u0951-\\u0954\\u0950\\u090D\\u090e\\u0912\\u0911\\u0931\\u0935\\u097d]", /*roundtrip exclusions*/ 13916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "DEVANAGARI-ORIYA", "[[:Devanagari:]-[\\u0970]]", "[:ORIYA:]", 13936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0b5f\\u0b56\\u0b57\\u0b70\\u0b71\\u0950\\u090D\\u090e\\u0912\\u0911\\u0931]", /*roundtrip exclusions*/ 13946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Tamil-DEVANAGARI", "[:tamil:]", "[[:Devanagari:]-[\\u0970]]", 13966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0901\\u0904\\u093c\\u0943-\\u094a\\u0951-\\u0954\\u0962\\u0963\\u090B\\u090C\\u090D\\u0911\\u0916\\u0917\\u0918\\u091B\\u091D\\u0920\\u0921\\u0922\\u0925\\u0926\\u0927\\u092B\\u092C\\u092D\\u0936\\u093d\\u0950[\\u0958-\\u0961]\\u097d]", /*roundtrip exclusions*/ 13976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "DEVANAGARI-Tamil", "[[:Devanagari:]-[\\u0970]]", "[:tamil:]", 13996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0bd7\\u0BF0\\u0BF1\\u0BF2]", /*roundtrip exclusions*/ 14006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Telugu-DEVANAGARI", "[:telugu:]", "[[:Devanagari:]-[\\u0970]]", 14026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0904\\u093c\\u0950\\u0945\\u0949\\u0951-\\u0954\\u0962\\u0963\\u090D\\u0911\\u093d\\u0929\\u0934[\\u0958-\\u095f]\\u097d]", /*roundtrip exclusions*/ 14036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "DEVANAGARI-TELUGU", "[[:Devanagari:]-[\\u0970]]", "[:TELUGU:]", 14056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0c55\\u0c56\\u0950\\u090D\\u0911\\u093d\\u0929\\u0934[\\u0958-\\u095f]]", /*roundtrip exclusions*/ 14066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "KANNADA-DEVANAGARI", "[:KANNADA:]", "[[:Devanagari:]-[\\u0970]]", 14086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0901\\u0904\\u0946\\u093c\\u0950\\u0945\\u0949\\u0951-\\u0954\\u0962\\u0963\\u0950\\u090D\\u0911\\u093d\\u0929\\u0934[\\u0958-\\u095f]\\u097d]", /*roundtrip exclusions*/ 14096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "DEVANAGARI-KANNADA", "[[:Devanagari:]-[\\u0970]]", "[:KANNADA:]", 14116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[{\\u0cb0\\u0cbc}{\\u0cb3\\u0cbc}\\u0cde\\u0cd5\\u0cd6\\u0950\\u090D\\u0911\\u093d\\u0929\\u0934[\\u0958-\\u095f]]", /*roundtrip exclusions*/ 14126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "MALAYALAM-DEVANAGARI", "[:MALAYALAM:]", "[[:Devanagari:]-[\\u0970]]", 14146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0901\\u0904\\u094a\\u094b\\u094c\\u093c\\u0950\\u0944\\u0945\\u0949\\u0951-\\u0954\\u0962\\u0963\\u090D\\u0911\\u093d\\u0929\\u0934[\\u0958-\\u095f]\\u097d]", /*roundtrip exclusions*/ 14156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "DEVANAGARI-MALAYALAM", "[[:Devanagari:]-[\\u0970]]", "[:MALAYALAM:]", 14176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0d4c\\u0d57\\u0950\\u090D\\u0911\\u093d\\u0929\\u0934[\\u0958-\\u095f]]", /*roundtrip exclusions*/ 14186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "GURMUKHI-BENGALI", "[:GURMUKHI:]", "[:BENGALI:]", 14206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0981\\u0982\\u09b6\\u09e2\\u09e3\\u09c3\\u09c4\\u09d7\\u098B\\u098C\\u09B7\\u09E0\\u09E1\\u09F0\\u09F1\\u09f2-\\u09fa\\u09ce]", /*roundtrip exclusions*/ 14216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "BENGALI-GURMUKHI", "[:BENGALI:]", "[:GURMUKHI:]", 14236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0A02\\u0a5c\\u0a47\\u0a70\\u0a71\\u0A33\\u0A35\\u0A59\\u0A5A\\u0A5B\\u0A5E\\u0A72\\u0A73\\u0A74]", /*roundtrip exclusions*/ 14246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "GUJARATI-BENGALI", "[:GUJARATI:]", "[:BENGALI:]", 14266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u09d7\\u09e2\\u09e3\\u098c\\u09e1\\u09f0\\u09f1\\u09f2-\\u09fa\\u09ce]", /*roundtrip exclusions*/ 14276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "BENGALI-GUJARATI", "[:BENGALI:]", "[:GUJARATI:]", 14296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0A82\\u0a83\\u0Ac9\\u0Ac5\\u0ac7\\u0A8D\\u0A91\\u0AB3\\u0AB5\\u0ABD\\u0AD0]", /*roundtrip exclusions*/ 14306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "ORIYA-BENGALI", "[:ORIYA:]", "[:BENGALI:]", 14326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u09c4\\u09e2\\u09e3\\u09f0\\u09f1\\u09f2-\\u09fa\\u09ce]", /*roundtrip exclusions*/ 14336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "BENGALI-ORIYA", "[:BENGALI:]", "[:ORIYA:]", 14356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0b35\\u0b71\\u0b5f\\u0b56\\u0b33\\u0b3d]", /*roundtrip exclusions*/ 14366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Tamil-BENGALI", "[:tamil:]", "[:BENGALI:]", 14386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0981\\u09bc\\u09c3\\u09c4\\u09e2\\u09e3\\u09f0\\u09f1\\u098B\\u098C\\u0996\\u0997\\u0998\\u099B\\u099D\\u09A0\\u09A1\\u09A2\\u09A5\\u09A6\\u09A7\\u09AB\\u09AC\\u09AD\\u09B6\\u09DC\\u09DD\\u09DF\\u09E0\\u09E1\\u09f2-\\u09fa\\u09ce]", /*roundtrip exclusions*/ 14396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "BENGALI-Tamil", "[:BENGALI:]", "[:tamil:]", 14416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0bc6\\u0bc7\\u0bca\\u0B8E\\u0B92\\u0BA9\\u0BB1\\u0BB3\\u0BB4\\u0BB5\\u0BF0\\u0BF1\\u0BF2]", /*roundtrip exclusions*/ 14426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Telugu-BENGALI", "[:telugu:]", "[:BENGALI:]", 14446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u09e2\\u09e3\\u09bc\\u09d7\\u09f0\\u09f1\\u09dc\\u09dd\\u09df\\u09f2-\\u09fa\\u09ce]", /*roundtrip exclusions*/ 14456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "BENGALI-TELUGU", "[:BENGALI:]", "[:TELUGU:]", 14476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0c55\\u0c56\\u0c47\\u0c46\\u0c4a\\u0C0E\\u0C12\\u0C31\\u0C33\\u0C35]", /*roundtrip exclusions*/ 14486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "KANNADA-BENGALI", "[:KANNADA:]", "[:BENGALI:]", 14506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0981\\u09e2\\u09e3\\u09bc\\u09d7\\u09dc\\u09dd\\u09df\\u09f0\\u09f1\\u09f2-\\u09fa\\u09ce]", /*roundtrip exclusions*/ 14516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "BENGALI-KANNADA", "[:BENGALI:]", "[:KANNADA:]", 14536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[{\\u0cb0\\u0cbc}{\\u0cb3\\u0cbc}\\u0cc6\\u0cca\\u0cd5\\u0cd6\\u0cc7\\u0C8E\\u0C92\\u0CB1\\u0cb3\\u0cb5\\u0cde]", /*roundtrip exclusions*/ 14546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "MALAYALAM-BENGALI", "[:MALAYALAM:]", "[:BENGALI:]", 14566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0981\\u09e2\\u09e3\\u09bc\\u09c4\\u09f0\\u09f1\\u09dc\\u09dd\\u09df\\u09dc\\u09dd\\u09df\\u09f2-\\u09fa\\u09ce]", /*roundtrip exclusions*/ 14576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "BENGALI-MALAYALAM", "[:BENGALI:]", "[:MALAYALAM:]", 14596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0d46\\u0d4a\\u0d47\\u0d31-\\u0d35\\u0d0e\\u0d12]", /*roundtrip exclusions*/ 14606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "GUJARATI-GURMUKHI", "[:GUJARATI:]", "[:GURMUKHI:]", 14626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0A02\\u0ab3\\u0ab6\\u0A70\\u0a71\\u0a82\\u0a83\\u0ac3\\u0ac4\\u0ac5\\u0ac9\\u0a5c\\u0a72\\u0a73\\u0a74\\u0a8b\\u0a8d\\u0a91\\u0abd]", /*roundtrip exclusions*/ 14636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "GURMUKHI-GUJARATI", "[:GURMUKHI:]", "[:GUJARATI:]", 14656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0a5c\\u0A70\\u0a71\\u0a72\\u0a73\\u0a74\\u0a82\\u0a83\\u0a8b\\u0a8c\\u0a8d\\u0a91\\u0ab3\\u0ab6\\u0ab7\\u0abd\\u0ac3\\u0ac4\\u0ac5\\u0ac9\\u0ad0\\u0ae0\\u0ae1]", /*roundtrip exclusions*/ 14666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "ORIYA-GURMUKHI", "[:ORIYA:]", "[:GURMUKHI:]", 14686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0A01\\u0A02\\u0a5c\\u0a21\\u0a47\\u0a71\\u0b02\\u0b03\\u0b33\\u0b36\\u0b43\\u0b56\\u0b57\\u0B0B\\u0B0C\\u0B37\\u0B3D\\u0B5F\\u0B60\\u0B61\\u0a35\\u0a72\\u0a73\\u0a74]", /*roundtrip exclusions*/ 14696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "GURMUKHI-ORIYA", "[:GURMUKHI:]", "[:ORIYA:]", 14716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0b01\\u0b02\\u0b03\\u0b33\\u0b36\\u0b43\\u0b56\\u0b57\\u0B0B\\u0B0C\\u0B37\\u0B3D\\u0B5F\\u0B60\\u0B61\\u0b70\\u0b71]", /*roundtrip exclusions*/ 14726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "TAMIL-GURMUKHI", "[:TAMIL:]", "[:GURMUKHI:]", 14746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0A01\\u0A02\\u0a33\\u0a36\\u0a3c\\u0a70\\u0a71\\u0a47\\u0A16\\u0A17\\u0A18\\u0A1B\\u0A1D\\u0A20\\u0A21\\u0A22\\u0A25\\u0A26\\u0A27\\u0A2B\\u0A2C\\u0A2D\\u0A59\\u0A5A\\u0A5B\\u0A5C\\u0A5E\\u0A72\\u0A73\\u0A74]", /*roundtrip exclusions*/ 14756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "GURMUKHI-TAMIL", "[:GURMUKHI:]", "[:TAMIL:]", 14776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0b82\\u0bc6\\u0bca\\u0bd7\\u0bb7\\u0bb3\\u0b83\\u0B8E\\u0B92\\u0BA9\\u0BB1\\u0BB4\\u0bb6\\u0BF0\\u0BF1\\u0BF2]", /*roundtrip exclusions*/ 14786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "TELUGU-GURMUKHI", "[:TELUGU:]", "[:GURMUKHI:]", 14806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0A02\\u0a33\\u0a36\\u0a3c\\u0a70\\u0a71\\u0A59\\u0A5A\\u0A5B\\u0A5C\\u0A5E\\u0A72\\u0A73\\u0A74]", /*roundtrip exclusions*/ 14816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "GURMUKHI-TELUGU", "[:GURMUKHI:]", "[:TELUGU:]", 14836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0c01\\u0c02\\u0c03\\u0c33\\u0c36\\u0c44\\u0c43\\u0c46\\u0c4a\\u0c56\\u0c55\\u0C0B\\u0C0C\\u0C0E\\u0C12\\u0C31\\u0C37\\u0C60\\u0C61]", /*roundtrip exclusions*/ 14846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "KANNADA-GURMUKHI", "[:KANNADA:]", "[:GURMUKHI:]", 14866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0A01\\u0A02\\u0a33\\u0a36\\u0a3c\\u0a70\\u0a71\\u0A59\\u0A5A\\u0A5B\\u0A5C\\u0A5E\\u0A72\\u0A73\\u0A74]", /*roundtrip exclusions*/ 14876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "GURMUKHI-KANNADA", "[:GURMUKHI:]", "[:KANNADA:]", 14896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[{\\u0cb0\\u0cbc}{\\u0cb3\\u0cbc}\\u0c82\\u0c83\\u0cb3\\u0cb6\\u0cc4\\u0cc3\\u0cc6\\u0cca\\u0cd5\\u0cd6\\u0C8B\\u0C8C\\u0C8E\\u0C92\\u0CB1\\u0CB7\\u0cbd\\u0CE0\\u0CE1\\u0cde]", /*roundtrip exclusions*/ 14906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "MALAYALAM-GURMUKHI", "[:MALAYALAM:]", "[:GURMUKHI:]", 14926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0A01\\u0A02\\u0a4b\\u0a4c\\u0a33\\u0a36\\u0a3c\\u0a70\\u0a71\\u0A59\\u0A5A\\u0A5B\\u0A5C\\u0A5E\\u0A72\\u0A73\\u0A74]", /*roundtrip exclusions*/ 14936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "GURMUKHI-MALAYALAM", "[:GURMUKHI:]", "[:MALAYALAM:]", 14956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0d02\\u0d03\\u0d33\\u0d36\\u0d43\\u0d46\\u0d4a\\u0d4c\\u0d57\\u0D0B\\u0D0C\\u0D0E\\u0D12\\u0D31\\u0D34\\u0D37\\u0D60\\u0D61]", /*roundtrip exclusions*/ 14966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "GUJARATI-ORIYA", "[:GUJARATI:]", "[:ORIYA:]", 14986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0b56\\u0b57\\u0B0C\\u0B5F\\u0B61\\u0b70\\u0b71]", /*roundtrip exclusions*/ 14996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "ORIYA-GUJARATI", "[:ORIYA:]", "[:GUJARATI:]", 15016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0Ac4\\u0Ac5\\u0Ac9\\u0Ac7\\u0A8D\\u0A91\\u0AB5\\u0Ad0]", /*roundtrip exclusions*/ 15026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "TAMIL-GUJARATI", "[:TAMIL:]", "[:GUJARATI:]", 15046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0A81\\u0a8c\\u0abc\\u0ac3\\u0Ac4\\u0Ac5\\u0Ac9\\u0Ac7\\u0A8B\\u0A8D\\u0A91\\u0A96\\u0A97\\u0A98\\u0A9B\\u0A9D\\u0AA0\\u0AA1\\u0AA2\\u0AA5\\u0AA6\\u0AA7\\u0AAB\\u0AAC\\u0AAD\\u0AB6\\u0ABD\\u0AD0\\u0AE0\\u0AE1]", /*roundtrip exclusions*/ 15056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "GUJARATI-TAMIL", "[:GUJARATI:]", "[:TAMIL:]", 15076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0Bc6\\u0Bca\\u0Bd7\\u0B8E\\u0B92\\u0BA9\\u0BB1\\u0BB4\\u0BF0\\u0BF1\\u0BF2]", /*roundtrip exclusions*/ 15086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "TELUGU-GUJARATI", "[:TELUGU:]", "[:GUJARATI:]", 15106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0abc\\u0Ac5\\u0Ac9\\u0A8D\\u0A91\\u0ABD\\u0Ad0]", /*roundtrip exclusions*/ 15116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "GUJARATI-TELUGU", "[:GUJARATI:]", "[:TELUGU:]", 15136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0c46\\u0c4a\\u0c55\\u0c56\\u0C0C\\u0C0E\\u0C12\\u0C31\\u0C61]", /*roundtrip exclusions*/ 15146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "KANNADA-GUJARATI", "[:KANNADA:]", "[:GUJARATI:]", 15166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0A81\\u0abc\\u0Ac5\\u0Ac9\\u0A8D\\u0A91\\u0ABD\\u0Ad0]", /*roundtrip exclusions*/ 15176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "GUJARATI-KANNADA", "[:GUJARATI:]", "[:KANNADA:]", 15196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[{\\u0cb0\\u0cbc}{\\u0cb3\\u0cbc}\\u0cc6\\u0cca\\u0cd5\\u0cd6\\u0C8C\\u0C8E\\u0C92\\u0CB1\\u0CDE\\u0CE1]", /*roundtrip exclusions*/ 15206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "MALAYALAM-GUJARATI", "[:MALAYALAM:]", "[:GUJARATI:]", 15226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0A81\\u0ac4\\u0acb\\u0acc\\u0abc\\u0Ac5\\u0Ac9\\u0A8D\\u0A91\\u0ABD\\u0Ad0]", /*roundtrip exclusions*/ 15236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "GUJARATI-MALAYALAM", "[:GUJARATI:]", "[:MALAYALAM:]", 15256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0d46\\u0d4a\\u0d4c\\u0d55\\u0d57\\u0D0C\\u0D0E\\u0D12\\u0D31\\u0D34\\u0D61]", /*roundtrip exclusions*/ 15266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "TAMIL-ORIYA", "[:TAMIL:]", "[:ORIYA:]", 15286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0B01\\u0b3c\\u0b43\\u0b56\\u0B0B\\u0B0C\\u0B16\\u0B17\\u0B18\\u0B1B\\u0B1D\\u0B20\\u0B21\\u0B22\\u0B25\\u0B26\\u0B27\\u0B2B\\u0B2C\\u0B2D\\u0B36\\u0B3D\\u0B5C\\u0B5D\\u0B5F\\u0B60\\u0B61\\u0b70\\u0b71]", /*roundtrip exclusions*/ 15296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "ORIYA-TAMIL", "[:ORIYA:]", "[:TAMIL:]", 15316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0bc6\\u0bca\\u0bc7\\u0B8E\\u0B92\\u0BA9\\u0BB1\\u0BB4\\u0BB5\\u0BF0\\u0BF1\\u0BF2]", /*roundtrip exclusions*/ 15326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "TELUGU-ORIYA", "[:TELUGU:]", "[:ORIYA:]", 15346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0b3c\\u0b57\\u0b56\\u0B3D\\u0B5C\\u0B5D\\u0B5F\\u0b70\\u0b71]", /*roundtrip exclusions*/ 15356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "ORIYA-TELUGU", "[:ORIYA:]", "[:TELUGU:]", 15376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0c44\\u0c46\\u0c4a\\u0c55\\u0c47\\u0C0E\\u0C12\\u0C31\\u0C35]", /*roundtrip exclusions*/ 15386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "KANNADA-ORIYA", "[:KANNADA:]", "[:ORIYA:]", 15406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0B01\\u0b3c\\u0b57\\u0B3D\\u0B5C\\u0B5D\\u0B5F\\u0b70\\u0b71]", /*roundtrip exclusions*/ 15416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "ORIYA-KANNADA", "[:ORIYA:]", "[:KANNADA:]", 15436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[{\\u0cb0\\u0cbc}{\\u0cb3\\u0cbc}\\u0cc4\\u0cc6\\u0cca\\u0cd5\\u0cc7\\u0C8E\\u0C92\\u0CB1\\u0CB5\\u0CDE]", /*roundtrip exclusions*/ 15446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "MALAYALAM-ORIYA", "[:MALAYALAM:]", "[:ORIYA:]", 15466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0B01\\u0b3c\\u0b56\\u0B3D\\u0B5C\\u0B5D\\u0B5F\\u0b70\\u0b71]", /*roundtrip exclusions*/ 15476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "ORIYA-MALAYALAM", "[:ORIYA:]", "[:MALAYALAM:]", 15496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0D47\\u0D46\\u0D4a\\u0D0E\\u0D12\\u0D31\\u0D34\\u0D35]", /*roundtrip exclusions*/ 15506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "TELUGU-TAMIL", "[:TELUGU:]", "[:TAMIL:]", 15526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0bd7\\u0ba9\\u0bb4\\u0BF0\\u0BF1\\u0BF2]", /*roundtrip exclusions*/ 15536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "TAMIL-TELUGU", "[:TAMIL:]", "[:TELUGU:]", 15556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0C01\\u0c43\\u0c44\\u0c46\\u0c47\\u0c55\\u0c56\\u0c66\\u0C0B\\u0C0C\\u0C16\\u0C17\\u0C18\\u0C1B\\u0C1D\\u0C20\\u0C21\\u0C22\\u0C25\\u0C26\\u0C27\\u0C2B\\u0C2C\\u0C2D\\u0C36\\u0C60\\u0C61]", /*roundtrip exclusions*/ 15566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "KANNADA-TAMIL", "[:KANNADA:]", "[:TAMIL:]", 15586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0bd7\\u0bc6\\u0ba9\\u0bb4\\u0BF0\\u0BF1\\u0BF2]", /*roundtrip exclusions*/ 15596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "TAMIL-KANNADA", "[:TAMIL:]", "[:KANNADA:]", 15616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0cc3\\u0cc4\\u0cc6\\u0cc7\\u0cd5\\u0cd6\\u0C8B\\u0C8C\\u0C96\\u0C97\\u0C98\\u0C9B\\u0C9D\\u0CA0\\u0CA1\\u0CA2\\u0CA5\\u0CA6\\u0CA7\\u0CAB\\u0CAC\\u0CAD\\u0CB6\\u0cbc\\u0cbd\\u0CDE\\u0CE0\\u0CE1]", /*roundtrip exclusions*/ 15626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "MALAYALAM-TAMIL", "[:MALAYALAM:]", "[:TAMIL:]", 15646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0ba9\\u0BF0\\u0BF1\\u0BF2]", /*roundtrip exclusions*/ 15656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "TAMIL-MALAYALAM", "[:TAMIL:]", "[:MALAYALAM:]", 15676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0d43\\u0d12\\u0D0B\\u0D0C\\u0D16\\u0D17\\u0D18\\u0D1B\\u0D1D\\u0D20\\u0D21\\u0D22\\u0D25\\u0D26\\u0D27\\u0D2B\\u0D2C\\u0D2D\\u0D36\\u0D60\\u0D61]", /*roundtrip exclusions*/ 15686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "KANNADA-TELUGU", "[:KANNADA:]", "[:TELUGU:]", 15706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0C01\\u0c3f\\u0c46\\u0c48\\u0c4a]", /*roundtrip exclusions*/ 15716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "TELUGU-KANNADA", "[:TELUGU:]", "[:KANNADA:]", 15736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0cc8\\u0cd5\\u0cd6\\u0cbc\\u0cbd\\u0CDE]", /*roundtrip exclusions*/ 15746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "MALAYALAM-TELUGU", "[:MALAYALAM:]", "[:TELUGU:]", 15766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0C01\\u0c44\\u0c4a\\u0c4c\\u0c4b\\u0c55\\u0c56]", /*roundtrip exclusions*/ 15776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "TELUGU-MALAYALAM", "[:TELUGU:]", "[:MALAYALAM:]", 15796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0d4c\\u0d57\\u0D34]", /*roundtrip exclusions*/ 15806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "MALAYALAM-KANNADA", "[:MALAYALAM:]", "[:KANNADA:]", 15826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0cbc\\u0cbd\\u0cc4\\u0cc6\\u0cca\\u0ccc\\u0ccb\\u0cd5\\u0cd6\\u0cDe]", /*roundtrip exclusions*/ 15836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "KANNADA-MALAYALAM", "[:KANNADA:]", "[:MALAYALAM:]", 15856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0d4c\\u0d57\\u0d46\\u0D34]", /*roundtrip exclusions*/ 15866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Latin-Bengali",latinForIndic, "[[:Bengali:][\\u0964\\u0965]]", 15886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0965\\u09f0-\\u09fa\\u09ce]" /*roundtrip exclusions*/ , 15896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Latin-Gurmukhi", latinForIndic, "[[:Gurmukhi:][\\u0964\\u0965]]", 15916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0a01\\u0965\\u0a02\\u0a72\\u0a73\\u0a74]" /*roundtrip exclusions*/, 15926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Latin-Gujarati",latinForIndic, "[[:Gujarati:][\\u0964\\u0965]]", 15946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0965]" /*roundtrip exclusions*/, 15956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Latin-Oriya",latinForIndic, "[[:Oriya:][\\u0964\\u0965]]", 15976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0965\\u0b70]" /*roundtrip exclusions*/, 15986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Latin-Tamil",latinForIndic, "[:Tamil:]", 16006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "[\\u0BF0\\u0BF1\\u0BF2]" /*roundtrip exclusions*/, 16016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Latin-Telugu",latinForIndic, "[:Telugu:]", 16036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org NULL /*roundtrip exclusions*/, 16046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Latin-Kannada",latinForIndic, "[:Kannada:]", 16066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org NULL /*roundtrip exclusions*/, 16076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "Latin-Malayalam",latinForIndic, "[:Malayalam:]", 16096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org NULL /*roundtrip exclusions*/ 16106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 16116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TransliteratorRoundTripTest::TestDebug(const char* name,const char fromSet[], 16136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char* toSet,const char* exclusions){ 16146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RTTest test(name); 16166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Legal *legal = new LegalIndic(); 16176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test.test(UnicodeString(fromSet,""),UnicodeString(toSet,""),exclusions,this,quick,legal); 16186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 16196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TransliteratorRoundTripTest::TestInterIndic() { 16216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //TestDebug("Latin-Gurmukhi", latinForIndic, "[:Gurmukhi:]","[\\u0965\\u0a02\\u0a72\\u0a73\\u0a74]",TRUE); 16226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t num = (int32_t)(sizeof(interIndicArray)/(INTER_INDIC_ARRAY_WIDTH*sizeof(char*))); 16236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(quick){ 16246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("Testing only 5 of %i. Skipping rest (use -e for exhaustive)",num); 16256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org num = 5; 16266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(int i = 0; i < num;i++){ 16286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org RTTest test(interIndicArray[i*INTER_INDIC_ARRAY_WIDTH + 0]); 16296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Legal *legal = new LegalIndic(); 16306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln(UnicodeString("Stress testing ") + interIndicArray[i*INTER_INDIC_ARRAY_WIDTH + 0]); 16316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if( !logKnownIssue( "cldrbug:1911" ) ) { 16326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* "full test" */ 16336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // CLDR bug #1911: This test should be moved into CLDR. 16346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test.test( interIndicArray[i*INTER_INDIC_ARRAY_WIDTH + 1], 16356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org interIndicArray[i*INTER_INDIC_ARRAY_WIDTH + 2], 16366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org interIndicArray[i*INTER_INDIC_ARRAY_WIDTH + 3], // roundtrip exclusions 16376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this, quick, legal, 50); 16386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 16396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // It is left in its current state as a regression test. 16406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // CLDR should test, and remove the age filter. 16416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* regression test - ""temporary"" until CLDR#1911 is fixed */ 16426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // start 16436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString source("["); 16446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org source.append(interIndicArray[i*INTER_INDIC_ARRAY_WIDTH + 1]); 16456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org source.append(" & [:Age=4.1:]]"); 16466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString target("["); 16476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org target.append(interIndicArray[i*INTER_INDIC_ARRAY_WIDTH + 2]); 16486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org target.append(" & [:Age=4.1:]]"); 16496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test.test( source, 16506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org target, 16516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org interIndicArray[i*INTER_INDIC_ARRAY_WIDTH + 3], // roundtrip exclusions 16526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org this, quick, legal, 50); 16536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // end 16546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete legal; 16556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 16586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// end indic tests ---------------------------------------------------------- 16606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* #if !UCONFIG_NO_TRANSLITERATION */ 1662