16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org**********************************************************************
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Copyright (C) 2002-2011, International Business Machines
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Corporation and others.  All Rights Reserved.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org**********************************************************************
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   file name:  iotest.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: 2002feb21
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   created by: George Rhoten
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustream.h"
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ucnv.h"
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustring.h"
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ustr_cnv.h"
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "iotest.h"
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_IOSTREAM_SOURCE >= 199711
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if defined(__GNUC__) && __GNUC__ >= 4
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define USE_SSTREAM 1
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <sstream>
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// <strstream> is deprecated on some platforms, and the compiler complains very loudly if you use it.
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <strstream>
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <fstream>
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <iomanip>
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgusing namespace std;
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <string.h>
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CDECL_BEGIN
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_PLATFORM_USES_ONLY_WIN32_API
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst UChar NEW_LINE[] = {0x0d,0x0a,0};
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst char C_NEW_LINE[] = {0x0d,0x0a,0};
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UTF8_NEW_LINE "\x0d\x0a"
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst UChar NEW_LINE[] = {0x0a,0};
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst char C_NEW_LINE[] = {'\n',0};
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UTF8_NEW_LINE "\x0a"
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CDECL_END
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CDECL_BEGIN
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void U_CALLCONV TestStream(void)
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar thisMu[] = { 0x74, 0x48, 0x69, 0x73, 0x3BC, 0};
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar mu[] = { 0x6D, 0x75, 0};
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString str1 = UNICODE_STRING_SIMPLE("str1");
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString str2 = UNICODE_STRING_SIMPLE(" <<");
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString str3 = UNICODE_STRING_SIMPLE("2");
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString str4 = UNICODE_STRING_SIMPLE(" UTF-8 ");
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString inStr = UNICODE_STRING_SIMPLE(" UTF-8 ");
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString inStr2;
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char defConvName[UCNV_MAX_CONVERTER_NAME_LENGTH*2];
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char inStrC[128];
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UConverter *defConv;
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    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";
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    str4.append((UChar32)0x03BC);   /* mu */
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    str4.append((UChar32)0x10001);
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    str4.append((UChar32)0x10002);
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* release the default converter and use utf-8 for a bit */
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    defConv = u_getDefaultConverter(&status);
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Can't get default converter\n");
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucnv_close(defConv);
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strncpy(defConvName, ucnv_getDefaultName(), sizeof(defConvName)/sizeof(defConvName[0]));
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucnv_setDefaultName("UTF-8");
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const char * const TESTSTRING = "\x20\x74\x48\x69\x73\xCE\xBC\xE2\x80\x82\x20\x6D\x75\x20\x77\x6F\x72\x6C\x64";
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef USE_SSTREAM
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ostringstream outTestStream;
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    istringstream inTestStream(TESTSTRING);
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char testStreamBuf[512];
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ostrstream outTestStream(testStreamBuf, sizeof(testStreamBuf));
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    istrstream inTestStream(TESTSTRING, 0);
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* initialize testStreamBuf */
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(testStreamBuf, '*', sizeof(testStreamBuf));
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testStreamBuf[sizeof(testStreamBuf)-1] = 0;
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    outTestStream << "\x42\x65\x67\x69\x6E\x6E\x69\x6E\x67\x20\x6F\x66\x20\x74\x65\x73\x74\x20";
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    outTestStream << str1 << "\x20\x20" << str2 << str3 << "\x31\x20" << UTF8_NEW_LINE << str4 << ends;
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef USE_SSTREAM
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    string tempStr = outTestStream.str();
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *testStreamBuf = tempStr.c_str();
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (strcmp(testStreamBuf, testStr) != 0) {
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Got: \"%s\", Expected: \"%s\"\n", testStreamBuf, testStr);
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    inTestStream >> inStr >> inStr2;
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (inStr.compare(thisMu) != 0) {
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_austrncpy(inStrC, inStr.getBuffer(), inStr.length());
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        inStrC[inStr.length()] = 0;
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Got: \"%s\", Expected: \"tHis\\u03BC\"\n", inStrC);
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (inStr2.compare(mu) != 0) {
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_austrncpy(inStrC, inStr.getBuffer(), inStr.length());
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        inStrC[inStr.length()] = 0;
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Got: \"%s\", Expected: \"mu\"\n", inStrC);
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* return the default converter to the original state. */
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucnv_setDefaultName(defConvName);
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    defConv = u_getDefaultConverter(&status);
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Can't get default converter");
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Test formatting when using '<<' and UnicodeString */
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef USE_SSTREAM
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ostringstream outFormatStream;
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char testFormatStreamBuf[512];
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(testFormatStreamBuf, 0, sizeof(testFormatStreamBuf));
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ostrstream outFormatStream(testFormatStreamBuf, sizeof(testFormatStreamBuf));
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString ustr("string");
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    outFormatStream << "1234567890" << setw(10) << left << ustr << " " << "0123456789";
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef USE_SSTREAM
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    tempStr = outFormatStream.str();
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *testFormatStreamBuf = tempStr.c_str();
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *format_test_expected = "1234567890string     0123456789";
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (strcmp(format_test_expected, testFormatStreamBuf) != 0) {
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("UnicodeString format test using << operator Got: '%s' Expected: '%s'\n", testFormatStreamBuf, format_test_expected);
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Test large buffer (size > 200) when using '<<' and UnicodeString */
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef USE_SSTREAM
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ostringstream outLargeStream;
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char testLargeStreamBuf[512];
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memset(testLargeStreamBuf, 0, sizeof(testLargeStreamBuf));
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ostrstream outLargeStream(testLargeStreamBuf, sizeof(testLargeStreamBuf));
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar large_array[200];
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t large_array_length = sizeof(large_array)/sizeof(UChar);
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (int32_t i = 0; i < large_array_length; i++) {
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        large_array[i] = 0x41;
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString large_array_unistr(large_array, large_array_length);
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    outLargeStream << large_array_unistr;
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef USE_SSTREAM
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    string tmpString = outLargeStream.str();
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *testLargeStreamBuf = tmpString.c_str();
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char expectedLargeStreamBuf[300];
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t expectedBufLength = sizeof(expectedLargeStreamBuf);
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucnv_fromUChars(defConv, expectedLargeStreamBuf, expectedBufLength, large_array, large_array_length, &status);
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(status)) {
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (strcmp(testLargeStreamBuf, expectedLargeStreamBuf) != 0) {
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Large UnicodeString operator << output incorrect.\n");
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error converting string for large stream buffer testing.\n");
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucnv_close(defConv);
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define IOSTREAM_GOOD_SHIFT 3
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define IOSTREAM_GOOD (1<<IOSTREAM_GOOD_SHIFT)
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define IOSTREAM_BAD_SHIFT 2
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define IOSTREAM_BAD (1<<IOSTREAM_BAD_SHIFT)
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define IOSTREAM_EOF_SHIFT 1
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define IOSTREAM_EOF (1<<IOSTREAM_EOF_SHIFT)
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define IOSTREAM_FAIL_SHIFT 0
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define IOSTREAM_FAIL (1<<IOSTREAM_FAIL_SHIFT)
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t getBitStatus(const iostream&  stream) {
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (stream.good()<<IOSTREAM_GOOD_SHIFT)
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        | (stream.bad()<<IOSTREAM_BAD_SHIFT)
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        | (stream.eof()<<IOSTREAM_EOF_SHIFT)
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        | (stream.fail()<<IOSTREAM_FAIL_SHIFT);
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprintBits(const iostream&  stream)
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t status = getBitStatus(stream);
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("status 0x%02X (", status);
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (status & IOSTREAM_GOOD) {
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("good");
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (status & IOSTREAM_BAD) {
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("bad");
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (status & IOSTREAM_EOF) {
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("eof");
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (status & IOSTREAM_FAIL) {
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("fail");
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose(")\n");
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtestString(
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UnicodeString&  str,
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            const char*     testString,
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            const UChar*    expectedString,
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t         expectedStatus)
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef USE_SSTREAM
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    stringstream sstrm;
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strstream sstrm;
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sstrm << testString;
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*log_verbose("iostream before operator::>>() call \"%s\" ", testString);
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printBits(sstrm);*/
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sstrm >> str;
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("iostream after operator::>>() call \"%s\" ", testString);
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printBits(sstrm);
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (getBitStatus(sstrm) != expectedStatus) {
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        printBits(sstrm);
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Expected status %d, Got %d. See verbose output for details\n", expectedStatus, getBitStatus(sstrm));
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (str != UnicodeString(expectedString)) {
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Did not get expected results from \"%s\", expected \"%s\"\n", testString, expectedString);
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void U_CALLCONV TestStreamEOF(void)
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString dest;
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fstream fs(STANDARD_TEST_FILE, fstream::in | fstream::out | fstream::trunc);
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef USE_SSTREAM
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    stringstream ss;
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    strstream ss;
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fs << "EXAMPLE";
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fs.seekg(0);
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ss << "EXAMPLE";
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!(fs >> dest)) {
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Reading of file did not return expected status result\n");
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (dest != "EXAMPLE") {
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Reading of file did not return expected string\n");
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!(ss >> dest)) {
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Reading of string did not return expected status result\n");
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (dest != "EXAMPLE") {
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Reading of string did not return expected string\n");
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fs.close();
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing operator >> for UnicodeString...\n");
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* The test cases needs to be converted to the default codepage.  However, the stream operator needs char* so U_STRING_* is called. */
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_DECL(testCase1, "", 0);
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_INIT(testCase1, "", 0);
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_DECL(testCase2, "foo", 3);
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_INIT(testCase2, "foo", 3);
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_DECL(testCase3, "   ", 3);
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_INIT(testCase3, "   ", 3);
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_DECL(testCase4, "   bar", 6);
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_INIT(testCase4, "   bar", 6);
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_DECL(testCase5, "bar   ", 6);
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_INIT(testCase5, "bar   ", 6);
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_DECL(testCase6, "   bar   ", 9);
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_INIT(testCase6, "   bar   ", 9);
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_DECL(expectedResultA, "", 0);
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_INIT(expectedResultA, "", 0);
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_DECL(expectedResultB, "foo", 3);
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_INIT(expectedResultB, "foo", 3);
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_DECL(expectedResultC, "unchanged", 9);
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_INIT(expectedResultC, "unchanged", 9);
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_DECL(expectedResultD, "bar", 3);
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    U_STRING_INIT(expectedResultD, "bar", 3);
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString UStr;
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString expectedResults;
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char testcase[10];
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testString(UStr, u_austrcpy(testcase, testCase1), expectedResultA, IOSTREAM_EOF|IOSTREAM_FAIL);
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testString(UStr, u_austrcpy(testcase, testCase2), expectedResultB, IOSTREAM_EOF);
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UStr = UnicodeString(expectedResultC);
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testString(UStr, u_austrcpy(testcase, testCase3), expectedResultC, IOSTREAM_EOF|IOSTREAM_FAIL);
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testString(UStr, u_austrcpy(testcase, testCase4), expectedResultD, IOSTREAM_EOF);
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testString(UStr, u_austrcpy(testcase, testCase5), expectedResultD, IOSTREAM_GOOD);
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testString(UStr, u_austrcpy(testcase, testCase6), expectedResultD, IOSTREAM_GOOD);
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CDECL_END
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CFUNC void addStreamTests(TestNode** root) {
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestStream, "stream/TestStream");
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestStreamEOF, "stream/TestStreamEOF");
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
323