1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru********************************************************************** 3fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* Copyright (C) 1999-2014, International Business Machines 4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Corporation and others. All Rights Reserved. 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru********************************************************************** 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Date Name Description 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 11/10/99 aliu Creation. 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru********************************************************************** 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h" 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_TRANSLITERATION 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "transtst.h" 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/locid.h" 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/dtfmtsym.h" 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/normlzr.h" 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/translit.h" 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uchar.h" 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/unifilt.h" 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uniset.h" 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h" 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/usetiter.h" 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uscript.h" 2683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#include "unicode/utf16.h" 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cpdtrans.h" 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "nultrans.h" 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "rbt.h" 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "rbt_pars.h" 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "anytrans.h" 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "esctrn.h" 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "name2uni.h" 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "nortrans.h" 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "remtrans.h" 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "titletrn.h" 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "tolowtrn.h" 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "toupptrn.h" 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unesctrn.h" 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uni2name.h" 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h" 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h" 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdio.h> 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*********************************************************************** 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru HOW TO USE THIS TEST FILE 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru -or- 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru How I developed on two platforms 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru without losing (too much of) my mind 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru1. Add new tests by copying/pasting/changing existing tests. On Java, 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru any public void method named Test...() taking no parameters becomes 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru a test. On C++, you need to modify the header and add a line to 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru the runIndexedTest() dispatch method. 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru2. Make liberal use of the expect() method; it is your friend. 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru3. The tests in this file exactly match those in a sister file on the 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru other side. The two files are: 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru icu4j: src/com/ibm/test/translit/TransliteratorTest.java 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru icu4c: source/test/intltest/transtst.cpp 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ==> THIS IS THE IMPORTANT PART <== 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru When you add a test in this file, add it in TransliteratorTest.java 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru too. Give it the same name and put it in the same relative place. 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru This makes maintenance a lot simpler for any poor soul who ends up 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru trying to synchronize the tests between icu4j and icu4c. 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru4. If you MUST enter a test that is NOT paralleled in the sister file, 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru then add it in the special non-mirrored section. These are 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru labeled 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "icu4j ONLY" 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru or 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "icu4c ONLY" 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Make sure you document the reason the test is here and not there. 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruThank you. 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruThe Management 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru***********************************************************************/ 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Define character constants thusly to be EBCDIC-friendly 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruenum { 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LEFT_BRACE=((UChar)0x007B), /*{*/ 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru PIPE =((UChar)0x007C), /*|*/ 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ZERO =((UChar)0x0030), /*0*/ 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UPPER_A =((UChar)0x0041) /*A*/ 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTransliteratorTest::TransliteratorTest() 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru: DESERET_DEE((UChar32)0x10414), 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DESERET_dee((UChar32)0x1043C) 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTransliteratorTest::~TransliteratorTest() {} 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTransliteratorTest::runIndexedTest(int32_t index, UBool exec, 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* &name, char* /*par*/) { 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (index) { 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(0,TestInstantiation); 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(1,TestSimpleRules); 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(2,TestRuleBasedInverse); 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(3,TestKeyboard); 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(4,TestKeyboard2); 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(5,TestKeyboard3); 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(6,TestArabic); 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(7,TestCompoundKana); 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(8,TestCompoundHex); 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(9,TestFiltering); 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(10,TestInlineSet); 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(11,TestPatternQuoting); 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(12,TestJ277); 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(13,TestJ243); 124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(14,TestJ329); 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(15,TestSegments); 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(16,TestCursorOffset); 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(17,TestArbitraryVariableValues); 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(18,TestPositionHandling); 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(19,TestHiraganaKatakana); 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(20,TestCopyJ476); 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(21,TestAnchors); 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(22,TestInterIndic); 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(23,TestFilterIDs); 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(24,TestCaseMap); 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(25,TestNameMap); 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(26,TestLiberalizedID); 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(27,TestCreateInstance); 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(28,TestNormalizationTransliterator); 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(29,TestCompoundRBT); 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(30,TestCompoundFilter); 141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(31,TestRemove); 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(32,TestToRules); 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(33,TestContext); 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(34,TestSupplemental); 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(35,TestQuantifier); 146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(36,TestSTV); 147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(37,TestCompoundInverse); 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(38,TestNFDChainRBT); 149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(39,TestNullInverse); 150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(40,TestAliasInverseID); 151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(41,TestCompoundInverseID); 152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(42,TestUndefinedVariable); 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(43,TestEmptyContext); 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(44,TestCompoundFilterID); 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(45,TestPropertySet); 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(46,TestNewEngine); 157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(47,TestQuantifiedSegment); 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(48,TestDevanagariLatinRT); 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(49,TestTeluguLatinRT); 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(50,TestCompoundLatinRT); 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(51,TestSanskritLatinRT); 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(52,TestLocaleInstantiation); 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(53,TestTitleAccents); 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(54,TestLocaleResource); 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(55,TestParseError); 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(56,TestOutputSet); 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(57,TestVariableRange); 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(58,TestInvalidPostContext); 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(59,TestIDForms); 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(60,TestToRulesMark); 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(61,TestEscape); 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(62,TestAnchorMasking); 173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(63,TestDisplayName); 174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(64,TestSpecialCases); 17550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_FILE_IO 176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(65,TestIncrementalProgress); 17750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(66,TestSurrogateCasing); 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(67,TestFunction); 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(68,TestInvalidBackRef); 181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(69,TestMulticharStringSet); 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(70,TestUserFunction); 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(71,TestAnyX); 184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(72,TestSourceTargetSet); 185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(73,TestGurmukhiDevanagari); 186b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TESTCASE(74,TestPatternWhiteSpace); 187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(75,TestAllCodepoints); 188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(76,TestBoilerplate); 189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(77,TestAlternateSyntax); 190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(78,TestBeginEnd); 191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(79,TestBeginEndToRules); 192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(80,TestRegisterAlias); 193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(81,TestRuleStripping); 194c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TESTCASE(82,TestHalfwidthFullwidth); 195b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru TESTCASE(83,TestThai); 196b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru TESTCASE(84,TestAny); 197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: name = ""; break; 198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Make sure every system transliterator can be instantiated. 203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * ALSO test that the result of toRules() for each rule is a valid 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * rule. Do this here so we don't have to have another test that 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * instantiates everything as well. 207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestInstantiation() { 209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru StringEnumeration* avail = Transliterator::getAvailableIDs(ec); 211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertSuccess("getAvailableIDs()", ec); 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertTrue("getAvailableIDs()!=NULL", avail!=NULL); 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t n = Transliterator::countAvailableIDs(); 214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertTrue("getAvailableIDs().count()==countAvailableIDs()", 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru avail->count(ec) == n); 216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertSuccess("count()", ec); 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString name; 218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i=0; i<n; ++i) { 219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& id = *avail->snext(ec); 220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!assertSuccess("snext()", ec) || 221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru !assertTrue("snext()!=NULL", (&id)!=NULL, TRUE)) { 222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString id2 = Transliterator::getAvailableID(i); 225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (id.length() < 1) { 226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("FAIL: getAvailableID(") + 227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i + ") returned empty string"); 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (id != id2) { 231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("FAIL: getAvailableID(") + 232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i + ") != getAvailableIDs().snext()"); 233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* t = Transliterator::createInstance(id, 238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTRANS_FORWARD, parseError,status); 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name.truncate(0); 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::getDisplayName(id, name); 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t == 0) { 24250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if UCONFIG_NO_BREAK_ITERATION 24350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // If UCONFIG_NO_BREAK_ITERATION is on, then only Thai should fail. 24450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (id.compare((UnicodeString)"Thai-Latin") != 0) 24550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 24650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dataerrln(UnicodeString("FAIL: Couldn't create ") + id + 24750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /*", parse error " + parseError.code +*/ 24850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ", line " + parseError.line + 24950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ", offset " + parseError.offset + 25050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ", pre-context " + prettify(parseError.preContext, TRUE) + 25150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ", post-context " +prettify(parseError.postContext,TRUE) + 25250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ", Error: " + u_errorName(status)); 25350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // When createInstance fails, it deletes the failing 25450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // entry from the available ID list. We detect this 25550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // here by looking for a change in countAvailableIDs. 256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t nn = Transliterator::countAvailableIDs(); 257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (nn == (n - 1)) { 258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru n = nn; 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru --i; // Compensate for deleted entry 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(UnicodeString("OK: ") + name + " (" + id + ")"); 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Now test toRules 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rules; 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t->toRules(rules, TRUE); 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *u = Transliterator::createFromRules("x", 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rules, UTRANS_FORWARD, parseError,status); 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u == 0) { 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("FAIL: ") + id + 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ".createFromRules() => bad rules" + 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*", parse error " + parseError.code +*/ 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", line " + parseError.line + 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", offset " + parseError.offset + 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", context " + prettify(parseError.preContext, TRUE) + 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", rules: " + prettify(rules, TRUE)); 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete u; 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertTrue("snext()==NULL", avail->snext(ec)==NULL); 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertSuccess("snext()", ec); 285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete avail; 286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Now test the failure path 288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString id("<Not a valid Transliterator ID>"); 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* t = Transliterator::createInstance(id, UTRANS_FORWARD, parseError, status); 292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t != 0) { 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: " + id + " returned a transliterator"); 294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("OK: Bogus ID handled properly"); 297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestSimpleRules(void) { 301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Example: rules 1. ab>x|y 302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 2. yc>z 303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * []|eabcd start - no match, copy e to tranlated buffer 305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * [e]|abcd match rule 1 - copy output & adjust cursor 306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * [ex|y]cd match rule 2 - copy output & adjust cursor 307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * [exz]|d no match, copy d to transliterated buffer 308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * [exzd]| done 309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(UnicodeString("ab>x|y;", "") + 311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "yc>z", 312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "eabcd", "exzd"); 313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Another set of rules: 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 1. ab>x|yzacw 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 2. za>q 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 3. qc>r 318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 4. cw>n 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * []|ab Rule 1 321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * [x|yzacw] No match 322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * [xy|zacw] Rule 2 323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * [xyq|cw] Rule 4 324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * [xyqn]| Done 325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(UnicodeString("ab>x|yzacw;") + 327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "za>q;" + 328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "qc>r;" + 329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "cw>n", 330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ab", "xyqn"); 331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Test categories 333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createFromRules( 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<ID>", 338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString("$dummy=").append((UChar)0xE100) + 339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString(";" 340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$vowel=[aeiouAEIOU];" 341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$lu=[:Lu:];" 342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$vowel } $lu > '!';" 343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$vowel > '&';" 344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "'!' { $lu > '^';" 345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$lu > '*';" 346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a > ERROR", ""), 347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTRANS_FORWARD, parseError, 348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status); 349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 3506d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("FAIL: RBT constructor failed - %s", u_errorName(status)); 351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, "abcdefgABCDEFGU", "&bcd&fg!^**!^*&"); 354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test inline set syntax and set variable syntax. 359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestInlineSet(void) { 361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect("{ [:Ll:] } x > y; [:Ll:] > z;", "aAbxq", "zAyzz"); 362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect("a[0-9]b > qrs", "1a7b9", "1qrs9"); 363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(UnicodeString( 365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$digit = [0-9];" 366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$alpha = [a-zA-Z];" 367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$alphanumeric = [$digit $alpha];" // *** 368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$special = [^$alphanumeric];" // *** 369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$alphanumeric > '-';" 370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$special > '*';", ""), 371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "thx-1138", "---*----"); 373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Create some inverses and confirm that they work. We have to be 377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * careful how we do this, since the inverses will not be true 378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * inverses -- we can't throw any random string at the composition 379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * of the transliterators and expect the identity function. F x 380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * F' != I. However, if we are careful about the input, we will 381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * get the expected results. 382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestRuleBasedInverse(void) { 384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString RULES = 385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString("abc>zyx;") + 386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ab>yz;" + 387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "bc>zx;" + 388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ca>xy;" + 389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a>x;" + 390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "b>y;" + 391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "c>z;" + 392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "abc<zyx;" + 394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ab<yz;" + 395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "bc<zx;" + 396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ca<xy;" + 397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a<x;" + 398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "b<y;" + 399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "c<z;" + 400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ""; 402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* DATA[] = { 404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Careful here -- random strings will not work. If we keep 405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // the left side to the domain and the right side to the range 406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // we will be okay though (left, abc; right xyz). 407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a", "x", 408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "abcacab", "zyxxxyy", 409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "caccb", "xyzzy", 410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t DATA_length = (int32_t)(sizeof(DATA) / sizeof(DATA[0])); 413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *fwd = Transliterator::createFromRules("<ID>", RULES, 417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTRANS_FORWARD, parseError, status); 418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *rev = Transliterator::createFromRules("<ID>", RULES, 419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTRANS_REVERSE, parseError, status); 420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: RBT constructor failed"); 422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i=0; i<DATA_length; i+=2) { 425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*fwd, DATA[i], DATA[i+1]); 426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*rev, DATA[i+1], DATA[i]); 427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fwd; 429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete rev; 430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Basic test of keyboard. 434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestKeyboard(void) { 436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createFromRules("<ID>", 439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString("psch>Y;") 440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru +"ps>y;" 441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru +"ch>x;" 442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru +"a>A;", 443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTRANS_FORWARD, parseError, 444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status); 445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: RBT constructor failed"); 447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* DATA[] = { 450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // insertion, buffer 451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a", "A", 452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "p", "Ap", 453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "s", "Aps", 454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "c", "Apsc", 455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a", "AycA", 456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "psch", "AycAY", 457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0, "AycAY", // null means finishKeyboardTransliteration 458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru keyboardAux(*t, DATA, (int32_t)(sizeof(DATA)/sizeof(DATA[0]))); 461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Basic test of keyboard with cursor. 466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestKeyboard2(void) { 468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createFromRules("<ID>", 471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString("ych>Y;") 472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru +"ps>|y;" 473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru +"ch>x;" 474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru +"a>A;", 475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTRANS_FORWARD, parseError, 476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status); 477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: RBT constructor failed"); 479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* DATA[] = { 482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // insertion, buffer 483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a", "A", 484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "p", "Ap", 485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "s", "Aps", // modified for rollback - "Ay", 486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "c", "Apsc", // modified for rollback - "Ayc", 487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a", "AycA", 488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "p", "AycAp", 489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "s", "AycAps", // modified for rollback - "AycAy", 490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "c", "AycApsc", // modified for rollback - "AycAyc", 491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "h", "AycAY", 492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0, "AycAY", // null means finishKeyboardTransliteration 493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru keyboardAux(*t, DATA, (int32_t)(sizeof(DATA)/sizeof(DATA[0]))); 496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test keyboard transliteration with back-replacement. 501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestKeyboard3(void) { 503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // We want th>z but t>y. Furthermore, during keyboard 504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // transliteration we want t>y then yh>z if t, then h are 505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // typed. 506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString RULES("t>|y;" 507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "yh>z;"); 508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* DATA[] = { 510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Column 1: characters to add to buffer (as if typed) 511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Column 2: expected appearance of buffer after 512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // keyboard xliteration. 513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a", "a", 514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "b", "ab", 515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "t", "abt", // modified for rollback - "aby", 516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "c", "abyc", 517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "t", "abyct", // modified for rollback - "abycy", 518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "h", "abycz", 519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0, "abycz", // null means finishKeyboardTransliteration 520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createFromRules("<ID>", RULES, UTRANS_FORWARD, parseError, status); 525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: RBT constructor failed"); 527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru keyboardAux(*t, DATA, (int32_t)(sizeof(DATA)/sizeof(DATA[0]))); 530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::keyboardAux(const Transliterator& t, 534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* DATA[], int32_t DATA_length) { 535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTransPosition index={0, 0, 0, 0}; 537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s; 538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i=0; i<DATA_length; i+=2) { 539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString log; 540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (DATA[i] != 0) { 541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log = s + " + " 542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru + DATA[i] 543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru + " -> "; 544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t.transliterate(s, index, DATA[i], status); 545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log = s + " => "; 547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t.finishTransliteration(s, index); 548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Show the start index '{' and the cursor '|' 550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString a, b, c; 551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.extractBetween(0, index.contextStart, a); 552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.extractBetween(index.contextStart, index.start, b); 553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.extractBetween(index.start, s.length(), c); 554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log.append(a). 555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru append((UChar)LEFT_BRACE). 556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru append(b). 557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru append((UChar)PIPE). 558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru append(c); 559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (s == DATA[i+1] && U_SUCCESS(status)) { 560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(log); 561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("FAIL: ") + log + ", expected " + DATA[i+1]); 563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestArabic(void) { 568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Test disabled for 2.0 until new Arabic transliterator can be written. 569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// /* 570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// const char* DATA[] = { 571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "Arabic", "\u062a\u062a\u0645\u062a\u0639\u0020"+ 572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "\u0627\u0644\u0644\u063a\u0629\u0020"+ 573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "\u0627\u0644\u0639\u0631\u0628\u0628\u064a\u0629\u0020"+ 574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "\u0628\u0628\u0646\u0638\u0645\u0020"+ 575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "\u0643\u062a\u0627\u0628\u0628\u064a\u0629\u0020"+ 576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "\u062c\u0645\u064a\u0644\u0629", 577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// }; 578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// */ 579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// UChar ar_raw[] = { 581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 0x062a, 0x062a, 0x0645, 0x062a, 0x0639, 0x0020, 0x0627, 582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 0x0644, 0x0644, 0x063a, 0x0629, 0x0020, 0x0627, 0x0644, 583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 0x0639, 0x0631, 0x0628, 0x0628, 0x064a, 0x0629, 0x0020, 584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 0x0628, 0x0628, 0x0646, 0x0638, 0x0645, 0x0020, 0x0643, 585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 0x062a, 0x0627, 0x0628, 0x0628, 0x064a, 0x0629, 0x0020, 586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 0x062c, 0x0645, 0x064a, 0x0644, 0x0629, 0 587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// }; 588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// UnicodeString ar(ar_raw); 589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// UErrorCode status=U_ZERO_ERROR; 590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// UParseError parseError; 591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Transliterator *t = Transliterator::createInstance("Latin-Arabic", UTRANS_FORWARD, parseError, status); 592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// if (t == 0) { 593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// errln("FAIL: createInstance failed"); 594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// return; 595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// } 596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// expect(*t, "Arabic", ar); 597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// delete t; 598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Compose the Kana transliterator forward and reverse and try 602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * some strings that should come out unchanged. 603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestCompoundKana(void) { 605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* t = Transliterator::createInstance("Latin-Hiragana;Hiragana-Latin", UTRANS_FORWARD, parseError, status); 608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t == 0) { 6096d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("FAIL: construction of Latin-Hiragana;Hiragana-Latin failed - %s", u_errorName(status)); 610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, "aaaaa", "aaaaa"); 612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Compose the hex transliterators forward and reverse. 618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestCompoundHex(void) { 620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* a = Transliterator::createInstance("Any-Hex", UTRANS_FORWARD, parseError, status); 623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* b = Transliterator::createInstance("Hex-Any", UTRANS_FORWARD, parseError, status); 624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* transab[] = { a, b }; 625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* transba[] = { b, a }; 626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (a == 0 || b == 0) { 627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: construction failed"); 628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete a; 629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete b; 630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Do some basic tests of a 633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*a, "01", UnicodeString("\\u0030\\u0031", "")); 634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Do some basic tests of b 635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*b, UnicodeString("\\u0030\\u0031", ""), "01"); 636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* ab = new CompoundTransliterator(transab, 2); 638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s("abcde", ""); 639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*ab, s, s); 640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString str(s); 642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru a->transliterate(str); 643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* ba = new CompoundTransliterator(transba, 2); 644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*ba, str, str); 645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete ab; 647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete ba; 648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete a; 649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete b; 650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint gTestFilterClassID = 0; 653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Used by TestFiltering(). 655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass TestFilter : public UnicodeFilter { 657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UnicodeFunctor* clone() const { 658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return new TestFilter(*this); 659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UBool contains(UChar32 c) const { 661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return c != (UChar)0x0063 /*c*/; 662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Stubs 664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UnicodeString& toPattern(UnicodeString& result, 665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool /*escapeUnprintable*/) const { 666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UBool matchesIndexValue(uint8_t /*v*/) const { 669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual void addMatchSetTo(UnicodeSet& /*toUnionTo*/) const {} 672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UClassID getDynamicClassID() const { return (UClassID)&gTestFilterClassID; } 674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Do some basic tests of filtering. 678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestFiltering(void) { 680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* hex = Transliterator::createInstance("Any-Hex", UTRANS_FORWARD, parseError, status); 683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (hex == 0) { 684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: createInstance(Any-Hex) failed"); 685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru hex->adoptFilter(new TestFilter()); 688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s("abcde"); 689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru hex->transliterate(s); 690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString exp("\\u0061\\u0062c\\u0064\\u0065", ""); 691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (s == exp) { 692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(UnicodeString("Ok: \"") + exp + "\""); 693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(UnicodeString("FAIL: \"") + s + "\", wanted \"" + exp + "\""); 695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // ICU4C ONLY. Do not find Transliterator.orphanFilter() in ICU4J. 698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeFilter *f = hex->orphanFilter(); 699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (f == NULL){ 700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: orphanFilter() should get a UnicodeFilter"); 701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete f; 703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete hex; 705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test anchors 709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestAnchors(void) { 711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(UnicodeString("^a > 0; a$ > 2 ; a > 1;", ""), 712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "aaa", 713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "012"); 714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(UnicodeString("$s=[z$]; $s{a>0; a}$s>2; a>1;", ""), 715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "aaa", 716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "012"); 717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(UnicodeString("^ab > 01 ;" 718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " ab > |8 ;" 719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " b > k ;" 720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " 8x$ > 45 ;" 721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " 8x > 77 ;", ""), 722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ababbabxabx", 724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "018k7745"); 725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(UnicodeString("$s = [z$] ;" 726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$s{ab > 01 ;" 727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " ab > |8 ;" 728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " b > k ;" 729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " 8x}$s > 45 ;" 730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " 8x > 77 ;", ""), 731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "abzababbabxzabxabx", 733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "01z018k45z01x45"); 734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test pattern quoting and escape mechanisms. 738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestPatternQuoting(void) { 740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Array of 3n items 741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Each item is <rules>, <input>, <expected output> 742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString DATA[] = { 743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString(UChar(0x4E01)) + ">'[male adult]'", 744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString(UChar(0x4E01)), 745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[male adult]" 746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i=0; i<3; i+=3) { 749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(UnicodeString("Pattern: ") + prettify(DATA[i])); 750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createFromRules("<ID>", DATA[i], UTRANS_FORWARD, parseError, status); 753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("RBT constructor failed"); 755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, DATA[i+1], DATA[i+2]); 757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Regression test for bugs found in Greek transliteration. 764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestJ277(void) { 766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *gl = Transliterator::createInstance("Greek-Latin; NFD; [:M:]Remove; NFC", UTRANS_FORWARD, parseError, status); 769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (gl == NULL) { 7706d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("FAIL: createInstance(Greek-Latin) returned NULL - %s", u_errorName(status)); 771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar sigma = 0x3C3; 775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar upsilon = 0x3C5; 776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar nu = 0x3BD; 777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// UChar PHI = 0x3A6; 778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar alpha = 0x3B1; 779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// UChar omega = 0x3C9; 780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// UChar omicron = 0x3BF; 781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// UChar epsilon = 0x3B5; 782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // sigma upsilon nu -> syn 784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString syn; 785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru syn.append(sigma).append(upsilon).append(nu); 786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*gl, syn, "syn"); 787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // sigma alpha upsilon nu -> saun 789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString sayn; 790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sayn.append(sigma).append(alpha).append(upsilon).append(nu); 791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*gl, sayn, "saun"); 792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Again, using a smaller rule set 794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rules( 795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$alpha = \\u03B1;" 796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$nu = \\u03BD;" 797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$sigma = \\u03C3;" 798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$ypsilon = \\u03C5;" 799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$vowel = [aeiouAEIOU$alpha$ypsilon];" 800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "s <> $sigma;" 801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a <> $alpha;" 802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "u <> $vowel { $ypsilon;" 803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "y <> $ypsilon;" 804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "n <> $nu;", 805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ""); 806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *mini = Transliterator::createFromRules("mini", rules, UTRANS_REVERSE, parseError, status); 807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { errln("FAIL: Transliterator constructor failed"); return; } 808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*mini, syn, "syn"); 809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*mini, sayn, "saun"); 810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete mini; 811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru mini = NULL; 812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING 814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Transliterate the Greek locale data 815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale el("el"); 816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DateFormatSymbols syms(el, status); 817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { errln("FAIL: Transliterator constructor failed"); return; } 818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i, count; 819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString* data = syms.getMonths(count); 820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=0; i<count; ++i) { 821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (data[i].length() == 0) { 822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString out(data[i]); 825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gl->transliterate(out); 826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool ok = TRUE; 827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (data[i].length() >= 2 && out.length() >= 2 && 828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_isupper(data[i].charAt(0)) && u_islower(data[i].charAt(1))) { 829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!(u_isupper(out.charAt(0)) && u_islower(out.charAt(1)))) { 830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ok = FALSE; 831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ok) { 834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(prettify(data[i] + " -> " + out)); 835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("FAIL: ") + prettify(data[i] + " -> " + out)); 837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete gl; 842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Prefix, suffix support in hex transliterators 846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestJ243(void) { 848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Test default Hex-Any, which should handle 851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // \u, \U, u+, and U+ 852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *hex = 853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::createInstance("Hex-Any", UTRANS_FORWARD, ec); 854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (assertSuccess("getInstance", ec)) { 855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*hex, UnicodeString("\\u0041+\\U00000042,U+0043uU+0044z", ""), "A+B,CuDz"); 856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete hex; 858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// // Try a custom Hex-Unicode 860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// // \uXXXX and &#xXXXX; 861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ec = U_ZERO_ERROR; 862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// HexToUnicodeTransliterator hex2(UnicodeString("\\\\u###0;&\\#x###0\\;", ""), ec); 863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// expect(hex2, UnicodeString("\\u61\\u062\\u0063\\u00645\\u66x0123", ""), 864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "abcd5fx0123"); 865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// // Try custom Any-Hex (default is tested elsewhere) 866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ec = U_ZERO_ERROR; 867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// UnicodeToHexTransliterator hex3(UnicodeString("&\\#x###0;", ""), ec); 868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// expect(hex3, "012", "012"); 869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Parsers need better syntax error messages. 873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestJ329(void) { 875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru struct { UBool containsErrors; const char* rule; } DATA[] = { 877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { FALSE, "a > b; c > d" }, 878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { TRUE, "a > b; no operator; c > d" }, 879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t DATA_length = (int32_t)(sizeof(DATA) / sizeof(DATA[0])); 881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i=0; i<DATA_length; ++i) { 883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *rbt = Transliterator::createFromRules("<ID>", 886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DATA[i].rule, 887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTRANS_FORWARD, 888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parseError, 889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status); 890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool gotError = U_FAILURE(status); 891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString desc(DATA[i].rule); 892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru desc.append(gotError ? " -> error" : " -> no error"); 893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (gotError) { 894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru desc = desc + ", ParseError code=" + u_errorName(status) + 895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " line=" + parseError.line + 896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " offset=" + parseError.offset + 897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " context=" + parseError.preContext; 898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (gotError == DATA[i].containsErrors) { 900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(UnicodeString("Ok: ") + desc); 901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("FAIL: ") + desc); 903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete rbt; 905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test segments and segment references. 910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestSegments(void) { 912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Array of 3n items 913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Each item is <rules>, <input>, <expected output> 914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString DATA[] = { 915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "([a-z]) '.' ([0-9]) > $2 '-' $1", 916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "abc.123.xyz.456", 917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ab1-c23.xy4-z56", 918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // nested 920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "(([a-z])([0-9])) > $1 '.' $2 '.' $3;", 921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a1 b2", 922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a1.a.1 b2.b.2", 923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t DATA_length = (int32_t)(sizeof(DATA)/sizeof(*DATA)); 925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i=0; i<DATA_length; i+=3) { 927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Pattern: " + prettify(DATA[i])); 928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createFromRules("ID", DATA[i], UTRANS_FORWARD, parseError, status); 931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: RBT constructor"); 933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, DATA[i+1], DATA[i+2]); 935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test cursor positioning outside of the key 942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestCursorOffset(void) { 944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Array of 3n items 945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Each item is <rules>, <input>, <expected output> 946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString DATA[] = { 947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "pre {alpha} post > | @ ALPHA ;" 948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "eALPHA > beta ;" 949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "pre {beta} post > BETA @@ | ;" 950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "post > xyz", 951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "prealphapost prebetapost", 953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "prbetaxyz preBETApost", 955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t DATA_length = (int32_t)(sizeof(DATA)/sizeof(*DATA)); 957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i=0; i<DATA_length; i+=3) { 959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Pattern: " + prettify(DATA[i])); 960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createFromRules("<ID>", DATA[i], UTRANS_FORWARD, parseError, status); 963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: RBT constructor"); 965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, DATA[i+1], DATA[i+2]); 967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test zero length and > 1 char length variable values. Test 974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * use of variable refs in UnicodeSets. 975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestArbitraryVariableValues(void) { 977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Array of 3n items 978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Each item is <rules>, <input>, <expected output> 979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString DATA[] = { 980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$abe = ab;" 981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$pat = x[yY]z;" 982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$ll = 'a-z';" 983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$llZ = [$ll];" 984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$llY = [$ll$pat];" 985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$emp = ;" 986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$abe > ABE;" 988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$pat > END;" 989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$llZ > 1;" 990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$llY > 2;" 991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "7$emp 8 > 9;" 992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "", 993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ab xYzxyz stY78", 995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ABE ENDEND 1129", 996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t DATA_length = (int32_t)(sizeof(DATA)/sizeof(*DATA)); 998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i=0; i<DATA_length; i+=3) { 1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Pattern: " + prettify(DATA[i])); 1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createFromRules("<ID>", DATA[i], UTRANS_FORWARD, parseError, status); 1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: RBT constructor"); 1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, DATA[i+1], DATA[i+2]); 1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Confirm that the contextStart, contextLimit, start, and limit 1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * behave correctly. J474. 1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestPositionHandling(void) { 1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Array of 3n items 1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Each item is <rules>, <input>, <expected output> 1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* DATA[] = { 1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a{t} > SS ; {t}b > UU ; {t} > TT ;", 1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "xtat txtb", // pos 0,9,0,9 1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "xTTaSS TTxUUb", 1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a{t} > SS ; {t}b > UU ; {t} > TT ; a > A ; b > B ;", 1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "xtat txtb", // pos 2,9,3,8 1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "xtaSS TTxUUb", 1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a{t} > SS ; {t}b > UU ; {t} > TT ; a > A ; b > B ;", 1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "xtat txtb", // pos 3,8,3,8 1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "xtaTT TTxTTb", 1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Array of 4n positions -- these go with the DATA array 1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // They are: contextStart, contextLimit, start, limit 1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t POS[] = { 1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0, 9, 0, 9, 1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2, 9, 3, 8, 1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3, 8, 3, 8, 1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t n = (int32_t)(sizeof(DATA) / sizeof(DATA[0])) / 3; 1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i=0; i<n; i++) { 1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createFromRules("<ID>", 1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DATA[3*i], UTRANS_FORWARD, parseError, status); 1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: RBT constructor"); 1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTransPosition pos; 1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos.contextStart= POS[4*i]; 1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos.contextLimit = POS[4*i+1]; 1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos.start = POS[4*i+2]; 1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos.limit = POS[4*i+3]; 1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rsource(DATA[3*i+1]); 1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t->transliterate(rsource, pos, status); 1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: transliterate"); 1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t->finishTransliteration(rsource, pos); 1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectAux(DATA[3*i], 1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DATA[3*i+1], 1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rsource, 1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DATA[3*i+2]); 1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test the Hiragana-Katakana transliterator. 1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestHiraganaKatakana(void) { 1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* hk = Transliterator::createInstance("Hiragana-Katakana", UTRANS_FORWARD, parseError, status); 1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* kh = Transliterator::createInstance("Katakana-Hiragana", UTRANS_FORWARD, parseError, status); 1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (hk == 0 || kh == 0) { 10836d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("FAIL: createInstance failed - %s", u_errorName(status)); 1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete hk; 1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete kh; 1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Array of 3n items 1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Each item is "hk"|"kh"|"both", <Hiragana>, <Katakana> 1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* DATA[] = { 1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "both", 1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u3042\\u3090\\u3099\\u3092\\u3050", 1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30A2\\u30F8\\u30F2\\u30B0", 1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "kh", 1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u307C\\u3051\\u3060\\u3042\\u3093\\u30FC", 1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30DC\\u30F6\\u30C0\\u30FC\\u30F3\\u30FC", 1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t DATA_length = (int32_t)(sizeof(DATA) / sizeof(DATA[0])); 1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i=0; i<DATA_length; i+=3) { 1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString h = CharsToUnicodeString(DATA[i+1]); 1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString k = CharsToUnicodeString(DATA[i+2]); 1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (*DATA[i]) { 1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x68: //'h': // Hiragana-Katakana 1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*hk, h, k); 1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x6B: //'k': // Katakana-Hiragana 1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*kh, k, h); 1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x62: //'b': // both 1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*hk, h, k); 1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*kh, k, h); 1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete hk; 1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete kh; 1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test cloning / copy constructor of RBT. 1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestCopyJ476(void) { 1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // The real test here is what happens when the destructors are 1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // called. So we let one object get destructed, and check to 1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // see that its copy still works. 1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t2 = 0; 1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t1 = Transliterator::createFromRules("t1", 1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a>A;b>B;'foo'+>'bar'", UTRANS_FORWARD, parseError, status); 1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: RBT constructor"); 1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t2 = t1->clone(); // Call copy constructor under the covers. 1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t1, "abcfoofoo", "ABcbar"); 1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t1; 1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t2, "abcfoofoo", "ABcbar"); 1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t2; 1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test inter-Indic transliterators. These are composed. 1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * ICU4C Jitterbug 483. 1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestInterIndic(void) { 1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString ID("Devanagari-Gujarati", ""); 1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* dg = Transliterator::createInstance(ID, UTRANS_FORWARD, parseError, status); 1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (dg == 0) { 11576d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("FAIL: createInstance(" + ID + ") returned NULL - " + u_errorName(status)); 1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString id = dg->getID(); 1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (id != ID) { 1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: createInstance(" + ID + ")->getID() => " + id); 1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString dev = CharsToUnicodeString("\\u0901\\u090B\\u0925"); 1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString guj = CharsToUnicodeString("\\u0A81\\u0A8B\\u0AA5"); 1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*dg, dev, guj); 1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete dg; 1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 1171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test filter syntax in IDs. (J918) 1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestFilterIDs(void) { 1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Array of 3n strings: 1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // <id>, <inverse id>, <input>, <expected output> 1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* DATA[] = { 1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[aeiou]Any-Hex", // ID 1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[aeiou]Hex-Any", // expected inverse ID 1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "quizzical", // src 1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "q\\u0075\\u0069zz\\u0069c\\u0061l", // expected ID.translit(src) 1181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[aeiou]Any-Hex;[^5]Hex-Any", 1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[^5]Any-Hex;[aeiou]Hex-Any", 1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "quizzical", 1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "q\\u0075izzical", 1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[abc]Null", 1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[abc]Null", 1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "xyz", 1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "xyz", 1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru enum { DATA_length = sizeof(DATA) / sizeof(DATA[0]) }; 1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int i=0; i<DATA_length; i+=4) { 1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString ID(DATA[i], ""); 1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString uID(DATA[i+1], ""); 1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString data2(DATA[i+2], ""); 1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString data3(DATA[i+3], ""); 1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createInstance(ID, UTRANS_FORWARD, parseError, status); 1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t == 0) { 1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: createInstance(" + ID + ") returned NULL"); 1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, data2, data3); 1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Check the ID 1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ID != t->getID()) { 1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: createInstance(" + ID + ").getID() => " + 1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t->getID()); 1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Check the inverse 1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *u = t->createInverse(status); 1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u == 0) { 1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: " + ID + ".createInverse() returned NULL"); 1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (u->getID() != uID) { 1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: " + ID + ".createInverse().getID() => " + 1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u->getID() + ", expected " + uID); 1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete u; 1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test the case mapping transliterators. 1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestCaseMap(void) { 1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* toUpper = 1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::createInstance("Any-Upper[^xyzXYZ]", UTRANS_FORWARD, parseError, status); 1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* toLower = 1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::createInstance("Any-Lower[^xyzXYZ]", UTRANS_FORWARD, parseError, status); 1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* toTitle = 1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::createInstance("Any-Title[^xyzXYZ]", UTRANS_FORWARD, parseError, status); 1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (toUpper==0 || toLower==0 || toTitle==0) { 1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: createInstance returned NULL"); 1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete toUpper; 1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete toLower; 1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete toTitle; 1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*toUpper, "The quick brown fox jumped over the lazy dogs.", 1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "THE QUICK BROWN FOx JUMPED OVER THE LAzy DOGS."); 1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*toLower, "The quIck brown fOX jUMPED OVER THE LAzY dogs.", 1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "the quick brown foX jumped over the lazY dogs."); 1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*toTitle, "the quick brown foX can't jump over the laZy dogs.", 1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "The Quick Brown FoX Can't Jump Over The LaZy Dogs."); 1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete toUpper; 1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete toLower; 1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete toTitle; 1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test the name mapping transliterators. 1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestNameMap(void) { 1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* uni2name = 1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::createInstance("Any-Name[^abc]", UTRANS_FORWARD, parseError, status); 1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* name2uni = 1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::createInstance("Name-Any", UTRANS_FORWARD, parseError, status); 1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (uni2name==0 || name2uni==0) { 1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: createInstance returned NULL"); 1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete uni2name; 1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete name2uni; 1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Careful: CharsToUS will convert "\\N" => "N"; use "\\\\N" for \N 1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*uni2name, CharsToUnicodeString("\\u00A0abc\\u4E01\\u00B5\\u0A81\\uFFFD\\u0004\\u0009\\u0081\\uFFFF"), 127983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius CharsToUnicodeString("\\\\N{NO-BREAK SPACE}abc\\\\N{CJK UNIFIED IDEOGRAPH-4E01}\\\\N{MICRO SIGN}\\\\N{GUJARATI SIGN CANDRABINDU}\\\\N{REPLACEMENT CHARACTER}\\\\N{<control-0004>}\\\\N{<control-0009>}\\\\N{<control-0081>}\\\\N{<noncharacter-FFFF>}")); 128083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius expect(*name2uni, UNICODE_STRING_SIMPLE("{\\N { NO-BREAK SPACE}abc\\N{ CJK UNIFIED IDEOGRAPH-4E01 }\\N{x\\N{MICRO SIGN}\\N{GUJARATI SIGN CANDRABINDU}\\N{REPLACEMENT CHARACTER}\\N{<control-0004>}\\N{<control-0009>}\\N{<control-0081>}\\N{<noncharacter-FFFF>}\\N{<control-0004>}\\N{"), 1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("{\\u00A0abc\\u4E01\\\\N{x\\u00B5\\u0A81\\uFFFD\\u0004\\u0009\\u0081\\uFFFF\\u0004\\\\N{")); 1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete uni2name; 1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete name2uni; 1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // round trip 1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* t = 1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::createInstance("Any-Name;Name-Any", UTRANS_FORWARD, parseError, status); 1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t==0) { 1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: createInstance returned NULL"); 1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Careful: CharsToUS will convert "\\N" => "N"; use "\\\\N" for \N 1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s = CharsToUnicodeString("{\\u00A0abc\\u4E01\\\\N{x\\u00B5\\u0A81\\uFFFD\\u0004\\u0009\\u0081\\uFFFF\\u0004\\\\N{"); 1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, s, s); 1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test liberalized ID syntax. 1006c 1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestLiberalizedID(void) { 1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Some test cases have an expected getID() value of NULL. This 1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // means I have disabled the test case for now. This stuff is 1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // still under development, and I haven't decided whether to make 1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // getID() return canonical case yet. It will all get rewritten 1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // with the move to Source-Target/Variant IDs anyway. [aliu] 1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* DATA[] = { 1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "latin-greek", NULL /*"Latin-Greek"*/, "case insensitivity", 1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " Null ", "Null", "whitespace", 1313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " Latin[a-z]-Greek ", "[a-z]Latin-Greek", "inline filter", 1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " null ; latin-greek ", NULL /*"Null;Latin-Greek"*/, "compound whitespace", 1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const int32_t DATA_length = sizeof(DATA)/sizeof(DATA[0]); 1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status= U_ZERO_ERROR; 1319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i=0; i<DATA_length; i+=3) { 1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createInstance(DATA[i], UTRANS_FORWARD, parseError, status); 1321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t == 0) { 13226d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln(UnicodeString("FAIL: ") + DATA[i+2] + 13236d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru " cannot create ID \"" + DATA[i] + "\" - " + u_errorName(status)); 1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString exp; 1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (DATA[i+1]) { 1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru exp = UnicodeString(DATA[i+1], ""); 1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Don't worry about getID() if the expected char* 1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // is NULL -- see above. 1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (exp.length() == 0 || exp == t->getID()) { 1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(UnicodeString("Ok: ") + DATA[i+2] + 1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " create ID \"" + DATA[i] + "\" => \"" + 1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru exp + "\""); 1335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("FAIL: ") + DATA[i+2] + 1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " create ID \"" + DATA[i] + "\" => \"" + 1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t->getID() + "\", exp \"" + exp + "\""); 1339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* test for Jitterbug 912 */ 1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestCreateInstance(){ 1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* FORWARD = "F"; 1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* REVERSE = "R"; 1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* DATA[] = { 1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Column 1: id 1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Column 2: direction 1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Column 3: expected ID, or "" if expect failure 1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Latin-Hangul", REVERSE, "Hangul-Latin", // JB#912 1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // JB#2689: bad compound causes crash 1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "InvalidSource-InvalidTarget", FORWARD, "", 1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "InvalidSource-InvalidTarget", REVERSE, "", 1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Hex-Any;InvalidSource-InvalidTarget", FORWARD, "", 1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Hex-Any;InvalidSource-InvalidTarget", REVERSE, "", 1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "InvalidSource-InvalidTarget;Hex-Any", FORWARD, "", 1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "InvalidSource-InvalidTarget;Hex-Any", REVERSE, "", 1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL 1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i=0; DATA[i]; i+=3) { 1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError err; 1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString id(DATA[i]); 1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTransDirection dir = (DATA[i+1]==FORWARD)? 1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTRANS_FORWARD:UTRANS_REVERSE; 1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString expID(DATA[i+2]); 1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* t = 1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::createInstance(id,dir,err,ec); 1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString newID; 1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t) { 1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru newID = t->getID(); 1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool ok = (newID == expID); 1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!t) { 1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru newID = u_errorName(ec); 1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ok) { 1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)"Ok: createInstance(" + 1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru id + "," + DATA[i+1] + ") => " + newID); 1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 13876d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln((UnicodeString)"FAIL: createInstance(" + 1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru id + "," + DATA[i+1] + ") => " + newID + 1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", expected " + expID); 1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test the normalization transliterator. 1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestNormalizationTransliterator() { 1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // THE FOLLOWING TWO TABLES ARE COPIED FROM com.ibm.test.normalizer.BasicTest 1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // PLEASE KEEP THEM IN SYNC WITH BasicTest. 1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* CANON[] = { 1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Input Decomposed Composed 1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "cat", "cat", "cat" , 1404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u00e0ardvark", "a\\u0300ardvark", "\\u00e0ardvark" , 1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1e0a", "D\\u0307", "\\u1e0a" , // D-dot_above 1407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "D\\u0307", "D\\u0307", "\\u1e0a" , // D dot_above 1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1e0c\\u0307", "D\\u0323\\u0307", "\\u1e0c\\u0307" , // D-dot_below dot_above 1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1e0a\\u0323", "D\\u0323\\u0307", "\\u1e0c\\u0307" , // D-dot_above dot_below 1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "D\\u0307\\u0323", "D\\u0323\\u0307", "\\u1e0c\\u0307" , // D dot_below dot_above 1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1e10\\u0307\\u0323", "D\\u0327\\u0323\\u0307","\\u1e10\\u0323\\u0307", // D dot_below cedilla dot_above 1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "D\\u0307\\u0328\\u0323","D\\u0328\\u0323\\u0307","\\u1e0c\\u0328\\u0307", // D dot_above ogonek dot_below 1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1E14", "E\\u0304\\u0300", "\\u1E14" , // E-macron-grave 1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0112\\u0300", "E\\u0304\\u0300", "\\u1E14" , // E-macron + grave 1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u00c8\\u0304", "E\\u0300\\u0304", "\\u00c8\\u0304" , // E-grave + macron 1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u212b", "A\\u030a", "\\u00c5" , // angstrom_sign 1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u00c5", "A\\u030a", "\\u00c5" , // A-ring 1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u00fdffin", "y\\u0301ffin", "\\u00fdffin" , //updated with 3.0 1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u00fd\\uFB03n", "y\\u0301\\uFB03n", "\\u00fd\\uFB03n" , //updated with 3.0 1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Henry IV", "Henry IV", "Henry IV" , 1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Henry \\u2163", "Henry \\u2163", "Henry \\u2163" , 1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30AC", "\\u30AB\\u3099", "\\u30AC" , // ga (Katakana) 1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30AB\\u3099", "\\u30AB\\u3099", "\\u30AC" , // ka + ten 1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\uFF76\\uFF9E", "\\uFF76\\uFF9E", "\\uFF76\\uFF9E" , // hw_ka + hw_ten 1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30AB\\uFF9E", "\\u30AB\\uFF9E", "\\u30AB\\uFF9E" , // ka + hw_ten 1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\uFF76\\u3099", "\\uFF76\\u3099", "\\uFF76\\u3099" , // hw_ka + ten 1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "A\\u0300\\u0316", "A\\u0316\\u0300", "\\u00C0\\u0316" , 1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0 // end 1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* COMPAT[] = { 1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Input Decomposed Composed 1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\uFB4f", "\\u05D0\\u05DC", "\\u05D0\\u05DC" , // Alef-Lamed vs. Alef, Lamed 1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u00fdffin", "y\\u0301ffin", "\\u00fdffin" , //updated for 3.0 1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u00fd\\uFB03n", "y\\u0301ffin", "\\u00fdffin" , // ffi ligature -> f + f + i 1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Henry IV", "Henry IV", "Henry IV" , 1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Henry \\u2163", "Henry IV", "Henry IV" , 1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30AC", "\\u30AB\\u3099", "\\u30AC" , // ga (Katakana) 1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u30AB\\u3099", "\\u30AB\\u3099", "\\u30AC" , // ka + ten 1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\uFF76\\u3099", "\\u30AB\\u3099", "\\u30AC" , // hw_ka + ten 1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0 // end 1454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i; 1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* NFD = Transliterator::createInstance("NFD", UTRANS_FORWARD, parseError, status); 1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* NFC = Transliterator::createInstance("NFC", UTRANS_FORWARD, parseError, status); 1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!NFD || !NFC) { 146250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dataerrln("FAIL: createInstance failed: %s", u_errorName(status)); 1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete NFD; 1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete NFC; 1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=0; CANON[i]; i+=3) { 1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString in = CharsToUnicodeString(CANON[i]); 1469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString expd = CharsToUnicodeString(CANON[i+1]); 1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString expc = CharsToUnicodeString(CANON[i+2]); 1471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*NFD, in, expd); 1472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*NFC, in, expc); 1473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete NFD; 1475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete NFC; 1476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* NFKD = Transliterator::createInstance("NFKD", UTRANS_FORWARD, parseError, status); 1478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* NFKC = Transliterator::createInstance("NFKC", UTRANS_FORWARD, parseError, status); 1479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!NFKD || !NFKC) { 1480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: createInstance failed"); 1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete NFKD; 1482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete NFKC; 1483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=0; COMPAT[i]; i+=3) { 1486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString in = CharsToUnicodeString(COMPAT[i]); 1487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString expkd = CharsToUnicodeString(COMPAT[i+1]); 1488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString expkc = CharsToUnicodeString(COMPAT[i+2]); 1489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*NFKD, in, expkd); 1490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*NFKC, in, expkc); 1491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete NFKD; 1493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete NFKC; 1494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; 1496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 1497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createInstance("NFD; [x]Remove", 1498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTRANS_FORWARD, 1499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pe, status); 1500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t == 0) { 1501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: createInstance failed"); 1502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, CharsToUnicodeString("\\u010dx"), 1504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("c\\u030C")); 1505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 1506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 1509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test compound RBT rules. 1510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestCompoundRBT(void) { 1512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Careful with spacing and ';' here: Phrase this exactly 1513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // as toRules() is going to return it. If toRules() changes 1514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // with regard to spacing or ';', then adjust this string. 1515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rule("::Hex-Any;\n" 1516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::Any-Lower;\n" 1517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a > '.A.';\n" 1518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "b > '.B.';\n" 1519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::[^t]Any-Upper;", ""); 1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 1521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createFromRules("Test", rule, UTRANS_FORWARD, parseError, status); 1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t == 0) { 1524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: createFromRules failed"); 1525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1527c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru expect(*t, UNICODE_STRING_SIMPLE("\\u0043at in the hat, bat on the mat"), 1528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "C.A.t IN tHE H.A.t, .B..A.t ON tHE M.A.t"); 1529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString r; 1530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t->toRules(r, TRUE); 1531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (r == rule) { 1532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)"OK: toRules() => " + r); 1533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: toRules() => " + r + 1535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", expected " + rule); 1536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 1538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Now test toRules 1540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = Transliterator::createInstance("Greek-Latin; Latin-Cyrillic", UTRANS_FORWARD, parseError, status); 1541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t == 0) { 15426d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("FAIL: createInstance failed - %s", u_errorName(status)); 1543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString exp("::Greek-Latin;\n::Latin-Cyrillic;"); 1546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t->toRules(r, TRUE); 1547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (r != exp) { 1548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: toRules() => " + r + 1549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", expected " + exp); 1550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)"OK: toRules() => " + r); 1552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 1554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Round trip the result of toRules 1556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = Transliterator::createFromRules("Test", r, UTRANS_FORWARD, parseError, status); 1557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t == 0) { 1558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: createFromRules #2 failed"); 1559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)"OK: createFromRules(" + r + ") succeeded"); 1562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Test toRules again 1565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t->toRules(r, TRUE); 1566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (r != exp) { 1567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: toRules() => " + r + 1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", expected " + exp); 1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)"OK: toRules() => " + r); 1571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Test Foo(Bar) IDs. Careful with spacing in id; make it conform 1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // to what the regenerated ID will look like. 1577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString id("Upper(Lower);(NFKC)", ""); 1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = Transliterator::createInstance(id, UTRANS_FORWARD, parseError, status); 1579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t == 0) { 1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: createInstance #2 failed"); 1581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t->getID() == id) { 1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)"OK: created " + id); 1585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: createInstance(" + id + 1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ").getID() => " + t->getID()); 1588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *u = t->createInverse(status); 1591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u == 0) { 1592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: createInverse failed"); 1593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 1594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru exp = "NFKC();Lower(Upper)"; 1597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u->getID() == exp) { 1598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)"OK: createInverse(" + id + ") => " + 1599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u->getID()); 1600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: createInverse(" + id + ") => " + 1602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u->getID()); 1603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 1605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete u; 1606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 1609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Compound filter semantics were orginially not implemented 1610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * correctly. Originally, each component filter f(i) is replaced by 1611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * f'(i) = f(i) && g, where g is the filter for the compound 1612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * transliterator. 1613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 1614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * From Mark: 1615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 1616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Suppose and I have a transliterator X. Internally X is 1617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * "Greek-Latin; Latin-Cyrillic; Any-Lower". I use a filter [^A]. 1618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 1619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The compound should convert all greek characters (through latin) to 1620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * cyrillic, then lowercase the result. The filter should say "don't 1621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * touch 'A' in the original". But because an intermediate result 1622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * happens to go through "A", the Greek Alpha gets hung up. 1623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestCompoundFilter(void) { 1625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 1626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createInstance 1628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ("Greek-Latin; Latin-Greek; Lower", UTRANS_FORWARD, parseError, status); 1629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t == 0) { 16306d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("FAIL: createInstance failed - %s", u_errorName(status)); 1631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t->adoptFilter(new UnicodeSet("[^A]", status)); 1634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 1635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: UnicodeSet ct failed"); 1636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 1637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Only the 'A' at index 1 should remain unchanged 1641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, 1642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("BA\\u039A\\u0391"), 1643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("\\u03b2A\\u03ba\\u03b1")); 1644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 1645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestRemove(void) { 1648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 1649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createInstance("Remove[abc]", UTRANS_FORWARD, parseError, status); 1651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t == 0) { 1652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: createInstance failed"); 1653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, "Able bodied baker's cats", "Ale odied ker's ts"); 1657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // extra test for RemoveTransliterator::clone(), which at one point wasn't 1659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // duplicating the filter 1660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* t2 = t->clone(); 1661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t2, "Able bodied baker's cats", "Ale odied ker's ts"); 1662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 1664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t2; 1665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestToRules(void) { 1668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* RBT = "rbt"; 1669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* SET = "set"; 1670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* DATA[] = { 1671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RBT, 1672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$a=\\u4E61; [$a] > A;", 1673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[\\u4E61] > A;", 1674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RBT, 1676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$white=[[:Zs:][:Zl:]]; $white{a} > A;", 1677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[[:Zs:][:Zl:]]{a} > A;", 1678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SET, 1680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[[:Zs:][:Zl:]]", 1681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[[:Zs:][:Zl:]]", 1682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SET, 1684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[:Ps:]", 1685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[:Ps:]", 1686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SET, 1688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[:L:]", 1689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[:L:]", 1690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SET, 1692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[[:L:]-[A]]", 1693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[[:L:]-[A]]", 1694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SET, 1696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[~[:Lu:][:Ll:]]", 1697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[~[:Lu:][:Ll:]]", 1698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SET, 1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[~[a-z]]", 1701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[~[a-z]]", 1702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RBT, 1704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$white=[:Zs:]; $black=[^$white]; $black{a} > A;", 1705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[^[:Zs:]]{a} > A;", 1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RBT, 1708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$a=[:Zs:]; $b=[[a-z]-$a]; $b{a} > A;", 1709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[[a-z]-[:Zs:]]{a} > A;", 1710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RBT, 1712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$a=[:Zs:]; $b=[$a&[a-z]]; $b{a} > A;", 1713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[[:Zs:]&[a-z]]{a} > A;", 1714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RBT, 1716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$a=[:Zs:]; $b=[x$a]; $b{a} > A;", 1717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[x[:Zs:]]{a} > A;", 1718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RBT, 1720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$accentMinus = [ [\\u0300-\\u0345] & [:M:] - [\\u0338]] ;" 1721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$macron = \\u0304 ;" 1722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$evowel = [aeiouyAEIOUY] ;" 1723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$iotasub = \\u0345 ;" 1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "($evowel $macron $accentMinus *) i > | $1 $iotasub ;", 1725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "([AEIOUYaeiouy]\\u0304[[\\u0300-\\u0345]&[:M:]-[\\u0338]]*)i > | $1 \\u0345;", 1726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RBT, 1728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "([AEIOUYaeiouy]\\u0304[[:M:]-[\\u0304\\u0345]]*)i > | $1 \\u0345;", 1729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "([AEIOUYaeiouy]\\u0304[[:M:]-[\\u0304\\u0345]]*)i > | $1 \\u0345;", 1730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const int32_t DATA_length = (int32_t)(sizeof(DATA) / sizeof(DATA[0])); 1732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t d=0; d < DATA_length; d+=3) { 1734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (DATA[d] == RBT) { 1735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Transliterator test 1736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 1737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createFromRules("ID", 1739c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString(DATA[d+1], -1, US_INV), UTRANS_FORWARD, parseError, status); 1740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t == 0) { 17416d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("FAIL: createFromRules failed - %s", u_errorName(status)); 1742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rules, escapedRules; 1745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t->toRules(rules, FALSE); 1746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t->toRules(escapedRules, TRUE); 1747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString expRules = CharsToUnicodeString(DATA[d+2]); 1748c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString expEscapedRules(DATA[d+2], -1, US_INV); 1749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (rules == expRules) { 1750c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru logln((UnicodeString)"Ok: " + UnicodeString(DATA[d+1], -1, US_INV) + 1751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " => " + rules); 1752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1753c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru errln((UnicodeString)"FAIL: " + UnicodeString(DATA[d+1], -1, US_INV) + 1754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " => " + rules + ", exp " + expRules); 1755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (escapedRules == expEscapedRules) { 1757c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru logln((UnicodeString)"Ok: " + UnicodeString(DATA[d+1], -1, US_INV) + 1758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " => " + escapedRules); 1759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1760c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru errln((UnicodeString)"FAIL: " + UnicodeString(DATA[d+1], -1, US_INV) + 1761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " => " + escapedRules + ", exp " + expEscapedRules); 1762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 1764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // UnicodeSet test 1767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1768c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString pat(DATA[d+1], -1, US_INV); 1769c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString expToPat(DATA[d+2], -1, US_INV); 1770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSet set(pat, status); 1771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 1772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: UnicodeSet ct failed"); 1773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Adjust spacing etc. as necessary. 1776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString toPat; 1777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru set.toPattern(toPat); 1778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (expToPat == toPat) { 1779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)"Ok: " + pat + 1780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " => " + toPat); 1781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: " + pat + 1783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " => " + prettify(toPat, TRUE) + 1784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", exp " + prettify(pat, TRUE)); 1785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestContext() { 1791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTransPosition pos = {0, 2, 0, 1}; // cs cl s l 1792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect("de > x; {d}e > y;", 1793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "de", 1794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ye", 1795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &pos); 1796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect("ab{c} > z;", 1798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "xadabdabcy", 1799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "xadabdabzy"); 1800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestSupplemental() { 1803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(CharsToUnicodeString("$a=\\U00010300; $s=[\\U00010300-\\U00010323];" 1805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a > $a; $s > i;"), 1806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("ab\\U0001030Fx"), 1807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("\\U00010300bix")); 1808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(CharsToUnicodeString("$a=[a-z\\U00010300-\\U00010323];" 1810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$b=[A-Z\\U00010400-\\U0001044D];" 1811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "($a)($b) > $2 $1;"), 1812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("aB\\U00010300\\U00010400c\\U00010401\\U00010301D"), 1813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("Ba\\U00010400\\U00010300\\U00010401cD\\U00010301")); 1814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // k|ax\\U00010300xm 1816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // k|a\\U00010400\\U00010300xm 1818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // ky|\\U00010400\\U00010300xm 1819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // ky\\U00010400|\\U00010300xm 1820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // ky\\U00010400|\\U00010300\\U00010400m 1822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // ky\\U00010400y|\\U00010400m 1823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(CharsToUnicodeString("$a=[a\\U00010300-\\U00010323];" 1824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$a {x} > | @ \\U00010400;" 1825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "{$a} [^\\u0000-\\uFFFF] > y;"), 1826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("kax\\U00010300xm"), 1827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("ky\\U00010400y\\U00010400m")); 1828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectT("Any-Name", 1830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("\\U00010330\\U000E0061\\u00A0"), 1831c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE("\\N{GOTHIC LETTER AHSA}\\N{TAG LATIN SMALL LETTER A}\\N{NO-BREAK SPACE}")); 1832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectT("Any-Hex/Unicode", 1834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("\\U00010330\\U0010FF00\\U000E0061\\u00A0"), 1835c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE("U+10330U+10FF00U+E0061U+00A0")); 1836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectT("Any-Hex/C", 1838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("\\U00010330\\U0010FF00\\U000E0061\\u00A0"), 1839c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE("\\U00010330\\U0010FF00\\U000E0061\\u00A0")); 1840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectT("Any-Hex/Perl", 1842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("\\U00010330\\U0010FF00\\U000E0061\\u00A0"), 1843c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE("\\x{10330}\\x{10FF00}\\x{E0061}\\x{A0}")); 1844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectT("Any-Hex/Java", 1846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("\\U00010330\\U0010FF00\\U000E0061\\u00A0"), 1847c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE("\\uD800\\uDF30\\uDBFF\\uDF00\\uDB40\\uDC61\\u00A0")); 1848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectT("Any-Hex/XML", 1850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("\\U00010330\\U0010FF00\\U000E0061\\u00A0"), 1851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "𐌰􏼀󠁡 "); 1852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectT("Any-Hex/XML10", 1854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("\\U00010330\\U0010FF00\\U000E0061\\u00A0"), 1855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "𐌰􏼀󠁡 "); 1856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1857c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru expectT(UNICODE_STRING_SIMPLE("[\\U000E0000-\\U000E0FFF] Remove"), 1858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("\\U00010330\\U0010FF00\\U000E0061\\u00A0"), 1859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("\\U00010330\\U0010FF00\\u00A0")); 1860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestQuantifier() { 1863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Make sure @ in a quantified anteContext works 1865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect("a+ {b} > | @@ c; A > a; (a+ c) > '(' $1 ')';", 1866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "AAAAAb", 1867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "aaa(aac)"); 1868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Make sure @ in a quantified postContext works 1870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect("{b} a+ > c @@ |; (a+) > '(' $1 ')';", 1871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "baaaaa", 1872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "caa(aaa)"); 1873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Make sure @ in a quantified postContext with seg ref works 1875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect("{(b)} a+ > $1 @@ |; (a+) > '(' $1 ')';", 1876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "baaaaa", 1877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "baa(aaa)"); 1878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Make sure @ past ante context doesn't enter ante context 1880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTransPosition pos = {0, 5, 3, 5}; 1881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect("a+ {b} > | @@ c; x > y; (a+ c) > '(' $1 ')';", 1882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "xxxab", 1883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "xxx(ac)", 1884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &pos); 1885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Make sure @ past post context doesn't pass limit 1887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTransPosition pos2 = {0, 4, 0, 2}; 1888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect("{b} a+ > c @@ |; x > y; a > A;", 1889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "baxx", 1890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "caxx", 1891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &pos2); 1892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Make sure @ past post context doesn't enter post context 1894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect("{b} a+ > c @@ |; x > y; a > A;", 1895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "baxx", 1896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "cayy"); 1897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect("(ab)? c > d;", 1899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "c abc ababc", 1900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "d d abd"); 1901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // NOTE: The (ab)+ when referenced just yields a single "ab", 1903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // not the full sequence of them. This accords with perl behavior. 1904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect("(ab)+ {x} > '(' $1 ')';", 1905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "x abx ababxy", 1906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "x ab(ab) abab(ab)y"); 1907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect("b+ > x;", 1909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ac abc abbc abbbc", 1910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ac axc axc axc"); 1911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect("[abc]+ > x;", 1913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "qac abrc abbcs abtbbc", 1914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "qx xrx xs xtx"); 1915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect("q{(ab)+} > x;", 1917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "qa qab qaba qababc qaba", 1918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "qa qx qxa qxc qxa"); 1919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect("q(ab)* > x;", 1921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "qa qab qaba qababc", 1922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "xa x xa xc"); 1923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // NOTE: The (ab)+ when referenced just yields a single "ab", 1925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // not the full sequence of them. This accords with perl behavior. 1926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect("q(ab)* > '(' $1 ')';", 1927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "qa qab qaba qababc", 1928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "()a (ab) (ab)a (ab)c"); 1929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 'foo'+ and 'foo'* -- the quantifier should apply to the entire 1931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // quoted string 1932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect("'ab'+ > x;", 1933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "bb ab ababb", 1934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "bb x xb"); 1935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // $foo+ and $foo* -- the quantifier should apply to the entire 1937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // variable reference 1938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect("$var = ab; $var+ > x;", 1939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "bb ab ababb", 1940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "bb x xb"); 1941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass TestTrans : public Transliterator { 1944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 1945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestTrans(const UnicodeString& id) : Transliterator(id, 0) { 1946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual Transliterator* clone(void) const { 1948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return new TestTrans(getID()); 1949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual void handleTransliterate(Replaceable& /*text*/, UTransPosition& offsets, 1951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool /*isIncremental*/) const 1952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru offsets.start = offsets.limit; 1954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UClassID getDynamicClassID() const; 1956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static UClassID U_EXPORT2 getStaticClassID(); 1957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 1958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUOBJECT_DEFINE_RTTI_IMPLEMENTATION(TestTrans) 1959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 1961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test Source-Target/Variant. 1962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestSTV(void) { 1964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t ns = Transliterator::countAvailableSources(); 1965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ns < 0 || ns > 255) { 1966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: Bad source count: " + ns); 1967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i, j; 1970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=0; i<ns; ++i) { 1971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString source; 1972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::getAvailableSource(i, source); 1973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)"" + i + ": " + source); 1974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (source.length() == 0) { 1975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: empty source"); 1976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 1977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t nt = Transliterator::countAvailableTargets(source); 1979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (nt < 0 || nt > 255) { 1980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: Bad target count: " + nt); 1981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 1982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t j=0; j<nt; ++j) { 1984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString target; 1985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::getAvailableTarget(j, source, target); 1986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)" " + j + ": " + target); 1987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (target.length() == 0) { 1988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: empty target"); 1989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 1990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t nv = Transliterator::countAvailableVariants(source, target); 1992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (nv < 0 || nv > 255) { 1993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: Bad variant count: " + nv); 1994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 1995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t k=0; k<nv; ++k) { 1997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString variant; 1998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::getAvailableVariant(k, source, target, variant); 1999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (variant.length() == 0) { 2000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)" " + k + ": <empty>"); 2001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 2002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)" " + k + ": " + variant); 2003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Test registration 2009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* IDS[] = { "Fieruwer", "Seoridf-Sweorie", "Oewoir-Oweri/Vsie" }; 2010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* FULL_IDS[] = { "Any-Fieruwer", "Seoridf-Sweorie", "Oewoir-Oweri/Vsie" }; 2011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* SOURCES[] = { NULL, "Seoridf", "Oewoir" }; 2012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=0; i<3; ++i) { 2013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = new TestTrans(IDS[i]); 2014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t == 0) { 2015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: out of memory"); 2016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t->getID() != IDS[i]) { 2019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: ID mismatch for " + IDS[i]); 2020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 2021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::registerInstance(t); 2024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = Transliterator::createInstance(IDS[i], UTRANS_FORWARD, status); 2026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t == NULL) { 2027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: Registration/creation failed for ID " + 2028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IDS[i]); 2029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 2030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)"Ok: Registration/creation succeeded for ID " + 2031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IDS[i]); 2032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 2033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::unregister(IDS[i]); 2035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = Transliterator::createInstance(IDS[i], UTRANS_FORWARD, status); 2036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t != NULL) { 2037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: Unregistration failed for ID " + 2038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru IDS[i]); 2039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 2040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Make sure getAvailable API reflects removal 2044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t n = Transliterator::countAvailableIDs(); 2045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=0; i<n; ++i) { 2046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString id = Transliterator::getAvailableID(i); 2047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (j=0; j<3; ++j) { 2048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (id.caseCompare(FULL_IDS[j],0)==0) { 2049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: unregister(" + id + ") failed"); 2050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru n = Transliterator::countAvailableTargets("Any"); 2054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=0; i<n; ++i) { 2055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString t; 2056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::getAvailableTarget(i, "Any", t); 2057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t.caseCompare(IDS[0],0)==0) { 2058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: unregister(Any-" + t + ") failed"); 2059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru n = Transliterator::countAvailableSources(); 2062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=0; i<n; ++i) { 2063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s; 2064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::getAvailableSource(i, s); 2065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (j=0; j<3; ++j) { 2066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (SOURCES[j] == NULL) continue; 2067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (s.caseCompare(SOURCES[j],0)==0) { 2068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: unregister(" + s + "-*) failed"); 2069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test inverse of Greek-Latin; Title() 2076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestCompoundInverse(void) { 2078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 2079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createInstance 2081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ("Greek-Latin; Title()", UTRANS_REVERSE,parseError, status); 2082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t == 0) { 20836d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("FAIL: createInstance - %s", u_errorName(status)); 2084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString exp("(Title);Latin-Greek"); 2087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t->getID() == exp) { 2088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Ok: inverse of \"Greek-Latin; Title()\" is \"" + 2089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t->getID()); 2090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 2091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: inverse of \"Greek-Latin; Title()\" is \"" + 2092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t->getID() + "\", expected \"" + exp + "\""); 2093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 2095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test NFD chaining with RBT 2099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestNFDChainRBT() { 2101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; 2102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 2103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* t = Transliterator::createFromRules( 2104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "TEST", "::NFD; aa > Q; a > q;", 2105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTRANS_FORWARD, pe, ec); 2106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t == NULL || U_FAILURE(ec)) { 210750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dataerrln("FAIL: Transliterator::createFromRules failed with %s", u_errorName(ec)); 2108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, "aa", "Q"); 2111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 2112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // TEMPORARY TESTS -- BEING DEBUGGED 2114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//=- UnicodeString s, s2; 2115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//=- t = Transliterator::createInstance("Latin-Devanagari", UTRANS_FORWARD, pe, ec); 2116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//=- s = CharsToUnicodeString("rmk\\u1E63\\u0113t"); 2117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//=- s2 = CharsToUnicodeString("\\u0930\\u094D\\u092E\\u094D\\u0915\\u094D\\u0937\\u0947\\u0924\\u094D"); 2118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//=- expect(*t, s, s2); 2119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//=- delete t; 2120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//=- 2121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//=- t = Transliterator::createInstance("Devanagari-Latin", UTRANS_FORWARD, pe, ec); 2122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//=- expect(*t, s2, s); 2123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//=- delete t; 2124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//=- 2125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//=- t = Transliterator::createInstance("Latin-Devanagari;Devanagari-Latin", UTRANS_FORWARD, pe, ec); 2126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//=- s = CharsToUnicodeString("rmk\\u1E63\\u0113t"); 2127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//=- expect(*t, s, s); 2128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//=- delete t; 2129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// const char* source[] = { 2131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// /* 2132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "\\u015Br\\u012Bmad", 2133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "bhagavadg\\u012Bt\\u0101", 2134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "adhy\\u0101ya", 2135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "arjuna", 2136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "vi\\u1E63\\u0101da", 2137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "y\\u014Dga", 2138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "dhr\\u0325tar\\u0101\\u1E63\\u1E6Dra", 2139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "uv\\u0101cr\\u0325", 2140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// */ 2141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "rmk\\u1E63\\u0113t", 2142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// //"dharmak\\u1E63\\u0113tr\\u0113", 2143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// /* 2144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "kuruk\\u1E63\\u0113tr\\u0113", 2145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "samav\\u0113t\\u0101", 2146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "yuyutsava-\\u1E25", 2147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "m\\u0101mak\\u0101-\\u1E25", 2148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// // "p\\u0101\\u1E47\\u1E0Dav\\u0101\\u015Bcaiva", 2149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "kimakurvata", 2150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "san\\u0304java", 2151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// */ 2152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 2153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 0 2154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// }; 2155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// const char* expected[] = { 2156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// /* 2157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "\\u0936\\u094d\\u0930\\u0940\\u092e\\u0926\\u094d", 2158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "\\u092d\\u0917\\u0935\\u0926\\u094d\\u0917\\u0940\\u0924\\u093e", 2159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "\\u0905\\u0927\\u094d\\u092f\\u093e\\u092f", 2160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "\\u0905\\u0930\\u094d\\u091c\\u0941\\u0928", 2161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "\\u0935\\u093f\\u0937\\u093e\\u0926", 2162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "\\u092f\\u094b\\u0917", 2163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "\\u0927\\u0943\\u0924\\u0930\\u093e\\u0937\\u094d\\u091f\\u094d\\u0930", 2164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "\\u0909\\u0935\\u093E\\u091A\\u0943", 2165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// */ 2166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "\\u0927", 2167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// //"\\u0927\\u0930\\u094d\\u092e\\u0915\\u094d\\u0937\\u0947\\u0924\\u094d\\u0930\\u0947", 2168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// /* 2169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "\\u0915\\u0941\\u0930\\u0941\\u0915\\u094d\\u0937\\u0947\\u0924\\u094d\\u0930\\u0947", 2170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "\\u0938\\u092e\\u0935\\u0947\\u0924\\u093e", 2171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "\\u092f\\u0941\\u092f\\u0941\\u0924\\u094d\\u0938\\u0935\\u0903", 2172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "\\u092e\\u093e\\u092e\\u0915\\u093e\\u0903", 2173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// // "\\u092a\\u093e\\u0923\\u094d\\u0921\\u0935\\u093e\\u0936\\u094d\\u091a\\u0948\\u0935", 2174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "\\u0915\\u093f\\u092e\\u0915\\u0941\\u0930\\u094d\\u0935\\u0924", 2175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// "\\u0938\\u0902\\u091c\\u0935", 2176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// */ 2177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 0 2178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// }; 2179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// UErrorCode status = U_ZERO_ERROR; 2180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// UParseError parseError; 2181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// UnicodeString message; 2182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Transliterator* latinToDevToLatin=Transliterator::createInstance("Latin-Devanagari;Devanagari-Latin", UTRANS_FORWARD, parseError, status); 2183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Transliterator* devToLatinToDev=Transliterator::createInstance("Devanagari-Latin;Latin-Devanagari", UTRANS_FORWARD, parseError, status); 2184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// if(U_FAILURE(status)){ 2185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// errln("FAIL: construction " + UnicodeString(" Error: ") + u_errorName(status)); 2186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// errln("PreContext: " + prettify(parseError.preContext) + "PostContext: " + prettify( parseError.postContext) ); 2187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// delete latinToDevToLatin; 2188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// delete devToLatinToDev; 2189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// return; 2190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// } 2191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// UnicodeString gotResult; 2192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// for(int i= 0; source[i] != 0; i++){ 2193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// gotResult = source[i]; 2194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// expect(*latinToDevToLatin,CharsToUnicodeString(source[i]),CharsToUnicodeString(source[i])); 2195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// expect(*devToLatinToDev,CharsToUnicodeString(expected[i]),CharsToUnicodeString(expected[i])); 2196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// } 2197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// delete latinToDevToLatin; 2198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// delete devToLatinToDev; 2199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Inverse of "Null" should be "Null". (J21) 2203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestNullInverse() { 2205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; 2206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 2207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createInstance("Null", UTRANS_FORWARD, pe, ec); 2208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t == 0 || U_FAILURE(ec)) { 2209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: createInstance"); 2210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *u = t->createInverse(ec); 2213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u == 0 || U_FAILURE(ec)) { 2214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: createInverse"); 2215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 2216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u->getID() != "Null") { 2219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: Inverse of Null should be Null"); 2220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 2222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete u; 2223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Check ID of inverse of alias. (J22) 2227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestAliasInverseID() { 2229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString ID("Latin-Hangul", ""); // This should be any alias ID with an inverse 2230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; 2231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 2232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createInstance(ID, UTRANS_FORWARD, pe, ec); 2233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t == 0 || U_FAILURE(ec)) { 22346d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("FAIL: createInstance - %s", u_errorName(ec)); 2235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *u = t->createInverse(ec); 2238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u == 0 || U_FAILURE(ec)) { 2239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: createInverse"); 2240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 2241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString exp = "Hangul-Latin"; 2244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString got = u->getID(); 2245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (got != exp) { 2246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: Inverse of " + ID + " is " + got + 2247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", expected " + exp); 2248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 2250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete u; 2251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test IDs of inverses of compound transliterators. (J20) 2255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestCompoundInverseID() { 2257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString ID = "Latin-Jamo;NFC(NFD)"; 2258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; 2259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 2260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createInstance(ID, UTRANS_FORWARD, pe, ec); 2261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t == 0 || U_FAILURE(ec)) { 22626d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("FAIL: createInstance - %s", u_errorName(ec)); 2263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *u = t->createInverse(ec); 2266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u == 0 || U_FAILURE(ec)) { 2267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: createInverse"); 2268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 2269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString exp = "NFD(NFC);Jamo-Latin"; 2272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString got = u->getID(); 2273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (got != exp) { 2274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: Inverse of " + ID + " is " + got + 2275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", expected " + exp); 2276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 2278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete u; 2279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test undefined variable. 2283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestUndefinedVariable() { 2286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rule = "$initial } a <> \\u1161;"; 2287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; 2288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 2289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createFromRules("<ID>", rule, UTRANS_FORWARD, pe, ec); 2290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 2291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 2292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)"OK: Got exception for " + rule + ", as expected: " + 2293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_errorName(ec)); 2294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"Fail: bogus rule " + rule + " compiled with error " + 2297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_errorName(ec)); 2298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test empty context. 2302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestEmptyContext() { 2304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(" { a } > b;", "xay a ", "xby b "); 2305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Test compound filter ID syntax 2309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 2310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestCompoundFilterID(void) { 2311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* DATA[] = { 2312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Col. 1 = ID or rule set (latter must start with #) 2313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // = columns > 1 are null if expect col. 1 to be illegal = 2315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Col. 2 = direction, "F..." or "R..." 2317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Col. 3 = source string 2318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Col. 4 = exp result 2319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[abc]; [abc]", NULL, NULL, NULL, // multiple filters 2321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Latin-Greek; [abc];", NULL, NULL, NULL, // misplaced filter 2322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[b]; Latin-Greek; Upper; ([xyz])", "F", "abc", "a\\u0392c", 2323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[b]; (Lower); Latin-Greek; Upper(); ([\\u0392])", "R", "\\u0391\\u0392\\u0393", "\\u0391b\\u0393", 2324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "#\n::[b]; ::Latin-Greek; ::Upper; ::([xyz]);", "F", "abc", "a\\u0392c", 2325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "#\n::[b]; ::(Lower); ::Latin-Greek; ::Upper(); ::([\\u0392]);", "R", "\\u0391\\u0392\\u0393", "\\u0391b\\u0393", 2326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL, 2327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i=0; DATA[i]; i+=4) { 2330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString id = CharsToUnicodeString(DATA[i]); 2331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTransDirection direction = (DATA[i+1] != NULL && DATA[i+1][0] == 'R') ? 2332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTRANS_REVERSE : UTRANS_FORWARD; 2333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString source; 2334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString exp; 2335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (DATA[i+2] != NULL) { 2336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru source = CharsToUnicodeString(DATA[i+2]); 2337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru exp = CharsToUnicodeString(DATA[i+3]); 2338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool expOk = (DATA[i+1] != NULL); 2340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* t = NULL; 2341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; 2342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 2343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (id.charAt(0) == 0x23/*#*/) { 2344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = Transliterator::createFromRules("ID", id, direction, pe, ec); 2345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 2346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = Transliterator::createInstance(id, direction, pe, ec); 2347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool ok = (t != NULL && U_SUCCESS(ec)); 2349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString transID; 2350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t!=0) { 2351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru transID = t->getID(); 2352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 2354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru transID = UnicodeString("NULL", ""); 2355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ok == expOk) { 2357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)"Ok: " + id + " => " + transID + ", " + 2358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_errorName(ec)); 2359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (source.length() != 0) { 2360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, source, exp); 2361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 2363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 23646d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln((UnicodeString)"FAIL: " + id + " => " + transID + ", " + 2365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_errorName(ec)); 2366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test new property set syntax 2372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestPropertySet() { 2374c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru expect(UNICODE_STRING_SIMPLE("a>A; \\p{Lu}>x; \\p{ANY}>y;"), "abcDEF", "Ayyxxx"); 2375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect("(.+)>'[' $1 ']';", " a stitch \n in time \r saves 9", 2376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[ a stitch ]\n[ in time ]\r[ saves 9]"); 2377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test various failure points of the new 2.0 engine. 2381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestNewEngine() { 2383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; 2384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 2385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createInstance("Latin-Hiragana", UTRANS_FORWARD, pe, ec); 2386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t == 0 || U_FAILURE(ec)) { 23876d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("FAIL: createInstance Latin-Hiragana - %s", u_errorName(ec)); 2388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Katakana should be untouched 2391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, CharsToUnicodeString("a\\u3042\\u30A2"), 2392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("\\u3042\\u3042\\u30A2")); 2393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 2395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 1 2397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // This test will only work if Transliterator.ROLLBACK is 2398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // true. Otherwise, this test will fail, revealing a 2399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // limitation of global filters in incremental mode. 2400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *a = 2401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::createFromRules("a_to_A", "a > A;", UTRANS_FORWARD, pe, ec); 2402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *A = 2403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::createFromRules("A_to_b", "A > b;", UTRANS_FORWARD, pe, ec); 2404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 2405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete a; 2406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete A; 2407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* array[3]; 2411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru array[0] = a; 2412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru array[1] = Transliterator::createInstance("NFD", UTRANS_FORWARD, pe, ec); 2413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru array[2] = A; 2414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 2415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: createInstance NFD"); 2416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete a; 2417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete A; 2418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete array[1]; 2419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = new CompoundTransliterator(array, 3, new UnicodeSet("[:Ll:]", ec)); 2423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 2424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: UnicodeSet constructor"); 2425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete a; 2426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete A; 2427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete array[1]; 2428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 2429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, "aAaA", "bAbA"); 2433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertTrue("countElements", t->countElements() == 3); 2435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertEquals("getElement(0)", t->getElement(0, ec).getID(), "a_to_A"); 2436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertEquals("getElement(1)", t->getElement(1, ec).getID(), "NFD"); 2437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertEquals("getElement(2)", t->getElement(2, ec).getID(), "A_to_b"); 2438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assertSuccess("getElement", ec); 2439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete a; 2441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete A; 2442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete array[1]; 2443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 2444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 2445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect("$smooth = x; $macron = q; [:^L:] { ([aeiouyAEIOUY] $macron?) } [^aeiouyAEIOUY$smooth$macron] > | $1 $smooth ;", 2447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a", 2448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ax"); 2449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString gr = CharsToUnicodeString( 2451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$ddot = \\u0308 ;" 2452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$lcgvowel = [\\u03b1\\u03b5\\u03b7\\u03b9\\u03bf\\u03c5\\u03c9] ;" 2453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$rough = \\u0314 ;" 2454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "($lcgvowel+ $ddot?) $rough > h | $1 ;" 2455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u03b1 <> a ;" 2456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$rough <> h ;"); 2457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(gr, CharsToUnicodeString("\\u03B1\\u0314"), "ha"); 2459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test quantified segment behavior. We want: 2463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * ([abc])+ > x $1 x; applied to "cba" produces "xax" 2464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestQuantifiedSegment(void) { 2466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // The normal case 2467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect("([abc]+) > x $1 x;", "cba", "xcbax"); 2468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // The tricky case; the quantifier is around the segment 2470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect("([abc])+ > x $1 x;", "cba", "xax"); 2471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Tricky case in reverse direction 2473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect("([abc])+ { q > x $1 x;", "cbaq", "cbaxax"); 2474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Check post-context segment 2476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect("{q} ([a-d])+ > '(' $1 ')';", "ddqcba", "dd(a)cba"); 2477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Test toRule/toPattern for non-quantified segment. 2479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Careful with spacing here. 2480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString r("([a-c]){q} > x $1 x;"); 2481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; 2482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 2483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* t = Transliterator::createFromRules("ID", r, UTRANS_FORWARD, pe, ec); 2484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 2485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: createFromRules"); 2486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 2487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rr; 2490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t->toRules(rr, TRUE); 2491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (r != rr) { 2492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: \"" + r + "\" x toRules() => \"" + rr + "\""); 2493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 2494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)"Ok: \"" + r + "\" x toRules() => \"" + rr + "\""); 2495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 2497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Test toRule/toPattern for quantified segment. 2499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Careful with spacing here. 2500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru r = "([a-c])+{q} > x $1 x;"; 2501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = Transliterator::createFromRules("ID", r, UTRANS_FORWARD, pe, ec); 2502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 2503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: createFromRules"); 2504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 2505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t->toRules(rr, TRUE); 2508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (r != rr) { 2509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: \"" + r + "\" x toRules() => \"" + rr + "\""); 2510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 2511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)"Ok: \"" + r + "\" x toRules() => \"" + rr + "\""); 2512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 2514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//====================================================================== 2517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Ram's tests 2518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//====================================================================== 2519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestDevanagariLatinRT(){ 2520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const int MAX_LEN= 52; 2521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* const source[MAX_LEN] = { 2522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "bh\\u0101rata", 2523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "kra", 2524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "k\\u1E63a", 2525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "khra", 2526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "gra", 2527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1E45ra", 2528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "cra", 2529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "chra", 2530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "j\\u00F1a", 2531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "jhra", 2532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u00F1ra", 2533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1E6Dya", 2534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1E6Dhra", 2535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1E0Dya", 2536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //"r\\u0323ya", // \u095c is not valid in Devanagari 2537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1E0Dhya", 2538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1E5Bhra", 2539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1E47ra", 2540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "tta", 2541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "thra", 2542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "dda", 2543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "dhra", 2544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "nna", 2545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "pra", 2546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "phra", 2547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "bra", 2548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "bhra", 2549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "mra", 2550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1E49ra", 2551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //"l\\u0331ra", 2552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "yra", 2553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1E8Fra", 2554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //"l-", 2555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "vra", 2556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u015Bra", 2557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1E63ra", 2558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "sra", 2559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "hma", 2560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1E6D\\u1E6Da", 2561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1E6D\\u1E6Dha", 2562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1E6Dh\\u1E6Dha", 2563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1E0D\\u1E0Da", 2564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1E0D\\u1E0Dha", 2565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1E6Dya", 2566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1E6Dhya", 2567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1E0Dya", 2568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u1E0Dhya", 2569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Not roundtrippable -- 2570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // \\u0939\\u094d\\u094d\\u092E - hma 2571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // \\u0939\\u094d\\u092E - hma 2572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // CharsToUnicodeString("hma"), 2573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "hya", 2574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u015Br\\u0325", 2575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u015Bca", 2576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0115", 2577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "san\\u0304j\\u012Bb s\\u0113nagupta", 2578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0101nand vaddir\\u0101ju", 2579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0101", 2580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a" 2581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* const expected[MAX_LEN] = { 2583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u092D\\u093E\\u0930\\u0924", /* bha\\u0304rata */ 2584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0915\\u094D\\u0930", /* kra */ 2585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0915\\u094D\\u0937", /* ks\\u0323a */ 2586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0916\\u094D\\u0930", /* khra */ 2587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0917\\u094D\\u0930", /* gra */ 2588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0919\\u094D\\u0930", /* n\\u0307ra */ 2589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u091A\\u094D\\u0930", /* cra */ 2590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u091B\\u094D\\u0930", /* chra */ 2591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u091C\\u094D\\u091E", /* jn\\u0303a */ 2592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u091D\\u094D\\u0930", /* jhra */ 2593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u091E\\u094D\\u0930", /* n\\u0303ra */ 2594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u091F\\u094D\\u092F", /* t\\u0323ya */ 2595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0920\\u094D\\u0930", /* t\\u0323hra */ 2596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0921\\u094D\\u092F", /* d\\u0323ya */ 2597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //"\\u095C\\u094D\\u092F", /* r\\u0323ya */ // \u095c is not valid in Devanagari 2598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0922\\u094D\\u092F", /* d\\u0323hya */ 2599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0922\\u093C\\u094D\\u0930", /* r\\u0323hra */ 2600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0923\\u094D\\u0930", /* n\\u0323ra */ 2601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0924\\u094D\\u0924", /* tta */ 2602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0925\\u094D\\u0930", /* thra */ 2603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0926\\u094D\\u0926", /* dda */ 2604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0927\\u094D\\u0930", /* dhra */ 2605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0928\\u094D\\u0928", /* nna */ 2606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u092A\\u094D\\u0930", /* pra */ 2607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u092B\\u094D\\u0930", /* phra */ 2608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u092C\\u094D\\u0930", /* bra */ 2609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u092D\\u094D\\u0930", /* bhra */ 2610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u092E\\u094D\\u0930", /* mra */ 2611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0929\\u094D\\u0930", /* n\\u0331ra */ 2612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //"\\u0934\\u094D\\u0930", /* l\\u0331ra */ 2613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u092F\\u094D\\u0930", /* yra */ 2614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u092F\\u093C\\u094D\\u0930", /* y\\u0307ra */ 2615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //"l-", 2616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0935\\u094D\\u0930", /* vra */ 2617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0936\\u094D\\u0930", /* s\\u0301ra */ 2618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0937\\u094D\\u0930", /* s\\u0323ra */ 2619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0938\\u094D\\u0930", /* sra */ 2620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0939\\u094d\\u092E", /* hma */ 2621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u091F\\u094D\\u091F", /* t\\u0323t\\u0323a */ 2622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u091F\\u094D\\u0920", /* t\\u0323t\\u0323ha */ 2623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0920\\u094D\\u0920", /* t\\u0323ht\\u0323ha*/ 2624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0921\\u094D\\u0921", /* d\\u0323d\\u0323a */ 2625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0921\\u094D\\u0922", /* d\\u0323d\\u0323ha */ 2626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u091F\\u094D\\u092F", /* t\\u0323ya */ 2627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0920\\u094D\\u092F", /* t\\u0323hya */ 2628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0921\\u094D\\u092F", /* d\\u0323ya */ 2629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0922\\u094D\\u092F", /* d\\u0323hya */ 2630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // "hma", /* hma */ 2631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0939\\u094D\\u092F", /* hya */ 2632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0936\\u0943", /* s\\u0301r\\u0325a */ 2633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0936\\u094D\\u091A", /* s\\u0301ca */ 2634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u090d", /* e\\u0306 */ 2635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0938\\u0902\\u091C\\u0940\\u092C\\u094D \\u0938\\u0947\\u0928\\u0917\\u0941\\u092A\\u094D\\u0924", 2636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0906\\u0928\\u0902\\u0926\\u094D \\u0935\\u0926\\u094D\\u0926\\u093F\\u0930\\u093E\\u091C\\u0941", 2637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0906", 2638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0905", 2639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 2642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString message; 2643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* latinToDev=Transliterator::createInstance("Latin-Devanagari", UTRANS_FORWARD, parseError, status); 2644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* devToLatin=Transliterator::createInstance("Devanagari-Latin", UTRANS_FORWARD, parseError, status); 2645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)){ 26466d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("FAIL: construction " + UnicodeString(" Error: ") + u_errorName(status)); 26476d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("PreContext: " + prettify(parseError.preContext) + " PostContext: " + prettify( parseError.postContext) ); 2648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString gotResult; 2651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(int i= 0; i<MAX_LEN; i++){ 2652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gotResult = source[i]; 2653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*latinToDev,CharsToUnicodeString(source[i]),CharsToUnicodeString(expected[i])); 2654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*devToLatin,CharsToUnicodeString(expected[i]),CharsToUnicodeString(source[i])); 2655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete latinToDev; 2657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete devToLatin; 2658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestTeluguLatinRT(){ 2661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const int MAX_LEN=10; 2662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* const source[MAX_LEN] = { 2663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "raghur\\u0101m vi\\u015Bvan\\u0101dha", /* Raghuram Viswanadha */ 2664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0101nand vaddir\\u0101ju", /* Anand Vaddiraju */ 2665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "r\\u0101j\\u012Bv ka\\u015Barab\\u0101da", /* Rajeev Kasarabada */ 2666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "san\\u0304j\\u012Bv ka\\u015Barab\\u0101da", /* sanjeev kasarabada */ 2667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "san\\u0304j\\u012Bb sen'gupta", /* sanjib sengupata */ 2668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "amar\\u0113ndra hanum\\u0101nula", /* Amarendra hanumanula */ 2669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ravi kum\\u0101r vi\\u015Bvan\\u0101dha", /* Ravi Kumar Viswanadha */ 2670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0101ditya kandr\\u0113gula", /* Aditya Kandregula */ 2671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u015Br\\u012Bdhar ka\\u1E47\\u1E6Dama\\u015Be\\u1E6D\\u1E6Di",/* Shridhar Kantamsetty */ 2672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "m\\u0101dhav de\\u015Be\\u1E6D\\u1E6Di" /* Madhav Desetty */ 2673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* const expected[MAX_LEN] = { 2676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0c30\\u0c18\\u0c41\\u0c30\\u0c3e\\u0c2e\\u0c4d \\u0c35\\u0c3f\\u0c36\\u0c4d\\u0c35\\u0c28\\u0c3e\\u0c27", 2677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0c06\\u0c28\\u0c02\\u0c26\\u0c4d \\u0C35\\u0C26\\u0C4D\\u0C26\\u0C3F\\u0C30\\u0C3E\\u0C1C\\u0C41", 2678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0c30\\u0c3e\\u0c1c\\u0c40\\u0c35\\u0c4d \\u0c15\\u0c36\\u0c30\\u0c2c\\u0c3e\\u0c26", 2679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0c38\\u0c02\\u0c1c\\u0c40\\u0c35\\u0c4d \\u0c15\\u0c36\\u0c30\\u0c2c\\u0c3e\\u0c26", 2680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0c38\\u0c02\\u0c1c\\u0c40\\u0c2c\\u0c4d \\u0c38\\u0c46\\u0c28\\u0c4d\\u0c17\\u0c41\\u0c2a\\u0c4d\\u0c24", 2681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0c05\\u0c2e\\u0c30\\u0c47\\u0c02\\u0c26\\u0c4d\\u0c30 \\u0c39\\u0c28\\u0c41\\u0c2e\\u0c3e\\u0c28\\u0c41\\u0c32", 2682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0c30\\u0c35\\u0c3f \\u0c15\\u0c41\\u0c2e\\u0c3e\\u0c30\\u0c4d \\u0c35\\u0c3f\\u0c36\\u0c4d\\u0c35\\u0c28\\u0c3e\\u0c27", 2683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0c06\\u0c26\\u0c3f\\u0c24\\u0c4d\\u0c2f \\u0C15\\u0C02\\u0C26\\u0C4D\\u0C30\\u0C47\\u0C17\\u0C41\\u0c32", 2684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0c36\\u0c4d\\u0c30\\u0c40\\u0C27\\u0C30\\u0C4D \\u0c15\\u0c02\\u0c1f\\u0c2e\\u0c36\\u0c46\\u0c1f\\u0c4d\\u0c1f\\u0c3f", 2685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0c2e\\u0c3e\\u0c27\\u0c35\\u0c4d \\u0c26\\u0c46\\u0c36\\u0c46\\u0c1f\\u0c4d\\u0c1f\\u0c3f", 2686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 2690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString message; 2691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* latinToDev=Transliterator::createInstance("Latin-Telugu", UTRANS_FORWARD, parseError, status); 2692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* devToLatin=Transliterator::createInstance("Telugu-Latin", UTRANS_FORWARD, parseError, status); 2693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)){ 26946d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("FAIL: construction " + UnicodeString(" Error: ") + u_errorName(status)); 26956d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("PreContext: " + prettify(parseError.preContext) + " PostContext: " + prettify( parseError.postContext) ); 2696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString gotResult; 2699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(int i= 0; i<MAX_LEN; i++){ 2700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gotResult = source[i]; 2701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*latinToDev,CharsToUnicodeString(source[i]),CharsToUnicodeString(expected[i])); 2702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*devToLatin,CharsToUnicodeString(expected[i]),CharsToUnicodeString(source[i])); 2703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete latinToDev; 2705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete devToLatin; 2706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestSanskritLatinRT(){ 2709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const int MAX_LEN =16; 2710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* const source[MAX_LEN] = { 2711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "rmk\\u1E63\\u0113t", 2712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u015Br\\u012Bmad", 2713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "bhagavadg\\u012Bt\\u0101", 2714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "adhy\\u0101ya", 2715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "arjuna", 2716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "vi\\u1E63\\u0101da", 2717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "y\\u014Dga", 2718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "dhr\\u0325tar\\u0101\\u1E63\\u1E6Dra", 2719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "uv\\u0101cr\\u0325", 2720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "dharmak\\u1E63\\u0113tr\\u0113", 2721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "kuruk\\u1E63\\u0113tr\\u0113", 2722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "samav\\u0113t\\u0101", 2723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "yuyutsava\\u1E25", 2724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "m\\u0101mak\\u0101\\u1E25", 2725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // "p\\u0101\\u1E47\\u1E0Dav\\u0101\\u015Bcaiva", 2726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "kimakurvata", 2727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "san\\u0304java", 2728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* const expected[MAX_LEN] = { 2730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0930\\u094D\\u092E\\u094D\\u0915\\u094D\\u0937\\u0947\\u0924\\u094D", 2731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0936\\u094d\\u0930\\u0940\\u092e\\u0926\\u094d", 2732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u092d\\u0917\\u0935\\u0926\\u094d\\u0917\\u0940\\u0924\\u093e", 2733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0905\\u0927\\u094d\\u092f\\u093e\\u092f", 2734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0905\\u0930\\u094d\\u091c\\u0941\\u0928", 2735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0935\\u093f\\u0937\\u093e\\u0926", 2736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u092f\\u094b\\u0917", 2737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0927\\u0943\\u0924\\u0930\\u093e\\u0937\\u094d\\u091f\\u094d\\u0930", 2738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0909\\u0935\\u093E\\u091A\\u0943", 2739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0927\\u0930\\u094d\\u092e\\u0915\\u094d\\u0937\\u0947\\u0924\\u094d\\u0930\\u0947", 2740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0915\\u0941\\u0930\\u0941\\u0915\\u094d\\u0937\\u0947\\u0924\\u094d\\u0930\\u0947", 2741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0938\\u092e\\u0935\\u0947\\u0924\\u093e", 2742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u092f\\u0941\\u092f\\u0941\\u0924\\u094d\\u0938\\u0935\\u0903", 2743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u092e\\u093e\\u092e\\u0915\\u093e\\u0903", 2744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //"\\u092a\\u093e\\u0923\\u094d\\u0921\\u0935\\u093e\\u0936\\u094d\\u091a\\u0948\\u0935", 2745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0915\\u093f\\u092e\\u0915\\u0941\\u0930\\u094d\\u0935\\u0924", 2746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0938\\u0902\\u091c\\u0935", 2747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 2750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString message; 2751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* latinToDev=Transliterator::createInstance("Latin-Devanagari", UTRANS_FORWARD, parseError, status); 2752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* devToLatin=Transliterator::createInstance("Devanagari-Latin", UTRANS_FORWARD, parseError, status); 2753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)){ 27546d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("FAIL: construction " + UnicodeString(" Error: ") + u_errorName(status)); 27556d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("PreContext: " + prettify(parseError.preContext) + " PostContext: " + prettify( parseError.postContext) ); 2756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString gotResult; 2759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(int i= 0; i<MAX_LEN; i++){ 2760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gotResult = source[i]; 2761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*latinToDev,CharsToUnicodeString(source[i]),CharsToUnicodeString(expected[i])); 2762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*devToLatin,CharsToUnicodeString(expected[i]),CharsToUnicodeString(source[i])); 2763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete latinToDev; 2765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete devToLatin; 2766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestCompoundLatinRT(){ 2770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* const source[] = { 2771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "rmk\\u1E63\\u0113t", 2772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u015Br\\u012Bmad", 2773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "bhagavadg\\u012Bt\\u0101", 2774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "adhy\\u0101ya", 2775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "arjuna", 2776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "vi\\u1E63\\u0101da", 2777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "y\\u014Dga", 2778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "dhr\\u0325tar\\u0101\\u1E63\\u1E6Dra", 2779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "uv\\u0101cr\\u0325", 2780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "dharmak\\u1E63\\u0113tr\\u0113", 2781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "kuruk\\u1E63\\u0113tr\\u0113", 2782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "samav\\u0113t\\u0101", 2783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "yuyutsava\\u1E25", 2784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "m\\u0101mak\\u0101\\u1E25", 2785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // "p\\u0101\\u1E47\\u1E0Dav\\u0101\\u015Bcaiva", 2786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "kimakurvata", 2787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "san\\u0304java" 2788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const int MAX_LEN = sizeof(source)/sizeof(source[0]); 2790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* const expected[MAX_LEN] = { 2791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0930\\u094D\\u092E\\u094D\\u0915\\u094D\\u0937\\u0947\\u0924\\u094D", 2792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0936\\u094d\\u0930\\u0940\\u092e\\u0926\\u094d", 2793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u092d\\u0917\\u0935\\u0926\\u094d\\u0917\\u0940\\u0924\\u093e", 2794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0905\\u0927\\u094d\\u092f\\u093e\\u092f", 2795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0905\\u0930\\u094d\\u091c\\u0941\\u0928", 2796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0935\\u093f\\u0937\\u093e\\u0926", 2797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u092f\\u094b\\u0917", 2798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0927\\u0943\\u0924\\u0930\\u093e\\u0937\\u094d\\u091f\\u094d\\u0930", 2799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0909\\u0935\\u093E\\u091A\\u0943", 2800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0927\\u0930\\u094d\\u092e\\u0915\\u094d\\u0937\\u0947\\u0924\\u094d\\u0930\\u0947", 2801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0915\\u0941\\u0930\\u0941\\u0915\\u094d\\u0937\\u0947\\u0924\\u094d\\u0930\\u0947", 2802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0938\\u092e\\u0935\\u0947\\u0924\\u093e", 2803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u092f\\u0941\\u092f\\u0941\\u0924\\u094d\\u0938\\u0935\\u0903", 2804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u092e\\u093e\\u092e\\u0915\\u093e\\u0903", 2805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // "\\u092a\\u093e\\u0923\\u094d\\u0921\\u0935\\u093e\\u0936\\u094d\\u091a\\u0948\\u0935", 2806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0915\\u093f\\u092e\\u0915\\u0941\\u0930\\u094d\\u0935\\u0924", 2807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u0938\\u0902\\u091c\\u0935" 2808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(MAX_LEN != sizeof(expected)/sizeof(expected[0])) { 2810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("error in TestCompoundLatinRT: source[] and expected[] have different lengths!"); 2811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 2816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString message; 2817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* devToLatinToDev =Transliterator::createInstance("Devanagari-Latin;Latin-Devanagari", UTRANS_FORWARD, parseError, status); 2818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* latinToDevToLatin=Transliterator::createInstance("Latin-Devanagari;Devanagari-Latin", UTRANS_FORWARD, parseError, status); 2819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* devToTelToDev =Transliterator::createInstance("Devanagari-Telugu;Telugu-Devanagari", UTRANS_FORWARD, parseError, status); 2820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* latinToTelToLatin=Transliterator::createInstance("Latin-Telugu;Telugu-Latin", UTRANS_FORWARD, parseError, status); 2821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)){ 28236d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("FAIL: construction " + UnicodeString(" Error: ") + u_errorName(status)); 28246d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("PreContext: " + prettify(parseError.preContext) + " PostContext: " + prettify( parseError.postContext) ); 2825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString gotResult; 2828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(int i= 0; i<MAX_LEN; i++){ 2829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gotResult = source[i]; 2830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*devToLatinToDev,CharsToUnicodeString(expected[i]),CharsToUnicodeString(expected[i])); 2831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*latinToDevToLatin,CharsToUnicodeString(source[i]),CharsToUnicodeString(source[i])); 2832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*latinToTelToLatin,CharsToUnicodeString(source[i]),CharsToUnicodeString(source[i])); 2833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete(latinToDevToLatin); 2836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete(devToLatinToDev); 2837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete(devToTelToDev); 2838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete(latinToTelToLatin); 2839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test Gurmukhi-Devanagari Tippi and Bindi 2843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestGurmukhiDevanagari(){ 2845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // the rule says: 2846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // (\u0902) (when preceded by vowel) ---> (\u0A02) 2847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // (\u0902) (when preceded by consonant) ---> (\u0A70) 2848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2849c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeSet vowel(UnicodeString("[\\u0905-\\u090A \\u090F\\u0910\\u0913\\u0914 \\u093e-\\u0942\\u0947\\u0948\\u094B\\u094C\\u094D]", -1, US_INV).unescape(), status); 2850c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeSet non_vowel(UnicodeString("[\\u0915-\\u0928\\u092A-\\u0930]", -1, US_INV).unescape(), status); 2851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 2852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSetIterator vIter(vowel); 2854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSetIterator nvIter(non_vowel); 2855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* trans = Transliterator::createInstance("Devanagari-Gurmukhi",UTRANS_FORWARD, parseError, status); 2856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 28576d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("Error creating transliterator %s", u_errorName(status)); 2858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete trans; 2859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2861c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString src (" \\u0902", -1, US_INV); 2862c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString expected(" \\u0A02", -1, US_INV); 2863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru src = src.unescape(); 2864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expected= expected.unescape(); 2865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(vIter.next()){ 2867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru src.setCharAt(0,(UChar) vIter.getCodepoint()); 2868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expected.setCharAt(0,(UChar) (vIter.getCodepoint()+0x0100)); 2869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*trans,src,expected); 2870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expected.setCharAt(1,0x0A70); 2873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(nvIter.next()){ 2874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //src.setCharAt(0,(char) nvIter.codepoint); 2875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru src.setCharAt(0,(UChar)nvIter.getCodepoint()); 2876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expected.setCharAt(0,(UChar) (nvIter.getCodepoint()+0x0100)); 2877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*trans,src,expected); 2878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete trans; 2880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test instantiation from a locale. 2883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestLocaleInstantiation(void) { 2885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; 2886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 2887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createInstance("ru_RU-Latin", UTRANS_FORWARD, pe, ec); 2888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 28896d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("FAIL: createInstance(ru_RU-Latin) - %s", u_errorName(ec)); 2890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 2891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, CharsToUnicodeString("\\u0430"), "a"); 2894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 2895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = Transliterator::createInstance("en-el", UTRANS_FORWARD, pe, ec); 2897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 2898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: createInstance(en-el)"); 2899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 2900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, "a", CharsToUnicodeString("\\u03B1")); 2903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 2904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test title case handling of accent (should ignore accents) 2908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestTitleAccents(void) { 2910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; 2911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 2912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createInstance("Title", UTRANS_FORWARD, pe, ec); 2913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 2914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: createInstance(Title)"); 2915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 2916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, CharsToUnicodeString("a\\u0300b can't abe"), CharsToUnicodeString("A\\u0300b Can't Abe")); 2919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 2920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Basic test of a locale resource based rule. 2924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestLocaleResource() { 2926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* DATA[] = { 2927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // id from to 2928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //"Latin-Greek/UNGEGN", "b", "\\u03bc\\u03c0", 2929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Latin-el", "b", "\\u03bc\\u03c0", 2930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Latin-Greek", "b", "\\u03B2", 2931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Greek-Latin/UNGEGN", "\\u03B2", "v", 2932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "el-Latin", "\\u03B2", "v", 2933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Greek-Latin", "\\u03B2", "b", 2934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const int32_t DATA_length = sizeof(DATA) / sizeof(DATA[0]); 2936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i=0; i<DATA_length; i+=3) { 2937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; 2938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 2939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createInstance(DATA[i], UTRANS_FORWARD, pe, ec); 2940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 29416d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln((UnicodeString)"FAIL: createInstance(" + DATA[i] + ") - " + u_errorName(ec)); 2942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 2943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 2944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, CharsToUnicodeString(DATA[i+1]), 2946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString(DATA[i+2])); 2947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 2948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Make sure parse errors reference the right line. 2953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestParseError() { 2955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* rule = 2956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a > b;\n" 2957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "# more stuff\n" 2958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "d << b;"; 2959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 2960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; 2961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createFromRules("ID", rule, UTRANS_FORWARD, pe, ec); 2962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 2963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 2964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString err(pe.preContext); 2965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err.append((UChar)124/*|*/).append(pe.postContext); 2966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (err.indexOf("d << b") >= 0) { 2967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Ok: " + err); 2968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 2969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: " + err); 2970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 2973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: no syntax error"); 2974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* maskingRule = 2976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a>x;\n" 2977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "# more stuff\n" 2978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ab>y;"; 2979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ec = U_ZERO_ERROR; 2980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete Transliterator::createFromRules("ID", maskingRule, UTRANS_FORWARD, pe, ec); 2981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ec != U_RULE_MASK_ERROR) { 2982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: returned %s instead of U_RULE_MASK_ERROR", u_errorName(ec)); 2983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else if (UnicodeString("a > x;") != UnicodeString(pe.preContext)) { 2985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: did not get expected precontext"); 2986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else if (UnicodeString("ab > y;") != UnicodeString(pe.postContext)) { 2988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: did not get expected postcontext"); 2989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Make sure sets on output are disallowed. 2994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestOutputSet() { 2996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rule = "$set = [a-cm-n]; b > $set;"; 2997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 2998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; 2999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createFromRules("ID", rule, UTRANS_FORWARD, pe, ec); 3000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 3001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 3002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString err(pe.preContext); 3003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err.append((UChar)124/*|*/).append(pe.postContext); 3004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Ok: " + err); 3005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 3006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: No syntax error"); 3008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test the use variable range pragma, making sure that use of 3012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * variable range characters is detected and flagged as an error. 3013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestVariableRange() { 3015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rule = "use variable range 0x70 0x72; a > A; b > B; q > Q;"; 3016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 3017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; 3018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createFromRules("ID", rule, UTRANS_FORWARD, pe, ec); 3019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 3020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 3021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString err(pe.preContext); 3022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err.append((UChar)124/*|*/).append(pe.postContext); 3023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Ok: " + err); 3024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 3025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: No syntax error"); 3027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test invalid post context error handling 3031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestInvalidPostContext() { 3033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rule = "a}b{c>d;"; 3034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 3035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; 3036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createFromRules("ID", rule, UTRANS_FORWARD, pe, ec); 3037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 3038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 3039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString err(pe.preContext); 3040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err.append((UChar)124/*|*/).append(pe.postContext); 3041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (err.indexOf("a}b{c") >= 0) { 3042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Ok: " + err); 3043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 3044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: " + err); 3045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 3047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: No syntax error"); 3049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test ID form variants 3053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestIDForms() { 3055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* DATA[] = { 3056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "NFC", NULL, "NFD", 3057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "nfd", NULL, "NFC", // make sure case is ignored 3058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Any-NFKD", NULL, "Any-NFKC", 3059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Null", NULL, "Null", 3060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "-nfkc", "nfkc", "NFKD", 3061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "-nfkc/", "nfkc", "NFKD", 3062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Latin-Greek/UNGEGN", NULL, "Greek-Latin/UNGEGN", 3063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Greek/UNGEGN-Latin", "Greek-Latin/UNGEGN", "Latin-Greek/UNGEGN", 3064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Bengali-Devanagari/", "Bengali-Devanagari", "Devanagari-Bengali", 3065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Source-", NULL, NULL, 3066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Source/Variant-", NULL, NULL, 3067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Source-/Variant", NULL, NULL, 3068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "/Variant", NULL, NULL, 3069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "/Variant-", NULL, NULL, 3070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "-/Variant", NULL, NULL, 3071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "-/", NULL, NULL, 3072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "-", NULL, NULL, 3073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "/", NULL, NULL, 3074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 3075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const int32_t DATA_length = sizeof(DATA)/sizeof(DATA[0]); 3076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i=0; i<DATA_length; i+=3) { 3078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* ID = DATA[i]; 3079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* expID = DATA[i+1]; 3080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* expInvID = DATA[i+2]; 3081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool expValid = (expInvID != NULL); 3082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (expID == NULL) { 3083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expID = ID; 3084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; 3086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 3087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = 3088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::createInstance(ID, UTRANS_FORWARD, pe, ec); 3089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 3090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!expValid) { 3091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)"Ok: getInstance(" + ID +") => " + u_errorName(ec)); 3092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 30936d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln((UnicodeString)"FAIL: Couldn't create " + ID + " - " + u_errorName(ec)); 3094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 3096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 3097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *u = t->createInverse(ec); 3099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 3100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: Couldn't create inverse of " + ID); 3101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 3102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete u; 3103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 3104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t->getID() == expID && 3106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u->getID() == expInvID) { 3107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)"Ok: " + ID + ".getInverse() => " + expInvID); 3108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 3109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: getInstance(" + ID + ") => " + 3110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t->getID() + " x getInverse() => " + u->getID() + 3111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", expected " + expInvID); 3112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 3114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete u; 3115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const UChar SPACE[] = {32,0}; 3119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const UChar NEWLINE[] = {10,0}; 3120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const UChar RETURN[] = {13,0}; 3121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const UChar EMPTY[] = {0}; 3122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::checkRules(const UnicodeString& label, Transliterator& t2, 3124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& testRulesForward) { 3125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rules2; t2.toRules(rules2, TRUE); 3126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //rules2 = TestUtility.replaceAll(rules2, new UnicodeSet("[' '\n\r]"), ""); 3127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rules2.findAndReplace(SPACE, EMPTY); 3128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rules2.findAndReplace(NEWLINE, EMPTY); 3129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rules2.findAndReplace(RETURN, EMPTY); 3130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString testRules(testRulesForward); testRules.findAndReplace(SPACE, EMPTY); 3132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (rules2 != testRules) { 3134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(label); 3135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)"GENERATED RULES: " + rules2); 3136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)"SHOULD BE: " + testRulesForward); 3137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Mark's toRules test. 3142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestToRulesMark() { 3144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* testRules = 3145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::[[:Latin:][:Mark:]];" 3146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::NFKD (NFC);" 3147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::Lower (Lower);" 3148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a <> \\u03B1;" // alpha 3149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::NFKC (NFD);" 3150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::Upper (Lower);" 3151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::Lower ();" 3152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::([[:Greek:][:Mark:]]);" 3153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ; 3154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* testRulesForward = 3155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::[[:Latin:][:Mark:]];" 3156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::NFKD(NFC);" 3157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::Lower(Lower);" 3158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a > \\u03B1;" 3159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::NFKC(NFD);" 3160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::Upper (Lower);" 3161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::Lower ();" 3162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ; 3163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* testRulesBackward = 3164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::[[:Greek:][:Mark:]];" 3165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::Lower (Upper);" 3166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::NFD(NFKC);" 3167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\\u03B1 > a;" 3168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::Lower(Lower);" 3169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::NFC(NFKD);" 3170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ; 3171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString source = CharsToUnicodeString("\\u00E1"); // a-acute 3172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString target = CharsToUnicodeString("\\u03AC"); // alpha-acute 3173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; 3175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 3176c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru Transliterator *t2 = Transliterator::createFromRules("source-target", UnicodeString(testRules, -1, US_INV), UTRANS_FORWARD, pe, ec); 3177c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru Transliterator *t3 = Transliterator::createFromRules("target-source", UnicodeString(testRules, -1, US_INV), UTRANS_REVERSE, pe, ec); 3178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 3180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t2; 3181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t3; 31826d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln((UnicodeString)"FAIL: createFromRules => " + u_errorName(ec)); 3183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 3184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t2, source, target); 3187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t3, target, source); 3188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3189c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru checkRules("Failed toRules FORWARD", *t2, UnicodeString(testRulesForward, -1, US_INV)); 3190c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru checkRules("Failed toRules BACKWARD", *t3, UnicodeString(testRulesBackward, -1, US_INV)); 3191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t2; 3193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t3; 3194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test Escape and Unescape transliterators. 3198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestEscape() { 3200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; 3201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec; 3202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t; 3203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ec = U_ZERO_ERROR; 3205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = Transliterator::createInstance("Hex-Any", UTRANS_FORWARD, pe, ec); 3206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 3207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: createInstance"); 3208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 3209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, 3210c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE("\\x{40}\\U000000312Q"), 3211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "@12Q"); 3212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 3214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ec = U_ZERO_ERROR; 3216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = Transliterator::createInstance("Any-Hex/C", UTRANS_FORWARD, pe, ec); 3217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 3218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: createInstance"); 3219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 3220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, 3221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("A\\U0010BEEF\\uFEED"), 3222c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE("\\u0041\\U0010BEEF\\uFEED")); 3223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 3225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ec = U_ZERO_ERROR; 3227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = Transliterator::createInstance("Any-Hex/Java", UTRANS_FORWARD, pe, ec); 3228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 3229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: createInstance"); 3230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 3231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, 3232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("A\\U0010BEEF\\uFEED"), 3233c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE("\\u0041\\uDBEF\\uDEEF\\uFEED")); 3234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 3236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ec = U_ZERO_ERROR; 3238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = Transliterator::createInstance("Any-Hex/Perl", UTRANS_FORWARD, pe, ec); 3239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 3240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: createInstance"); 3241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 3242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, 3243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("A\\U0010BEEF\\uFEED"), 3244c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE("\\x{41}\\x{10BEEF}\\x{FEED}")); 3245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 3247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestAnchorMasking(){ 3251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rule ("^a > Q; a > q;"); 3252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status= U_ZERO_ERROR; 3253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 3254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* t = Transliterator::createFromRules("ID", rule, UTRANS_FORWARD,parseError,status); 3256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)){ 3257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("FAIL: ") + "ID" + 3258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ".createFromRules() => bad rules" + 3259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*", parse error " + parseError.code +*/ 3260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", line " + parseError.line + 3261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", offset " + parseError.offset + 3262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", context " + prettify(parseError.preContext, TRUE) + 3263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", rules: " + prettify(rule, TRUE)); 3264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 3266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Make sure display names of variants look reasonable. 3270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestDisplayName() { 3272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if UCONFIG_NO_FORMATTING 3273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Skipping, UCONFIG_NO_FORMATTING is set\n"); 3274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 3275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 3276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* DATA[] = { 3277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // ID, forward name, reverse name 3278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Update the text as necessary -- the important thing is 3279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // not the text itself, but how various cases are handled. 3280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Basic test 3282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Any-Hex", "Any to Hex Escape", "Hex Escape to Any", 3283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Variants 3285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Any-Hex/Perl", "Any to Hex Escape/Perl", "Hex Escape to Any/Perl", 3286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Target-only IDs 3288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "NFC", "Any to NFC", "Any to NFD", 3289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 3290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t DATA_length = sizeof(DATA) / sizeof(DATA[0]); 3292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale US("en", "US"); 3294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i=0; i<DATA_length; i+=3) { 3296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString name; 3297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::getDisplayName(DATA[i], US, name); 3298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (name != DATA[i+1]) { 32996d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln((UnicodeString)"FAIL: " + DATA[i] + ".getDisplayName() => " + 3300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name + ", expected " + DATA[i+1]); 3301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 3302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)"Ok: " + DATA[i] + ".getDisplayName() => " + name); 3303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 3305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; 3306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createInstance(DATA[i], UTRANS_REVERSE, pe, ec); 3307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 3308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 33096d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("FAIL: createInstance failed - %s", u_errorName(ec)); 3310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 3311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name = Transliterator::getDisplayName(t->getID(), US, name); 3313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (name != DATA[i+2]) { 33146d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln((UnicodeString)"FAIL: " + t->getID() + ".getDisplayName() => " + 3315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name + ", expected " + DATA[i+2]); 3316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 3317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)"Ok: " + t->getID() + ".getDisplayName() => " + name); 3318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 3320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 3322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestSpecialCases(void) { 3325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString registerRules[] = { 3326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Any-Dev1", "x > X; y > Y;", 3327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Any-Dev2", "XY > Z", 3328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Greek-Latin/FAKE", 3329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString 3330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ("[^[:L:][:M:]] { \\u03bc\\u03c0 > b ; \\u03bc\\u03c0 } [^[:L:][:M:]] > b ; [^[:L:][:M:]] { [\\u039c\\u03bc][\\u03a0\\u03c0] > B ; [\\u039c\\u03bc][\\u03a0\\u03c0] } [^[:L:][:M:]] > B ;"), 3331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "" // END MARKER 3332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 3333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString testCases[] = { 3335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // NORMALIZATION 3336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // should add more test cases 3337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "NFD" , CharsToUnicodeString("a\\u0300 \\u00E0 \\u1100\\u1161 \\uFF76\\uFF9E\\u03D3"), "", 3338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "NFC" , CharsToUnicodeString("a\\u0300 \\u00E0 \\u1100\\u1161 \\uFF76\\uFF9E\\u03D3"), "", 3339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "NFKD", CharsToUnicodeString("a\\u0300 \\u00E0 \\u1100\\u1161 \\uFF76\\uFF9E\\u03D3"), "", 3340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "NFKC", CharsToUnicodeString("a\\u0300 \\u00E0 \\u1100\\u1161 \\uFF76\\uFF9E\\u03D3"), "", 3341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // mp -> b BUG 3343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Greek-Latin/UNGEGN", CharsToUnicodeString("(\\u03BC\\u03C0)"), "(b)", 3344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Greek-Latin/FAKE", CharsToUnicodeString("(\\u03BC\\u03C0)"), "(b)", 3345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // check for devanagari bug 3347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "nfd;Dev1;Dev2;nfc", "xy", "Z", 3348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // ff, i, dotless-i, I, dotted-I, LJLjlj deseret deeDEE 3350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Title", CharsToUnicodeString("ab'cD ffi\\u0131I\\u0130 \\u01C7\\u01C8\\u01C9 ") + DESERET_dee + DESERET_DEE, 3351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("Ab'cd Ffi\\u0131ii\\u0307 \\u01C8\\u01C9\\u01C9 ") + DESERET_DEE + DESERET_dee, 3352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //TODO: enable this test once Titlecase works right 3354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 3355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Title", CharsToUnicodeString("\\uFB00i\\u0131I\\u0130 \\u01C7\\u01C8\\u01C9 ") + DESERET_dee + DESERET_DEE, 3356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("Ffi\\u0131ii \\u01C8\\u01C9\\u01C9 ") + DESERET_DEE + DESERET_dee, 3357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Upper", CharsToUnicodeString("ab'cD \\uFB00i\\u0131I\\u0130 \\u01C7\\u01C8\\u01C9 ") + DESERET_dee + DESERET_DEE, 3359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("AB'CD FFIII\\u0130 \\u01C7\\u01C7\\u01C7 ") + DESERET_DEE + DESERET_DEE, 3360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Lower", CharsToUnicodeString("ab'cD \\uFB00i\\u0131I\\u0130 \\u01C7\\u01C8\\u01C9 ") + DESERET_dee + DESERET_DEE, 3361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("ab'cd \\uFB00i\\u0131ii\\u0307 \\u01C9\\u01C9\\u01C9 ") + DESERET_dee + DESERET_dee, 3362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Upper", CharsToUnicodeString("ab'cD \\uFB00i\\u0131I\\u0130 \\u01C7\\u01C8\\u01C9 ") + DESERET_dee + DESERET_DEE, "", 3364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Lower", CharsToUnicodeString("ab'cD \\uFB00i\\u0131I\\u0130 \\u01C7\\u01C8\\u01C9 ") + DESERET_dee + DESERET_DEE, "", 3365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // FORMS OF S 3367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Greek-Latin/UNGEGN", CharsToUnicodeString("\\u03C3 \\u03C3\\u03C2 \\u03C2\\u03C3"), 3368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("s ss s\\u0331s\\u0331") , 3369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Latin-Greek/UNGEGN", CharsToUnicodeString("s ss s\\u0331s\\u0331"), 3370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("\\u03C3 \\u03C3\\u03C2 \\u03C2\\u03C3") , 3371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Greek-Latin", CharsToUnicodeString("\\u03C3 \\u03C3\\u03C2 \\u03C2\\u03C3"), 3372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("s ss s\\u0331s\\u0331") , 3373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Latin-Greek", CharsToUnicodeString("s ss s\\u0331s\\u0331"), 3374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("\\u03C3 \\u03C3\\u03C2 \\u03C2\\u03C3"), 3375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Tatiana bug 3376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Upper: TAT\\u02B9\\u00C2NA 3377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Lower: tat\\u02B9\\u00E2na 3378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Title: Tat\\u02B9\\u00E2na 3379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Upper", CharsToUnicodeString("tat\\u02B9\\u00E2na"), 3380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("TAT\\u02B9\\u00C2NA"), 3381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Lower", CharsToUnicodeString("TAT\\u02B9\\u00C2NA"), 3382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("tat\\u02B9\\u00E2na"), 3383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Title", CharsToUnicodeString("tat\\u02B9\\u00E2na"), 3384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("Tat\\u02B9\\u00E2na"), 3385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "" // END MARKER 3387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 3388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pos; 3390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i; 3391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; registerRules[i].length()!=0; i+=2) { 3392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 3393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createFromRules(registerRules[0+i], 3395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru registerRules[i+1], UTRANS_FORWARD, pos, status); 3396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 33976d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("Fails: Unable to create the transliterator from rules. - %s", u_errorName(status)); 3398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 3399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::registerInstance(t); 3400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; testCases[i].length()!=0; i+=3) { 3403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 3404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; 3405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& name = testCases[i]; 3406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createInstance(name, UTRANS_FORWARD, pe, ec); 3407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 34086d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln((UnicodeString)"FAIL: Couldn't create " + name + " - " + u_errorName(ec)); 3409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 3410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 3411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& id = t->getID(); 3413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& source = testCases[i+1]; 3414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString target; 3415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Automatic generation of targets, to make it simpler to add test cases (and more fail-safe) 3417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (testCases[i+2].length() > 0) { 3419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target = testCases[i+2]; 3420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (0==id.caseCompare("NFD", U_FOLD_CASE_DEFAULT)) { 3421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Normalizer::normalize(source, UNORM_NFD, 0, target, ec); 3422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (0==id.caseCompare("NFC", U_FOLD_CASE_DEFAULT)) { 3423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Normalizer::normalize(source, UNORM_NFC, 0, target, ec); 3424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (0==id.caseCompare("NFKD", U_FOLD_CASE_DEFAULT)) { 3425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Normalizer::normalize(source, UNORM_NFKD, 0, target, ec); 3426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (0==id.caseCompare("NFKC", U_FOLD_CASE_DEFAULT)) { 3427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Normalizer::normalize(source, UNORM_NFKC, 0, target, ec); 3428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (0==id.caseCompare("Lower", U_FOLD_CASE_DEFAULT)) { 3429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target = source; 3430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target.toLower(Locale::getUS()); 3431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (0==id.caseCompare("Upper", U_FOLD_CASE_DEFAULT)) { 3432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target = source; 3433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru target.toUpper(Locale::getUS()); 3434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 3436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: Internal error normalizing " + source); 3437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 3438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, source, target); 3441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 3442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; registerRules[i].length()!=0; i+=2) { 3444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::unregister(registerRules[i]); 3445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruchar* Char32ToEscapedChars(UChar32 ch, char* buffer) { 3449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ch <= 0xFFFF) { 3450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sprintf(buffer, "\\u%04x", (int)ch); 3451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 3452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sprintf(buffer, "\\U%08x", (int)ch); 3453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return buffer; 3455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestSurrogateCasing (void) { 3458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // check that casing handles surrogates 3459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // titlecase is currently defective 3460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char buffer[20]; 3461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar buffer2[20]; 3462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 dee; 346383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius U16_GET(DESERET_dee,0, 0, DESERET_dee.length(), dee); 3464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString DEE(u_totitle(dee)); 3465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (DEE != DESERET_DEE) { 3466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err("Fails titlecase of surrogates"); 3467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err(Char32ToEscapedChars(dee, buffer)); 3468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err(", "); 3469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(Char32ToEscapedChars(DEE.char32At(0), buffer)); 3470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString deeDEETest=DESERET_dee + DESERET_DEE; 3473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString deedeeTest = DESERET_dee + DESERET_dee; 3474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString DEEDEETest = DESERET_DEE + DESERET_DEE; 3475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status= U_ZERO_ERROR; 3476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToUpper(buffer2, 20, deeDEETest.getBuffer(), deeDEETest.length(), NULL, &status); 3478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status) || (UnicodeString(buffer2)!= DEEDEETest)) { 3479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Fails: Can't uppercase surrogates."); 3480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status= U_ZERO_ERROR; 3483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strToLower(buffer2, 20, deeDEETest.getBuffer(), deeDEETest.length(), NULL, &status); 3484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status) || (UnicodeString(buffer2)!= deedeeTest)) { 3485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Fails: Can't lowercase surrogates."); 3486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void _trans(Transliterator& t, const UnicodeString& src, 3490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString& result) { 3491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = src; 3492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t.transliterate(result); 3493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void _trans(const UnicodeString& id, const UnicodeString& src, 3496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString& result, UErrorCode ec) { 3497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; 3498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createInstance(id, UTRANS_FORWARD, pe, ec); 3499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(ec)) { 3500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _trans(*t, src, result); 3501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 3503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UnicodeString _findMatch(const UnicodeString& source, 3506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString* pairs) { 3507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString empty; 3508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i=0; pairs[i].length() > 0; i+=2) { 3509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (0==source.caseCompare(pairs[i], U_FOLD_CASE_DEFAULT)) { 3510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return pairs[i+1]; 3511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return empty; 3514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Check to see that incremental gets at least part way through a reasonable string. 3517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestIncrementalProgress(void) { 3519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 3520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString latinTest = "The Quick Brown Fox."; 3521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString devaTest; 3522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _trans("Latin-Devanagari", latinTest, devaTest, ec); 3523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString kataTest; 3524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _trans("Latin-Katakana", latinTest, kataTest, ec); 3525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 3526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: Internal error"); 3527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 3528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString tests[] = { 3530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Any", latinTest, 3531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Latin", latinTest, 3532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Halfwidth", latinTest, 3533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Devanagari", devaTest, 3534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Katakana", kataTest, 3535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "" // END MARKER 3536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 3537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test("The Quick Brown Fox Jumped Over The Lazy Dog."); 3539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i = 0, j=0, k=0; 3540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t sources = Transliterator::countAvailableSources(); 3541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < sources; i++) { 3542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString source; 3543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::getAvailableSource(i, source); 3544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test = _findMatch(source, tests); 3545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test.length() == 0) { 3546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)"Skipping " + source + "-X"); 3547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 3548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t targets = Transliterator::countAvailableTargets(source); 3550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (j = 0; j < targets; j++) { 3551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString target; 3552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::getAvailableTarget(j, source, target); 3553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t variants = Transliterator::countAvailableVariants(source, target); 3554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (k =0; k< variants; k++) { 3555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString variant; 3556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError err; 3557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 3558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::getAvailableVariant(k, source, target, variant); 3560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString id = source + "-" + target + "/" + variant; 3561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createInstance(id, UTRANS_FORWARD, err, status); 3563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 356450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dataerrln((UnicodeString)"FAIL: Could not create " + id); 3565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 3566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 3567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 3569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CheckIncrementalAux(t, test); 3570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rev; 3572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _trans(*t, test, rev); 3573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *inv = t->createInverse(status); 3574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 357550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if UCONFIG_NO_BREAK_ITERATION 357650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // If UCONFIG_NO_BREAK_ITERATION is on, then only Thai should fail. 357750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (id.compare((UnicodeString)"Latin-Thai/") != 0) 357850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 357950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln((UnicodeString)"FAIL: Could not create inverse of " + id); 358050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 3581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 3582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete inv; 3583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 3584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CheckIncrementalAux(inv, rev); 3586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 3587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete inv; 3588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::CheckIncrementalAux(const Transliterator* t, 3594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& input) { 3595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 3596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTransPosition pos; 3597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test = input; 3598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos.contextStart = 0; 3600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos.contextLimit = input.length(); 3601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos.start = 0; 3602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos.limit = input.length(); 3603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t->transliterate(test, pos, ec); 3605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 3606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: transliterate() error " + u_errorName(ec)); 3607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 3608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool gotError = FALSE; 361059d709d503bab6e2b61931737e662dd293b40578ccornelius (void)gotError; // Suppress set but not used warning. 3611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // we have a few special cases. Any-Remove (pos.start = 0, but also = limit) and U+XXXXX?X? 3613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pos.start == 0 && pos.limit != 0 && t->getID() != "Hex-Any/Unicode") { 3615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"No Progress, " + 3616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t->getID() + ": " + formatInput(test, input, pos)); 3617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gotError = TRUE; 3618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 3619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)"PASS Progress, " + 3620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t->getID() + ": " + formatInput(test, input, pos)); 3621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t->finishTransliteration(test, pos); 3623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pos.start != pos.limit) { 3624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"Incomplete, " + 3625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t->getID() + ": " + formatInput(test, input, pos)); 3626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gotError = TRUE; 3627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestFunction() { 3631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Careful with spacing and ';' here: Phrase this exactly 3632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // as toRules() is going to return it. If toRules() changes 3633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // with regard to spacing or ';', then adjust this string. 3634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rule = 3635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "([:Lu:]) > $1 '(' &Lower( $1 ) '=' &Hex( &Any-Lower( $1 ) ) ')';"; 3636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; 3638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 3639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createFromRules("Test", rule, UTRANS_FORWARD, pe, ec); 3640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t == NULL) { 36416d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("FAIL: createFromRules failed - %s", u_errorName(ec)); 3642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 3643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString r; 3646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t->toRules(r, TRUE); 3647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (r == rule) { 3648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)"OK: toRules() => " + r); 3649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 3650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: toRules() => " + r + 3651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", expected " + rule); 3652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, "The Quick Brown Fox", 3655c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE("T(t=\\u0074)he Q(q=\\u0071)uick B(b=\\u0062)rown F(f=\\u0066)ox")); 3656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 3658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestInvalidBackRef(void) { 3661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rule = ". > $1;"; 3662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rule2 =CharsToUnicodeString("(.) <> &hex/unicode($1) &name($1); . > $1; [{}] >\\u0020;"); 3663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; 3664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 3665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createFromRules("Test", rule, UTRANS_FORWARD, pe, ec); 3666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t2 = Transliterator::createFromRules("Test2", rule2, UTRANS_FORWARD, pe, ec); 3667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t != NULL) { 3669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: createFromRules should have returned NULL"); 3670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 3671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t2 != NULL) { 3674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: createFromRules should have returned NULL"); 3675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t2; 3676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(ec)) { 3679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: Ok: . > $1; => no error"); 3680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 3681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)"Ok: . > $1; => " + u_errorName(ec)); 3682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestMulticharStringSet() { 3686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Basic testing 3687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* rule = 3688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " [{aa}] > x;" 3689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " a > y;" 3690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " [b{bc}] > z;" 3691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[{gd}] { e > q;" 3692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " e } [{fg}] > r;" ; 3693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; 3695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 3696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* t = Transliterator::createFromRules("Test", rule, UTRANS_FORWARD, pe, ec); 3697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t == NULL || U_FAILURE(ec)) { 3698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 3699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: createFromRules failed"); 3700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 3701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, "a aa ab bc d gd de gde gdefg ddefg", 3704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "y x yz z d gd de gdq gdqfg ddrfg"); 3705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 3706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Overlapped string test. Make sure that when multiple 3708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // strings can match that the longest one is matched. 3709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rule = 3710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " [a {ab} {abc}] > x;" 3711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " b > y;" 3712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " c > z;" 3713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " q [t {st} {rst}] { e > p;" ; 3714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = Transliterator::createFromRules("Test", rule, UTRANS_FORWARD, pe, ec); 3716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t == NULL || U_FAILURE(ec)) { 3717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 3718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: createFromRules failed"); 3719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 3720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, "a ab abc qte qste qrste", 3723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "x x x qtp qstp qrstp"); 3724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 3725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv 3728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// BEGIN TestUserFunction support factory 3729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTransliterator* _TUFF[4]; 3731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString* _TUFID[4]; 3732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic Transliterator* U_EXPORT2 _TUFFactory(const UnicodeString& /*ID*/, 3734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::Token context) { 3735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return _TUFF[context.integer]->clone(); 3736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void _TUFReg(const UnicodeString& ID, Transliterator* t, int32_t n) { 3739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _TUFF[n] = t; 3740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _TUFID[n] = new UnicodeString(ID); 3741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::registerFactory(ID, _TUFFactory, Transliterator::integerToken(n)); 3742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void _TUFUnreg(int32_t n) { 3745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (_TUFF[n] != NULL) { 3746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::unregister(*_TUFID[n]); 3747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete _TUFF[n]; 3748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete _TUFID[n]; 3749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// END TestUserFunction support factory 3753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 3754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test that user-registered transliterators can be used under function 3757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * syntax. 3758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestUserFunction() { 3760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* t; 3762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; 3763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 3764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Setup our factory 3766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i; 3767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=0; i<4; ++i) { 3768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _TUFF[i] = NULL; 3769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // There's no need to register inverses if we don't use them 3772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = Transliterator::createFromRules("gif", 3773c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE("'\\'u(..)(..) > '<img src=\"http://www.unicode.org/gifs/24/' $1 '/U' $1$2 '.gif\">';"), 3774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTRANS_FORWARD, pe, ec); 3775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t == NULL || U_FAILURE(ec)) { 37766d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln((UnicodeString)"FAIL: createFromRules gif " + u_errorName(ec)); 3777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 3778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _TUFReg("Any-gif", t, 0); 3780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = Transliterator::createFromRules("RemoveCurly", 3782c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE("[\\{\\}] > ; '\\N' > ;"), 3783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTRANS_FORWARD, pe, ec); 3784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t == NULL || U_FAILURE(ec)) { 3785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: createFromRules RemoveCurly " + u_errorName(ec)); 3786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru goto FAIL; 3787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3788c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru expect(*t, UNICODE_STRING_SIMPLE("\\N{name}"), "name"); 3789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _TUFReg("Any-RemoveCurly", t, 1); 3790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Trying &hex"); 3792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = Transliterator::createFromRules("hex2", 3793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "(.) > &hex($1);", 3794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTRANS_FORWARD, pe, ec); 3795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t == NULL || U_FAILURE(ec)) { 3796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: createFromRules"); 3797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru goto FAIL; 3798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Registering"); 3800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _TUFReg("Any-hex2", t, 2); 3801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = Transliterator::createInstance("Any-hex2", UTRANS_FORWARD, ec); 3802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t == NULL || U_FAILURE(ec)) { 3803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: createInstance Any-hex2 " + u_errorName(ec)); 3804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru goto FAIL; 3805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3806c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru expect(*t, "abc", UNICODE_STRING_SIMPLE("\\u0061\\u0062\\u0063")); 3807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 3808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Trying &gif"); 3810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = Transliterator::createFromRules("gif2", 3811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "(.) > &Gif(&Hex2($1));", 3812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTRANS_FORWARD, pe, ec); 3813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t == NULL || U_FAILURE(ec)) { 3814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: createFromRules gif2 " + u_errorName(ec)); 3815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru goto FAIL; 3816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Registering"); 3818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _TUFReg("Any-gif2", t, 3); 3819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = Transliterator::createInstance("Any-gif2", UTRANS_FORWARD, ec); 3820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t == NULL || U_FAILURE(ec)) { 3821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: createInstance Any-gif2 " + u_errorName(ec)); 3822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru goto FAIL; 3823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, "ab", "<img src=\"http://www.unicode.org/gifs/24/00/U0061.gif\">" 3825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<img src=\"http://www.unicode.org/gifs/24/00/U0062.gif\">"); 3826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 3827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Test that filters are allowed after & 3829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = Transliterator::createFromRules("test", 3830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "(.) > &Hex($1) ' ' &RemoveCurly(&Name($1)) ' ';", 3831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTRANS_FORWARD, pe, ec); 3832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t == NULL || U_FAILURE(ec)) { 3833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: createFromRules test " + u_errorName(ec)); 3834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru goto FAIL; 3835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, "abc", 3837c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE("\\u0061 LATIN SMALL LETTER A \\u0062 LATIN SMALL LETTER B \\u0063 LATIN SMALL LETTER C ")); 3838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 3839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FAIL: 3841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=0; i<4; ++i) { 3842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _TUFUnreg(i); 3843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test the Any-X transliterators. 3848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestAnyX(void) { 3850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 3851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 3852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* anyLatin = 3853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::createInstance("Any-Latin", UTRANS_FORWARD, parseError, status); 3854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (anyLatin==0) { 38556d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("FAIL: createInstance returned NULL - %s", u_errorName(status)); 3856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete anyLatin; 3857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 3858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*anyLatin, 3861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("greek:\\u03B1\\u03B2\\u03BA\\u0391\\u0392\\u039A hiragana:\\u3042\\u3076\\u304F cyrillic:\\u0430\\u0431\\u0446"), 3862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("greek:abkABK hiragana:abuku cyrillic:abc")); 3863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete anyLatin; 3865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3868b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * Test Any-X transliterators with sample letters from all scripts. 3869b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru */ 3870b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid TransliteratorTest::TestAny(void) { 3871b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 3872b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Note: there is a lot of implict construction of UnicodeStrings from (char *) in 3873b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // function call parameters going on in this test. 3874b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UnicodeSet alphabetic("[:alphabetic:]", status); 3875b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_FAILURE(status)) { 38766d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("Failure: file %s, line %d, status = %s", __FILE__, __LINE__, u_errorName(status)); 3877b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 3878b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 3879b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru alphabetic.freeze(); 3880b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 3881b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UnicodeString testString; 3882b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for (int32_t i = 0; i < USCRIPT_CODE_LIMIT; i++) { 3883b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const char *scriptName = uscript_getShortName((UScriptCode)i); 3884b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (scriptName == NULL) { 3885b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errln("Failure: file %s, line %d: Script Code %d is invalid, ", __FILE__, __LINE__, i); 3886b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 3887b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 3888b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 3889b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UnicodeSet sample; 3890b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru sample.applyPropertyAlias("script", scriptName, status); 3891b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_FAILURE(status)) { 3892b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errln("Failure: file %s, line %d, status = %s", __FILE__, __LINE__, u_errorName(status)); 3893b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 3894b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 3895b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru sample.retainAll(alphabetic); 3896b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for (int32_t count=0; count<5; count++) { 3897b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UChar32 c = sample.charAt(count); 3898b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (c == -1) { 3899b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru break; 3900b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 3901b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru testString.append(c); 3902b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 3903b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 3904b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 3905b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UParseError parseError; 3906b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru Transliterator* anyLatin = 3907b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru Transliterator::createInstance("Any-Latin", UTRANS_FORWARD, parseError, status); 3908b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_FAILURE(status)) { 3909b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho dataerrln("Failure: file %s, line %d, status = %s", __FILE__, __LINE__, u_errorName(status)); 3910b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 3911b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 3912b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 3913b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru logln(UnicodeString("Sample set for Any-Latin: ") + testString); 3914b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru anyLatin->transliterate(testString); 3915b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru logln(UnicodeString("Sample result for Any-Latin: ") + testString); 3916b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru delete anyLatin; 3917b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 3918b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 3919b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 3920b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/** 3921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test the source and target set API. These are only implemented 3922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * for RBT and CompoundTransliterator at this time. 3923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestSourceTargetSet() { 3925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 3926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Rules 3928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* r = 3929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a > b; " 3930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "r [x{lu}] > q;"; 3931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Expected source 3933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSet expSrc("[arx{lu}]", ec); 3934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Expected target 3936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSet expTrg("[bq]", ec); 3937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; 3939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* t = Transliterator::createFromRules("test", r, UTRANS_FORWARD, pe, ec); 3940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 3942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 3943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: Couldn't set up test"); 3944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 3945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSet src; t->getSourceSet(src); 3948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSet trg; t->getTargetSet(trg); 3949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (src == expSrc && trg == expTrg) { 3951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString a, b; 3952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)"Ok: " + 3953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru r + " => source = " + src.toPattern(a, TRUE) + 3954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", target = " + trg.toPattern(b, TRUE)); 3955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 3956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString a, b, c, d; 3957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: " + 3958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru r + " => source = " + src.toPattern(a, TRUE) + 3959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", expected " + expSrc.toPattern(b, TRUE) + 3960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "; target = " + trg.toPattern(c, TRUE) + 3961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", expected " + expTrg.toPattern(d, TRUE)); 3962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 3965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3968b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Test handling of Pattern_White_Space, for both RBT and UnicodeSet. 3969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3970b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid TransliteratorTest::TestPatternWhiteSpace() { 3971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Rules 3972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* r = "a > \\u200E b;"; 3973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 3975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; 3976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* t = Transliterator::createFromRules("test", CharsToUnicodeString(r), UTRANS_FORWARD, pe, ec); 3977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 3979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: Couldn't set up test"); 3980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 3981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, "a", "b"); 3982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 3984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // UnicodeSet 3986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ec = U_ZERO_ERROR; 3987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeSet set(CharsToUnicodeString("[a \\u200E]"), ec); 3988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 3990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: Couldn't set up test"); 3991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 3992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (set.contains(0x200E)) { 3993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: U+200E not being ignored by UnicodeSet"); 3994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//====================================================================== 3998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// this method is in TestUScript.java 3999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//====================================================================== 4000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestAllCodepoints(){ 4001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UScriptCode code= USCRIPT_INVALID_CODE; 4002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char id[256]={'\0'}; 4003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char abbr[256]={'\0'}; 4004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char newId[256]={'\0'}; 4005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char newAbbrId[256]={'\0'}; 4006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char oldId[256]={'\0'}; 4007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char oldAbbrId[256]={'\0'}; 4008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status =U_ZERO_ERROR; 4010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; 4011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(uint32_t i = 0; i<=0x10ffff; i++){ 4013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru code = uscript_getScript(i,&status); 4014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(code == USCRIPT_INVALID_CODE){ 4015b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho dataerrln("uscript_getScript for codepoint \\U%08X failed.", i); 4016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* myId = uscript_getName(code); 4018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!myId) { 40196d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("Valid script code returned NULL name. Check your data!"); 4020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 4021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcpy(id,myId); 4023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcpy(abbr,uscript_getShortName(code)); 4024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcpy(newId,"[:"); 4026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcat(newId,id); 4027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcat(newId,":];NFD"); 4028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcpy(newAbbrId,"[:"); 4030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcat(newAbbrId,abbr); 4031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcat(newAbbrId,":];NFD"); 4032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uprv_strcmp(newId,oldId)!=0){ 4034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* t = Transliterator::createInstance(newId,UTRANS_FORWARD,pe,status); 4035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(t==NULL || U_FAILURE(status)){ 4036b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho dataerrln((UnicodeString)"FAIL: Could not create " + id + " - " + u_errorName(status)); 4037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 4039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(uprv_strcmp(newAbbrId,oldAbbrId)!=0){ 4041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* t = Transliterator::createInstance(newAbbrId,UTRANS_FORWARD,pe,status); 4042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(t==NULL || U_FAILURE(status)){ 4043b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho dataerrln((UnicodeString)"FAIL: Could not create " + id + " - " + u_errorName(status)); 4044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 4046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcpy(oldId,newId); 4048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcpy(oldAbbrId, newAbbrId); 4049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TEST_TRANSLIT_ID(id, cls) { \ 4055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; \ 4056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* t = Transliterator::createInstance(id, UTRANS_FORWARD, ec); \ 4057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { \ 40586d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("FAIL: Couldn't create %s - %s", id, u_errorName(ec)); \ 4059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { \ 4060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t->getDynamicClassID() != cls::getStaticClassID()) { \ 4061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: " #cls " dynamic and static class ID mismatch"); \ 4062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } \ 4063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* *t = *t; */ /*can't do this: coverage test for assignment op*/ \ 4064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } \ 4065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; \ 4066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TEST_TRANSLIT_RULE(rule, cls) { \ 4069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; \ 4070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; \ 4071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* t = Transliterator::createFromRules("_", rule, UTRANS_FORWARD, pe, ec); \ 4072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { \ 4073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: Couldn't create " rule); \ 4074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { \ 4075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t->getDynamicClassID() != cls ::getStaticClassID()) { \ 4076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: " #cls " dynamic and static class ID mismatch"); \ 4077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } \ 4078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* *t = *t; */ /*can't do this: coverage test for assignment op*/ \ 4079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } \ 4080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; \ 4081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestBoilerplate() { 4084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_TRANSLIT_ID("Any-Latin", AnyTransliterator); 4085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_TRANSLIT_ID("Any-Hex", EscapeTransliterator); 4086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_TRANSLIT_ID("Hex-Any", UnescapeTransliterator); 4087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_TRANSLIT_ID("Lower", LowercaseTransliterator); 4088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_TRANSLIT_ID("Upper", UppercaseTransliterator); 4089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_TRANSLIT_ID("Title", TitlecaseTransliterator); 4090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_TRANSLIT_ID("Null", NullTransliterator); 4091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_TRANSLIT_ID("Remove", RemoveTransliterator); 4092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_TRANSLIT_ID("Any-Name", UnicodeNameTransliterator); 4093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_TRANSLIT_ID("Name-Any", NameUnicodeTransliterator); 4094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_TRANSLIT_ID("NFD", NormalizationTransliterator); 4095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_TRANSLIT_ID("Latin-Greek", CompoundTransliterator); 4096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_TRANSLIT_RULE("a>b;", RuleBasedTransliterator); 4097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestAlternateSyntax() { 4100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // U+2206 == & 4101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // U+2190 == < 4102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // U+2192 == > 4103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // U+2194 == <> 4104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(CharsToUnicodeString("a \\u2192 x; b \\u2190 y; c \\u2194 z"), 4105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "abc", 4106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "xbz"); 4107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(CharsToUnicodeString("([:^ASCII:]) \\u2192 \\u2206Name($1);"), 4108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CharsToUnicodeString("<=\\u2190; >=\\u2192; <>=\\u2194; &=\\u2206"), 4109c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UNICODE_STRING_SIMPLE("<=\\N{LEFTWARDS ARROW}; >=\\N{RIGHTWARDS ARROW}; <>=\\N{LEFT RIGHT ARROW}; &=\\N{INCREMENT}")); 4110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* BEGIN_END_RULES[] = { 4113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // [0] 4114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "abc > xy;" 4115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "aba > z;", 4116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // [1] 4118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 4119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::BEGIN;" 4120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "abc > xy;" 4121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::END;" 4122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::BEGIN;" 4123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "aba > z;" 4124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::END;", 4125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 4126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "", // test case commented out below, this is here to keep from messing up the indexes 4127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // [2] 4129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 4130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "abc > xy;" 4131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::BEGIN;" 4132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "aba > z;" 4133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::END;", 4134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 4135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "", // test case commented out below, this is here to keep from messing up the indexes 4136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // [3] 4138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 4139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::BEGIN;" 4140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "abc > xy;" 4141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::END;" 4142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "aba > z;", 4143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 4144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "", // test case commented out below, this is here to keep from messing up the indexes 4145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // [4] 4147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "abc > xy;" 4148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::Null;" 4149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "aba > z;", 4150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // [5] 4152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::Upper;" 4153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ABC > xy;" 4154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "AB > x;" 4155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "C > z;" 4156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::Upper;" 4157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "XYZ > p;" 4158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "XY > q;" 4159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Z > r;" 4160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::Upper;", 4161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // [6] 4163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$ws = [[:Separator:][\\u0009-\\u000C]$];" 4164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$delim = [\\-$ws];" 4165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$ws $delim* > ' ';" 4166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "'-' $delim* > '-';", 4167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // [7] 4169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::Null;" 4170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$ws = [[:Separator:][\\u0009-\\u000C]$];" 4171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$delim = [\\-$ws];" 4172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$ws $delim* > ' ';" 4173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "'-' $delim* > '-';", 4174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // [8] 4176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$ws = [[:Separator:][\\u0009-\\u000C]$];" 4177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$delim = [\\-$ws];" 4178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$ws $delim* > ' ';" 4179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "'-' $delim* > '-';" 4180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::Null;", 4181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // [9] 4183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$ws = [[:Separator:][\\u0009-\\u000C]$];" 4184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$delim = [\\-$ws];" 4185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::Null;" 4186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$ws $delim* > ' ';" 4187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "'-' $delim* > '-';", 4188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // [10] 4190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 4191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::BEGIN;" 4192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$ws = [[:Separator:][\\u0009-\\u000C]$];" 4193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$delim = [\\-$ws];" 4194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::END;" 4195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$ws $delim* > ' ';" 4196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "'-' $delim* > '-';", 4197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 4198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "", // test case commented out below, this is here to keep from messing up the indexes 4199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // [11] 4201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 4202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$ws = [[:Separator:][\\u0009-\\u000C]$];" 4203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$delim = [\\-$ws];" 4204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::BEGIN;" 4205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$ws $delim* > ' ';" 4206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "'-' $delim* > '-';" 4207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::END;", 4208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 4209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "", // test case commented out below, this is here to keep from messing up the indexes 4210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // [12] 4212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 4213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$ws = [[:Separator:][\\u0009-\\u000C]$];" 4214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$delim = [\\-$ws];" 4215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$ab = [ab];" 4216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::BEGIN;" 4217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$ws $delim* > ' ';" 4218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "'-' $delim* > '-';" 4219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::END;" 4220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::BEGIN;" 4221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$ab { ' ' } $ab > '-';" 4222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "c { ' ' > ;" 4223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::END;" 4224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::BEGIN;" 4225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "'a-a' > a\\%|a;" 4226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::END;", 4227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 4228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "", // test case commented out below, this is here to keep from messing up the indexes 4229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // [13] 4231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$ws = [[:Separator:][\\u0009-\\u000C]$];" 4232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$delim = [\\-$ws];" 4233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$ab = [ab];" 4234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::Null;" 4235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$ws $delim* > ' ';" 4236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "'-' $delim* > '-';" 4237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::Null;" 4238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$ab { ' ' } $ab > '-';" 4239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "c { ' ' > ;" 4240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::Null;" 4241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "'a-a' > a\\%|a;", 4242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // [14] 4244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 4245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::[abc];" 4246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::BEGIN;" 4247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "abc > xy;" 4248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::END;" 4249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::BEGIN;" 4250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "aba > yz;" 4251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::END;" 4252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::Upper;", 4253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 4254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "", // test case commented out below, this is here to keep from messing up the indexes 4255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // [15] 4257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::[abc];" 4258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "abc > xy;" 4259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::Null;" 4260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "aba > yz;" 4261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::Upper;", 4262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // [16] 4264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 4265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::[abc];" 4266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::BEGIN;" 4267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "abc <> xy;" 4268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::END;" 4269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::BEGIN;" 4270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "aba <> yz;" 4271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::END;" 4272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::Upper(Lower);" 4273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::([XYZ]);" 4274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 4275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "", // test case commented out below, this is here to keep from messing up the indexes 4276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // [17] 4278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::[abc];" 4279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "abc <> xy;" 4280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::Null;" 4281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "aba <> yz;" 4282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::Upper(Lower);" 4283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::([XYZ]);" 4284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 4285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 4287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru(This entire test is commented out below and will need some heavy revision when we re-add 4288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruthe ::BEGIN/::END stuff) 4289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* BOGUS_BEGIN_END_RULES[] = { 4290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // [7] 4291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::BEGIN;" 4292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "abc > xy;" 4293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::BEGIN;" 4294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "aba > z;" 4295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::END;" 4296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::END;", 4297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // [8] 4299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "abc > xy;" 4300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " aba > z;" 4301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::END;", 4302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // [9] 4304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::BEGIN;" 4305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::Upper;" 4306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::END;" 4307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 4308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const int32_t BOGUS_BEGIN_END_RULES_length = (int32_t)(sizeof(BOGUS_BEGIN_END_RULES) / sizeof(BOGUS_BEGIN_END_RULES[0])); 4309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 4310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* BEGIN_END_TEST_CASES[] = { 4312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // rules input expected output 4313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru BEGIN_END_RULES[0], "abc ababc aba", "xy zbc z", 4314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// BEGIN_END_RULES[1], "abc ababc aba", "xy abxy z", 4315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// BEGIN_END_RULES[2], "abc ababc aba", "xy abxy z", 4316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// BEGIN_END_RULES[3], "abc ababc aba", "xy abxy z", 4317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru BEGIN_END_RULES[4], "abc ababc aba", "xy abxy z", 4318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru BEGIN_END_RULES[5], "abccabaacababcbc", "PXAARXQBR", 4319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru BEGIN_END_RULES[6], "e e - e---e- e", "e e e-e-e", 4321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru BEGIN_END_RULES[7], "e e - e---e- e", "e e e-e-e", 4322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru BEGIN_END_RULES[8], "e e - e---e- e", "e e e-e-e", 4323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru BEGIN_END_RULES[9], "e e - e---e- e", "e e e-e-e", 4324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// BEGIN_END_RULES[10], "e e - e---e- e", "e e e-e-e", 4325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// BEGIN_END_RULES[11], "e e - e---e- e", "e e e-e-e", 4326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// BEGIN_END_RULES[12], "e e - e---e- e", "e e e-e-e", 4327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// BEGIN_END_RULES[12], "a a a a", "a%a%a%a", 4328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// BEGIN_END_RULES[12], "a a-b c b a", "a%a-b cb-a", 4329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru BEGIN_END_RULES[13], "e e - e---e- e", "e e e-e-e", 4330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru BEGIN_END_RULES[13], "a a a a", "a%a%a%a", 4331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru BEGIN_END_RULES[13], "a a-b c b a", "a%a-b cb-a", 4332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// BEGIN_END_RULES[14], "abc xy ababc xyz aba", "XY xy ABXY xyz YZ", 4334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru BEGIN_END_RULES[15], "abc xy ababc xyz aba", "XY xy ABXY xyz YZ", 4335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// BEGIN_END_RULES[16], "abc xy ababc xyz aba", "XY xy ABXY xyz YZ", 4336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru BEGIN_END_RULES[17], "abc xy ababc xyz aba", "XY xy ABXY xyz YZ" 4337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 4338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const int32_t BEGIN_END_TEST_CASES_length = (int32_t)(sizeof(BEGIN_END_TEST_CASES) / sizeof(BEGIN_END_TEST_CASES[0])); 4339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestBeginEnd() { 4341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // run through the list of test cases above 4342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i = 0; 4343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < BEGIN_END_TEST_CASES_length; i += 3) { 4344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect((UnicodeString)"Test case #" + (i / 3), 4345c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString(BEGIN_END_TEST_CASES[i], -1, US_INV), 4346c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString(BEGIN_END_TEST_CASES[i + 1], -1, US_INV), 4347c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString(BEGIN_END_TEST_CASES[i + 2], -1, US_INV)); 4348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // instantiate the one reversible rule set in the reverse direction and make sure it does the right thing 4351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 4352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 4353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* reversed = Transliterator::createFromRules("Reversed", UnicodeString(BEGIN_END_RULES[17]), 4354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTRANS_REVERSE, parseError, status); 4355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (reversed == 0 || U_FAILURE(status)) { 4356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru reportParseError(UnicodeString("FAIL: Couldn't create reversed transliterator"), parseError, status); 4357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*reversed, UnicodeString("xy XY XYZ yz YZ"), UnicodeString("xy abc xaba yz aba")); 4359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete reversed; 4361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // finally, run through the list of syntactically-ill-formed rule sets above and make sure 4363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // that all of them cause errors 4364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 4365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru(commented out until we have the real ::BEGIN/::END stuff in place 4366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < BOGUS_BEGIN_END_RULES_length; i++) { 4367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 4368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 4369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* t = Transliterator::createFromRules("foo", UnicodeString(BOGUS_BEGIN_END_RULES[i]), 4370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTRANS_FORWARD, parseError, status); 4371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!U_FAILURE(status)) { 4372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 4373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"Should have gotten syntax error from " + BOGUS_BEGIN_END_RULES[i]); 4374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 4377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestBeginEndToRules() { 4380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // run through the same list of test cases we used above, but this time, instead of just 4381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // instantiating a Transliterator from the rules and running the test against it, we instantiate 4382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // a Transliterator from the rules, do toRules() on it, instantiate a Transliterator from 4383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // the resulting set of rules, and make sure that the generated rule set is semantically equivalent 4384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // to (i.e., does the same thing as) the original rule set 4385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i = 0; i < BEGIN_END_TEST_CASES_length; i += 3) { 4386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 4387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 4388c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru Transliterator* t = Transliterator::createFromRules("--", UnicodeString(BEGIN_END_TEST_CASES[i], -1, US_INV), 4389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTRANS_FORWARD, parseError, status); 4390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 4391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru reportParseError(UnicodeString("FAIL: Couldn't create transliterator"), parseError, status); 4392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rules; 4394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t->toRules(rules, TRUE); 4395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* t2 = Transliterator::createFromRules((UnicodeString)"Test case #" + (i / 3), rules, 4396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTRANS_FORWARD, parseError, status); 4397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 4398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru reportParseError(UnicodeString("FAIL: Couldn't create transliterator from generated rules"), 4399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parseError, status); 4400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 4401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t2, 4403c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString(BEGIN_END_TEST_CASES[i + 1], -1, US_INV), 4404c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString(BEGIN_END_TEST_CASES[i + 2], -1, US_INV)); 4405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 4406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t2; 4407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // do the same thing for the reversible test case 4412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 4413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 4414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* reversed = Transliterator::createFromRules("Reversed", UnicodeString(BEGIN_END_RULES[17]), 4415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTRANS_REVERSE, parseError, status); 4416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 4417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru reportParseError(UnicodeString("FAIL: Couldn't create reversed transliterator"), parseError, status); 4418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rules; 4420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru reversed->toRules(rules, FALSE); 4421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* reversed2 = Transliterator::createFromRules("Reversed", rules, UTRANS_FORWARD, 4422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parseError, status); 4423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 4424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru reportParseError(UnicodeString("FAIL: Couldn't create reversed transliterator from generated rules"), 4425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parseError, status); 4426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete reversed; 4427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*reversed2, 4429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString("xy XY XYZ yz YZ"), 4430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString("xy abc xaba yz aba")); 4431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete reversed; 4432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete reversed2; 4433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestRegisterAlias() { 4438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString longID("Lower;[aeiou]Upper"); 4439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString shortID("Any-CapVowels"); 4440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString reallyShortID("CapVowels"); 4441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::registerAlias(shortID, longID); 4443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode err = U_ZERO_ERROR; 4445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* t1 = Transliterator::createInstance(longID, UTRANS_FORWARD, err); 4446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(err)) { 4447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Failed to instantiate transliterator with long ID"); 4448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::unregister(shortID); 4449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 4450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* t2 = Transliterator::createInstance(reallyShortID, UTRANS_FORWARD, err); 4452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(err)) { 4453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Failed to instantiate transliterator with short ID"); 4454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t1; 4455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::unregister(shortID); 4456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 4457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t1->getID() != longID) 4460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Transliterator instantiated with long ID doesn't have long ID"); 4461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (t2->getID() != reallyShortID) 4462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Transliterator instantiated with short ID doesn't have short ID"); 4463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rules1; 4465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rules2; 4466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t1->toRules(rules1, TRUE); 4468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t2->toRules(rules2, TRUE); 4469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (rules1 != rules2) 4470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Alias transliterators aren't the same"); 4471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t1; 4473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t2; 4474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::unregister(shortID); 4475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t1 = Transliterator::createInstance(shortID, UTRANS_FORWARD, err); 4477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(err)) { 4478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Instantiation with short ID succeeded after short ID was unregistered"); 4479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t1; 4480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // try the same thing again, but this time with something other than 4483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // an instance of CompoundTransliterator 4484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString realID("Latin-Greek"); 4485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString fakeID("Latin-dlgkjdflkjdl"); 4486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::registerAlias(fakeID, realID); 4487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_ZERO_ERROR; 4489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t1 = Transliterator::createInstance(realID, UTRANS_FORWARD, err); 4490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(err)) { 44916d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("Failed to instantiate transliterator with real ID - %s", u_errorName(err)); 4492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::unregister(realID); 4493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 4494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t2 = Transliterator::createInstance(fakeID, UTRANS_FORWARD, err); 4496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(err)) { 4497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Failed to instantiate transliterator with fake ID"); 4498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t1; 4499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::unregister(realID); 4500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 4501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t1->toRules(rules1, TRUE); 4504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t2->toRules(rules2, TRUE); 4505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (rules1 != rules2) 4506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Alias transliterators aren't the same"); 4507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t1; 4509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t2; 4510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator::unregister(fakeID); 4511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::TestRuleStripping() { 4514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 4515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# 4516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru\uE001>\u0C01; # SIGN 4517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 4518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar rule[] = { 4519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0023,0x0020,0x000D,0x000A, 4520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xE001,0x003E,0x0C01,0x003B,0x0020,0x0023,0x0020,0x0053,0x0049,0x0047,0x004E,0 4521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 4522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar expectedRule[] = { 4523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xE001,0x003E,0x0C01,0x003B,0 4524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 4525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar result[sizeof(rule)/sizeof(rule[0])]; 4526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 4527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t len = utrans_stripRules(rule, (int32_t)(sizeof(rule)/sizeof(rule[0])), result, &status); 4528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (len != u_strlen(expectedRule)) { 4529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("utrans_stripRules return len = %d", len); 4530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (u_strncmp(expectedRule, result, len) != 0) { 4532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("utrans_stripRules did not return expected string"); 4533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4536c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru/** 4537c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * Test the Halfwidth-Fullwidth transliterator (ticket 6281). 4538c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */ 4539c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid TransliteratorTest::TestHalfwidthFullwidth(void) { 4540c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UParseError parseError; 4541c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 4542c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru Transliterator* hf = Transliterator::createInstance("Halfwidth-Fullwidth", UTRANS_FORWARD, parseError, status); 4543c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru Transliterator* fh = Transliterator::createInstance("Fullwidth-Halfwidth", UTRANS_FORWARD, parseError, status); 4544c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (hf == 0 || fh == 0) { 45456d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("FAIL: createInstance failed - %s", u_errorName(status)); 4546c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru delete hf; 4547c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru delete fh; 4548c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 4549c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 4550c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 4551c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // Array of 2n items 4552c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // Each item is 4553c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // "hf"|"fh"|"both", 4554c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // <Halfwidth>, 4555c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // <Fullwidth> 4556c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const char* DATA[] = { 4557c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru "both", 4558c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru "\\uFFE9\\uFFEA\\uFFEB\\uFFEC\\u0061\\uFF71\\u00AF\\u0020", 4559c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru "\\u2190\\u2191\\u2192\\u2193\\uFF41\\u30A2\\uFFE3\\u3000", 4560c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru }; 4561c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t DATA_length = (int32_t)(sizeof(DATA) / sizeof(DATA[0])); 4562c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 4563c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru for (int32_t i=0; i<DATA_length; i+=3) { 4564c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString h = CharsToUnicodeString(DATA[i+1]); 4565c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString f = CharsToUnicodeString(DATA[i+2]); 4566c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru switch (*DATA[i]) { 4567c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case 0x68: //'h': // Halfwidth-Fullwidth only 4568c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru expect(*hf, h, f); 4569c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru break; 4570c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case 0x66: //'f': // Fullwidth-Halfwidth only 4571c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru expect(*fh, f, h); 4572c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru break; 4573c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru case 0x62: //'b': // both directions 4574c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru expect(*hf, h, f); 4575c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru expect(*fh, f, h); 4576c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru break; 4577c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 4578c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 4579c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru delete hf; 4580c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru delete fh; 4581c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 4582c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 4583b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 4584b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /** 4585b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * Test Thai. The text is the first paragraph of "What is Unicode" from the Unicode.org web site. 4586b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * TODO: confirm that the expected results are correct. 4587b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * For now, test just confirms that C++ and Java give identical results. 4588b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru */ 4589b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid TransliteratorTest::TestThai(void) { 459050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_BREAK_ITERATION 4591b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UParseError parseError; 4592b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 4593b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru Transliterator* tr = Transliterator::createInstance("Any-Latin", UTRANS_FORWARD, parseError, status); 4594b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (tr == 0) { 45956d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("FAIL: createInstance failed - %s", u_errorName(status)); 4596b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 4597b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 4598b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_FAILURE(status)) { 4599b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errln("FAIL: createInstance failed with %s", u_errorName(status)); 4600b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 4601b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 4602b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const char *thaiText = 4603b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0e42\\u0e14\\u0e22\\u0e1e\\u0e37\\u0e49\\u0e19\\u0e10\\u0e32\\u0e19\\u0e41\\u0e25\\u0e49\\u0e27, \\u0e04\\u0e2d" 4604b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0e21\\u0e1e\\u0e34\\u0e27\\u0e40\\u0e15\\u0e2d\\u0e23\\u0e4c\\u0e08\\u0e30\\u0e40\\u0e01\\u0e35\\u0e48\\u0e22" 4605b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0e27\\u0e02\\u0e49\\u0e2d\\u0e07\\u0e01\\u0e31\\u0e1a\\u0e40\\u0e23\\u0e37\\u0e48\\u0e2d\\u0e07\\u0e02\\u0e2d" 4606b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0e07\\u0e15\\u0e31\\u0e27\\u0e40\\u0e25\\u0e02. \\u0e04\\u0e2d\\u0e21\\u0e1e\\u0e34\\u0e27\\u0e40\\u0e15\\u0e2d" 4607b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0e23\\u0e4c\\u0e08\\u0e31\\u0e14\\u0e40\\u0e01\\u0e47\\u0e1a\\u0e15\\u0e31\\u0e27\\u0e2d\\u0e31\\u0e01\\u0e29" 4608b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0e23\\u0e41\\u0e25\\u0e30\\u0e2d\\u0e31\\u0e01\\u0e02\\u0e23\\u0e30\\u0e2d\\u0e37\\u0e48\\u0e19\\u0e46 \\u0e42" 4609b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0e14\\u0e22\\u0e01\\u0e32\\u0e23\\u0e01\\u0e33\\u0e2b\\u0e19\\u0e14\\u0e2b\\u0e21\\u0e32\\u0e22\\u0e40\\u0e25" 4610b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0e02\\u0e43\\u0e2b\\u0e49\\u0e2a\\u0e33\\u0e2b\\u0e23\\u0e31\\u0e1a\\u0e41\\u0e15\\u0e48\\u0e25\\u0e30\\u0e15" 4611b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0e31\\u0e27. \\u0e01\\u0e48\\u0e2d\\u0e19\\u0e2b\\u0e19\\u0e49\\u0e32\\u0e17\\u0e35\\u0e48\\u0e4a Unicode \\u0e08" 4612b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0e30\\u0e16\\u0e39\\u0e01\\u0e2a\\u0e23\\u0e49\\u0e32\\u0e07\\u0e02\\u0e36\\u0e49\\u0e19, \\u0e44\\u0e14\\u0e49" 4613b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0e21\\u0e35\\u0e23\\u0e30\\u0e1a\\u0e1a encoding \\u0e2d\\u0e22\\u0e39\\u0e48\\u0e2b\\u0e25\\u0e32\\u0e22\\u0e23" 4614b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0e49\\u0e2d\\u0e22\\u0e23\\u0e30\\u0e1a\\u0e1a\\u0e2a\\u0e33\\u0e2b\\u0e23\\u0e31\\u0e1a\\u0e01\\u0e32\\u0e23" 4615b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0e01\\u0e33\\u0e2b\\u0e19\\u0e14\\u0e2b\\u0e21\\u0e32\\u0e22\\u0e40\\u0e25\\u0e02\\u0e40\\u0e2b\\u0e25\\u0e48" 4616b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0e32\\u0e19\\u0e35\\u0e49. \\u0e44\\u0e21\\u0e48\\u0e21\\u0e35 encoding \\u0e43\\u0e14\\u0e17\\u0e35\\u0e48" 4617b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0e21\\u0e35\\u0e08\\u0e33\\u0e19\\u0e27\\u0e19\\u0e15\\u0e31\\u0e27\\u0e2d\\u0e31\\u0e01\\u0e02\\u0e23\\u0e30" 4618b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0e21\\u0e32\\u0e01\\u0e40\\u0e1e\\u0e35\\u0e22\\u0e07\\u0e1e\\u0e2d: \\u0e22\\u0e01\\u0e15\\u0e31\\u0e27\\u0e2d" 4619b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0e22\\u0e48\\u0e32\\u0e07\\u0e40\\u0e0a\\u0e48\\u0e19, \\u0e40\\u0e09\\u0e1e\\u0e32\\u0e30\\u0e43\\u0e19\\u0e01" 4620b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0e25\\u0e38\\u0e48\\u0e21\\u0e2a\\u0e2b\\u0e20\\u0e32\\u0e1e\\u0e22\\u0e38\\u0e42\\u0e23\\u0e1b\\u0e40\\u0e1e" 4621b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0e35\\u0e22\\u0e07\\u0e41\\u0e2b\\u0e48\\u0e07\\u0e40\\u0e14\\u0e35\\u0e22\\u0e27 \\u0e01\\u0e47\\u0e15\\u0e49" 4622b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0e2d\\u0e07\\u0e01\\u0e32\\u0e23\\u0e2b\\u0e25\\u0e32\\u0e22 encoding \\u0e43\\u0e19\\u0e01\\u0e32\\u0e23\\u0e04" 4623b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0e23\\u0e2d\\u0e1a\\u0e04\\u0e25\\u0e38\\u0e21\\u0e17\\u0e38\\u0e01\\u0e20\\u0e32\\u0e29\\u0e32\\u0e43\\u0e19" 4624b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0e01\\u0e25\\u0e38\\u0e48\\u0e21. \\u0e2b\\u0e23\\u0e37\\u0e2d\\u0e41\\u0e21\\u0e49\\u0e41\\u0e15\\u0e48\\u0e43" 4625b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0e19\\u0e20\\u0e32\\u0e29\\u0e32\\u0e40\\u0e14\\u0e35\\u0e48\\u0e22\\u0e27 \\u0e40\\u0e0a\\u0e48\\u0e19 \\u0e20" 4626b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0e32\\u0e29\\u0e32\\u0e2d\\u0e31\\u0e07\\u0e01\\u0e24\\u0e29 \\u0e01\\u0e47\\u0e44\\u0e21\\u0e48\\u0e21\\u0e35" 4627b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru " encoding \\u0e43\\u0e14\\u0e17\\u0e35\\u0e48\\u0e40\\u0e1e\\u0e35\\u0e22\\u0e07\\u0e1e\\u0e2d\\u0e2a\\u0e33\\u0e2b" 4628b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0e23\\u0e31\\u0e1a\\u0e17\\u0e38\\u0e01\\u0e15\\u0e31\\u0e27\\u0e2d\\u0e31\\u0e01\\u0e29\\u0e23, \\u0e40\\u0e04" 4629b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0e23\\u0e37\\u0e48\\u0e2d\\u0e07\\u0e2b\\u0e21\\u0e32\\u0e22\\u0e27\\u0e23\\u0e23\\u0e04\\u0e15\\u0e2d\\u0e19" 4630b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru " \\u0e41\\u0e25\\u0e30\\u0e2a\\u0e31\\u0e0d\\u0e25\\u0e31\\u0e01\\u0e29\\u0e13\\u0e4c\\u0e17\\u0e32\\u0e07\\u0e40" 4631b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0e17\\u0e04\\u0e19\\u0e34\\u0e04\\u0e17\\u0e35\\u0e48\\u0e43\\u0e0a\\u0e49\\u0e01\\u0e31\\u0e19\\u0e2d\\u0e22" 4632b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0e39\\u0e48\\u0e17\\u0e31\\u0e48\\u0e27\\u0e44\\u0e1b."; 4633b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 4634b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const char *latinText = 4635b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "doy ph\\u1ee5\\u0304\\u0302n \\u1e6d\\u0304h\\u0101n l\\u00e6\\u0302w, khxmphiwtexr\\u0312 ca ke\\u012b\\u0300" 4636b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "ywk\\u0304\\u0125xng k\\u1ea1b re\\u1ee5\\u0304\\u0300xng k\\u0304hxng t\\u1ea1wlek\\u0304h. khxmphiwtexr" 4637b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0312 c\\u1ea1d k\\u0115b t\\u1ea1w x\\u1ea1ks\\u0304\\u02b9r l\\u00e6a x\\u1ea1kk\\u0304h ra x\\u1ee5\\u0304" 4638b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0300n\\u00ab doy k\\u0101r k\\u1ea3h\\u0304nd h\\u0304m\\u0101ylek\\u0304h h\\u0304\\u0131\\u0302 s\\u0304" 4639b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u1ea3h\\u0304r\\u1ea1b t\\u00e6\\u0300la t\\u1ea1w. k\\u0300xn h\\u0304n\\u0302\\u0101 th\\u012b\\u0300\\u0301" 4640b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru " Unicode ca t\\u0304h\\u016bk s\\u0304r\\u0302\\u0101ng k\\u0304h\\u1ee5\\u0302n, d\\u1ecb\\u0302 m\\u012b " 4641b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "rabb encoding xy\\u016b\\u0300 h\\u0304l\\u0101y r\\u0302xy rabb s\\u0304\\u1ea3h\\u0304r\\u1ea1b k\\u0101" 4642b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "r k\\u1ea3h\\u0304nd h\\u0304m\\u0101ylek\\u0304h h\\u0304el\\u0300\\u0101 n\\u012b\\u0302. m\\u1ecb\\u0300m" 4643b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u012b encoding d\\u0131 th\\u012b\\u0300 m\\u012b c\\u1ea3nwn t\\u1ea1w x\\u1ea1kk\\u0304hra m\\u0101k p" 4644b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "he\\u012byng phx: yk t\\u1ea1wx\\u1ef3\\u0101ng ch\\u00e8n, c\\u0304heph\\u0101a n\\u0131 kl\\u00f9m s\\u0304" 4645b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "h\\u0304p\\u0323h\\u0101ph yurop phe\\u012byng h\\u0304\\u00e6\\u0300ng de\\u012byw k\\u0306 t\\u0302xngk\\u0101" 4646b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "r h\\u0304l\\u0101y encoding n\\u0131 k\\u0101r khrxbkhlum thuk p\\u0323h\\u0101s\\u0304\\u02b9\\u0101 n\\u0131" 4647b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru " kl\\u00f9m. h\\u0304r\\u1ee5\\u0304x m\\u00e6\\u0302t\\u00e6\\u0300 n\\u0131 p\\u0323h\\u0101s\\u0304\\u02b9" 4648b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0101 de\\u012b\\u0300yw ch\\u00e8n p\\u0323h\\u0101s\\u0304\\u02b9\\u0101 x\\u1ea1ngkvs\\u0304\\u02b9 k\\u0306" 4649b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru " m\\u1ecb\\u0300m\\u012b encoding d\\u0131 th\\u012b\\u0300 phe\\u012byng phx s\\u0304\\u1ea3h\\u0304r\\u1ea1" 4650b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "b thuk t\\u1ea1w x\\u1ea1ks\\u0304\\u02b9r, kher\\u1ee5\\u0304\\u0300xngh\\u0304m\\u0101y wrrkh txn l\\u00e6" 4651b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "a s\\u0304\\u1ea1\\u1ef5l\\u1ea1ks\\u0304\\u02b9\\u1e47\\u0312 th\\u0101ng thekhnikh th\\u012b\\u0300 ch\\u0131" 4652b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru "\\u0302 k\\u1ea1n xy\\u016b\\u0300 th\\u1ea1\\u0300wp\\u1ecb."; 4653b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 4654b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 4655b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UnicodeString xlitText(thaiText); 4656b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru xlitText = xlitText.unescape(); 4657b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tr->transliterate(xlitText); 4658b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 4659b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UnicodeString expectedText(latinText); 4660b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru expectedText = expectedText.unescape(); 4661b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru expect(*tr, xlitText, expectedText); 4662b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 4663b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru delete tr; 466450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 4665b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 4666b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 4667b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 4668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//====================================================================== 4669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Support methods 4670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//====================================================================== 4671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::expectT(const UnicodeString& id, 4672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& source, 4673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& expectedResult) { 4674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 4675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; 4676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator *t = Transliterator::createInstance(id, UTRANS_FORWARD, pe, ec); 4677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) { 46786d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errln((UnicodeString)"FAIL: Could not create " + id + " - " + u_errorName(ec)); 4679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 4680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 4681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, source, expectedResult); 4683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 4684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::reportParseError(const UnicodeString& message, 4687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UParseError& parseError, 4688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UErrorCode& status) { 46896d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln(message + 4690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*", parse error " + parseError.code +*/ 4691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", line " + parseError.line + 4692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", offset " + parseError.offset + 4693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", pre-context " + prettify(parseError.preContext, TRUE) + 4694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", post-context " + prettify(parseError.postContext,TRUE) + 4695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", Error: " + u_errorName(status)); 4696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::expect(const UnicodeString& rules, 4699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& source, 4700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& expectedResult, 4701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTransPosition *pos) { 4702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect("<ID>", rules, source, expectedResult, pos); 4703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::expect(const UnicodeString& id, 4706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& rules, 4707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& source, 4708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& expectedResult, 4709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTransPosition *pos) { 4710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 4711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 4712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* t = Transliterator::createFromRules(id, rules, UTRANS_FORWARD, parseError, status); 4713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 4714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru reportParseError(UnicodeString("Couldn't create transliterator from ") + rules, parseError, status); 4715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(*t, source, expectedResult, pos); 4717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 4719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::expect(const Transliterator& t, 4722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& source, 4723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& expectedResult, 4724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const Transliterator& reverseTransliterator) { 4725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(t, source, expectedResult); 4726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expect(reverseTransliterator, expectedResult, source); 4727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::expect(const Transliterator& t, 4730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& source, 4731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& expectedResult, 4732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTransPosition *pos) { 4733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pos == 0) { 4734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString result(source); 4735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t.transliterate(result); 4736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectAux(t.getID() + ":String", source, result, expectedResult); 4737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTransPosition index={0, 0, 0, 0}; 4739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pos != 0) { 4740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru index = *pos; 4741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rsource(source); 4744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pos == 0) { 4745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t.transliterate(rsource); 4746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Do it all at once -- below we do it incrementally 4748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t.finishTransliteration(rsource, *pos); 4749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectAux(t.getID() + ":Replaceable", source, rsource, expectedResult); 4751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Test keyboard (incremental) transliteration -- this result 4753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // must be the same after we finalize (see below). 4754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString log; 4755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rsource.remove(); 4756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pos != 0) { 4757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rsource = source; 4758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatInput(log, rsource, index); 4759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log.append(" -> "); 4760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 4761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t.transliterate(rsource, index, status); 4762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatInput(log, rsource, index); 4763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i=0; i<source.length(); ++i) { 4765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (i != 0) { 4766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log.append(" + "); 4767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log.append(source.charAt(i)).append(" -> "); 4769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 4770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t.transliterate(rsource, index, source.charAt(i), status); 4771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatInput(log, rsource, index); 4772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // As a final step in keyboard transliteration, we must call 4776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // transliterate to finish off any pending partial matches that 4777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // were waiting for more input. 4778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t.finishTransliteration(rsource, index); 4779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log.append(" => ").append(rsource); 4780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectAux(t.getID() + ":Keyboard", log, 4782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rsource == expectedResult, 4783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectedResult); 4784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 4788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param appendTo result is appended to this param. 4789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param input the string being transliterated 4790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param pos the index struct 4791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 4792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& TransliteratorTest::formatInput(UnicodeString &appendTo, 4793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& input, 4794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UTransPosition& pos) { 4795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Output a string of the form aaa{bbb|ccc|ddd}eee, where 4796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // the {} indicate the context start and limit, and the || 4797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // indicate the start and limit. 4798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (0 <= pos.contextStart && 4799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos.contextStart <= pos.start && 4800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos.start <= pos.limit && 4801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos.limit <= pos.contextLimit && 4802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos.contextLimit <= input.length()) { 4803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString a, b, c, d, e; 4805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input.extractBetween(0, pos.contextStart, a); 4806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input.extractBetween(pos.contextStart, pos.start, b); 4807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input.extractBetween(pos.start, pos.limit, c); 4808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input.extractBetween(pos.limit, pos.contextLimit, d); 4809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input.extractBetween(pos.contextLimit, input.length(), e); 4810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo.append(a).append((UChar)123/*{*/).append(b). 4811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru append((UChar)PIPE).append(c).append((UChar)PIPE).append(d). 4812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru append((UChar)125/*}*/).append(e); 4813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo.append((UnicodeString)"INVALID UTransPosition {cs=" + 4815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos.contextStart + ", s=" + pos.start + ", l=" + 4816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos.limit + ", cl=" + pos.contextLimit + "} on " + 4817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru input); 4818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return appendTo; 4820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::expectAux(const UnicodeString& tag, 4823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& source, 4824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& result, 4825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& expectedResult) { 4826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectAux(tag, source + " -> " + result, 4827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result == expectedResult, 4828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectedResult); 4829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TransliteratorTest::expectAux(const UnicodeString& tag, 4832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& summary, UBool pass, 4833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& expectedResult) { 4834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pass) { 4835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(UnicodeString("(")+tag+") " + prettify(summary)); 4836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 48376d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln(UnicodeString("FAIL: (")+tag+") " 4838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru + prettify(summary) 4839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru + ", expected " + prettify(expectedResult)); 4840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_TRANSLITERATION */ 4844