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\\u66x&#x30;&#x031;&#x0032;&#x00033;", ""),
864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//           "abcd5fx012&#x00033;");
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", "&#x30;&#x31;&#x32;");
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           "&#x10330;&#x10FF00;&#xE0061;&#xA0;");
1852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectT("Any-Hex/XML10",
1854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           CharsToUnicodeString("\\U00010330\\U0010FF00\\U000E0061\\u00A0"),
1855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           "&#66352;&#1113856;&#917601;&#160;");
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}\\U00000031&#x32;&#81;"),
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