16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/******************************************************************** 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * COPYRIGHT: 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (c) 1997-2013, International Business Machines Corporation and 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * others. All Rights Reserved. 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************/ 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ustrtest.h" 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/appendable.h" 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/std_string.h" 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/unistr.h" 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uchar.h" 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustring.h" 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/locid.h" 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ucnv.h" 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uenum.h" 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utf16.h" 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h" 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "charstr.h" 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if 0 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustream.h" 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <iostream> 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgusing namespace std; 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define LENGTHOF(array) (int32_t)((sizeof(array)/sizeof((array)[0]))) 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::~UnicodeStringTest() {} 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid UnicodeStringTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char *par) 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (exec) logln("TestSuite UnicodeStringTest: "); 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org switch (index) { 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 0: 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org name = "StringCaseTest"; 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (exec) { 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("StringCaseTest---"); logln(""); 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org StringCaseTest test; 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org callTest(test, par); 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 1: name = "TestBasicManipulation"; if (exec) TestBasicManipulation(); break; 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 2: name = "TestCompare"; if (exec) TestCompare(); break; 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 3: name = "TestExtract"; if (exec) TestExtract(); break; 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 4: name = "TestRemoveReplace"; if (exec) TestRemoveReplace(); break; 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 5: name = "TestSearching"; if (exec) TestSearching(); break; 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 6: name = "TestSpacePadding"; if (exec) TestSpacePadding(); break; 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 7: name = "TestPrefixAndSuffix"; if (exec) TestPrefixAndSuffix(); break; 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 8: name = "TestFindAndReplace"; if (exec) TestFindAndReplace(); break; 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 9: name = "TestBogus"; if (exec) TestBogus(); break; 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 10: name = "TestReverse"; if (exec) TestReverse(); break; 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 11: name = "TestMiscellaneous"; if (exec) TestMiscellaneous(); break; 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 12: name = "TestStackAllocation"; if (exec) TestStackAllocation(); break; 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 13: name = "TestUnescape"; if (exec) TestUnescape(); break; 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 14: name = "TestCountChar32"; if (exec) TestCountChar32(); break; 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 15: name = "TestStringEnumeration"; if (exec) TestStringEnumeration(); break; 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 16: name = "TestNameSpace"; if (exec) TestNameSpace(); break; 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 17: name = "TestUTF32"; if (exec) TestUTF32(); break; 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 18: name = "TestUTF8"; if (exec) TestUTF8(); break; 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 19: name = "TestReadOnlyAlias"; if (exec) TestReadOnlyAlias(); break; 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 20: name = "TestAppendable"; if (exec) TestAppendable(); break; 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 21: name = "TestUnicodeStringImplementsAppendable"; if (exec) TestUnicodeStringImplementsAppendable(); break; 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 22: name = "TestSizeofUnicodeString"; if (exec) TestSizeofUnicodeString(); break; 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 23: name = "TestStartsWithAndEndsWithNulTerminated"; if (exec) TestStartsWithAndEndsWithNulTerminated(); break; 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org default: name = ""; break; //needed to end loop 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestBasicManipulation() 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test1("Now is the time for all men to come swiftly to the aid of the party.\n"); 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString expectedValue; 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString *c; 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org c=(UnicodeString *)test1.clone(); 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.insert(24, "good "); 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expectedValue = "Now is the time for all good men to come swiftly to the aid of the party.\n"; 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1 != expectedValue) 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("insert() failed: expected \"" + expectedValue + "\"\n,got \"" + test1 + "\""); 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org c->insert(24, "good "); 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(*c != expectedValue) { 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("clone()->insert() failed: expected \"" + expectedValue + "\"\n,got \"" + *c + "\""); 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete c; 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.remove(41, 8); 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expectedValue = "Now is the time for all good men to come to the aid of the party.\n"; 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1 != expectedValue) 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("remove() failed: expected \"" + expectedValue + "\"\n,got \"" + test1 + "\""); 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.replace(58, 6, "ir country"); 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expectedValue = "Now is the time for all good men to come to the aid of their country.\n"; 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1 != expectedValue) 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("replace() failed: expected \"" + expectedValue + "\"\n,got \"" + test1 + "\""); 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar temp[80]; 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.extract(0, 15, temp); 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test2(temp, 15); 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expectedValue = "Now is the time"; 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test2 != expectedValue) 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("extract() failed: expected \"" + expectedValue + "\"\n,got \"" + test2 + "\""); 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test2 += " for me to go!\n"; 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expectedValue = "Now is the time for me to go!\n"; 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test2 != expectedValue) 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("operator+=() failed: expected \"" + expectedValue + "\"\n,got \"" + test2 + "\""); 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1.length() != 70) 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(UnicodeString("length() failed: expected 70, got ") + test1.length()); 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test2.length() != 30) 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(UnicodeString("length() failed: expected 30, got ") + test2.length()); 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test3; 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.append((UChar32)0x20402); 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test3 != CharsToUnicodeString("\\uD841\\uDC02")){ 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln((UnicodeString)"append failed for UChar32, expected \"\\\\ud841\\\\udc02\", got " + prettify(test3)); 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test3.length() != 2){ 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(UnicodeString("append or length failed for UChar32, expected 2, got ") + test3.length()); 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.append((UChar32)0x0074); 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test3 != CharsToUnicodeString("\\uD841\\uDC02t")){ 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln((UnicodeString)"append failed for UChar32, expected \"\\\\uD841\\\\uDC02t\", got " + prettify(test3)); 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test3.length() != 3){ 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln((UnicodeString)"append or length failed for UChar32, expected 2, got " + test3.length()); 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test some UChar32 overloads 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if( test3.setTo((UChar32)0x10330).length() != 2 || 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.insert(0, (UChar32)0x20100).length() != 4 || 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.replace(2, 2, (UChar32)0xe0061).length() != 4 || 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (test3 = (UChar32)0x14001).length() != 2 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ) { 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln((UnicodeString)"simple UChar32 overloads for replace, insert, setTo or = failed"); 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test moveIndex32() 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString s=UNICODE_STRING("\\U0002f999\\U0001d15f\\u00c4\\u1ed0", 32).unescape(); 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if( 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org s.moveIndex32(2, -1)!=0 || 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org s.moveIndex32(2, 1)!=4 || 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org s.moveIndex32(2, 2)!=5 || 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org s.moveIndex32(5, -2)!=2 || 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org s.moveIndex32(0, -1)!=0 || 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org s.moveIndex32(6, 1)!=6 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ) { 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::moveIndex32() failed"); 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(s.getChar32Start(1)!=0 || s.getChar32Start(2)!=2) { 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::getChar32Start() failed"); 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(s.getChar32Limit(1)!=2 || s.getChar32Limit(2)!=2) { 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::getChar32Limit() failed"); 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test new 2.2 constructors and setTo function that parallel Java's substring function. 1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString src("Hello folks how are you?"); 1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString target1("how are you?"); 1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (target1 != UnicodeString(src, 12)) { 1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString(const UnicodeString&, int32_t) failed"); 1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString target2("folks"); 1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (target2 != UnicodeString(src, 6, 5)) { 1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString(const UnicodeString&, int32_t, int32_t) failed"); 1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (target1 != target2.setTo(src, 12)) { 1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::setTo(const UnicodeString&, int32_t) failed"); 1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // op+ is new in ICU 2.8 1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString s=UnicodeString("abc", "")+UnicodeString("def", "")+UnicodeString("ghi", ""); 1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(s!=UnicodeString("abcdefghi", "")) { 1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("operator+(UniStr, UniStr) failed"); 1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // tests for Jitterbug 2360 1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // verify that APIs with source pointer + length accept length == -1 1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // mostly test only where modified, only few functions did not already do this 1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(UnicodeString("abc", -1, "")!=UnicodeString("abc", "")) { 1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString(codepageData, dataLength, codepage) does not work with dataLength==-1"); 1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar buffer[10]={ 0x61, 0x62, 0x20ac, 0xd900, 0xdc05, 0, 0x62, 0xffff, 0xdbff, 0xdfff }; 2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString s, t(buffer, -1, LENGTHOF(buffer)); 2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(s.setTo(buffer, -1, LENGTHOF(buffer)).length()!=u_strlen(buffer)) { 2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.setTo(buffer, length, capacity) does not work with length==-1"); 2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(t.length()!=u_strlen(buffer)) { 2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString(buffer, length, capacity) does not work with length==-1"); 2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(0!=s.caseCompare(buffer, -1, U_FOLD_CASE_DEFAULT)) { 2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.caseCompare(const UChar *, length, options) does not work with length==-1"); 2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(0!=s.caseCompare(0, s.length(), buffer, U_FOLD_CASE_DEFAULT)) { 2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.caseCompare(start, _length, const UChar *, options) does not work"); 2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org buffer[u_strlen(buffer)]=0xe4; 2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString u(buffer, -1, LENGTHOF(buffer)); 2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(s.setTo(buffer, -1, LENGTHOF(buffer)).length()!=LENGTHOF(buffer)) { 2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.setTo(buffer without NUL, length, capacity) does not work with length==-1"); 2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(u.length()!=LENGTHOF(buffer)) { 2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString(buffer without NUL, length, capacity) does not work with length==-1"); 2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const char cs[]={ 0x61, (char)0xe4, (char)0x85, 0 }; 2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverter *cnv; 2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode errorCode=U_ZERO_ERROR; 2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org cnv=ucnv_open("ISO-8859-1", &errorCode); 2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString v(cs, -1, cnv, errorCode); 2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucnv_close(cnv); 2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(v!=CharsToUnicodeString("a\\xe4\\x85")) { 2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString(const char *, length, cnv, errorCode) does not work with length==-1"); 2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_CHARSET_IS_UTF8 2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Test the hardcoded-UTF-8 UnicodeString optimizations. 2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const uint8_t utf8[]={ 0x61, 0xC3, 0xA4, 0xC3, 0x9F, 0xE4, 0xB8, 0x80, 0 }; 2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar utf16[]={ 0x61, 0xE4, 0xDF, 0x4E00 }; 2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString from8a = UnicodeString((const char *)utf8); 2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString from8b = UnicodeString((const char *)utf8, (int32_t)sizeof(utf8)-1); 2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString from16(FALSE, utf16, LENGTHOF(utf16)); 2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(from8a != from16 || from8b != from16) { 2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString(const char * U_CHARSET_IS_UTF8) failed"); 2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char buffer[16]; 2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length8=from16.extract(0, 0x7fffffff, buffer, (uint32_t)sizeof(buffer)); 2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(length8!=((int32_t)sizeof(utf8)-1) || 0!=uprv_memcmp(buffer, utf8, sizeof(utf8))) { 2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::extract(char * U_CHARSET_IS_UTF8) failed"); 2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length8=from16.extract(1, 2, buffer, (uint32_t)sizeof(buffer)); 2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(length8!=4 || buffer[length8]!=0 || 0!=uprv_memcmp(buffer, utf8+1, length8)) { 2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::extract(substring to char * U_CHARSET_IS_UTF8) failed"); 2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestCompare() 2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test1("this is a test"); 2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test2("this is a test"); 2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test3("this is a test of the emergency broadcast system"); 2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test4("never say, \"this is a test\"!!"); 2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test5((UChar)0x5000); 2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test6((UChar)0x5100); 2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar uniChars[] = { 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x20, 0x61, 0x20, 0x74, 0x65, 0x73, 0x74, 0 }; 2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char chars[] = "this is a test"; 2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test operator== and operator!= 2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1 != test2 || test1 == test3 || test1 == test4) 2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("operator== or operator!= failed"); 2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test operator> and operator< 2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1 > test2 || test1 < test2 || !(test1 < test3) || !(test1 > test4) || 2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org !(test5 < test6) 2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ) { 2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("operator> or operator< failed"); 2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test operator>= and operator<= 2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!(test1 >= test2) || !(test1 <= test2) || !(test1 <= test3) || !(test1 >= test4)) 2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("operator>= or operator<= failed"); 2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test compare(UnicodeString) 2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1.compare(test2) != 0 || test1.compare(test3) >= 0 || test1.compare(test4) <= 0) 2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("compare(UnicodeString) failed"); 2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //test compare(offset, length, UnicodeString) 2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test1.compare(0, 14, test2) != 0 || 2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.compare(0, 14, test2) != 0 || 3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test4.compare(12, 14, test2) != 0 || 3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.compare(0, 18, test1) <=0 ) 3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("compare(offset, length, UnicodeString) failes"); 3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test compare(UChar*) 3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test2.compare(uniChars) != 0 || test3.compare(uniChars) <= 0 || test4.compare(uniChars) >= 0) 3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("compare(UChar*) failed"); 3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test compare(char*) 3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test2.compare(chars) != 0 || test3.compare(chars) <= 0 || test4.compare(chars) >= 0) 3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("compare(char*) failed"); 3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test compare(UChar*, length) 3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1.compare(uniChars, 4) <= 0 || test1.compare(uniChars, 4) <= 0) 3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("compare(UChar*, length) failed"); 3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test compare(thisOffset, thisLength, that, thatOffset, thatLength) 3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1.compare(0, 14, test2, 0, 14) != 0 3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org || test1.compare(0, 14, test3, 0, 14) != 0 3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org || test1.compare(0, 14, test4, 12, 14) != 0) 3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("1. compare(thisOffset, thisLength, that, thatOffset, thatLength) failed"); 3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1.compare(10, 4, test2, 0, 4) >= 0 3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org || test1.compare(10, 4, test3, 22, 9) <= 0 3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org || test1.compare(10, 4, test4, 22, 4) != 0) 3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("2. compare(thisOffset, thisLength, that, thatOffset, thatLength) failed"); 3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test compareBetween 3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1.compareBetween(0, 14, test2, 0, 14) != 0 || test1.compareBetween(0, 14, test3, 0, 14) != 0 3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org || test1.compareBetween(0, 14, test4, 12, 26) != 0) 3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("compareBetween failed"); 3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1.compareBetween(10, 14, test2, 0, 4) >= 0 || test1.compareBetween(10, 14, test3, 22, 31) <= 0 3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org || test1.compareBetween(10, 14, test4, 22, 26) != 0) 3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("compareBetween failed"); 3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test compare() etc. with strings that share a buffer but are not equal 3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test2=test1; // share the buffer, length() too large for the stackBuffer 3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test2.truncate(1); // change only the length, not the buffer 3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if( test1==test2 || test1<=test2 || 3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.compare(test2)<=0 || 3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.compareCodePointOrder(test2)<=0 || 3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.compareCodePointOrder(0, INT32_MAX, test2)<=0 || 3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.compareCodePointOrder(0, INT32_MAX, test2, 0, INT32_MAX)<=0 || 3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.compareCodePointOrderBetween(0, INT32_MAX, test2, 0, INT32_MAX)<=0 || 3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.caseCompare(test2, U_FOLD_CASE_DEFAULT)<=0 3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ) { 3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeStrings that share a buffer but have different lengths compare as equal"); 3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* test compareCodePointOrder() */ 3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* these strings are in ascending order */ 3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar strings[][4]={ 3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0x61, 0 }, /* U+0061 */ 3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0x20ac, 0xd801, 0 }, /* U+20ac U+d801 */ 3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0x20ac, 0xd800, 0xdc00, 0 }, /* U+20ac U+10000 */ 3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0xd800, 0 }, /* U+d800 */ 3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0xd800, 0xff61, 0 }, /* U+d800 U+ff61 */ 3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0xdfff, 0 }, /* U+dfff */ 3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0xff61, 0xdfff, 0 }, /* U+ff61 U+dfff */ 3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0xff61, 0xd800, 0xdc02, 0 }, /* U+ff61 U+10002 */ 3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0xd800, 0xdc02, 0 }, /* U+10002 */ 3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 0xd84d, 0xdc56, 0 } /* U+23456 */ 3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString u[20]; // must be at least as long as strings[] 3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i; 3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<(int32_t)(sizeof(strings)/sizeof(strings[0])); ++i) { 3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u[i]=UnicodeString(TRUE, strings[i], -1); 3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<(int32_t)(sizeof(strings)/sizeof(strings[0])-1); ++i) { 3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(u[i].compareCodePointOrder(u[i+1])>=0 || u[i].compareCodePointOrder(0, INT32_MAX, u[i+1].getBuffer())>=0) { 3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("error: UnicodeString::compareCodePointOrder() fails for string %d and the following one\n", i); 3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* test caseCompare() */ 3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar 3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org _mixed[]= { 0x61, 0x42, 0x131, 0x3a3, 0xdf, 0x130, 0x49, 0xfb03, 0xd93f, 0xdfff, 0 }, 3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org _otherDefault[]= { 0x41, 0x62, 0x131, 0x3c3, 0x73, 0x53, 0x69, 0x307, 0x69, 0x46, 0x66, 0x49, 0xd93f, 0xdfff, 0 }, 3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org _otherExcludeSpecialI[]={ 0x41, 0x62, 0x131, 0x3c3, 0x53, 0x73, 0x69, 0x131, 0x66, 0x46, 0x69, 0xd93f, 0xdfff, 0 }, 3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org _different[]= { 0x41, 0x62, 0x131, 0x3c3, 0x73, 0x53, 0x130, 0x49, 0x46, 0x66, 0x49, 0xd93f, 0xdffd, 0 }; 3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString 3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org mixed(TRUE, _mixed, -1), 3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org otherDefault(TRUE, _otherDefault, -1), 3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org otherExcludeSpecialI(TRUE, _otherExcludeSpecialI, -1), 3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org different(TRUE, _different, -1); 3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int8_t result; 3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* test caseCompare() */ 3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result=mixed.caseCompare(otherDefault, U_FOLD_CASE_DEFAULT); 3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(result!=0 || 0!=mixed.caseCompareBetween(0, INT32_MAX, otherDefault, 0, INT32_MAX, U_FOLD_CASE_DEFAULT)) { 3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("error: mixed.caseCompare(other, default)=%ld instead of 0\n", result); 3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result=mixed.caseCompare(otherExcludeSpecialI, U_FOLD_CASE_EXCLUDE_SPECIAL_I); 4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(result!=0) { 4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("error: mixed.caseCompare(otherExcludeSpecialI, U_FOLD_CASE_EXCLUDE_SPECIAL_I)=%ld instead of 0\n", result); 4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result=mixed.caseCompare(otherDefault, U_FOLD_CASE_EXCLUDE_SPECIAL_I); 4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(result==0 || 0==mixed.caseCompareBetween(0, INT32_MAX, otherDefault, 0, INT32_MAX, U_FOLD_CASE_EXCLUDE_SPECIAL_I)) { 4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("error: mixed.caseCompare(other, U_FOLD_CASE_EXCLUDE_SPECIAL_I)=0 instead of !=0\n"); 4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* test caseCompare() */ 4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result=mixed.caseCompare(different, U_FOLD_CASE_DEFAULT); 4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(result<=0) { 4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("error: mixed.caseCompare(different, default)=%ld instead of positive\n", result); 4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* test caseCompare() - include the folded sharp s (U+00df) with different lengths */ 4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result=mixed.caseCompare(1, 4, different, 1, 5, U_FOLD_CASE_DEFAULT); 4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(result!=0 || 0!=mixed.caseCompareBetween(1, 5, different, 1, 6, U_FOLD_CASE_DEFAULT)) { 4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("error: mixed.caseCompare(mixed, 1, 4, different, 1, 5, default)=%ld instead of 0\n", result); 4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* test caseCompare() - stop in the middle of the sharp s (U+00df) */ 4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result=mixed.caseCompare(1, 4, different, 1, 4, U_FOLD_CASE_DEFAULT); 4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(result<=0) { 4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("error: mixed.caseCompare(1, 4, different, 1, 4, default)=%ld instead of positive\n", result); 4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test that srcLength=-1 is handled in functions that 4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // take input const UChar */int32_t srcLength (j785) 4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar u[]={ 0x61, 0x308, 0x62, 0 }; 4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString s=UNICODE_STRING("a\\u0308b", 8).unescape(); 4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(s.compare(u, -1)!=0 || s.compare(0, 999, u, 0, -1)!=0) { 4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("error UnicodeString::compare(..., const UChar *, srcLength=-1) does not work"); 4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(s.compareCodePointOrder(u, -1)!=0 || s.compareCodePointOrder(0, 999, u, 0, -1)!=0) { 4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("error UnicodeString::compareCodePointOrder(..., const UChar *, srcLength=-1, ...) does not work"); 4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(s.caseCompare(u, -1, U_FOLD_CASE_DEFAULT)!=0 || s.caseCompare(0, 999, u, 0, -1, U_FOLD_CASE_DEFAULT)!=0) { 4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("error UnicodeString::caseCompare(..., const UChar *, srcLength=-1, ...) does not work"); 4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(s.indexOf(u, 1, -1, 0, 999)!=1 || s.indexOf(u+1, -1, 0, 999)!=1 || s.indexOf(u+1, -1, 0)!=1) { 4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("error UnicodeString::indexOf(const UChar *, srcLength=-1, ...) does not work"); 4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(s.lastIndexOf(u, 1, -1, 0, 999)!=1 || s.lastIndexOf(u+1, -1, 0, 999)!=1 || s.lastIndexOf(u+1, -1, 0)!=1) { 4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("error UnicodeString::lastIndexOf(const UChar *, srcLength=-1, ...) does not work"); 4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString s2, s3; 4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org s2.replace(0, 0, u+1, -1); 4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org s3.replace(0, 0, u, 1, -1); 4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(s.compare(1, 999, s2)!=0 || s2!=s3) { 4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("error UnicodeString::replace(..., const UChar *, srcLength=-1, ...) does not work"); 4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestExtract() 4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test1("Now is the time for all good men to come to the aid of their country.", ""); 4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test2; 4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar test3[13] = {1, 2, 3, 4, 5, 6, 7, 8, 8, 10, 11, 12, 13}; 4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char test4[13] = {1, 2, 3, 4, 5, 6, 7, 8, 8, 10, 11, 12, 13}; 4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test5; 4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char test6[13] = {1, 2, 3, 4, 5, 6, 7, 8, 8, 10, 11, 12, 13}; 4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.extract(11, 12, test2); 4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.extract(11, 12, test3); 4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1.extract(11, 12, test4) != 12 || test4[12] != 0) { 4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.extract(char *) failed to return the correct size of destination buffer."); 4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test proper pinning in extractBetween() 4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.extractBetween(-3, 7, test5); 4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test5!=UNICODE_STRING("Now is ", 7)) { 4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.extractBetween(-3, 7) did not pin properly."); 4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.extractBetween(11, 23, test5); 4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1.extract(60, 71, test6) != 9) { 4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.extract() failed to return the correct size of destination buffer for end of buffer."); 4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1.extract(11, 12, test6) != 12) { 4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.extract() failed to return the correct size of destination buffer."); 4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // convert test4 back to Unicode for comparison 4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test4b(test4, 12); 4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1.extract(11, 12, (char *)NULL) != 12) { 4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.extract(NULL) failed to return the correct size of destination buffer."); 4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1.extract(11, -1, test6) != 0) { 5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.extract(-1) failed to stop reading the string."); 5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int32_t i = 0; i < 12; i++) { 5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1.charAt((int32_t)(11 + i)) != test2.charAt(i)) { 5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(UnicodeString("extracting into a UnicodeString failed at position ") + i); 5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1.charAt((int32_t)(11 + i)) != test3[i]) { 5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(UnicodeString("extracting into an array of UChar failed at position ") + i); 5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (((char)test1.charAt((int32_t)(11 + i))) != test4b.charAt(i)) { 5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(UnicodeString("extracting into an array of char failed at position ") + i); 5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1.charAt((int32_t)(11 + i)) != test5.charAt(i)) { 5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(UnicodeString("extracting with extractBetween failed at position ") + i); 5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test preflighting and overflows with invariant conversion 5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1.extract(0, 10, (char *)NULL, "") != 10) { 5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.extract(0, 10, (char *)NULL, \"\") != 10"); 5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test4[2] = (char)0xff; 5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1.extract(0, 10, test4, 2, "") != 10) { 5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.extract(0, 10, test4, 2, \"\") != 10"); 5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test4[2] != (char)0xff) { 5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.extract(0, 10, test4, 2, \"\") overwrote test4[2]"); 5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test new, NUL-terminating extract() function 5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString s("terminate", ""); 5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar dest[20]={ 5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5 5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode errorCode; 5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length; 5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=s.extract((UChar *)NULL, 0, errorCode); 5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=s.length()) { 5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.extract(NULL, 0)==%d (%s) expected %d (U_BUFFER_OVERFLOW_ERROR)", length, s.length(), u_errorName(errorCode)); 5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=s.extract(dest, s.length()-1, errorCode); 5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=s.length()) { 5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.extract(dest too short)==%d (%s) expected %d (U_BUFFER_OVERFLOW_ERROR)", 5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length, u_errorName(errorCode), s.length()); 5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=s.extract(dest, s.length(), errorCode); 5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(errorCode!=U_STRING_NOT_TERMINATED_WARNING || length!=s.length()) { 5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.extract(dest just right without NUL)==%d (%s) expected %d (U_STRING_NOT_TERMINATED_WARNING)", 5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length, u_errorName(errorCode), s.length()); 5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(dest[length-1]!=s[length-1] || dest[length]!=0xa5) { 5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.extract(dest just right without NUL) did not extract the string correctly"); 5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length=s.extract(dest, s.length()+1, errorCode); 5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(errorCode!=U_ZERO_ERROR || length!=s.length()) { 5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.extract(dest large enough)==%d (%s) expected %d (U_ZERO_ERROR)", 5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length, u_errorName(errorCode), s.length()); 5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(dest[length-1]!=s[length-1] || dest[length]!=0 || dest[length+1]!=0xa5) { 5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.extract(dest large enough) did not extract the string correctly"); 5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test new UConverter extract() and constructor 5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString s=UNICODE_STRING("\\U0002f999\\U0001d15f\\u00c4\\u1ed0", 32).unescape(); 5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char buffer[32]; 5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const char expect[]={ 5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (char)0xf0, (char)0xaf, (char)0xa6, (char)0x99, 5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (char)0xf0, (char)0x9d, (char)0x85, (char)0x9f, 5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (char)0xc3, (char)0x84, 5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (char)0xe1, (char)0xbb, (char)0x90 5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode errorCode=U_ZERO_ERROR; 5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UConverter *cnv=ucnv_open("UTF-8", &errorCode); 5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length; 5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_SUCCESS(errorCode)) { 5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test preflighting 5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if( (length=s.extract(NULL, 0, cnv, errorCode))!=13 || 5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode!=U_BUFFER_OVERFLOW_ERROR 5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ) { 5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::extract(NULL, UConverter) preflighting failed (length=%ld, %s)", 5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length, u_errorName(errorCode)); 6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if( (length=s.extract(buffer, 2, cnv, errorCode))!=13 || 6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode!=U_BUFFER_OVERFLOW_ERROR 6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ) { 6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::extract(too small, UConverter) preflighting failed (length=%ld, %s)", 6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length, u_errorName(errorCode)); 6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // try error cases 6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if( s.extract(NULL, 2, cnv, errorCode)==13 || U_SUCCESS(errorCode)) { 6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::extract(UConverter) succeeded with an illegal destination"); 6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ILLEGAL_ARGUMENT_ERROR; 6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if( s.extract(NULL, 0, cnv, errorCode)==13 || U_SUCCESS(errorCode)) { 6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::extract(UConverter) succeeded with a previous error code"); 6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode=U_ZERO_ERROR; 6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // extract for real 6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if( (length=s.extract(buffer, sizeof(buffer), cnv, errorCode))!=13 || 6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_memcmp(buffer, expect, 13)!=0 || 6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org buffer[13]!=0 || 6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_FAILURE(errorCode) 6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ) { 6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::extract(UConverter) conversion failed (length=%ld, %s)", 6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length, u_errorName(errorCode)); 6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Test again with just the converter name. 6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if( (length=s.extract(0, s.length(), buffer, sizeof(buffer), "UTF-8"))!=13 || 6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uprv_memcmp(buffer, expect, 13)!=0 || 6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org buffer[13]!=0 || 6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_FAILURE(errorCode) 6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ) { 6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::extract(\"UTF-8\") conversion failed (length=%ld, %s)", 6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org length, u_errorName(errorCode)); 6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // try the constructor 6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString t(expect, sizeof(expect), cnv, errorCode); 6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode) || s!=t) { 6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString(UConverter) conversion failed (%s)", 6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_errorName(errorCode)); 6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucnv_close(cnv); 6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestRemoveReplace() 6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test1("The rain in Spain stays mainly on the plain"); 6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test2("eat SPAMburgers!"); 6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar test3[] = { 0x53, 0x50, 0x41, 0x4d, 0x4d, 0 }; 6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char test4[] = "SPAM"; 6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString& test5 = test1; 6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.replace(4, 4, test2, 4, 4); 6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.replace(12, 5, test3, 4); 6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3[4] = 0; 6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.replace(17, 4, test3); 6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.replace(23, 4, test4); 6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.replaceBetween(37, 42, test2, 4, 8); 6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1 != "The SPAM in SPAM SPAMs SPAMly on the SPAM") 6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("One of the replace methods failed:\n" 6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " expected \"The SPAM in SPAM SPAMs SPAMly on the SPAM\",\n" 6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " got \"" + test1 + "\""); 6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.remove(21, 1); 6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.removeBetween(26, 28); 6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1 != "The SPAM in SPAM SPAM SPAM on the SPAM") 6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("One of the remove methods failed:\n" 6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " expected \"The SPAM in SPAM SPAM SPAM on the SPAM\",\n" 6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " got \"" + test1 + "\""); 6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int32_t i = 0; i < test1.length(); i++) { 6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test5[i] != 0x53 && test5[i] != 0x50 && test5[i] != 0x41 && test5[i] != 0x4d && test5[i] != 0x20) { 6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.setCharAt(i, 0x78); 6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1 != "xxx SPAM xx SPAM SPAM SPAM xx xxx SPAM") 6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("One of the remove methods failed:\n" 6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " expected \"xxx SPAM xx SPAM SPAM SPAM xx xxx SPAM\",\n" 6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " got \"" + test1 + "\""); 6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.remove(); 6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1.length() != 0) 6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Remove() failed: expected empty string, got \"" + test1 + "\""); 6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestSearching() 6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test1("test test ttest tetest testesteststt"); 7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test2("test"); 7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar testChar = 0x74; 7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 testChar32 = 0x20402; 7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar testData[]={ 7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 0 1 2 3 4 5 6 7 7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xd841, 0xdc02, 0x0071, 0xdc02, 0xd841, 0x0071, 0xd841, 0xdc02, 7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 8 9 10 11 12 13 14 15 7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x0071, 0x0072, 0xd841, 0xdc02, 0x0071, 0xd841, 0xdc02, 0x0071, 7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 16 17 18 19 7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xdc02, 0xd841, 0x0073, 0x0000 7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test3(testData); 7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test4(testChar32); 7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint16_t occurrences = 0; 7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t startPos = 0; 7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for ( ; 7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org startPos != -1 && startPos < test1.length(); 7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (startPos = test1.indexOf(test2, startPos)) != -1 ? (++occurrences, startPos += 4) : 0) 7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ; 7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (occurrences != 6) 7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(UnicodeString("indexOf failed: expected to find 6 occurrences, found ") + occurrences); 7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for ( occurrences = 0, startPos = 10; 7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org startPos != -1 && startPos < test1.length(); 7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (startPos = test1.indexOf(test2, startPos)) != -1 ? (++occurrences, startPos += 4) : 0) 7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ; 7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (occurrences != 4) 7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(UnicodeString("indexOf with starting offset failed: " 7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "expected to find 4 occurrences, found ") + occurrences); 7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t endPos = 28; 7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for ( occurrences = 0, startPos = 5; 7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org startPos != -1 && startPos < test1.length(); 7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (startPos = test1.indexOf(test2, startPos, endPos - startPos)) != -1 ? (++occurrences, startPos += 4) : 0) 7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ; 7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (occurrences != 4) 7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(UnicodeString("indexOf with starting and ending offsets failed: " 7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "expected to find 4 occurrences, found ") + occurrences); 7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //using UChar32 string 7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for ( startPos=0, occurrences=0; 7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org startPos != -1 && startPos < test3.length(); 7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (startPos = test3.indexOf(test4, startPos)) != -1 ? (++occurrences, startPos += 2) : 0) 7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ; 7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (occurrences != 4) 7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln((UnicodeString)"indexOf failed: expected to find 4 occurrences, found " + occurrences); 7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for ( startPos=10, occurrences=0; 7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org startPos != -1 && startPos < test3.length(); 7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (startPos = test3.indexOf(test4, startPos)) != -1 ? (++occurrences, startPos += 2) : 0) 7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ; 7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (occurrences != 2) 7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(UnicodeString("indexOf failed: expected to find 2 occurrences, found ") + occurrences); 7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //--- 7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for ( occurrences = 0, startPos = 0; 7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org startPos != -1 && startPos < test1.length(); 7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (startPos = test1.indexOf(testChar, startPos)) != -1 ? (++occurrences, startPos += 1) : 0) 7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ; 7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (occurrences != 16) 7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(UnicodeString("indexOf with character failed: " 7656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "expected to find 16 occurrences, found ") + occurrences); 7666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for ( occurrences = 0, startPos = 10; 7686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org startPos != -1 && startPos < test1.length(); 7696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (startPos = test1.indexOf(testChar, startPos)) != -1 ? (++occurrences, startPos += 1) : 0) 7706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ; 7716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (occurrences != 12) 7726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(UnicodeString("indexOf with character & start offset failed: " 7736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "expected to find 12 occurrences, found ") + occurrences); 7746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for ( occurrences = 0, startPos = 5, endPos = 28; 7766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org startPos != -1 && startPos < test1.length(); 7776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (startPos = test1.indexOf(testChar, startPos, endPos - startPos)) != -1 ? (++occurrences, startPos += 1) : 0) 7786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ; 7796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (occurrences != 10) 7806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(UnicodeString("indexOf with character & start & end offsets failed: " 7816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "expected to find 10 occurrences, found ") + occurrences); 7826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //testing for UChar32 7846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString subString; 7856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for( occurrences =0, startPos=0; startPos < test3.length(); startPos +=1){ 7866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org subString.append(test3, startPos, test3.length()); 7876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(subString.indexOf(testChar32) != -1 ){ 7886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++occurrences; 7896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org subString.remove(); 7916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (occurrences != 14) 7936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln((UnicodeString)"indexOf failed: expected to find 14 occurrences, found " + occurrences); 7946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for ( occurrences = 0, startPos = 0; 7966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org startPos != -1 && startPos < test3.length(); 7976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (startPos = test3.indexOf(testChar32, startPos)) != -1 ? (++occurrences, startPos += 1) : 0) 7986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ; 7996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (occurrences != 4) 8006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln((UnicodeString)"indexOf failed: expected to find 4 occurrences, found " + occurrences); 8016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org endPos=test3.length(); 8036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for ( occurrences = 0, startPos = 5; 8046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org startPos != -1 && startPos < test3.length(); 8056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (startPos = test3.indexOf(testChar32, startPos, endPos - startPos)) != -1 ? (++occurrences, startPos += 1) : 0) 8066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ; 8076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (occurrences != 3) 8086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln((UnicodeString)"indexOf with character & start & end offsets failed: expected to find 2 occurrences, found " + occurrences); 8096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //--- 8106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test1.lastIndexOf(test2)!=29) { 8126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("test1.lastIndexOf(test2)!=29"); 8136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test1.lastIndexOf(test2, 15)!=29 || test1.lastIndexOf(test2, 29)!=29 || test1.lastIndexOf(test2, 30)!=-1) { 8166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("test1.lastIndexOf(test2, start) failed"); 8176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for ( occurrences = 0, startPos = 32; 8206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org startPos != -1; 8216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (startPos = test1.lastIndexOf(test2, 5, startPos - 5)) != -1 ? ++occurrences : 0) 8226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ; 8236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (occurrences != 4) 8246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(UnicodeString("lastIndexOf with starting and ending offsets failed: " 8256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "expected to find 4 occurrences, found ") + occurrences); 8266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for ( occurrences = 0, startPos = 32; 8286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org startPos != -1; 8296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (startPos = test1.lastIndexOf(testChar, 5, startPos - 5)) != -1 ? ++occurrences : 0) 8306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ; 8316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (occurrences != 11) 8326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(UnicodeString("lastIndexOf with character & start & end offsets failed: " 8336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "expected to find 11 occurrences, found ") + occurrences); 8346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //testing UChar32 8366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org startPos=test3.length(); 8376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for ( occurrences = 0; 8386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org startPos != -1; 8396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (startPos = test3.lastIndexOf(testChar32, 5, startPos - 5)) != -1 ? ++occurrences : 0) 8406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ; 8416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (occurrences != 3) 8426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln((UnicodeString)"lastIndexOf with character & start & end offsets failed: expected to find 3 occurrences, found " + occurrences); 8436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for ( occurrences = 0, endPos = test3.length(); endPos > 0; endPos -= 1){ 8466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org subString.remove(); 8476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org subString.append(test3, 0, endPos); 8486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(subString.lastIndexOf(testChar32) != -1 ){ 8496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++occurrences; 8506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (occurrences != 18) 8536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln((UnicodeString)"indexOf failed: expected to find 18 occurrences, found " + occurrences); 8546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //--- 8556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test that indexOf(UChar32) and lastIndexOf(UChar32) 8576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // do not find surrogate code points when they are part of matched pairs 8586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // (= part of supplementary code points) 8596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Jitterbug 1542 8606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test3.indexOf((UChar32)0xd841) != 4 || test3.indexOf((UChar32)0xdc02) != 3) { 8616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("error: UnicodeString::indexOf(UChar32 surrogate) finds a partial supplementary code point"); 8626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if( UnicodeString(test3, 0, 17).lastIndexOf((UChar)0xd841, 0) != 4 || 8646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString(test3, 0, 17).lastIndexOf((UChar32)0xd841, 2) != 4 || 8656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.lastIndexOf((UChar32)0xd841, 0, 17) != 4 || test3.lastIndexOf((UChar32)0xdc02, 0, 17) != 16 8666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ) { 8676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("error: UnicodeString::lastIndexOf(UChar32 surrogate) finds a partial supplementary code point"); 8686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 8706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 8726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestSpacePadding() 8736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 8746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test1("hello"); 8756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test2(" there"); 8766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test3("Hi! How ya doin'? Beautiful day, isn't it?"); 8776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test4; 8786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool returnVal; 8796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString expectedValue; 8806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org returnVal = test1.padLeading(15); 8826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expectedValue = " hello"; 8836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (returnVal == FALSE || test1 != expectedValue) 8846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("padLeading() failed: expected \"" + expectedValue + "\", got \"" + test1 + "\"."); 8856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org returnVal = test2.padTrailing(15); 8876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expectedValue = " there "; 8886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (returnVal == FALSE || test2 != expectedValue) 8896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("padTrailing() failed: expected \"" + expectedValue + "\", got \"" + test2 + "\"."); 8906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expectedValue = test3; 8926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org returnVal = test3.padTrailing(15); 8936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (returnVal == TRUE || test3 != expectedValue) 8946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("padTrailing() failed: expected \"" + expectedValue + "\", got \"" + test3 + "\"."); 8956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expectedValue = "hello"; 8976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test4.setTo(test1).trim(); 8986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test4 != expectedValue || test1 == expectedValue || test4 != expectedValue) 9006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("trim(UnicodeString&) failed"); 9016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.trim(); 9036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1 != expectedValue) 9046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("trim() failed: expected \"" + expectedValue + "\", got \"" + test1 + "\"."); 9056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test2.trim(); 9076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expectedValue = "there"; 9086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test2 != expectedValue) 9096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("trim() failed: expected \"" + expectedValue + "\", got \"" + test2 + "\"."); 9106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.trim(); 9126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expectedValue = "Hi! How ya doin'? Beautiful day, isn't it?"; 9136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test3 != expectedValue) 9146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("trim() failed: expected \"" + expectedValue + "\", got \"" + test3 + "\"."); 9156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org returnVal = test1.truncate(15); 9176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expectedValue = "hello"; 9186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (returnVal == TRUE || test1 != expectedValue) 9196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("truncate() failed: expected \"" + expectedValue + "\", got \"" + test1 + "\"."); 9206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org returnVal = test2.truncate(15); 9226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expectedValue = "there"; 9236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (returnVal == TRUE || test2 != expectedValue) 9246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("truncate() failed: expected \"" + expectedValue + "\", got \"" + test2 + "\"."); 9256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org returnVal = test3.truncate(15); 9276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expectedValue = "Hi! How ya doi"; 9286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (returnVal == FALSE || test3 != expectedValue) 9296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("truncate() failed: expected \"" + expectedValue + "\", got \"" + test3 + "\"."); 9306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 9316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 9336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestPrefixAndSuffix() 9346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 9356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test1("Now is the time for all good men to come to the aid of their country."); 9366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test2("Now"); 9376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test3("country."); 9386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test4("count"); 9396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!test1.startsWith(test2) || !test1.startsWith(test2, 0, test2.length())) { 9416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("startsWith() failed: \"" + test2 + "\" should be a prefix of \"" + test1 + "\"."); 9426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1.startsWith(test3) || 9456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.startsWith(test3.getBuffer(), test3.length()) || 9466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.startsWith(test3.getTerminatedBuffer(), 0, -1) 9476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ) { 9486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("startsWith() failed: \"" + test3 + "\" shouldn't be a prefix of \"" + test1 + "\"."); 9496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1.endsWith(test2)) { 9526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("endsWith() failed: \"" + test2 + "\" shouldn't be a suffix of \"" + test1 + "\"."); 9536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!test1.endsWith(test3)) { 9566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("endsWith(test3) failed: \"" + test3 + "\" should be a suffix of \"" + test1 + "\"."); 9576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!test1.endsWith(test3, 0, INT32_MAX)) { 9596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("endsWith(test3, 0, INT32_MAX) failed: \"" + test3 + "\" should be a suffix of \"" + test1 + "\"."); 9606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!test1.endsWith(test3.getBuffer(), test3.length())) { 9636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("endsWith(test3.getBuffer(), test3.length()) failed: \"" + test3 + "\" should be a suffix of \"" + test1 + "\"."); 9646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!test1.endsWith(test3.getTerminatedBuffer(), 0, -1)) { 9666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("endsWith(test3.getTerminatedBuffer(), 0, -1) failed: \"" + test3 + "\" should be a suffix of \"" + test1 + "\"."); 9676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!test3.startsWith(test4)) { 9706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("endsWith(test4) failed: \"" + test4 + "\" should be a prefix of \"" + test3 + "\"."); 9716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test4.startsWith(test3)) { 9746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("startsWith(test3) failed: \"" + test3 + "\" shouldn't be a prefix of \"" + test4 + "\"."); 9756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 9776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 9796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestStartsWithAndEndsWithNulTerminated() { 9806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test("abcde"); 9816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar ab[] = { 0x61, 0x62, 0 }; 9826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar de[] = { 0x64, 0x65, 0 }; 9836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertTrue("abcde.startsWith(ab, -1)", test.startsWith(ab, -1)); 9846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertTrue("abcde.startsWith(ab, 0, -1)", test.startsWith(ab, 0, -1)); 9856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertTrue("abcde.endsWith(de, -1)", test.endsWith(de, -1)); 9866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertTrue("abcde.endsWith(de, 0, -1)", test.endsWith(de, 0, -1)); 9876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 9886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 9906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestFindAndReplace() 9916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 9926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test1("One potato, two potato, three potato, four\n"); 9936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test2("potato"); 9946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test3("MISSISSIPPI"); 9956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString expectedValue; 9976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.findAndReplace(test2, test3); 9996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expectedValue = "One MISSISSIPPI, two MISSISSIPPI, three MISSISSIPPI, four\n"; 10006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1 != expectedValue) 10016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("findAndReplace failed: expected \"" + expectedValue + "\", got \"" + test1 + "\"."); 10026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.findAndReplace(2, 32, test3, test2); 10036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expectedValue = "One potato, two potato, three MISSISSIPPI, four\n"; 10046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1 != expectedValue) 10056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("findAndReplace failed: expected \"" + expectedValue + "\", got \"" + test1 + "\"."); 10066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 10076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 10096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestReverse() 10106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 10116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test("backwards words say to used I"); 10126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test.reverse(); 10146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test.reverse(2, 4); 10156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test.reverse(7, 2); 10166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test.reverse(10, 3); 10176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test.reverse(14, 5); 10186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test.reverse(20, 9); 10196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test != "I used to say words backwards") 10216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("reverse() failed: Expected \"I used to say words backwards\",\n got \"" 10226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org + test + "\""); 10236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test=UNICODE_STRING("\\U0002f999\\U0001d15f\\u00c4\\u1ed0", 32).unescape(); 10256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test.reverse(); 10266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test.char32At(0)!=0x1ed0 || test.char32At(1)!=0xc4 || test.char32At(2)!=0x1d15f || test.char32At(4)!=0x2f999) { 10276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("reverse() failed with supplementary characters"); 10286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Test case for ticket #8091: 10316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // UnicodeString::reverse() failed to see a lead surrogate in the middle of 10326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // an odd-length string that contains no other lead surrogates. 10336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test=UNICODE_STRING_SIMPLE("ab\\U0001F4A9e").unescape(); 10346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString expected=UNICODE_STRING_SIMPLE("e\\U0001F4A9ba").unescape(); 10356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test.reverse(); 10366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test!=expected) { 10376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("reverse() failed with only lead surrogate in the middle"); 10386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 10406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 10426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestMiscellaneous() 10436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 10446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test1("This is a test"); 10456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test2("This is a test"); 10466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test3("Me too!"); 10476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test getBuffer(minCapacity) and releaseBuffer() 10496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1=UnicodeString(); // make sure that it starts with its stackBuffer 10506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar *p=test1.getBuffer(20); 10516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test1.getCapacity()<20) { 10526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::getBuffer(20).getCapacity()<20"); 10536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.append((UChar)7); // must not be able to modify the string here 10566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.setCharAt(3, 7); 10576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.reverse(); 10586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if( test1.length()!=0 || 10596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.charAt(0)!=0xffff || test1.charAt(3)!=0xffff || 10606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.getBuffer(10)!=0 || test1.getBuffer()!=0 10616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ) { 10626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::getBuffer(minCapacity) allows read or write access to the UnicodeString"); 10636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org p[0]=1; 10666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org p[1]=2; 10676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org p[2]=3; 10686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.releaseBuffer(3); 10696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.append((UChar)4); 10706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test1.length()!=4 || test1.charAt(0)!=1 || test1.charAt(1)!=2 || test1.charAt(2)!=3 || test1.charAt(3)!=4) { 10726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::releaseBuffer(newLength) does not properly reallow access to the UnicodeString"); 10736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test releaseBuffer() without getBuffer(minCapacity) - must not have any effect 10766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.releaseBuffer(1); 10776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test1.length()!=4 || test1.charAt(0)!=1 || test1.charAt(1)!=2 || test1.charAt(2)!=3 || test1.charAt(3)!=4) { 10786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::releaseBuffer(newLength) without getBuffer(minCapacity) changed the UnicodeString"); 10796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test getBuffer(const) 10826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *q=test1.getBuffer(), *r=test1.getBuffer(); 10836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if( test1.length()!=4 || 10846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org q[0]!=1 || q[1]!=2 || q[2]!=3 || q[3]!=4 || 10856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org r[0]!=1 || r[1]!=2 || r[2]!=3 || r[3]!=4 10866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ) { 10876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::getBuffer(const) does not return a usable buffer pointer"); 10886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test releaseBuffer() with a NUL-terminated buffer 10916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.getBuffer(20)[2]=0; 10926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.releaseBuffer(); // implicit -1 10936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test1.length()!=2 || test1.charAt(0)!=1 || test1.charAt(1) !=2) { 10946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::releaseBuffer(-1) does not properly set the length of the UnicodeString"); 10956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test releaseBuffer() with a non-NUL-terminated buffer 10986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org p=test1.getBuffer(256); 10996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(int32_t i=0; i<test1.getCapacity(); ++i) { 11006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org p[i]=(UChar)1; // fill the buffer with all non-NUL code units 11016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.releaseBuffer(); // implicit -1 11036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test1.length()!=test1.getCapacity() || test1.charAt(1)!=1 || test1.charAt(100)!=1 || test1.charAt(test1.getCapacity()-1)!=1) { 11046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::releaseBuffer(-1 but no NUL) does not properly set the length of the UnicodeString"); 11056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test getTerminatedBuffer() 11086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1=UnicodeString("This is another test.", ""); 11096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test2=UnicodeString("This is another test.", ""); 11106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org q=test1.getTerminatedBuffer(); 11116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(q[test1.length()]!=0 || test1!=test2 || test2.compare(q, -1)!=0) { 11126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("getTerminatedBuffer()[length]!=0"); 11136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar u[]={ 5, 6, 7, 8, 0 }; 11166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.setTo(FALSE, u, 3); 11176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org q=test1.getTerminatedBuffer(); 11186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(q==u || q[0]!=5 || q[1]!=6 || q[2]!=7 || q[3]!=0) { 11196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString(u[3]).getTerminatedBuffer() returns a bad buffer"); 11206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.setTo(TRUE, u, -1); 11236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org q=test1.getTerminatedBuffer(); 11246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(q!=u || test1.length()!=4 || q[3]!=8 || q[4]!=0) { 11256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString(u[-1]).getTerminatedBuffer() returns a bad buffer"); 11266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1=UNICODE_STRING("la", 2); 11296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.append(UNICODE_STRING(" lila", 5).getTerminatedBuffer(), 0, -1); 11306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test1!=UNICODE_STRING("la lila", 7)) { 11316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::append(const UChar *, start, length) failed"); 11326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.insert(3, UNICODE_STRING("dudum ", 6), 0, INT32_MAX); 11356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test1!=UNICODE_STRING("la dudum lila", 13)) { 11366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::insert(start, const UniStr &, start, length) failed"); 11376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar ucs[]={ 0x68, 0x6d, 0x20, 0 }; 11406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.insert(9, ucs, -1); 11416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test1!=UNICODE_STRING("la dudum hm lila", 16)) { 11426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::insert(start, const UChar *, length) failed"); 11436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.replace(9, 2, (UChar)0x2b); 11466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test1!=UNICODE_STRING("la dudum + lila", 15)) { 11476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::replace(start, length, UChar) failed"); 11486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test1.hasMetaData() || UnicodeString().hasMetaData()) { 11516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::hasMetaData() returns TRUE"); 11526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test getTerminatedBuffer() on a truncated, shared, heap-allocated string 11556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1=UNICODE_STRING_SIMPLE("abcdefghijklmnopqrstuvwxyz0123456789."); 11566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.truncate(36); // ensure length()<getCapacity() 11576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test2=test1; // share the buffer 11586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.truncate(5); 11596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test1.length()!=5 || test1.getTerminatedBuffer()[5]!=0) { 11606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString(shared buffer).truncate() failed"); 11616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test2.length()!=36 || test2[5]!=0x66 || u_strlen(test2.getTerminatedBuffer())!=36) { 11636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString(shared buffer).truncate().getTerminatedBuffer() " 11646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "modified another copy of the string!"); 11656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1=UNICODE_STRING_SIMPLE("abcdefghijklmnopqrstuvwxyz0123456789."); 11676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.truncate(36); // ensure length()<getCapacity() 11686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test2=test1; // share the buffer 11696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.remove(); 11706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test1.length()!=0 || test1.getTerminatedBuffer()[0]!=0) { 11716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString(shared buffer).remove() failed"); 11726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test2.length()!=36 || test2[0]!=0x61 || u_strlen(test2.getTerminatedBuffer())!=36) { 11746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString(shared buffer).remove().getTerminatedBuffer() " 11756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "modified another copy of the string!"); 11766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // ticket #9740 11796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.setTo(TRUE, ucs, 3); 11806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertEquals("length of read-only alias", 3, test1.length()); 11816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test1.trim(); 11826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertEquals("length of read-only alias after trim()", 2, test1.length()); 11836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org assertEquals("length of terminated buffer of read-only alias + trim()", 11846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2, u_strlen(test1.getTerminatedBuffer())); 11856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 11866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 11886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestStackAllocation() 11896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 11906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar testString[] ={ 11916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x63, 0x72, 0x61, 0x7a, 0x79, 0x20, 0x74, 0x65, 0x73, 0x74, 0x2e, 0 }; 11926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar guardWord = 0x4DED; 11936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString* test = 0; 11946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test = new UnicodeString(testString); 11966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (*test != "This is a crazy test.") 11976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Test string failed to initialize properly."); 11986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (guardWord != 0x04DED) 11996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Test string initialization overwrote guard word!"); 12006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test->insert(8, "only "); 12026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test->remove(15, 6); 12036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (*test != "This is only a test.") 12046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Manipulation of test string failed to work right."); 12056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (guardWord != 0x4DED) 12066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Manipulation of test string overwrote guard word!"); 12076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // we have to deinitialize and release the backing store by calling the destructor 12096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // explicitly, since we can't overload operator delete 12106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete test; 12116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar workingBuffer[] = { 12136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 12146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6d, 0x65, 0x6e, 0x20, 0x74, 0x6f, 0x20, 12156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x63, 0x6f, 0x6d, 0x65, 0xffff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 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, 12176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; 12186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar guardWord2 = 0x4DED; 12196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test = new UnicodeString(workingBuffer, 35, 100); 12216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (*test != "Now is the time for all men to come") 12226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Stack-allocated backing store failed to initialize correctly."); 12236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (guardWord2 != 0x4DED) 12246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Stack-allocated backing store overwrote guard word!"); 12256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test->insert(24, "good "); 12276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (*test != "Now is the time for all good men to come") 12286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("insert() on stack-allocated UnicodeString didn't work right"); 12296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (guardWord2 != 0x4DED) 12306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("insert() on stack-allocated UnicodeString overwrote guard word!"); 12316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (workingBuffer[24] != 0x67) 12336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("insert() on stack-allocated UnicodeString didn't affect backing store"); 12346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *test += " to the aid of their country."; 12366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (*test != "Now is the time for all good men to come to the aid of their country.") 12376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Stack-allocated UnicodeString overflow didn't work"); 12386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (guardWord2 != 0x4DED) 12396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Stack-allocated UnicodeString overflow overwrote guard word!"); 12406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *test = "ha!"; 12426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (*test != "ha!") 12436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Assignment to stack-allocated UnicodeString didn't work"); 12446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (workingBuffer[0] != 0x4e) 12456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Change to UnicodeString after overflow are still affecting original buffer"); 12466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (guardWord2 != 0x4DED) 12476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Change to UnicodeString after overflow overwrote guard word!"); 12486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test read-only aliasing with setTo() 12506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org workingBuffer[0] = 0x20ac; 12516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org workingBuffer[1] = 0x125; 12526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org workingBuffer[2] = 0; 12536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test->setTo(TRUE, workingBuffer, 2); 12546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test->length() != 2 || test->charAt(0) != 0x20ac || test->charAt(1) != 0x125) { 12556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.setTo(readonly alias) does not alias correctly"); 12566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString *c=(UnicodeString *)test->clone(); 12596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org workingBuffer[1] = 0x109; 12616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test->charAt(1) != 0x109) { 12626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.setTo(readonly alias) made a copy: did not see change in buffer"); 12636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(c->length() != 2 || c->charAt(1) != 0x125) { 12666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("clone(alias) did not copy the buffer"); 12676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete c; 12696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test->setTo(TRUE, workingBuffer, -1); 12716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test->length() != 2 || test->charAt(0) != 0x20ac || test->charAt(1) != 0x109) { 12726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.setTo(readonly alias, length -1) does not alias correctly"); 12736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test->setTo(FALSE, workingBuffer, -1); 12766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!test->isBogus()) { 12776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.setTo(unterminated readonly alias, length -1) does not result in isBogus()"); 12786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete test; 12816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test=new UnicodeString(); 12836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar buffer[]={0x0061, 0x0062, 0x20ac, 0x0043, 0x0042, 0x0000}; 12846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test->setTo(buffer, 4, 10); 12856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test->length() !=4 || test->charAt(0) != 0x0061 || test->charAt(1) != 0x0062 || 12866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test->charAt(2) != 0x20ac || test->charAt(3) != 0x0043){ 12876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln((UnicodeString)"UnicodeString.setTo(UChar*, length, capacity) does not work correctly\n" + prettify(*test)); 12886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete test; 12906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test the UChar32 constructor 12936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString c32Test((UChar32)0x10ff2a); 12946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if( c32Test.length() != U16_LENGTH(0x10ff2a) || 12956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org c32Test.char32At(c32Test.length() - 1) != 0x10ff2a 12966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ) { 12976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("The UnicodeString(UChar32) constructor does not work with a 0x10ff2a filler"); 12986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test the (new) capacity constructor 13016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString capTest(5, (UChar32)0x2a, 5); 13026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if( capTest.length() != 5 * U16_LENGTH(0x2a) || 13036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org capTest.char32At(0) != 0x2a || 13046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org capTest.char32At(4) != 0x2a 13056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ) { 13066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("The UnicodeString capacity constructor does not work with an ASCII filler"); 13076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org capTest = UnicodeString(5, (UChar32)0x10ff2a, 5); 13106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if( capTest.length() != 5 * U16_LENGTH(0x10ff2a) || 13116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org capTest.char32At(0) != 0x10ff2a || 13126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org capTest.char32At(4) != 0x10ff2a 13136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ) { 13146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("The UnicodeString capacity constructor does not work with a 0x10ff2a filler"); 13156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org capTest = UnicodeString(5, (UChar32)0, 0); 13186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(capTest.length() != 0) { 13196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("The UnicodeString capacity constructor does not work with a 0x10ff2a filler"); 13206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 13226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 13246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Test the unescape() function. 13256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 13266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid UnicodeStringTest::TestUnescape(void) { 13276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString IN("abc\\u4567 \\n\\r \\U00101234xyz\\x1\\x{5289}\\x1b", -1, US_INV); 13286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString OUT("abc"); 13296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org OUT.append((UChar)0x4567); 13306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org OUT.append(" "); 13316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org OUT.append((UChar)0xA); 13326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org OUT.append((UChar)0xD); 13336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org OUT.append(" "); 13346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org OUT.append((UChar32)0x00101234); 13356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org OUT.append("xyz"); 13366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org OUT.append((UChar32)1).append((UChar32)0x5289).append((UChar)0x1b); 13376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString result = IN.unescape(); 13386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (result != OUT) { 13396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("FAIL: " + prettify(IN) + ".unescape() -> " + 13406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org prettify(result) + ", expected " + 13416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org prettify(OUT)); 13426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test that an empty string is returned in case of an error 13456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!UNICODE_STRING("wrong \\u sequence", 17).unescape().isEmpty()) { 13466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("FAIL: unescaping of a string with an illegal escape sequence did not return an empty string"); 13476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 13496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* test code point counting functions --------------------------------------- */ 13516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* reference implementation of UnicodeString::hasMoreChar32Than() */ 13536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t 13546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org_refUnicodeStringHasMoreChar32Than(const UnicodeString &s, int32_t start, int32_t length, int32_t number) { 13556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t count=s.countChar32(start, length); 13566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return count>number; 13576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 13586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* compare the real function against the reference */ 13606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 13616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::_testUnicodeStringHasMoreChar32Than(const UnicodeString &s, int32_t start, int32_t length, int32_t number) { 13626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(s.hasMoreChar32Than(start, length, number)!=_refUnicodeStringHasMoreChar32Than(s, start, length, number)) { 13636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("hasMoreChar32Than(%d, %d, %d)=%hd is wrong\n", 13646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org start, length, number, s.hasMoreChar32Than(start, length, number)); 13656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 13676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 13696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestCountChar32(void) { 13706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 13716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString s=UNICODE_STRING("\\U0002f999\\U0001d15f\\u00c4\\u1ed0", 32).unescape(); 13726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test countChar32() 13746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // note that this also calls and tests u_countChar32(length>=0) 13756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if( 13766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org s.countChar32()!=4 || 13776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org s.countChar32(1)!=4 || 13786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org s.countChar32(2)!=3 || 13796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org s.countChar32(2, 3)!=2 || 13806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org s.countChar32(2, 0)!=0 13816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ) { 13826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::countChar32() failed"); 13836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // NUL-terminate the string buffer and test u_countChar32(length=-1) 13866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *buffer=s.getTerminatedBuffer(); 13876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if( 13886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_countChar32(buffer, -1)!=4 || 13896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_countChar32(buffer+1, -1)!=4 || 13906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_countChar32(buffer+2, -1)!=3 || 13916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_countChar32(buffer+3, -1)!=3 || 13926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_countChar32(buffer+4, -1)!=2 || 13936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_countChar32(buffer+5, -1)!=1 || 13946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_countChar32(buffer+6, -1)!=0 13956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ) { 13966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("u_countChar32(length=-1) failed"); 13976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 13986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 13996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test u_countChar32() with bad input 14006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(u_countChar32(NULL, 5)!=0 || u_countChar32(buffer, -2)!=0) { 14016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("u_countChar32(bad input) failed (returned non-zero counts)"); 14026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* test data and variables for hasMoreChar32Than() */ 14066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar str[]={ 14076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x61, 0x62, 0xd800, 0xdc00, 14086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xd801, 0xdc01, 0x63, 0xd802, 14096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x64, 0xdc03, 0x65, 0x66, 14106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xd804, 0xdc04, 0xd805, 0xdc05, 14116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x67 14126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 14136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString string(str, LENGTHOF(str)); 14146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t start, length, number; 14156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* test hasMoreChar32Than() */ 14176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(length=string.length(); length>=0; --length) { 14186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(start=0; start<=length; ++start) { 14196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(number=-1; number<=((length-start)+2); ++number) { 14206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org _testUnicodeStringHasMoreChar32Than(string, start, length-start, number); 14216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* test hasMoreChar32Than() with pinning */ 14266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(start=-1; start<=string.length()+1; ++start) { 14276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(number=-1; number<=((string.length()-start)+2); ++number) { 14286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org _testUnicodeStringHasMoreChar32Than(string, start, 0x7fffffff, number); 14296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* test hasMoreChar32Than() with a bogus string */ 14336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org string.setToBogus(); 14346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(length=-1; length<=1; ++length) { 14356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(start=-1; start<=length; ++start) { 14366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(number=-1; number<=((length-start)+2); ++number) { 14376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org _testUnicodeStringHasMoreChar32Than(string, start, length-start, number); 14386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 14426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 14446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestBogus() { 14456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test1("This is a test"); 14466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test2("This is a test"); 14476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString test3("Me too!"); 14486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test isBogus() and setToBogus() 14506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1.isBogus() || test2.isBogus() || test3.isBogus()) { 14516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("A string returned TRUE for isBogus()!"); 14526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // NULL pointers are treated like empty strings 14556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // use other illegal arguments to make a bogus string 14566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.setTo(FALSE, test1.getBuffer(), -2); 14576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!test3.isBogus()) { 14586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("A bogus string returned FALSE for isBogus()!"); 14596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1.hashCode() != test2.hashCode() || test1.hashCode() == test3.hashCode()) { 14616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("hashCode() failed"); 14626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test3.getBuffer()!=0 || test3.getBuffer(20)!=0 || test3.getTerminatedBuffer()!=0) { 14646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("bogus.getBuffer()!=0"); 14656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1.indexOf(test3) != -1) { 14676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("bogus.indexOf() != -1"); 14686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1.lastIndexOf(test3) != -1) { 14706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("bogus.lastIndexOf() != -1"); 14716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1.caseCompare(test3, U_FOLD_CASE_DEFAULT) != 1 || test3.caseCompare(test1, U_FOLD_CASE_DEFAULT) != -1) { 14736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("caseCompare() doesn't work with bogus strings"); 14746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (test1.compareCodePointOrder(test3) != 1 || test3.compareCodePointOrder(test1) != -1) { 14766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("compareCodePointOrder() doesn't work with bogus strings"); 14776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // verify that non-assignment modifications fail and do not revive a bogus string 14806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.setToBogus(); 14816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.append((UChar)0x61); 14826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!test3.isBogus() || test3.getBuffer()!=0) { 14836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("bogus.append('a') worked but must not"); 14846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.setToBogus(); 14876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.findAndReplace(UnicodeString((UChar)0x61), test2); 14886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!test3.isBogus() || test3.getBuffer()!=0) { 14896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("bogus.findAndReplace() worked but must not"); 14906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.setToBogus(); 14936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.trim(); 14946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!test3.isBogus() || test3.getBuffer()!=0) { 14956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("bogus.trim() revived bogus but must not"); 14966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 14976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 14986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.setToBogus(); 14996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.remove(1); 15006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!test3.isBogus() || test3.getBuffer()!=0) { 15016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("bogus.remove(1) revived bogus but must not"); 15026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.setToBogus(); 15056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!test3.setCharAt(0, 0x62).isBogus() || !test3.isEmpty()) { 15066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("bogus.setCharAt(0, 'b') worked but must not"); 15076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.setToBogus(); 15106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test3.truncate(1) || !test3.isBogus() || !test3.isEmpty()) { 15116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("bogus.truncate(1) revived bogus but must not"); 15126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // verify that assignments revive a bogus string 15156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.setToBogus(); 15166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!test3.isBogus() || (test3=test1).isBogus() || test3!=test1) { 15176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("bogus.operator=() failed"); 15186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.setToBogus(); 15216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!test3.isBogus() || test3.fastCopyFrom(test1).isBogus() || test3!=test1) { 15226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("bogus.fastCopyFrom() failed"); 15236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.setToBogus(); 15266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!test3.isBogus() || test3.setTo(test1).isBogus() || test3!=test1) { 15276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("bogus.setTo(UniStr) failed"); 15286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.setToBogus(); 15316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!test3.isBogus() || test3.setTo(test1, 0).isBogus() || test3!=test1) { 15326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("bogus.setTo(UniStr, 0) failed"); 15336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.setToBogus(); 15366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!test3.isBogus() || test3.setTo(test1, 0, 0x7fffffff).isBogus() || test3!=test1) { 15376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("bogus.setTo(UniStr, 0, len) failed"); 15386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.setToBogus(); 15416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!test3.isBogus() || test3.setTo(test1.getBuffer(), test1.length()).isBogus() || test3!=test1) { 15426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("bogus.setTo(const UChar *, len) failed"); 15436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.setToBogus(); 15466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!test3.isBogus() || test3.setTo((UChar)0x2028).isBogus() || test3!=UnicodeString((UChar)0x2028)) { 15476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("bogus.setTo(UChar) failed"); 15486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.setToBogus(); 15516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!test3.isBogus() || test3.setTo((UChar32)0x1d157).isBogus() || test3!=UnicodeString((UChar32)0x1d157)) { 15526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("bogus.setTo(UChar32) failed"); 15536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.setToBogus(); 15566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!test3.isBogus() || test3.setTo(FALSE, test1.getBuffer(), test1.length()).isBogus() || test3!=test1) { 15576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("bogus.setTo(readonly alias) failed"); 15586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // writable alias to another string's buffer: very bad idea, just convenient for this test 15616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.setToBogus(); 15626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!test3.isBogus() || test3.setTo((UChar *)test1.getBuffer(), test1.length(), test1.getCapacity()).isBogus() || test3!=test1) { 15636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("bogus.setTo(writable alias) failed"); 15646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // verify simple, documented ways to turn a bogus string into an empty one 15676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.setToBogus(); 15686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!test3.isBogus() || (test3=UnicodeString()).isBogus() || !test3.isEmpty()) { 15696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("bogus.operator=(UnicodeString()) failed"); 15706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.setToBogus(); 15736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!test3.isBogus() || test3.setTo(UnicodeString()).isBogus() || !test3.isEmpty()) { 15746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("bogus.setTo(UnicodeString()) failed"); 15756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.setToBogus(); 15786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test3.remove().isBogus() || test3.getBuffer()==0 || !test3.isEmpty()) { 15796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("bogus.remove() failed"); 15806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.setToBogus(); 15836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test3.remove(0, INT32_MAX).isBogus() || test3.getBuffer()==0 || !test3.isEmpty()) { 15846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("bogus.remove(0, INT32_MAX) failed"); 15856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.setToBogus(); 15886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test3.truncate(0) || test3.isBogus() || !test3.isEmpty()) { 15896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("bogus.truncate(0) failed"); 15906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.setToBogus(); 15936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!test3.isBogus() || test3.setTo((UChar32)-1).isBogus() || !test3.isEmpty()) { 15946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("bogus.setTo((UChar32)-1) failed"); 15956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 15966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar nul=0; 15986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 15996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.setToBogus(); 16006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!test3.isBogus() || test3.setTo(&nul, 0).isBogus() || !test3.isEmpty()) { 16016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("bogus.setTo(&nul, 0) failed"); 16026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.setToBogus(); 16056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!test3.isBogus() || test3.getBuffer()!=0) { 16066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("setToBogus() failed to make a string bogus"); 16076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test3.setToBogus(); 16106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test1.isBogus() || !(test1=test3).isBogus()) { 16116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("normal=bogus failed to make the left string bogus"); 16126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test that NULL primitive input string values are treated like 16156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // empty strings, not errors (bogus) 16166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test2.setTo((UChar32)0x10005); 16176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test2.insert(1, NULL, 1).length()!=2) { 16186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UniStr.insert(...NULL...) should not modify the string but does"); 16196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode errorCode=U_ZERO_ERROR; 16226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString 16236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test4((const UChar *)NULL), 16246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test5(TRUE, (const UChar *)NULL, 1), 16256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test6((UChar *)NULL, 5, 5), 16266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test7((const char *)NULL, 3, NULL, errorCode); 16276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test4.isBogus() || test5.isBogus() || test6.isBogus() || test7.isBogus()) { 16286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("a constructor set to bogus for a NULL input string, should be empty"); 16296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test4.setTo(NULL, 3); 16326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test5.setTo(TRUE, (const UChar *)NULL, 1); 16336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test6.setTo((UChar *)NULL, 5, 5); 16346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test4.isBogus() || test5.isBogus() || test6.isBogus()) { 16356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("a setTo() set to bogus for a NULL input string, should be empty"); 16366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test that bogus==bogus<any 16396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test1!=test3 || test1.compare(test3)!=0) { 16406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("bogus==bogus failed"); 16416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org test2.remove(); 16446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(test1>=test2 || !(test2>test1) || test1.compare(test2)>=0 || !(test2.compare(test1)>0)) { 16456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("bogus<empty failed"); 16466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 16486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// StringEnumeration ------------------------------------------------------- *** 16506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// most of StringEnumeration is tested elsewhere 16516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// this test improves code coverage 16526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const char *const 16546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtestEnumStrings[]={ 16556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "a", 16566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "b", 16576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "c", 16586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "this is a long string which helps us test some buffer limits", 16596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee" 16606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 16616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass TestEnumeration : public StringEnumeration { 16636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 16646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TestEnumeration() : i(0) {} 16656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual int32_t count(UErrorCode& /*status*/) const { 16676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return LENGTHOF(testEnumStrings); 16686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual const UnicodeString *snext(UErrorCode &status) { 16716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_SUCCESS(status) && i<LENGTHOF(testEnumStrings)) { 16726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org unistr=UnicodeString(testEnumStrings[i++], ""); 16736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return &unistr; 16746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return NULL; 16776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual void reset(UErrorCode& /*status*/) { 16806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i=0; 16816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static inline UClassID getStaticClassID() { 16846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return (UClassID)&fgClassID; 16856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UClassID getDynamicClassID() const { 16876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return getStaticClassID(); 16886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 16896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate: 16916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const char fgClassID; 16926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i; 16946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 16956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst char TestEnumeration::fgClassID=0; 16976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 16986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 16996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestStringEnumeration() { 17006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString s; 17016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TestEnumeration ten; 17026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i, length; 17036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status; 17046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 17056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const UChar *pu; 17066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *pc; 17076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 17086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test the next() default implementation and ensureCharsCapacity() 17096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<LENGTHOF(testEnumStrings); ++i) { 17106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status=U_ZERO_ERROR; 17116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pc=ten.next(&length, status); 17126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org s=UnicodeString(testEnumStrings[i], ""); 17136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status) || pc==NULL || length!=s.length() || UnicodeString(pc, length, "")!=s) { 17146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("StringEnumeration.next(%d) failed", i); 17156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status=U_ZERO_ERROR; 17186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(ten.next(&length, status)!=NULL) { 17196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("StringEnumeration.next(done)!=NULL"); 17206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 17226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test the unext() default implementation 17236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ten.reset(status); 17246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<LENGTHOF(testEnumStrings); ++i) { 17256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status=U_ZERO_ERROR; 17266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pu=ten.unext(&length, status); 17276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org s=UnicodeString(testEnumStrings[i], ""); 17286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status) || pu==NULL || length!=s.length() || UnicodeString(TRUE, pu, length)!=s) { 17296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("StringEnumeration.unext(%d) failed", i); 17306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status=U_ZERO_ERROR; 17336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(ten.unext(&length, status)!=NULL) { 17346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("StringEnumeration.unext(done)!=NULL"); 17356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 17376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test that the default clone() implementation works, and returns NULL 17386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(ten.clone()!=NULL) { 17396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("StringEnumeration.clone()!=NULL"); 17406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 17426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test that uenum_openFromStringEnumeration() works 17436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Need a heap allocated string enumeration because it is adopted by the UEnumeration. 17446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org StringEnumeration *newTen = new TestEnumeration; 17456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status=U_ZERO_ERROR; 17466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UEnumeration *uten = uenum_openFromStringEnumeration(newTen, &status); 17476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (uten==NULL || U_FAILURE(status)) { 17486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("fail at file %s, line %d, UErrorCode is %s\n", __FILE__, __LINE__, u_errorName(status)); 17496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 17506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 17526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test uenum_next() 17536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<LENGTHOF(testEnumStrings); ++i) { 17546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status=U_ZERO_ERROR; 17556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pc=uenum_next(uten, &length, &status); 17566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status) || pc==NULL || strcmp(pc, testEnumStrings[i]) != 0) { 17576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("File %s, line %d, StringEnumeration.next(%d) failed", __FILE__, __LINE__, i); 17586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status=U_ZERO_ERROR; 17616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(uenum_next(uten, &length, &status)!=NULL) { 17626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("File %s, line %d, uenum_next(done)!=NULL"); 17636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 17656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // test the uenum_unext() 17666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uenum_reset(uten, &status); 17676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i=0; i<LENGTHOF(testEnumStrings); ++i) { 17686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status=U_ZERO_ERROR; 17696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pu=uenum_unext(uten, &length, &status); 17706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org s=UnicodeString(testEnumStrings[i], ""); 17716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status) || pu==NULL || length!=s.length() || UnicodeString(TRUE, pu, length)!=s) { 17726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("File %s, Line %d, uenum_unext(%d) failed", __FILE__, __LINE__, i); 17736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status=U_ZERO_ERROR; 17766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(uenum_unext(uten, &length, &status)!=NULL) { 17776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("File %s, Line %d, uenum_unext(done)!=NULL" __FILE__, __LINE__); 17786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 17796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 17806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uenum_close(uten); 17816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 17826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 17836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 17846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Namespace test, to make sure that macros like UNICODE_STRING include the 17856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * namespace qualifier. 17866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 17876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Define a (bogus) UnicodeString class in another namespace and check for ambiguity. 17886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 17896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgnamespace bogus { 17906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org class UnicodeString { 17916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org public: 17926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org enum EInvariant { kInvariant }; 17936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString() : i(1) {} 17946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString(UBool /*isTerminated*/, const UChar * /*text*/, int32_t textLength) : i(textLength) {(void)i;} 17956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString(const char * /*src*/, int32_t length, enum EInvariant /*inv*/ 17966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org) : i(length) {} 17976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org private: 17986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i; 17996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 18006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 18016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 18026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 18036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestNameSpace() { 18046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Provoke name collision unless the UnicodeString macros properly 18056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // qualify the icu::UnicodeString class. 18066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org using namespace bogus; 18076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 18086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Use all UnicodeString macros from unistr.h. 18096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org icu::UnicodeString s1=icu::UnicodeString("abc", 3, US_INV); 18106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org icu::UnicodeString s2=UNICODE_STRING("def", 3); 18116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org icu::UnicodeString s3=UNICODE_STRING_SIMPLE("ghi"); 18126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 18136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Make sure the compiler does not optimize away instantiation of s1, s2, s3. 18146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org icu::UnicodeString s4=s1+s2+s3; 18156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(s4.length()!=9) { 18166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Something wrong with UnicodeString::operator+()."); 18176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 18186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 18196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 18206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 18216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestUTF32() { 18226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Input string length US_STACKBUF_SIZE to cause overflow of the 18236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // initially chosen fStackBuffer due to supplementary characters. 18246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar32 utf32[] = { 18256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x41, 0xd900, 0x61, 0xdc00, -1, 0x110000, 0x5a, 0x50000, 0x7a, 18266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x10000, 0x20000, 0xe0000, 0x10ffff 18276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 18286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar expected_utf16[] = { 18296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x41, 0xfffd, 0x61, 0xfffd, 0xfffd, 0xfffd, 0x5a, 0xd900, 0xdc00, 0x7a, 18306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xd800, 0xdc00, 0xd840, 0xdc00, 0xdb40, 0xdc00, 0xdbff, 0xdfff 18316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 18326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString from32 = UnicodeString::fromUTF32(utf32, LENGTHOF(utf32)); 18336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString expected(FALSE, expected_utf16, LENGTHOF(expected_utf16)); 18346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(from32 != expected) { 18356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::fromUTF32() did not create the expected string."); 18366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 18376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 18386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar utf16[] = { 18396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x41, 0xd900, 0x61, 0xdc00, 0x5a, 0xd900, 0xdc00, 0x7a, 0xd800, 0xdc00, 0xdbff, 0xdfff 18406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 18416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar32 expected_utf32[] = { 18426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x41, 0xfffd, 0x61, 0xfffd, 0x5a, 0x50000, 0x7a, 0x10000, 0x10ffff 18436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 18446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar32 result32[16]; 18456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode errorCode = U_ZERO_ERROR; 18466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length32 = 18476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString(FALSE, utf16, LENGTHOF(utf16)). 18486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org toUTF32(result32, LENGTHOF(result32), errorCode); 18496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if( length32 != LENGTHOF(expected_utf32) || 18506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0 != uprv_memcmp(result32, expected_utf32, length32*4) || 18516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result32[length32] != 0 18526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ) { 18536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::toUTF32() did not create the expected string."); 18546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 18556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 18566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 18576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass TestCheckedArrayByteSink : public CheckedArrayByteSink { 18586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 18596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TestCheckedArrayByteSink(char* outbuf, int32_t capacity) 18606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org : CheckedArrayByteSink(outbuf, capacity), calledFlush(FALSE) {} 18616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual void Flush() { calledFlush = TRUE; } 18626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool calledFlush; 18636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 18646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 18656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 18666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestUTF8() { 18676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const uint8_t utf8[] = { 18686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Code points: 18696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 0x41, 0xd900, 18706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 0x61, 0xdc00, 18716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 0x110000, 0x5a, 18726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 0x50000, 0x7a, 18736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 0x10000, 0x20000, 18746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // 0xe0000, 0x10ffff 18756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x41, 0xed, 0xa4, 0x80, 18766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x61, 0xed, 0xb0, 0x80, 18776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xf4, 0x90, 0x80, 0x80, 0x5a, 18786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xf1, 0x90, 0x80, 0x80, 0x7a, 18796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xf0, 0x90, 0x80, 0x80, 0xf0, 0xa0, 0x80, 0x80, 18806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xf3, 0xa0, 0x80, 0x80, 0xf4, 0x8f, 0xbf, 0xbf 18816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 18826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar expected_utf16[] = { 18836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x41, 0xfffd, 18846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x61, 0xfffd, 18856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xfffd, 0x5a, 18866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xd900, 0xdc00, 0x7a, 18876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xd800, 0xdc00, 0xd840, 0xdc00, 18886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xdb40, 0xdc00, 0xdbff, 0xdfff 18896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 18906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString from8 = UnicodeString::fromUTF8(StringPiece((const char *)utf8, (int32_t)sizeof(utf8))); 18916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString expected(FALSE, expected_utf16, LENGTHOF(expected_utf16)); 18926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 18936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(from8 != expected) { 18946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::fromUTF8(StringPiece) did not create the expected string."); 18956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 18966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_HAVE_STD_STRING 18976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org std::string utf8_string((const char *)utf8, sizeof(utf8)); 18986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString from8b = UnicodeString::fromUTF8(utf8_string); 18996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(from8b != expected) { 19006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::fromUTF8(std::string) did not create the expected string."); 19016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 19036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 19046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar utf16[] = { 19056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x41, 0xd900, 0x61, 0xdc00, 0x5a, 0xd900, 0xdc00, 0x7a, 0xd800, 0xdc00, 0xdbff, 0xdfff 19066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 19076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const uint8_t expected_utf8[] = { 19086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0x41, 0xef, 0xbf, 0xbd, 0x61, 0xef, 0xbf, 0xbd, 0x5a, 0xf1, 0x90, 0x80, 0x80, 0x7a, 19096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0xf0, 0x90, 0x80, 0x80, 0xf4, 0x8f, 0xbf, 0xbf 19106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 19116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString us(FALSE, utf16, LENGTHOF(utf16)); 19126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 19136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char buffer[64]; 19146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TestCheckedArrayByteSink sink(buffer, (int32_t)sizeof(buffer)); 19156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org us.toUTF8(sink); 19166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if( sink.NumberOfBytesWritten() != (int32_t)sizeof(expected_utf8) || 19176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0 != uprv_memcmp(buffer, expected_utf8, sizeof(expected_utf8)) 19186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ) { 19196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::toUTF8() did not create the expected string."); 19206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!sink.calledFlush) { 19226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::toUTF8(sink) did not sink.Flush()."); 19236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_HAVE_STD_STRING 19256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Initial contents for testing that toUTF8String() appends. 19266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org std::string result8 = "-->"; 19276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org std::string expected8 = "-->" + std::string((const char *)expected_utf8, sizeof(expected_utf8)); 19286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Use the return value just for testing. 19296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org std::string &result8r = us.toUTF8String(result8); 19306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(result8r != expected8 || &result8r != &result8) { 19316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString::toUTF8String() did not create the expected string."); 19326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 19346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 19356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 19366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Test if this compiler supports Return Value Optimization of unnamed temporary objects. 19376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UnicodeString wrapUChars(const UChar *uchars) { 19386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return UnicodeString(TRUE, uchars, -1); 19396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 19406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 19416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 19426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestReadOnlyAlias() { 19436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar uchars[]={ 0x61, 0x62, 0 }; 19446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString alias(TRUE, uchars, 2); 19456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(alias.length()!=2 || alias.getBuffer()!=uchars || alias.getTerminatedBuffer()!=uchars) { 19466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString read-only-aliasing constructor does not behave as expected."); 19476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 19486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org alias.truncate(1); 19506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(alias.length()!=1 || alias.getBuffer()!=uchars) { 19516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString(read-only-alias).truncate() did not preserve aliasing as expected."); 19526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(alias.getTerminatedBuffer()==uchars) { 19546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString(read-only-alias).truncate().getTerminatedBuffer() " 19556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "did not allocate and copy as expected."); 19566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(uchars[1]!=0x62) { 19586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString(read-only-alias).truncate().getTerminatedBuffer() " 19596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "modified the original buffer."); 19606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(1!=u_strlen(alias.getTerminatedBuffer())) { 19626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString(read-only-alias).truncate().getTerminatedBuffer() " 19636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "does not return a buffer terminated at the proper length."); 19646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 19666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org alias.setTo(TRUE, uchars, 2); 19676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(alias.length()!=2 || alias.getBuffer()!=uchars || alias.getTerminatedBuffer()!=uchars) { 19686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString read-only-aliasing setTo() does not behave as expected."); 19696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 19706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org alias.remove(); 19726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(alias.length()!=0) { 19736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString(read-only-alias).remove() did not work."); 19746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(alias.getTerminatedBuffer()==uchars) { 19766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString(read-only-alias).remove().getTerminatedBuffer() " 19776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "did not un-alias as expected."); 19786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(uchars[0]!=0x61) { 19806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString(read-only-alias).remove().getTerminatedBuffer() " 19816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "modified the original buffer."); 19826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(0!=u_strlen(alias.getTerminatedBuffer())) { 19846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.setTo(read-only-alias).remove().getTerminatedBuffer() " 19856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "does not return a buffer terminated at length 0."); 19866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 19886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString longString=UNICODE_STRING_SIMPLE("abcdefghijklmnopqrstuvwxyz0123456789"); 19896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org alias.setTo(FALSE, longString.getBuffer(), longString.length()); 19906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org alias.remove(0, 10); 19916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(longString.compare(10, INT32_MAX, alias)!=0 || alias.getBuffer()!=longString.getBuffer()+10) { 19926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.setTo(read-only-alias).remove(0, 10) did not preserve aliasing as expected."); 19936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org alias.setTo(FALSE, longString.getBuffer(), longString.length()); 19956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org alias.remove(27, 99); 19966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(longString.compare(0, 27, alias)!=0 || alias.getBuffer()!=longString.getBuffer()) { 19976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.setTo(read-only-alias).remove(27, 99) did not preserve aliasing as expected."); 19986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 19996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org alias.setTo(FALSE, longString.getBuffer(), longString.length()); 20006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org alias.retainBetween(6, 30); 20016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(longString.compare(6, 24, alias)!=0 || alias.getBuffer()!=longString.getBuffer()+6) { 20026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.setTo(read-only-alias).retainBetween(6, 30) did not preserve aliasing as expected."); 20036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 20056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar abc[]={ 0x61, 0x62, 0x63, 0 }; 20066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool hasRVO= wrapUChars(abc).getBuffer()==abc; 20076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 20086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString temp; 20096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org temp.fastCopyFrom(longString.tempSubString()); 20106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(temp!=longString || (hasRVO && temp.getBuffer()!=longString.getBuffer())) { 20116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.tempSubString() failed"); 20126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org temp.fastCopyFrom(longString.tempSubString(-3, 5)); 20146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(longString.compare(0, 5, temp)!=0 || (hasRVO && temp.getBuffer()!=longString.getBuffer())) { 20156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.tempSubString(-3, 5) failed"); 20166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org temp.fastCopyFrom(longString.tempSubString(17)); 20186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(longString.compare(17, INT32_MAX, temp)!=0 || (hasRVO && temp.getBuffer()!=longString.getBuffer()+17)) { 20196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.tempSubString(17) failed"); 20206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org temp.fastCopyFrom(longString.tempSubString(99)); 20226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!temp.isEmpty()) { 20236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.tempSubString(99) failed"); 20246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org temp.fastCopyFrom(longString.tempSubStringBetween(6)); 20266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(longString.compare(6, INT32_MAX, temp)!=0 || (hasRVO && temp.getBuffer()!=longString.getBuffer()+6)) { 20276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.tempSubStringBetween(6) failed"); 20286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org temp.fastCopyFrom(longString.tempSubStringBetween(8, 18)); 20306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(longString.compare(8, 10, temp)!=0 || (hasRVO && temp.getBuffer()!=longString.getBuffer()+8)) { 20316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.tempSubStringBetween(8, 18) failed"); 20326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString bogusString; 20346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org bogusString.setToBogus(); 20356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org temp.fastCopyFrom(bogusString.tempSubStringBetween(8, 18)); 20366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!temp.isBogus()) { 20376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("UnicodeString.setToBogus().tempSubStringBetween(8, 18) failed"); 20386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 20406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 20416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 20426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::doTestAppendable(UnicodeString &dest, Appendable &app) { 20436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar cde[3]={ 0x63, 0x64, 0x65 }; 20446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar fg[3]={ 0x66, 0x67, 0 }; 20456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!app.reserveAppendCapacity(12)) { 20466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Appendable.reserve(12) failed"); 20476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org app.appendCodeUnit(0x61); 20496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org app.appendCodePoint(0x62); 20506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org app.appendCodePoint(0x50000); 20516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org app.appendString(cde, 3); 20526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org app.appendString(fg, -1); 20536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar scratch[3]; 20546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t capacity=-1; 20556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UChar *buffer=app.getAppendBuffer(3, 3, scratch, 3, &capacity); 20566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(capacity<3) { 20576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Appendable.getAppendBuffer(min=3) returned capacity=%d<3", (int)capacity); 20586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 20596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar hij[3]={ 0x68, 0x69, 0x6a }; 20616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u_memcpy(buffer, hij, 3); 20626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org app.appendString(buffer, 3); 20636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(dest!=UNICODE_STRING_SIMPLE("ab\\U00050000cdefghij").unescape()) { 20646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Appendable.append(...) failed"); 20656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org buffer=app.getAppendBuffer(0, 3, scratch, 3, &capacity); 20676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(buffer!=NULL || capacity!=0) { 20686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Appendable.getAppendBuffer(min=0) failed"); 20696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org capacity=1; 20716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org buffer=app.getAppendBuffer(3, 3, scratch, 2, &capacity); 20726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(buffer!=NULL || capacity!=0) { 20736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Appendable.getAppendBuffer(scratch<min) failed"); 20746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 20756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 20766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 20776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass SimpleAppendable : public Appendable { 20786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 20796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org explicit SimpleAppendable(UnicodeString &dest) : str(dest) {} 20806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual UBool appendCodeUnit(UChar c) { str.append(c); return TRUE; } 20816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleAppendable &reset() { str.remove(); return *this; } 20826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate: 20836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString &str; 20846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 20856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 20866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 20876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestAppendable() { 20886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString dest; 20896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleAppendable app(dest); 20906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org doTestAppendable(dest, app); 20916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 20926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 20936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 20946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestUnicodeStringImplementsAppendable() { 20956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString dest; 20966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeStringAppendable app(dest); 20976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org doTestAppendable(dest, app); 20986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 20996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 21006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 21016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeStringTest::TestSizeofUnicodeString() { 21026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // See the comments in unistr.h near the declaration of UnicodeString's fields. 21036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org size_t sizeofUniStr=sizeof(UnicodeString); 21046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org size_t expected; 21056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org switch(sizeof(void *)) { 21066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 4: 21076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expected=32; 21086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 21096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 8: 21106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org expected=40; 21116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 21126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org default: 21136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("This platform has neither 32-bit nor 64-bit pointers."); 21146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 21156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 21166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(expected!=sizeofUniStr) { 21176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("sizeof(UnicodeString)=%d, expected %d", (int)sizeofUniStr, (int)expected); 21186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 21196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2120