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