1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru********************************************************************** 383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius* Copyright (C) 2002-2011, International Business Machines 4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Corporation and others. All Rights Reserved. 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru********************************************************************** 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* file name: iotest.cpp 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* encoding: US-ASCII 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* tab size: 8 (not used) 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* indentation:4 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* created on: 2002feb21 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* created by: George Rhoten 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustream.h" 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucnv.h" 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h" 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ustr_cnv.h" 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "iotest.h" 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if U_IOSTREAM_SOURCE >= 199711 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if defined(__GNUC__) && __GNUC__ >= 4 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define USE_SSTREAM 1 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <sstream> 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// <strstream> is deprecated on some platforms, and the compiler complains very loudly if you use it. 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <strstream> 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <fstream> 3250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include <iomanip> 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruusing namespace std; 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <string.h> 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_BEGIN 3883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#if U_PLATFORM_USES_ONLY_WIN32_API 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst UChar NEW_LINE[] = {0x0d,0x0a,0}; 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char C_NEW_LINE[] = {0x0d,0x0a,0}; 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define UTF8_NEW_LINE "\x0d\x0a" 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst UChar NEW_LINE[] = {0x0a,0}; 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char C_NEW_LINE[] = {'\n',0}; 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define UTF8_NEW_LINE "\x0a" 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_END 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_BEGIN 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void U_CALLCONV TestStream(void) 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar thisMu[] = { 0x74, 0x48, 0x69, 0x73, 0x3BC, 0}; 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar mu[] = { 0x6D, 0x75, 0}; 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString str1 = UNICODE_STRING_SIMPLE("str1"); 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString str2 = UNICODE_STRING_SIMPLE(" <<"); 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString str3 = UNICODE_STRING_SIMPLE("2"); 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString str4 = UNICODE_STRING_SIMPLE(" UTF-8 "); 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString inStr = UNICODE_STRING_SIMPLE(" UTF-8 "); 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString inStr2; 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char defConvName[UCNV_MAX_CONVERTER_NAME_LENGTH*2]; 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char inStrC[128]; 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UConverter *defConv; 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char testStr[] = "\x42\x65\x67\x69\x6E\x6E\x69\x6E\x67\x20\x6F\x66\x20\x74\x65\x73\x74\x20\x73\x74\x72\x31\x20\x20\x20\x3C\x3C\x32\x31\x20" UTF8_NEW_LINE "\x20\x55\x54\x46\x2D\x38\x20\xCE\xBC\xF0\x90\x80\x81\xF0\x90\x80\x82"; 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru str4.append((UChar32)0x03BC); /* mu */ 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru str4.append((UChar32)0x10001); 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru str4.append((UChar32)0x10002); 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* release the default converter and use utf-8 for a bit */ 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru defConv = u_getDefaultConverter(&status); 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Can't get default converter\n"); 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucnv_close(defConv); 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strncpy(defConvName, ucnv_getDefaultName(), sizeof(defConvName)/sizeof(defConvName[0])); 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucnv_setDefaultName("UTF-8"); 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char * const TESTSTRING = "\x20\x74\x48\x69\x73\xCE\xBC\xE2\x80\x82\x20\x6D\x75\x20\x77\x6F\x72\x6C\x64"; 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef USE_SSTREAM 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ostringstream outTestStream; 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru istringstream inTestStream(TESTSTRING); 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char testStreamBuf[512]; 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ostrstream outTestStream(testStreamBuf, sizeof(testStreamBuf)); 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru istrstream inTestStream(TESTSTRING, 0); 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* initialize testStreamBuf */ 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru memset(testStreamBuf, '*', sizeof(testStreamBuf)); 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testStreamBuf[sizeof(testStreamBuf)-1] = 0; 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru outTestStream << "\x42\x65\x67\x69\x6E\x6E\x69\x6E\x67\x20\x6F\x66\x20\x74\x65\x73\x74\x20"; 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru outTestStream << str1 << "\x20\x20" << str2 << str3 << "\x31\x20" << UTF8_NEW_LINE << str4 << ends; 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef USE_SSTREAM 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru string tempStr = outTestStream.str(); 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *testStreamBuf = tempStr.c_str(); 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (strcmp(testStreamBuf, testStr) != 0) { 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Got: \"%s\", Expected: \"%s\"\n", testStreamBuf, testStr); 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru inTestStream >> inStr >> inStr2; 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (inStr.compare(thisMu) != 0) { 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrncpy(inStrC, inStr.getBuffer(), inStr.length()); 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru inStrC[inStr.length()] = 0; 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Got: \"%s\", Expected: \"tHis\\u03BC\"\n", inStrC); 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (inStr2.compare(mu) != 0) { 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrncpy(inStrC, inStr.getBuffer(), inStr.length()); 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru inStrC[inStr.length()] = 0; 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Got: \"%s\", Expected: \"mu\"\n", inStrC); 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* return the default converter to the original state. */ 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucnv_setDefaultName(defConvName); 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru defConv = u_getDefaultConverter(&status); 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Can't get default converter"); 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 12350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 12450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* Test formatting when using '<<' and UnicodeString */ 12550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#ifdef USE_SSTREAM 12650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ostringstream outFormatStream; 12750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#else 12850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho char testFormatStreamBuf[512]; 12950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(testFormatStreamBuf, 0, sizeof(testFormatStreamBuf)); 13050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ostrstream outFormatStream(testFormatStreamBuf, sizeof(testFormatStreamBuf)); 13150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 13250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString ustr("string"); 13350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 13450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho outFormatStream << "1234567890" << setw(10) << left << ustr << " " << "0123456789"; 13550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 13650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#ifdef USE_SSTREAM 13727f654740f2a26ad62a5c155af9199af9e69b889claireho tempStr = outFormatStream.str(); 13827f654740f2a26ad62a5c155af9199af9e69b889claireho const char *testFormatStreamBuf = tempStr.c_str(); 13950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 14050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char *format_test_expected = "1234567890string 0123456789"; 14150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (strcmp(format_test_expected, testFormatStreamBuf) != 0) { 14250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("UnicodeString format test using << operator Got: '%s' Expected: '%s'\n", testFormatStreamBuf, format_test_expected); 14350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 14450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 14550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* Test large buffer (size > 200) when using '<<' and UnicodeString */ 14650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#ifdef USE_SSTREAM 14750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ostringstream outLargeStream; 14850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#else 14950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho char testLargeStreamBuf[512]; 15050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(testLargeStreamBuf, 0, sizeof(testLargeStreamBuf)); 15150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ostrstream outLargeStream(testLargeStreamBuf, sizeof(testLargeStreamBuf)); 15250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 15350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar large_array[200]; 15450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t large_array_length = sizeof(large_array)/sizeof(UChar); 15550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho for (int32_t i = 0; i < large_array_length; i++) { 15650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho large_array[i] = 0x41; 15750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 15850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString large_array_unistr(large_array, large_array_length); 15950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 16050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho outLargeStream << large_array_unistr; 16150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 16250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#ifdef USE_SSTREAM 16350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho string tmpString = outLargeStream.str(); 16450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char *testLargeStreamBuf = tmpString.c_str(); 16550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 16650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho char expectedLargeStreamBuf[300]; 16750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t expectedBufLength = sizeof(expectedLargeStreamBuf); 16850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 16950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ucnv_fromUChars(defConv, expectedLargeStreamBuf, expectedBufLength, large_array, large_array_length, &status); 17050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (U_SUCCESS(status)) { 17150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (strcmp(testLargeStreamBuf, expectedLargeStreamBuf) != 0) { 17250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("Large UnicodeString operator << output incorrect.\n"); 17350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 17450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 17550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("Error converting string for large stream buffer testing.\n"); 17650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucnv_close(defConv); 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define IOSTREAM_GOOD_SHIFT 3 181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define IOSTREAM_GOOD (1<<IOSTREAM_GOOD_SHIFT) 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define IOSTREAM_BAD_SHIFT 2 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define IOSTREAM_BAD (1<<IOSTREAM_BAD_SHIFT) 184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define IOSTREAM_EOF_SHIFT 1 185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define IOSTREAM_EOF (1<<IOSTREAM_EOF_SHIFT) 186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define IOSTREAM_FAIL_SHIFT 0 187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define IOSTREAM_FAIL (1<<IOSTREAM_FAIL_SHIFT) 188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t getBitStatus(const iostream& stream) { 190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (stream.good()<<IOSTREAM_GOOD_SHIFT) 191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru | (stream.bad()<<IOSTREAM_BAD_SHIFT) 192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru | (stream.eof()<<IOSTREAM_EOF_SHIFT) 193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru | (stream.fail()<<IOSTREAM_FAIL_SHIFT); 194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruprintBits(const iostream& stream) 198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t status = getBitStatus(stream); 200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("status 0x%02X (", status); 201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (status & IOSTREAM_GOOD) { 202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("good"); 203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (status & IOSTREAM_BAD) { 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("bad"); 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (status & IOSTREAM_EOF) { 208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("eof"); 209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (status & IOSTREAM_FAIL) { 211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("fail"); 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose(")\n"); 214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerutestString( 218b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UnicodeString& str, 219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* testString, 220b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UChar* expectedString, 221b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t expectedStatus) 222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef USE_SSTREAM 224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru stringstream sstrm; 225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strstream sstrm; 227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sstrm << testString; 230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*log_verbose("iostream before operator::>>() call \"%s\" ", testString); 232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printBits(sstrm);*/ 233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sstrm >> str; 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("iostream after operator::>>() call \"%s\" ", testString); 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printBits(sstrm); 238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (getBitStatus(sstrm) != expectedStatus) { 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printBits(sstrm); 241b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru log_err("Expected status %d, Got %d. See verbose output for details\n", expectedStatus, getBitStatus(sstrm)); 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (str != UnicodeString(expectedString)) { 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Did not get expected results from \"%s\", expected \"%s\"\n", testString, expectedString); 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 248b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void U_CALLCONV TestStreamEOF(void) 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString dest; 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fstream fs(STANDARD_TEST_FILE, fstream::in | fstream::out | fstream::trunc); 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef USE_SSTREAM 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru stringstream ss; 255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru strstream ss; 257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fs << "EXAMPLE"; 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fs.seekg(0); 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ss << "EXAMPLE"; 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!(fs >> dest)) { 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Reading of file did not return expected status result\n"); 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (dest != "EXAMPLE") { 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Reading of file did not return expected string\n"); 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!(ss >> dest)) { 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Reading of string did not return expected status result\n"); 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (dest != "EXAMPLE") { 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Reading of string did not return expected string\n"); 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fs.close(); 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_verbose("Testing operator >> for UnicodeString...\n"); 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 280b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* The test cases needs to be converted to the default codepage. However, the stream operator needs char* so U_STRING_* is called. */ 281b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru U_STRING_DECL(testCase1, "", 0); 282b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru U_STRING_INIT(testCase1, "", 0); 283b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru U_STRING_DECL(testCase2, "foo", 3); 284b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru U_STRING_INIT(testCase2, "foo", 3); 285b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru U_STRING_DECL(testCase3, " ", 3); 286b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru U_STRING_INIT(testCase3, " ", 3); 287b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru U_STRING_DECL(testCase4, " bar", 6); 288b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru U_STRING_INIT(testCase4, " bar", 6); 289b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru U_STRING_DECL(testCase5, "bar ", 6); 290b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru U_STRING_INIT(testCase5, "bar ", 6); 291b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru U_STRING_DECL(testCase6, " bar ", 9); 292b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru U_STRING_INIT(testCase6, " bar ", 9); 293b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 294b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 295b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru U_STRING_DECL(expectedResultA, "", 0); 296b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru U_STRING_INIT(expectedResultA, "", 0); 297b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru U_STRING_DECL(expectedResultB, "foo", 3); 298b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru U_STRING_INIT(expectedResultB, "foo", 3); 299b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru U_STRING_DECL(expectedResultC, "unchanged", 9); 300b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru U_STRING_INIT(expectedResultC, "unchanged", 9); 301b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru U_STRING_DECL(expectedResultD, "bar", 3); 302b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru U_STRING_INIT(expectedResultD, "bar", 3); 303b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 304b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString UStr; 306b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UnicodeString expectedResults; 307b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru char testcase[10]; 308b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru testString(UStr, u_austrcpy(testcase, testCase1), expectedResultA, IOSTREAM_EOF|IOSTREAM_FAIL); 309b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru testString(UStr, u_austrcpy(testcase, testCase2), expectedResultB, IOSTREAM_EOF); 310b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UStr = UnicodeString(expectedResultC); 311b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru testString(UStr, u_austrcpy(testcase, testCase3), expectedResultC, IOSTREAM_EOF|IOSTREAM_FAIL); 312b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru testString(UStr, u_austrcpy(testcase, testCase4), expectedResultD, IOSTREAM_EOF); 313b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru testString(UStr, u_austrcpy(testcase, testCase5), expectedResultD, IOSTREAM_GOOD); 314b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru testString(UStr, u_austrcpy(testcase, testCase6), expectedResultD, IOSTREAM_GOOD); 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_END 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CFUNC void addStreamTests(TestNode** root) { 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestStream, "stream/TestStream"); 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestStreamEOF, "stream/TestStreamEOF"); 321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 322b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#endif 323