164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// Copyright (C) 2016 and later: Unicode, Inc. and others. 264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html 3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru********************************************************************** 58de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert* Copyright (C) 2000-2016, International Business Machines 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Corporation and others. All Rights Reserved. 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru********************************************************************** 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Date Name Description 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 05/23/00 aliu Creation. 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru********************************************************************** 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h" 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_TRANSLITERATION 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/translit.h" 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "rbt.h" 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/calendar.h" 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uniset.h" 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uchar.h" 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/normlzr.h" 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uchar.h" 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/parseerr.h" 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/usetiter.h" 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/putil.h" 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uversion.h" 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/locid.h" 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ulocdata.h" 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utf8.h" 3183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#include "unicode/utf16.h" 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "putilimp.h" 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h" 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "transrt.h" 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "testutil.h" 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <string.h> 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdio.h> 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define CASE(id,test) case id: \ 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name = #test; \ 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (exec) { \ 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(#test "---"); \ 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)""); \ 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UDate t = uprv_getUTCtime(); \ 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test(); \ 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = uprv_getUTCtime() - t; \ 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)#test " took " + t/U_MILLIS_PER_DAY + " seconds"); \ 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } \ 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define EXHAUSTIVE(id,test) case id: \ 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(quick==FALSE){ \ 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name = #test; \ 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (exec){ \ 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(#test "---"); \ 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)""); \ 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test(); \ 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } \ 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else{ \ 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name=""; \ 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } \ 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTransliteratorRoundTripTest::runIndexedTest(int32_t index, UBool exec, 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* &name, char* /*par*/) { 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (index) { 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(0, TestCyrillic); 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // CASE(0,TestKana); 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(1,TestHiragana); 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(2,TestKatakana); 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(3,TestJamo); 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(4,TestHangul); 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(5,TestGreek); 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(6,TestGreekUNGEGN); 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(7,Testel); 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(8,TestDevanagariLatin); 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(9,TestInterIndic); 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(10, TestHebrew); 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(11, TestArabic); 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(12, TestHan); 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: name = ""; break; 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//-------------------------------------------------------------------- 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// TransliteratorPointer 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//-------------------------------------------------------------------- 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * A transliterator pointer wrapper that deletes the contained 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * pointer automatically when the wrapper goes out of scope. 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Sometimes called a "janitor" or "smart pointer". 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass TransliteratorPointer { 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* t; 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // disallowed: 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TransliteratorPointer(const TransliteratorPointer& rhs); 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TransliteratorPointer& operator=(const TransliteratorPointer& rhs); 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TransliteratorPointer(Transliterator* adopted) { 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = adopted; 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ~TransliteratorPointer() { 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru inline Transliterator* operator->() { return t; } 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru inline operator const Transliterator*() const { return t; } 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru inline operator Transliterator*() { return t; } 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//-------------------------------------------------------------------- 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Legal 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//-------------------------------------------------------------------- 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass Legal { 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Legal() {} 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual ~Legal() {} 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UBool is(const UnicodeString& /*sourceString*/) const {return TRUE;} 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass LegalJamo : public Legal { 124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // any initial must be followed by a medial (or initial) 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // any medial must follow an initial (or medial) 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // any final must follow a medial (or final) 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LegalJamo() {} 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual ~LegalJamo() {} 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UBool is(const UnicodeString& sourceString) const; 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int getType(UChar c) const; 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool LegalJamo::is(const UnicodeString& sourceString) const { 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int t; 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString decomp; 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Normalizer::decompose(sourceString, FALSE, 0, decomp, ec); 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int i = 0; i < decomp.length(); ++i) { // don't worry about surrogates 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (getType(decomp.charAt(i))) { 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0: t = getType(decomp.charAt(i+1)); 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t != 0 && t != 1) { return FALSE; } 146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 1: t = getType(decomp.charAt(i-1)); 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t != 0 && t != 1) { return FALSE; } 149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 2: t = getType(decomp.charAt(i-1)); 151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t != 1 && t != 2) { return FALSE; } 152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint LegalJamo::getType(UChar c) const { 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (0x1100 <= c && c <= 0x1112) 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else if (0x1161 <= c && c <= 0x1175) 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 1; 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else if (0x11A8 <= c && c <= 0x11C2) 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 2; 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return -1; // other 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass LegalGreek : public Legal { 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool full; 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LegalGreek(UBool _full) { full = _full; } 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual ~LegalGreek() {} 173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UBool is(const UnicodeString& sourceString) const; 175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static UBool isVowel(UChar c); 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static UBool isRho(UChar c); 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool LegalGreek::is(const UnicodeString& sourceString) const { 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString decomp; 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Normalizer::decompose(sourceString, FALSE, 0, decomp, ec); 185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // modern is simpler: don't care about anything but a grave 187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (full == FALSE) { 188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // A special case which is legal but should be 189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // excluded from round trip 190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // if (sourceString == UnicodeString("\\u039C\\u03C0", "")) { 191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // return FALSE; 192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // } 193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i = 0; i < decomp.length(); ++i) { 194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar c = decomp.charAt(i); 195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // exclude all the accents 196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c == 0x0313 || c == 0x0314 || c == 0x0300 || c == 0x0302 197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || c == 0x0342 || c == 0x0345 198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) return FALSE; 199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Legal greek has breathing marks IFF there is a vowel or RHO at the start 204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // IF it has them, it has exactly one. 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // IF it starts with a RHO, then the breathing mark must come before the second letter. 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Since there are no surrogates in greek, don't worry about them 207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool firstIsVowel = FALSE; 208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool firstIsRho = FALSE; 209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool noLetterYet = TRUE; 210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t breathingCount = 0; 211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t letterCount = 0; 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i = 0; i < decomp.length(); ++i) { 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar c = decomp.charAt(i); 214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_isalpha(c)) { 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++letterCount; 216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (noLetterYet) { 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru noLetterYet = FALSE; 218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru firstIsVowel = isVowel(c); 219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru firstIsRho = isRho(c); 220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (firstIsRho && letterCount == 2 && breathingCount == 0) { 222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c == 0x0313 || c == 0x0314) { 226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++breathingCount; 227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (firstIsVowel || firstIsRho) return breathingCount == 1; 231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return breathingCount == 0; 232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool LegalGreek::isVowel(UChar c) { 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (c) { 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x03B1: 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x03B5: 238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x03B7: 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x03B9: 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x03BF: 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x03C5: 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x03C9: 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x0391: 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x0395: 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x0397: 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x0399: 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x039F: 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x03A5: 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x03A9: 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool LegalGreek::isRho(UChar c) { 256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (c) { 257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x03C1: 258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x03A1: 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// AbbreviatedUnicodeSetIterator Interface --------------------------------------------- 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Iterate over a UnicodeSet, only returning a sampling of the contained code points. 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// density is the approximate total number of code points to returned for the entire set. 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass AbbreviatedUnicodeSetIterator : public UnicodeSetIterator { 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic : 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru AbbreviatedUnicodeSetIterator(); 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual ~AbbreviatedUnicodeSetIterator(); 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void reset(UnicodeSet& set, UBool abb = FALSE, int32_t density = 100); 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /** 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * ICU "poor man's RTTI", returns a UClassID for this class. 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /** 283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * ICU "poor man's RTTI", returns a UClassID for the actual class. 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } 286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprivate : 288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool abbreviated; 289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t perRange; // The maximum number of code points to be returned from each range 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual void loadRange(int32_t range); 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /** 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The address of this static class variable serves as this class's ID 294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * for ICU "poor man's RTTI". 295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char fgClassID; 297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// AbbreviatedUnicodeSetIterator Implementation --------------------------------------- 300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char AbbreviatedUnicodeSetIterator::fgClassID=0; 302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruAbbreviatedUnicodeSetIterator::AbbreviatedUnicodeSetIterator() : 304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSetIterator(), abbreviated(FALSE) { 305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruAbbreviatedUnicodeSetIterator::~AbbreviatedUnicodeSetIterator() { 308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid AbbreviatedUnicodeSetIterator::reset(UnicodeSet& newSet, UBool abb, int32_t density) { 311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSetIterator::reset(newSet); 312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru abbreviated = abb; 313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru perRange = newSet.getRangeCount(); 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (perRange != 0) { 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru perRange = density / perRange; 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid AbbreviatedUnicodeSetIterator::loadRange(int32_t myRange) { 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSetIterator::loadRange(myRange); 321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (abbreviated && (endElement > nextElement + perRange)) { 322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru endElement = nextElement + perRange; 323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//-------------------------------------------------------------------- 327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// RTTest Interface 328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//-------------------------------------------------------------------- 329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass RTTest : public IntlTest { 331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // PrintWriter out; 333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString transliteratorID; 335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t errorLimit; 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t errorCount; 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t pairLimit; 338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSet sourceRange; 339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSet targetRange; 340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSet toSource; 341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSet toTarget; 342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSet roundtripExclusionsSet; 343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IntlTest* parent; 344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Legal* legalSource; // NOT owned 345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSet badCharacters; 346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * create a test for the given script transliterator. 351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RTTest(const UnicodeString& transliteratorIDStr); 353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual ~RTTest(); 355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void setErrorLimit(int32_t limit); 357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void setPairLimit(int32_t limit); 359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void test(const UnicodeString& sourceRange, 361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& targetRange, 362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* roundtripExclusions, 363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IntlTest* parent, 364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool quick, 365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Legal* adoptedLegal, 366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t density = 100); 367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprivate: 369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Added to do better equality check. 371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static UBool isSame(const UnicodeString& a, const UnicodeString& b); 373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static UBool isCamel(const UnicodeString& a); 375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool checkIrrelevants(Transliterator *t, const UnicodeString& irrelevants); 377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void test2(UBool quick, int32_t density); 379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void logWrongScript(const UnicodeString& label, 381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& from, 382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& to); 383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void logNotCanonical(const UnicodeString& label, 385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& from, 386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& to, 387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& fromCan, 388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& toCan); 389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void logFails(const UnicodeString& label); 391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void logToRulesFails(const UnicodeString& label, 393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& from, 394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& to, 395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& toCan); 396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void logRoundTripFailure(const UnicodeString& from, 398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& toID, 399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& to, 400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& backID, 401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& back); 402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//-------------------------------------------------------------------- 405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// RTTest Implementation 406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//-------------------------------------------------------------------- 407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * create a test for the given script transliterator. 410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruRTTest::RTTest(const UnicodeString& transliteratorIDStr) { 412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru transliteratorID = transliteratorIDStr; 413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorLimit = 500; 414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCount = 0; 415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pairLimit = 0x10000; 416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruRTTest::~RTTest() { 419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid RTTest::setErrorLimit(int32_t limit) { 422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorLimit = limit; 423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid RTTest::setPairLimit(int32_t limit) { 426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pairLimit = limit; 427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool RTTest::isSame(const UnicodeString& a, const UnicodeString& b) { 430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (a == b) return TRUE; 431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (a.caseCompare(b, U_FOLD_CASE_DEFAULT)==0 && isCamel(a)) return TRUE; 432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString aa, bb; 433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Normalizer::decompose(a, FALSE, 0, aa, ec); 435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Normalizer::decompose(b, FALSE, 0, bb, ec); 436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (aa == bb) return TRUE; 437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (aa.caseCompare(bb, U_FOLD_CASE_DEFAULT)==0 && isCamel(aa)) return TRUE; 438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool RTTest::isCamel(const UnicodeString& a) { 442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // see if string is of the form aB; e.g. lower, then upper or title 443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 cp; 444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool haveLower = FALSE; 44583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius for (int32_t i = 0; i < a.length(); i += U16_LENGTH(cp)) { 446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cp = a.char32At(i); 447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int8_t t = u_charType(cp); 448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (t) { 449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case U_UPPERCASE_LETTER: 450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (haveLower) return TRUE; 451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case U_TITLECASE_LETTER: 453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (haveLower) return TRUE; 4548de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert // fall through, since second letter is lower. 4558de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert U_FALLTHROUGH; 456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case U_LOWERCASE_LETTER: 457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru haveLower = TRUE; 458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid RTTest::test(const UnicodeString& sourceRangeVal, 465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& targetRangeVal, 466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* roundtripExclusions, 467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IntlTest* logVal, UBool quickRt, 468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Legal* adoptedLegal, 469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t density) 470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this->parent = logVal; 475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this->legalSource = adoptedLegal; 476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSet neverOk("[:Other:]", status); 478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSet okAnyway("[^[:Letter:]]", status); 479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 4816d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru parent->dataerrln("FAIL: Initializing UnicodeSet with [:Other:] or [^[:Letter:]] - Error: %s", u_errorName(status)); 482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this->sourceRange.clear(); 486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this->sourceRange.applyPattern(sourceRangeVal, status); 487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->errln("FAIL: UnicodeSet::applyPattern(" + 489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sourceRangeVal + ")"); 490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this->sourceRange.removeAll(neverOk); 493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this->targetRange.clear(); 495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this->targetRange.applyPattern(targetRangeVal, status); 496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->errln("FAIL: UnicodeSet::applyPattern(" + 498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru targetRangeVal + ")"); 499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this->targetRange.removeAll(neverOk); 502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this->toSource.clear(); 504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this->toSource.applyPattern(sourceRangeVal, status); 505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->errln("FAIL: UnicodeSet::applyPattern(" + 507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sourceRangeVal + ")"); 508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this->toSource.addAll(okAnyway); 511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this->toTarget.clear(); 513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this->toTarget.applyPattern(targetRangeVal, status); 514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->errln("FAIL: UnicodeSet::applyPattern(" + 516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru targetRangeVal + ")"); 517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this->toTarget.addAll(okAnyway); 520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this->roundtripExclusionsSet.clear(); 522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (roundtripExclusions != NULL && strlen(roundtripExclusions) > 0) { 523c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru this->roundtripExclusionsSet.applyPattern(UnicodeString(roundtripExclusions, -1, US_INV), status); 524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->errln("FAIL: UnicodeSet::applyPattern(%s)", roundtripExclusions); 526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru badCharacters.clear(); 531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru badCharacters.applyPattern("[:Other:]", status); 532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->errln("FAIL: UnicodeSet::applyPattern([:Other:])"); 534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test2(quickRt, density); 538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (errorCount > 0) { 540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char str[100]; 541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length = transliteratorID.extract(str, 100, NULL, status); 542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru str[length] = 0; 543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->errln("FAIL: %s errors: %d %s", str, errorCount, (errorCount > errorLimit ? " (at least!)" : " ")); // + ", see " + logFileName); 544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char str[100]; 546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length = transliteratorID.extract(str, 100, NULL, status); 547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru str[length] = 0; 548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->logln("%s ok", str); 549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool RTTest::checkIrrelevants(Transliterator *t, 553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& irrelevants) { 554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int i = 0; i < irrelevants.length(); ++i) { 555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar c = irrelevants.charAt(i); 556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString srcStr(c); 557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString targ = srcStr; 558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t->transliterate(targ); 559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (srcStr == targ) return TRUE; 560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid RTTest::test2(UBool quickRt, int32_t density) { 565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString srcStr, targ, reverse; 567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError ; 569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TransliteratorPointer sourceToTarget( 570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::createInstance(transliteratorID, UTRANS_FORWARD, parseError, 571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status)); 572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((Transliterator *)sourceToTarget == NULL) { 573b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho parent->dataerrln("FAIL: createInstance(" + transliteratorID + 574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ") returned NULL. Error: " + u_errorName(status) 575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru + "\n\tpreContext : " + prettify(parseError.preContext) 576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru + "\n\tpostContext : " + prettify(parseError.postContext)); 577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TransliteratorPointer targetToSource(sourceToTarget->createInverse(status)); 581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((Transliterator *)targetToSource == NULL) { 582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->errln("FAIL: " + transliteratorID + 583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ".createInverse() returned NULL. Error:" + u_errorName(status) 584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru + "\n\tpreContext : " + prettify(parseError.preContext) 585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru + "\n\tpostContext : " + prettify(parseError.postContext)); 586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru AbbreviatedUnicodeSetIterator usi; 590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru AbbreviatedUnicodeSetIterator usi2; 591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->logln("Checking that at least one irrelevant character is not NFC'ed"); 593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // string is from NFC_NO in the UCD 594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString irrelevants = CharsToUnicodeString("\\u2000\\u2001\\u2126\\u212A\\u212B\\u2329"); 595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (checkIrrelevants(sourceToTarget, irrelevants) == FALSE) { 597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logFails("Source-Target, irrelevants"); 598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (checkIrrelevants(targetToSource, irrelevants) == FALSE) { 600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logFails("Target-Source, irrelevants"); 601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!quickRt){ 604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->logln("Checking that toRules works"); 605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rules = ""; 606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rules = sourceToTarget->toRules(rules, TRUE); 609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // parent->logln((UnicodeString)"toRules => " + rules); 610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TransliteratorPointer sourceToTarget2(Transliterator::createFromRules( 611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "s2t2", rules, 612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTRANS_FORWARD, 613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parseError, status)); 614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->errln("FAIL: createFromRules %s\n", u_errorName(status)); 616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rules = targetToSource->toRules(rules, FALSE); 620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TransliteratorPointer targetToSource2(Transliterator::createFromRules( 621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "t2s2", rules, 622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTRANS_FORWARD, 623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parseError, status)); 624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->errln("FAIL: createFromRules %s\n", u_errorName(status)); 626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru usi.reset(sourceRange); 630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (;;) { 631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!usi.next() || usi.isString()) break; 632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 c = usi.getCodepoint(); 633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString srcStr((UChar32)c); 635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString targ = srcStr; 636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sourceToTarget->transliterate(targ); 637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString targ2 = srcStr; 638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sourceToTarget2->transliterate(targ2); 639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (targ != targ2) { 640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logToRulesFails("Source-Target, toRules", srcStr, targ, targ2); 641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru usi.reset(targetRange); 645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (;;) { 646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!usi.next() || usi.isString()) break; 647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 c = usi.getCodepoint(); 648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString srcStr((UChar32)c); 650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString targ = srcStr; 651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru targetToSource->transliterate(targ); 652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString targ2 = srcStr; 653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru targetToSource2->transliterate(targ2); 654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (targ != targ2) { 655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logToRulesFails("Target-Source, toRules", srcStr, targ, targ2); 656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->logln("Checking that all source characters convert to target - Singles"); 661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSet failSourceTarg; 663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru usi.reset(sourceRange); 664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (;;) { 665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!usi.next() || usi.isString()) break; 666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 c = usi.getCodepoint(); 667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString srcStr((UChar32)c); 669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString targ = srcStr; 670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sourceToTarget->transliterate(targ); 671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (toTarget.containsAll(targ) == FALSE 672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || badCharacters.containsSome(targ) == TRUE) { 673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString targD; 674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Normalizer::decompose(targ, FALSE, 0, targD, status); 675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->errln("FAIL: Internal error during decomposition %s\n", u_errorName(status)); 677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (toTarget.containsAll(targD) == FALSE || 680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru badCharacters.containsSome(targD) == TRUE) { 681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logWrongScript("Source-Target", srcStr, targ); 682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failSourceTarg.add(c); 683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString cs2; 688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Normalizer::decompose(srcStr, FALSE, 0, cs2, status); 689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->errln("FAIL: Internal error during decomposition %s\n", u_errorName(status)); 691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString targ2 = cs2; 694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sourceToTarget->transliterate(targ2); 695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (targ != targ2) { 696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logNotCanonical("Source-Target", srcStr, targ,cs2, targ2); 697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->logln("Checking that all source characters convert to target - Doubles"); 701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSet sourceRangeMinusFailures(sourceRange); 703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sourceRangeMinusFailures.removeAll(failSourceTarg); 704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru usi.reset(sourceRangeMinusFailures, quickRt, density); 706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (;;) { 707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!usi.next() || usi.isString()) break; 708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 c = usi.getCodepoint(); 709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru usi2.reset(sourceRangeMinusFailures, quickRt, density); 711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (;;) { 712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!usi2.next() || usi2.isString()) break; 713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 d = usi2.getCodepoint(); 714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString srcStr; 716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcStr += (UChar32)c; 717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcStr += (UChar32)d; 718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString targ = srcStr; 719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sourceToTarget->transliterate(targ); 720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (toTarget.containsAll(targ) == FALSE || 721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru badCharacters.containsSome(targ) == TRUE) 722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString targD; 724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Normalizer::decompose(targ, FALSE, 0, targD, status); 725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->errln("FAIL: Internal error during decomposition %s\n", u_errorName(status)); 727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (toTarget.containsAll(targD) == FALSE || 730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru badCharacters.containsSome(targD) == TRUE) { 731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logWrongScript("Source-Target", srcStr, targ); 732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString cs2; 736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Normalizer::decompose(srcStr, FALSE, 0, cs2, status); 737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->errln("FAIL: Internal error during decomposition %s\n", u_errorName(status)); 739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString targ2 = cs2; 742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sourceToTarget->transliterate(targ2); 743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (targ != targ2) { 744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logNotCanonical("Source-Target", srcStr, targ, cs2,targ2); 745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->logln("Checking that target characters convert to source and back - Singles"); 750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSet failTargSource; 752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSet failRound; 753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru usi.reset(targetRange); 755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (;;) { 756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!usi.next()) break; 757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(usi.isString()){ 759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcStr = usi.getString(); 760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else{ 761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcStr = (UnicodeString)usi.getCodepoint(); 762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 c = srcStr.char32At(0); 765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru targ = srcStr; 767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru targetToSource->transliterate(targ); 768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru reverse = targ; 769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sourceToTarget->transliterate(reverse); 770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (toSource.containsAll(targ) == FALSE || 772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru badCharacters.containsSome(targ) == TRUE) { 773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString targD; 774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Normalizer::decompose(targ, FALSE, 0, targD, status); 775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->errln("FAIL: Internal error during decomposition%s\n", u_errorName(status)); 777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (toSource.containsAll(targD) == FALSE) { 780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logWrongScript("Target-Source", srcStr, targ); 781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failTargSource.add(c); 782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (badCharacters.containsSome(targD) == TRUE) { 785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logWrongScript("Target-Source*", srcStr, targ); 786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failTargSource.add(c); 787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (isSame(srcStr, reverse) == FALSE && 791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru roundtripExclusionsSet.contains(c) == FALSE 792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru && roundtripExclusionsSet.contains(srcStr)==FALSE) { 793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logRoundTripFailure(srcStr,targetToSource->getID(), targ,sourceToTarget->getID(), reverse); 794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failRound.add(c); 795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString targ2; 799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Normalizer::decompose(targ, FALSE, 0, targ2, status); 800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->errln("FAIL: Internal error during decomposition%s\n", u_errorName(status)); 802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString reverse2 = targ2; 805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sourceToTarget->transliterate(reverse2); 806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (reverse != reverse2) { 807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logNotCanonical("Target-Source", targ, reverse, targ2, reverse2); 808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->logln("Checking that target characters convert to source and back - Doubles"); 812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t count = 0; 813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSet targetRangeMinusFailures(targetRange); 815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru targetRangeMinusFailures.removeAll(failTargSource); 816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru targetRangeMinusFailures.removeAll(failRound); 817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru usi.reset(targetRangeMinusFailures, quickRt, density); 819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString targ2; 820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString reverse2; 821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString targD; 822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (;;) { 823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!usi.next() || usi.isString()) break; 824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 c = usi.getCodepoint(); 825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (++count > pairLimit) { 826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //throw new TestTruncated("Test truncated at " + pairLimit + " x 64k pairs"); 827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->logln(""); 828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->logln((UnicodeString)"Test truncated at " + pairLimit + " x 64k pairs"); 829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru usi2.reset(targetRangeMinusFailures, quickRt, density); 833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (;;) { 834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!usi2.next() || usi2.isString()) 835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 d = usi2.getCodepoint(); 837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcStr.truncate(0); // empty the variable without construction/destruction 838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcStr += c; 839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru srcStr += d; 840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru targ = srcStr; 842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru targetToSource->transliterate(targ); 843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru reverse = targ; 844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sourceToTarget->transliterate(reverse); 845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (toSource.containsAll(targ) == FALSE || 847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru badCharacters.containsSome(targ) == TRUE) 848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru targD.truncate(0); // empty the variable without construction/destruction 850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Normalizer::decompose(targ, FALSE, 0, targD, status); 851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->errln("FAIL: Internal error during decomposition%s\n", 853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_errorName(status)); 854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (toSource.containsAll(targD) == FALSE 857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || badCharacters.containsSome(targD) == TRUE) 858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logWrongScript("Target-Source", srcStr, targ); 860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (isSame(srcStr, reverse) == FALSE && 864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru roundtripExclusionsSet.contains(c) == FALSE&& 865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru roundtripExclusionsSet.contains(d) == FALSE && 866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru roundtripExclusionsSet.contains(srcStr)== FALSE) 867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logRoundTripFailure(srcStr,targetToSource->getID(), targ, sourceToTarget->getID(),reverse); 869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru targ2.truncate(0); // empty the variable without construction/destruction 873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Normalizer::decompose(targ, FALSE, 0, targ2, status); 874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->errln("FAIL: Internal error during decomposition%s\n", u_errorName(status)); 876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru reverse2 = targ2; 879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sourceToTarget->transliterate(reverse2); 880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (reverse != reverse2) { 881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logNotCanonical("Target-Source", targ,reverse, targ2, reverse2); 882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->logln(""); 886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid RTTest::logWrongScript(const UnicodeString& label, 889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& from, 890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& to) { 891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->errln((UnicodeString)"FAIL " + 892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru label + ": " + 893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru from + "(" + TestUtility::hex(from) + ") => " + 894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru to + "(" + TestUtility::hex(to) + ")"); 895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++errorCount; 896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid RTTest::logNotCanonical(const UnicodeString& label, 899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& from, 900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& to, 901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& fromCan, 902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& toCan) { 903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->errln((UnicodeString)"FAIL (can.equiv)" + 904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru label + ": " + 905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru from + "(" + TestUtility::hex(from) + ") => " + 906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru to + "(" + TestUtility::hex(to) + ")" + 907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fromCan + "(" + TestUtility::hex(fromCan) + ") => " + 908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru toCan + " (" + 909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestUtility::hex(toCan) + ")" 910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ); 911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++errorCount; 912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid RTTest::logFails(const UnicodeString& label) { 915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->errln((UnicodeString)"<br>FAIL " + label); 916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++errorCount; 917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid RTTest::logToRulesFails(const UnicodeString& label, 920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& from, 921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& to, 922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& otherTo) 923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->errln((UnicodeString)"FAIL: " + 925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru label + ": " + 926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru from + "(" + TestUtility::hex(from) + ") => " + 927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru to + "(" + TestUtility::hex(to) + ")" + 928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "!=" + 929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru otherTo + " (" + 930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestUtility::hex(otherTo) + ")" 931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ); 932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++errorCount; 933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid RTTest::logRoundTripFailure(const UnicodeString& from, 937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& toID, 938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& to, 939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& backID, 940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& back) { 941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (legalSource->is(from) == FALSE) return; // skip illegals 942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parent->errln((UnicodeString)"FAIL Roundtrip: " + 944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru from + "(" + TestUtility::hex(from) + ") => " + 945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru to + "(" + TestUtility::hex(to) + ") "+toID+" => " + 946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru back + "(" + TestUtility::hex(back) + ") "+backID+" => "); 947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++errorCount; 948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//-------------------------------------------------------------------- 951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Specific Tests 952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//-------------------------------------------------------------------- 953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Note: Unicode 3.2 added new Hiragana/Katakana characters: 956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru3095..3096 ; 3.2 # [2] HIRAGANA LETTER SMALL KA..HIRAGANA LETTER SMALL KE 958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru309F..30A0 ; 3.2 # [2] HIRAGANA DIGRAPH YORI..KATAKANA-HIRAGANA DOUBLE HYPHEN 959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru30FF ; 3.2 # KATAKANA DIGRAPH KOTO 960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru31F0..31FF ; 3.2 # [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO 961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 96250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho Unicode 5.2 added another Hiragana character: 96350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho1F200 ; 5.2 # SQUARE HIRAGANA HOKA 96450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru We will not add them to the rules until they are more supported (e.g. in fonts on Windows) 966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru A bug has been filed to remind us to do this: #1979. 967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 96850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 96927f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char KATAKANA[] = "[[[:katakana:][\\u30A1-\\u30FA\\u30FC]]-[\\u30FF\\u31F0-\\u31FF]-[:^age=5.2:]]"; 97027f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char HIRAGANA[] = "[[[:hiragana:][\\u3040-\\u3094]]-[\\u3095-\\u3096\\u309F-\\u30A0\\U0001F200-\\U0001F2FF]-[:^age=5.2:]]"; 971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char LENGTH[] = "[\\u30FC]"; 972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char HALFWIDTH_KATAKANA[] = "[\\uFF65-\\uFF9D]"; 973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char KATAKANA_ITERATION[] = "[\\u30FD\\u30FE]"; 974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char HIRAGANA_ITERATION[] = "[\\u309D\\u309E]"; 975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const int32_t TEMP_MAX=256; 976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorRoundTripTest::TestKana() { 978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RTTest test("Katakana-Hiragana"); 979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Legal *legal = new Legal(); 980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char temp[TEMP_MAX]; 981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcpy(temp, "["); 982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(temp, HALFWIDTH_KATAKANA); 983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(temp, LENGTH); 984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(temp, "]"); 985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test.test(KATAKANA, UnicodeString("[") + HIRAGANA + LENGTH + UnicodeString("]"), 986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp, 987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this, quick, legal); 988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete legal; 989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorRoundTripTest::TestHiragana() { 992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RTTest test("Latin-Hiragana"); 993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Legal *legal = new Legal(); 994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test.test(UnicodeString("[a-zA-Z]", ""), 995c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString(HIRAGANA, -1, US_INV), 996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru HIRAGANA_ITERATION, this, quick, legal); 997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete legal; 998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorRoundTripTest::TestKatakana() { 1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RTTest test("Latin-Katakana"); 1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Legal *legal = new Legal(); 1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char temp[TEMP_MAX]; 1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcpy(temp, "["); 1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(temp, KATAKANA_ITERATION); 1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(temp, HALFWIDTH_KATAKANA); 1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strcat(temp, "]"); 1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test.test(UnicodeString("[a-zA-Z]", ""), 1009c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString(KATAKANA, -1, US_INV), 1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp, 1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this, quick, legal); 1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete legal; 1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorRoundTripTest::TestJamo() { 1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RTTest t("Latin-Jamo"); 1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Legal *legal = new LegalJamo(); 1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t.test(UnicodeString("[a-zA-Z]", ""), 1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString("[\\u1100-\\u1112 \\u1161-\\u1175 \\u11A8-\\u11C2]", 1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ""), 1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL, this, quick, legal); 1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete legal; 1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorRoundTripTest::TestHangul() { 1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RTTest t("Latin-Hangul"); 1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Legal *legal = new Legal(); 1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (quick) t.setPairLimit(1000); 1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t.test(UnicodeString("[a-zA-Z]", ""), 1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString("[\\uAC00-\\uD7A4]", ""), 1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL, this, quick, legal, 1); 1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete legal; 1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define ASSERT_SUCCESS(status) {if (U_FAILURE(status)) { \ 10376d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "error at file %s, line %d, status = %s", __FILE__, __LINE__, \ 1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_errorName(status)); \ 1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return;}} 1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void writeStringInU8(FILE *out, const UnicodeString &s) { 1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i; 1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=0; i<s.length(); i=s.moveIndex32(i, 1)) { 1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 c = s.char32At(i); 1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint8_t bufForOneChar[10]; 1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool isError = FALSE; 1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t destIdx = 0; 1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U8_APPEND(bufForOneChar, destIdx, (int32_t)sizeof(bufForOneChar), c, isError); 1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fwrite(bufForOneChar, 1, destIdx, out); 1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorRoundTripTest::TestHan() { 1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 105950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalULocaleDataPointer uld(ulocdata_open("zh",&status)); 106050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalUSetPointer USetExemplars(ulocdata_getExemplarSet(uld.getAlias(), uset_openEmpty(), 0, ULOCDATA_ES_STANDARD, &status)); 1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ASSERT_SUCCESS(status); 1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString source; 1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 c; 1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i; 1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=0; ;i++) { 1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Add all of the Chinese exemplar chars to the string "source". 106850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho c = uset_charAt(USetExemplars.getAlias(), i); 1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c == (UChar32)-1) { 1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru source.append(c); 1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // transform with Han translit 1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *hanTL = Transliterator::createInstance("Han-Latin", UTRANS_FORWARD, status); 1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ASSERT_SUCCESS(status); 1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString target=source; 1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru hanTL->transliterate(target); 1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // now verify that there are no Han characters left 1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSet allHan("[:han:]", status); 1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ASSERT_SUCCESS(status); 1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (allHan.containsSome(target)) { 1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("file %s, line %d, No Han must be left after Han-Latin transliteration", 1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru __FILE__, __LINE__); 1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // check the pinyin translit 1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *pn = Transliterator::createInstance("Latin-NumericPinyin", UTRANS_FORWARD, status); 1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ASSERT_SUCCESS(status); 1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString target2 = target; 1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pn->transliterate(target2); 1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // verify that there are no marks 1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *nfd = Transliterator::createInstance("nfd", UTRANS_FORWARD, status); 1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ASSERT_SUCCESS(status); 1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString nfded = target2; 1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nfd->transliterate(nfded); 1100c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 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) 1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ASSERT_SUCCESS(status); 1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertFalse("NumericPinyin must contain no marks", allMarks.containsSome(nfded)); 1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // verify roundtrip 1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *np = pn->createInverse(status); 1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ASSERT_SUCCESS(status); 1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString target3 = target2; 1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru np->transliterate(target3); 1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool roundtripOK = (target3.compare(target) == 0); 1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertTrue("NumericPinyin must roundtrip", roundtripOK); 1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!roundtripOK) { 1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *filename = "numeric-pinyin.log.txt"; 1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FILE *out = fopen(filename, "w"); 1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Creating log file %s\n", filename); 1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(out, "Pinyin: "); 1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru writeStringInU8(out, target); 1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(out, "\nPinyin-Numeric-Pinyin: "); 1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru writeStringInU8(out, target2); 1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(out, "\nNumeric-Pinyin-Pinyin: "); 1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru writeStringInU8(out, target3); 1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(out, "\n"); 1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fclose(out); 1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete hanTL; 1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete pn; 1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete nfd; 1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete np; 1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorRoundTripTest::TestGreek() { 113359d709d503bab6e2b61931737e662dd293b40578ccornelius logKnownIssue( "cldrbug:1911"); 1134b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // It is left in its current state as a regression test. 113559d709d503bab6e2b61931737e662dd293b40578ccornelius 1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RTTest test("Latin-Greek"); 1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LegalGreek *legal = new LegalGreek(TRUE); 1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test.test(UnicodeString("[a-zA-Z]", ""), 1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString("[\\u003B\\u00B7[[:Greek:]&[:Letter:]]-[" 1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1D26-\\u1D2A" // L& [5] GREEK LETTER SMALL CAPITAL GAMMA..GREEK LETTER SMALL CAPITAL PSI 1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1D5D-\\u1D61" // Lm [5] MODIFIER LETTER SMALL BETA..MODIFIER LETTER SMALL CHI 1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1D66-\\u1D6A" // L& [5] GREEK SUBSCRIPT SMALL LETTER BETA..GREEK SUBSCRIPT SMALL LETTER CHI 1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u03D7-\\u03EF" // \N{GREEK KAI SYMBOL}..\N{COPTIC SMALL LETTER DEI} 1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "] & [:Age=4.0:]]", 1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //UnicodeString("[[\\u003B\\u00B7[:Greek:]-[\\u0374\\u0385\\u1fcd\\u1fce\\u1fdd\\u1fde\\u1fed-\\u1fef\\u1ffd\\u03D7-\\u03EF]]&[:Age=3.2:]]", 1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ""), 1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u00B5\\u037A\\u03D0-\\u03F5\\u03f9]", /* exclusions */ 1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this, quick, legal, 50); 1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete legal; 1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorRoundTripTest::TestGreekUNGEGN() { 115859d709d503bab6e2b61931737e662dd293b40578ccornelius logKnownIssue( "cldrbug:1911"); 1159b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // It is left in its current state as a regression test. 1160b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RTTest test("Latin-Greek/UNGEGN"); 1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LegalGreek *legal = new LegalGreek(FALSE); 1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test.test(UnicodeString("[a-zA-Z]", ""), 1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString("[\\u003B\\u00B7[[:Greek:]&[:Letter:]]-[" 1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1D26-\\u1D2A" // L& [5] GREEK LETTER SMALL CAPITAL GAMMA..GREEK LETTER SMALL CAPITAL PSI 1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1D5D-\\u1D61" // Lm [5] MODIFIER LETTER SMALL BETA..MODIFIER LETTER SMALL CHI 1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1D66-\\u1D6A" // L& [5] GREEK SUBSCRIPT SMALL LETTER BETA..GREEK SUBSCRIPT SMALL LETTER CHI 1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u03D7-\\u03EF" // \N{GREEK KAI SYMBOL}..\N{COPTIC SMALL LETTER DEI} 1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "] & [:Age=4.0:]]", 1171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //UnicodeString("[[\\u003B\\u00B7[:Greek:]-[\\u0374\\u0385\\u1fce\\u1fde\\u03D7-\\u03EF]]&[:Age=3.2:]]", 1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ""), 1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0385\\u00B5\\u037A\\u03D0-\\uFFFF {\\u039C\\u03C0}]", /* roundtrip exclusions */ 1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this, quick, legal); 1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete legal; 1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorRoundTripTest::Testel() { 118059d709d503bab6e2b61931737e662dd293b40578ccornelius logKnownIssue( "cldrbug:1911"); 1181b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // It is left in its current state as a regression test. 1182b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RTTest test("Latin-el"); 1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LegalGreek *legal = new LegalGreek(FALSE); 1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test.test(UnicodeString("[a-zA-Z]", ""), 1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString("[\\u003B\\u00B7[[:Greek:]&[:Letter:]]-[" 1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1D26-\\u1D2A" // L& [5] GREEK LETTER SMALL CAPITAL GAMMA..GREEK LETTER SMALL CAPITAL PSI 1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1D5D-\\u1D61" // Lm [5] MODIFIER LETTER SMALL BETA..MODIFIER LETTER SMALL CHI 1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1D66-\\u1D6A" // L& [5] GREEK SUBSCRIPT SMALL LETTER BETA..GREEK SUBSCRIPT SMALL LETTER CHI 1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u03D7-\\u03EF" // \N{GREEK KAI SYMBOL}..\N{COPTIC SMALL LETTER DEI} 1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "] & [:Age=4.0:]]", 1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //UnicodeString("[[\\u003B\\u00B7[:Greek:]-[\\u0374\\u0385\\u1fce\\u1fde\\u03D7-\\u03EF]]&[:Age=3.2:]]", 1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ""), 1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u00B5\\u037A\\u03D0-\\uFFFF {\\u039C\\u03C0}]", /* exclusions */ 1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this, quick, legal); 1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete legal; 1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorRoundTripTest::TestArabic() { 1204c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 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); 1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Legal *legal = new Legal(); 1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RTTest test("Latin-Arabic"); 1207c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru test.test(UNICODE_STRING_SIMPLE("[a-zA-Z\\u02BE\\u02BF\\u207F]"), ARABIC, "[a-zA-Z\\u02BE\\u02BF\\u207F]",this, quick, legal); // 1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete legal; 1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass LegalHebrew : public Legal { 1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprivate: 1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSet FINAL; 1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSet NON_FINAL; 1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSet LETTER; 1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LegalHebrew(UErrorCode& error); 1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual ~LegalHebrew() {} 1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UBool is(const UnicodeString& sourceString) const; 1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLegalHebrew::LegalHebrew(UErrorCode& error){ 1222c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru FINAL.applyPattern(UNICODE_STRING_SIMPLE("[\\u05DA\\u05DD\\u05DF\\u05E3\\u05E5]"), error); 1223c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru NON_FINAL.applyPattern(UNICODE_STRING_SIMPLE("[\\u05DB\\u05DE\\u05E0\\u05E4\\u05E6]"), error); 1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LETTER.applyPattern("[:letter:]", error); 1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool LegalHebrew::is(const UnicodeString& sourceString)const{ 1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (sourceString.length() == 0) return TRUE; 1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // don't worry about surrogates. 1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int i = 0; i < sourceString.length(); ++i) { 1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar ch = sourceString.charAt(i); 1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar next = i+1 == sourceString.length() ? 0x0000 : sourceString.charAt(i); 1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (FINAL.contains(ch)) { 1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (LETTER.contains(next)) return FALSE; 1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (NON_FINAL.contains(ch)) { 1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!LETTER.contains(next)) return FALSE; 1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorRoundTripTest::TestHebrew() { 124259d709d503bab6e2b61931737e662dd293b40578ccornelius logKnownIssue( "cldrbug:1911"); 1243b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // It is left in its current state as a regression test. 124459d709d503bab6e2b61931737e662dd293b40578ccornelius 1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //long start = System.currentTimeMillis(); 1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode error = U_ZERO_ERROR; 1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LegalHebrew* legal = new LegalHebrew(error); 1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(error)){ 12496d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("Could not construct LegalHebrew object. Error: %s", u_errorName(error)); 1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RTTest test("Latin-Hebrew"); 1253c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 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); 1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //showElapsed(start, "TestHebrew"); 1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete legal; 1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorRoundTripTest::TestCyrillic() { 1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RTTest test("Latin-Cyrillic"); 1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Legal *legal = new Legal(); 1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test.test(UnicodeString("[a-zA-Z\\u0110\\u0111\\u02BA\\u02B9]", ""), 1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString("[[\\u0400-\\u045F] & [:Age=3.2:]]", ""), NULL, this, quick, 1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru legal); 1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete legal; 1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Inter-Indic Tests ---------------------------------- 1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass LegalIndic :public Legal{ 1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSet vowelSignSet; 1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSet avagraha; 1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSet nukta; 1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSet virama; 1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSet sanskritStressSigns; 1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSet chandrabindu; 1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LegalIndic(); 1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UBool is(const UnicodeString& sourceString) const; 1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual ~LegalIndic() {}; 1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool LegalIndic::is(const UnicodeString& sourceString) const{ 1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int cp=sourceString.charAt(0); 1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // A vowel sign cannot be the first char 1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(vowelSignSet.contains(cp)){ 1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else if(avagraha.contains(cp)){ 1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else if(virama.contains(cp)){ 1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else if(nukta.contains(cp)){ 1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else if(sanskritStressSigns.contains(cp)){ 1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else if(chandrabindu.contains(cp) && 1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ((sourceString.length()>1) && 1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru vowelSignSet.contains(sourceString.charAt(1)))){ 1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLegalIndic::LegalIndic(){ 1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru vowelSignSet.addAll( UnicodeSet("[\\u0902\\u0903\\u0904\\u093e-\\u094c\\u0962\\u0963]",status));/* Devanagari */ 1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru vowelSignSet.addAll( UnicodeSet("[\\u0982\\u0983\\u09be-\\u09cc\\u09e2\\u09e3\\u09D7]",status));/* Bengali */ 1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru vowelSignSet.addAll( UnicodeSet("[\\u0a02\\u0a03\\u0a3e-\\u0a4c\\u0a62\\u0a63\\u0a70\\u0a71]",status));/* Gurmukhi */ 1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru vowelSignSet.addAll( UnicodeSet("[\\u0a82\\u0a83\\u0abe-\\u0acc\\u0ae2\\u0ae3]",status));/* Gujarati */ 1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru vowelSignSet.addAll( UnicodeSet("[\\u0b02\\u0b03\\u0b3e-\\u0b4c\\u0b62\\u0b63\\u0b56\\u0b57]",status));/* Oriya */ 1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru vowelSignSet.addAll( UnicodeSet("[\\u0b82\\u0b83\\u0bbe-\\u0bcc\\u0be2\\u0be3\\u0bd7]",status));/* Tamil */ 1313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru vowelSignSet.addAll( UnicodeSet("[\\u0c02\\u0c03\\u0c3e-\\u0c4c\\u0c62\\u0c63\\u0c55\\u0c56]",status));/* Telugu */ 1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru vowelSignSet.addAll( UnicodeSet("[\\u0c82\\u0c83\\u0cbe-\\u0ccc\\u0ce2\\u0ce3\\u0cd5\\u0cd6]",status));/* Kannada */ 1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru vowelSignSet.addAll( UnicodeSet("[\\u0d02\\u0d03\\u0d3e-\\u0d4c\\u0d62\\u0d63\\u0d57]",status));/* Malayalam */ 1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru avagraha.addAll(UnicodeSet("[\\u093d\\u09bd\\u0abd\\u0b3d\\u0cbd]",status)); 1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nukta.addAll(UnicodeSet("[\\u093c\\u09bc\\u0a3c\\u0abc\\u0b3c\\u0cbc]",status)); 1319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virama.addAll(UnicodeSet("[\\u094d\\u09cd\\u0a4d\\u0acd\\u0b4d\\u0bcd\\u0c4d\\u0ccd\\u0d4d]",status)); 1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sanskritStressSigns.addAll(UnicodeSet("[\\u0951\\u0952\\u0953\\u0954\\u097d]",status)); 1321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru chandrabindu.addAll(UnicodeSet("[\\u0901\\u0981\\u0A81\\u0b01\\u0c01]",status)); 1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char latinForIndic[] = "[['.0-9A-Za-z~\\u00C0-\\u00C5\\u00C7-\\u00CF\\u00D1-\\u00D6\\u00D9-\\u00DD" 1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u00E0-\\u00E5\\u00E7-\\u00EF\\u00F1-\\u00F6\\u00F9-\\u00FD\\u00FF-\\u010F" 1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0112-\\u0125\\u0128-\\u0130\\u0134-\\u0137\\u0139-\\u013E\\u0143-\\u0148" 1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u014C-\\u0151\\u0154-\\u0165\\u0168-\\u017E\\u01A0-\\u01A1\\u01AF-\\u01B0" 1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u01CD-\\u01DC\\u01DE-\\u01E3\\u01E6-\\u01ED\\u01F0\\u01F4-\\u01F5\\u01F8-\\u01FB" 1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0200-\\u021B\\u021E-\\u021F\\u0226-\\u0233\\u0294\\u0303-\\u0304\\u0306\\u0314-\\u0315" 1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0325\\u040E\\u0419\\u0439\\u045E\\u04C1-\\u04C2\\u04D0-\\u04D1\\u04D6-\\u04D7" 1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u04E2-\\u04E3\\u04EE-\\u04EF\\u1E00-\\u1E99\\u1EA0-\\u1EF9\\u1F01\\u1F03\\u1F05" 1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1F07\\u1F09\\u1F0B\\u1F0D\\u1F0F\\u1F11\\u1F13\\u1F15\\u1F19\\u1F1B\\u1F1D\\u1F21" 1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1F23\\u1F25\\u1F27\\u1F29\\u1F2B\\u1F2D\\u1F2F\\u1F31\\u1F33\\u1F35\\u1F37\\u1F39" 1335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1F3B\\u1F3D\\u1F3F\\u1F41\\u1F43\\u1F45\\u1F49\\u1F4B\\u1F4D\\u1F51\\u1F53\\u1F55" 1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F\\u1F61\\u1F63\\u1F65\\u1F67\\u1F69\\u1F6B\\u1F6D" 1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1F6F\\u1F81\\u1F83\\u1F85\\u1F87\\u1F89\\u1F8B\\u1F8D\\u1F8F\\u1F91\\u1F93\\u1F95" 1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1F97\\u1F99\\u1F9B\\u1F9D\\u1F9F\\u1FA1\\u1FA3\\u1FA5\\u1FA7\\u1FA9\\u1FAB\\u1FAD" 1339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1FAF-\\u1FB1\\u1FB8-\\u1FB9\\u1FD0-\\u1FD1\\u1FD8-\\u1FD9\\u1FE0-\\u1FE1\\u1FE5" 1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1FE8-\\u1FE9\\u1FEC\\u212A-\\u212B\\uE04D\\uE064]" 1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "-[\\uE000-\\uE080 \\u01E2\\u01E3]& [[:latin:][:mark:]]]"; 1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorRoundTripTest::TestDevanagariLatin() { 1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 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)); 1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if((Transliterator *)t1 != NULL){ 1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TransliteratorPointer t2(t1->createInverse(status)); 1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)){ 1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: could not create the Inverse:-( \n"); 1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else { 13546d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("FAIL: could not create the transliterator. Error: %s\n", u_errorName(status)); 1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RTTest test("Latin-Devanagari"); 1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Legal *legal = new LegalIndic(); 136059d709d503bab6e2b61931737e662dd293b40578ccornelius logKnownIssue( "cldrbug:1911"); 1361b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // It is left in its current state as a regression test. 136259d709d503bab6e2b61931737e662dd293b40578ccornelius 1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test.test(UnicodeString(latinForIndic, ""), 136483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius UnicodeString("[[[:Devanagari:][\\u094d][\\u0964\\u0965]]&[:Age=4.1:]-[\\u0970]]", ""), "[\\u0965\\u0904]", this, quick, 1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru legal, 50); 1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete legal; 1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Defined this way for HP/UX11CC :-( */ 1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const int32_t INTER_INDIC_ARRAY_WIDTH = 4; 1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char * const interIndicArray[] = { 1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 137483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius "BENGALI-DEVANAGARI", "[:BENGALI:]", "[[:Devanagari:]-[\\u0970]]", 1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\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*/ 1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 137783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius "DEVANAGARI-BENGALI", "[[:Devanagari:]-[\\u0970]]", "[:BENGALI:]", 1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\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*/ 1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 138083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius "GURMUKHI-DEVANAGARI", "[:GURMUKHI:]", "[[:Devanagari:]-[\\u0970]]", 1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\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*/ 1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 138383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius "DEVANAGARI-GURMUKHI", "[[:Devanagari:]-[\\u0970]]", "[:GURMUKHI:]", 1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\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*/ 1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 138683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius "GUJARATI-DEVANAGARI", "[:GUJARATI:]", "[[:Devanagari:]-[\\u0970]]", 1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0946\\u094A\\u0962\\u0963\\u0951-\\u0954\\u0961\\u090c\\u090e\\u0912\\u097d]", /*roundtrip exclusions*/ 1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 138983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius "DEVANAGARI-GUJARATI", "[[:Devanagari:]-[\\u0970]]", "[:GUJARATI:]", 1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0951-\\u0954\\u0961\\u090c\\u090e\\u0912]", /*roundtrip exclusions*/ 1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 139283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius "ORIYA-DEVANAGARI", "[:ORIYA:]", "[[:Devanagari:]-[\\u0970]]", 1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0904\\u0943-\\u094a\\u0962\\u0963\\u0951-\\u0954\\u0950\\u090D\\u090e\\u0912\\u0911\\u0931\\u0935\\u097d]", /*roundtrip exclusions*/ 1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 139583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius "DEVANAGARI-ORIYA", "[[:Devanagari:]-[\\u0970]]", "[:ORIYA:]", 1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0b5f\\u0b56\\u0b57\\u0b70\\u0b71\\u0950\\u090D\\u090e\\u0912\\u0911\\u0931]", /*roundtrip exclusions*/ 1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 139883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius "Tamil-DEVANAGARI", "[:tamil:]", "[[:Devanagari:]-[\\u0970]]", 1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\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*/ 1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 140183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius "DEVANAGARI-Tamil", "[[:Devanagari:]-[\\u0970]]", "[:tamil:]", 1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0bd7\\u0BF0\\u0BF1\\u0BF2]", /*roundtrip exclusions*/ 1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 140483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius "Telugu-DEVANAGARI", "[:telugu:]", "[[:Devanagari:]-[\\u0970]]", 1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0904\\u093c\\u0950\\u0945\\u0949\\u0951-\\u0954\\u0962\\u0963\\u090D\\u0911\\u093d\\u0929\\u0934[\\u0958-\\u095f]\\u097d]", /*roundtrip exclusions*/ 1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 140783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius "DEVANAGARI-TELUGU", "[[:Devanagari:]-[\\u0970]]", "[:TELUGU:]", 1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0c55\\u0c56\\u0950\\u090D\\u0911\\u093d\\u0929\\u0934[\\u0958-\\u095f]]", /*roundtrip exclusions*/ 1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 141083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius "KANNADA-DEVANAGARI", "[:KANNADA:]", "[[:Devanagari:]-[\\u0970]]", 1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0901\\u0904\\u0946\\u093c\\u0950\\u0945\\u0949\\u0951-\\u0954\\u0962\\u0963\\u0950\\u090D\\u0911\\u093d\\u0929\\u0934[\\u0958-\\u095f]\\u097d]", /*roundtrip exclusions*/ 1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 141383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius "DEVANAGARI-KANNADA", "[[:Devanagari:]-[\\u0970]]", "[:KANNADA:]", 1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[{\\u0cb0\\u0cbc}{\\u0cb3\\u0cbc}\\u0cde\\u0cd5\\u0cd6\\u0950\\u090D\\u0911\\u093d\\u0929\\u0934[\\u0958-\\u095f]]", /*roundtrip exclusions*/ 1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 141683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius "MALAYALAM-DEVANAGARI", "[:MALAYALAM:]", "[[:Devanagari:]-[\\u0970]]", 1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0901\\u0904\\u094a\\u094b\\u094c\\u093c\\u0950\\u0944\\u0945\\u0949\\u0951-\\u0954\\u0962\\u0963\\u090D\\u0911\\u093d\\u0929\\u0934[\\u0958-\\u095f]\\u097d]", /*roundtrip exclusions*/ 1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 141983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius "DEVANAGARI-MALAYALAM", "[[:Devanagari:]-[\\u0970]]", "[:MALAYALAM:]", 1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0d4c\\u0d57\\u0950\\u090D\\u0911\\u093d\\u0929\\u0934[\\u0958-\\u095f]]", /*roundtrip exclusions*/ 1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "GURMUKHI-BENGALI", "[:GURMUKHI:]", "[:BENGALI:]", 1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0981\\u0982\\u09b6\\u09e2\\u09e3\\u09c3\\u09c4\\u09d7\\u098B\\u098C\\u09B7\\u09E0\\u09E1\\u09F0\\u09F1\\u09f2-\\u09fa\\u09ce]", /*roundtrip exclusions*/ 1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "BENGALI-GURMUKHI", "[:BENGALI:]", "[:GURMUKHI:]", 1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0A02\\u0a5c\\u0a47\\u0a70\\u0a71\\u0A33\\u0A35\\u0A59\\u0A5A\\u0A5B\\u0A5E\\u0A72\\u0A73\\u0A74]", /*roundtrip exclusions*/ 1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "GUJARATI-BENGALI", "[:GUJARATI:]", "[:BENGALI:]", 1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u09d7\\u09e2\\u09e3\\u098c\\u09e1\\u09f0\\u09f1\\u09f2-\\u09fa\\u09ce]", /*roundtrip exclusions*/ 1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "BENGALI-GUJARATI", "[:BENGALI:]", "[:GUJARATI:]", 1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0A82\\u0a83\\u0Ac9\\u0Ac5\\u0ac7\\u0A8D\\u0A91\\u0AB3\\u0AB5\\u0ABD\\u0AD0]", /*roundtrip exclusions*/ 1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ORIYA-BENGALI", "[:ORIYA:]", "[:BENGALI:]", 1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u09c4\\u09e2\\u09e3\\u09f0\\u09f1\\u09f2-\\u09fa\\u09ce]", /*roundtrip exclusions*/ 1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "BENGALI-ORIYA", "[:BENGALI:]", "[:ORIYA:]", 1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0b35\\u0b71\\u0b5f\\u0b56\\u0b33\\u0b3d]", /*roundtrip exclusions*/ 1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Tamil-BENGALI", "[:tamil:]", "[:BENGALI:]", 1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\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*/ 1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "BENGALI-Tamil", "[:BENGALI:]", "[:tamil:]", 1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0bc6\\u0bc7\\u0bca\\u0B8E\\u0B92\\u0BA9\\u0BB1\\u0BB3\\u0BB4\\u0BB5\\u0BF0\\u0BF1\\u0BF2]", /*roundtrip exclusions*/ 1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Telugu-BENGALI", "[:telugu:]", "[:BENGALI:]", 1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u09e2\\u09e3\\u09bc\\u09d7\\u09f0\\u09f1\\u09dc\\u09dd\\u09df\\u09f2-\\u09fa\\u09ce]", /*roundtrip exclusions*/ 1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "BENGALI-TELUGU", "[:BENGALI:]", "[:TELUGU:]", 1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0c55\\u0c56\\u0c47\\u0c46\\u0c4a\\u0C0E\\u0C12\\u0C31\\u0C33\\u0C35]", /*roundtrip exclusions*/ 1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "KANNADA-BENGALI", "[:KANNADA:]", "[:BENGALI:]", 1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0981\\u09e2\\u09e3\\u09bc\\u09d7\\u09dc\\u09dd\\u09df\\u09f0\\u09f1\\u09f2-\\u09fa\\u09ce]", /*roundtrip exclusions*/ 1454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "BENGALI-KANNADA", "[:BENGALI:]", "[:KANNADA:]", 1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[{\\u0cb0\\u0cbc}{\\u0cb3\\u0cbc}\\u0cc6\\u0cca\\u0cd5\\u0cd6\\u0cc7\\u0C8E\\u0C92\\u0CB1\\u0cb3\\u0cb5\\u0cde]", /*roundtrip exclusions*/ 1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "MALAYALAM-BENGALI", "[:MALAYALAM:]", "[:BENGALI:]", 1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0981\\u09e2\\u09e3\\u09bc\\u09c4\\u09f0\\u09f1\\u09dc\\u09dd\\u09df\\u09dc\\u09dd\\u09df\\u09f2-\\u09fa\\u09ce]", /*roundtrip exclusions*/ 1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "BENGALI-MALAYALAM", "[:BENGALI:]", "[:MALAYALAM:]", 1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0d46\\u0d4a\\u0d47\\u0d31-\\u0d35\\u0d0e\\u0d12]", /*roundtrip exclusions*/ 1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "GUJARATI-GURMUKHI", "[:GUJARATI:]", "[:GURMUKHI:]", 1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0A02\\u0ab3\\u0ab6\\u0A70\\u0a71\\u0a82\\u0a83\\u0ac3\\u0ac4\\u0ac5\\u0ac9\\u0a5c\\u0a72\\u0a73\\u0a74\\u0a8b\\u0a8d\\u0a91\\u0abd]", /*roundtrip exclusions*/ 1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "GURMUKHI-GUJARATI", "[:GURMUKHI:]", "[:GUJARATI:]", 1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\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*/ 1469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ORIYA-GURMUKHI", "[:ORIYA:]", "[:GURMUKHI:]", 1471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\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*/ 1472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "GURMUKHI-ORIYA", "[:GURMUKHI:]", "[:ORIYA:]", 1474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0b01\\u0b02\\u0b03\\u0b33\\u0b36\\u0b43\\u0b56\\u0b57\\u0B0B\\u0B0C\\u0B37\\u0B3D\\u0B5F\\u0B60\\u0B61\\u0b70\\u0b71]", /*roundtrip exclusions*/ 1475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "TAMIL-GURMUKHI", "[:TAMIL:]", "[:GURMUKHI:]", 1477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\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*/ 1478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "GURMUKHI-TAMIL", "[:GURMUKHI:]", "[:TAMIL:]", 1480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0b82\\u0bc6\\u0bca\\u0bd7\\u0bb7\\u0bb3\\u0b83\\u0B8E\\u0B92\\u0BA9\\u0BB1\\u0BB4\\u0bb6\\u0BF0\\u0BF1\\u0BF2]", /*roundtrip exclusions*/ 1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "TELUGU-GURMUKHI", "[:TELUGU:]", "[:GURMUKHI:]", 1483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0A02\\u0a33\\u0a36\\u0a3c\\u0a70\\u0a71\\u0A59\\u0A5A\\u0A5B\\u0A5C\\u0A5E\\u0A72\\u0A73\\u0A74]", /*roundtrip exclusions*/ 1484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "GURMUKHI-TELUGU", "[:GURMUKHI:]", "[:TELUGU:]", 1486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0c01\\u0c02\\u0c03\\u0c33\\u0c36\\u0c44\\u0c43\\u0c46\\u0c4a\\u0c56\\u0c55\\u0C0B\\u0C0C\\u0C0E\\u0C12\\u0C31\\u0C37\\u0C60\\u0C61]", /*roundtrip exclusions*/ 1487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "KANNADA-GURMUKHI", "[:KANNADA:]", "[:GURMUKHI:]", 1489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0A01\\u0A02\\u0a33\\u0a36\\u0a3c\\u0a70\\u0a71\\u0A59\\u0A5A\\u0A5B\\u0A5C\\u0A5E\\u0A72\\u0A73\\u0A74]", /*roundtrip exclusions*/ 1490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "GURMUKHI-KANNADA", "[:GURMUKHI:]", "[:KANNADA:]", 1492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[{\\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*/ 1493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "MALAYALAM-GURMUKHI", "[:MALAYALAM:]", "[:GURMUKHI:]", 1495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0A01\\u0A02\\u0a4b\\u0a4c\\u0a33\\u0a36\\u0a3c\\u0a70\\u0a71\\u0A59\\u0A5A\\u0A5B\\u0A5C\\u0A5E\\u0A72\\u0A73\\u0A74]", /*roundtrip exclusions*/ 1496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "GURMUKHI-MALAYALAM", "[:GURMUKHI:]", "[:MALAYALAM:]", 1498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0d02\\u0d03\\u0d33\\u0d36\\u0d43\\u0d46\\u0d4a\\u0d4c\\u0d57\\u0D0B\\u0D0C\\u0D0E\\u0D12\\u0D31\\u0D34\\u0D37\\u0D60\\u0D61]", /*roundtrip exclusions*/ 1499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "GUJARATI-ORIYA", "[:GUJARATI:]", "[:ORIYA:]", 1501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0b56\\u0b57\\u0B0C\\u0B5F\\u0B61\\u0b70\\u0b71]", /*roundtrip exclusions*/ 1502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ORIYA-GUJARATI", "[:ORIYA:]", "[:GUJARATI:]", 1504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0Ac4\\u0Ac5\\u0Ac9\\u0Ac7\\u0A8D\\u0A91\\u0AB5\\u0Ad0]", /*roundtrip exclusions*/ 1505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "TAMIL-GUJARATI", "[:TAMIL:]", "[:GUJARATI:]", 1507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\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*/ 1508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "GUJARATI-TAMIL", "[:GUJARATI:]", "[:TAMIL:]", 1510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0Bc6\\u0Bca\\u0Bd7\\u0B8E\\u0B92\\u0BA9\\u0BB1\\u0BB4\\u0BF0\\u0BF1\\u0BF2]", /*roundtrip exclusions*/ 1511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "TELUGU-GUJARATI", "[:TELUGU:]", "[:GUJARATI:]", 1513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0abc\\u0Ac5\\u0Ac9\\u0A8D\\u0A91\\u0ABD\\u0Ad0]", /*roundtrip exclusions*/ 1514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "GUJARATI-TELUGU", "[:GUJARATI:]", "[:TELUGU:]", 1516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0c46\\u0c4a\\u0c55\\u0c56\\u0C0C\\u0C0E\\u0C12\\u0C31\\u0C61]", /*roundtrip exclusions*/ 1517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "KANNADA-GUJARATI", "[:KANNADA:]", "[:GUJARATI:]", 1519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0A81\\u0abc\\u0Ac5\\u0Ac9\\u0A8D\\u0A91\\u0ABD\\u0Ad0]", /*roundtrip exclusions*/ 1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "GUJARATI-KANNADA", "[:GUJARATI:]", "[:KANNADA:]", 1522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[{\\u0cb0\\u0cbc}{\\u0cb3\\u0cbc}\\u0cc6\\u0cca\\u0cd5\\u0cd6\\u0C8C\\u0C8E\\u0C92\\u0CB1\\u0CDE\\u0CE1]", /*roundtrip exclusions*/ 1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "MALAYALAM-GUJARATI", "[:MALAYALAM:]", "[:GUJARATI:]", 1525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0A81\\u0ac4\\u0acb\\u0acc\\u0abc\\u0Ac5\\u0Ac9\\u0A8D\\u0A91\\u0ABD\\u0Ad0]", /*roundtrip exclusions*/ 1526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "GUJARATI-MALAYALAM", "[:GUJARATI:]", "[:MALAYALAM:]", 1528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0d46\\u0d4a\\u0d4c\\u0d55\\u0d57\\u0D0C\\u0D0E\\u0D12\\u0D31\\u0D34\\u0D61]", /*roundtrip exclusions*/ 1529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "TAMIL-ORIYA", "[:TAMIL:]", "[:ORIYA:]", 1531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\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*/ 1532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ORIYA-TAMIL", "[:ORIYA:]", "[:TAMIL:]", 1534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0bc6\\u0bca\\u0bc7\\u0B8E\\u0B92\\u0BA9\\u0BB1\\u0BB4\\u0BB5\\u0BF0\\u0BF1\\u0BF2]", /*roundtrip exclusions*/ 1535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "TELUGU-ORIYA", "[:TELUGU:]", "[:ORIYA:]", 1537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0b3c\\u0b57\\u0b56\\u0B3D\\u0B5C\\u0B5D\\u0B5F\\u0b70\\u0b71]", /*roundtrip exclusions*/ 1538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ORIYA-TELUGU", "[:ORIYA:]", "[:TELUGU:]", 1540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0c44\\u0c46\\u0c4a\\u0c55\\u0c47\\u0C0E\\u0C12\\u0C31\\u0C35]", /*roundtrip exclusions*/ 1541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "KANNADA-ORIYA", "[:KANNADA:]", "[:ORIYA:]", 1543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0B01\\u0b3c\\u0b57\\u0B3D\\u0B5C\\u0B5D\\u0B5F\\u0b70\\u0b71]", /*roundtrip exclusions*/ 1544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ORIYA-KANNADA", "[:ORIYA:]", "[:KANNADA:]", 1546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[{\\u0cb0\\u0cbc}{\\u0cb3\\u0cbc}\\u0cc4\\u0cc6\\u0cca\\u0cd5\\u0cc7\\u0C8E\\u0C92\\u0CB1\\u0CB5\\u0CDE]", /*roundtrip exclusions*/ 1547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "MALAYALAM-ORIYA", "[:MALAYALAM:]", "[:ORIYA:]", 1549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0B01\\u0b3c\\u0b56\\u0B3D\\u0B5C\\u0B5D\\u0B5F\\u0b70\\u0b71]", /*roundtrip exclusions*/ 1550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ORIYA-MALAYALAM", "[:ORIYA:]", "[:MALAYALAM:]", 1552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0D47\\u0D46\\u0D4a\\u0D0E\\u0D12\\u0D31\\u0D34\\u0D35]", /*roundtrip exclusions*/ 1553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "TELUGU-TAMIL", "[:TELUGU:]", "[:TAMIL:]", 1555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0bd7\\u0ba9\\u0bb4\\u0BF0\\u0BF1\\u0BF2]", /*roundtrip exclusions*/ 1556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "TAMIL-TELUGU", "[:TAMIL:]", "[:TELUGU:]", 1558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\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*/ 1559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "KANNADA-TAMIL", "[:KANNADA:]", "[:TAMIL:]", 1561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0bd7\\u0bc6\\u0ba9\\u0bb4\\u0BF0\\u0BF1\\u0BF2]", /*roundtrip exclusions*/ 1562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "TAMIL-KANNADA", "[:TAMIL:]", "[:KANNADA:]", 1564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\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*/ 1565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "MALAYALAM-TAMIL", "[:MALAYALAM:]", "[:TAMIL:]", 1567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0ba9\\u0BF0\\u0BF1\\u0BF2]", /*roundtrip exclusions*/ 1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "TAMIL-MALAYALAM", "[:TAMIL:]", "[:MALAYALAM:]", 1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0d43\\u0d12\\u0D0B\\u0D0C\\u0D16\\u0D17\\u0D18\\u0D1B\\u0D1D\\u0D20\\u0D21\\u0D22\\u0D25\\u0D26\\u0D27\\u0D2B\\u0D2C\\u0D2D\\u0D36\\u0D60\\u0D61]", /*roundtrip exclusions*/ 1571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "KANNADA-TELUGU", "[:KANNADA:]", "[:TELUGU:]", 1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0C01\\u0c3f\\u0c46\\u0c48\\u0c4a]", /*roundtrip exclusions*/ 1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "TELUGU-KANNADA", "[:TELUGU:]", "[:KANNADA:]", 1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0cc8\\u0cd5\\u0cd6\\u0cbc\\u0cbd\\u0CDE]", /*roundtrip exclusions*/ 1577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "MALAYALAM-TELUGU", "[:MALAYALAM:]", "[:TELUGU:]", 1579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0C01\\u0c44\\u0c4a\\u0c4c\\u0c4b\\u0c55\\u0c56]", /*roundtrip exclusions*/ 1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "TELUGU-MALAYALAM", "[:TELUGU:]", "[:MALAYALAM:]", 1582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0d4c\\u0d57\\u0D34]", /*roundtrip exclusions*/ 1583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "MALAYALAM-KANNADA", "[:MALAYALAM:]", "[:KANNADA:]", 1585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0cbc\\u0cbd\\u0cc4\\u0cc6\\u0cca\\u0ccc\\u0ccb\\u0cd5\\u0cd6\\u0cDe]", /*roundtrip exclusions*/ 1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "KANNADA-MALAYALAM", "[:KANNADA:]", "[:MALAYALAM:]", 1588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0d4c\\u0d57\\u0d46\\u0D34]", /*roundtrip exclusions*/ 1589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Latin-Bengali",latinForIndic, "[[:Bengali:][\\u0964\\u0965]]", 1591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0965\\u09f0-\\u09fa\\u09ce]" /*roundtrip exclusions*/ , 1592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Latin-Gurmukhi", latinForIndic, "[[:Gurmukhi:][\\u0964\\u0965]]", 1594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0a01\\u0965\\u0a02\\u0a72\\u0a73\\u0a74]" /*roundtrip exclusions*/, 1595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Latin-Gujarati",latinForIndic, "[[:Gujarati:][\\u0964\\u0965]]", 1597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0965]" /*roundtrip exclusions*/, 1598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Latin-Oriya",latinForIndic, "[[:Oriya:][\\u0964\\u0965]]", 1600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0965\\u0b70]" /*roundtrip exclusions*/, 1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Latin-Tamil",latinForIndic, "[:Tamil:]", 1603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u0BF0\\u0BF1\\u0BF2]" /*roundtrip exclusions*/, 1604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Latin-Telugu",latinForIndic, "[:Telugu:]", 1606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL /*roundtrip exclusions*/, 1607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Latin-Kannada",latinForIndic, "[:Kannada:]", 1609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL /*roundtrip exclusions*/, 1610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Latin-Malayalam",latinForIndic, "[:Malayalam:]", 1612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL /*roundtrip exclusions*/ 1613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 1614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorRoundTripTest::TestDebug(const char* name,const char fromSet[], 1616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* toSet,const char* exclusions){ 1617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RTTest test(name); 1619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Legal *legal = new LegalIndic(); 1620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test.test(UnicodeString(fromSet,""),UnicodeString(toSet,""),exclusions,this,quick,legal); 1621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorRoundTripTest::TestInterIndic() { 1624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //TestDebug("Latin-Gurmukhi", latinForIndic, "[:Gurmukhi:]","[\\u0965\\u0a02\\u0a72\\u0a73\\u0a74]",TRUE); 16258de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert int32_t num = UPRV_LENGTHOF(interIndicArray)/INTER_INDIC_ARRAY_WIDTH; 1626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(quick){ 1627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Testing only 5 of %i. Skipping rest (use -e for exhaustive)",num); 1628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru num = 5; 1629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(int i = 0; i < num;i++){ 1631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RTTest test(interIndicArray[i*INTER_INDIC_ARRAY_WIDTH + 0]); 1632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Legal *legal = new LegalIndic(); 1633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(UnicodeString("Stress testing ") + interIndicArray[i*INTER_INDIC_ARRAY_WIDTH + 0]); 163459d709d503bab6e2b61931737e662dd293b40578ccornelius if( !logKnownIssue( "cldrbug:1911" ) ) { 163559d709d503bab6e2b61931737e662dd293b40578ccornelius /* "full test" */ 163659d709d503bab6e2b61931737e662dd293b40578ccornelius // CLDR bug #1911: This test should be moved into CLDR. 1637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test.test( interIndicArray[i*INTER_INDIC_ARRAY_WIDTH + 1], 1638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru interIndicArray[i*INTER_INDIC_ARRAY_WIDTH + 2], 1639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru interIndicArray[i*INTER_INDIC_ARRAY_WIDTH + 3], // roundtrip exclusions 1640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this, quick, legal, 50); 164159d709d503bab6e2b61931737e662dd293b40578ccornelius } else { 164259d709d503bab6e2b61931737e662dd293b40578ccornelius // It is left in its current state as a regression test. 164359d709d503bab6e2b61931737e662dd293b40578ccornelius // CLDR should test, and remove the age filter. 164459d709d503bab6e2b61931737e662dd293b40578ccornelius /* regression test - ""temporary"" until CLDR#1911 is fixed */ 1645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // start 1646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString source("["); 1647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru source.append(interIndicArray[i*INTER_INDIC_ARRAY_WIDTH + 1]); 1648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru source.append(" & [:Age=4.1:]]"); 1649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString target("["); 1650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target.append(interIndicArray[i*INTER_INDIC_ARRAY_WIDTH + 2]); 1651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target.append(" & [:Age=4.1:]]"); 165259d709d503bab6e2b61931737e662dd293b40578ccornelius test.test( source, 165359d709d503bab6e2b61931737e662dd293b40578ccornelius target, 1654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru interIndicArray[i*INTER_INDIC_ARRAY_WIDTH + 3], // roundtrip exclusions 1655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this, quick, legal, 50); 1656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // end 1657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete legal; 165859d709d503bab6e2b61931737e662dd293b40578ccornelius } 1659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// end indic tests ---------------------------------------------------------- 1663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_TRANSLITERATION */ 1665