/**************************************************************************** ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage ** This file contains pre-release code and may not be distributed. ** You may use this file in accordance with the terms and conditions ** contained in the Technology Preview License Agreement accompanying ** this package. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** ** ** ** ** ** ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include Q_DECLARE_METATYPE(Q3CString) //TESTED_CLASS= //TESTED_FILES= class tst_Q3TextStream : public QObject { Q_OBJECT public: tst_Q3TextStream(); virtual ~tst_Q3TextStream(); public slots: void init(); void cleanup(); private slots: void operator_shiftleft_data(); void operator_shiftleft(); void operator_shiftright_data(); void operator_shiftright(); void operator_shift_QChar_data(); void operator_shift_QChar(); void operator_shift_char_data(); void operator_shift_char(); void operator_shift_short_data(); void operator_shift_short(); void operator_shift_ushort_data(); void operator_shift_ushort(); void operator_shift_int_data(); void operator_shift_int(); void operator_shift_uint_data(); void operator_shift_uint(); void operator_shift_long_data(); void operator_shift_long(); void operator_shift_ulong_data(); void operator_shift_ulong(); void operator_shift_float_data(); void operator_shift_float(); void operator_shift_double_data(); void operator_shift_double(); void operator_shift_QString_data(); void operator_shift_QString(); void operator_shift_Q3CString_data(); void operator_shift_Q3CString(); void QTextCodecCodecForIndex() const; void atEnd(); void eof(); void precision(); void task28319(); private: void createWriteStream( Q3TextStream *&os ); void closeWriteStream( Q3TextStream *os ); void createReadStream( Q3TextStream *&is ); void closeReadStream( Q3TextStream *is ); void read_QChar( Q3TextStream *s ); void write_QChar( Q3TextStream *s ); void read_char( Q3TextStream *s ); void write_char( Q3TextStream *s ); void read_short( Q3TextStream *s ); void write_short( Q3TextStream *s ); void read_ushort( Q3TextStream *s ); void write_ushort( Q3TextStream *s ); void read_int( Q3TextStream *s ); void write_int( Q3TextStream *s ); void read_uint( Q3TextStream *s ); void write_uint( Q3TextStream *s ); void read_long( Q3TextStream *s ); void write_long( Q3TextStream *s ); void read_ulong( Q3TextStream *s ); void write_ulong( Q3TextStream *s ); void read_float( Q3TextStream *s ); void write_float( Q3TextStream *s ); void read_double( Q3TextStream *s ); void write_double( Q3TextStream *s ); void read_QString( Q3TextStream *s ); void write_QString( Q3TextStream *s ); void read_Q3CString( Q3TextStream *s ); void write_Q3CString( Q3TextStream *s ); void operatorShift_data(); void do_shiftleft( Q3TextStream *ts ); Q3TextStream::Encoding toEncoding( const QString& ); QString decodeString( QByteArray array, const QString& encoding ); Q3TextStream *os; Q3TextStream *is; Q3TextStream *ts; QFile *inFile; QFile *outFile; QByteArray *inArray; QBuffer *inBuffer; QString *inString; bool file_is_empty; }; tst_Q3TextStream::tst_Q3TextStream() { ts = 0; os = 0; is = 0; outFile = 0; inFile = 0; inArray = 0; inBuffer = 0; inString = 0; file_is_empty = FALSE; } tst_Q3TextStream::~tst_Q3TextStream() { } void tst_Q3TextStream::init() { ts = 0; os = 0; is = 0; inFile = 0; outFile = 0; inArray = 0; inBuffer = 0; inString = 0; file_is_empty = FALSE; } void tst_Q3TextStream::cleanup() { delete ts; ts = 0; delete os; os = 0; delete is; is = 0; delete inFile; inFile = 0; delete outFile; outFile = 0; delete inArray; inArray = 0; delete inBuffer; inBuffer = 0; delete inString; inString = 0; } void tst_Q3TextStream::operator_shiftright_data() { operatorShift_data(); } void tst_Q3TextStream::operator_shiftleft_data() { operatorShift_data(); } static const double doubleDummy = 567.89; static const int intDummy = 1234; static const QString stringDummy = "ABCD"; static const char * const devices[] = { "file", "bytearray", "buffer", "string", 0 }; static const char * const encodings[] = { "Locale", "Latin1", "Unicode", "UnicodeNetworkOrder", "UnicodeReverse", "RawUnicode", "UnicodeUTF8", 0 }; void tst_Q3TextStream::operatorShift_data() { QTest::addColumn( "device" ); QTest::addColumn( "encoding" ); QTest::addColumn( "type" ); QTest::addColumn( "doubleVal" ); QTest::addColumn( "intVal" ); QTest::addColumn( "stringVal" ); QTest::addColumn( "encoded" ); for ( int i=0; devices[i] != 0; i++ ) { QString dev = devices[i]; /* We first test each type at least once. */ QTest::newRow( dev + "0" ) << dev << QString("UnicodeUTF8") << QString("QChar") << doubleDummy << (int) 'Z' << stringDummy << QByteArray( Q3CString("Z") ); QTest::newRow( dev + "1" ) << dev << QString("UnicodeUTF8") << QString("char") << doubleDummy << (int) 'Z' << stringDummy << QByteArray( Q3CString("Z") ); QTest::newRow( dev + "2" ) << dev << QString("UnicodeUTF8") << QString("signed short") << doubleDummy << 12345 << stringDummy << QByteArray( Q3CString("12345") ); QTest::newRow( dev + "3" ) << dev << QString("UnicodeUTF8") << QString("unsigned short") << doubleDummy << 12345 << stringDummy << QByteArray( Q3CString("12345") ); QTest::newRow( dev + "4" ) << dev << QString("UnicodeUTF8") << QString("signed int") << doubleDummy << 12345 << stringDummy << QByteArray( Q3CString("12345") ); QTest::newRow( dev + "5" ) << dev << QString("UnicodeUTF8") << QString("unsigned int") << doubleDummy << 12345 << stringDummy << QByteArray( Q3CString("12345") ); QTest::newRow( dev + "6" ) << dev << QString("UnicodeUTF8") << QString("signed long") << doubleDummy << 12345 << stringDummy << QByteArray( Q3CString("12345") ); QTest::newRow( dev + "7" ) << dev << QString("UnicodeUTF8") << QString("unsigned long") << doubleDummy << 12345 << stringDummy << QByteArray( Q3CString("12345") ); QTest::newRow( dev + "8" ) << dev << QString("UnicodeUTF8") << QString("float") << (double)3.1415f << intDummy << stringDummy << QByteArray( Q3CString("3.1415") ); QTest::newRow( dev + "9" ) << dev << QString("UnicodeUTF8") << QString("double") << 3.1415 << intDummy << stringDummy << QByteArray( Q3CString("3.1415") ); QTest::newRow( dev + "10" ) << dev << QString("UnicodeUTF8") << QString("char *") << doubleDummy << intDummy << QString("I-am-a-string") << QByteArray( Q3CString("I-am-a-string") ); QTest::newRow( dev + "11" ) << dev << QString("UnicodeUTF8") << QString("QString") << doubleDummy << intDummy << QString("I-am-a-string") << QByteArray( Q3CString("I-am-a-string") ); QTest::newRow( dev + "12" ) << dev << QString("UnicodeUTF8") << QString("Q3CString") << doubleDummy << intDummy << QString("I-am-a-string") << QByteArray( Q3CString("I-am-a-string") ); /* Then we test some special cases that have caused problems in the past. */ QTest::newRow( dev + "20" ) << dev << QString("UnicodeUTF8") << QString("QChar") << doubleDummy << 0xff8c << stringDummy << QByteArray( Q3CString("\xef\xbe\x8c") ); QTest::newRow( dev + "21" ) << dev << QString("UnicodeUTF8") << QString("QChar") << doubleDummy << 0x8cff << stringDummy << QByteArray( Q3CString("\xe8\xb3\xbf") ); } } void tst_Q3TextStream::do_shiftleft( Q3TextStream *ts ) { QFETCH( QString, encoding ); QFETCH( QString, type ); QFETCH( double, doubleVal ); QFETCH( int, intVal ); QFETCH( QString, stringVal ); ts->setEncoding( toEncoding(encoding) ); if ( type == "QChar" ) { if ( intVal >= 0 && intVal <= 0xffff ) *ts << QChar( intVal ); } else if ( type == "char" ) { *ts << (char) intVal; } else if ( type == "signed short" ) { *ts << (signed short) intVal; } else if ( type == "unsigned short" ) { *ts << (unsigned short) intVal; } else if ( type == "signed int" ) { *ts << (signed int) intVal; } else if ( type == "unsigned int" ) { *ts << (unsigned int) intVal; } else if ( type == "signed long" ) { *ts << (signed long) intVal; } else if ( type == "unsigned long" ) { *ts << (unsigned long) intVal; } else if ( type == "float" ) { *ts << (float) doubleVal; } else if ( type == "double" ) { *ts << (double) doubleVal; } else if ( type == "char *" ) { *ts << stringVal.latin1(); } else if ( type == "QString" ) { *ts << stringVal; } else if ( type == "Q3CString" ) { *ts << Q3CString( stringVal.latin1() ); } else { qWarning( "Unknown type: %s" + type ); } } void tst_Q3TextStream::operator_shiftleft() { QFETCH( QString, device ); QFETCH( QString, encoding ); QFETCH( QByteArray, encoded ); if ( device == "file" ) { QFile outFile( "qtextstream.out" ); QVERIFY( outFile.open( IO_WriteOnly ) ); Q3TextStream ts( &outFile ); do_shiftleft( &ts ); outFile.close(); QFile inFile( "qtextstream.out" ); QVERIFY( inFile.open( IO_ReadOnly ) ); QCOMPARE( inFile.readAll(), encoded ); } else if ( device == "bytearray" ) { QByteArray outArray; Q3TextStream ts( outArray, IO_WriteOnly ); do_shiftleft( &ts ); QCOMPARE( outArray, encoded ); } else if ( device == "buffer" ) { QByteArray outArray; QBuffer outBuffer; outBuffer.setBuffer( &outArray ); QVERIFY( outBuffer.open(IO_WriteOnly) ); Q3TextStream ts( &outBuffer ); do_shiftleft( &ts ); QCOMPARE( outArray, encoded ); } else if ( device == "string" ) { QString outString; Q3TextStream ts( &outString, IO_WriteOnly ); do_shiftleft( &ts ); QString decodedString = decodeString( encoded, encoding ); QCOMPARE( outString, decodedString ); } else { qWarning( "Unknown device type: " + device ); } } void tst_Q3TextStream::operator_shiftright() { QFETCH( QString, device ); QFETCH( QString, encoding ); QFETCH( QString, type ); QFETCH( double, doubleVal ); QFETCH( int, intVal ); QFETCH( QString, stringVal ); QFETCH( QByteArray, encoded ); if ( device == "file" ) { QFile outFile( "qtextstream.out" ); QVERIFY( outFile.open( IO_WriteOnly ) ); QCOMPARE( (int) outFile.writeBlock(encoded), encoded.size() ); outFile.close(); inFile = new QFile( "qtextstream.out" ); QVERIFY( inFile->open( IO_ReadOnly ) ); ts = new Q3TextStream( inFile ); } else if ( device == "bytearray" ) { ts = new Q3TextStream( encoded, IO_ReadOnly ); } else if ( device == "buffer" ) { inBuffer = new QBuffer; inBuffer->setData( encoded ); QVERIFY( inBuffer->open(IO_ReadOnly) ); ts = new Q3TextStream( inBuffer ); } else if ( device == "string" ) { inString = new QString( decodeString(encoded, encoding) ); ts = new Q3TextStream( inString, IO_ReadOnly ); } else { qWarning( "Unknown device type: " + device ); } ts->setEncoding( toEncoding(encoding) ); if ( type == "QChar" ) { QChar c; if ( intVal >= 0 && intVal <= 0xffff ) *ts >> c; QCOMPARE( c, QChar(intVal) ); } else if ( type == "char" ) { char c; *ts >> c; QVERIFY( c == (char) intVal ); } else if ( type == "signed short" ) { signed short h; *ts >> h; QVERIFY( h == (signed short) intVal ); } else if ( type == "unsigned short" ) { unsigned short h; *ts >> h; QVERIFY( h == (unsigned short) intVal ); } else if ( type == "signed int" ) { signed int i; *ts >> i; QVERIFY( i == (signed int) intVal ); } else if ( type == "unsigned int" ) { unsigned int i; *ts >> i; QVERIFY( i == (unsigned int) intVal ); } else if ( type == "signed long" ) { signed long ell; *ts >> ell; QVERIFY( ell == (signed long) intVal ); } else if ( type == "unsigned long" ) { unsigned long ell; *ts >> ell; QVERIFY( ell == (unsigned long) intVal ); } else if ( type == "float" ) { float f; *ts >> f; QVERIFY( f == (float) doubleVal ); } else if ( type == "double" ) { double d; *ts >> d; QVERIFY( d == (double) doubleVal ); } else if ( type == "char *" ) { char *cp = new char[2048]; *ts >> cp; QVERIFY( qstrcmp(cp, stringVal.latin1()) == 0 ); delete[] cp; } else if ( type == "QString" ) { QString s; *ts >> s; QCOMPARE( s, stringVal ); } else if ( type == "Q3CString" ) { Q3CString s; *ts >> s; QCOMPARE( QString::fromLatin1(s), stringVal ); } else { qWarning( "Unknown type: %s" + type ); } } Q3TextStream::Encoding tst_Q3TextStream::toEncoding( const QString &str ) { if ( str == "Locale" ) return Q3TextStream::Locale; else if ( str == "Latin1" ) return Q3TextStream::Latin1; else if ( str == "Unicode" ) return Q3TextStream::Unicode; else if ( str == "UnicodeNetworkOrder" ) return Q3TextStream::UnicodeNetworkOrder; else if ( str == "UnicodeReverse" ) return Q3TextStream::UnicodeReverse; else if ( str == "RawUnicode" ) return Q3TextStream::RawUnicode; else if ( str == "UnicodeUTF8" ) return Q3TextStream::UnicodeUTF8; qWarning( "No such encoding " + str ); return Q3TextStream::Latin1; } QString tst_Q3TextStream::decodeString( QByteArray array, const QString& encoding ) { switch ( toEncoding(encoding) ) { case Q3TextStream::Locale: return QString::fromLocal8Bit( array.data(), array.size() ); case Q3TextStream::Latin1: return QString::fromLatin1( array.data(), array.size() ); case Q3TextStream::Unicode: case Q3TextStream::UnicodeNetworkOrder: case Q3TextStream::UnicodeReverse: case Q3TextStream::RawUnicode: qWarning( "Unicode not implemented ###" ); return QString(); case Q3TextStream::UnicodeUTF8: return QString::fromUtf8( array.data(), array.size() ); default: return QString(); } } // ************************************************ void tst_Q3TextStream::createWriteStream( Q3TextStream *&os ) { QFETCH( QString, device ); if ( device == "file" ) { outFile = new QFile( "qtextstream.out" ); QVERIFY( outFile->open( IO_WriteOnly ) ); os = new Q3TextStream( outFile ); } else if ( device == "bytearray" ) { inArray = new QByteArray; os = new Q3TextStream( *inArray, IO_WriteOnly ); } else if ( device == "buffer" ) { inBuffer = new QBuffer; QVERIFY( inBuffer->open(IO_WriteOnly) ); os = new Q3TextStream( inBuffer ); } else if ( device == "string" ) { inString = new QString; os = new Q3TextStream( inString, IO_WriteOnly ); } else { qWarning( "Error creating write stream: Unknown device type '" + device + "'" ); } QFETCH( QString, encoding ); os->setEncoding( toEncoding( encoding )); } void tst_Q3TextStream::closeWriteStream( Q3TextStream *os ) { QFETCH( QString, device ); if ( os->device() ) os->device()->close(); } void tst_Q3TextStream::createReadStream( Q3TextStream *&is ) { QFETCH( QString, device ); if ( device == "file" ) { inFile = new QFile( "qtextstream.out" ); QVERIFY( inFile->open( IO_ReadOnly ) ); is = new Q3TextStream( inFile ); } else if ( device == "bytearray" ) { is = new Q3TextStream( *inArray, IO_ReadOnly ); } else if ( device == "buffer" ) { QVERIFY( inBuffer->open(IO_ReadOnly) ); is = new Q3TextStream( inBuffer ); } else if ( device == "string" ) { is = new Q3TextStream( inString, IO_ReadOnly ); } else { qWarning( "Error creating read stream: Unknown device type '" + device + "'" ); } QFETCH( QString, encoding ); is->setEncoding( toEncoding( encoding )); if (!file_is_empty) { QVERIFY( !is->atEnd() ); QVERIFY( !is->eof() ); } } void tst_Q3TextStream::closeReadStream( Q3TextStream *is ) { QVERIFY( is->atEnd() ); QVERIFY( is->eof() ); if ( is->device() ) is->device()->close(); } void tst_Q3TextStream::precision() { } void tst_Q3TextStream::atEnd() { // atEnd is actually tested in all the operator_shift*functions // but it's sufficient to mention one here. } void tst_Q3TextStream::eof() { // eof is obsolete, but as long as it's supported it should work. // eof is actually tested in all the operator_shift*functions // but it's sufficient to mention one here. } // **************** QChar **************** void tst_Q3TextStream::operator_shift_QChar_data() { QTest::addColumn( "device" ); QTest::addColumn( "encoding" ); QTest::addColumn( "qchar" ); for ( int d=0; devices[d] != 0; d++ ) { QString device = devices[d]; for ( int e=0; encodings[e] != 0; e++ ) { QString encoding = encodings[e]; QString tag = device + "_" + encoding + "_"; QTest::newRow( tag + "0" ) << device << encoding << QChar( 'A' ).unicode(); QTest::newRow( tag + "1" ) << device << encoding << QChar( 'B' ).unicode(); QTest::newRow( tag + "2" ) << device << encoding << QChar( 'Z' ).unicode(); QTest::newRow( tag + "3" ) << device << encoding << QChar( 'z' ).unicode(); QTest::newRow( tag + "4" ) << device << encoding << QChar( '@' ).unicode(); } } } void tst_Q3TextStream::operator_shift_QChar() { // Uncomment the qDebug and you'll see all the combinations we actually run :-)) // qDebug( data()->dataTag() ); createWriteStream( os ); write_QChar( os ); closeWriteStream( os ); createReadStream( is ); read_QChar( is ); closeReadStream( is ); } void tst_Q3TextStream::read_QChar( Q3TextStream *s ) { QFETCH( ushort, qchar ); QChar expected( qchar ); QChar actual; *s >> actual; QVERIFY( actual == expected ); } void tst_Q3TextStream::write_QChar( Q3TextStream *s ) { QFETCH( ushort, qchar ); QChar actual( qchar ); *s << actual; } // **************** char **************** void tst_Q3TextStream::operator_shift_char_data() { QTest::addColumn( "device" ); QTest::addColumn( "encoding" ); QTest::addColumn( "ch" ); for ( int d=0; devices[d] != 0; d++ ) { QString device = devices[d]; for ( int e=0; encodings[e] != 0; e++ ) { QString encoding = encodings[e]; QString tag = device + "_" + encoding + "_"; QTest::newRow( tag + "0" ) << device << encoding << int('A'); QTest::newRow( tag + "1" ) << device << encoding << int('B'); QTest::newRow( tag + "2" ) << device << encoding << int('Z'); QTest::newRow( tag + "3" ) << device << encoding << int(14); QTest::newRow( tag + "4" ) << device << encoding << int('0'); } } } void tst_Q3TextStream::operator_shift_char() { createWriteStream( os ); write_char( os ); closeWriteStream( os ); createReadStream( is ); read_char( is ); closeReadStream( is ); } void tst_Q3TextStream::read_char( Q3TextStream *s ) { QFETCH( int, ch ); char c(ch); char exp; *s >> exp; QCOMPARE( exp, c ); } void tst_Q3TextStream::write_char( Q3TextStream *s ) { QFETCH( int, ch ); char c(ch); *s << c; } // **************** short **************** void tst_Q3TextStream::operator_shift_short_data() { QTest::addColumn( "device" ); QTest::addColumn( "encoding" ); QTest::addColumn( "ss" ); for ( int d=0; devices[d] != 0; d++ ) { QString device = devices[d]; for ( int e=0; encodings[e] != 0; e++ ) { QString encoding = encodings[e]; QString tag = device + "_" + encoding + "_"; QTest::newRow( tag + "0" ) << device << encoding << short(0); QTest::newRow( tag + "1" ) << device << encoding << short(-1); QTest::newRow( tag + "2" ) << device << encoding << short(1); QTest::newRow( tag + "3" ) << device << encoding << short(255); QTest::newRow( tag + "4" ) << device << encoding << short(-254); } } } void tst_Q3TextStream::operator_shift_short() { createWriteStream( os ); write_short( os ); closeWriteStream( os ); createReadStream( is ); read_short( is ); closeReadStream( is ); } void tst_Q3TextStream::read_short( Q3TextStream *s ) { QFETCH( short, ss ); short exp; QString A, B; *s >> A >> exp >> B; QCOMPARE( A, QString("A") ); QCOMPARE( B, QString("B") ); QCOMPARE( exp, ss ); s->skipWhiteSpace(); } void tst_Q3TextStream::write_short( Q3TextStream *s ) { QFETCH( short, ss ); *s << " A " << ss << " B "; } // **************** ushort **************** void tst_Q3TextStream::operator_shift_ushort_data() { QTest::addColumn( "device" ); QTest::addColumn( "encoding" ); QTest::addColumn( "us" ); for ( int d=0; devices[d] != 0; d++ ) { QString device = devices[d]; for ( int e=0; encodings[e] != 0; e++ ) { QString encoding = encodings[e]; QString tag = device + "_" + encoding + "_"; QTest::newRow( tag + "0" ) << device << encoding << ushort(0); QTest::newRow( tag + "1" ) << device << encoding << ushort(1); QTest::newRow( tag + "2" ) << device << encoding << ushort(10); QTest::newRow( tag + "3" ) << device << encoding << ushort(255); QTest::newRow( tag + "4" ) << device << encoding << ushort(512); } } } void tst_Q3TextStream::operator_shift_ushort() { createWriteStream( os ); write_ushort( os ); closeWriteStream( os ); createReadStream( is ); read_ushort( is ); closeReadStream( is ); } void tst_Q3TextStream::read_ushort( Q3TextStream *s ) { QFETCH( ushort, us ); ushort exp; QString A, B; *s >> A >> exp >> B; QCOMPARE( A, QString("A") ); QCOMPARE( B, QString("B") ); QCOMPARE( exp, us ); s->skipWhiteSpace(); } void tst_Q3TextStream::write_ushort( Q3TextStream *s ) { QFETCH( ushort, us ); *s << " A " << us << " B "; } // **************** int **************** void tst_Q3TextStream::operator_shift_int_data() { QTest::addColumn( "device" ); QTest::addColumn( "encoding" ); QTest::addColumn( "si" ); for ( int d=0; devices[d] != 0; d++ ) { QString device = devices[d]; for ( int e=0; encodings[e] != 0; e++ ) { QString encoding = encodings[e]; QString tag = device + "_" + encoding + "_"; QTest::newRow( tag + "0" ) << device << encoding << int(0); QTest::newRow( tag + "1" ) << device << encoding << int(1); QTest::newRow( tag + "2" ) << device << encoding << int(10); QTest::newRow( tag + "3" ) << device << encoding << int(255); QTest::newRow( tag + "4" ) << device << encoding << int(512); QTest::newRow( tag + "5" ) << device << encoding << int(-1); QTest::newRow( tag + "6" ) << device << encoding << int(-10); QTest::newRow( tag + "7" ) << device << encoding << int(-255); QTest::newRow( tag + "8" ) << device << encoding << int(-512); } } } void tst_Q3TextStream::operator_shift_int() { createWriteStream( os ); write_int( os ); closeWriteStream( os ); createReadStream( is ); read_int( is ); closeReadStream( is ); } void tst_Q3TextStream::read_int( Q3TextStream *s ) { QFETCH( int, si ); int exp; QString A, B; *s >> A >> exp >> B; QCOMPARE( A, QString("A") ); QCOMPARE( B, QString("B") ); QCOMPARE( exp, si ); s->skipWhiteSpace(); } void tst_Q3TextStream::write_int( Q3TextStream *s ) { QFETCH( int, si ); *s << " A " << si << " B "; } // **************** uint **************** void tst_Q3TextStream::operator_shift_uint_data() { QTest::addColumn( "device" ); QTest::addColumn( "encoding" ); QTest::addColumn( "ui" ); for ( int d=0; devices[d] != 0; d++ ) { QString device = devices[d]; for ( int e=0; encodings[e] != 0; e++ ) { QString encoding = encodings[e]; QString tag = device + "_" + encoding + "_"; QTest::newRow( tag + "0" ) << device << encoding << uint(0); QTest::newRow( tag + "1" ) << device << encoding << uint(1); QTest::newRow( tag + "2" ) << device << encoding << uint(10); QTest::newRow( tag + "3" ) << device << encoding << uint(255); QTest::newRow( tag + "4" ) << device << encoding << uint(512); } } } void tst_Q3TextStream::operator_shift_uint() { createWriteStream( os ); write_uint( os ); closeWriteStream( os ); createReadStream( is ); read_uint( is ); closeReadStream( is ); } void tst_Q3TextStream::read_uint( Q3TextStream *s ) { QFETCH( uint, ui ); uint exp; QString A, B; *s >> A >> exp >> B; QCOMPARE( A, QString("A") ); QCOMPARE( B, QString("B") ); QCOMPARE( exp, ui ); s->skipWhiteSpace(); } void tst_Q3TextStream::write_uint( Q3TextStream *s ) { QFETCH( uint, ui ); *s << " A " << ui << " B "; } // **************** long **************** void tst_Q3TextStream::operator_shift_long_data() { QTest::addColumn( "device" ); QTest::addColumn( "encoding" ); QTest::addColumn( "sl" ); for ( int d=0; devices[d] != 0; d++ ) { QString device = devices[d]; for ( int e=0; encodings[e] != 0; e++ ) { QString encoding = encodings[e]; QString tag = device + "_" + encoding + "_"; QTest::newRow( tag + "0" ) << device << encoding << long(0); QTest::newRow( tag + "1" ) << device << encoding << long(1); QTest::newRow( tag + "2" ) << device << encoding << long(10); QTest::newRow( tag + "3" ) << device << encoding << long(255); QTest::newRow( tag + "4" ) << device << encoding << long(65535); QTest::newRow( tag + "5" ) << device << encoding << long(-1); QTest::newRow( tag + "6" ) << device << encoding << long(-10); QTest::newRow( tag + "7" ) << device << encoding << long(-255); QTest::newRow( tag + "8" ) << device << encoding << long(-65534); } } } void tst_Q3TextStream::operator_shift_long() { createWriteStream( os ); write_long( os ); closeWriteStream( os ); createReadStream( is ); read_long( is ); closeReadStream( is ); } void tst_Q3TextStream::read_long( Q3TextStream *s ) { QFETCH( long, sl ); long exp; QString A, B; *s >> A >> exp >> B; QCOMPARE( A, QString("A") ); QCOMPARE( B, QString("B") ); QCOMPARE( exp, sl ); s->skipWhiteSpace(); } void tst_Q3TextStream::write_long( Q3TextStream *s ) { QFETCH( long, sl ); *s << " A " << sl << " B "; } // **************** long **************** void tst_Q3TextStream::operator_shift_ulong_data() { QTest::addColumn( "device" ); QTest::addColumn( "encoding" ); QTest::addColumn( "ul" ); for ( int d=0; devices[d] != 0; d++ ) { QString device = devices[d]; for ( int e=0; encodings[e] != 0; e++ ) { QString encoding = encodings[e]; QString tag = device + "_" + encoding + "_"; QTest::newRow( tag + "0" ) << device << encoding << ulong(0); QTest::newRow( tag + "1" ) << device << encoding << ulong(1); QTest::newRow( tag + "2" ) << device << encoding << ulong(10); QTest::newRow( tag + "3" ) << device << encoding << ulong(255); QTest::newRow( tag + "4" ) << device << encoding << ulong(65535); } } } void tst_Q3TextStream::operator_shift_ulong() { createWriteStream( os ); write_ulong( os ); closeWriteStream( os ); createReadStream( is ); read_ulong( is ); closeReadStream( is ); } void tst_Q3TextStream::read_ulong( Q3TextStream *s ) { QFETCH( ulong, ul ); ulong exp; QString A, B; *s >> A >> exp >> B; QCOMPARE( A, QString("A") ); QCOMPARE( B, QString("B") ); QCOMPARE( exp, ul ); s->skipWhiteSpace(); } void tst_Q3TextStream::write_ulong( Q3TextStream *s ) { QFETCH( ulong, ul ); *s << " A " << ul << " B "; } // **************** float **************** void tst_Q3TextStream::operator_shift_float_data() { QTest::addColumn( "device" ); QTest::addColumn( "encoding" ); QTest::addColumn( "f" ); for ( int d=0; devices[d] != 0; d++ ) { QString device = devices[d]; for ( int e=0; encodings[e] != 0; e++ ) { QString encoding = encodings[e]; QString tag = device + "_" + encoding + "_"; QTest::newRow( tag + "0" ) << device << encoding << float(0.0); QTest::newRow( tag + "1" ) << device << encoding << float(0.0001); QTest::newRow( tag + "2" ) << device << encoding << float(-0.0001); QTest::newRow( tag + "3" ) << device << encoding << float(3.45678); QTest::newRow( tag + "4" ) << device << encoding << float(-3.45678); } } } void tst_Q3TextStream::operator_shift_float() { createWriteStream( os ); write_float( os ); closeWriteStream( os ); createReadStream( is ); read_float( is ); closeReadStream( is ); } void tst_Q3TextStream::read_float( Q3TextStream *s ) { QFETCH( float, f ); float exp; QString A, B; *s >> A >> exp >> B; QCOMPARE( A, QString("A") ); QCOMPARE( B, QString("B") ); QCOMPARE( exp, f ); s->skipWhiteSpace(); } void tst_Q3TextStream::write_float( Q3TextStream *s ) { QFETCH( float, f ); *s << " A " << f << " B "; } // **************** double **************** void tst_Q3TextStream::operator_shift_double_data() { QTest::addColumn( "device" ); QTest::addColumn( "encoding" ); QTest::addColumn( "d" ); for ( int d=0; devices[d] != 0; d++ ) { QString device = devices[d]; for ( int e=0; encodings[e] != 0; e++ ) { QString encoding = encodings[e]; QString tag = device + "_" + encoding + "_"; QTest::newRow( tag + "0" ) << device << encoding << double(0.0); QTest::newRow( tag + "1" ) << device << encoding << double(0.0001); QTest::newRow( tag + "2" ) << device << encoding << double(-0.0001); QTest::newRow( tag + "3" ) << device << encoding << double(3.45678); QTest::newRow( tag + "4" ) << device << encoding << double(-3.45678); QTest::newRow( tag + "5" ) << device << encoding << double(1.23456789); QTest::newRow( tag + "6" ) << device << encoding << double(-1.23456789); } } } void tst_Q3TextStream::operator_shift_double() { createWriteStream( os ); os->precision( 10 ); write_double( os ); closeWriteStream( os ); createReadStream( is ); is->precision( 10 ); read_double( is ); closeReadStream( is ); } void tst_Q3TextStream::read_double( Q3TextStream *s ) { QFETCH( double, d ); double exp; QString A, B; *s >> A >> exp >> B; QCOMPARE( A, QString("A") ); QCOMPARE( B, QString("B") ); QCOMPARE( exp, d ); s->skipWhiteSpace(); } void tst_Q3TextStream::write_double( Q3TextStream *s ) { QFETCH( double, d ); *s << " A " << d << " B "; } // **************** QString **************** void tst_Q3TextStream::operator_shift_QString_data() { QTest::addColumn( "device" ); QTest::addColumn( "encoding" ); QTest::addColumn( "str" ); QTest::addColumn( "multi_str" ); QTest::addColumn( "zero_length" ); for ( int d=0; devices[d] != 0; d++ ) { QString device = devices[d]; for ( int e=0; encodings[e] != 0; e++ ) { QString encoding = encodings[e]; QString tag = device + "_" + encoding + "_"; QTest::newRow( tag + "0" ) << device << encoding << QString("") << bool(FALSE) << bool(TRUE); QTest::newRow( tag + "1" ) << device << encoding << QString() << bool(FALSE) << bool(TRUE); QTest::newRow( tag + "2" ) << device << encoding << QString("foo") << bool(FALSE) << bool(FALSE); QTest::newRow( tag + "3" ) << device << encoding << QString("foo\nbar") << bool(TRUE) << bool(FALSE); QTest::newRow( tag + "4" ) << device << encoding << QString("cjacka ckha cka ckah ckac kahckadhcbkgdk vkzdfbvajef vkahv") << bool(TRUE) << bool(FALSE); } } } void tst_Q3TextStream::operator_shift_QString() { QFETCH( bool, zero_length ); file_is_empty = zero_length; createWriteStream( os ); write_QString( os ); closeWriteStream( os ); createReadStream( is ); read_QString( is ); closeReadStream( is ); } void tst_Q3TextStream::read_QString( Q3TextStream *s ) { QString exp; QFETCH( QString, str ); if (str.isNull()) str = ""; QFETCH( bool, multi_str ); if (!multi_str) { *s >> exp; QCOMPARE( exp, str ); } else { QStringList l; l = QStringList::split( " ", str ); if (l.count() < 2) l = QStringList::split( "\n", str ); for (uint i=0; i> exp; QCOMPARE( exp, l[i] ); } } } void tst_Q3TextStream::write_QString( Q3TextStream *s ) { QFETCH( QString, str ); *s << str; } // **************** Q3CString **************** void tst_Q3TextStream::operator_shift_Q3CString_data() { QTest::addColumn( "device" ); QTest::addColumn( "encoding" ); QTest::addColumn( "cs" ); QTest::addColumn( "multi_str" ); QTest::addColumn( "zero_length" ); for ( int d=0; devices[d] != 0; d++ ) { QString device = devices[d]; for ( int e=0; encodings[e] != 0; e++ ) { QString encoding = encodings[e]; QString tag = device + "_" + encoding + "_"; QTest::newRow( tag + "0" ) << device << encoding << Q3CString("") << bool(FALSE) << bool(TRUE); QTest::newRow( tag + "1" ) << device << encoding << Q3CString(0) << bool(FALSE) << bool(TRUE); QTest::newRow( tag + "2" ) << device << encoding << Q3CString("foo") << bool(FALSE) << bool(FALSE); QTest::newRow( tag + "3" ) << device << encoding << Q3CString("foo\nbar") << bool(TRUE) << bool(FALSE); QTest::newRow( tag + "4" ) << device << encoding << Q3CString("cjacka ckha cka ckah ckac kahckadhcbkgdk vkzdfbvajef vkahv") << bool(TRUE) << bool(FALSE); } } } void tst_Q3TextStream::operator_shift_Q3CString() { QFETCH( bool, zero_length ); file_is_empty = zero_length; createWriteStream( os ); write_Q3CString( os ); closeWriteStream( os ); createReadStream( is ); read_Q3CString( is ); closeReadStream( is ); } void tst_Q3TextStream::read_Q3CString( Q3TextStream *s ) { /* QFETCH( Q3CString, cs ); Q3CString exp; *s >> exp; QCOMPARE( exp, cs ); */ Q3CString exp; QFETCH( Q3CString, cs ); if (cs.isNull()) cs = ""; QFETCH( bool, multi_str ); if (!multi_str) { *s >> exp; QCOMPARE( exp, cs ); } else { QStringList l; l = QStringList::split( " ", cs ); if (l.count() < 2) l = QStringList::split( "\n", cs ); for (uint i=0; i> exp; QCOMPARE( exp, Q3CString(l[i].toLatin1()) ); } } } void tst_Q3TextStream::write_Q3CString( Q3TextStream *s ) { QFETCH( Q3CString, cs ); *s << cs; } void tst_Q3TextStream::task28319() { /* // Specific test for task 28319 QFile f("28319.txt"); if (f.open(IO_WriteOnly)) { // First we write some text Q3TextStream writeStream(&f); writeStream.setEncoding(Q3TextStream::Unicode); writeStream << "This is a"; f.close(); } else { QVERIFY(FALSE); } if (f.open(IO_WriteOnly | IO_Append)) { // Now we append some text Q3TextStream appendStream(&f); appendStream.setEncoding(Q3TextStream::Unicode); appendStream << " test"; f.close(); } else { QVERIFY(FALSE); } if (f.open(IO_ReadOnly)) { // Now we read in the text Q3TextStream readStream(&f); QString text = readStream.read(); QCOMPARE(text, QString("This is a test")); } else { QVERIFY(FALSE); } */ } /*! \since 4.5 This code worked in Qt 3 and should also in Qt 4. It should not crash due to out of bounds. */ void tst_Q3TextStream::QTextCodecCodecForIndex() const { for(int i = 0; QTextCodec::codecForIndex(i); i++) ; } QTEST_MAIN(tst_Q3TextStream) #include "tst_q3textstream.moc"