diff options
Diffstat (limited to 'tests/auto/q3textstream/tst_q3textstream.cpp')
-rw-r--r-- | tests/auto/q3textstream/tst_q3textstream.cpp | 1347 |
1 files changed, 1347 insertions, 0 deletions
diff --git a/tests/auto/q3textstream/tst_q3textstream.cpp b/tests/auto/q3textstream/tst_q3textstream.cpp new file mode 100644 index 0000000..7932b79 --- /dev/null +++ b/tests/auto/q3textstream/tst_q3textstream.cpp @@ -0,0 +1,1347 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (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 either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** 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.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#include <QtCore/QtCore> +#include <QtTest/QtTest> +#include <Qt3Support/Q3TextStream> + +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<QString>( "device" ); + QTest::addColumn<QString>( "encoding" ); + QTest::addColumn<QString>( "type" ); + QTest::addColumn<double>( "doubleVal" ); + QTest::addColumn<int>( "intVal" ); + QTest::addColumn<QString>( "stringVal" ); + QTest::addColumn<QByteArray>( "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 QT_VERSION < 0x040000 + encoded.resize( encoded.size() - 1 ); +#endif + + 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 QT_VERSION < 0x040000 + encoded.resize( encoded.size() - 1 ); +#endif + + 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<QString>( "device" ); + QTest::addColumn<QString>( "encoding" ); + QTest::addColumn<ushort>( "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<QString>( "device" ); + QTest::addColumn<QString>( "encoding" ); + QTest::addColumn<int>( "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<QString>( "device" ); + QTest::addColumn<QString>( "encoding" ); + QTest::addColumn<short>( "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<QString>( "device" ); + QTest::addColumn<QString>( "encoding" ); + QTest::addColumn<ushort>( "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<QString>( "device" ); + QTest::addColumn<QString>( "encoding" ); + QTest::addColumn<int>( "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<QString>( "device" ); + QTest::addColumn<QString>( "encoding" ); + QTest::addColumn<uint>( "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<QString>( "device" ); + QTest::addColumn<QString>( "encoding" ); + QTest::addColumn<long>( "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<QString>( "device" ); + QTest::addColumn<QString>( "encoding" ); + QTest::addColumn<ulong>( "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<QString>( "device" ); + QTest::addColumn<QString>( "encoding" ); + QTest::addColumn<float>( "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<QString>( "device" ); + QTest::addColumn<QString>( "encoding" ); + QTest::addColumn<double>( "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<QString>( "device" ); + QTest::addColumn<QString>( "encoding" ); + QTest::addColumn<QString>( "str" ); + QTest::addColumn<bool>( "multi_str" ); + QTest::addColumn<bool>( "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<uint(l.count()); i++) { + *s >> 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<QString>( "device" ); + QTest::addColumn<QString>( "encoding" ); + QTest::addColumn<Q3CString>( "cs" ); + QTest::addColumn<bool>( "multi_str" ); + QTest::addColumn<bool>( "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<uint(l.count()); i++) { + *s >> exp; + QCOMPARE( exp, Q3CString(l[i].toLatin1()) ); + } + } +} + +void tst_Q3TextStream::write_Q3CString( Q3TextStream *s ) +{ + QFETCH( Q3CString, cs ); + *s << cs; +} + +void tst_Q3TextStream::task28319() +{ + /* +#if QT_VERSION >= 0x040000 + // 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); + } +#else + QSKIP( "A minor bug we don't want to fix in 3.2.", SkipAll); +#endif + */ +} + +/*! + \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" |