16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/******************************************************************** 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * COPYRIGHT: 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (c) 1997-2012, International Business Machines Corporation and 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * others. All Rights Reserved. 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************/ 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* file name: strtest.cpp 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* encoding: US-ASCII 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* tab size: 8 (not used) 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* indentation:4 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* created on: 1999nov22 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* created by: Markus W. Scherer 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <string.h> 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h" 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/putil.h" 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/std_string.h" 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/stringpiece.h" 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/unistr.h" 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustring.h" 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "charstr.h" 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "intltest.h" 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "strtest.h" 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgStringTest::~StringTest() {} 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid StringTest::TestEndian(void) { 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org union { 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint8_t byte; 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint16_t word; 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } u; 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org u.word=0x0100; 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_IS_BIG_ENDIAN!=u.byte) { 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("TestEndian: U_IS_BIG_ENDIAN needs to be fixed in platform.h"); 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid StringTest::TestSizeofTypes(void) { 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_SIZEOF_WCHAR_T!=sizeof(wchar_t)) { 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("TestSizeofWCharT: U_SIZEOF_WCHAR_T!=sizeof(wchar_t) - U_SIZEOF_WCHAR_T needs to be fixed in platform.h"); 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef U_INT64_T_UNAVAILABLE 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("int64_t and uint64_t are undefined."); 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(8!=sizeof(int64_t)) { 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("TestSizeofTypes: 8!=sizeof(int64_t) - int64_t needs to be fixed in platform.h"); 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(8!=sizeof(uint64_t)) { 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("TestSizeofTypes: 8!=sizeof(uint64_t) - uint64_t needs to be fixed in platform.h"); 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(8!=sizeof(double)) { 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("8!=sizeof(double) - putil.c code may not work"); 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(4!=sizeof(int32_t)) { 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("4!=sizeof(int32_t)"); 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(4!=sizeof(uint32_t)) { 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("4!=sizeof(uint32_t)"); 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(2!=sizeof(int16_t)) { 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("2!=sizeof(int16_t)"); 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(2!=sizeof(uint16_t)) { 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("2!=sizeof(uint16_t)"); 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(2!=sizeof(UChar)) { 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("2!=sizeof(UChar)"); 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(1!=sizeof(int8_t)) { 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("1!=sizeof(int8_t)"); 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(1!=sizeof(uint8_t)) { 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("1!=sizeof(uint8_t)"); 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(1!=sizeof(UBool)) { 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("1!=sizeof(UBool)"); 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid StringTest::TestCharsetFamily(void) { 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org unsigned char c='A'; 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if( (U_CHARSET_FAMILY==U_ASCII_FAMILY && c!=0x41) || 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (U_CHARSET_FAMILY==U_EBCDIC_FAMILY && c!=0xc1) 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ) { 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("TestCharsetFamily: U_CHARSET_FAMILY needs to be fixed in platform.h"); 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_STRING_DECL(ustringVar, "aZ0 -", 5); 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgStringTest::Test_U_STRING() { 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U_STRING_INIT(ustringVar, "aZ0 -", 5); 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if( u_strlen(ustringVar)!=5 || 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ustringVar[0]!=0x61 || 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ustringVar[1]!=0x5a || 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ustringVar[2]!=0x30 || 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ustringVar[3]!=0x20 || 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ustringVar[4]!=0x2d || 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ustringVar[5]!=0 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ) { 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Test_U_STRING: U_STRING_DECL with U_STRING_INIT does not work right! " 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "See putil.h and utypes.h with platform.h."); 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgStringTest::Test_UNICODE_STRING() { 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString ustringVar=UNICODE_STRING("aZ0 -", 5); 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if( ustringVar.length()!=5 || 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ustringVar[0]!=0x61 || 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ustringVar[1]!=0x5a || 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ustringVar[2]!=0x30 || 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ustringVar[3]!=0x20 || 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ustringVar[4]!=0x2d 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ) { 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Test_UNICODE_STRING: UNICODE_STRING does not work right! " 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "See unistr.h and utypes.h with platform.h."); 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgStringTest::Test_UNICODE_STRING_SIMPLE() { 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString ustringVar=UNICODE_STRING_SIMPLE("aZ0 -"); 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if( ustringVar.length()!=5 || 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ustringVar[0]!=0x61 || 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ustringVar[1]!=0x5a || 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ustringVar[2]!=0x30 || 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ustringVar[3]!=0x20 || 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ustringVar[4]!=0x2d 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ) { 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Test_UNICODE_STRING_SIMPLE: UNICODE_STRING_SIMPLE does not work right! " 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "See unistr.h and utypes.h with platform.h."); 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgStringTest::Test_UTF8_COUNT_TRAIL_BYTES() { 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(UTF8_COUNT_TRAIL_BYTES(0x7F) != 0 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org || UTF8_COUNT_TRAIL_BYTES(0xC0) != 1 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org || UTF8_COUNT_TRAIL_BYTES(0xE0) != 2 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org || UTF8_COUNT_TRAIL_BYTES(0xF0) != 3) 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Test_UTF8_COUNT_TRAIL_BYTES: UTF8_COUNT_TRAIL_BYTES does not work right! " 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "See utf8.h."); 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid StringTest::runIndexedTest(int32_t index, UBool exec, const char *&name, char * /*par*/) { 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(exec) { 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("TestSuite Character and String Test: "); 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCASE_AUTO_BEGIN; 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCASE_AUTO(TestEndian); 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCASE_AUTO(TestSizeofTypes); 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCASE_AUTO(TestCharsetFamily); 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCASE_AUTO(Test_U_STRING); 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCASE_AUTO(Test_UNICODE_STRING); 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCASE_AUTO(Test_UNICODE_STRING_SIMPLE); 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCASE_AUTO(Test_UTF8_COUNT_TRAIL_BYTES); 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCASE_AUTO(TestSTLCompatibility); 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCASE_AUTO(TestStringPiece); 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCASE_AUTO(TestStringPieceComparisons); 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCASE_AUTO(TestByteSink); 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCASE_AUTO(TestCheckedArrayByteSink); 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCASE_AUTO(TestStringByteSink); 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCASE_AUTO(TestCharString); 1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TESTCASE_AUTO_END; 1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgStringTest::TestStringPiece() { 1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Default constructor. 1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org StringPiece empty; 1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!empty.empty() || empty.data()!=NULL || empty.length()!=0 || empty.size()!=0) { 1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("StringPiece() failed"); 1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Construct from NULL const char * pointer. 1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org StringPiece null(NULL); 1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!null.empty() || null.data()!=NULL || null.length()!=0 || null.size()!=0) { 1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("StringPiece(NULL) failed"); 1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Construct from const char * pointer. 1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const char *abc_chars="abc"; 1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org StringPiece abc(abc_chars); 1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(abc.empty() || abc.data()!=abc_chars || abc.length()!=3 || abc.size()!=3) { 1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("StringPiece(abc_chars) failed"); 1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Construct from const char * pointer and length. 1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const char *abcdefg_chars="abcdefg"; 1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org StringPiece abcd(abcdefg_chars, 4); 1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(abcd.empty() || abcd.data()!=abcdefg_chars || abcd.length()!=4 || abcd.size()!=4) { 1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("StringPiece(abcdefg_chars, 4) failed"); 1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_HAVE_STD_STRING 1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Construct from std::string. 2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org std::string uvwxyz_string("uvwxyz"); 2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org StringPiece uvwxyz(uvwxyz_string); 2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(uvwxyz.empty() || uvwxyz.data()!=uvwxyz_string.data() || uvwxyz.length()!=6 || uvwxyz.size()!=6) { 2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("StringPiece(uvwxyz_string) failed"); 2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Substring constructor with pos. 2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org StringPiece sp(abcd, -1); 2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(sp.empty() || sp.data()!=abcdefg_chars || sp.length()!=4 || sp.size()!=4) { 2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("StringPiece(abcd, -1) failed"); 2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sp=StringPiece(abcd, 5); 2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!sp.empty() || sp.length()!=0 || sp.size()!=0) { 2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("StringPiece(abcd, 5) failed"); 2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sp=StringPiece(abcd, 2); 2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(sp.empty() || sp.data()!=abcdefg_chars+2 || sp.length()!=2 || sp.size()!=2) { 2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("StringPiece(abcd, -1) failed"); 2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Substring constructor with pos and len. 2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sp=StringPiece(abcd, -1, 8); 2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(sp.empty() || sp.data()!=abcdefg_chars || sp.length()!=4 || sp.size()!=4) { 2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("StringPiece(abcd, -1, 8) failed"); 2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sp=StringPiece(abcd, 5, 8); 2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!sp.empty() || sp.length()!=0 || sp.size()!=0) { 2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("StringPiece(abcd, 5, 8) failed"); 2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sp=StringPiece(abcd, 2, 8); 2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(sp.empty() || sp.data()!=abcdefg_chars+2 || sp.length()!=2 || sp.size()!=2) { 2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("StringPiece(abcd, -1) failed"); 2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sp=StringPiece(abcd, 2, -1); 2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!sp.empty() || sp.length()!=0 || sp.size()!=0) { 2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("StringPiece(abcd, 5, -1) failed"); 2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // static const npos 2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const int32_t *ptr_npos=&StringPiece::npos; 2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(StringPiece::npos!=0x7fffffff || *ptr_npos!=0x7fffffff) { 2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("StringPiece::npos!=0x7fffffff"); 2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // substr() method with pos, using len=npos. 2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sp=abcd.substr(-1); 2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(sp.empty() || sp.data()!=abcdefg_chars || sp.length()!=4 || sp.size()!=4) { 2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("abcd.substr(-1) failed"); 2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sp=abcd.substr(5); 2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!sp.empty() || sp.length()!=0 || sp.size()!=0) { 2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("abcd.substr(5) failed"); 2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sp=abcd.substr(2); 2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(sp.empty() || sp.data()!=abcdefg_chars+2 || sp.length()!=2 || sp.size()!=2) { 2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("abcd.substr(-1) failed"); 2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // substr() method with pos and len. 2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sp=abcd.substr(-1, 8); 2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(sp.empty() || sp.data()!=abcdefg_chars || sp.length()!=4 || sp.size()!=4) { 2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("abcd.substr(-1, 8) failed"); 2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sp=abcd.substr(5, 8); 2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!sp.empty() || sp.length()!=0 || sp.size()!=0) { 2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("abcd.substr(5, 8) failed"); 2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sp=abcd.substr(2, 8); 2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(sp.empty() || sp.data()!=abcdefg_chars+2 || sp.length()!=2 || sp.size()!=2) { 2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("abcd.substr(-1) failed"); 2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sp=abcd.substr(2, -1); 2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!sp.empty() || sp.length()!=0 || sp.size()!=0) { 2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("abcd.substr(5, -1) failed"); 2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // clear() 2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sp=abcd; 2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sp.clear(); 2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!sp.empty() || sp.data()!=NULL || sp.length()!=0 || sp.size()!=0) { 2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("abcd.clear() failed"); 2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // remove_prefix() 2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sp=abcd; 2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sp.remove_prefix(-1); 2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(sp.empty() || sp.data()!=abcdefg_chars || sp.length()!=4 || sp.size()!=4) { 2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("abcd.remove_prefix(-1) failed"); 2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sp=abcd; 2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sp.remove_prefix(2); 2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(sp.empty() || sp.data()!=abcdefg_chars+2 || sp.length()!=2 || sp.size()!=2) { 2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("abcd.remove_prefix(2) failed"); 2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sp=abcd; 2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sp.remove_prefix(5); 2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!sp.empty() || sp.length()!=0 || sp.size()!=0) { 2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("abcd.remove_prefix(5) failed"); 2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // remove_suffix() 2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sp=abcd; 2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sp.remove_suffix(-1); 2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(sp.empty() || sp.data()!=abcdefg_chars || sp.length()!=4 || sp.size()!=4) { 2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("abcd.remove_suffix(-1) failed"); 2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sp=abcd; 3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sp.remove_suffix(2); 3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(sp.empty() || sp.data()!=abcdefg_chars || sp.length()!=2 || sp.size()!=2) { 3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("abcd.remove_suffix(2) failed"); 3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sp=abcd; 3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sp.remove_suffix(5); 3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!sp.empty() || sp.length()!=0 || sp.size()!=0) { 3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("abcd.remove_suffix(5) failed"); 3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgStringTest::TestStringPieceComparisons() { 3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org StringPiece empty; 3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org StringPiece null(NULL); 3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org StringPiece abc("abc"); 3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org StringPiece abcd("abcdefg", 4); 3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org StringPiece abx("abx"); 3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(empty!=null) { 3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("empty!=null"); 3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(empty==abc) { 3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("empty==abc"); 3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(abc==abcd) { 3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("abc==abcd"); 3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org abcd.remove_suffix(1); 3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(abc!=abcd) { 3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("abc!=abcd.remove_suffix(1)"); 3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(abc==abx) { 3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("abc==abx"); 3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Verify that ByteSink is subclassable and Flush() overridable. 3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass SimpleByteSink : public ByteSink { 3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleByteSink(char *outbuf) : fOutbuf(outbuf), fLength(0) {} 3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual void Append(const char *bytes, int32_t n) { 3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(fOutbuf != bytes) { 3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org memcpy(fOutbuf, bytes, n); 3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fOutbuf += n; 3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fLength += n; 3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual void Flush() { Append("z", 1); } 3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length() { return fLength; } 3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate: 3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char *fOutbuf; 3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t fLength; 3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Test the ByteSink base class. 3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgStringTest::TestByteSink() { 3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char buffer[20]; 3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org buffer[4] = '!'; 3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleByteSink sink(buffer); 3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sink.Append("abc", 3); 3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sink.Flush(); 3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!(sink.length() == 4 && 0 == memcmp("abcz", buffer, 4) && buffer[4] == '!')) { 3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("ByteSink (SimpleByteSink) did not Append() or Flush() as expected"); 3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char scratch[20]; 3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t capacity = -1; 3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char *dest = sink.GetAppendBuffer(0, 50, scratch, (int32_t)sizeof(scratch), &capacity); 3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(dest != NULL || capacity != 0) { 3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("ByteSink.GetAppendBuffer(min_capacity<1) did not properly return NULL[0]"); 3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest = sink.GetAppendBuffer(10, 50, scratch, 9, &capacity); 3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(dest != NULL || capacity != 0) { 3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("ByteSink.GetAppendBuffer(scratch_capacity<min_capacity) did not properly return NULL[0]"); 3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest = sink.GetAppendBuffer(5, 50, scratch, (int32_t)sizeof(scratch), &capacity); 3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(dest != scratch || capacity != (int32_t)sizeof(scratch)) { 3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("ByteSink.GetAppendBuffer() did not properly return the scratch buffer"); 3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgStringTest::TestCheckedArrayByteSink() { 3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char buffer[20]; // < 26 for the test code to work 3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org buffer[3] = '!'; 3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CheckedArrayByteSink sink(buffer, (int32_t)sizeof(buffer)); 3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sink.Append("abc", 3); 3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!(sink.NumberOfBytesAppended() == 3 && sink.NumberOfBytesWritten() == 3 && 3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0 == memcmp("abc", buffer, 3) && buffer[3] == '!') && 3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org !sink.Overflowed() 3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ) { 3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("CheckedArrayByteSink did not Append() as expected"); 3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char scratch[10]; 3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t capacity = -1; 3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char *dest = sink.GetAppendBuffer(0, 50, scratch, (int32_t)sizeof(scratch), &capacity); 4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(dest != NULL || capacity != 0) { 4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("CheckedArrayByteSink.GetAppendBuffer(min_capacity<1) did not properly return NULL[0]"); 4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest = sink.GetAppendBuffer(10, 50, scratch, 9, &capacity); 4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(dest != NULL || capacity != 0) { 4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("CheckedArrayByteSink.GetAppendBuffer(scratch_capacity<min_capacity) did not properly return NULL[0]"); 4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest = sink.GetAppendBuffer(10, 50, scratch, (int32_t)sizeof(scratch), &capacity); 4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(dest != buffer + 3 || capacity != (int32_t)sizeof(buffer) - 3) { 4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("CheckedArrayByteSink.GetAppendBuffer() did not properly return its own buffer"); 4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org memcpy(dest, "defghijklm", 10); 4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sink.Append(dest, 10); 4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!(sink.NumberOfBytesAppended() == 13 && sink.NumberOfBytesWritten() == 13 && 4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0 == memcmp("abcdefghijklm", buffer, 13) && 4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org !sink.Overflowed()) 4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ) { 4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("CheckedArrayByteSink did not Append(its own buffer) as expected"); 4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dest = sink.GetAppendBuffer(10, 50, scratch, (int32_t)sizeof(scratch), &capacity); 4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(dest != scratch || capacity != (int32_t)sizeof(scratch)) { 4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("CheckedArrayByteSink.GetAppendBuffer() did not properly return the scratch buffer"); 4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org memcpy(dest, "nopqrstuvw", 10); 4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sink.Append(dest, 10); 4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!(sink.NumberOfBytesAppended() == 23 && 4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sink.NumberOfBytesWritten() == (int32_t)sizeof(buffer) && 4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0 == memcmp("abcdefghijklmnopqrstuvwxyz", buffer, (int32_t)sizeof(buffer)) && 4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sink.Overflowed()) 4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ) { 4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("CheckedArrayByteSink did not Append(scratch buffer) as expected"); 4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sink.Reset().Append("123", 3); 4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!(sink.NumberOfBytesAppended() == 3 && sink.NumberOfBytesWritten() == 3 && 4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0 == memcmp("123defghijklmnopqrstuvwxyz", buffer, (int32_t)sizeof(buffer)) && 4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org !sink.Overflowed()) 4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ) { 4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("CheckedArrayByteSink did not Reset().Append() as expected"); 4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgStringTest::TestStringByteSink() { 4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_HAVE_STD_STRING 4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Not much to test because only the constructor and Append() 4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // are implemented, and trivially so. 4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org std::string result("abc"); // std::string 4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org StringByteSink<std::string> sink(&result); 4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sink.Append("def", 3); 4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(result != "abcdef") { 4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("StringByteSink did not Append() as expected"); 4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if defined(_MSC_VER) 4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <vector> 4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgStringTest::TestSTLCompatibility() { 4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if defined(_MSC_VER) 4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Just make sure that it compiles with STL's placement new usage. */ 4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org std::vector<UnicodeString> myvect; 4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org myvect.push_back(UnicodeString("blah")); 4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgStringTest::TestCharString() { 4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org IcuTestErrorCode errorCode(*this, "TestCharString()"); 4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char expected[400]; 4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const char longStr[] = 4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "This is a long string that is meant to cause reallocation of the internal buffer of CharString."; 4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CharString chStr(longStr, errorCode); 4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (0 != strcmp(longStr, chStr.data()) || (int32_t)strlen(longStr) != chStr.length()) { 4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("CharString(longStr) failed."); 4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CharString test("Test", errorCode); 4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CharString copy(test,errorCode); 4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org copy.copyFrom(chStr, errorCode); 4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (0 != strcmp(longStr, copy.data()) || (int32_t)strlen(longStr) != copy.length()) { 4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("CharString.copyFrom() failed."); 4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org StringPiece sp(chStr.toStringPiece()); 4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sp.remove_prefix(4); 4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org chStr.append(sp, errorCode).append(chStr, errorCode); 4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcpy(expected, longStr); 4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcat(expected, longStr+4); 4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcat(expected, longStr); 4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcat(expected, longStr+4); 4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (0 != strcmp(expected, chStr.data()) || (int32_t)strlen(expected) != chStr.length()) { 4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("CharString(longStr).append(substring of self).append(self) failed."); 4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org chStr.clear().append("abc", errorCode).append("defghij", 3, errorCode); 5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (0 != strcmp("abcdef", chStr.data()) || 6 != chStr.length()) { 5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("CharString.clear().append(abc).append(defghij, 3) failed."); 5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org chStr.appendInvariantChars(UNICODE_STRING_SIMPLE( 5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "This is a long string that is meant to cause reallocation of the internal buffer of CharString."), 5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode); 5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcpy(expected, "abcdef"); 5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcat(expected, longStr); 5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (0 != strcmp(expected, chStr.data()) || (int32_t)strlen(expected) != chStr.length()) { 5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("CharString.appendInvariantChars(longStr) failed."); 5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t appendCapacity = 0; 5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char *buffer = chStr.getAppendBuffer(5, 10, appendCapacity, errorCode); 5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (errorCode.isFailure()) { 5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org memcpy(buffer, "*****", 5); 5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org chStr.append(buffer, 5, errorCode); 5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org chStr.truncate(chStr.length()-3); 5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strcat(expected, "**"); 5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (0 != strcmp(expected, chStr.data()) || (int32_t)strlen(expected) != chStr.length()) { 5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("CharString.getAppendBuffer().append(**) failed."); 5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 525