10596faeddefbf198de137d5e893708495ab1584cFredrik Roubert// © 2016 and later: Unicode, Inc. and others. 264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html 3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/******************************************************************** 4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT: 58de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert * Copyright (c) 1997-2016, International Business Machines Corporation and 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved. 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/ 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ustrtest.h" 10b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/appendable.h" 11b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "unicode/std_string.h" 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/unistr.h" 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uchar.h" 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h" 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/locid.h" 160596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#include "unicode/strenum.h" 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucnv.h" 18b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "unicode/uenum.h" 19103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#include "unicode/utf16.h" 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h" 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "charstr.h" 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustream.h" 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <iostream> 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruusing namespace std; 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeStringTest::~UnicodeStringTest() {} 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 330596faeddefbf198de137d5e893708495ab1584cFredrik Roubertextern IntlTest *createStringCaseTest(); 340596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid UnicodeStringTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char *par) 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (exec) logln("TestSuite UnicodeStringTest: "); 38c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert TESTCASE_AUTO_BEGIN; 390596faeddefbf198de137d5e893708495ab1584cFredrik Roubert TESTCASE_AUTO_CREATE_CLASS(StringCaseTest); 40c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert TESTCASE_AUTO(TestBasicManipulation); 41c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert TESTCASE_AUTO(TestCompare); 42c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert TESTCASE_AUTO(TestExtract); 43c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert TESTCASE_AUTO(TestRemoveReplace); 44c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert TESTCASE_AUTO(TestSearching); 45c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert TESTCASE_AUTO(TestSpacePadding); 46c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert TESTCASE_AUTO(TestPrefixAndSuffix); 47c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert TESTCASE_AUTO(TestFindAndReplace); 48c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert TESTCASE_AUTO(TestBogus); 49c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert TESTCASE_AUTO(TestReverse); 50c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert TESTCASE_AUTO(TestMiscellaneous); 51c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert TESTCASE_AUTO(TestStackAllocation); 52c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert TESTCASE_AUTO(TestUnescape); 53c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert TESTCASE_AUTO(TestCountChar32); 54c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert TESTCASE_AUTO(TestStringEnumeration); 55c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert TESTCASE_AUTO(TestNameSpace); 56c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert TESTCASE_AUTO(TestUTF32); 57c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert TESTCASE_AUTO(TestUTF8); 58c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert TESTCASE_AUTO(TestReadOnlyAlias); 59c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert TESTCASE_AUTO(TestAppendable); 60c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert TESTCASE_AUTO(TestUnicodeStringImplementsAppendable); 61c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert TESTCASE_AUTO(TestSizeofUnicodeString); 62c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert TESTCASE_AUTO(TestStartsWithAndEndsWithNulTerminated); 63c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert TESTCASE_AUTO(TestMoveSwap); 640596faeddefbf198de137d5e893708495ab1584cFredrik Roubert TESTCASE_AUTO(TestUInt16Pointers); 650596faeddefbf198de137d5e893708495ab1584cFredrik Roubert TESTCASE_AUTO(TestWCharPointers); 660596faeddefbf198de137d5e893708495ab1584cFredrik Roubert TESTCASE_AUTO(TestNullPointers); 67c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert TESTCASE_AUTO_END; 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeStringTest::TestBasicManipulation() 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test1("Now is the time for all men to come swiftly to the aid of the party.\n"); 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString expectedValue; 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString *c; 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c=(UnicodeString *)test1.clone(); 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.insert(24, "good "); 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectedValue = "Now is the time for all good men to come swiftly to the aid of the party.\n"; 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1 != expectedValue) 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("insert() failed: expected \"" + expectedValue + "\"\n,got \"" + test1 + "\""); 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c->insert(24, "good "); 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(*c != expectedValue) { 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("clone()->insert() failed: expected \"" + expectedValue + "\"\n,got \"" + *c + "\""); 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.remove(41, 8); 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectedValue = "Now is the time for all good men to come to the aid of the party.\n"; 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1 != expectedValue) 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("remove() failed: expected \"" + expectedValue + "\"\n,got \"" + test1 + "\""); 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.replace(58, 6, "ir country"); 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectedValue = "Now is the time for all good men to come to the aid of their country.\n"; 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1 != expectedValue) 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("replace() failed: expected \"" + expectedValue + "\"\n,got \"" + test1 + "\""); 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar temp[80]; 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.extract(0, 15, temp); 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test2(temp, 15); 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectedValue = "Now is the time"; 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test2 != expectedValue) 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("extract() failed: expected \"" + expectedValue + "\"\n,got \"" + test2 + "\""); 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test2 += " for me to go!\n"; 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectedValue = "Now is the time for me to go!\n"; 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test2 != expectedValue) 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("operator+=() failed: expected \"" + expectedValue + "\"\n,got \"" + test2 + "\""); 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1.length() != 70) 1148393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius errln(UnicodeString("length() failed: expected 70, got ") + test1.length()); 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test2.length() != 30) 1168393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius errln(UnicodeString("length() failed: expected 30, got ") + test2.length()); 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test3; 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.append((UChar32)0x20402); 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test3 != CharsToUnicodeString("\\uD841\\uDC02")){ 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"append failed for UChar32, expected \"\\\\ud841\\\\udc02\", got " + prettify(test3)); 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test3.length() != 2){ 1248393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius errln(UnicodeString("append or length failed for UChar32, expected 2, got ") + test3.length()); 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.append((UChar32)0x0074); 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test3 != CharsToUnicodeString("\\uD841\\uDC02t")){ 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"append failed for UChar32, expected \"\\\\uD841\\\\uDC02t\", got " + prettify(test3)); 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test3.length() != 3){ 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"append or length failed for UChar32, expected 2, got " + test3.length()); 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test some UChar32 overloads 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( test3.setTo((UChar32)0x10330).length() != 2 || 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.insert(0, (UChar32)0x20100).length() != 4 || 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.replace(2, 2, (UChar32)0xe0061).length() != 4 || 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (test3 = (UChar32)0x14001).length() != 2 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"simple UChar32 overloads for replace, insert, setTo or = failed"); 141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test moveIndex32() 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s=UNICODE_STRING("\\U0002f999\\U0001d15f\\u00c4\\u1ed0", 32).unescape(); 146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.moveIndex32(2, -1)!=0 || 149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.moveIndex32(2, 1)!=4 || 150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.moveIndex32(2, 2)!=5 || 151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.moveIndex32(5, -2)!=2 || 152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.moveIndex32(0, -1)!=0 || 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.moveIndex32(6, 1)!=6 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString::moveIndex32() failed"); 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(s.getChar32Start(1)!=0 || s.getChar32Start(2)!=2) { 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString::getChar32Start() failed"); 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(s.getChar32Limit(1)!=2 || s.getChar32Limit(2)!=2) { 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString::getChar32Limit() failed"); 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test new 2.2 constructors and setTo function that parallel Java's substring function. 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString src("Hello folks how are you?"); 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString target1("how are you?"); 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (target1 != UnicodeString(src, 12)) { 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString(const UnicodeString&, int32_t) failed"); 173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString target2("folks"); 175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (target2 != UnicodeString(src, 6, 5)) { 176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString(const UnicodeString&, int32_t, int32_t) failed"); 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (target1 != target2.setTo(src, 12)) { 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString::setTo(const UnicodeString&, int32_t) failed"); 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // op+ is new in ICU 2.8 185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s=UnicodeString("abc", "")+UnicodeString("def", "")+UnicodeString("ghi", ""); 186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(s!=UnicodeString("abcdefghi", "")) { 187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("operator+(UniStr, UniStr) failed"); 188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // tests for Jitterbug 2360 193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // verify that APIs with source pointer + length accept length == -1 194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // mostly test only where modified, only few functions did not already do this 195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(UnicodeString("abc", -1, "")!=UnicodeString("abc", "")) { 196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString(codepageData, dataLength, codepage) does not work with dataLength==-1"); 197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar buffer[10]={ 0x61, 0x62, 0x20ac, 0xd900, 0xdc05, 0, 0x62, 0xffff, 0xdbff, 0xdfff }; 200f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius UnicodeString s, t(buffer, -1, UPRV_LENGTHOF(buffer)); 201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 202f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(s.setTo(buffer, -1, UPRV_LENGTHOF(buffer)).length()!=u_strlen(buffer)) { 203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString.setTo(buffer, length, capacity) does not work with length==-1"); 204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(t.length()!=u_strlen(buffer)) { 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString(buffer, length, capacity) does not work with length==-1"); 207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(0!=s.caseCompare(buffer, -1, U_FOLD_CASE_DEFAULT)) { 210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString.caseCompare(const UChar *, length, options) does not work with length==-1"); 211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(0!=s.caseCompare(0, s.length(), buffer, U_FOLD_CASE_DEFAULT)) { 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString.caseCompare(start, _length, const UChar *, options) does not work"); 214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[u_strlen(buffer)]=0xe4; 217f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius UnicodeString u(buffer, -1, UPRV_LENGTHOF(buffer)); 218f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(s.setTo(buffer, -1, UPRV_LENGTHOF(buffer)).length()!=UPRV_LENGTHOF(buffer)) { 219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString.setTo(buffer without NUL, length, capacity) does not work with length==-1"); 220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 221f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(u.length()!=UPRV_LENGTHOF(buffer)) { 222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString(buffer without NUL, length, capacity) does not work with length==-1"); 223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char cs[]={ 0x61, (char)0xe4, (char)0x85, 0 }; 226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UConverter *cnv; 227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode=U_ZERO_ERROR; 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cnv=ucnv_open("ISO-8859-1", &errorCode); 230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString v(cs, -1, cnv, errorCode); 231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucnv_close(cnv); 232c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if(v!=CharsToUnicodeString("a\\xe4\\x85")) { 233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString(const char *, length, cnv, errorCode) does not work with length==-1"); 234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 236b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 237b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#if U_CHARSET_IS_UTF8 238b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { 239b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Test the hardcoded-UTF-8 UnicodeString optimizations. 240b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru static const uint8_t utf8[]={ 0x61, 0xC3, 0xA4, 0xC3, 0x9F, 0xE4, 0xB8, 0x80, 0 }; 241b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru static const UChar utf16[]={ 0x61, 0xE4, 0xDF, 0x4E00 }; 242b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UnicodeString from8a = UnicodeString((const char *)utf8); 243b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UnicodeString from8b = UnicodeString((const char *)utf8, (int32_t)sizeof(utf8)-1); 244f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius UnicodeString from16(FALSE, utf16, UPRV_LENGTHOF(utf16)); 245b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(from8a != from16 || from8b != from16) { 246b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errln("UnicodeString(const char * U_CHARSET_IS_UTF8) failed"); 247b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 248b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru char buffer[16]; 249b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t length8=from16.extract(0, 0x7fffffff, buffer, (uint32_t)sizeof(buffer)); 250b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(length8!=((int32_t)sizeof(utf8)-1) || 0!=uprv_memcmp(buffer, utf8, sizeof(utf8))) { 251b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errln("UnicodeString::extract(char * U_CHARSET_IS_UTF8) failed"); 252b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 253b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru length8=from16.extract(1, 2, buffer, (uint32_t)sizeof(buffer)); 254b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(length8!=4 || buffer[length8]!=0 || 0!=uprv_memcmp(buffer, utf8+1, length8)) { 255b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errln("UnicodeString::extract(substring to char * U_CHARSET_IS_UTF8) failed"); 256b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 257b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 258b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#endif 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeStringTest::TestCompare() 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test1("this is a test"); 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test2("this is a test"); 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test3("this is a test of the emergency broadcast system"); 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test4("never say, \"this is a test\"!!"); 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test5((UChar)0x5000); 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test6((UChar)0x5100); 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar uniChars[] = { 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x20, 0x61, 0x20, 0x74, 0x65, 0x73, 0x74, 0 }; 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char chars[] = "this is a test"; 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test operator== and operator!= 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1 != test2 || test1 == test3 || test1 == test4) 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("operator== or operator!= failed"); 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test operator> and operator< 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1 > test2 || test1 < test2 || !(test1 < test3) || !(test1 > test4) || 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru !(test5 < test6) 283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("operator> or operator< failed"); 285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test operator>= and operator<= 288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!(test1 >= test2) || !(test1 <= test2) || !(test1 <= test3) || !(test1 >= test4)) 289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("operator>= or operator<= failed"); 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test compare(UnicodeString) 292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1.compare(test2) != 0 || test1.compare(test3) >= 0 || test1.compare(test4) <= 0) 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("compare(UnicodeString) failed"); 294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //test compare(offset, length, UnicodeString) 296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test1.compare(0, 14, test2) != 0 || 297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.compare(0, 14, test2) != 0 || 298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test4.compare(12, 14, test2) != 0 || 299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.compare(0, 18, test1) <=0 ) 300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("compare(offset, length, UnicodeString) failes"); 301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test compare(UChar*) 303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test2.compare(uniChars) != 0 || test3.compare(uniChars) <= 0 || test4.compare(uniChars) >= 0) 304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("compare(UChar*) failed"); 305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test compare(char*) 307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test2.compare(chars) != 0 || test3.compare(chars) <= 0 || test4.compare(chars) >= 0) 308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("compare(char*) failed"); 309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test compare(UChar*, length) 311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1.compare(uniChars, 4) <= 0 || test1.compare(uniChars, 4) <= 0) 312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("compare(UChar*, length) failed"); 313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test compare(thisOffset, thisLength, that, thatOffset, thatLength) 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1.compare(0, 14, test2, 0, 14) != 0 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || test1.compare(0, 14, test3, 0, 14) != 0 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || test1.compare(0, 14, test4, 12, 14) != 0) 318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("1. compare(thisOffset, thisLength, that, thatOffset, thatLength) failed"); 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1.compare(10, 4, test2, 0, 4) >= 0 321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || test1.compare(10, 4, test3, 22, 9) <= 0 322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || test1.compare(10, 4, test4, 22, 4) != 0) 323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("2. compare(thisOffset, thisLength, that, thatOffset, thatLength) failed"); 324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test compareBetween 326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1.compareBetween(0, 14, test2, 0, 14) != 0 || test1.compareBetween(0, 14, test3, 0, 14) != 0 327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || test1.compareBetween(0, 14, test4, 12, 26) != 0) 328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("compareBetween failed"); 329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1.compareBetween(10, 14, test2, 0, 4) >= 0 || test1.compareBetween(10, 14, test3, 22, 31) <= 0 331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || test1.compareBetween(10, 14, test4, 22, 26) != 0) 332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("compareBetween failed"); 333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test compare() etc. with strings that share a buffer but are not equal 335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test2=test1; // share the buffer, length() too large for the stackBuffer 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test2.truncate(1); // change only the length, not the buffer 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( test1==test2 || test1<=test2 || 338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.compare(test2)<=0 || 339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.compareCodePointOrder(test2)<=0 || 340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.compareCodePointOrder(0, INT32_MAX, test2)<=0 || 341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.compareCodePointOrder(0, INT32_MAX, test2, 0, INT32_MAX)<=0 || 342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.compareCodePointOrderBetween(0, INT32_MAX, test2, 0, INT32_MAX)<=0 || 343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.caseCompare(test2, U_FOLD_CASE_DEFAULT)<=0 344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeStrings that share a buffer but have different lengths compare as equal"); 346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test compareCodePointOrder() */ 349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* these strings are in ascending order */ 351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar strings[][4]={ 352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x61, 0 }, /* U+0061 */ 353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x20ac, 0xd801, 0 }, /* U+20ac U+d801 */ 354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0x20ac, 0xd800, 0xdc00, 0 }, /* U+20ac U+10000 */ 355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0xd800, 0 }, /* U+d800 */ 356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0xd800, 0xff61, 0 }, /* U+d800 U+ff61 */ 357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0xdfff, 0 }, /* U+dfff */ 358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0xff61, 0xdfff, 0 }, /* U+ff61 U+dfff */ 359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0xff61, 0xd800, 0xdc02, 0 }, /* U+ff61 U+10002 */ 360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0xd800, 0xdc02, 0 }, /* U+10002 */ 361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 0xd84d, 0xdc56, 0 } /* U+23456 */ 362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString u[20]; // must be at least as long as strings[] 364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i; 365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3668de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert for(i=0; i<UPRV_LENGTHOF(strings); ++i) { 367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u[i]=UnicodeString(TRUE, strings[i], -1); 368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3708de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert for(i=0; i<UPRV_LENGTHOF(strings)-1; ++i) { 371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u[i].compareCodePointOrder(u[i+1])>=0 || u[i].compareCodePointOrder(0, INT32_MAX, u[i+1].getBuffer())>=0) { 372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("error: UnicodeString::compareCodePointOrder() fails for string %d and the following one\n", i); 373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test caseCompare() */ 378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar 380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _mixed[]= { 0x61, 0x42, 0x131, 0x3a3, 0xdf, 0x130, 0x49, 0xfb03, 0xd93f, 0xdfff, 0 }, 381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _otherDefault[]= { 0x41, 0x62, 0x131, 0x3c3, 0x73, 0x53, 0x69, 0x307, 0x69, 0x46, 0x66, 0x49, 0xd93f, 0xdfff, 0 }, 382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _otherExcludeSpecialI[]={ 0x41, 0x62, 0x131, 0x3c3, 0x53, 0x73, 0x69, 0x131, 0x66, 0x46, 0x69, 0xd93f, 0xdfff, 0 }, 383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _different[]= { 0x41, 0x62, 0x131, 0x3c3, 0x73, 0x53, 0x130, 0x49, 0x46, 0x66, 0x49, 0xd93f, 0xdffd, 0 }; 384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString 386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru mixed(TRUE, _mixed, -1), 387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru otherDefault(TRUE, _otherDefault, -1), 388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru otherExcludeSpecialI(TRUE, _otherExcludeSpecialI, -1), 389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru different(TRUE, _different, -1); 390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int8_t result; 392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test caseCompare() */ 394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result=mixed.caseCompare(otherDefault, U_FOLD_CASE_DEFAULT); 395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(result!=0 || 0!=mixed.caseCompareBetween(0, INT32_MAX, otherDefault, 0, INT32_MAX, U_FOLD_CASE_DEFAULT)) { 396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("error: mixed.caseCompare(other, default)=%ld instead of 0\n", result); 397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result=mixed.caseCompare(otherExcludeSpecialI, U_FOLD_CASE_EXCLUDE_SPECIAL_I); 399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(result!=0) { 400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("error: mixed.caseCompare(otherExcludeSpecialI, U_FOLD_CASE_EXCLUDE_SPECIAL_I)=%ld instead of 0\n", result); 401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result=mixed.caseCompare(otherDefault, U_FOLD_CASE_EXCLUDE_SPECIAL_I); 403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(result==0 || 0==mixed.caseCompareBetween(0, INT32_MAX, otherDefault, 0, INT32_MAX, U_FOLD_CASE_EXCLUDE_SPECIAL_I)) { 404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("error: mixed.caseCompare(other, U_FOLD_CASE_EXCLUDE_SPECIAL_I)=0 instead of !=0\n"); 405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test caseCompare() */ 408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result=mixed.caseCompare(different, U_FOLD_CASE_DEFAULT); 409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(result<=0) { 410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("error: mixed.caseCompare(different, default)=%ld instead of positive\n", result); 411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test caseCompare() - include the folded sharp s (U+00df) with different lengths */ 414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result=mixed.caseCompare(1, 4, different, 1, 5, U_FOLD_CASE_DEFAULT); 415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(result!=0 || 0!=mixed.caseCompareBetween(1, 5, different, 1, 6, U_FOLD_CASE_DEFAULT)) { 416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("error: mixed.caseCompare(mixed, 1, 4, different, 1, 5, default)=%ld instead of 0\n", result); 417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test caseCompare() - stop in the middle of the sharp s (U+00df) */ 420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result=mixed.caseCompare(1, 4, different, 1, 4, U_FOLD_CASE_DEFAULT); 421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(result<=0) { 422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("error: mixed.caseCompare(1, 4, different, 1, 4, default)=%ld instead of positive\n", result); 423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test that srcLength=-1 is handled in functions that 427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // take input const UChar */int32_t srcLength (j785) 428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar u[]={ 0x61, 0x308, 0x62, 0 }; 430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s=UNICODE_STRING("a\\u0308b", 8).unescape(); 431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(s.compare(u, -1)!=0 || s.compare(0, 999, u, 0, -1)!=0) { 433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("error UnicodeString::compare(..., const UChar *, srcLength=-1) does not work"); 434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(s.compareCodePointOrder(u, -1)!=0 || s.compareCodePointOrder(0, 999, u, 0, -1)!=0) { 437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("error UnicodeString::compareCodePointOrder(..., const UChar *, srcLength=-1, ...) does not work"); 438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(s.caseCompare(u, -1, U_FOLD_CASE_DEFAULT)!=0 || s.caseCompare(0, 999, u, 0, -1, U_FOLD_CASE_DEFAULT)!=0) { 441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("error UnicodeString::caseCompare(..., const UChar *, srcLength=-1, ...) does not work"); 442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(s.indexOf(u, 1, -1, 0, 999)!=1 || s.indexOf(u+1, -1, 0, 999)!=1 || s.indexOf(u+1, -1, 0)!=1) { 445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("error UnicodeString::indexOf(const UChar *, srcLength=-1, ...) does not work"); 446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(s.lastIndexOf(u, 1, -1, 0, 999)!=1 || s.lastIndexOf(u+1, -1, 0, 999)!=1 || s.lastIndexOf(u+1, -1, 0)!=1) { 449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("error UnicodeString::lastIndexOf(const UChar *, srcLength=-1, ...) does not work"); 450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s2, s3; 453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s2.replace(0, 0, u+1, -1); 454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s3.replace(0, 0, u, 1, -1); 455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(s.compare(1, 999, s2)!=0 || s2!=s3) { 456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("error UnicodeString::replace(..., const UChar *, srcLength=-1, ...) does not work"); 457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeStringTest::TestExtract() 463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test1("Now is the time for all good men to come to the aid of their country.", ""); 465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test2; 466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar test3[13] = {1, 2, 3, 4, 5, 6, 7, 8, 8, 10, 11, 12, 13}; 467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char test4[13] = {1, 2, 3, 4, 5, 6, 7, 8, 8, 10, 11, 12, 13}; 468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test5; 469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char test6[13] = {1, 2, 3, 4, 5, 6, 7, 8, 8, 10, 11, 12, 13}; 470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.extract(11, 12, test2); 472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.extract(11, 12, test3); 473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1.extract(11, 12, test4) != 12 || test4[12] != 0) { 474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString.extract(char *) failed to return the correct size of destination buffer."); 475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test proper pinning in extractBetween() 478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.extractBetween(-3, 7, test5); 479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test5!=UNICODE_STRING("Now is ", 7)) { 480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString.extractBetween(-3, 7) did not pin properly."); 481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.extractBetween(11, 23, test5); 484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1.extract(60, 71, test6) != 9) { 485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString.extract() failed to return the correct size of destination buffer for end of buffer."); 486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1.extract(11, 12, test6) != 12) { 488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString.extract() failed to return the correct size of destination buffer."); 489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // convert test4 back to Unicode for comparison 492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test4b(test4, 12); 493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1.extract(11, 12, (char *)NULL) != 12) { 495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString.extract(NULL) failed to return the correct size of destination buffer."); 496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1.extract(11, -1, test6) != 0) { 498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString.extract(-1) failed to stop reading the string."); 499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i = 0; i < 12; i++) { 502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1.charAt((int32_t)(11 + i)) != test2.charAt(i)) { 503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("extracting into a UnicodeString failed at position ") + i); 504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1.charAt((int32_t)(11 + i)) != test3[i]) { 507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("extracting into an array of UChar failed at position ") + i); 508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (((char)test1.charAt((int32_t)(11 + i))) != test4b.charAt(i)) { 511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("extracting into an array of char failed at position ") + i); 512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1.charAt((int32_t)(11 + i)) != test5.charAt(i)) { 515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("extracting with extractBetween failed at position ") + i); 516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test preflighting and overflows with invariant conversion 521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1.extract(0, 10, (char *)NULL, "") != 10) { 522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString.extract(0, 10, (char *)NULL, \"\") != 10"); 523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test4[2] = (char)0xff; 526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1.extract(0, 10, test4, 2, "") != 10) { 527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString.extract(0, 10, test4, 2, \"\") != 10"); 528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test4[2] != (char)0xff) { 530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString.extract(0, 10, test4, 2, \"\") overwrote test4[2]"); 531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test new, NUL-terminating extract() function 535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s("terminate", ""); 536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar dest[20]={ 537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5 539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode; 541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length; 542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=s.extract((UChar *)NULL, 0, errorCode); 545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=s.length()) { 546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString.extract(NULL, 0)==%d (%s) expected %d (U_BUFFER_OVERFLOW_ERROR)", length, s.length(), u_errorName(errorCode)); 547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=s.extract(dest, s.length()-1, errorCode); 551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=s.length()) { 552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString.extract(dest too short)==%d (%s) expected %d (U_BUFFER_OVERFLOW_ERROR)", 553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length, u_errorName(errorCode), s.length()); 554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=s.extract(dest, s.length(), errorCode); 558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_STRING_NOT_TERMINATED_WARNING || length!=s.length()) { 559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString.extract(dest just right without NUL)==%d (%s) expected %d (U_STRING_NOT_TERMINATED_WARNING)", 560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length, u_errorName(errorCode), s.length()); 561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(dest[length-1]!=s[length-1] || dest[length]!=0xa5) { 563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString.extract(dest just right without NUL) did not extract the string correctly"); 564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length=s.extract(dest, s.length()+1, errorCode); 568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(errorCode!=U_ZERO_ERROR || length!=s.length()) { 569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString.extract(dest large enough)==%d (%s) expected %d (U_ZERO_ERROR)", 570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length, u_errorName(errorCode), s.length()); 571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(dest[length-1]!=s[length-1] || dest[length]!=0 || dest[length+1]!=0xa5) { 573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString.extract(dest large enough) did not extract the string correctly"); 574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test new UConverter extract() and constructor 579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s=UNICODE_STRING("\\U0002f999\\U0001d15f\\u00c4\\u1ed0", 32).unescape(); 580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char buffer[32]; 581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char expect[]={ 582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (char)0xf0, (char)0xaf, (char)0xa6, (char)0x99, 583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (char)0xf0, (char)0x9d, (char)0x85, (char)0x9f, 584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (char)0xc3, (char)0x84, 585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (char)0xe1, (char)0xbb, (char)0x90 586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode=U_ZERO_ERROR; 588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UConverter *cnv=ucnv_open("UTF-8", &errorCode); 589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length; 590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(errorCode)) { 592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test preflighting 593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( (length=s.extract(NULL, 0, cnv, errorCode))!=13 || 594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode!=U_BUFFER_OVERFLOW_ERROR 595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString::extract(NULL, UConverter) preflighting failed (length=%ld, %s)", 597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length, u_errorName(errorCode)); 598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( (length=s.extract(buffer, 2, cnv, errorCode))!=13 || 601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode!=U_BUFFER_OVERFLOW_ERROR 602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString::extract(too small, UConverter) preflighting failed (length=%ld, %s)", 604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length, u_errorName(errorCode)); 605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // try error cases 608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( s.extract(NULL, 2, cnv, errorCode)==13 || U_SUCCESS(errorCode)) { 610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString::extract(UConverter) succeeded with an illegal destination"); 611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ILLEGAL_ARGUMENT_ERROR; 613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( s.extract(NULL, 0, cnv, errorCode)==13 || U_SUCCESS(errorCode)) { 614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString::extract(UConverter) succeeded with a previous error code"); 615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errorCode=U_ZERO_ERROR; 617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // extract for real 619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( (length=s.extract(buffer, sizeof(buffer), cnv, errorCode))!=13 || 620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memcmp(buffer, expect, 13)!=0 || 621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[13]!=0 || 622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_FAILURE(errorCode) 623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString::extract(UConverter) conversion failed (length=%ld, %s)", 625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length, u_errorName(errorCode)); 626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Test again with just the converter name. 628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( (length=s.extract(0, s.length(), buffer, sizeof(buffer), "UTF-8"))!=13 || 629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memcmp(buffer, expect, 13)!=0 || 630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer[13]!=0 || 631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_FAILURE(errorCode) 632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString::extract(\"UTF-8\") conversion failed (length=%ld, %s)", 634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru length, u_errorName(errorCode)); 635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // try the constructor 638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString t(expect, sizeof(expect), cnv, errorCode); 639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(errorCode) || s!=t) { 640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString(UConverter) conversion failed (%s)", 641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_errorName(errorCode)); 642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucnv_close(cnv); 645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeStringTest::TestRemoveReplace() 651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test1("The rain in Spain stays mainly on the plain"); 653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test2("eat SPAMburgers!"); 654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar test3[] = { 0x53, 0x50, 0x41, 0x4d, 0x4d, 0 }; 655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char test4[] = "SPAM"; 656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString& test5 = test1; 657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.replace(4, 4, test2, 4, 4); 659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.replace(12, 5, test3, 4); 660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3[4] = 0; 661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.replace(17, 4, test3); 662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.replace(23, 4, test4); 663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.replaceBetween(37, 42, test2, 4, 8); 664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1 != "The SPAM in SPAM SPAMs SPAMly on the SPAM") 666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("One of the replace methods failed:\n" 667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " expected \"The SPAM in SPAM SPAMs SPAMly on the SPAM\",\n" 668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " got \"" + test1 + "\""); 669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.remove(21, 1); 671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.removeBetween(26, 28); 672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1 != "The SPAM in SPAM SPAM SPAM on the SPAM") 674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("One of the remove methods failed:\n" 675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " expected \"The SPAM in SPAM SPAM SPAM on the SPAM\",\n" 676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " got \"" + test1 + "\""); 677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i = 0; i < test1.length(); i++) { 679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test5[i] != 0x53 && test5[i] != 0x50 && test5[i] != 0x41 && test5[i] != 0x4d && test5[i] != 0x20) { 680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.setCharAt(i, 0x78); 681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1 != "xxx SPAM xx SPAM SPAM SPAM xx xxx SPAM") 685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("One of the remove methods failed:\n" 686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " expected \"xxx SPAM xx SPAM SPAM SPAM xx xxx SPAM\",\n" 687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " got \"" + test1 + "\""); 688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.remove(); 690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1.length() != 0) 691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Remove() failed: expected empty string, got \"" + test1 + "\""); 692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeStringTest::TestSearching() 696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test1("test test ttest tetest testesteststt"); 698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test2("test"); 699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar testChar = 0x74; 700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 testChar32 = 0x20402; 702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar testData[]={ 703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 0 1 2 3 4 5 6 7 704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xd841, 0xdc02, 0x0071, 0xdc02, 0xd841, 0x0071, 0xd841, 0xdc02, 705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 8 9 10 11 12 13 14 15 707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x0071, 0x0072, 0xd841, 0xdc02, 0x0071, 0xd841, 0xdc02, 0x0071, 708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 16 17 18 19 710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xdc02, 0xd841, 0x0073, 0x0000 711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test3(testData); 713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test4(testChar32); 714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint16_t occurrences = 0; 716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t startPos = 0; 717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for ( ; 718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru startPos != -1 && startPos < test1.length(); 719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (startPos = test1.indexOf(test2, startPos)) != -1 ? (++occurrences, startPos += 4) : 0) 720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ; 721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (occurrences != 6) 7228393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius errln(UnicodeString("indexOf failed: expected to find 6 occurrences, found ") + occurrences); 7238393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for ( occurrences = 0, startPos = 10; 725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru startPos != -1 && startPos < test1.length(); 726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (startPos = test1.indexOf(test2, startPos)) != -1 ? (++occurrences, startPos += 4) : 0) 727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ; 728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (occurrences != 4) 7298393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius errln(UnicodeString("indexOf with starting offset failed: " 7308393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius "expected to find 4 occurrences, found ") + occurrences); 731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t endPos = 28; 733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for ( occurrences = 0, startPos = 5; 734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru startPos != -1 && startPos < test1.length(); 735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (startPos = test1.indexOf(test2, startPos, endPos - startPos)) != -1 ? (++occurrences, startPos += 4) : 0) 736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ; 737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (occurrences != 4) 7388393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius errln(UnicodeString("indexOf with starting and ending offsets failed: " 7398393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius "expected to find 4 occurrences, found ") + occurrences); 740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //using UChar32 string 742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for ( startPos=0, occurrences=0; 743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru startPos != -1 && startPos < test3.length(); 744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (startPos = test3.indexOf(test4, startPos)) != -1 ? (++occurrences, startPos += 2) : 0) 745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ; 746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (occurrences != 4) 747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"indexOf failed: expected to find 4 occurrences, found " + occurrences); 748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for ( startPos=10, occurrences=0; 750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru startPos != -1 && startPos < test3.length(); 751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (startPos = test3.indexOf(test4, startPos)) != -1 ? (++occurrences, startPos += 2) : 0) 752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ; 753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (occurrences != 2) 7548393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius errln(UnicodeString("indexOf failed: expected to find 2 occurrences, found ") + occurrences); 755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //--- 756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for ( occurrences = 0, startPos = 0; 758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru startPos != -1 && startPos < test1.length(); 759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (startPos = test1.indexOf(testChar, startPos)) != -1 ? (++occurrences, startPos += 1) : 0) 760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ; 761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (occurrences != 16) 7628393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius errln(UnicodeString("indexOf with character failed: " 7638393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius "expected to find 16 occurrences, found ") + occurrences); 764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for ( occurrences = 0, startPos = 10; 766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru startPos != -1 && startPos < test1.length(); 767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (startPos = test1.indexOf(testChar, startPos)) != -1 ? (++occurrences, startPos += 1) : 0) 768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ; 769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (occurrences != 12) 7708393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius errln(UnicodeString("indexOf with character & start offset failed: " 7718393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius "expected to find 12 occurrences, found ") + occurrences); 772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for ( occurrences = 0, startPos = 5, endPos = 28; 774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru startPos != -1 && startPos < test1.length(); 775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (startPos = test1.indexOf(testChar, startPos, endPos - startPos)) != -1 ? (++occurrences, startPos += 1) : 0) 776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ; 777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (occurrences != 10) 7788393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius errln(UnicodeString("indexOf with character & start & end offsets failed: " 7798393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius "expected to find 10 occurrences, found ") + occurrences); 780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //testing for UChar32 782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString subString; 783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for( occurrences =0, startPos=0; startPos < test3.length(); startPos +=1){ 784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru subString.append(test3, startPos, test3.length()); 785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(subString.indexOf(testChar32) != -1 ){ 786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++occurrences; 787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru subString.remove(); 789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (occurrences != 14) 791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"indexOf failed: expected to find 14 occurrences, found " + occurrences); 792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for ( occurrences = 0, startPos = 0; 794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru startPos != -1 && startPos < test3.length(); 795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (startPos = test3.indexOf(testChar32, startPos)) != -1 ? (++occurrences, startPos += 1) : 0) 796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ; 797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (occurrences != 4) 798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"indexOf failed: expected to find 4 occurrences, found " + occurrences); 799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru endPos=test3.length(); 801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for ( occurrences = 0, startPos = 5; 802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru startPos != -1 && startPos < test3.length(); 803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (startPos = test3.indexOf(testChar32, startPos, endPos - startPos)) != -1 ? (++occurrences, startPos += 1) : 0) 804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ; 805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (occurrences != 3) 806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"indexOf with character & start & end offsets failed: expected to find 2 occurrences, found " + occurrences); 807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //--- 808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test1.lastIndexOf(test2)!=29) { 810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("test1.lastIndexOf(test2)!=29"); 811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test1.lastIndexOf(test2, 15)!=29 || test1.lastIndexOf(test2, 29)!=29 || test1.lastIndexOf(test2, 30)!=-1) { 814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("test1.lastIndexOf(test2, start) failed"); 815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for ( occurrences = 0, startPos = 32; 818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru startPos != -1; 819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (startPos = test1.lastIndexOf(test2, 5, startPos - 5)) != -1 ? ++occurrences : 0) 820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ; 821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (occurrences != 4) 8228393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius errln(UnicodeString("lastIndexOf with starting and ending offsets failed: " 8238393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius "expected to find 4 occurrences, found ") + occurrences); 824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for ( occurrences = 0, startPos = 32; 826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru startPos != -1; 827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (startPos = test1.lastIndexOf(testChar, 5, startPos - 5)) != -1 ? ++occurrences : 0) 828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ; 829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (occurrences != 11) 8308393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius errln(UnicodeString("lastIndexOf with character & start & end offsets failed: " 8318393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius "expected to find 11 occurrences, found ") + occurrences); 832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //testing UChar32 834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru startPos=test3.length(); 835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for ( occurrences = 0; 836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru startPos != -1; 837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (startPos = test3.lastIndexOf(testChar32, 5, startPos - 5)) != -1 ? ++occurrences : 0) 838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ; 839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (occurrences != 3) 840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"lastIndexOf with character & start & end offsets failed: expected to find 3 occurrences, found " + occurrences); 841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for ( occurrences = 0, endPos = test3.length(); endPos > 0; endPos -= 1){ 844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru subString.remove(); 845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru subString.append(test3, 0, endPos); 846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(subString.lastIndexOf(testChar32) != -1 ){ 847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++occurrences; 848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (occurrences != 18) 851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"indexOf failed: expected to find 18 occurrences, found " + occurrences); 852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //--- 853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test that indexOf(UChar32) and lastIndexOf(UChar32) 855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // do not find surrogate code points when they are part of matched pairs 856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // (= part of supplementary code points) 857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Jitterbug 1542 858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test3.indexOf((UChar32)0xd841) != 4 || test3.indexOf((UChar32)0xdc02) != 3) { 859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("error: UnicodeString::indexOf(UChar32 surrogate) finds a partial supplementary code point"); 860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( UnicodeString(test3, 0, 17).lastIndexOf((UChar)0xd841, 0) != 4 || 862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString(test3, 0, 17).lastIndexOf((UChar32)0xd841, 2) != 4 || 863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.lastIndexOf((UChar32)0xd841, 0, 17) != 4 || test3.lastIndexOf((UChar32)0xdc02, 0, 17) != 16 864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("error: UnicodeString::lastIndexOf(UChar32 surrogate) finds a partial supplementary code point"); 866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeStringTest::TestSpacePadding() 871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test1("hello"); 873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test2(" there"); 874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test3("Hi! How ya doin'? Beautiful day, isn't it?"); 875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test4; 876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool returnVal; 877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString expectedValue; 878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru returnVal = test1.padLeading(15); 880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectedValue = " hello"; 881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (returnVal == FALSE || test1 != expectedValue) 882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("padLeading() failed: expected \"" + expectedValue + "\", got \"" + test1 + "\"."); 883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru returnVal = test2.padTrailing(15); 885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectedValue = " there "; 886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (returnVal == FALSE || test2 != expectedValue) 887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("padTrailing() failed: expected \"" + expectedValue + "\", got \"" + test2 + "\"."); 888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectedValue = test3; 890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru returnVal = test3.padTrailing(15); 891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (returnVal == TRUE || test3 != expectedValue) 892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("padTrailing() failed: expected \"" + expectedValue + "\", got \"" + test3 + "\"."); 893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectedValue = "hello"; 895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test4.setTo(test1).trim(); 896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test4 != expectedValue || test1 == expectedValue || test4 != expectedValue) 898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("trim(UnicodeString&) failed"); 899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.trim(); 901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1 != expectedValue) 902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("trim() failed: expected \"" + expectedValue + "\", got \"" + test1 + "\"."); 903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test2.trim(); 905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectedValue = "there"; 906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test2 != expectedValue) 907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("trim() failed: expected \"" + expectedValue + "\", got \"" + test2 + "\"."); 908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.trim(); 910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectedValue = "Hi! How ya doin'? Beautiful day, isn't it?"; 911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test3 != expectedValue) 912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("trim() failed: expected \"" + expectedValue + "\", got \"" + test3 + "\"."); 913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru returnVal = test1.truncate(15); 915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectedValue = "hello"; 916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (returnVal == TRUE || test1 != expectedValue) 917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("truncate() failed: expected \"" + expectedValue + "\", got \"" + test1 + "\"."); 918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru returnVal = test2.truncate(15); 920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectedValue = "there"; 921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (returnVal == TRUE || test2 != expectedValue) 922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("truncate() failed: expected \"" + expectedValue + "\", got \"" + test2 + "\"."); 923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru returnVal = test3.truncate(15); 925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectedValue = "Hi! How ya doi"; 926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (returnVal == FALSE || test3 != expectedValue) 927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("truncate() failed: expected \"" + expectedValue + "\", got \"" + test3 + "\"."); 928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeStringTest::TestPrefixAndSuffix() 932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test1("Now is the time for all good men to come to the aid of their country."); 934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test2("Now"); 935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test3("country."); 936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test4("count"); 937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!test1.startsWith(test2) || !test1.startsWith(test2, 0, test2.length())) { 939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("startsWith() failed: \"" + test2 + "\" should be a prefix of \"" + test1 + "\"."); 940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1.startsWith(test3) || 943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.startsWith(test3.getBuffer(), test3.length()) || 944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.startsWith(test3.getTerminatedBuffer(), 0, -1) 945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("startsWith() failed: \"" + test3 + "\" shouldn't be a prefix of \"" + test1 + "\"."); 947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1.endsWith(test2)) { 950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("endsWith() failed: \"" + test2 + "\" shouldn't be a suffix of \"" + test1 + "\"."); 951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!test1.endsWith(test3)) { 954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("endsWith(test3) failed: \"" + test3 + "\" should be a suffix of \"" + test1 + "\"."); 955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!test1.endsWith(test3, 0, INT32_MAX)) { 957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("endsWith(test3, 0, INT32_MAX) failed: \"" + test3 + "\" should be a suffix of \"" + test1 + "\"."); 958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!test1.endsWith(test3.getBuffer(), test3.length())) { 961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("endsWith(test3.getBuffer(), test3.length()) failed: \"" + test3 + "\" should be a suffix of \"" + test1 + "\"."); 962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!test1.endsWith(test3.getTerminatedBuffer(), 0, -1)) { 964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("endsWith(test3.getTerminatedBuffer(), 0, -1) failed: \"" + test3 + "\" should be a suffix of \"" + test1 + "\"."); 965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!test3.startsWith(test4)) { 968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("endsWith(test4) failed: \"" + test4 + "\" should be a prefix of \"" + test3 + "\"."); 969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test4.startsWith(test3)) { 972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("startsWith(test3) failed: \"" + test3 + "\" shouldn't be a prefix of \"" + test4 + "\"."); 973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 977b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoUnicodeStringTest::TestStartsWithAndEndsWithNulTerminated() { 978b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString test("abcde"); 979b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const UChar ab[] = { 0x61, 0x62, 0 }; 980b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const UChar de[] = { 0x64, 0x65, 0 }; 981b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho assertTrue("abcde.startsWith(ab, -1)", test.startsWith(ab, -1)); 982b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho assertTrue("abcde.startsWith(ab, 0, -1)", test.startsWith(ab, 0, -1)); 983b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho assertTrue("abcde.endsWith(de, -1)", test.endsWith(de, -1)); 984b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho assertTrue("abcde.endsWith(de, 0, -1)", test.endsWith(de, 0, -1)); 985b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 986b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 987b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid 988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeStringTest::TestFindAndReplace() 989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test1("One potato, two potato, three potato, four\n"); 991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test2("potato"); 992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test3("MISSISSIPPI"); 993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString expectedValue; 995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.findAndReplace(test2, test3); 997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectedValue = "One MISSISSIPPI, two MISSISSIPPI, three MISSISSIPPI, four\n"; 998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1 != expectedValue) 999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("findAndReplace failed: expected \"" + expectedValue + "\", got \"" + test1 + "\"."); 1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.findAndReplace(2, 32, test3, test2); 1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectedValue = "One potato, two potato, three MISSISSIPPI, four\n"; 1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1 != expectedValue) 1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("findAndReplace failed: expected \"" + expectedValue + "\", got \"" + test1 + "\"."); 1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeStringTest::TestReverse() 1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test("backwards words say to used I"); 1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test.reverse(); 1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test.reverse(2, 4); 1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test.reverse(7, 2); 1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test.reverse(10, 3); 1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test.reverse(14, 5); 1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test.reverse(20, 9); 1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test != "I used to say words backwards") 1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("reverse() failed: Expected \"I used to say words backwards\",\n got \"" 1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru + test + "\""); 1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test=UNICODE_STRING("\\U0002f999\\U0001d15f\\u00c4\\u1ed0", 32).unescape(); 1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test.reverse(); 1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test.char32At(0)!=0x1ed0 || test.char32At(1)!=0xc4 || test.char32At(2)!=0x1d15f || test.char32At(4)!=0x2f999) { 1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("reverse() failed with supplementary characters"); 1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 102727f654740f2a26ad62a5c155af9199af9e69b889claireho 102827f654740f2a26ad62a5c155af9199af9e69b889claireho // Test case for ticket #8091: 102927f654740f2a26ad62a5c155af9199af9e69b889claireho // UnicodeString::reverse() failed to see a lead surrogate in the middle of 103027f654740f2a26ad62a5c155af9199af9e69b889claireho // an odd-length string that contains no other lead surrogates. 103127f654740f2a26ad62a5c155af9199af9e69b889claireho test=UNICODE_STRING_SIMPLE("ab\\U0001F4A9e").unescape(); 103227f654740f2a26ad62a5c155af9199af9e69b889claireho UnicodeString expected=UNICODE_STRING_SIMPLE("e\\U0001F4A9ba").unescape(); 103327f654740f2a26ad62a5c155af9199af9e69b889claireho test.reverse(); 103427f654740f2a26ad62a5c155af9199af9e69b889claireho if(test!=expected) { 103527f654740f2a26ad62a5c155af9199af9e69b889claireho errln("reverse() failed with only lead surrogate in the middle"); 103627f654740f2a26ad62a5c155af9199af9e69b889claireho } 1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeStringTest::TestMiscellaneous() 1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test1("This is a test"); 1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test2("This is a test"); 1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test3("Me too!"); 1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test getBuffer(minCapacity) and releaseBuffer() 1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1=UnicodeString(); // make sure that it starts with its stackBuffer 1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *p=test1.getBuffer(20); 1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test1.getCapacity()<20) { 1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString::getBuffer(20).getCapacity()<20"); 1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.append((UChar)7); // must not be able to modify the string here 1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.setCharAt(3, 7); 1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.reverse(); 1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( test1.length()!=0 || 1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.charAt(0)!=0xffff || test1.charAt(3)!=0xffff || 1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.getBuffer(10)!=0 || test1.getBuffer()!=0 1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString::getBuffer(minCapacity) allows read or write access to the UnicodeString"); 1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru p[0]=1; 1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru p[1]=2; 1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru p[2]=3; 1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.releaseBuffer(3); 1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.append((UChar)4); 1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test1.length()!=4 || test1.charAt(0)!=1 || test1.charAt(1)!=2 || test1.charAt(2)!=3 || test1.charAt(3)!=4) { 1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString::releaseBuffer(newLength) does not properly reallow access to the UnicodeString"); 1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test releaseBuffer() without getBuffer(minCapacity) - must not have any effect 1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.releaseBuffer(1); 1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test1.length()!=4 || test1.charAt(0)!=1 || test1.charAt(1)!=2 || test1.charAt(2)!=3 || test1.charAt(3)!=4) { 1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString::releaseBuffer(newLength) without getBuffer(minCapacity) changed the UnicodeString"); 1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test getBuffer(const) 1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *q=test1.getBuffer(), *r=test1.getBuffer(); 1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( test1.length()!=4 || 1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru q[0]!=1 || q[1]!=2 || q[2]!=3 || q[3]!=4 || 1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru r[0]!=1 || r[1]!=2 || r[2]!=3 || r[3]!=4 1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString::getBuffer(const) does not return a usable buffer pointer"); 1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test releaseBuffer() with a NUL-terminated buffer 1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.getBuffer(20)[2]=0; 1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.releaseBuffer(); // implicit -1 1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test1.length()!=2 || test1.charAt(0)!=1 || test1.charAt(1) !=2) { 1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString::releaseBuffer(-1) does not properly set the length of the UnicodeString"); 1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test releaseBuffer() with a non-NUL-terminated buffer 1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru p=test1.getBuffer(256); 1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(int32_t i=0; i<test1.getCapacity(); ++i) { 1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru p[i]=(UChar)1; // fill the buffer with all non-NUL code units 1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.releaseBuffer(); // implicit -1 1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test1.length()!=test1.getCapacity() || test1.charAt(1)!=1 || test1.charAt(100)!=1 || test1.charAt(test1.getCapacity()-1)!=1) { 1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString::releaseBuffer(-1 but no NUL) does not properly set the length of the UnicodeString"); 1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test getTerminatedBuffer() 1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1=UnicodeString("This is another test.", ""); 1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test2=UnicodeString("This is another test.", ""); 1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru q=test1.getTerminatedBuffer(); 1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(q[test1.length()]!=0 || test1!=test2 || test2.compare(q, -1)!=0) { 1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("getTerminatedBuffer()[length]!=0"); 1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar u[]={ 5, 6, 7, 8, 0 }; 1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.setTo(FALSE, u, 3); 1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru q=test1.getTerminatedBuffer(); 1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(q==u || q[0]!=5 || q[1]!=6 || q[2]!=7 || q[3]!=0) { 1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString(u[3]).getTerminatedBuffer() returns a bad buffer"); 1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.setTo(TRUE, u, -1); 1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru q=test1.getTerminatedBuffer(); 112250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(q!=u || test1.length()!=4 || q[3]!=8 || q[4]!=0) { 1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString(u[-1]).getTerminatedBuffer() returns a bad buffer"); 1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1=UNICODE_STRING("la", 2); 1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.append(UNICODE_STRING(" lila", 5).getTerminatedBuffer(), 0, -1); 1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test1!=UNICODE_STRING("la lila", 7)) { 1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString::append(const UChar *, start, length) failed"); 1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.insert(3, UNICODE_STRING("dudum ", 6), 0, INT32_MAX); 1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test1!=UNICODE_STRING("la dudum lila", 13)) { 1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString::insert(start, const UniStr &, start, length) failed"); 1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar ucs[]={ 0x68, 0x6d, 0x20, 0 }; 1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.insert(9, ucs, -1); 1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test1!=UNICODE_STRING("la dudum hm lila", 16)) { 1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString::insert(start, const UChar *, length) failed"); 1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test1.replace(9, 2, (UChar)0x2b); 1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test1!=UNICODE_STRING("la dudum + lila", 15)) { 1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString::replace(start, length, UChar) failed"); 1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test1.hasMetaData() || UnicodeString().hasMetaData()) { 1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString::hasMetaData() returns TRUE"); 1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 115150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 115250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // test getTerminatedBuffer() on a truncated, shared, heap-allocated string 115350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho test1=UNICODE_STRING_SIMPLE("abcdefghijklmnopqrstuvwxyz0123456789."); 115450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho test1.truncate(36); // ensure length()<getCapacity() 115550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho test2=test1; // share the buffer 115650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho test1.truncate(5); 115750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(test1.length()!=5 || test1.getTerminatedBuffer()[5]!=0) { 115850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("UnicodeString(shared buffer).truncate() failed"); 115950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 116050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(test2.length()!=36 || test2[5]!=0x66 || u_strlen(test2.getTerminatedBuffer())!=36) { 116150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("UnicodeString(shared buffer).truncate().getTerminatedBuffer() " 116250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "modified another copy of the string!"); 116350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 116450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho test1=UNICODE_STRING_SIMPLE("abcdefghijklmnopqrstuvwxyz0123456789."); 116550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho test1.truncate(36); // ensure length()<getCapacity() 116650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho test2=test1; // share the buffer 116750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho test1.remove(); 116850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(test1.length()!=0 || test1.getTerminatedBuffer()[0]!=0) { 116950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("UnicodeString(shared buffer).remove() failed"); 117050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 117150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(test2.length()!=36 || test2[0]!=0x61 || u_strlen(test2.getTerminatedBuffer())!=36) { 117250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("UnicodeString(shared buffer).remove().getTerminatedBuffer() " 117350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "modified another copy of the string!"); 117450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 117559d709d503bab6e2b61931737e662dd293b40578ccornelius 117659d709d503bab6e2b61931737e662dd293b40578ccornelius // ticket #9740 117759d709d503bab6e2b61931737e662dd293b40578ccornelius test1.setTo(TRUE, ucs, 3); 117859d709d503bab6e2b61931737e662dd293b40578ccornelius assertEquals("length of read-only alias", 3, test1.length()); 117959d709d503bab6e2b61931737e662dd293b40578ccornelius test1.trim(); 118059d709d503bab6e2b61931737e662dd293b40578ccornelius assertEquals("length of read-only alias after trim()", 2, test1.length()); 118159d709d503bab6e2b61931737e662dd293b40578ccornelius assertEquals("length of terminated buffer of read-only alias + trim()", 118259d709d503bab6e2b61931737e662dd293b40578ccornelius 2, u_strlen(test1.getTerminatedBuffer())); 1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeStringTest::TestStackAllocation() 1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar testString[] ={ 1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x72, 0x61, 0x7a, 0x79, 0x20, 0x74, 0x65, 0x73, 0x74, 0x2e, 0 }; 1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar guardWord = 0x4DED; 1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString* test = 0; 1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test = new UnicodeString(testString); 1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (*test != "This is a crazy test.") 1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Test string failed to initialize properly."); 1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (guardWord != 0x04DED) 1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Test string initialization overwrote guard word!"); 1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test->insert(8, "only "); 1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test->remove(15, 6); 1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (*test != "This is only a test.") 1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Manipulation of test string failed to work right."); 1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (guardWord != 0x4DED) 1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Manipulation of test string overwrote guard word!"); 1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // we have to deinitialize and release the backing store by calling the destructor 1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // explicitly, since we can't overload operator delete 1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete test; 1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar workingBuffer[] = { 1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6d, 0x65, 0x6e, 0x20, 0x74, 0x6f, 0x20, 1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x63, 0x6f, 0x6d, 0x65, 0xffff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; 1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar guardWord2 = 0x4DED; 1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test = new UnicodeString(workingBuffer, 35, 100); 1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (*test != "Now is the time for all men to come") 1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Stack-allocated backing store failed to initialize correctly."); 1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (guardWord2 != 0x4DED) 1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Stack-allocated backing store overwrote guard word!"); 1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test->insert(24, "good "); 1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (*test != "Now is the time for all good men to come") 1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("insert() on stack-allocated UnicodeString didn't work right"); 1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (guardWord2 != 0x4DED) 1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("insert() on stack-allocated UnicodeString overwrote guard word!"); 1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (workingBuffer[24] != 0x67) 1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("insert() on stack-allocated UnicodeString didn't affect backing store"); 1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *test += " to the aid of their country."; 1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (*test != "Now is the time for all good men to come to the aid of their country.") 1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Stack-allocated UnicodeString overflow didn't work"); 1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (guardWord2 != 0x4DED) 1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Stack-allocated UnicodeString overflow overwrote guard word!"); 1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *test = "ha!"; 1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (*test != "ha!") 1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Assignment to stack-allocated UnicodeString didn't work"); 1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (workingBuffer[0] != 0x4e) 1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Change to UnicodeString after overflow are still affecting original buffer"); 1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (guardWord2 != 0x4DED) 1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Change to UnicodeString after overflow overwrote guard word!"); 1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test read-only aliasing with setTo() 1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru workingBuffer[0] = 0x20ac; 1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru workingBuffer[1] = 0x125; 1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru workingBuffer[2] = 0; 1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test->setTo(TRUE, workingBuffer, 2); 1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test->length() != 2 || test->charAt(0) != 0x20ac || test->charAt(1) != 0x125) { 1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString.setTo(readonly alias) does not alias correctly"); 1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString *c=(UnicodeString *)test->clone(); 1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru workingBuffer[1] = 0x109; 1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test->charAt(1) != 0x109) { 1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString.setTo(readonly alias) made a copy: did not see change in buffer"); 1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(c->length() != 2 || c->charAt(1) != 0x125) { 1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("clone(alias) did not copy the buffer"); 1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete c; 1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test->setTo(TRUE, workingBuffer, -1); 1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test->length() != 2 || test->charAt(0) != 0x20ac || test->charAt(1) != 0x109) { 1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString.setTo(readonly alias, length -1) does not alias correctly"); 1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test->setTo(FALSE, workingBuffer, -1); 1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!test->isBogus()) { 1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString.setTo(unterminated readonly alias, length -1) does not result in isBogus()"); 1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete test; 1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test=new UnicodeString(); 1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar buffer[]={0x0061, 0x0062, 0x20ac, 0x0043, 0x0042, 0x0000}; 1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test->setTo(buffer, 4, 10); 1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test->length() !=4 || test->charAt(0) != 0x0061 || test->charAt(1) != 0x0062 || 1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test->charAt(2) != 0x20ac || test->charAt(3) != 0x0043){ 1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"UnicodeString.setTo(UChar*, length, capacity) does not work correctly\n" + prettify(*test)); 1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete test; 1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test the UChar32 constructor 1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString c32Test((UChar32)0x10ff2a); 1292103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if( c32Test.length() != U16_LENGTH(0x10ff2a) || 1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c32Test.char32At(c32Test.length() - 1) != 0x10ff2a 1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("The UnicodeString(UChar32) constructor does not work with a 0x10ff2a filler"); 1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test the (new) capacity constructor 1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString capTest(5, (UChar32)0x2a, 5); 1300103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if( capTest.length() != 5 * U16_LENGTH(0x2a) || 1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru capTest.char32At(0) != 0x2a || 1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru capTest.char32At(4) != 0x2a 1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("The UnicodeString capacity constructor does not work with an ASCII filler"); 1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru capTest = UnicodeString(5, (UChar32)0x10ff2a, 5); 1308103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if( capTest.length() != 5 * U16_LENGTH(0x10ff2a) || 1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru capTest.char32At(0) != 0x10ff2a || 1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru capTest.char32At(4) != 0x10ff2a 1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("The UnicodeString capacity constructor does not work with a 0x10ff2a filler"); 1313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru capTest = UnicodeString(5, (UChar32)0, 0); 1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(capTest.length() != 0) { 1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("The UnicodeString capacity constructor does not work with a 0x10ff2a filler"); 1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test the unescape() function. 1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid UnicodeStringTest::TestUnescape(void) { 1325c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString IN("abc\\u4567 \\n\\r \\U00101234xyz\\x1\\x{5289}\\x1b", -1, US_INV); 1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString OUT("abc"); 1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru OUT.append((UChar)0x4567); 1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru OUT.append(" "); 1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru OUT.append((UChar)0xA); 1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru OUT.append((UChar)0xD); 1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru OUT.append(" "); 1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru OUT.append((UChar32)0x00101234); 1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru OUT.append("xyz"); 1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru OUT.append((UChar32)1).append((UChar32)0x5289).append((UChar)0x1b); 1335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString result = IN.unescape(); 1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (result != OUT) { 1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: " + prettify(IN) + ".unescape() -> " + 1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru prettify(result) + ", expected " + 1339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru prettify(OUT)); 1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test that an empty string is returned in case of an error 1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!UNICODE_STRING("wrong \\u sequence", 17).unescape().isEmpty()) { 1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: unescaping of a string with an illegal escape sequence did not return an empty string"); 1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* test code point counting functions --------------------------------------- */ 1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* reference implementation of UnicodeString::hasMoreChar32Than() */ 1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t 1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru_refUnicodeStringHasMoreChar32Than(const UnicodeString &s, int32_t start, int32_t length, int32_t number) { 1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t count=s.countChar32(start, length); 1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return count>number; 1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* compare the real function against the reference */ 1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeStringTest::_testUnicodeStringHasMoreChar32Than(const UnicodeString &s, int32_t start, int32_t length, int32_t number) { 1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(s.hasMoreChar32Than(start, length, number)!=_refUnicodeStringHasMoreChar32Than(s, start, length, number)) { 1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("hasMoreChar32Than(%d, %d, %d)=%hd is wrong\n", 1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru start, length, number, s.hasMoreChar32Than(start, length, number)); 1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeStringTest::TestCountChar32(void) { 1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s=UNICODE_STRING("\\U0002f999\\U0001d15f\\u00c4\\u1ed0", 32).unescape(); 1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test countChar32() 1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // note that this also calls and tests u_countChar32(length>=0) 1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( 1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.countChar32()!=4 || 1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.countChar32(1)!=4 || 1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.countChar32(2)!=3 || 1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.countChar32(2, 3)!=2 || 1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.countChar32(2, 0)!=0 1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("UnicodeString::countChar32() failed"); 1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // NUL-terminate the string buffer and test u_countChar32(length=-1) 1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *buffer=s.getTerminatedBuffer(); 1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( 1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_countChar32(buffer, -1)!=4 || 1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_countChar32(buffer+1, -1)!=4 || 1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_countChar32(buffer+2, -1)!=3 || 1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_countChar32(buffer+3, -1)!=3 || 1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_countChar32(buffer+4, -1)!=2 || 1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_countChar32(buffer+5, -1)!=1 || 1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_countChar32(buffer+6, -1)!=0 1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ) { 1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("u_countChar32(length=-1) failed"); 1395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test u_countChar32() with bad input 1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(u_countChar32(NULL, 5)!=0 || u_countChar32(buffer, -2)!=0) { 1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("u_countChar32(bad input) failed (returned non-zero counts)"); 1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test data and variables for hasMoreChar32Than() */ 1404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar str[]={ 1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x61, 0x62, 0xd800, 0xdc00, 1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xd801, 0xdc01, 0x63, 0xd802, 1407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x64, 0xdc03, 0x65, 0x66, 1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0xd804, 0xdc04, 0xd805, 0xdc05, 1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x67 1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1411f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius UnicodeString string(str, UPRV_LENGTHOF(str)); 1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t start, length, number; 1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test hasMoreChar32Than() */ 1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(length=string.length(); length>=0; --length) { 1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(start=0; start<=length; ++start) { 1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(number=-1; number<=((length-start)+2); ++number) { 1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testUnicodeStringHasMoreChar32Than(string, start, length-start, number); 1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test hasMoreChar32Than() with pinning */ 1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(start=-1; start<=string.length()+1; ++start) { 1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(number=-1; number<=((string.length()-start)+2); ++number) { 1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testUnicodeStringHasMoreChar32Than(string, start, 0x7fffffff, number); 1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test hasMoreChar32Than() with a bogus string */ 1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru string.setToBogus(); 1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(length=-1; length<=1; ++length) { 1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(start=-1; start<=length; ++start) { 1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(number=-1; number<=((length-start)+2); ++number) { 1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _testUnicodeStringHasMoreChar32Than(string, start, length-start, number); 1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeStringTest::TestBogus() { 1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test1("This is a test"); 1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test2("This is a test"); 1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test3("Me too!"); 1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test isBogus() and setToBogus() 1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1.isBogus() || test2.isBogus() || test3.isBogus()) { 1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("A string returned TRUE for isBogus()!"); 1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // NULL pointers are treated like empty strings 1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // use other illegal arguments to make a bogus string 1454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.setTo(FALSE, test1.getBuffer(), -2); 1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!test3.isBogus()) { 1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("A bogus string returned FALSE for isBogus()!"); 1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1.hashCode() != test2.hashCode() || test1.hashCode() == test3.hashCode()) { 1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("hashCode() failed"); 1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test3.getBuffer()!=0 || test3.getBuffer(20)!=0 || test3.getTerminatedBuffer()!=0) { 1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("bogus.getBuffer()!=0"); 1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1.indexOf(test3) != -1) { 1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("bogus.indexOf() != -1"); 1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1.lastIndexOf(test3) != -1) { 1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("bogus.lastIndexOf() != -1"); 1469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1.caseCompare(test3, U_FOLD_CASE_DEFAULT) != 1 || test3.caseCompare(test1, U_FOLD_CASE_DEFAULT) != -1) { 1471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("caseCompare() doesn't work with bogus strings"); 1472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (test1.compareCodePointOrder(test3) != 1 || test3.compareCodePointOrder(test1) != -1) { 1474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("compareCodePointOrder() doesn't work with bogus strings"); 1475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // verify that non-assignment modifications fail and do not revive a bogus string 1478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.setToBogus(); 1479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.append((UChar)0x61); 1480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!test3.isBogus() || test3.getBuffer()!=0) { 1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("bogus.append('a') worked but must not"); 1482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.setToBogus(); 1485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.findAndReplace(UnicodeString((UChar)0x61), test2); 1486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!test3.isBogus() || test3.getBuffer()!=0) { 1487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("bogus.findAndReplace() worked but must not"); 1488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.setToBogus(); 1491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.trim(); 1492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!test3.isBogus() || test3.getBuffer()!=0) { 1493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("bogus.trim() revived bogus but must not"); 1494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.setToBogus(); 1497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.remove(1); 1498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!test3.isBogus() || test3.getBuffer()!=0) { 1499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("bogus.remove(1) revived bogus but must not"); 1500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.setToBogus(); 1503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!test3.setCharAt(0, 0x62).isBogus() || !test3.isEmpty()) { 1504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("bogus.setCharAt(0, 'b') worked but must not"); 1505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.setToBogus(); 1508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test3.truncate(1) || !test3.isBogus() || !test3.isEmpty()) { 1509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("bogus.truncate(1) revived bogus but must not"); 1510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // verify that assignments revive a bogus string 1513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.setToBogus(); 1514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!test3.isBogus() || (test3=test1).isBogus() || test3!=test1) { 1515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("bogus.operator=() failed"); 1516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.setToBogus(); 1519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!test3.isBogus() || test3.fastCopyFrom(test1).isBogus() || test3!=test1) { 1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("bogus.fastCopyFrom() failed"); 1521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.setToBogus(); 1524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!test3.isBogus() || test3.setTo(test1).isBogus() || test3!=test1) { 1525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("bogus.setTo(UniStr) failed"); 1526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.setToBogus(); 1529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!test3.isBogus() || test3.setTo(test1, 0).isBogus() || test3!=test1) { 1530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("bogus.setTo(UniStr, 0) failed"); 1531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.setToBogus(); 1534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!test3.isBogus() || test3.setTo(test1, 0, 0x7fffffff).isBogus() || test3!=test1) { 1535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("bogus.setTo(UniStr, 0, len) failed"); 1536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.setToBogus(); 1539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!test3.isBogus() || test3.setTo(test1.getBuffer(), test1.length()).isBogus() || test3!=test1) { 1540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("bogus.setTo(const UChar *, len) failed"); 1541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.setToBogus(); 1544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!test3.isBogus() || test3.setTo((UChar)0x2028).isBogus() || test3!=UnicodeString((UChar)0x2028)) { 1545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("bogus.setTo(UChar) failed"); 1546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.setToBogus(); 1549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!test3.isBogus() || test3.setTo((UChar32)0x1d157).isBogus() || test3!=UnicodeString((UChar32)0x1d157)) { 1550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("bogus.setTo(UChar32) failed"); 1551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.setToBogus(); 1554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!test3.isBogus() || test3.setTo(FALSE, test1.getBuffer(), test1.length()).isBogus() || test3!=test1) { 1555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("bogus.setTo(readonly alias) failed"); 1556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // writable alias to another string's buffer: very bad idea, just convenient for this test 1559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.setToBogus(); 15600596faeddefbf198de137d5e893708495ab1584cFredrik Roubert if(!test3.isBogus() || 15610596faeddefbf198de137d5e893708495ab1584cFredrik Roubert test3.setTo(const_cast<UChar *>(test1.getBuffer()), 15620596faeddefbf198de137d5e893708495ab1584cFredrik Roubert test1.length(), test1.getCapacity()).isBogus() || 15630596faeddefbf198de137d5e893708495ab1584cFredrik Roubert test3!=test1) { 1564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("bogus.setTo(writable alias) failed"); 1565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // verify simple, documented ways to turn a bogus string into an empty one 1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.setToBogus(); 1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!test3.isBogus() || (test3=UnicodeString()).isBogus() || !test3.isEmpty()) { 1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("bogus.operator=(UnicodeString()) failed"); 1571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.setToBogus(); 1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!test3.isBogus() || test3.setTo(UnicodeString()).isBogus() || !test3.isEmpty()) { 1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("bogus.setTo(UnicodeString()) failed"); 1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.setToBogus(); 1579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test3.remove().isBogus() || test3.getBuffer()==0 || !test3.isEmpty()) { 1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("bogus.remove() failed"); 1581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.setToBogus(); 1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test3.remove(0, INT32_MAX).isBogus() || test3.getBuffer()==0 || !test3.isEmpty()) { 1585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("bogus.remove(0, INT32_MAX) failed"); 1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.setToBogus(); 1589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test3.truncate(0) || test3.isBogus() || !test3.isEmpty()) { 1590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("bogus.truncate(0) failed"); 1591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.setToBogus(); 1594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!test3.isBogus() || test3.setTo((UChar32)-1).isBogus() || !test3.isEmpty()) { 1595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("bogus.setTo((UChar32)-1) failed"); 1596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar nul=0; 1599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.setToBogus(); 1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!test3.isBogus() || test3.setTo(&nul, 0).isBogus() || !test3.isEmpty()) { 1602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("bogus.setTo(&nul, 0) failed"); 1603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.setToBogus(); 1606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!test3.isBogus() || test3.getBuffer()!=0) { 1607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("setToBogus() failed to make a string bogus"); 1608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test3.setToBogus(); 1611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test1.isBogus() || !(test1=test3).isBogus()) { 1612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("normal=bogus failed to make the left string bogus"); 1613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test that NULL primitive input string values are treated like 1616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // empty strings, not errors (bogus) 1617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test2.setTo((UChar32)0x10005); 16180596faeddefbf198de137d5e893708495ab1584cFredrik Roubert if(test2.insert(1, nullptr, 1).length()!=2) { 16190596faeddefbf198de137d5e893708495ab1584cFredrik Roubert errln("UniStr.insert(...nullptr...) should not modify the string but does"); 1620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode errorCode=U_ZERO_ERROR; 1623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString 1624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test4((const UChar *)NULL), 1625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test5(TRUE, (const UChar *)NULL, 1), 1626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test6((UChar *)NULL, 5, 5), 1627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test7((const char *)NULL, 3, NULL, errorCode); 1628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test4.isBogus() || test5.isBogus() || test6.isBogus() || test7.isBogus()) { 1629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("a constructor set to bogus for a NULL input string, should be empty"); 1630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test4.setTo(NULL, 3); 1633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test5.setTo(TRUE, (const UChar *)NULL, 1); 1634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test6.setTo((UChar *)NULL, 5, 5); 1635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test4.isBogus() || test5.isBogus() || test6.isBogus()) { 1636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("a setTo() set to bogus for a NULL input string, should be empty"); 1637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test that bogus==bogus<any 1640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test1!=test3 || test1.compare(test3)!=0) { 1641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("bogus==bogus failed"); 1642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test2.remove(); 1645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(test1>=test2 || !(test2>test1) || test1.compare(test2)>=0 || !(test2.compare(test1)>0)) { 1646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("bogus<empty failed"); 1647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// StringEnumeration ------------------------------------------------------- *** 1651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// most of StringEnumeration is tested elsewhere 1652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// this test improves code coverage 1653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char *const 1655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerutestEnumStrings[]={ 1656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "a", 1657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "b", 1658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "c", 1659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "this is a long string which helps us test some buffer limits", 1660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee" 1661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 1662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass TestEnumeration : public StringEnumeration { 1664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 1665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestEnumeration() : i(0) {} 1666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual int32_t count(UErrorCode& /*status*/) const { 1668f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius return UPRV_LENGTHOF(testEnumStrings); 1669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual const UnicodeString *snext(UErrorCode &status) { 1672f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(U_SUCCESS(status) && i<UPRV_LENGTHOF(testEnumStrings)) { 1673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru unistr=UnicodeString(testEnumStrings[i++], ""); 1674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return &unistr; 1675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 1678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual void reset(UErrorCode& /*status*/) { 1681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i=0; 1682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static inline UClassID getStaticClassID() { 1685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (UClassID)&fgClassID; 1686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UClassID getDynamicClassID() const { 1688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return getStaticClassID(); 1689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprivate: 1692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char fgClassID; 1693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 169459d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t i; 1695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 1696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char TestEnumeration::fgClassID=0; 1698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeStringTest::TestStringEnumeration() { 1701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s; 1702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestEnumeration ten; 1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i, length; 1704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status; 1705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *pu; 1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *pc; 1708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test the next() default implementation and ensureCharsCapacity() 1710f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius for(i=0; i<UPRV_LENGTHOF(testEnumStrings); ++i) { 1711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status=U_ZERO_ERROR; 1712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pc=ten.next(&length, status); 1713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s=UnicodeString(testEnumStrings[i], ""); 1714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status) || pc==NULL || length!=s.length() || UnicodeString(pc, length, "")!=s) { 1715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("StringEnumeration.next(%d) failed", i); 1716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status=U_ZERO_ERROR; 1719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(ten.next(&length, status)!=NULL) { 1720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("StringEnumeration.next(done)!=NULL"); 1721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test the unext() default implementation 1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ten.reset(status); 1725f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius for(i=0; i<UPRV_LENGTHOF(testEnumStrings); ++i) { 1726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status=U_ZERO_ERROR; 1727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pu=ten.unext(&length, status); 1728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s=UnicodeString(testEnumStrings[i], ""); 1729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status) || pu==NULL || length!=s.length() || UnicodeString(TRUE, pu, length)!=s) { 1730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("StringEnumeration.unext(%d) failed", i); 1731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status=U_ZERO_ERROR; 1734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(ten.unext(&length, status)!=NULL) { 1735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("StringEnumeration.unext(done)!=NULL"); 1736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test that the default clone() implementation works, and returns NULL 1739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(ten.clone()!=NULL) { 1740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("StringEnumeration.clone()!=NULL"); 1741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1742b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1743b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // test that uenum_openFromStringEnumeration() works 1744b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Need a heap allocated string enumeration because it is adopted by the UEnumeration. 1745b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru StringEnumeration *newTen = new TestEnumeration; 1746b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru status=U_ZERO_ERROR; 1747b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UEnumeration *uten = uenum_openFromStringEnumeration(newTen, &status); 1748b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (uten==NULL || U_FAILURE(status)) { 1749b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errln("fail at file %s, line %d, UErrorCode is %s\n", __FILE__, __LINE__, u_errorName(status)); 1750b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 1751b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1752b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1753b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // test uenum_next() 1754f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius for(i=0; i<UPRV_LENGTHOF(testEnumStrings); ++i) { 1755b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru status=U_ZERO_ERROR; 1756b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru pc=uenum_next(uten, &length, &status); 1757b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(U_FAILURE(status) || pc==NULL || strcmp(pc, testEnumStrings[i]) != 0) { 1758b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errln("File %s, line %d, StringEnumeration.next(%d) failed", __FILE__, __LINE__, i); 1759b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1760b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1761b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru status=U_ZERO_ERROR; 1762b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(uenum_next(uten, &length, &status)!=NULL) { 1763b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errln("File %s, line %d, uenum_next(done)!=NULL"); 1764b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1765b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1766b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // test the uenum_unext() 1767b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uenum_reset(uten, &status); 1768f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius for(i=0; i<UPRV_LENGTHOF(testEnumStrings); ++i) { 1769b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru status=U_ZERO_ERROR; 1770b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru pu=uenum_unext(uten, &length, &status); 1771b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru s=UnicodeString(testEnumStrings[i], ""); 1772b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(U_FAILURE(status) || pu==NULL || length!=s.length() || UnicodeString(TRUE, pu, length)!=s) { 1773b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errln("File %s, Line %d, uenum_unext(%d) failed", __FILE__, __LINE__, i); 1774b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1775b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1776b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru status=U_ZERO_ERROR; 1777b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(uenum_unext(uten, &length, &status)!=NULL) { 1778b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errln("File %s, Line %d, uenum_unext(done)!=NULL" __FILE__, __LINE__); 1779b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1780b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1781b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uenum_close(uten); 1782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 1785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Namespace test, to make sure that macros like UNICODE_STRING include the 1786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * namespace qualifier. 1787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 1788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Define a (bogus) UnicodeString class in another namespace and check for ambiguity. 1789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querunamespace bogus { 1791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru class UnicodeString { 1792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru public: 1793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru enum EInvariant { kInvariant }; 1794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString() : i(1) {} 179559d709d503bab6e2b61931737e662dd293b40578ccornelius UnicodeString(UBool /*isTerminated*/, const UChar * /*text*/, int32_t textLength) : i(textLength) {(void)i;} 1796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString(const char * /*src*/, int32_t length, enum EInvariant /*inv*/ 1797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru) : i(length) {} 1798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru private: 1799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i; 1800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 1804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeStringTest::TestNameSpace() { 1805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Provoke name collision unless the UnicodeString macros properly 1806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // qualify the icu::UnicodeString class. 1807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru using namespace bogus; 1808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Use all UnicodeString macros from unistr.h. 1810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru icu::UnicodeString s1=icu::UnicodeString("abc", 3, US_INV); 1811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru icu::UnicodeString s2=UNICODE_STRING("def", 3); 1812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru icu::UnicodeString s3=UNICODE_STRING_SIMPLE("ghi"); 1813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Make sure the compiler does not optimize away instantiation of s1, s2, s3. 1815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru icu::UnicodeString s4=s1+s2+s3; 1816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(s4.length()!=9) { 1817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Something wrong with UnicodeString::operator+()."); 1818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1820b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1821b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid 1822b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruUnicodeStringTest::TestUTF32() { 1823b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Input string length US_STACKBUF_SIZE to cause overflow of the 1824b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // initially chosen fStackBuffer due to supplementary characters. 1825b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru static const UChar32 utf32[] = { 1826b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 0x41, 0xd900, 0x61, 0xdc00, -1, 0x110000, 0x5a, 0x50000, 0x7a, 1827b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 0x10000, 0x20000, 0xe0000, 0x10ffff 1828b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }; 1829b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru static const UChar expected_utf16[] = { 1830b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 0x41, 0xfffd, 0x61, 0xfffd, 0xfffd, 0xfffd, 0x5a, 0xd900, 0xdc00, 0x7a, 1831b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 0xd800, 0xdc00, 0xd840, 0xdc00, 0xdb40, 0xdc00, 0xdbff, 0xdfff 1832b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }; 1833f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius UnicodeString from32 = UnicodeString::fromUTF32(utf32, UPRV_LENGTHOF(utf32)); 1834f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius UnicodeString expected(FALSE, expected_utf16, UPRV_LENGTHOF(expected_utf16)); 1835b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(from32 != expected) { 1836b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errln("UnicodeString::fromUTF32() did not create the expected string."); 1837b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1838b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1839b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru static const UChar utf16[] = { 1840b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 0x41, 0xd900, 0x61, 0xdc00, 0x5a, 0xd900, 0xdc00, 0x7a, 0xd800, 0xdc00, 0xdbff, 0xdfff 1841b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }; 1842b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru static const UChar32 expected_utf32[] = { 1843b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 0x41, 0xfffd, 0x61, 0xfffd, 0x5a, 0x50000, 0x7a, 0x10000, 0x10ffff 1844b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }; 1845b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UChar32 result32[16]; 1846b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode errorCode = U_ZERO_ERROR; 1847b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t length32 = 1848f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius UnicodeString(FALSE, utf16, UPRV_LENGTHOF(utf16)). 1849f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius toUTF32(result32, UPRV_LENGTHOF(result32), errorCode); 1850f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if( length32 != UPRV_LENGTHOF(expected_utf32) || 1851b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 0 != uprv_memcmp(result32, expected_utf32, length32*4) || 1852b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru result32[length32] != 0 1853b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ) { 1854b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errln("UnicodeString::toUTF32() did not create the expected string."); 1855b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1856b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 1857b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 185827f654740f2a26ad62a5c155af9199af9e69b889clairehoclass TestCheckedArrayByteSink : public CheckedArrayByteSink { 185927f654740f2a26ad62a5c155af9199af9e69b889clairehopublic: 186027f654740f2a26ad62a5c155af9199af9e69b889claireho TestCheckedArrayByteSink(char* outbuf, int32_t capacity) 186127f654740f2a26ad62a5c155af9199af9e69b889claireho : CheckedArrayByteSink(outbuf, capacity), calledFlush(FALSE) {} 186227f654740f2a26ad62a5c155af9199af9e69b889claireho virtual void Flush() { calledFlush = TRUE; } 186327f654740f2a26ad62a5c155af9199af9e69b889claireho UBool calledFlush; 186427f654740f2a26ad62a5c155af9199af9e69b889claireho}; 186527f654740f2a26ad62a5c155af9199af9e69b889claireho 1866b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid 1867b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruUnicodeStringTest::TestUTF8() { 1868b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru static const uint8_t utf8[] = { 1869b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Code points: 1870b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // 0x41, 0xd900, 1871b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // 0x61, 0xdc00, 1872b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // 0x110000, 0x5a, 1873b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // 0x50000, 0x7a, 1874b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // 0x10000, 0x20000, 1875b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // 0xe0000, 0x10ffff 1876b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 0x41, 0xed, 0xa4, 0x80, 1877b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 0x61, 0xed, 0xb0, 0x80, 1878b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 0xf4, 0x90, 0x80, 0x80, 0x5a, 1879b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 0xf1, 0x90, 0x80, 0x80, 0x7a, 1880b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 0xf0, 0x90, 0x80, 0x80, 0xf0, 0xa0, 0x80, 0x80, 1881b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 0xf3, 0xa0, 0x80, 0x80, 0xf4, 0x8f, 0xbf, 0xbf 1882b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }; 1883b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru static const UChar expected_utf16[] = { 1884ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert 0x41, 0xfffd, 0xfffd, 0xfffd, 1885ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert 0x61, 0xfffd, 0xfffd, 0xfffd, 1886ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert 0xfffd, 0xfffd, 0xfffd, 0xfffd,0x5a, 1887b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 0xd900, 0xdc00, 0x7a, 1888b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 0xd800, 0xdc00, 0xd840, 0xdc00, 1889b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 0xdb40, 0xdc00, 0xdbff, 0xdfff 1890b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }; 1891b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UnicodeString from8 = UnicodeString::fromUTF8(StringPiece((const char *)utf8, (int32_t)sizeof(utf8))); 1892f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius UnicodeString expected(FALSE, expected_utf16, UPRV_LENGTHOF(expected_utf16)); 1893b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1894b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(from8 != expected) { 1895b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errln("UnicodeString::fromUTF8(StringPiece) did not create the expected string."); 1896b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1897103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius std::string utf8_string((const char *)utf8, sizeof(utf8)); 1898b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UnicodeString from8b = UnicodeString::fromUTF8(utf8_string); 1899b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(from8b != expected) { 1900b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errln("UnicodeString::fromUTF8(std::string) did not create the expected string."); 1901b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1902b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1903b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru static const UChar utf16[] = { 1904b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 0x41, 0xd900, 0x61, 0xdc00, 0x5a, 0xd900, 0xdc00, 0x7a, 0xd800, 0xdc00, 0xdbff, 0xdfff 1905b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }; 1906b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru static const uint8_t expected_utf8[] = { 1907b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 0x41, 0xef, 0xbf, 0xbd, 0x61, 0xef, 0xbf, 0xbd, 0x5a, 0xf1, 0x90, 0x80, 0x80, 0x7a, 1908b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 0xf0, 0x90, 0x80, 0x80, 0xf4, 0x8f, 0xbf, 0xbf 1909b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }; 1910f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius UnicodeString us(FALSE, utf16, UPRV_LENGTHOF(utf16)); 1911b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1912b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru char buffer[64]; 191327f654740f2a26ad62a5c155af9199af9e69b889claireho TestCheckedArrayByteSink sink(buffer, (int32_t)sizeof(buffer)); 1914b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru us.toUTF8(sink); 1915b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if( sink.NumberOfBytesWritten() != (int32_t)sizeof(expected_utf8) || 1916b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 0 != uprv_memcmp(buffer, expected_utf8, sizeof(expected_utf8)) 1917b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ) { 1918b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errln("UnicodeString::toUTF8() did not create the expected string."); 1919b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 192027f654740f2a26ad62a5c155af9199af9e69b889claireho if(!sink.calledFlush) { 192127f654740f2a26ad62a5c155af9199af9e69b889claireho errln("UnicodeString::toUTF8(sink) did not sink.Flush()."); 192227f654740f2a26ad62a5c155af9199af9e69b889claireho } 1923b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Initial contents for testing that toUTF8String() appends. 1924103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius std::string result8 = "-->"; 1925103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius std::string expected8 = "-->" + std::string((const char *)expected_utf8, sizeof(expected_utf8)); 1926b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Use the return value just for testing. 1927103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius std::string &result8r = us.toUTF8String(result8); 1928b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if(result8r != expected8 || &result8r != &result8) { 1929b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errln("UnicodeString::toUTF8String() did not create the expected string."); 1930b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1931b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 193250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 193350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// Test if this compiler supports Return Value Optimization of unnamed temporary objects. 193450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic UnicodeString wrapUChars(const UChar *uchars) { 193550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return UnicodeString(TRUE, uchars, -1); 193650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 193750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 193850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid 193950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeStringTest::TestReadOnlyAlias() { 194050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar uchars[]={ 0x61, 0x62, 0 }; 194150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString alias(TRUE, uchars, 2); 194250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(alias.length()!=2 || alias.getBuffer()!=uchars || alias.getTerminatedBuffer()!=uchars) { 194350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("UnicodeString read-only-aliasing constructor does not behave as expected."); 194450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return; 194550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 194650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho alias.truncate(1); 194750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(alias.length()!=1 || alias.getBuffer()!=uchars) { 194850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("UnicodeString(read-only-alias).truncate() did not preserve aliasing as expected."); 194950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 195050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(alias.getTerminatedBuffer()==uchars) { 195150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("UnicodeString(read-only-alias).truncate().getTerminatedBuffer() " 195250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "did not allocate and copy as expected."); 195350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 195450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(uchars[1]!=0x62) { 195550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("UnicodeString(read-only-alias).truncate().getTerminatedBuffer() " 195650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "modified the original buffer."); 195750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 195850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(1!=u_strlen(alias.getTerminatedBuffer())) { 195950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("UnicodeString(read-only-alias).truncate().getTerminatedBuffer() " 196050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "does not return a buffer terminated at the proper length."); 196150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 196250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 196350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho alias.setTo(TRUE, uchars, 2); 196450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(alias.length()!=2 || alias.getBuffer()!=uchars || alias.getTerminatedBuffer()!=uchars) { 196550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("UnicodeString read-only-aliasing setTo() does not behave as expected."); 196650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return; 196750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 196850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho alias.remove(); 196950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(alias.length()!=0) { 197050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("UnicodeString(read-only-alias).remove() did not work."); 197150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 197250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(alias.getTerminatedBuffer()==uchars) { 197350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("UnicodeString(read-only-alias).remove().getTerminatedBuffer() " 197450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "did not un-alias as expected."); 197550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 197650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(uchars[0]!=0x61) { 197750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("UnicodeString(read-only-alias).remove().getTerminatedBuffer() " 197850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "modified the original buffer."); 197950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 198050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(0!=u_strlen(alias.getTerminatedBuffer())) { 198150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("UnicodeString.setTo(read-only-alias).remove().getTerminatedBuffer() " 198250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "does not return a buffer terminated at length 0."); 198350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 198450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 198550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString longString=UNICODE_STRING_SIMPLE("abcdefghijklmnopqrstuvwxyz0123456789"); 198650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho alias.setTo(FALSE, longString.getBuffer(), longString.length()); 198750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho alias.remove(0, 10); 198850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(longString.compare(10, INT32_MAX, alias)!=0 || alias.getBuffer()!=longString.getBuffer()+10) { 198950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("UnicodeString.setTo(read-only-alias).remove(0, 10) did not preserve aliasing as expected."); 199050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 199150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho alias.setTo(FALSE, longString.getBuffer(), longString.length()); 199250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho alias.remove(27, 99); 199350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(longString.compare(0, 27, alias)!=0 || alias.getBuffer()!=longString.getBuffer()) { 199450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("UnicodeString.setTo(read-only-alias).remove(27, 99) did not preserve aliasing as expected."); 199550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 199650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho alias.setTo(FALSE, longString.getBuffer(), longString.length()); 199750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho alias.retainBetween(6, 30); 199850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(longString.compare(6, 24, alias)!=0 || alias.getBuffer()!=longString.getBuffer()+6) { 199950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("UnicodeString.setTo(read-only-alias).retainBetween(6, 30) did not preserve aliasing as expected."); 200050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 200150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 200250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar abc[]={ 0x61, 0x62, 0x63, 0 }; 200350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UBool hasRVO= wrapUChars(abc).getBuffer()==abc; 200450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 200550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString temp; 200650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho temp.fastCopyFrom(longString.tempSubString()); 200750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(temp!=longString || (hasRVO && temp.getBuffer()!=longString.getBuffer())) { 200850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("UnicodeString.tempSubString() failed"); 200950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 201050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho temp.fastCopyFrom(longString.tempSubString(-3, 5)); 201150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(longString.compare(0, 5, temp)!=0 || (hasRVO && temp.getBuffer()!=longString.getBuffer())) { 201250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("UnicodeString.tempSubString(-3, 5) failed"); 201350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 201450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho temp.fastCopyFrom(longString.tempSubString(17)); 201550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(longString.compare(17, INT32_MAX, temp)!=0 || (hasRVO && temp.getBuffer()!=longString.getBuffer()+17)) { 201650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("UnicodeString.tempSubString(17) failed"); 201750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 201850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho temp.fastCopyFrom(longString.tempSubString(99)); 201950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(!temp.isEmpty()) { 202050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("UnicodeString.tempSubString(99) failed"); 202150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 202250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho temp.fastCopyFrom(longString.tempSubStringBetween(6)); 202350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(longString.compare(6, INT32_MAX, temp)!=0 || (hasRVO && temp.getBuffer()!=longString.getBuffer()+6)) { 202450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("UnicodeString.tempSubStringBetween(6) failed"); 202550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 202650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho temp.fastCopyFrom(longString.tempSubStringBetween(8, 18)); 202750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(longString.compare(8, 10, temp)!=0 || (hasRVO && temp.getBuffer()!=longString.getBuffer()+8)) { 202850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("UnicodeString.tempSubStringBetween(8, 18) failed"); 202950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 203050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString bogusString; 203150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho bogusString.setToBogus(); 203250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho temp.fastCopyFrom(bogusString.tempSubStringBetween(8, 18)); 203350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(!temp.isBogus()) { 203450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho errln("UnicodeString.setToBogus().tempSubStringBetween(8, 18) failed"); 203550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 203650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 2037b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2038b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid 2039b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoUnicodeStringTest::doTestAppendable(UnicodeString &dest, Appendable &app) { 2040b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const UChar cde[3]={ 0x63, 0x64, 0x65 }; 2041b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const UChar fg[3]={ 0x66, 0x67, 0 }; 2042b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(!app.reserveAppendCapacity(12)) { 2043b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("Appendable.reserve(12) failed"); 2044b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2045b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho app.appendCodeUnit(0x61); 2046b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho app.appendCodePoint(0x62); 2047b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho app.appendCodePoint(0x50000); 2048b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho app.appendString(cde, 3); 2049b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho app.appendString(fg, -1); 2050b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UChar scratch[3]; 2051b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t capacity=-1; 2052b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UChar *buffer=app.getAppendBuffer(3, 3, scratch, 3, &capacity); 2053b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(capacity<3) { 2054b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("Appendable.getAppendBuffer(min=3) returned capacity=%d<3", (int)capacity); 2055b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 2056b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2057b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const UChar hij[3]={ 0x68, 0x69, 0x6a }; 2058b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho u_memcpy(buffer, hij, 3); 2059b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho app.appendString(buffer, 3); 2060b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(dest!=UNICODE_STRING_SIMPLE("ab\\U00050000cdefghij").unescape()) { 2061b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("Appendable.append(...) failed"); 2062b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2063b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho buffer=app.getAppendBuffer(0, 3, scratch, 3, &capacity); 2064b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(buffer!=NULL || capacity!=0) { 2065b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("Appendable.getAppendBuffer(min=0) failed"); 2066b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2067b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho capacity=1; 2068b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho buffer=app.getAppendBuffer(3, 3, scratch, 2, &capacity); 2069b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(buffer!=NULL || capacity!=0) { 2070b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("Appendable.getAppendBuffer(scratch<min) failed"); 2071b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2072b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 2073b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2074b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoclass SimpleAppendable : public Appendable { 2075b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehopublic: 2076b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho explicit SimpleAppendable(UnicodeString &dest) : str(dest) {} 2077b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho virtual UBool appendCodeUnit(UChar c) { str.append(c); return TRUE; } 2078b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho SimpleAppendable &reset() { str.remove(); return *this; } 2079b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoprivate: 2080b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString &str; 2081b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}; 2082b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2083b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid 2084b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoUnicodeStringTest::TestAppendable() { 2085b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString dest; 2086b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho SimpleAppendable app(dest); 2087b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho doTestAppendable(dest, app); 2088b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 2089b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2090b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid 2091b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoUnicodeStringTest::TestUnicodeStringImplementsAppendable() { 2092b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString dest; 2093b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeStringAppendable app(dest); 2094b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho doTestAppendable(dest, app); 2095b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 2096b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2097b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid 2098b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoUnicodeStringTest::TestSizeofUnicodeString() { 2099b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // See the comments in unistr.h near the declaration of UnicodeString's fields. 2100c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // See the API comments for UNISTR_OBJECT_SIZE. 2101b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho size_t sizeofUniStr=sizeof(UnicodeString); 2102c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert size_t expected=UNISTR_OBJECT_SIZE; 2103b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(expected!=sizeofUniStr) { 2104c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // Possible cause: UNISTR_OBJECT_SIZE may not be a multiple of sizeof(pointer), 2105c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // of the compiler might add more internal padding than expected. 2106c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("sizeof(UnicodeString)=%d, expected UNISTR_OBJECT_SIZE=%d", 2107c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert (int)sizeofUniStr, (int)expected); 2108c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 2109c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(sizeofUniStr<32) { 2110c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("sizeof(UnicodeString)=%d < 32, probably too small", (int)sizeofUniStr); 2111c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 2112c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // We assume that the entire UnicodeString object, 2113c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // minus the vtable pointer and 2 bytes for flags and short length, 2114c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // is available for internal storage of UChars. 2115c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert int32_t expectedStackBufferLength=((int32_t)UNISTR_OBJECT_SIZE-sizeof(void *)-2)/U_SIZEOF_UCHAR; 2116c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString s; 2117c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert const UChar *emptyBuffer=s.getBuffer(); 2118c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert for(int32_t i=0; i<expectedStackBufferLength; ++i) { 2119c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert s.append((UChar)0x2e); 2120c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 2121c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert const UChar *fullBuffer=s.getBuffer(); 2122c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(fullBuffer!=emptyBuffer) { 2123c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("unexpected reallocation when filling with assumed stack buffer size of %d", 2124c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert expectedStackBufferLength); 2125c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 2126c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert const UChar *terminatedBuffer=s.getTerminatedBuffer(); 2127c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(terminatedBuffer==emptyBuffer) { 2128c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("unexpected keeping stack buffer when overfilling assumed stack buffer size of %d", 2129c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert expectedStackBufferLength); 2130c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 2131c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert} 2132c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 2133c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertvoid 2134c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik RoubertUnicodeStringTest::TestMoveSwap() { 2135c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert static const UChar abc[3] = { 0x61, 0x62, 0x63 }; // "abc" 2136c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString s1(FALSE, abc, UPRV_LENGTHOF(abc)); // read-only alias 2137c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString s2(100, 0x7a, 100); // 100 * 'z' should be on the heap 2138c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString s3("defg", 4, US_INV); // in stack buffer 2139c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert const UChar *p = s2.getBuffer(); 2140c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert s1.swap(s2); 2141c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(s1.getBuffer() != p || s1.length() != 100 || s2.getBuffer() != abc || s2.length() != 3) { 2142c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("UnicodeString.swap() did not swap"); 2143c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 2144c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert swap(s2, s3); 2145c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(s2 != UNICODE_STRING_SIMPLE("defg") || s3.getBuffer() != abc || s3.length() != 3) { 2146c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("swap(UnicodeString) did not swap back"); 2147c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 2148c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString s4; 2149c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert s4.moveFrom(s1); 2150c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(s4.getBuffer() != p || s4.length() != 100 || !s1.isBogus()) { 2151c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("UnicodeString.moveFrom(heap) did not move"); 2152c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 2153c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString s5; 2154c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert s5.moveFrom(s2); 2155c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(s5 != UNICODE_STRING_SIMPLE("defg")) { 2156c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("UnicodeString.moveFrom(stack) did not move"); 2157c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 2158c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString s6; 2159c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert s6.moveFrom(s3); 2160c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(s6.getBuffer() != abc || s6.length() != 3) { 2161c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("UnicodeString.moveFrom(alias) did not move"); 2162c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 2163c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert infoln("TestMoveSwap() with rvalue references"); 2164c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert s1 = static_cast<UnicodeString &&>(s6); 2165c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(s1.getBuffer() != abc || s1.length() != 3) { 2166c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("UnicodeString move assignment operator did not move"); 2167c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 2168c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString s7(static_cast<UnicodeString &&>(s4)); 2169c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(s7.getBuffer() != p || s7.length() != 100 || !s4.isBogus()) { 2170c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("UnicodeString move constructor did not move"); 2171c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 2172c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 2173c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // Move self assignment leaves the object valid but in an undefined state. 2174c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // Do it to make sure there is no crash, 2175c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // but do not check for any particular resulting value. 2176c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert s1.moveFrom(s1); 2177c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert s2.moveFrom(s2); 2178c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert s3.moveFrom(s3); 2179c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert s4.moveFrom(s4); 2180c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert s5.moveFrom(s5); 2181c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert s6.moveFrom(s6); 2182c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert s7.moveFrom(s7); 2183c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // Simple copy assignment must work. 2184c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString simple = UNICODE_STRING_SIMPLE("simple"); 2185c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert s1 = s6 = s4 = s7 = simple; 2186c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if(s1 != simple || s4 != simple || s6 != simple || s7 != simple) { 2187c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("UnicodeString copy after self-move did not work"); 2188b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2189b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 21900596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 21910596faeddefbf198de137d5e893708495ab1584cFredrik Roubertvoid 21920596faeddefbf198de137d5e893708495ab1584cFredrik RoubertUnicodeStringTest::TestUInt16Pointers() { 21930596faeddefbf198de137d5e893708495ab1584cFredrik Roubert static const uint16_t carr[] = { 0x61, 0x62, 0x63, 0 }; 21940596faeddefbf198de137d5e893708495ab1584cFredrik Roubert uint16_t arr[4]; 21950596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 21960596faeddefbf198de137d5e893708495ab1584cFredrik Roubert UnicodeString expected(u"abc"); 21970596faeddefbf198de137d5e893708495ab1584cFredrik Roubert assertEquals("abc from pointer", expected, UnicodeString(carr)); 21980596faeddefbf198de137d5e893708495ab1584cFredrik Roubert assertEquals("abc from pointer+length", expected, UnicodeString(carr, 3)); 21990596faeddefbf198de137d5e893708495ab1584cFredrik Roubert assertEquals("abc from read-only-alias pointer", expected, UnicodeString(TRUE, carr, 3)); 22000596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 22010596faeddefbf198de137d5e893708495ab1584cFredrik Roubert UnicodeString alias(arr, 0, 4); 22020596faeddefbf198de137d5e893708495ab1584cFredrik Roubert alias.append(u'a').append(u'b').append(u'c'); 22030596faeddefbf198de137d5e893708495ab1584cFredrik Roubert assertEquals("abc from writable alias", expected, alias); 22040596faeddefbf198de137d5e893708495ab1584cFredrik Roubert assertEquals("buffer=abc from writable alias", expected, UnicodeString(arr, 3)); 22050596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 22060596faeddefbf198de137d5e893708495ab1584cFredrik Roubert UErrorCode errorCode = U_ZERO_ERROR; 22070596faeddefbf198de137d5e893708495ab1584cFredrik Roubert int32_t length = UnicodeString(u"def").extract(arr, 4, errorCode); 22080596faeddefbf198de137d5e893708495ab1584cFredrik Roubert TEST_ASSERT_STATUS(errorCode); 22090596faeddefbf198de137d5e893708495ab1584cFredrik Roubert assertEquals("def from extract()", UnicodeString(u"def"), UnicodeString(arr, length)); 22100596faeddefbf198de137d5e893708495ab1584cFredrik Roubert} 22110596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 22120596faeddefbf198de137d5e893708495ab1584cFredrik Roubertvoid 22130596faeddefbf198de137d5e893708495ab1584cFredrik RoubertUnicodeStringTest::TestWCharPointers() { 22140596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#if U_SIZEOF_WCHAR_T==2 22150596faeddefbf198de137d5e893708495ab1584cFredrik Roubert static const wchar_t carr[] = { 0x61, 0x62, 0x63, 0 }; 22160596faeddefbf198de137d5e893708495ab1584cFredrik Roubert wchar_t arr[4]; 22170596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 22180596faeddefbf198de137d5e893708495ab1584cFredrik Roubert UnicodeString expected(u"abc"); 22190596faeddefbf198de137d5e893708495ab1584cFredrik Roubert assertEquals("abc from pointer", expected, UnicodeString(carr)); 22200596faeddefbf198de137d5e893708495ab1584cFredrik Roubert assertEquals("abc from pointer+length", expected, UnicodeString(carr, 3)); 22210596faeddefbf198de137d5e893708495ab1584cFredrik Roubert assertEquals("abc from read-only-alias pointer", expected, UnicodeString(TRUE, carr, 3)); 22220596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 22230596faeddefbf198de137d5e893708495ab1584cFredrik Roubert UnicodeString alias(arr, 0, 4); 22240596faeddefbf198de137d5e893708495ab1584cFredrik Roubert alias.append(u'a').append(u'b').append(u'c'); 22250596faeddefbf198de137d5e893708495ab1584cFredrik Roubert assertEquals("abc from writable alias", expected, alias); 22260596faeddefbf198de137d5e893708495ab1584cFredrik Roubert assertEquals("buffer=abc from writable alias", expected, UnicodeString(arr, 3)); 22270596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 22280596faeddefbf198de137d5e893708495ab1584cFredrik Roubert UErrorCode errorCode = U_ZERO_ERROR; 22290596faeddefbf198de137d5e893708495ab1584cFredrik Roubert int32_t length = UnicodeString(u"def").extract(arr, 4, errorCode); 22300596faeddefbf198de137d5e893708495ab1584cFredrik Roubert TEST_ASSERT_STATUS(errorCode); 22310596faeddefbf198de137d5e893708495ab1584cFredrik Roubert assertEquals("def from extract()", UnicodeString(u"def"), UnicodeString(arr, length)); 22320596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#endif 22330596faeddefbf198de137d5e893708495ab1584cFredrik Roubert} 22340596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 22350596faeddefbf198de137d5e893708495ab1584cFredrik Roubertvoid 22360596faeddefbf198de137d5e893708495ab1584cFredrik RoubertUnicodeStringTest::TestNullPointers() { 22370596faeddefbf198de137d5e893708495ab1584cFredrik Roubert assertTrue("empty from nullptr", UnicodeString(nullptr).isEmpty()); 22380596faeddefbf198de137d5e893708495ab1584cFredrik Roubert assertTrue("empty from nullptr+length", UnicodeString(nullptr, 2).isEmpty()); 22390596faeddefbf198de137d5e893708495ab1584cFredrik Roubert assertTrue("empty from read-only-alias nullptr", UnicodeString(TRUE, nullptr, 3).isEmpty()); 22400596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 22410596faeddefbf198de137d5e893708495ab1584cFredrik Roubert UnicodeString alias(nullptr, 4, 4); // empty, no alias 22420596faeddefbf198de137d5e893708495ab1584cFredrik Roubert assertTrue("empty from writable alias", alias.isEmpty()); 22430596faeddefbf198de137d5e893708495ab1584cFredrik Roubert alias.append(u'a').append(u'b').append(u'c'); 22440596faeddefbf198de137d5e893708495ab1584cFredrik Roubert UnicodeString expected(u"abc"); 22450596faeddefbf198de137d5e893708495ab1584cFredrik Roubert assertEquals("abc from writable alias", expected, alias); 22460596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 22470596faeddefbf198de137d5e893708495ab1584cFredrik Roubert UErrorCode errorCode = U_ZERO_ERROR; 22480596faeddefbf198de137d5e893708495ab1584cFredrik Roubert UnicodeString(u"def").extract(nullptr, 0, errorCode); 22490596faeddefbf198de137d5e893708495ab1584cFredrik Roubert assertEquals("buffer overflow extracting to nullptr", U_BUFFER_OVERFLOW_ERROR, errorCode); 22500596faeddefbf198de137d5e893708495ab1584cFredrik Roubert} 2251