1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/******************************************************************** 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT: 350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Copyright (c) 2001-2010, International Business Machines Corporation and 4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved. 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/ 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/************************************************************************ 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* This test program is intended for testing Replaceable class. 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Date Name Description 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 11/28/2001 hshih Ported back from Java. 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru************************************************************************/ 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h" 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_TRANSLITERATION 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ittrans.h" 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <string.h> 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdio.h> 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdlib.h> 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/rep.h" 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "reptest.h" 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//--------------------------------------------- 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// runIndexedTest 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//--------------------------------------------- 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /** 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This is a test class that simulates styled text. 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * It associates a style number (0..65535) with each character, 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * and maintains that style in the normal fashion: 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * When setting text from raw string or characters,<br> 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Set the styles to the style of the first character replaced.<br> 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * If no characters are replaced, use the style of the previous character.<br> 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * If at start, use the following character<br> 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Otherwise use NO_STYLE. 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass TestReplaceable : public Replaceable { 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString chars; 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString styles; 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar NO_STYLE; 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar NO_STYLE_MARK; 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /** 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The address of this static class variable serves as this class's ID 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * for ICU "poor man's RTTI". 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char fgClassID; 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestReplaceable (const UnicodeString& text, 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& newStyles) { 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru chars = text; 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s; 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int i = 0; i < text.length(); ++i) { 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (i < newStyles.length()) { 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.append(newStyles.charAt(i)); 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (text.charAt(i) == NO_STYLE_MARK) { 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.append(NO_STYLE); 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.append((UChar)(i + 0x0031)); 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this->styles = s; 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual Replaceable *clone() const { 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return new TestReplaceable(chars, styles); 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ~TestReplaceable(void) {} 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString getStyles() { 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return styles; 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString toString() { 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s = chars; 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.append("{"); 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.append(styles); 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.append("}"); 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return s; 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void extractBetween(int32_t start, int32_t limit, UnicodeString& result) const { 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru chars.extractBetween(start, limit, result); 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /** 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * ICU "poor man's RTTI", returns a UClassID for this class. 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @draft ICU 2.2 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /** 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * ICU "poor man's RTTI", returns a UClassID for the actual class. 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @draft ICU 2.2 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprotected: 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual int32_t getLength() const { 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return chars.length(); 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UChar getCharAt(int32_t offset) const{ 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return chars.charAt(offset); 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UChar32 getChar32At(int32_t offset) const{ 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return chars.char32At(offset); 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void fixStyles(int32_t start, int32_t limit, int32_t newLen) { 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar newStyle = NO_STYLE; 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (start != limit && styles.charAt(start) != NO_STYLE) { 124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru newStyle = styles.charAt(start); 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (start > 0 && getCharAt(start-1) != NO_STYLE_MARK) { 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru newStyle = styles.charAt(start-1); 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (limit < styles.length()) { 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru newStyle = styles.charAt(limit); 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // dumb implementation for now. 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s; 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int i = 0; i < newLen; ++i) { 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // this doesn't really handle an embedded NO_STYLE_MARK 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // in the middle of a long run of characters right -- but 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // that case shouldn't happen anyway 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (getCharAt(start+i) == NO_STYLE_MARK) { 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.append(NO_STYLE); 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.append(newStyle); 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru styles.replaceBetween(start, limit, s); 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual void handleReplaceBetween(int32_t start, int32_t limit, const UnicodeString& text) { 146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s; 147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this->extractBetween(start, limit, s); 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (s == text) return; // NO ACTION! 149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru this->chars.replaceBetween(start, limit, text); 150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fixStyles(start, limit, text.length()); 151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual void copy(int32_t start, int32_t limit, int32_t dest) { 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru chars.copy(start, limit, dest); 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru styles.copy(start, limit, dest); 157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char TestReplaceable::fgClassID=0; 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst UChar TestReplaceable::NO_STYLE = 0x005F; 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst UChar TestReplaceable::NO_STYLE_MARK = 0xFFFF; 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruReplaceableTest::runIndexedTest(int32_t index, UBool exec, 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* &name, char* /*par*/) { 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (index) { 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(0,TestReplaceableClass); 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: name = ""; break; 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Dummy Replaceable implementation for better API/code coverage. 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass NoopReplaceable : public Replaceable { 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual int32_t getLength() const { 181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UChar getCharAt(int32_t /*offset*/) const{ 185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0xffff; 186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UChar32 getChar32At(int32_t /*offset*/) const{ 189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0xffff; 190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru void extractBetween(int32_t /*start*/, int32_t /*limit*/, UnicodeString& result) const { 193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.remove(); 194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual void handleReplaceBetween(int32_t /*start*/, int32_t /*limit*/, const UnicodeString &/*text*/) { 197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* do nothing */ 198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual void copy(int32_t /*start*/, int32_t /*limit*/, int32_t /*dest*/) { 201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* do nothing */ 202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprivate: 208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char fgClassID; 209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char NoopReplaceable::fgClassID=0; 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid ReplaceableTest::TestReplaceableClass(void) { 214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar rawTestArray[][6] = { 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0041, 0x0042, 0x0043, 0x0044, 0x0000, 0x0000}, // ABCD 216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0061, 0x0062, 0x0063, 0x0064, 0x00DF, 0x0000}, // abcd\u00DF 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0061, 0x0042, 0x0043, 0x0044, 0x0000, 0x0000}, // aBCD 218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0041, 0x0300, 0x0045, 0x0300, 0x0000, 0x0000}, // A\u0300E\u0300 219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x00C0, 0x00C8, 0x0000, 0x0000, 0x0000, 0x0000}, // \u00C0\u00C8 220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0077, 0x0078, 0x0079, 0x0000, 0x0000, 0x0000}, /* "wxy" */ 221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0077, 0x0078, 0x0079, 0x007A, 0x0000, 0x0000}, /* "wxyz" */ 222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0077, 0x0078, 0x0079, 0x007A, 0x0075, 0x0000}, /* "wxyzu" */ 223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0078, 0x0079, 0x007A, 0x0000, 0x0000, 0x0000}, /* "xyz" */ 224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0x0077, 0x0078, 0x0079, 0x0000, 0x0000, 0x0000}, /* "wxy" */ 225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0xFFFF, 0x0078, 0x0079, 0x0000, 0x0000, 0x0000}, /* "*xy" */ 226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru {0xFFFF, 0x0078, 0x0079, 0x0000, 0x0000, 0x0000}, /* "*xy" */ 227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru check("Lower", rawTestArray[0], "1234"); 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru check("Upper", rawTestArray[1], "123455"); // must map 00DF to SS 230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru check("Title", rawTestArray[2], "1234"); 231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru check("NFC", rawTestArray[3], "13"); 232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru check("NFD", rawTestArray[4], "1122"); 233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru check("*(x) > A $1 B", rawTestArray[5], "11223"); 234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru check("*(x)(y) > A $2 B $1 C $2 D", rawTestArray[6], "113322334"); 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru check("*(x)(y)(z) > A $3 B $2 C $1 D", rawTestArray[7], "114433225"); 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Disabled for 2.4. TODO Revisit in 2.6 or later. 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //check("*x > a", rawTestArray[8], "223"); // expect "123"? 238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //check("*x > a", rawTestArray[9], "113"); // expect "123"? 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //check("*x > a", rawTestArray[10], "_33"); // expect "_23"? 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //check("*(x) > A $1 B", rawTestArray[11], "__223"); 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // improve API/code coverage 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NoopReplaceable noop; 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Replaceable *p; 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if((p=noop.clone())!=NULL) { 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Replaceable::clone() does not return NULL"); 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete p; 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!noop.hasMetaData()) { 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Replaceable::hasMetaData() does not return TRUE"); 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // try to call the compiler-provided 255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // UMemory/UObject/Replaceable assignment operators 256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NoopReplaceable noop2; 257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru noop2=noop; 258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if((p=noop2.clone())!=NULL) { 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("noop2.Replaceable::clone() does not return NULL"); 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete p; 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // try to call the compiler-provided 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // UMemory/UObject/Replaceable copy constructors 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NoopReplaceable noop3(noop); 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if((p=noop3.clone())!=NULL) { 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("noop3.Replaceable::clone() does not return NULL"); 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete p; 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid ReplaceableTest::check(const UnicodeString& transliteratorName, 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& test, 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& shouldProduceStyles) 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestReplaceable *tr = new TestReplaceable(test, ""); 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString expectedStyles = shouldProduceStyles; 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString original = tr->toString(); 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Transliterator* t; 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (transliteratorName.charAt(0) == 0x2A /*'*'*/) { 283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rules(transliteratorName); 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rules.remove(0,1); 285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError pe; 286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = Transliterator::createFromRules("test", rules, UTRANS_FORWARD, 287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pe, status); 288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test clone() 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestReplaceable *tr2 = (TestReplaceable *)tr->clone(); 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(tr2 != NULL) { 292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete tr; 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tr = tr2; 294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = Transliterator::createInstance(transliteratorName, UTRANS_FORWARD, status); 297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 29950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dataerrln("FAIL: failed to create the " + transliteratorName + " transliterator"); 300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete tr; 301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t->transliterate(*tr); 304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString newStyles = tr->getStyles(); 305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (newStyles != expectedStyles) { 306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL Styles: " + transliteratorName + "{" + original + "} => " 307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru + tr->toString() + "; should be {" + expectedStyles + "}!"); 308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log("OK: "); 310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log(transliteratorName); 311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log("("); 312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log(original); 313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log(") => "); 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(tr->toString()); 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete tr; 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete t; 318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_TRANSLITERATION */ 321