diff options
Diffstat (limited to 'tests')
199 files changed, 3371 insertions, 10847 deletions
diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro index 9eb741edac..c9d1da8649 100644 --- a/tests/auto/auto.pro +++ b/tests/auto/auto.pro @@ -1,5 +1,9 @@ TEMPLATE = subdirs +# Tests with developer-build started failing on qemu-armv7/armv8 after commit +# b88acae7a8e773c307e44f84da037d01d19e60f7 in qt5. +boot2qt:qtConfig(private_tests): return() + SUBDIRS += \ corelib \ dbus \ diff --git a/tests/auto/concurrent/qtconcurrentfilter/qtconcurrentfilter.pro b/tests/auto/concurrent/qtconcurrentfilter/qtconcurrentfilter.pro index 15345d40db..b372923310 100644 --- a/tests/auto/concurrent/qtconcurrentfilter/qtconcurrentfilter.pro +++ b/tests/auto/concurrent/qtconcurrentfilter/qtconcurrentfilter.pro @@ -2,5 +2,4 @@ CONFIG += testcase TARGET = tst_qtconcurrentfilter QT = core testlib concurrent SOURCES = tst_qtconcurrentfilter.cpp -DEFINES += QT_STRICT_ITERATORS DEFINES -= QT_NO_LINKED_LIST diff --git a/tests/auto/concurrent/qtconcurrentfilter/tst_qtconcurrentfilter.cpp b/tests/auto/concurrent/qtconcurrentfilter/tst_qtconcurrentfilter.cpp index 84ebd46886..8c4e1c16f3 100644 --- a/tests/auto/concurrent/qtconcurrentfilter/tst_qtconcurrentfilter.cpp +++ b/tests/auto/concurrent/qtconcurrentfilter/tst_qtconcurrentfilter.cpp @@ -714,16 +714,17 @@ void tst_QtConcurrentFilter::filteredReduced() QCOMPARE(sum, 6); } + auto push_back = static_cast<void (QVector<int>::*)(const int &)>(&QVector<int>::push_back); // functor-member { - QList<int> list2 = QtConcurrent::filteredReduced(list, KeepEvenIntegers(), &QList<int>::push_back, QtConcurrent::OrderedReduce); + QList<int> list2 = QtConcurrent::filteredReduced(list, KeepEvenIntegers(), push_back, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList<int>() << 2 << 4); } { QList<int> list2 = QtConcurrent::filteredReduced(list.begin(), list.end(), KeepEvenIntegers(), - &QList<int>::push_back, + push_back, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList<int>() << 2 << 4); } @@ -731,19 +732,19 @@ void tst_QtConcurrentFilter::filteredReduced() QList<int> list2 = QtConcurrent::filteredReduced(list.constBegin(), list.constEnd(), KeepEvenIntegers(), - &QList<int>::push_back, + push_back, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList<int>() << 2 << 4); } { - QList<int> list2 = QtConcurrent::blockingFilteredReduced(list, KeepEvenIntegers(), &QList<int>::push_back, QtConcurrent::OrderedReduce); + QList<int> list2 = QtConcurrent::blockingFilteredReduced(list, KeepEvenIntegers(), push_back, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList<int>() << 2 << 4); } { QList<int> list2 = QtConcurrent::blockingFilteredReduced(list.begin(), list.end(), KeepEvenIntegers(), - &QList<int>::push_back, + push_back, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList<int>() << 2 << 4); } @@ -751,7 +752,7 @@ void tst_QtConcurrentFilter::filteredReduced() QList<int> list2 = QtConcurrent::blockingFilteredReduced(list.constBegin(), list.constEnd(), KeepEvenIntegers(), - &QList<int>::push_back, + push_back, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList<int>() << 2 << 4); } @@ -805,12 +806,15 @@ void tst_QtConcurrentFilter::filteredReduced() } // member-member + + auto push_back_number = static_cast<void (QVector<Number>::*)(const Number &)>(&QVector<Number>::push_back); + { QList<Number> numbers; numbers << 1 << 2 << 3 << 4; QList<Number> list2 = QtConcurrent::filteredReduced(numbers, &Number::isEven, - &QList<Number>::push_back, QtConcurrent::OrderedReduce); + push_back_number, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList<Number>() << 2 << 4); } { @@ -819,7 +823,7 @@ void tst_QtConcurrentFilter::filteredReduced() QList<Number> list2 = QtConcurrent::filteredReduced(numbers.begin(), numbers.end(), &Number::isEven, - &QList<Number>::push_back, + push_back_number, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList<Number>() << 2 << 4); } @@ -829,7 +833,7 @@ void tst_QtConcurrentFilter::filteredReduced() QList<Number> list2 = QtConcurrent::filteredReduced(numbers.constBegin(), numbers.constEnd(), &Number::isEven, - &QList<Number>::push_back, + push_back_number, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList<Number>() << 2 << 4); } @@ -838,7 +842,7 @@ void tst_QtConcurrentFilter::filteredReduced() numbers << 1 << 2 << 3 << 4; QList<Number> list2 = QtConcurrent::blockingFilteredReduced(numbers, &Number::isEven, - &QList<Number>::push_back, QtConcurrent::OrderedReduce); + push_back_number, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList<Number>() << 2 << 4); } { @@ -847,7 +851,7 @@ void tst_QtConcurrentFilter::filteredReduced() QList<Number> list2 = QtConcurrent::blockingFilteredReduced(numbers.begin(), numbers.end(), &Number::isEven, - &QList<Number>::push_back, + push_back_number, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList<Number>() << 2 << 4); } @@ -857,21 +861,21 @@ void tst_QtConcurrentFilter::filteredReduced() QList<Number> list2 = QtConcurrent::blockingFilteredReduced(numbers.constBegin(), numbers.constEnd(), &Number::isEven, - &QList<Number>::push_back, + push_back_number, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList<Number>() << 2 << 4); } // function-member { - QList<int> list2 = QtConcurrent::filteredReduced(list, keepEvenIntegers, &QList<int>::push_back, QtConcurrent::OrderedReduce); + QList<int> list2 = QtConcurrent::filteredReduced(list, keepEvenIntegers, push_back, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList<int>() << 2 << 4); } { QList<int> list2 = QtConcurrent::filteredReduced(list.begin(), list.end(), keepEvenIntegers, - &QList<int>::push_back, + push_back, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList<int>() << 2 << 4); } @@ -879,19 +883,19 @@ void tst_QtConcurrentFilter::filteredReduced() QList<int> list2 = QtConcurrent::filteredReduced(list.constBegin(), list.constEnd(), keepEvenIntegers, - &QList<int>::push_back, + push_back, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList<int>() << 2 << 4); } { - QList<int> list2 = QtConcurrent::blockingFilteredReduced(list, keepEvenIntegers, &QList<int>::push_back, QtConcurrent::OrderedReduce); + QList<int> list2 = QtConcurrent::blockingFilteredReduced(list, keepEvenIntegers, push_back, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList<int>() << 2 << 4); } { QList<int> list2 = QtConcurrent::blockingFilteredReduced(list.begin(), list.end(), keepEvenIntegers, - &QList<int>::push_back, + push_back, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList<int>() << 2 << 4); } @@ -899,7 +903,7 @@ void tst_QtConcurrentFilter::filteredReduced() QList<int> list2 = QtConcurrent::blockingFilteredReduced(list.constBegin(), list.constEnd(), keepEvenIntegers, - &QList<int>::push_back, + push_back, QtConcurrent::OrderedReduce); QCOMPARE(list2, QList<int>() << 2 << 4); } diff --git a/tests/auto/concurrent/qtconcurrentmap/qtconcurrentmap.pro b/tests/auto/concurrent/qtconcurrentmap/qtconcurrentmap.pro index 717d103e44..170881177d 100644 --- a/tests/auto/concurrent/qtconcurrentmap/qtconcurrentmap.pro +++ b/tests/auto/concurrent/qtconcurrentmap/qtconcurrentmap.pro @@ -2,7 +2,6 @@ CONFIG += testcase TARGET = tst_qtconcurrentmap QT = core testlib concurrent SOURCES = tst_qtconcurrentmap.cpp -DEFINES += QT_STRICT_ITERATORS DEFINES -= QT_NO_LINKED_LIST # Force C++17 if available diff --git a/tests/auto/concurrent/qtconcurrentmap/tst_qtconcurrentmap.cpp b/tests/auto/concurrent/qtconcurrentmap/tst_qtconcurrentmap.cpp index 383de0b2ce..d9cbae1ac2 100644 --- a/tests/auto/concurrent/qtconcurrentmap/tst_qtconcurrentmap.cpp +++ b/tests/auto/concurrent/qtconcurrentmap/tst_qtconcurrentmap.cpp @@ -1381,11 +1381,13 @@ void tst_QtConcurrentMap::mappedReduced() QCOMPARE(sum3, 14); } + auto push_back = static_cast<void (QVector<int>::*)(const int &)>(&QVector<int>::push_back); + // functor-member { QList<int> list2 = QtConcurrent::mappedReduced(list, IntSquare(), - &QList<int>::push_back, + push_back, OrderedReduce); QCOMPARE(list, QList<int>() << 1 << 2 << 3); QCOMPARE(list2, QList<int>() << 1 << 4 << 9); @@ -1393,14 +1395,14 @@ void tst_QtConcurrentMap::mappedReduced() QList<int> list3 = QtConcurrent::mappedReduced(list.constBegin(), list.constEnd(), IntSquare(), - &QList<int>::push_back, + push_back, OrderedReduce); QCOMPARE(list, QList<int>() << 1 << 2 << 3); QCOMPARE(list3, QList<int>() << 1 << 4 << 9); QList<int> list4 = QtConcurrent::mappedReduced(QList<int>(list), IntSquare(), - &QList<int>::push_back, + push_back, OrderedReduce); QCOMPARE(list, QList<int>() << 1 << 2 << 3); QCOMPARE(list4, QList<int>() << 1 << 4 << 9); @@ -1463,20 +1465,20 @@ void tst_QtConcurrentMap::mappedReduced() { QList<int> list2 = QtConcurrent::mappedReduced(numberList, &Number::toInt, - &QList<int>::push_back, + push_back, OrderedReduce); QCOMPARE(list2, QList<int>() << 1 << 2 << 3); QList<int> list3 = QtConcurrent::mappedReduced(numberList.constBegin(), numberList.constEnd(), &Number::toInt, - &QList<int>::push_back, + push_back, OrderedReduce); QCOMPARE(list3, QList<int>() << 1 << 2 << 3); QList<int> list4 = QtConcurrent::mappedReduced(QList<Number>(numberList), &Number::toInt, - &QList<int>::push_back, OrderedReduce); + push_back, OrderedReduce); QCOMPARE(list4, QList<int>() << 1 << 2 << 3); } { @@ -1503,7 +1505,7 @@ void tst_QtConcurrentMap::mappedReduced() { QList<int> list2 = QtConcurrent::mappedReduced(list, intSquare, - &QList<int>::push_back, + push_back, OrderedReduce); QCOMPARE(list, QList<int>() << 1 << 2 << 3); QCOMPARE(list2, QList<int>() << 1 << 4 << 9); @@ -1511,14 +1513,14 @@ void tst_QtConcurrentMap::mappedReduced() QList<int> list3 = QtConcurrent::mappedReduced(list.constBegin(), list.constEnd(), intSquare, - &QList<int>::push_back, + push_back, OrderedReduce); QCOMPARE(list, QList<int>() << 1 << 2 << 3); QCOMPARE(list3, QList<int>() << 1 << 4 << 9); QList<int> list4 = QtConcurrent::mappedReduced(QList<int>(list), intSquare, - &QList<int>::push_back, + push_back, OrderedReduce); QCOMPARE(list, QList<int>() << 1 << 2 << 3); QCOMPARE(list4, QList<int>() << 1 << 4 << 9); @@ -1759,11 +1761,13 @@ void tst_QtConcurrentMap::blocking_mappedReduced() QCOMPARE(sum3, 14); } + auto push_back = static_cast<void (QVector<int>::*)(const int &)>(&QVector<int>::push_back); + // functor-member { QList<int> list2 = QtConcurrent::blockingMappedReduced(list, IntSquare(), - &QList<int>::push_back, + push_back, OrderedReduce); QCOMPARE(list, QList<int>() << 1 << 2 << 3); QCOMPARE(list2, QList<int>() << 1 << 4 << 9); @@ -1771,14 +1775,14 @@ void tst_QtConcurrentMap::blocking_mappedReduced() QList<int> list3 = QtConcurrent::blockingMappedReduced(list.constBegin(), list.constEnd(), IntSquare(), - &QList<int>::push_back, + push_back, OrderedReduce); QCOMPARE(list, QList<int>() << 1 << 2 << 3); QCOMPARE(list3, QList<int>() << 1 << 4 << 9); QList<int> list4 = QtConcurrent::blockingMappedReduced(QList<int>(list), IntSquare(), - &QList<int>::push_back, + push_back, OrderedReduce); QCOMPARE(list, QList<int>() << 1 << 2 << 3); QCOMPARE(list4, QList<int>() << 1 << 4 << 9); @@ -1842,20 +1846,20 @@ void tst_QtConcurrentMap::blocking_mappedReduced() { QList<int> list2 = QtConcurrent::blockingMappedReduced(numberList, &Number::toInt, - &QList<int>::push_back, + push_back, OrderedReduce); QCOMPARE(list2, QList<int>() << 1 << 2 << 3); QList<int> list3 = QtConcurrent::blockingMappedReduced(numberList.constBegin(), numberList.constEnd(), &Number::toInt, - &QList<int>::push_back, + push_back, OrderedReduce); QCOMPARE(list3, QList<int>() << 1 << 2 << 3); QList<int> list4 = QtConcurrent::blockingMappedReduced(QList<Number>(numberList), &Number::toInt, - &QList<int>::push_back, OrderedReduce); + push_back, OrderedReduce); QCOMPARE(list4, QList<int>() << 1 << 2 << 3); } { @@ -1882,7 +1886,7 @@ void tst_QtConcurrentMap::blocking_mappedReduced() { QList<int> list2 = QtConcurrent::blockingMappedReduced(list, intSquare, - &QList<int>::push_back, + push_back, OrderedReduce); QCOMPARE(list, QList<int>() << 1 << 2 << 3); QCOMPARE(list2, QList<int>() << 1 << 4 << 9); @@ -1890,14 +1894,14 @@ void tst_QtConcurrentMap::blocking_mappedReduced() QList<int> list3 = QtConcurrent::blockingMappedReduced(list.constBegin(), list.constEnd(), intSquare, - &QList<int>::push_back, + push_back, OrderedReduce); QCOMPARE(list, QList<int>() << 1 << 2 << 3); QCOMPARE(list3, QList<int>() << 1 << 4 << 9); QList<int> list4 = QtConcurrent::blockingMappedReduced(QList<int>(list), intSquare, - &QList<int>::push_back, + push_back, OrderedReduce); QCOMPARE(list, QList<int>() << 1 << 2 << 3); QCOMPARE(list4, QList<int>() << 1 << 4 << 9); @@ -2118,7 +2122,6 @@ public: }; Q_DECLARE_METATYPE(QVector<MemFnTester>); -Q_DECLARE_METATYPE(QList<MemFnTester>); void tst_QtConcurrentMap::functionOverloads() { diff --git a/tests/auto/concurrent/qtconcurrentmedian/qtconcurrentmedian.pro b/tests/auto/concurrent/qtconcurrentmedian/qtconcurrentmedian.pro index 0d07642028..59e22d24a1 100644 --- a/tests/auto/concurrent/qtconcurrentmedian/qtconcurrentmedian.pro +++ b/tests/auto/concurrent/qtconcurrentmedian/qtconcurrentmedian.pro @@ -2,4 +2,3 @@ CONFIG += testcase TARGET = tst_qtconcurrentmedian QT = core testlib concurrent SOURCES = tst_qtconcurrentmedian.cpp -DEFINES += QT_STRICT_ITERATORS diff --git a/tests/auto/corelib/global/qglobal/tst_qglobal.cpp b/tests/auto/corelib/global/qglobal/tst_qglobal.cpp index b33dec8a61..047130d5ea 100644 --- a/tests/auto/corelib/global/qglobal/tst_qglobal.cpp +++ b/tests/auto/corelib/global/qglobal/tst_qglobal.cpp @@ -49,7 +49,6 @@ private slots: void qConstructorFunction(); void qCoreAppStartupFunction(); void qCoreAppStartupFunctionRestart(); - void qAlignOf(); void integerForSize(); void qprintable(); void qprintable_data(); @@ -434,106 +433,6 @@ template <class T> struct AlignmentInStruct { T dummy; }; typedef int (*fun) (); typedef int (Empty::*memFun) (); -#define TEST_AlignOf(type, alignment) \ - do { \ - TEST_AlignOf_impl(type, alignment); \ - \ - TEST_AlignOf_impl(type &, alignment); \ - TEST_AlignOf_RValueRef(type &&, alignment); \ - \ - TEST_AlignOf_impl(type [5], alignment); \ - TEST_AlignOf_impl(type (&) [5], alignment); \ - \ - TEST_AlignOf_impl(AlignmentInStruct<type>, alignment); \ - \ - /* Some internal sanity validation, just for fun */ \ - TEST_AlignOf_impl(AlignmentInStruct<type [5]>, alignment); \ - TEST_AlignOf_impl(AlignmentInStruct<type &>, Q_ALIGNOF(void *)); \ - TEST_AlignOf_impl(AlignmentInStruct<type (&) [5]>, \ - Q_ALIGNOF(void *)); \ - TEST_AlignOf_RValueRef(AlignmentInStruct<type &&>, \ - Q_ALIGNOF(void *)); \ - } while (false) \ - /**/ - -#define TEST_AlignOf_RValueRef(type, alignment) \ - TEST_AlignOf_impl(type, alignment) - -#define TEST_AlignOf_impl(type, alignment) \ - do { \ - QCOMPARE(Q_ALIGNOF(type), size_t(alignment)); \ - /* Compare to native operator for compilers that support it, - otherwise... erm... check consistency! :-) */ \ - QCOMPARE(alignof(type), Q_ALIGNOF(type)); \ - } while (false) - /**/ - -void tst_QGlobal::qAlignOf() -{ - // Built-in types, except 64-bit integers and double - TEST_AlignOf(char, 1); - TEST_AlignOf(signed char, 1); - TEST_AlignOf(unsigned char, 1); - TEST_AlignOf(qint8, 1); - TEST_AlignOf(quint8, 1); - TEST_AlignOf(qint16, 2); - TEST_AlignOf(quint16, 2); - TEST_AlignOf(qint32, 4); - TEST_AlignOf(quint32, 4); - TEST_AlignOf(void *, sizeof(void *)); - - // Depends on platform and compiler, disabling test for now - // TEST_AlignOf(long double, 16); - - // Empty struct - TEST_AlignOf(Empty, 1); - - // Function pointers - TEST_AlignOf(fun, Q_ALIGNOF(void *)); - TEST_AlignOf(memFun, Q_ALIGNOF(void *)); - - - // 64-bit integers and double - TEST_AlignOf_impl(qint64, 8); - TEST_AlignOf_impl(quint64, 8); - TEST_AlignOf_impl(double, 8); - - TEST_AlignOf_impl(qint64 &, 8); - TEST_AlignOf_impl(quint64 &, 8); - TEST_AlignOf_impl(double &, 8); - - TEST_AlignOf_RValueRef(qint64 &&, 8); - TEST_AlignOf_RValueRef(quint64 &&, 8); - TEST_AlignOf_RValueRef(double &&, 8); - - // 32-bit x86 ABI idiosyncrasies -#if defined(Q_PROCESSOR_X86_32) && !defined(Q_OS_WIN) - TEST_AlignOf_impl(AlignmentInStruct<qint64>, 4); -#else - TEST_AlignOf_impl(AlignmentInStruct<qint64>, 8); -#endif - - TEST_AlignOf_impl(AlignmentInStruct<quint64>, Q_ALIGNOF(AlignmentInStruct<qint64>)); - TEST_AlignOf_impl(AlignmentInStruct<double>, Q_ALIGNOF(AlignmentInStruct<qint64>)); - - // 32-bit x86 ABI, Clang disagrees with gcc -#if !defined(Q_PROCESSOR_X86_32) || !defined(Q_CC_CLANG) || defined(Q_OS_ANDROID) - TEST_AlignOf_impl(qint64 [5], Q_ALIGNOF(qint64)); -#else - TEST_AlignOf_impl(qint64 [5], Q_ALIGNOF(AlignmentInStruct<qint64>)); -#endif - - TEST_AlignOf_impl(qint64 (&) [5], Q_ALIGNOF(qint64 [5])); - TEST_AlignOf_impl(quint64 [5], Q_ALIGNOF(quint64 [5])); - TEST_AlignOf_impl(quint64 (&) [5], Q_ALIGNOF(quint64 [5])); - TEST_AlignOf_impl(double [5], Q_ALIGNOF(double [5])); - TEST_AlignOf_impl(double (&) [5], Q_ALIGNOF(double [5])); -} - -#undef TEST_AlignOf -#undef TEST_AlignOf_RValueRef -#undef TEST_AlignOf_impl - void tst_QGlobal::integerForSize() { // compile-only test: diff --git a/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp b/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp index 09ef0ea44f..ebb9a0a44c 100644 --- a/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp +++ b/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp @@ -116,7 +116,7 @@ static DWORD createSymbolicLink(const QString &symLinkName, const QString &targe reinterpret_cast<const wchar_t*>(nativeTarget.utf16()), flags) == FALSE) { result = GetLastError(); QTextStream(errorMessage) << "CreateSymbolicLink(" << nativeSymLinkName << ", " - << nativeTarget << ", 0x" << hex << flags << dec << ") failed with error " << result + << nativeTarget << ", 0x" << Qt::hex << flags << Qt::dec << ") failed with error " << result << ": " << qt_error_string(int(result)); } return result; diff --git a/tests/auto/corelib/io/qfileselector/platforms/+mac/test5 b/tests/auto/corelib/io/qfileselector/platforms/+mac/test5 deleted file mode 100644 index e69de29bb2..0000000000 --- a/tests/auto/corelib/io/qfileselector/platforms/+mac/test5 +++ /dev/null diff --git a/tests/auto/corelib/io/qfileselector/platforms/+osx/test4 b/tests/auto/corelib/io/qfileselector/platforms/+osx/test4 deleted file mode 100644 index e69de29bb2..0000000000 --- a/tests/auto/corelib/io/qfileselector/platforms/+osx/test4 +++ /dev/null diff --git a/tests/auto/corelib/io/qfileselector/platforms/+mac/test b/tests/auto/corelib/io/qfileselector/platforms/+unix/+darwin/+ios/test index e69de29bb2..e69de29bb2 100644 --- a/tests/auto/corelib/io/qfileselector/platforms/+mac/test +++ b/tests/auto/corelib/io/qfileselector/platforms/+unix/+darwin/+ios/test diff --git a/tests/auto/corelib/io/qfileselector/platforms/+unix/+darwin/+mac/+ios/test b/tests/auto/corelib/io/qfileselector/platforms/+unix/+darwin/+mac/+ios/test deleted file mode 100644 index e69de29bb2..0000000000 --- a/tests/auto/corelib/io/qfileselector/platforms/+unix/+darwin/+mac/+ios/test +++ /dev/null diff --git a/tests/auto/corelib/io/qfileselector/platforms/+unix/+darwin/+mac/+macos/test b/tests/auto/corelib/io/qfileselector/platforms/+unix/+darwin/+mac/+macos/test deleted file mode 100644 index e69de29bb2..0000000000 --- a/tests/auto/corelib/io/qfileselector/platforms/+unix/+darwin/+mac/+macos/test +++ /dev/null diff --git a/tests/auto/corelib/io/qfileselector/platforms/+unix/+darwin/+mac/+osx/+macos/test b/tests/auto/corelib/io/qfileselector/platforms/+unix/+darwin/+mac/+osx/+macos/test deleted file mode 100644 index e69de29bb2..0000000000 --- a/tests/auto/corelib/io/qfileselector/platforms/+unix/+darwin/+mac/+osx/+macos/test +++ /dev/null diff --git a/tests/auto/corelib/io/qfileselector/platforms/+unix/+darwin/+mac/+osx/test b/tests/auto/corelib/io/qfileselector/platforms/+unix/+darwin/+mac/+osx/test deleted file mode 100644 index e69de29bb2..0000000000 --- a/tests/auto/corelib/io/qfileselector/platforms/+unix/+darwin/+mac/+osx/test +++ /dev/null diff --git a/tests/auto/corelib/io/qfileselector/platforms/+unix/+darwin/+mac/test b/tests/auto/corelib/io/qfileselector/platforms/+unix/+darwin/+mac/test deleted file mode 100644 index e69de29bb2..0000000000 --- a/tests/auto/corelib/io/qfileselector/platforms/+unix/+darwin/+mac/test +++ /dev/null diff --git a/tests/auto/corelib/io/qfileselector/platforms/+osx/test b/tests/auto/corelib/io/qfileselector/platforms/+unix/+darwin/+macos/test index e69de29bb2..e69de29bb2 100644 --- a/tests/auto/corelib/io/qfileselector/platforms/+osx/test +++ b/tests/auto/corelib/io/qfileselector/platforms/+unix/+darwin/+macos/test diff --git a/tests/auto/corelib/io/qfileselector/qfileselector.qrc b/tests/auto/corelib/io/qfileselector/qfileselector.qrc index 54b2e0a0e2..f3b3ede575 100644 --- a/tests/auto/corelib/io/qfileselector/qfileselector.qrc +++ b/tests/auto/corelib/io/qfileselector/qfileselector.qrc @@ -1,65 +1,51 @@ -<!DOCTYPE RCC><RCC version="1.0"> -<qresource prefix="/"> - <file>extras/test</file> - <file>extras/test2</file> - <file>extras/+custom1/test</file> - <file>extras/+custom1/test3</file> - <file>extras/+custom2/test</file> - <file>extras/+custom3/test</file> - <file>extras/+custom3/+custom2/test</file> - <file>extras/+custom3/+custom4/test</file> - <file>extras/+custom3/+custom5/test</file> - <file>extras/+custom5/+custom3/test</file> - - <!-- platforms/test: deepest possible selection --> - <file>platforms/test</file> - <file>platforms/+unix/+android/test</file> - <file>platforms/+unix/+darwin/+mac/+ios/test</file> - <file>platforms/+unix/+darwin/+mac/+osx/+macos/test</file> - <file>platforms/+unix/+darwin/+mac/+osx/test</file> - <file>platforms/+unix/+darwin/+mac/test</file> - <file>platforms/+unix/+darwin/test</file> - <file>platforms/+unix/+haiku/test</file> - <file>platforms/+unix/+linux/test</file> - <file>platforms/+unix/+qnx/test</file> - <file>platforms/+unix/test</file> - <file>platforms/+windows/+wince/test</file> - <file>platforms/+windows/+winnt/test</file> - <file>platforms/+windows/+winrt/test</file> - <file>platforms/+windows/test</file> - <file>platforms/+android/test</file> - <file>platforms/+ios/test</file> - <file>platforms/+macos/test</file> - <file>platforms/+osx/test</file> - <file>platforms/+darwin/test</file> - <file>platforms/+mac/test</file> - <file>platforms/+haiku/test</file> - <file>platforms/+linux/test</file> - <file>platforms/+qnx/test</file> - <file>platforms/+wince/test</file> - <file>platforms/+winrt/test</file> - - <!-- platforms/test2: shallow selection for the deepest selector --> - <file>platforms/test2</file> - <file>platforms/+android/test2</file> - <file>platforms/+ios/test2</file> - <file>platforms/+macos/test2</file> - <file>platforms/+haiku/test2</file> - <file>platforms/+linux/test2</file> - <file>platforms/+qnx/test2</file> - <file>platforms/+wince/test2</file> - <file>platforms/+winnt/test2</file> - <file>platforms/+winrt/test2</file> - - <!-- platforms/test3: selection for the family only --> - <file>platforms/test3</file> - <file>platforms/+windows/test3</file> - <file>platforms/+unix/test3</file> - - <!-- platforms/test4 and 5: special cases for macOS --> - <file>platforms/test4</file> - <file>platforms/+osx/test4</file> - <file>platforms/test5</file> - <file>platforms/+mac/test5</file> -</qresource> +<RCC> + <qresource prefix="/"> + <file>extras/test</file> + <file>extras/test2</file> + <file>extras/+custom1/test</file> + <file>extras/+custom1/test3</file> + <file>extras/+custom2/test</file> + <file>extras/+custom3/test</file> + <file>extras/+custom3/+custom2/test</file> + <file>extras/+custom3/+custom4/test</file> + <file>extras/+custom3/+custom5/test</file> + <file>extras/+custom5/+custom3/test</file> + <file>platforms/test</file> + <file>platforms/+unix/+android/test</file> + <file>platforms/+unix/+darwin/test</file> + <file>platforms/+unix/+haiku/test</file> + <file>platforms/+unix/+linux/test</file> + <file>platforms/+unix/+qnx/test</file> + <file>platforms/+unix/test</file> + <file>platforms/+windows/+wince/test</file> + <file>platforms/+windows/+winnt/test</file> + <file>platforms/+windows/+winrt/test</file> + <file>platforms/+windows/test</file> + <file>platforms/+android/test</file> + <file>platforms/+ios/test</file> + <file>platforms/+macos/test</file> + <file>platforms/+darwin/test</file> + <file>platforms/+haiku/test</file> + <file>platforms/+linux/test</file> + <file>platforms/+qnx/test</file> + <file>platforms/+wince/test</file> + <file>platforms/+winrt/test</file> + <file>platforms/test2</file> + <file>platforms/+android/test2</file> + <file>platforms/+ios/test2</file> + <file>platforms/+macos/test2</file> + <file>platforms/+haiku/test2</file> + <file>platforms/+linux/test2</file> + <file>platforms/+qnx/test2</file> + <file>platforms/+wince/test2</file> + <file>platforms/+winnt/test2</file> + <file>platforms/+winrt/test2</file> + <file>platforms/test3</file> + <file>platforms/+windows/test3</file> + <file>platforms/+unix/test3</file> + <file>platforms/test4</file> + <file>platforms/test5</file> + <file>platforms/+unix/+darwin/+macos/test</file> + <file>platforms/+unix/+darwin/+ios/test</file> + </qresource> </RCC> diff --git a/tests/auto/corelib/io/qfileselector/tst_qfileselector.cpp b/tests/auto/corelib/io/qfileselector/tst_qfileselector.cpp index 11b1fdaeeb..bac7a69e0f 100644 --- a/tests/auto/corelib/io/qfileselector/tst_qfileselector.cpp +++ b/tests/auto/corelib/io/qfileselector/tst_qfileselector.cpp @@ -126,14 +126,6 @@ void tst_QFileSelector::basicTest_data() QTest::newRow("platform3") << QString(":/platforms/test3") << QStringList() << expectedPlatform3File; -#ifdef Q_OS_MACOS - // special case for compatibility code - QTest::newRow("osx-compat") << QString(":/platforms/test4") << QStringList() - << ":/platforms/+osx/test4"; - QTest::newRow("mac-compat") << QString(":/platforms/test5") << QStringList() - << ":/platforms/+mac/test5"; -#endif - QString resourceTestPath(":/extras/test"); QString custom1("custom1"); QTest::newRow("custom1-noselector") << resourceTestPath << QStringList() diff --git a/tests/auto/corelib/io/qsettings/tst_qsettings.cpp b/tests/auto/corelib/io/qsettings/tst_qsettings.cpp index 0f07ba4bb2..c969e72c18 100644 --- a/tests/auto/corelib/io/qsettings/tst_qsettings.cpp +++ b/tests/auto/corelib/io/qsettings/tst_qsettings.cpp @@ -39,7 +39,9 @@ #include <QtCore/QDir> #include <QtCore/QThread> #include <QtCore/QSysInfo> -#include <QtGui/QKeySequence> +#if QT_CONFIG(shortcut) +# include <QtGui/QKeySequence> +#endif #include <QtCore> #include <QtGui> @@ -1364,6 +1366,7 @@ void tst_QSettings::testVariantTypes() dt.setOffsetFromUtc(3600); testVal("key14", dt, QDateTime, DateTime); +#if QT_CONFIG(shortcut) // We store key sequences as strings instead of binary variant blob, for improved // readability in the resulting format. if (format >= QSettings::InvalidFormat) { @@ -1373,6 +1376,7 @@ void tst_QSettings::testVariantTypes() QKeySequence(Qt::ControlModifier + Qt::Key_F1).toString(QKeySequence::NativeText), QString, String); } +#endif // QT_CONFIG(shortcut) #undef testVal } diff --git a/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp b/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp index 60000316cc..c83e7af503 100644 --- a/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp +++ b/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp @@ -1320,13 +1320,13 @@ void tst_QMetaObject::normalizedSignature_data() QTest::newRow("function ptr spaces") << "void foo( void ( * ) ( void ))" << "void foo(void(*)())"; QTest::newRow("function ptr void*") << "void foo(void(*)(void*))" << "void foo(void(*)(void*))"; QTest::newRow("function ptr void* spaces") << "void foo( void ( * ) ( void * ))" << "void foo(void(*)(void*))"; - QTest::newRow("template args") << " void foo( QMap<a, a>, QList<b>) " - << "void foo(QMap<a,a>,QList<b>)"; + QTest::newRow("template args") << " void foo( QMap<a, a>, QVector<b>) " + << "void foo(QMap<a,a>,QVector<b>)"; QTest::newRow("void template args") << " void foo( Foo<void>, Bar<void> ) " << "void foo(Foo<void>,Bar<void>)"; QTest::newRow("void* template args") << " void foo( Foo<void*>, Bar<void *> ) " << "void foo(Foo<void*>,Bar<void*>)"; - QTest::newRow("rettype") << "QList<int, int> foo()" << "QList<int,int>foo()"; + QTest::newRow("rettype") << "QVector<int, int> foo()" << "QVector<int,int>foo()"; QTest::newRow("rettype void template") << "Foo<void> foo()" << "Foo<void>foo()"; QTest::newRow("const rettype") << "const QString *foo()" << "const QString*foo()"; QTest::newRow("const ref") << "const QString &foo()" << "const QString&foo()"; @@ -1337,15 +1337,16 @@ void tst_QMetaObject::normalizedSignature_data() QTest::newRow("const4") << "void foo(const int)" << "void foo(int)"; QTest::newRow("const5") << "void foo(const int, int const, const int &, int const &)" << "void foo(int,int,int,int)"; - QTest::newRow("const6") << "void foo(QList<const int>)" << "void foo(QList<const int>)"; - QTest::newRow("const7") << "void foo(QList<const int*>)" << "void foo(QList<const int*>)"; - QTest::newRow("const8") << "void foo(QList<int const*>)" << "void foo(QList<const int*>)"; + QTest::newRow("const6") << "void foo(QVector<const int>)" << "void foo(QVector<const int>)"; + QTest::newRow("const7") << "void foo(QVector<const int*>)" << "void foo(QVector<const int*>)"; + QTest::newRow("const8") << "void foo(QVector<int const*>)" << "void foo(QVector<const int*>)"; QTest::newRow("const9") << "void foo(const Foo<Bar>)" << "void foo(Foo<Bar>)"; QTest::newRow("const10") << "void foo(Foo<Bar>const)" << "void foo(Foo<Bar>)"; QTest::newRow("const11") << "void foo(Foo<Bar> *const)" << "void foo(Foo<Bar>*const)"; QTest::newRow("const12") << "void foo(Foo<Bar>const*const *const)" << "void foo(Foo<Bar>*const*const)"; QTest::newRow("const13") << "void foo(const Foo<Bar>&)" << "void foo(Foo<Bar>)"; QTest::newRow("const14") << "void foo(Foo<Bar>const&)" << "void foo(Foo<Bar>)"; + QTest::newRow("QList") << "void foo(QList<int>)" << "void foo(QVector<int>)"; QTest::newRow("invalid1") << "a( b" << "a(b"; } @@ -1367,13 +1368,13 @@ void tst_QMetaObject::normalizedType_data() QTest::newRow("white") << " int " << "int"; QTest::newRow("const1") << "int const *" << "const int*"; QTest::newRow("const2") << "const int *" << "const int*"; - QTest::newRow("template1") << "QList<int const *>" << "QList<const int*>"; - QTest::newRow("template2") << "QList<const int *>" << "QList<const int*>"; + QTest::newRow("template1") << "QVector<int const *>" << "QVector<const int*>"; + QTest::newRow("template2") << "QVector<const int *>" << "QVector<const int*>"; QTest::newRow("template3") << "QMap<QString, int>" << "QMap<QString,int>"; QTest::newRow("template4") << "const QMap<QString, int> &" << "QMap<QString,int>"; - QTest::newRow("template5") << "QList< ::Foo::Bar>" << "QList< ::Foo::Bar>"; - QTest::newRow("template6") << "QList<::Foo::Bar>" << "QList<::Foo::Bar>"; - QTest::newRow("template7") << "QList<QList<int> >" << "QList<QList<int> >"; + QTest::newRow("template5") << "QVector< ::Foo::Bar>" << "QVector< ::Foo::Bar>"; + QTest::newRow("template6") << "QVector<::Foo::Bar>" << "QVector<::Foo::Bar>"; + QTest::newRow("template7") << "QVector<QVector<int> >" << "QVector<QVector<int> >"; QTest::newRow("template8") << "QMap<const int, const short*>" << "QMap<const int,const short*>"; QTest::newRow("template9") << "QPair<const QPair<int, int const *> , QPair<QHash<int, const char*> > >" << "QPair<const QPair<int,const int*>,QPair<QHash<int,const char*> > >"; QTest::newRow("value1") << "const QString &" << "QString"; @@ -1387,6 +1388,7 @@ void tst_QMetaObject::normalizedType_data() QTest::newRow("struct2") << "struct foo const*" << "const foo*"; QTest::newRow("enum") << "enum foo" << "foo"; QTest::newRow("void") << "void" << "void"; + QTest::newRow("QList") << "QList<int>" << "QVector<int>"; } void tst_QMetaObject::normalizedType() diff --git a/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp b/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp index 9fe7d63727..14719f36f8 100644 --- a/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp +++ b/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp @@ -1702,9 +1702,10 @@ void tst_QMetaObjectBuilder::classNameFirstInStringData() builder.setClassName(QByteArrayLiteral("TestClass")); QMetaObject *mo = builder.toMetaObject(); - QByteArrayDataPtr header; - header.ptr = const_cast<QByteArrayData*>(mo->d.stringdata); - QCOMPARE(QByteArray(header), QByteArrayLiteral("TestClass")); + uint offset = mo->d.stringdata[0]; + uint len = mo->d.stringdata[1]; + QByteArray className(reinterpret_cast<const char *>(mo->d.stringdata) + offset, len); + QCOMPARE(className, QByteArrayLiteral("TestClass")); free(mo); } diff --git a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp index 19b3289390..4e30f210b1 100644 --- a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp +++ b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp @@ -120,8 +120,6 @@ private slots: void constRefs(); void convertCustomType_data(); void convertCustomType(); - void compareCustomType_data(); - void compareCustomType(); void compareCustomEqualOnlyType(); void customDebugStream(); void unknownType(); @@ -574,12 +572,14 @@ void tst_QMetaType::typeName_data() QTest::newRow("124125534") << 124125534 << QString(); // automatic registration - QTest::newRow("QList<int>") << ::qMetaTypeId<QList<int> >() << QString::fromLatin1("QList<int>"); QTest::newRow("QHash<int,int>") << ::qMetaTypeId<QHash<int, int> >() << QString::fromLatin1("QHash<int,int>"); QTest::newRow("QMap<int,int>") << ::qMetaTypeId<QMap<int, int> >() << QString::fromLatin1("QMap<int,int>"); - QTest::newRow("QVector<QList<int>>") << ::qMetaTypeId<QVector<QList<int> > >() << QString::fromLatin1("QVector<QList<int> >"); QTest::newRow("QVector<QMap<int,int>>") << ::qMetaTypeId<QVector<QMap<int, int> > >() << QString::fromLatin1("QVector<QMap<int,int> >"); + // automatic registration with automatic QList to QVector aliasing + QTest::newRow("QList<int>") << ::qMetaTypeId<QList<int> >() << QString::fromLatin1("QVector<int>"); + QTest::newRow("QVector<QList<int>>") << ::qMetaTypeId<QVector<QList<int> > >() << QString::fromLatin1("QVector<QVector<int> >"); + QTest::newRow("CustomQObject*") << ::qMetaTypeId<CustomQObject*>() << QString::fromLatin1("CustomQObject*"); QTest::newRow("CustomGadget") << ::qMetaTypeId<CustomGadget>() << QString::fromLatin1("CustomGadget"); QTest::newRow("CustomGadget*") << ::qMetaTypeId<CustomGadget*>() << QString::fromLatin1("CustomGadget*"); @@ -1032,9 +1032,9 @@ static void testConstructHelper() typedef typename MetaEnumToType<ID>::Type Type; QMetaType info(ID); int size = info.sizeOf(); - void *storage1 = qMallocAligned(size, Q_ALIGNOF(Type)); + void *storage1 = qMallocAligned(size, alignof(Type)); void *actual1 = QMetaType::construct(ID, storage1, /*copy=*/0); - void *storage2 = qMallocAligned(size, Q_ALIGNOF(Type)); + void *storage2 = qMallocAligned(size, alignof(Type)); void *actual2 = info.construct(storage2, /*copy=*/0); QCOMPARE(actual1, storage1); QCOMPARE(actual2, storage2); @@ -1186,9 +1186,9 @@ static void testConstructCopyHelper() QMetaType info(ID); int size = QMetaType::sizeOf(ID); QCOMPARE(info.sizeOf(), size); - void *storage1 = qMallocAligned(size, Q_ALIGNOF(Type)); + void *storage1 = qMallocAligned(size, alignof(Type)); void *actual1 = QMetaType::construct(ID, storage1, expected); - void *storage2 = qMallocAligned(size, Q_ALIGNOF(Type)); + void *storage2 = qMallocAligned(size, alignof(Type)); void *actual2 = info.construct(storage2, expected); QCOMPARE(actual1, storage1); QCOMPARE(actual2, storage2); @@ -2017,7 +2017,7 @@ void tst_QMetaType::metaObject_data() QTest::newRow("MyGadget") << ::qMetaTypeId<MyGadget>() << &MyGadget::staticMetaObject << true << false << false; QTest::newRow("MyGadget*") << ::qMetaTypeId<MyGadget*>() << &MyGadget::staticMetaObject << false << true << false; QTest::newRow("MyEnum") << ::qMetaTypeId<MyGadget::MyEnum>() << &MyGadget::staticMetaObject << false << false << false; - QTest::newRow("Qt::ScrollBarPolicy") << ::qMetaTypeId<Qt::ScrollBarPolicy>() << &QObject::staticQtMetaObject << false << false << false; + QTest::newRow("Qt::ScrollBarPolicy") << ::qMetaTypeId<Qt::ScrollBarPolicy>() << &Qt::staticMetaObject << false << false << false; QTest::newRow("MyQObjectFromGadget*") << ::qMetaTypeId<MyQObjectFromGadget*>() << &MyQObjectFromGadget::staticMetaObject << false << false << true; QTest::newRow("GadgetDerivedAndTyped<int>") << ::qMetaTypeId<GadgetDerivedAndTyped<int>>() << &GadgetDerivedAndTyped<int>::staticMetaObject << true << false << false; @@ -2139,7 +2139,7 @@ struct CustomConvertibleType }; bool operator<(const CustomConvertibleType &lhs, const CustomConvertibleType &rhs) -{ return lhs.m_foo < rhs.m_foo; } +{ return lhs.m_foo.toString() < rhs.m_foo.toString(); } bool operator==(const CustomConvertibleType &lhs, const CustomConvertibleType &rhs) { return lhs.m_foo == rhs.m_foo; } bool operator!=(const CustomConvertibleType &lhs, const CustomConvertibleType &rhs) @@ -2429,43 +2429,6 @@ void tst_QMetaType::convertCustomType() QCOMPARE(v.value<CustomConvertibleType2>().m_foo, testCustom.m_foo); } -void tst_QMetaType::compareCustomType_data() -{ - QMetaType::registerComparators<CustomConvertibleType>(); - - QTest::addColumn<QVariantList>("unsorted"); - QTest::addColumn<QVariantList>("sorted"); - - QTest::newRow("int") << (QVariantList() << 37 << 458 << 1 << 243 << -4 << 383) - << (QVariantList() << -4 << 1 << 37 << 243 << 383 << 458); - - QTest::newRow("dobule") << (QVariantList() << 4934.93 << 0.0 << 302.39 << -39.0) - << (QVariantList() << -39.0 << 0.0 << 302.39 << 4934.93); - - QTest::newRow("QString") << (QVariantList() << "Hello" << "World" << "this" << "is" << "a" << "test") - << (QVariantList() << "a" << "Hello" << "is" << "test" << "this" << "World"); - - QTest::newRow("QTime") << (QVariantList() << QTime(14, 39) << QTime(0, 0) << QTime(18, 18) << QTime(9, 27)) - << (QVariantList() << QTime(0, 0) << QTime(9, 27) << QTime(14, 39) << QTime(18, 18)); - - QTest::newRow("QDate") << (QVariantList() << QDate(2013, 3, 23) << QDate(1900, 12, 1) << QDate(2001, 2, 2) << QDate(1982, 12, 16)) - << (QVariantList() << QDate(1900, 12, 1) << QDate(1982, 12, 16) << QDate(2001, 2, 2) << QDate(2013, 3, 23)); - - QTest::newRow("mixed") << (QVariantList() << "Hello" << "World" << QChar('a') << 38 << QChar('z') << -39 << 4.6) - << (QVariantList() << -39 << 4.6 << 38 << QChar('a') << "Hello" << "World" << QChar('z')); - - QTest::newRow("custom") << (QVariantList() << QVariant::fromValue(CustomConvertibleType(1)) << QVariant::fromValue(CustomConvertibleType(100)) << QVariant::fromValue(CustomConvertibleType(50))) - << (QVariantList() << QVariant::fromValue(CustomConvertibleType(1)) << QVariant::fromValue(CustomConvertibleType(50)) << QVariant::fromValue(CustomConvertibleType(100))); -} - -void tst_QMetaType::compareCustomType() -{ - QFETCH(QVariantList, unsorted); - QFETCH(QVariantList, sorted); - std::sort(unsorted.begin(), unsorted.end()); - QCOMPARE(unsorted, sorted); -} - void tst_QMetaType::compareCustomEqualOnlyType() { int metaTypeId = qRegisterMetaType<CustomEqualsOnlyType>(); @@ -2487,11 +2450,6 @@ void tst_QMetaType::compareCustomEqualOnlyType() QCOMPARE(variant100, variant100x); QCOMPARE(variant100, variant100); - // compare always fails - QVERIFY(!(variant50 < variant50)); - QVERIFY(!(variant50 < variant100)); - QVERIFY(!(variant100 < variant50)); - // check QMetaType::compare works/doesn't crash for equals only comparators bool wasSuccess = QMetaType::compare(variant50.constData(), variant50.constData(), metaTypeId, &result); diff --git a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp index a805bfb747..91ea83be3d 100644 --- a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp +++ b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp @@ -81,9 +81,6 @@ private slots: void senderTest(); void declareInterface(); void qpointerResetBeforeDestroyedSignal(); -#ifndef QT_NO_USERDATA - void testUserData(); -#endif void childDeletesItsSibling(); void dynamicProperties(); void floatProperty(); @@ -463,7 +460,7 @@ void tst_QObject::connectSlotsByName() sender.setObjectName("Sender"); QTest::ignoreMessage(QtWarningMsg, "QMetaObject::connectSlotsByName: No matching signal for on_child_signal()"); - QTest::ignoreMessage(QtWarningMsg, "QMetaObject::connectSlotsByName: Connecting slot on_Sender_signalManyParams() with the first of the following compatible signals: (\"signalManyParams(int,int,int,QString,bool)\", \"signalManyParams(int,int,int,QString,bool,bool)\")"); + QTest::ignoreMessage(QtWarningMsg, "QMetaObject::connectSlotsByName: Connecting slot on_Sender_signalManyParams() with the first of the following compatible signals: QVector(\"signalManyParams(int,int,int,QString,bool)\", \"signalManyParams(int,int,int,QString,bool,bool)\")"); QMetaObject::connectSlotsByName(&receiver); receiver.called_slots.clear(); @@ -2341,51 +2338,6 @@ void tst_QObject::declareInterface() } -#ifndef QT_NO_USERDATA -class CustomData : public QObjectUserData -{ -public: - int id; -}; - -void tst_QObject::testUserData() -{ - const int USER_DATA_COUNT = 100; - int user_data_ids[USER_DATA_COUNT]; - - // Register a few - for (int i=0; i<USER_DATA_COUNT; ++i) { - user_data_ids[i] = QObject::registerUserData(); - } - - // Randomize the table a bit - for (int i=0; i<100; ++i) { - int p1 = QRandomGenerator::global()->bounded(USER_DATA_COUNT); - int p2 = QRandomGenerator::global()->bounded(USER_DATA_COUNT); - - int tmp = user_data_ids[p1]; - user_data_ids[p1] = user_data_ids[p2]; - user_data_ids[p2] = tmp; - } - - // insert the user data into an object - QObject my_test_object; - for (int i=0; i<USER_DATA_COUNT; ++i) { - CustomData *data = new CustomData; - data->id = user_data_ids[i]; - my_test_object.setUserData(data->id, data); - } - - // verify that all ids and positions are matching - for (int i=0; i<USER_DATA_COUNT; ++i) { - int id = user_data_ids[i]; - CustomData *data = static_cast<CustomData *>(my_test_object.userData(id)); - QVERIFY(data != nullptr); - QCOMPARE(data->id, id); - } -} -#endif // QT_NO_USERDATA - class DestroyedListener : public QObject { Q_OBJECT @@ -6974,8 +6926,7 @@ void tst_QObject::noDeclarativeParentChangedOnDestruction() QObject *parent = new QObject; QObject *child = new QObject; - QAbstractDeclarativeDataImpl dummy; - dummy.ownedByQml1 = false; + QAbstractDeclarativeData dummy; QObjectPrivate::get(child)->declarativeData = &dummy; parentChangeCalled = false; diff --git a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp index 45eb61f6e4..9f022b3b14 100644 --- a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp +++ b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp @@ -190,8 +190,6 @@ private slots: void operator_eq_eq_data(); void operator_eq_eq(); void operator_eq_eq_rhs(); - void compareNumbers_data() const; - void compareNumbers() const; void typeName_data(); void typeName(); @@ -270,9 +268,6 @@ private slots: void enums(); void metaEnums(); - void compareSanity_data(); - void compareSanity(); - void compareRich(); void nullConvert(); @@ -1730,344 +1725,6 @@ void tst_QVariant::operator_eq_eq_rhs() #endif } -void tst_QVariant::compareNumbers_data() const -{ - typedef signed char schar; - QTest::addColumn<QVariant>("v1"); - QTest::addColumn<QVariant>("v2"); - QTest::addColumn<int>("expected"); - - // sanity checking: same types - QTest::newRow("bool1") << QVariant(false) << QVariant(false) << 0; - QTest::newRow("bool2") << QVariant(true) << QVariant(true) << 0; - QTest::newRow("bool3") << QVariant(false) << QVariant(true) << -1; - QTest::newRow("bool4") << QVariant(true) << QVariant(false) << +1; - - QTest::newRow("char1") << QVariant::fromValue(char(0)) << QVariant::fromValue(char(0)) << 0; - QTest::newRow("char2") << QVariant::fromValue(CHAR_MAX) << QVariant::fromValue(CHAR_MAX) << 0; - QTest::newRow("char3") << QVariant::fromValue(CHAR_MIN) << QVariant::fromValue(CHAR_MIN) << 0; - QTest::newRow("char4") << QVariant::fromValue(CHAR_MIN) << QVariant::fromValue(CHAR_MAX) << -1; - QTest::newRow("char5") << QVariant::fromValue(CHAR_MAX) << QVariant::fromValue(CHAR_MIN) << +1; - - QTest::newRow("schar1") << QVariant::fromValue(schar(0)) << QVariant::fromValue(schar(0)) << 0; - QTest::newRow("schar2") << QVariant::fromValue(SCHAR_MAX) << QVariant::fromValue(SCHAR_MAX) << 0; - QTest::newRow("schar3") << QVariant::fromValue(SCHAR_MIN) << QVariant::fromValue(SCHAR_MIN) << 0; - QTest::newRow("schar4") << QVariant::fromValue(SCHAR_MIN) << QVariant::fromValue(SCHAR_MAX) << -1; - QTest::newRow("schar5") << QVariant::fromValue(SCHAR_MAX) << QVariant::fromValue(SCHAR_MIN) << +1; - - QTest::newRow("uchar1") << QVariant::fromValue(uchar(0)) << QVariant::fromValue(uchar(0)) << 0; - QTest::newRow("uchar2") << QVariant::fromValue(UCHAR_MAX) << QVariant::fromValue(UCHAR_MAX) << 0; - QTest::newRow("uchar3") << QVariant::fromValue(uchar(0)) << QVariant::fromValue(UCHAR_MAX) << -1; - QTest::newRow("uchar4") << QVariant::fromValue(UCHAR_MAX) << QVariant::fromValue(uchar(0)) << +1; - - QTest::newRow("short1") << QVariant::fromValue(short(0)) << QVariant::fromValue(short(0)) << 0; - QTest::newRow("short2") << QVariant::fromValue(SHRT_MAX) << QVariant::fromValue(SHRT_MAX) << 0; - QTest::newRow("short3") << QVariant::fromValue(SHRT_MIN) << QVariant::fromValue(SHRT_MIN) << 0; - QTest::newRow("short4") << QVariant::fromValue(SHRT_MIN) << QVariant::fromValue(SHRT_MAX) << -1; - QTest::newRow("short5") << QVariant::fromValue(SHRT_MAX) << QVariant::fromValue(SHRT_MIN) << +1; - - QTest::newRow("ushort1") << QVariant::fromValue(ushort(0)) << QVariant::fromValue(ushort(0)) << 0; - QTest::newRow("ushort2") << QVariant::fromValue(USHRT_MAX) << QVariant::fromValue(USHRT_MAX) << 0; - QTest::newRow("ushort3") << QVariant::fromValue(ushort(0)) << QVariant::fromValue(USHRT_MAX) << -1; - QTest::newRow("ushort4") << QVariant::fromValue(USHRT_MAX) << QVariant::fromValue(ushort(0)) << +1; - - QTest::newRow("int1") << QVariant::fromValue(int(0)) << QVariant::fromValue(int(0)) << 0; - QTest::newRow("int2") << QVariant::fromValue(INT_MAX) << QVariant::fromValue(INT_MAX) << 0; - QTest::newRow("int3") << QVariant::fromValue(INT_MIN) << QVariant::fromValue(INT_MIN) << 0; - QTest::newRow("int4") << QVariant::fromValue(INT_MIN) << QVariant::fromValue(INT_MAX) << -1; - QTest::newRow("int5") << QVariant::fromValue(INT_MAX) << QVariant::fromValue(INT_MIN) << +1; - - QTest::newRow("uint1") << QVariant::fromValue(uint(0)) << QVariant::fromValue(uint(0)) << 0; - QTest::newRow("uint2") << QVariant::fromValue(UINT_MAX) << QVariant::fromValue(UINT_MAX) << 0; - QTest::newRow("uint3") << QVariant::fromValue(uint(0)) << QVariant::fromValue(UINT_MAX) << -1; - QTest::newRow("uint4") << QVariant::fromValue(UINT_MAX) << QVariant::fromValue(uint(0)) << +1; - - QTest::newRow("long1") << QVariant::fromValue(long(0)) << QVariant::fromValue(long(0)) << 0; - QTest::newRow("long2") << QVariant::fromValue(LONG_MAX) << QVariant::fromValue(LONG_MAX) << 0; - QTest::newRow("long3") << QVariant::fromValue(LONG_MIN) << QVariant::fromValue(LONG_MIN) << 0; - QTest::newRow("long4") << QVariant::fromValue(LONG_MIN) << QVariant::fromValue(LONG_MAX) << -1; - QTest::newRow("long5") << QVariant::fromValue(LONG_MAX) << QVariant::fromValue(LONG_MIN) << +1; - - QTest::newRow("ulong1") << QVariant::fromValue(ulong(0)) << QVariant::fromValue(ulong(0)) << 0; - QTest::newRow("ulong2") << QVariant::fromValue(ULONG_MAX) << QVariant::fromValue(ULONG_MAX) << 0; - QTest::newRow("ulong3") << QVariant::fromValue(ulong(0)) << QVariant::fromValue(ULONG_MAX) << -1; - QTest::newRow("ulong4") << QVariant::fromValue(ULONG_MAX) << QVariant::fromValue(ulong(0)) << +1; - - QTest::newRow("llong1") << QVariant::fromValue(qlonglong(0)) << QVariant::fromValue(qlonglong(0)) << 0; - QTest::newRow("llong2") << QVariant::fromValue(LLONG_MAX) << QVariant::fromValue(LLONG_MAX) << 0; - QTest::newRow("llong3") << QVariant::fromValue(LLONG_MIN) << QVariant::fromValue(LLONG_MIN) << 0; - QTest::newRow("llong4") << QVariant::fromValue(LLONG_MIN) << QVariant::fromValue(LLONG_MAX) << -1; - QTest::newRow("llong5") << QVariant::fromValue(LLONG_MAX) << QVariant::fromValue(LLONG_MIN) << +1; - - QTest::newRow("ullong1") << QVariant::fromValue(qulonglong(0)) << QVariant::fromValue(qulonglong(0)) << 0; - QTest::newRow("ullong2") << QVariant::fromValue(ULLONG_MAX) << QVariant::fromValue(ULLONG_MAX) << 0; - QTest::newRow("ullong3") << QVariant::fromValue(qulonglong(0)) << QVariant::fromValue(ULLONG_MAX) << -1; - QTest::newRow("ullong4") << QVariant::fromValue(ULLONG_MAX) << QVariant::fromValue(qulonglong(0)) << +1; - - QTest::newRow("float1") << QVariant::fromValue(0.f) << QVariant::fromValue(0.f) << 0; - QTest::newRow("float2") << QVariant::fromValue(-1.f) << QVariant::fromValue(0.f) << -1; - QTest::newRow("float3") << QVariant::fromValue(0.f) << QVariant::fromValue(-1.f) << +1; - QTest::newRow("float4") << QVariant::fromValue(-float(qInf())) << QVariant::fromValue(0.f) << -1; - QTest::newRow("float5") << QVariant::fromValue(0.f) << QVariant::fromValue(-float(qInf())) << +1; - QTest::newRow("float6") << QVariant::fromValue(-float(qInf())) << QVariant::fromValue(-float(qInf())) << 0; - QTest::newRow("float7") << QVariant::fromValue(float(qInf())) << QVariant::fromValue(float(qInf())) << 0; - - QTest::newRow("double1") << QVariant::fromValue(0.) << QVariant::fromValue(0.) << 0; - QTest::newRow("double2") << QVariant::fromValue(-1.) << QVariant::fromValue(0.) << -1; - QTest::newRow("double3") << QVariant::fromValue(0.) << QVariant::fromValue(-1.) << +1; - QTest::newRow("double4") << QVariant::fromValue(-qInf()) << QVariant::fromValue(0.) << -1; - QTest::newRow("double5") << QVariant::fromValue(0.) << QVariant::fromValue(-qInf()) << +1; - QTest::newRow("double6") << QVariant::fromValue(-double(qInf())) << QVariant::fromValue(-qInf()) << 0; - QTest::newRow("double7") << QVariant::fromValue(qInf()) << QVariant::fromValue(qInf()) << 0; - QTest::newRow("double8") << QVariant::fromValue(-qInf()) << QVariant::fromValue(qInf()) << -1; - QTest::newRow("double9") << QVariant::fromValue(qQNaN()) << QVariant::fromValue(0.) << INT_MAX; - QTest::newRow("double10") << QVariant::fromValue(0.) << QVariant::fromValue(qQNaN()) << INT_MAX; - QTest::newRow("double11") << QVariant::fromValue(qQNaN()) << QVariant::fromValue(qQNaN()) << INT_MAX; - - // mixed comparisons - // fp + fp - QTest::newRow("float+double1") << QVariant::fromValue(0.f) << QVariant::fromValue(0.) << 0; - QTest::newRow("float+double2") << QVariant::fromValue(-1.f) << QVariant::fromValue(0.) << -1; - QTest::newRow("float+double3") << QVariant::fromValue(0.f) << QVariant::fromValue(-1.) << +1; - QTest::newRow("float+double4") << QVariant::fromValue(-float(qInf())) << QVariant::fromValue(0.) << -1; - QTest::newRow("float+double5") << QVariant::fromValue(0.f) << QVariant::fromValue(-qInf()) << +1; - QTest::newRow("float+double6") << QVariant::fromValue(-float(qInf())) << QVariant::fromValue(-qInf()) << 0; - QTest::newRow("float+double7") << QVariant::fromValue(float(qInf())) << QVariant::fromValue(qInf()) << 0; - QTest::newRow("float+double8") << QVariant::fromValue(-float(qInf())) << QVariant::fromValue(qInf()) << -1; - QTest::newRow("float+double9") << QVariant::fromValue(qQNaN()) << QVariant::fromValue(0.) << INT_MAX; - QTest::newRow("float+double10") << QVariant::fromValue(0.) << QVariant::fromValue(qQNaN()) << INT_MAX; - QTest::newRow("float+double11") << QVariant::fromValue(qQNaN()) << QVariant::fromValue(qQNaN()) << INT_MAX; - - // fp + int - QTest::newRow("float+int1") << QVariant::fromValue(0.f) << QVariant::fromValue(0) << 0; - QTest::newRow("double+int1") << QVariant::fromValue(0.) << QVariant::fromValue(0) << 0; - QTest::newRow("float+int2") << QVariant::fromValue(-1.f) << QVariant::fromValue(0) << -1; - QTest::newRow("double+int2") << QVariant::fromValue(-1.) << QVariant::fromValue(0) << -1; - QTest::newRow("float+int3") << QVariant::fromValue(0.f) << QVariant::fromValue(-1) << +1; - QTest::newRow("double+int3") << QVariant::fromValue(0.) << QVariant::fromValue(-1) << +1; - QTest::newRow("float+int4") << QVariant::fromValue(1.5f) << QVariant::fromValue(1) << +1; - QTest::newRow("double+int4") << QVariant::fromValue(1.5) << QVariant::fromValue(1) << +1; - QTest::newRow("double+int5") << QVariant::fromValue(qInf()) << QVariant::fromValue(1) << +1; - - // fp + uint - QTest::newRow("float+uint1") << QVariant::fromValue(0.f) << QVariant::fromValue(0U) << 0; - QTest::newRow("double+uint1") << QVariant::fromValue(0.) << QVariant::fromValue(0U) << 0; - QTest::newRow("float+uint2") << QVariant::fromValue(-1.f) << QVariant::fromValue(0U) << -1; - QTest::newRow("double+uint2") << QVariant::fromValue(-1.) << QVariant::fromValue(0U) << -1; - QTest::newRow("float+uint3") << QVariant::fromValue(0.f) << QVariant::fromValue(1U) << -1; - QTest::newRow("double+uint3") << QVariant::fromValue(0.) << QVariant::fromValue(1U) << -1; - QTest::newRow("float+uint4") << QVariant::fromValue(1.5f) << QVariant::fromValue(1U) << +1; - QTest::newRow("double+uint4") << QVariant::fromValue(1.5) << QVariant::fromValue(1U) << +1; - - // lower ranked + int - QTest::newRow("bool+int1") << QVariant::fromValue(false) << QVariant::fromValue(0) << 0; - QTest::newRow("bool+int2") << QVariant::fromValue(false) << QVariant::fromValue(1) << -1; - QTest::newRow("bool+int3") << QVariant::fromValue(true) << QVariant::fromValue(0) << +1; - QTest::newRow("bool+int4") << QVariant::fromValue(true) << QVariant::fromValue(1) << 0; - QTest::newRow("bool+int5") << QVariant::fromValue(true) << QVariant::fromValue(2) << -1; - - QTest::newRow("char+int1") << QVariant::fromValue(char(0)) << QVariant::fromValue(0) << 0; - QTest::newRow("char+int2") << QVariant::fromValue(char(0)) << QVariant::fromValue(1) << -1; - QTest::newRow("char+int3") << QVariant::fromValue(char(1)) << QVariant::fromValue(0) << +1; - QTest::newRow("char+int4") << QVariant::fromValue(char(1)) << QVariant::fromValue(1) << 0; - if (std::numeric_limits<char>::is_signed) { - QTest::newRow("char+int5") << QVariant::fromValue(char(-1)) << QVariant::fromValue(0) << -1; - QTest::newRow("char+int6") << QVariant::fromValue(char(-1)) << QVariant::fromValue(-1) << 0; - } - - QTest::newRow("schar+int1") << QVariant::fromValue(schar(0)) << QVariant::fromValue(0) << 0; - QTest::newRow("schar+int2") << QVariant::fromValue(schar(0)) << QVariant::fromValue(1) << -1; - QTest::newRow("schar+int3") << QVariant::fromValue(schar(1)) << QVariant::fromValue(0) << +1; - QTest::newRow("schar+int4") << QVariant::fromValue(schar(1)) << QVariant::fromValue(1) << 0; - QTest::newRow("schar+int5") << QVariant::fromValue(schar(-1)) << QVariant::fromValue(0) << -1; - QTest::newRow("schar+int6") << QVariant::fromValue(schar(-1)) << QVariant::fromValue(-1) << 0; - - QTest::newRow("uchar+int1") << QVariant::fromValue(uchar(0)) << QVariant::fromValue(0) << 0; - QTest::newRow("uchar+int2") << QVariant::fromValue(uchar(0)) << QVariant::fromValue(1) << -1; - QTest::newRow("uchar+int3") << QVariant::fromValue(uchar(1)) << QVariant::fromValue(0) << +1; - QTest::newRow("uchar+int4") << QVariant::fromValue(uchar(1)) << QVariant::fromValue(1) << 0; - - QTest::newRow("short+int1") << QVariant::fromValue(short(0)) << QVariant::fromValue(0) << 0; - QTest::newRow("short+int2") << QVariant::fromValue(short(0)) << QVariant::fromValue(1) << -1; - QTest::newRow("short+int3") << QVariant::fromValue(short(1)) << QVariant::fromValue(0) << +1; - QTest::newRow("short+int4") << QVariant::fromValue(short(1)) << QVariant::fromValue(1) << 0; - QTest::newRow("short+int5") << QVariant::fromValue(short(-1)) << QVariant::fromValue(0) << -1; - QTest::newRow("short+int6") << QVariant::fromValue(short(-1)) << QVariant::fromValue(-1) << 0; - - QTest::newRow("ushort+int1") << QVariant::fromValue(ushort(0)) << QVariant::fromValue(0) << 0; - QTest::newRow("ushort+int2") << QVariant::fromValue(ushort(0)) << QVariant::fromValue(1) << -1; - QTest::newRow("ushort+int3") << QVariant::fromValue(ushort(1)) << QVariant::fromValue(0) << +1; - QTest::newRow("ushort+int4") << QVariant::fromValue(ushort(1)) << QVariant::fromValue(1) << 0; - - // lower ranked + uint (without sign change) - QTest::newRow("bool+uint1") << QVariant::fromValue(false) << QVariant::fromValue(0U) << 0; - QTest::newRow("bool+uint2") << QVariant::fromValue(false) << QVariant::fromValue(1U) << -1; - QTest::newRow("bool+uint3") << QVariant::fromValue(true) << QVariant::fromValue(0U) << +1; - QTest::newRow("bool+uint4") << QVariant::fromValue(true) << QVariant::fromValue(1U) << 0; - QTest::newRow("bool+uint5") << QVariant::fromValue(true) << QVariant::fromValue(2U) << -1; - - QTest::newRow("char+uint1") << QVariant::fromValue(char(0)) << QVariant::fromValue(0U) << 0; - QTest::newRow("char+uint2") << QVariant::fromValue(char(0)) << QVariant::fromValue(1U) << -1; - QTest::newRow("char+uint3") << QVariant::fromValue(char(1)) << QVariant::fromValue(0U) << +1; - QTest::newRow("char+uint4") << QVariant::fromValue(char(1)) << QVariant::fromValue(1U) << 0; - - QTest::newRow("schar+uint1") << QVariant::fromValue(schar(0)) << QVariant::fromValue(0U) << 0; - QTest::newRow("schar+uint2") << QVariant::fromValue(schar(0)) << QVariant::fromValue(1U) << -1; - QTest::newRow("schar+uint3") << QVariant::fromValue(schar(1)) << QVariant::fromValue(0U) << +1; - QTest::newRow("schar+uint4") << QVariant::fromValue(schar(1)) << QVariant::fromValue(1U) << 0; - - QTest::newRow("uchar+uint1") << QVariant::fromValue(uchar(0)) << QVariant::fromValue(0U) << 0; - QTest::newRow("uchar+uint2") << QVariant::fromValue(uchar(0)) << QVariant::fromValue(1U) << -1; - QTest::newRow("uchar+uint3") << QVariant::fromValue(uchar(1)) << QVariant::fromValue(0U) << +1; - QTest::newRow("uchar+uint4") << QVariant::fromValue(uchar(1)) << QVariant::fromValue(1U) << 0; - - QTest::newRow("short+uint1") << QVariant::fromValue(short(0)) << QVariant::fromValue(0U) << 0; - QTest::newRow("short+uint2") << QVariant::fromValue(short(0)) << QVariant::fromValue(1U) << -1; - QTest::newRow("short+uint3") << QVariant::fromValue(short(1)) << QVariant::fromValue(0U) << +1; - QTest::newRow("short+uint4") << QVariant::fromValue(short(1)) << QVariant::fromValue(1U) << 0; - - QTest::newRow("ushort+uint1") << QVariant::fromValue(ushort(0)) << QVariant::fromValue(0U) << 0; - QTest::newRow("ushort+uint2") << QVariant::fromValue(ushort(0)) << QVariant::fromValue(1U) << -1; - QTest::newRow("ushort+uint3") << QVariant::fromValue(ushort(1)) << QVariant::fromValue(0U) << +1; - QTest::newRow("ushort+uint4") << QVariant::fromValue(ushort(1)) << QVariant::fromValue(1U) << 0; - - // int + qlonglong - QTest::newRow("int+qlonglong1") << QVariant::fromValue(0) << QVariant::fromValue(Q_INT64_C(0)) << 0; - QTest::newRow("int+qlonglong2") << QVariant::fromValue(1) << QVariant::fromValue(Q_INT64_C(0)) << +1; - QTest::newRow("int+qlonglong3") << QVariant::fromValue(0) << QVariant::fromValue(Q_INT64_C(1)) << -1; - QTest::newRow("int+qlonglong4") << QVariant::fromValue(1) << QVariant::fromValue(Q_INT64_C(1)) << 0; - QTest::newRow("int+qlonglong5") << QVariant::fromValue(0) << QVariant::fromValue(Q_INT64_C(-1)) << +1; - QTest::newRow("int+qlonglong6") << QVariant::fromValue(-1) << QVariant::fromValue(Q_INT64_C(0)) << -1; - QTest::newRow("int+qlonglong7") << QVariant::fromValue(-1) << QVariant::fromValue(Q_INT64_C(-1)) << 0; - - // uint + qulonglong - QTest::newRow("uint+qulonglong1") << QVariant::fromValue(0U) << QVariant::fromValue(Q_UINT64_C(0)) << 0; - QTest::newRow("uint+qulonglong2") << QVariant::fromValue(1U) << QVariant::fromValue(Q_UINT64_C(0)) << +1; - QTest::newRow("uint+qulonglong3") << QVariant::fromValue(0U) << QVariant::fromValue(Q_UINT64_C(1)) << -1; - QTest::newRow("uint+qulonglong4") << QVariant::fromValue(1U) << QVariant::fromValue(Q_UINT64_C(1)) << 0; - - // int + uint (without sign change) - QTest::newRow("int+uint1") << QVariant::fromValue(0) << QVariant::fromValue(0U) << 0; - QTest::newRow("int+uint2") << QVariant::fromValue(1) << QVariant::fromValue(0U) << +1; - QTest::newRow("int+uint3") << QVariant::fromValue(0) << QVariant::fromValue(1U) << -1; - QTest::newRow("int+uint4") << QVariant::fromValue(1) << QVariant::fromValue(1U) << 0; - - // uint + qlonglong - QTest::newRow("uint+qlonglong1") << QVariant::fromValue(0U) << QVariant::fromValue(Q_INT64_C(0)) << 0; - QTest::newRow("uint+qlonglong2") << QVariant::fromValue(1U) << QVariant::fromValue(Q_INT64_C(0)) << +1; - QTest::newRow("uint+qlonglong3") << QVariant::fromValue(0U) << QVariant::fromValue(Q_INT64_C(1)) << -1; - QTest::newRow("uint+qlonglong4") << QVariant::fromValue(1U) << QVariant::fromValue(Q_INT64_C(1)) << 0; - QTest::newRow("uint+qlonglong5") << QVariant::fromValue(0U) << QVariant::fromValue(Q_INT64_C(-1)) << +1; - - // boundary conditions - QTest::newRow("charmax+intmax") << QVariant::fromValue(CHAR_MAX) << QVariant::fromValue(INT_MAX) << -1; - QTest::newRow("charmax+uintmax") << QVariant::fromValue(CHAR_MAX) << QVariant::fromValue(UINT_MAX) << -1; - QTest::newRow("scharmax+intmax") << QVariant::fromValue(SCHAR_MAX) << QVariant::fromValue(INT_MAX) << -1; - QTest::newRow("scharmax+uintmax") << QVariant::fromValue(SCHAR_MAX) << QVariant::fromValue(UINT_MAX) << -1; - QTest::newRow("ucharmax+intmax") << QVariant::fromValue(UCHAR_MAX) << QVariant::fromValue(INT_MAX) << -1; - QTest::newRow("ucharmax+uintmax") << QVariant::fromValue(UCHAR_MAX) << QVariant::fromValue(UINT_MAX) << -1; - QTest::newRow("shortmax+intmax") << QVariant::fromValue(SHRT_MAX) << QVariant::fromValue(INT_MAX) << -1; - QTest::newRow("shortmax+uintmax") << QVariant::fromValue(SHRT_MAX) << QVariant::fromValue(UINT_MAX) << -1; - QTest::newRow("ushortmax+intmax") << QVariant::fromValue(USHRT_MAX) << QVariant::fromValue(INT_MAX) << -1; - QTest::newRow("ushortmax+uintmax") << QVariant::fromValue(USHRT_MAX) << QVariant::fromValue(UINT_MAX) << -1; - - QTest::newRow("intmin+qlonglongmin") << QVariant::fromValue(INT_MIN) << QVariant::fromValue(LLONG_MIN) << +1; - QTest::newRow("intmax+uintmax") << QVariant::fromValue(INT_MAX) << QVariant::fromValue(UINT_MAX) << -1; - QTest::newRow("intmax+qlonglongmax") << QVariant::fromValue(INT_MAX) << QVariant::fromValue(LLONG_MAX) << -1; - QTest::newRow("uintmax+qlonglongmax") << QVariant::fromValue(UINT_MAX) << QVariant::fromValue(LLONG_MAX) << -1; - QTest::newRow("intmax+qulonglongmax") << QVariant::fromValue(INT_MAX) << QVariant::fromValue(ULLONG_MAX) << -1; - QTest::newRow("qlonglongmax+qulonglongmax") << QVariant::fromValue(LLONG_MAX) << QVariant::fromValue(ULLONG_MAX) << -1; - QTest::newRow("uintmax+qlonglongmin") << QVariant::fromValue(UINT_MAX) << QVariant::fromValue(LLONG_MIN) << +1; - - // check for no sign-extension issues - QTest::newRow("ushortmax+intzero") << QVariant::fromValue(USHRT_MAX) << QVariant::fromValue(0) << +1; - QTest::newRow("ushortmax+qlonglongzero") << QVariant::fromValue(USHRT_MAX) << QVariant::fromValue(Q_INT64_C(0)) << +1; - QTest::newRow("uintmax+qlonglongzero") << QVariant::fromValue(UINT_MAX) << QVariant::fromValue(Q_INT64_C(0)) << +1; - - // sign changes - // the tests below check that a signed negative number sign-changes to a non-zero unsigned number and that - // signed -1 sign-changes to unsigned maximum (all bits set, ~0). This works on two's complement machines - // (all that Qt supports), and would also work on one's complement. - if (std::numeric_limits<char>::is_signed) { - QTest::newRow("signchange-char+uint") << QVariant::fromValue(char(-1)) << QVariant::fromValue(0U) << +1; - QTest::newRow("signchange-char+uintmax") << QVariant::fromValue(char(-1)) << QVariant::fromValue(UINT_MAX) << 0; - QTest::newRow("signchange-charmin+uint") << QVariant::fromValue(CHAR_MIN) << QVariant::fromValue(0U) << +1; - QTest::newRow("signchange-char+qulonglong") << QVariant::fromValue(char(-1)) << QVariant::fromValue(Q_UINT64_C(0)) << +1; - QTest::newRow("signchange-char+qulonglongmax") << QVariant::fromValue(char(-1)) << QVariant::fromValue(ULLONG_MAX) << 0; - QTest::newRow("signchange-charmin+qulonglong") << QVariant::fromValue(CHAR_MIN) << QVariant::fromValue(Q_UINT64_C(0)) << +1; - } - QTest::newRow("signchange-schar+uint") << QVariant::fromValue(schar(-1)) << QVariant::fromValue(0U) << +1; - QTest::newRow("signchange-schar+uintmax") << QVariant::fromValue(schar(-1)) << QVariant::fromValue(UINT_MAX) << 0; - QTest::newRow("signchange-scharmin+uint") << QVariant::fromValue(SCHAR_MIN) << QVariant::fromValue(0U) << +1; - QTest::newRow("signchange-schar+qulonglong") << QVariant::fromValue(schar(-1)) << QVariant::fromValue(Q_UINT64_C(0)) << +1; - QTest::newRow("signchange-schar+qulonglongmax") << QVariant::fromValue(schar(-1)) << QVariant::fromValue(ULLONG_MAX) << 0; - QTest::newRow("signchange-scharmin+qulonglong") << QVariant::fromValue(SCHAR_MIN) << QVariant::fromValue(Q_UINT64_C(0)) << +1; - QTest::newRow("signchange-short+uint") << QVariant::fromValue(short(-1)) << QVariant::fromValue(0U) << +1; - QTest::newRow("signchange-short+uintmax") << QVariant::fromValue(short(-1)) << QVariant::fromValue(UINT_MAX) << 0; - QTest::newRow("signchange-shortmin+uint") << QVariant::fromValue(SHRT_MIN) << QVariant::fromValue(0U) << +1; - QTest::newRow("signchange-short+qulonglong") << QVariant::fromValue(short(-1)) << QVariant::fromValue(Q_UINT64_C(0)) << +1; - QTest::newRow("signchange-short+qulonglongmax") << QVariant::fromValue(short(-1)) << QVariant::fromValue(ULLONG_MAX) << 0; - QTest::newRow("signchange-shortmin+qulonglong") << QVariant::fromValue(SHRT_MIN) << QVariant::fromValue(Q_UINT64_C(0)) << +1; - QTest::newRow("signchange-int+uint") << QVariant::fromValue(-1) << QVariant::fromValue(0U) << +1; - QTest::newRow("signchange-int+uintmax") << QVariant::fromValue(-1) << QVariant::fromValue(UINT_MAX) << 0; - QTest::newRow("signchange-intmin+uint") << QVariant::fromValue(INT_MIN) << QVariant::fromValue(0U) << +1; - QTest::newRow("signchange-int+qulonglong") << QVariant::fromValue(-1) << QVariant::fromValue(Q_UINT64_C(0)) << +1; - QTest::newRow("signchange-int+qulonglongmax") << QVariant::fromValue(-1) << QVariant::fromValue(ULLONG_MAX) << 0; - QTest::newRow("signchange-intmin+qulonglong") << QVariant::fromValue(INT_MIN) << QVariant::fromValue(Q_UINT64_C(0)) << +1; - // no qlonglong+uint, since that should promote to qlonglong and then the comparison is signed (tested above) - QTest::newRow("signchange-qlonglong+qulonglong") << QVariant::fromValue(Q_INT64_C(-1)) << QVariant::fromValue(Q_UINT64_C(0)) << +1; - QTest::newRow("signchange-qlonglong+qulonglongmax") << QVariant::fromValue(Q_INT64_C(-1)) << QVariant::fromValue(ULLONG_MAX) << 0; - QTest::newRow("signchange-qlonglongmin+qulonglong") << QVariant::fromValue(LLONG_MIN) << QVariant::fromValue(Q_UINT64_C(0)) << +1; -} - -void tst_QVariant::compareNumbers() const -{ - QFETCH(QVariant, v1); - QFETCH(QVariant, v2); - QFETCH(int, expected); - - if (expected == -1) { - QVERIFY(v1 < v2); - QVERIFY(v1 <= v2); - QVERIFY(!(v1 == v2)); - QVERIFY(!(v1 > v2)); - QVERIFY(!(v1 >= v2)); - - QVERIFY(!(v2 < v1)); - QVERIFY(!(v2 <= v1)); - QVERIFY(!(v2 == v1)); - QVERIFY(v2 >= v1); - QVERIFY(v2 > v1); - } else if (expected == 0) { - QVERIFY(!(v1 < v2)); - QVERIFY(v1 <= v2); - QCOMPARE(v1, v2); - QVERIFY(!(v1 > v2)); - QVERIFY(v1 >= v2); - - QVERIFY(!(v2 < v1)); - QVERIFY(v2 <= v1); - QCOMPARE(v2, v1); - QVERIFY(v2 >= v1); - QVERIFY(!(v2 > v1)); - } else if (expected == +1) { - QVERIFY(!(v1 < v2)); - QVERIFY(!(v1 <= v2)); - QVERIFY(!(v1 == v2)); - QVERIFY(v1 > v2); - QVERIFY(v1 >= v2); - - QVERIFY(v2 < v1); - QVERIFY(v2 <= v1); - QVERIFY(!(v2 == v1)); - QVERIFY(!(v2 >= v1)); - QVERIFY(!(v2 > v1)); - } else { - // unorderable (NaN) - QVERIFY(!(v1 == v2)); - } -} - void tst_QVariant::typeName_data() { QTest::addColumn<int>("type"); @@ -3961,8 +3618,7 @@ Q_DECLARE_METATYPE(Convertible); struct BigConvertible { double d; - double dummy; - double dummy2; + double dummy[sizeof(QVariant) / sizeof(double)]; operator int() const { return (int)d; } operator double() const { return d; } operator QString() const { return QString::number(d); } @@ -4863,86 +4519,6 @@ void tst_QVariant::metaEnums() METAENUMS_TEST(MetaEnumTest_Enum8_value); } -void tst_QVariant::compareSanity_data() -{ - QTest::addColumn<QVariant>("value1"); - QTest::addColumn<QVariant>("value2"); - - QTest::newRow( "int <>/== QUrl" ) << QVariant( 97 ) << QVariant(QUrl("a")); - QTest::newRow( "int <>/== QChar" ) << QVariant( 97 ) << QVariant(QChar('a')); - QTest::newRow( "int <>/== QString" ) << QVariant( 97 ) << QVariant(QString("a")); - QTest::newRow( "QUrl <>/== QChar" ) << QVariant(QUrl("a")) << QVariant(QChar('a')); - QTest::newRow( "QUrl <>/== QString" ) << QVariant(QUrl("a")) << QVariant(QString("a")); - QTest::newRow( "QChar <>/== QString" ) << QVariant(QChar('a')) << QVariant(QString("a")); -} - -void tst_QVariant::compareSanity() -{ - QFETCH(QVariant, value1); - QFETCH(QVariant, value2); - - if (value1 == value2) { - QVERIFY(!(value1 < value2) && !(value1 > value2)); - } else { - QVERIFY(value1 != value2); - QVERIFY((value1 < value2) || (value1 > value2)); - } -} - -static void richComparison(const QVariant& less, const QVariant& more) -{ - QVERIFY(less.type() == more.type()); - - QVERIFY(less < more); - QVERIFY(!(more < less)); - - QVERIFY(more > less); - QVERIFY(!(less > more)); - - QVERIFY(less <= more); - QVERIFY(!(more <= less)); - QVERIFY(less <= less); - - QVERIFY(more >= less); - QVERIFY(!(less >= more)); - QVERIFY(more >= more); -} - -void tst_QVariant::compareRich() -{ - richComparison(QUuid("{49d8ad2a-2ee8-4c3d-949f-1b5a3765ddf0}"), - QUuid("{f6d56824-16e9-4543-a375-add2877c2d05}")); - richComparison(QByteArray::fromRawData("a", 1), - QByteArray::fromRawData("b", 1)); - richComparison(QStringLiteral("a"), QStringLiteral("b")); - richComparison(QLatin1String("a"), QLatin1String("b")); - richComparison(QChar('a'), QChar('b')); - richComparison(QDate(2016, 7, 23), QDate(2016, 7, 24)); - richComparison(QTime(0, 0), QTime(0, 1)); - richComparison(QDateTime(QDate(2016, 7, 23), QTime(0, 0)), - QDateTime(QDate(2016, 7, 23), QTime(0, 1))); - - richComparison(QStringList(), QStringList() << QStringLiteral("a")); - richComparison(QStringList(), QStringList() << QStringLiteral("a") - << QStringLiteral("b")); - richComparison(QStringList() << QStringLiteral("a"), - QStringList() << QStringLiteral("b")); - richComparison(QStringList() << QStringLiteral("a"), - QStringList() << QStringLiteral("b") - << QStringLiteral("c")); - richComparison(QStringList() << QStringLiteral("a") - << QStringLiteral("c"), - QStringList() << QStringLiteral("b")); - richComparison(QStringList() << QStringLiteral("a") - << QStringLiteral("c"), - QStringList() << QStringLiteral("b") - << QStringLiteral("d")); - richComparison(QStringList() << QStringLiteral("a") - << QStringLiteral("c"), - QStringList() << QStringLiteral("a") - << QStringLiteral("d")); -} - void tst_QVariant::nullConvert() { // Test quirks with QVariants different types of null states. diff --git a/tests/auto/corelib/serialization/json/tst_qtjson.cpp b/tests/auto/corelib/serialization/json/tst_qtjson.cpp index 45f815f810..4c85482c6a 100644 --- a/tests/auto/corelib/serialization/json/tst_qtjson.cpp +++ b/tests/auto/corelib/serialization/json/tst_qtjson.cpp @@ -52,6 +52,8 @@ private Q_SLOTS: void testNumbers_3(); void testNumbers_4(); + void testNumberComparisons(); + void testObjectSimple(); void testObjectSmallKeys(); void testArraySimple(); @@ -218,26 +220,32 @@ void tst_QtJson::testNumbers() { int numbers[] = { 0, - -1, 1, + 2, + -1, + -2, + (1<<25), (1<<26), (1<<27), (1<<28), + -(1<<25), -(1<<26), -(1<<27), -(1<<28), (1<<26) - 1, (1<<27) - 1, (1<<28) - 1, + (1<<29) - 1, -((1<<26) - 1), -((1<<27) - 1), - -((1<<28) - 1) + -((1<<28) - 1), + -((1<<29) - 1) }; int n = sizeof(numbers)/sizeof(int); QJsonArray array; for (int i = 0; i < n; ++i) - array.append((double)numbers[i]); + array.append(numbers[i]); QByteArray serialized = QJsonDocument(array).toJson(); QJsonDocument json = QJsonDocument::fromJson(serialized); @@ -246,8 +254,10 @@ void tst_QtJson::testNumbers() QCOMPARE(array.size(), array2.size()); for (int i = 0; i < array.size(); ++i) { QCOMPARE(array.at(i).type(), QJsonValue::Double); + QCOMPARE(array.at(i).toInt(), numbers[i]); QCOMPARE(array.at(i).toDouble(), (double)numbers[i]); QCOMPARE(array2.at(i).type(), QJsonValue::Double); + QCOMPARE(array2.at(i).toInt(), numbers[i]); QCOMPARE(array2.at(i).toDouble(), (double)numbers[i]); } } @@ -255,8 +265,10 @@ void tst_QtJson::testNumbers() { qint64 numbers[] = { 0, - -1, 1, + 2, + -1, + -2, (1ll<<54), (1ll<<55), (1ll<<56), @@ -266,15 +278,21 @@ void tst_QtJson::testNumbers() (1ll<<54) - 1, (1ll<<55) - 1, (1ll<<56) - 1, + (1ll<<57) - 1, + (1ll<<58) - 1, + (1ll<<59) + 1001, -((1ll<<54) - 1), -((1ll<<55) - 1), - -((1ll<<56) - 1) + -((1ll<<56) - 1), + -((1ll<<57) - 1), + -((1ll<<58) - 1), + -((1ll<<59) + 1001), }; int n = sizeof(numbers)/sizeof(qint64); QJsonArray array; for (int i = 0; i < n; ++i) - array.append((double)numbers[i]); + array.append(QJsonValue(numbers[i])); QByteArray serialized = QJsonDocument(array).toJson(); QJsonDocument json = QJsonDocument::fromJson(serialized); @@ -283,8 +301,10 @@ void tst_QtJson::testNumbers() QCOMPARE(array.size(), array2.size()); for (int i = 0; i < array.size(); ++i) { QCOMPARE(array.at(i).type(), QJsonValue::Double); + QCOMPARE(array.at(i).toInteger(), numbers[i]); QCOMPARE(array.at(i).toDouble(), (double)numbers[i]); QCOMPARE(array2.at(i).type(), QJsonValue::Double); + QCOMPARE(array2.at(i).toInteger(), numbers[i]); QCOMPARE(array2.at(i).toDouble(), (double)numbers[i]); } } @@ -422,6 +442,46 @@ void tst_QtJson::testNumbers_4() " -18446744073709552000\n" "]\n"; QCOMPARE(json, expected); + + QJsonArray array2; + array2 << QJsonValue(Q_INT64_C(+1000000000000000)); + array2 << QJsonValue(Q_INT64_C(-1000000000000000)); + array2 << QJsonValue(Q_INT64_C(+9007199254740992)); + array2 << QJsonValue(Q_INT64_C(-9007199254740992)); + array2 << QJsonValue(Q_INT64_C(+9223372036854775807)); + array2 << QJsonValue(Q_INT64_C(-9223372036854775807)); + const QByteArray json2(QJsonDocument(array2).toJson()); + const QByteArray expected2 = + "[\n" + " 1000000000000000,\n" + " -1000000000000000,\n" + " 9007199254740992,\n" + " -9007199254740992,\n" + " 9223372036854775807,\n" + " -9223372036854775807\n" + "]\n"; + QCOMPARE(json2, expected2); +} + +void tst_QtJson::testNumberComparisons() +{ + // QJsonValues created using doubles only have double precision + QJsonValue llMinDbl(-9223372036854775807.0); + QJsonValue llMinPlus1Dbl(-9223372036854775806.0); + QCOMPARE(llMinDbl == llMinPlus1Dbl, -9223372036854775807.0 == -9223372036854775806.0); // true + + // QJsonValues created using qint64 have full qint64 precision + QJsonValue llMin(Q_INT64_C(-9223372036854775807)); + QJsonValue llMinPlus1(Q_INT64_C(-9223372036854775806)); + QCOMPARE(llMin == llMinPlus1, Q_INT64_C(-9223372036854775807) == Q_INT64_C(-9223372036854775806)); // false + + // The different storage formats should be able to compare as their C++ versions (all true) + QCOMPARE(llMin == llMinDbl, Q_INT64_C(-9223372036854775807) == -9223372036854775807.0); + QCOMPARE(llMinDbl == llMin, -9223372036854775807.0 == Q_INT64_C(-9223372036854775807)); + QCOMPARE(llMinPlus1 == llMinPlus1Dbl, Q_INT64_C(-9223372036854775806) == -9223372036854775806.0); + QCOMPARE(llMinPlus1Dbl == llMinPlus1, -9223372036854775806.0 == Q_INT64_C(-9223372036854775806)); + QCOMPARE(llMinPlus1 == llMinDbl, Q_INT64_C(-9223372036854775806) == -9223372036854775807.0); + QCOMPARE(llMinPlus1Dbl == llMin, -9223372036854775806.0 == Q_INT64_C(-9223372036854775807)); } void tst_QtJson::testObjectSimple() @@ -1162,8 +1222,8 @@ void tst_QtJson::fromVariant_data() bool boolValue = true; int intValue = -1; uint uintValue = 1; - long long longlongValue = -2; - unsigned long long ulonglongValue = 2; + qlonglong longlongValue = -2; + qulonglong ulonglongValue = 2; float floatValue = 3.3f; double doubleValue = 4.4; QString stringValue("str"); @@ -1209,7 +1269,7 @@ void tst_QtJson::fromVariant_data() QTest::newRow("nullptr") << QVariant::fromValue(nullptr) << QJsonValue(QJsonValue::Null); QTest::newRow("bool") << QVariant(boolValue) << QJsonValue(boolValue); QTest::newRow("int") << QVariant(intValue) << QJsonValue(intValue); - QTest::newRow("uint") << QVariant(uintValue) << QJsonValue(static_cast<double>(uintValue)); + QTest::newRow("uint") << QVariant(uintValue) << QJsonValue(static_cast<qint64>(uintValue)); QTest::newRow("longlong") << QVariant(longlongValue) << QJsonValue(longlongValue); QTest::newRow("ulonglong") << QVariant(ulonglongValue) << QJsonValue(static_cast<double>(ulonglongValue)); QTest::newRow("float") << QVariant(floatValue) << QJsonValue(floatValue); diff --git a/tests/auto/corelib/serialization/qcborvalue_json/tst_qcborvalue_json.cpp b/tests/auto/corelib/serialization/qcborvalue_json/tst_qcborvalue_json.cpp index 56245a7173..76f2bb924a 100644 --- a/tests/auto/corelib/serialization/qcborvalue_json/tst_qcborvalue_json.cpp +++ b/tests/auto/corelib/serialization/qcborvalue_json/tst_qcborvalue_json.cpp @@ -97,9 +97,12 @@ void tst_QCborValue_Json::toVariant_data() add(1, 1, 1); add(-1, -1, -1); add(0., 0., 0.); + add(2., 2., 2.); add(1.25, 1.25, 1.25); add(-1.25, -1.25, -1.25); add("Hello", "Hello", "Hello"); + add(std::numeric_limits<qint64>::max(), std::numeric_limits<qint64>::max(), std::numeric_limits<qint64>::max()); + add(std::numeric_limits<qint64>::min(), std::numeric_limits<qint64>::min(), std::numeric_limits<qint64>::min()); // converts to string in JSON: add(QByteArray("Hello"), QByteArray("Hello"), "SGVsbG8"); @@ -123,14 +126,6 @@ void tst_QCborValue_Json::toVariant_data() << QVariant(qQNaN()) << QJsonValue(); - // large integral values lose precision in JSON - QTest::newRow("Integer:max") << QCborValue(std::numeric_limits<qint64>::max()) - << QVariant(std::numeric_limits<qint64>::max()) - << QJsonValue(std::numeric_limits<qint64>::max()); - QTest::newRow("Integer:min") << QCborValue(std::numeric_limits<qint64>::min()) - << QVariant(std::numeric_limits<qint64>::min()) - << QJsonValue(std::numeric_limits<qint64>::min()); - // empty arrays and maps add(QCborArray(), QVariantList(), QJsonArray()); add(QCborMap(), QVariantMap(), QJsonObject()); @@ -257,6 +252,10 @@ void tst_QCborValue_Json::fromJson_data() QTest::newRow("0") << QCborValue(0) << QJsonValue(0.); QTest::newRow("1") << QCborValue(1) << QJsonValue(1); QTest::newRow("1.5") << QCborValue(1.5) << QJsonValue(1.5); + QTest::newRow("Integer:max") << QCborValue(std::numeric_limits<qint64>::max()) + << QJsonValue(std::numeric_limits<qint64>::max()); + QTest::newRow("Integer:min") << QCborValue(std::numeric_limits<qint64>::min()) + << QJsonValue(std::numeric_limits<qint64>::min()); QTest::newRow("string") << QCborValue("Hello") << QJsonValue("Hello"); QTest::newRow("array") << QCborValue(QCborValue::Array) << QJsonValue(QJsonValue::Array); QTest::newRow("map") << QCborValue(QCborValue::Map) << QJsonValue(QJsonValue::Object); diff --git a/tests/auto/corelib/serialization/qdatastream/tst_qdatastream.cpp b/tests/auto/corelib/serialization/qdatastream/tst_qdatastream.cpp index 8197c386c5..d402e3f63b 100644 --- a/tests/auto/corelib/serialization/qdatastream/tst_qdatastream.cpp +++ b/tests/auto/corelib/serialization/qdatastream/tst_qdatastream.cpp @@ -2327,6 +2327,7 @@ void tst_QDataStream::setVersion() QDataStream latest; QFETCH(int, vers); +#if QT_CONFIG(shortcut) /* Test QKeySequence. */ @@ -2351,6 +2352,7 @@ void tst_QDataStream::setVersion() } QCOMPARE(deadbeef, 0xDEADBEEF); } +#endif // QT_CONFIG(shortcut) /* Test QPalette. diff --git a/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp b/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp index 48dd7a241e..e3009a78fb 100644 --- a/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp +++ b/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp @@ -149,36 +149,17 @@ private slots: void stdString(); }; -static const struct StaticByteArrays { - struct Standard { - QByteArrayData data; - const char string[8]; - } standard; - struct NotNullTerminated { - QByteArrayData data; - const char string[8]; - } notNullTerminated; - struct Shifted { - QByteArrayData data; - const char dummy; // added to change offset of string - const char string[8]; - } shifted; - struct ShiftedNotNullTerminated { - QByteArrayData data; - const char dummy; // added to change offset of string - const char string[8]; - } shiftedNotNullTerminated; - -} statics = {{Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER(4), "data"} - ,{Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER(4), "dataBAD"} - ,{Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(4, sizeof(QByteArrayData) + sizeof(char)), 0, "data"} - ,{Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(4, sizeof(QByteArrayData) + sizeof(char)), 0, "dataBAD"} - }; - -static const QByteArrayDataPtr staticStandard = { const_cast<QByteArrayData *>(&statics.standard.data) }; -static const QByteArrayDataPtr staticNotNullTerminated = { const_cast<QByteArrayData *>(&statics.notNullTerminated.data) }; -static const QByteArrayDataPtr staticShifted = { const_cast<QByteArrayData *>(&statics.shifted.data) }; -static const QByteArrayDataPtr staticShiftedNotNullTerminated = { const_cast<QByteArrayData *>(&statics.shiftedNotNullTerminated.data) }; +static const QArrayData staticDataFlags = { Q_BASIC_ATOMIC_INITIALIZER(-1), QArrayData::StaticDataFlags, 0 }; +static const QByteArray::DataPointer staticStandard = { + static_cast<QTypedArrayData<char> *>(const_cast<QArrayData *>(&staticDataFlags)), + const_cast<char *>("data"), + 4 +}; +static const QByteArray::DataPointer staticNotNullTerminated = { + static_cast<QTypedArrayData<char> *>(const_cast<QArrayData *>(&staticDataFlags)), + const_cast<char *>("dataBAD"), + 4 +}; template <class T> const T &verifyZeroTermination(const T &t) { return t; } @@ -186,11 +167,10 @@ QByteArray verifyZeroTermination(const QByteArray &ba) { // This test does some evil stuff, it's all supposed to work. - QByteArray::DataPtr baDataPtr = const_cast<QByteArray &>(ba).data_ptr(); + QByteArray::DataPointer baDataPtr = const_cast<QByteArray &>(ba).data_ptr(); // Skip if isStatic() or fromRawData(), as those offer no guarantees - if (baDataPtr->ref.isStatic() - || baDataPtr->offset != QByteArray().data_ptr()->offset) + if (baDataPtr->isStatic() || baDataPtr->flags() & QArrayData::RawDataType) return ba; int baSize = ba.size(); @@ -201,7 +181,7 @@ QByteArray verifyZeroTermination(const QByteArray &ba) .arg(baTerminator, 2, 16, QChar('0')).toLatin1(); // Skip mutating checks on shared strings - if (baDataPtr->ref.isShared()) + if (baDataPtr->isShared()) return ba; const char *baData = ba.constData(); @@ -253,11 +233,11 @@ void tst_QByteArray::qChecksum_data() QTest::addColumn<uint>("checksum"); // Examples from ISO 14443-3 - QTest::newRow("1") << QByteArray("\x00\x00") << 2U << Qt::ChecksumItuV41 << 0x1EA0U; - QTest::newRow("2") << QByteArray("\x12\x34") << 2U << Qt::ChecksumItuV41 << 0xCF26U; - QTest::newRow("3") << QByteArray("\x00\x00\x00") << 3U << Qt::ChecksumIso3309 << 0xC6CCU; - QTest::newRow("4") << QByteArray("\x0F\xAA\xFF") << 3U << Qt::ChecksumIso3309 << 0xD1FCU; - QTest::newRow("5") << QByteArray("\x0A\x12\x34\x56") << 4U << Qt::ChecksumIso3309 << 0xF62CU; + QTest::newRow("1") << QByteArray("\x00\x00", 2) << 2U << Qt::ChecksumItuV41 << 0x1EA0U; + QTest::newRow("2") << QByteArray("\x12\x34", 2) << 2U << Qt::ChecksumItuV41 << 0xCF26U; + QTest::newRow("3") << QByteArray("\x00\x00\x00", 3) << 3U << Qt::ChecksumIso3309 << 0xC6CCU; + QTest::newRow("4") << QByteArray("\x0F\xAA\xFF", 3) << 3U << Qt::ChecksumIso3309 << 0xD1FCU; + QTest::newRow("5") << QByteArray("\x0A\x12\x34\x56", 4) << 4U << Qt::ChecksumIso3309 << 0xF62CU; } void tst_QByteArray::qChecksum() @@ -267,6 +247,7 @@ void tst_QByteArray::qChecksum() QFETCH(Qt::ChecksumType, standard); QFETCH(uint, checksum); + QCOMPARE(data.length(), int(len)); if (standard == Qt::ChecksumIso3309) { QCOMPARE(::qChecksum(data.constData(), len), static_cast<quint16>(checksum)); } @@ -1054,9 +1035,7 @@ void tst_QByteArray::prependExtended_data() QTest::addColumn<QByteArray>("array"); QTest::newRow("literal") << QByteArray(QByteArrayLiteral("data")); QTest::newRow("standard") << QByteArray(staticStandard); - QTest::newRow("shifted") << QByteArray(staticShifted); QTest::newRow("notNullTerminated") << QByteArray(staticNotNullTerminated); - QTest::newRow("shiftedNotNullTerminated") << QByteArray(staticShiftedNotNullTerminated); QTest::newRow("non static data") << QByteArray("data"); QTest::newRow("from raw data") << QByteArray::fromRawData("data", 4); QTest::newRow("from raw data not terminated") << QByteArray::fromRawData("dataBAD", 4); @@ -2122,21 +2101,13 @@ void tst_QByteArray::repeated_data() const << QByteArray(staticStandard) << QByteArray("datadatadatadata") << 4; - QTest::newRow("static shifted not null terminated") - << QByteArray(staticShiftedNotNullTerminated) - << QByteArray("datadatadatadata") - << 4; - QTest::newRow("static shifted") - << QByteArray(staticShifted) - << QByteArray("datadatadatadata") - << 4; } void tst_QByteArray::byteRefDetaching() const { { QByteArray str = "str"; - QByteArray copy; + QByteArray copy = str; copy[0] = 'S'; QCOMPARE(str, QByteArray("str")); @@ -2266,7 +2237,7 @@ void tst_QByteArray::movablity() const int newSize = size + 2; const bool newIsEmpty = false; const bool newIsNull = false; - const int newCapacity = 16; + const int newCapacity = memSpace.capacity(); // move back memSpace -> array array.~QByteArray(); @@ -2301,8 +2272,7 @@ void tst_QByteArray::literals() QVERIFY(str.length() == 4); QVERIFY(str == "abcd"); - QVERIFY(str.data_ptr()->ref.isStatic()); - QVERIFY(str.data_ptr()->offset == sizeof(QByteArrayData)); + QVERIFY(str.data_ptr()->isStatic()); const char *s = str.constData(); QByteArray str2 = str; diff --git a/tests/auto/corelib/text/qstring/tst_qstring.cpp b/tests/auto/corelib/text/qstring/tst_qstring.cpp index f86fbc5988..84e12cd46b 100644 --- a/tests/auto/corelib/text/qstring/tst_qstring.cpp +++ b/tests/auto/corelib/text/qstring/tst_qstring.cpp @@ -607,11 +607,10 @@ QString verifyZeroTermination(const QString &str) { // This test does some evil stuff, it's all supposed to work. - QString::DataPtr strDataPtr = const_cast<QString &>(str).data_ptr(); + QString::DataPointer strDataPtr = const_cast<QString &>(str).data_ptr(); // Skip if isStatic() or fromRawData(), as those offer no guarantees - if (strDataPtr->ref.isStatic() - || strDataPtr->offset != QString().data_ptr()->offset) + if (strDataPtr->isStatic() || !strDataPtr->isMutable()) return str; int strSize = str.size(); @@ -622,7 +621,7 @@ QString verifyZeroTermination(const QString &str) .arg(strTerminator.unicode(), 4, 16, QChar('0')); // Skip mutating checks on shared strings - if (strDataPtr->ref.isShared()) + if (strDataPtr->isShared()) return str; const QChar *strData = str.constData(); @@ -986,28 +985,6 @@ void tst_QString::acc_01() f[7]='F'; QCOMPARE(text[7],'!'); - a=""; - a[0]='A'; - QCOMPARE(a, QLatin1String("A")); - QCOMPARE(a.length(),1); - a[1]='B'; - QCOMPARE(a, QLatin1String("AB")); - QCOMPARE(a.length(),2); - a[2]='C'; - QCOMPARE(a, QLatin1String("ABC")); - QCOMPARE(a.length(),3); - a = QString(); - QVERIFY(a.isNull()); - a[0]='A'; - QCOMPARE(a, QLatin1String("A")); - QCOMPARE(a.length(),1); - a[1]='B'; - QCOMPARE(a, QLatin1String("AB")); - QCOMPARE(a.length(),2); - a[2]='C'; - QCOMPARE(a, QLatin1String("ABC")); - QCOMPARE(a.length(),3); - a="123"; b="456"; a[0]=a[1]; @@ -4071,8 +4048,9 @@ void tst_QString::setRawData() QVERIFY(cstr.constData() == ptr); QVERIFY(cstr == QString(ptr, 1)); + QSKIP("This is currently not working."); // This actually tests the recycling of the shared data object - QString::DataPtr csd = cstr.data_ptr(); + QString::DataPointer csd = cstr.data_ptr(); cstr.setRawData(ptr2, 1); QVERIFY(cstr.isDetached()); QVERIFY(cstr.constData() == ptr2); @@ -6418,7 +6396,7 @@ void tst_QString::QCharRefDetaching() const { { QString str = QString::fromLatin1("str"); - QString copy; + QString copy = str; copy[0] = QLatin1Char('S'); QCOMPARE(str, QString::fromLatin1("str")); @@ -6639,8 +6617,7 @@ void tst_QString::literals() QVERIFY(str.length() == 4); QVERIFY(str == QLatin1String("abcd")); - QVERIFY(str.data_ptr()->ref.isStatic()); - QVERIFY(str.data_ptr()->offset == sizeof(QStringData)); + QVERIFY(str.data_ptr()->isStatic()); const QChar *s = str.constData(); QString str2 = str; diff --git a/tests/auto/corelib/text/qstringref/tst_qstringref.cpp b/tests/auto/corelib/text/qstringref/tst_qstringref.cpp index 6f01947131..20d5426bf7 100644 --- a/tests/auto/corelib/text/qstringref/tst_qstringref.cpp +++ b/tests/auto/corelib/text/qstringref/tst_qstringref.cpp @@ -87,6 +87,7 @@ private slots: void mid(); void split_data(); void split(); + void nullToString(); }; static QStringRef emptyRef() @@ -2177,6 +2178,18 @@ void tst_QStringRef::split() } } +void tst_QStringRef::nullToString() +{ + QStringRef nullRef; + QVERIFY(nullRef.isNull()); + QVERIFY(nullRef.toString().isNull()); + + QString str; + nullRef = &str; + QVERIFY(nullRef.isNull()); + QVERIFY(nullRef.toString().isNull()); +} + QTEST_APPLESS_MAIN(tst_QStringRef) #include "tst_qstringref.moc" diff --git a/tests/auto/corelib/thread/qatomicint/tst_qatomicint.cpp b/tests/auto/corelib/thread/qatomicint/tst_qatomicint.cpp index bef491d5f0..22ee7d17b7 100644 --- a/tests/auto/corelib/thread/qatomicint/tst_qatomicint.cpp +++ b/tests/auto/corelib/thread/qatomicint/tst_qatomicint.cpp @@ -237,28 +237,23 @@ template <typename T> struct TypeInStruct { T type; }; void tst_QAtomicInt::alignment() { -#ifdef Q_ALIGNOF - // this will cause a build error if the alignment isn't the same - char dummy1[Q_ALIGNOF(QBasicAtomicInt) == Q_ALIGNOF(TypeInStruct<int>) ? 1 : -1]; - char dummy2[Q_ALIGNOF(QAtomicInt) == Q_ALIGNOF(TypeInStruct<int>) ? 1 : -1]; - (void)dummy1; (void)dummy2; + Q_STATIC_ASSERT(alignof(QBasicAtomicInt) == alignof(TypeInStruct<int>)); + Q_STATIC_ASSERT(alignof(QBasicAtomicInt) == alignof(TypeInStruct<int>)); #ifdef Q_ATOMIC_INT32_IS_SUPPORTED - QCOMPARE(Q_ALIGNOF(QBasicAtomicInteger<int>), Q_ALIGNOF(TypeInStruct<int>)); + QCOMPARE(alignof(QBasicAtomicInteger<int>), alignof(TypeInStruct<int>)); #endif #ifdef Q_ATOMIC_INT16_IS_SUPPORTED - QCOMPARE(Q_ALIGNOF(QBasicAtomicInteger<short>), Q_ALIGNOF(TypeInStruct<short>)); + QCOMPARE(alignof(QBasicAtomicInteger<short>), alignof(TypeInStruct<short>)); #endif #ifdef Q_ATOMIC_INT8_IS_SUPPORTED - QCOMPARE(Q_ALIGNOF(QBasicAtomicInteger<char>), Q_ALIGNOF(TypeInStruct<char>)); + QCOMPARE(alignof(QBasicAtomicInteger<char>), alignof(TypeInStruct<char>)); #endif #ifdef Q_ATOMIC_INT64_IS_SUPPORTED - QCOMPARE(Q_ALIGNOF(QBasicAtomicInteger<qlonglong>), Q_ALIGNOF(TypeInStruct<qlonglong>)); -#endif - + QCOMPARE(alignof(QBasicAtomicInteger<qlonglong>), alignof(TypeInStruct<qlonglong>)); #endif } diff --git a/tests/auto/corelib/thread/qatomicpointer/tst_qatomicpointer.cpp b/tests/auto/corelib/thread/qatomicpointer/tst_qatomicpointer.cpp index a699cf6202..9e12e7ccce 100644 --- a/tests/auto/corelib/thread/qatomicpointer/tst_qatomicpointer.cpp +++ b/tests/auto/corelib/thread/qatomicpointer/tst_qatomicpointer.cpp @@ -108,11 +108,7 @@ void tst_QAtomicPointer::warningFree() void tst_QAtomicPointer::alignment() { -#ifdef Q_ALIGNOF - // this will cause a build error if the alignment isn't the same - char dummy[Q_ALIGNOF(QBasicAtomicPointer<void>) == Q_ALIGNOF(void*) ? 1 : -1]; - (void)dummy; -#endif + Q_STATIC_ASSERT(alignof(QBasicAtomicPointer<void>) == alignof(void*)); } void tst_QAtomicPointer::constructor() diff --git a/tests/auto/corelib/thread/qfuture/qfuture.pro b/tests/auto/corelib/thread/qfuture/qfuture.pro index 1f21130af7..fe097edf20 100644 --- a/tests/auto/corelib/thread/qfuture/qfuture.pro +++ b/tests/auto/corelib/thread/qfuture/qfuture.pro @@ -2,5 +2,4 @@ CONFIG += testcase TARGET = tst_qfuture QT = core core-private testlib SOURCES = tst_qfuture.cpp -DEFINES += QT_STRICT_ITERATORS DEFINES -= QT_NO_JAVA_STYLE_ITERATORS diff --git a/tests/auto/corelib/thread/qresultstore/qresultstore.pro b/tests/auto/corelib/thread/qresultstore/qresultstore.pro index bbebe0976b..80e79b1c1a 100644 --- a/tests/auto/corelib/thread/qresultstore/qresultstore.pro +++ b/tests/auto/corelib/thread/qresultstore/qresultstore.pro @@ -2,4 +2,3 @@ CONFIG += testcase TARGET = tst_qresultstore QT = core-private testlib SOURCES = tst_qresultstore.cpp -DEFINES += QT_STRICT_ITERATORS diff --git a/tests/auto/corelib/tools/collections/collections.pro b/tests/auto/corelib/tools/collections/collections.pro index e0f9f0a0ea..d5e4e226b5 100644 --- a/tests/auto/corelib/tools/collections/collections.pro +++ b/tests/auto/corelib/tools/collections/collections.pro @@ -5,5 +5,4 @@ QT = core testlib # This test does not work with strict iterators DEFINES -= QT_NO_LINKED_LIST -DEFINES -= QT_STRICT_ITERATORS DEFINES -= QT_NO_JAVA_STYLE_ITERATORS diff --git a/tests/auto/corelib/tools/collections/tst_collections.cpp b/tests/auto/corelib/tools/collections/tst_collections.cpp index e79a4dba29..023b22b4ba 100644 --- a/tests/auto/corelib/tools/collections/tst_collections.cpp +++ b/tests/auto/corelib/tools/collections/tst_collections.cpp @@ -84,10 +84,6 @@ void foo() #include "qvector.h" #include "qqueue.h" -QT_BEGIN_NAMESPACE -template class QList<int>; -QT_END_NAMESPACE - class tst_Collections : public QObject { Q_OBJECT @@ -551,19 +547,12 @@ void tst_Collections::list() list << "foo" << "bar"; QVERIFY(!list.isEmpty()); - list.insert(-1, "lessthanzero"); - QCOMPARE(list.at(0), QString("lessthanzero")); - list.insert(0, "atzero"); QCOMPARE(list.at(0), QString("atzero")); int listCount = list.count(); list.insert(listCount, "atcount"); QCOMPARE(list.at(listCount), QString("atcount")); - - listCount = list.count(); - list.insert(listCount + 1, "beyondcount"); - QCOMPARE(list.at(listCount), QString("beyondcount")); } { @@ -2337,12 +2326,6 @@ void populate(QLinkedList<int> &container) } template <> -void populate(QVector<int> &container) -{ - container << 1 << 2 << 4 << 8; -} - -template <> void populate(QMap<int, int> &container) { container.insert(1, 1); @@ -3214,9 +3197,7 @@ void tst_Collections::forwardDeclared() { typedef QSet<T1> C; C *x = 0; /* C::iterator i; */ C::const_iterator j; Q_UNUSED(x) } } -#if defined(Q_ALIGNOF) && defined(Q_DECL_ALIGN) - -class Q_DECL_ALIGN(4) Aligned4 +class alignas(4) Aligned4 { char i; public: @@ -3228,7 +3209,7 @@ public: inline bool operator<(const Aligned4 &other) const { return i < other.i; } friend inline int qHash(const Aligned4 &a) { return qHash(a.i); } }; -Q_STATIC_ASSERT(Q_ALIGNOF(Aligned4) % 4 == 0); +Q_STATIC_ASSERT(alignof(Aligned4) % 4 == 0); #if defined(Q_PROCESSOR_ARM) # if defined(Q_COMPILER_ALIGNAS) && defined(__BIGGEST_ALIGNMENT__) @@ -3242,7 +3223,7 @@ Q_STATIC_ASSERT(Q_ALIGNOF(Aligned4) % 4 == 0); # define BIGGEST_ALIGNMENT_TO_TEST 128 #endif -class Q_DECL_ALIGN(BIGGEST_ALIGNMENT_TO_TEST) AlignedBiggest +class alignas(BIGGEST_ALIGNMENT_TO_TEST) AlignedBiggest { char i; public: @@ -3254,7 +3235,7 @@ public: inline bool operator<(const AlignedBiggest &other) const { return i < other.i; } friend inline int qHash(const AlignedBiggest &a) { return qHash(a.i); } }; -Q_STATIC_ASSERT(Q_ALIGNOF(AlignedBiggest) % BIGGEST_ALIGNMENT_TO_TEST == 0); +Q_STATIC_ASSERT(alignof(AlignedBiggest) % BIGGEST_ALIGNMENT_TO_TEST == 0); template<typename C> void testVectorAlignment() @@ -3325,13 +3306,6 @@ void tst_Collections::alignment() testAssociativeContainerAlignment<QHash<AlignedBiggest, AlignedBiggest> >(); } -#else -void tst_Collections::alignment() -{ - QSKIP("Compiler doesn't support necessary extension keywords"); -} -#endif - #ifndef QT_NO_TEMPLATE_TEMPLATE_PARAMETERS template<template<class> class C> @@ -3510,9 +3484,6 @@ void tst_Collections::foreach_2() QCOMPARE(varl1.count(), intlist.count()); QCOMPARE(varl2.count(), intlist.count()); QCOMPARE(varl3.count(), intlist.count()); - foreach_test_arrays(varl1); - foreach_test_arrays(varl2); - foreach_test_arrays(varl3); QVarLengthArray<QString> varl4; QVarLengthArray<QString, 3> varl5; @@ -3525,9 +3496,6 @@ void tst_Collections::foreach_2() QCOMPARE(varl4.count(), strlist.count()); QCOMPARE(varl5.count(), strlist.count()); QCOMPARE(varl6.count(), strlist.count()); - foreach_test_arrays(varl4); - foreach_test_arrays(varl5); - foreach_test_arrays(varl6); } struct IntOrString @@ -3615,30 +3583,8 @@ template<class Container> void insert_remove_loop_impl() } -//Add insert(int, int, T) so it has the same interface as QVector and QVarLengthArray for the test. template<typename T> -struct ExtList : QList<T> { - using QList<T>::insert; - void insert(int before, int n, const T&x) { - while (n--) { - this->insert(before, x ); - } - } - void insert(typename QList<T>::iterator before, int n, const T&x) { - while (n--) { - before = this->insert(before, x); - } - } - - void remove(int i) { - this->removeAt(i); - } - void remove(int i, int n) { - while (n--) { - this->removeAt(i); - } - } -}; +using ExtList = QList<T>; void tst_Collections::insert_remove_loop() { diff --git a/tests/auto/corelib/tools/containerapisymmetry/containerapisymmetry.pro b/tests/auto/corelib/tools/containerapisymmetry/containerapisymmetry.pro index e46d51761e..efdb7fc2df 100644 --- a/tests/auto/corelib/tools/containerapisymmetry/containerapisymmetry.pro +++ b/tests/auto/corelib/tools/containerapisymmetry/containerapisymmetry.pro @@ -3,6 +3,4 @@ TARGET = tst_containerapisymmetry SOURCES += tst_containerapisymmetry.cpp QT = core testlib -# This test does not work with strict iterators -DEFINES -= QT_STRICT_ITERATORS DEFINES -= QT_NO_LINKED_LIST diff --git a/tests/auto/corelib/tools/containerapisymmetry/tst_containerapisymmetry.cpp b/tests/auto/corelib/tools/containerapisymmetry/tst_containerapisymmetry.cpp index 88c0c5055c..0e4517e740 100644 --- a/tests/auto/corelib/tools/containerapisymmetry/tst_containerapisymmetry.cpp +++ b/tests/auto/corelib/tools/containerapisymmetry/tst_containerapisymmetry.cpp @@ -580,9 +580,6 @@ template<typename ... T> struct ContainerDuplicatedValuesStrategy<VarLengthArray<T...>> : ContainerAcceptsDuplicateValues {}; template<typename ... T> -struct ContainerDuplicatedValuesStrategy<QList<T...>> : ContainerAcceptsDuplicateValues {}; - -template<typename ... T> struct ContainerDuplicatedValuesStrategy<std::list<T...>> : ContainerAcceptsDuplicateValues {}; #if COMPILER_HAS_STDLIB_INCLUDE(<forward_list>) @@ -798,8 +795,6 @@ template <> QStringView make(int size) { return QStringView(s_string).left(siz template <> QLatin1String make(int size) { return QLatin1String("\1\2\3\4\5\6\7", size); } template <typename T> T clean(T &&t) { return std::forward<T>(t); } -inline QChar clean(QCharRef ch) { return ch; } -inline char clean(QByteRef ch) { return ch; } inline char clean(QLatin1Char ch) { return ch.toLatin1(); } template <typename Container> diff --git a/tests/auto/corelib/tools/qarraydata/simplevector.h b/tests/auto/corelib/tools/qarraydata/simplevector.h index 9dd8b05796..94cee5d887 100644 --- a/tests/auto/corelib/tools/qarraydata/simplevector.h +++ b/tests/auto/corelib/tools/qarraydata/simplevector.h @@ -76,25 +76,32 @@ public: { } - explicit SimpleVector(Data *ptr) - : d(ptr) + template <size_t N> + explicit SimpleVector(QStaticArrayData<T, N> &ptr) + : d(static_cast<Data *>(&ptr.header), ptr.data, N) + { + } + + SimpleVector(Data *header, T *data, size_t len = 0) + : d(header, data, len) + { + } + + explicit SimpleVector(QPair<Data*, T*> ptr, size_t len = 0) + : d(ptr, len) { } - bool empty() const { return d->size == 0; } + bool empty() const { return d.size == 0; } bool isNull() const { return d.isNull(); } bool isEmpty() const { return this->empty(); } - bool isStatic() const { return d->ref.isStatic(); } - bool isShared() const { return d->ref.isShared(); } + bool isStatic() const { return d->isStatic(); } + bool isShared() const { return d->isShared(); } bool isSharedWith(const SimpleVector &other) const { return d == other.d; } -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - bool isSharable() const { return d->ref.isSharable(); } - void setSharable(bool sharable) { d.setSharable(sharable); } -#endif - size_t size() const { return d->size; } - size_t capacity() const { return d->alloc; } + size_t size() const { return d.size; } + size_t capacity() const { return d->constAllocatedCapacity(); } iterator begin() { detach(); return d->begin(); } iterator end() { detach(); return d->end(); } @@ -143,10 +150,10 @@ public: return; if (n <= capacity()) { - if (d->capacityReserved) + if (d->flags() & Data::CapacityReserved) return; - if (!d->ref.isShared()) { - d->capacityReserved = 1; + if (!d->isShared()) { + d->flags() |= Data::CapacityReserved; return; } } @@ -163,7 +170,7 @@ public: if (size() == newSize) return; - if (d.needsDetach() || newSize > capacity()) { + if (d->needsDetach() || newSize > capacity()) { SimpleVector detached(Data::allocate( d->detachCapacity(newSize), d->detachFlags())); if (newSize) { @@ -199,11 +206,11 @@ public: return; T *const begin = d->begin(); - if (d.needsDetach() + if (d->needsDetach() || capacity() - size() < size_t(last - first)) { SimpleVector detached(Data::allocate( d->detachCapacity(size() + (last - first)), - d->detachFlags() | Data::Grow)); + d->detachFlags() | Data::GrowsForward)); detached.d->copyAppend(first, last); detached.d->copyAppend(begin, begin + d->size); @@ -220,11 +227,11 @@ public: if (first == last) return; - if (d.needsDetach() + if (d->needsDetach() || capacity() - size() < size_t(last - first)) { SimpleVector detached(Data::allocate( d->detachCapacity(size() + (last - first)), - d->detachFlags() | Data::Grow)); + d->detachFlags() | Data::GrowsForward)); if (d->size) { const T *const begin = constBegin(); @@ -260,11 +267,11 @@ public: const iterator begin = d->begin(); const iterator where = begin + position; const iterator end = begin + d->size; - if (d.needsDetach() + if (d->needsDetach() || capacity() - size() < size_t(last - first)) { SimpleVector detached(Data::allocate( d->detachCapacity(size() + (last - first)), - d->detachFlags() | Data::Grow)); + d->detachFlags() | Data::GrowsForward)); if (position) detached.d->copyAppend(begin, where); @@ -298,7 +305,7 @@ public: const T *const begin = d->begin(); const T *const end = begin + d->size; - if (d.needsDetach()) { + if (d->needsDetach()) { SimpleVector detached(Data::allocate( d->detachCapacity(size() - (last - first)), d->detachFlags())); @@ -332,7 +339,7 @@ public: } static SimpleVector fromRawData(const T *data, size_t size, - QArrayData::AllocationOptions options = Data::Default) + QArrayData::ArrayOptions options = Data::DefaultRawFlags) { return SimpleVector(Data::fromRawData(data, size, options)); } diff --git a/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp b/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp index 25e2f21d03..1366eebf97 100644 --- a/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp +++ b/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp @@ -37,11 +37,8 @@ struct SharedNullVerifier { SharedNullVerifier() { - Q_ASSERT(QArrayData::shared_null[0].ref.isStatic()); - Q_ASSERT(QArrayData::shared_null[0].ref.isShared()); -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - Q_ASSERT(QArrayData::shared_null[0].ref.isSharable()); -#endif + Q_ASSERT(QArrayData::shared_null[0].isStatic()); + Q_ASSERT(QArrayData::shared_null[0].isShared()); } }; @@ -59,7 +56,6 @@ class tst_QArrayData : public QObject private slots: void referenceCounting(); void sharedNullEmpty(); - void staticData(); void simpleVector(); void simpleVectorReserve_data(); void simpleVectorReserve(); @@ -73,8 +69,6 @@ private slots: void gccBug43247(); void arrayOps(); void arrayOps2(); - void setSharable_data(); - void setSharable(); void fromRawData_data(); void fromRawData(); void literals(); @@ -89,70 +83,42 @@ void tst_QArrayData::referenceCounting() { { // Reference counting initialized to 1 (owned) - QArrayData array = { { Q_BASIC_ATOMIC_INITIALIZER(1) }, 0, 0, 0, 0 }; + QArrayData array = { Q_BASIC_ATOMIC_INITIALIZER(1), QArrayData::DefaultRawFlags, 0 }; - QCOMPARE(array.ref.atomic.loadRelaxed(), 1); + QCOMPARE(array.ref_.loadRelaxed(), 1); - QVERIFY(!array.ref.isStatic()); -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - QVERIFY(array.ref.isSharable()); -#endif + QVERIFY(!array.isStatic()); - QVERIFY(array.ref.ref()); - QCOMPARE(array.ref.atomic.loadRelaxed(), 2); + QVERIFY(array.ref()); + QCOMPARE(array.ref_.loadRelaxed(), 2); - QVERIFY(array.ref.deref()); - QCOMPARE(array.ref.atomic.loadRelaxed(), 1); + QVERIFY(array.deref()); + QCOMPARE(array.ref_.loadRelaxed(), 1); - QVERIFY(array.ref.ref()); - QCOMPARE(array.ref.atomic.loadRelaxed(), 2); + QVERIFY(array.ref()); + QCOMPARE(array.ref_.loadRelaxed(), 2); - QVERIFY(array.ref.deref()); - QCOMPARE(array.ref.atomic.loadRelaxed(), 1); + QVERIFY(array.deref()); + QCOMPARE(array.ref_.loadRelaxed(), 1); - QVERIFY(!array.ref.deref()); - QCOMPARE(array.ref.atomic.loadRelaxed(), 0); + QVERIFY(!array.deref()); + QCOMPARE(array.ref_.loadRelaxed(), 0); // Now would be a good time to free/release allocated data } - -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - { - // Reference counting initialized to 0 (non-sharable) - QArrayData array = { { Q_BASIC_ATOMIC_INITIALIZER(0) }, 0, 0, 0, 0 }; - - QCOMPARE(array.ref.atomic.loadRelaxed(), 0); - - QVERIFY(!array.ref.isStatic()); - QVERIFY(!array.ref.isSharable()); - - QVERIFY(!array.ref.ref()); - // Reference counting fails, data should be copied - QCOMPARE(array.ref.atomic.loadRelaxed(), 0); - - QVERIFY(!array.ref.deref()); - QCOMPARE(array.ref.atomic.loadRelaxed(), 0); - - // Free/release data - } -#endif - { // Reference counting initialized to -1 (static read-only data) - QArrayData array = { Q_REFCOUNT_INITIALIZE_STATIC, 0, 0, 0, 0 }; + QArrayData array = { Q_BASIC_ATOMIC_INITIALIZER(-1), QArrayData::StaticDataFlags, 0 }; - QCOMPARE(array.ref.atomic.loadRelaxed(), -1); + QCOMPARE(array.ref_.loadRelaxed(), -1); - QVERIFY(array.ref.isStatic()); -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - QVERIFY(array.ref.isSharable()); -#endif + QVERIFY(array.isStatic()); - QVERIFY(array.ref.ref()); - QCOMPARE(array.ref.atomic.loadRelaxed(), -1); + QVERIFY(array.ref()); + QCOMPARE(array.ref_.loadRelaxed(), -1); - QVERIFY(array.ref.deref()); - QCOMPARE(array.ref.atomic.loadRelaxed(), -1); + QVERIFY(array.deref()); + QCOMPARE(array.ref_.loadRelaxed(), -1); } } @@ -160,74 +126,39 @@ void tst_QArrayData::referenceCounting() void tst_QArrayData::sharedNullEmpty() { QArrayData *null = const_cast<QArrayData *>(QArrayData::shared_null); - QArrayData *empty = QArrayData::allocate(1, Q_ALIGNOF(QArrayData), 0); - - QVERIFY(null->ref.isStatic()); - QVERIFY(null->ref.isShared()); + QArrayData *empty; + QArrayData::allocate(&empty, 1, alignof(QArrayData), 0); - QVERIFY(empty->ref.isStatic()); - QVERIFY(empty->ref.isShared()); + QVERIFY(null->isStatic()); + QVERIFY(null->isShared()); - QCOMPARE(null->ref.atomic.loadRelaxed(), -1); - QCOMPARE(empty->ref.atomic.loadRelaxed(), -1); + QVERIFY(empty->isStatic()); + QVERIFY(empty->isShared()); -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - QVERIFY(null->ref.isSharable()); - QVERIFY(empty->ref.isSharable()); -#endif + QCOMPARE(null->ref_.loadRelaxed(), -1); + QCOMPARE(empty->ref_.loadRelaxed(), -1); - QVERIFY(null->ref.ref()); - QVERIFY(empty->ref.ref()); + QCOMPARE(null->ref_.loadRelaxed(), -1); + QCOMPARE(empty->ref_.loadRelaxed(), -1); - QCOMPARE(null->ref.atomic.loadRelaxed(), -1); - QCOMPARE(empty->ref.atomic.loadRelaxed(), -1); + QVERIFY(null->deref()); + QVERIFY(empty->deref()); - QVERIFY(null->ref.deref()); - QVERIFY(empty->ref.deref()); - - QCOMPARE(null->ref.atomic.loadRelaxed(), -1); - QCOMPARE(empty->ref.atomic.loadRelaxed(), -1); + QCOMPARE(null->ref_.loadRelaxed(), -1); + QCOMPARE(empty->ref_.loadRelaxed(), -1); QVERIFY(null != empty); - QCOMPARE(null->size, 0); - QCOMPARE(null->alloc, 0u); - QCOMPARE(null->capacityReserved, 0u); + QCOMPARE(null->allocatedCapacity(), size_t(0)); - QCOMPARE(empty->size, 0); - QCOMPARE(empty->alloc, 0u); - QCOMPARE(empty->capacityReserved, 0u); -} - -void tst_QArrayData::staticData() -{ - QStaticArrayData<char, 10> charArray = { - Q_STATIC_ARRAY_DATA_HEADER_INITIALIZER(char, 10), - { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' } - }; - QStaticArrayData<int, 10> intArray = { - Q_STATIC_ARRAY_DATA_HEADER_INITIALIZER(int, 10), - { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } - }; - QStaticArrayData<double, 10> doubleArray = { - Q_STATIC_ARRAY_DATA_HEADER_INITIALIZER(double, 10), - { 0.f, 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f, 9.f } - }; - - QCOMPARE(charArray.header.size, 10); - QCOMPARE(intArray.header.size, 10); - QCOMPARE(doubleArray.header.size, 10); - - QCOMPARE(charArray.header.data(), reinterpret_cast<void *>(&charArray.data)); - QCOMPARE(intArray.header.data(), reinterpret_cast<void *>(&intArray.data)); - QCOMPARE(doubleArray.header.data(), reinterpret_cast<void *>(&doubleArray.data)); + QCOMPARE(empty->allocatedCapacity(), size_t(0)); } void tst_QArrayData::simpleVector() { - QArrayData data0 = { Q_REFCOUNT_INITIALIZE_STATIC, 0, 0, 0, 0 }; + QArrayData data0 = { Q_BASIC_ATOMIC_INITIALIZER(-1), QArrayData::StaticDataFlags, 0 }; QStaticArrayData<int, 7> data1 = { - Q_STATIC_ARRAY_DATA_HEADER_INITIALIZER(int, 7), + { Q_BASIC_ATOMIC_INITIALIZER(-1), QArrayData::StaticDataFlags, 0 }, { 0, 1, 2, 3, 4, 5, 6 } }; @@ -235,10 +166,10 @@ void tst_QArrayData::simpleVector() SimpleVector<int> v1; SimpleVector<int> v2(v1); - SimpleVector<int> v3(static_cast<QTypedArrayData<int> *>(&data0)); - SimpleVector<int> v4(static_cast<QTypedArrayData<int> *>(&data1.header)); - SimpleVector<int> v5(static_cast<QTypedArrayData<int> *>(&data0)); - SimpleVector<int> v6(static_cast<QTypedArrayData<int> *>(&data1.header)); + SimpleVector<int> v3(static_cast<QTypedArrayData<int> *>(&data0), 0, 0); + SimpleVector<int> v4(data1); + SimpleVector<int> v5(static_cast<QTypedArrayData<int> *>(&data0), 0, 0); + SimpleVector<int> v6(data1); SimpleVector<int> v7(10, 5); SimpleVector<int> v8(array, array + sizeof(array)/sizeof(*array)); @@ -302,17 +233,6 @@ void tst_QArrayData::simpleVector() QVERIFY(!v7.isShared()); QVERIFY(!v8.isShared()); -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - QVERIFY(v1.isSharable()); - QVERIFY(v2.isSharable()); - QVERIFY(v3.isSharable()); - QVERIFY(v4.isSharable()); - QVERIFY(v5.isSharable()); - QVERIFY(v6.isSharable()); - QVERIFY(v7.isSharable()); - QVERIFY(v8.isSharable()); -#endif - QVERIFY(v1.isSharedWith(v2)); QVERIFY(v1.isSharedWith(v3)); QVERIFY(v1.isSharedWith(v4)); @@ -494,71 +414,6 @@ void tst_QArrayData::simpleVector() for (int i = 0; i < 120; ++i) QCOMPARE(v1[i], v8[i % 10]); - -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - { - v7.setSharable(true); - QVERIFY(v7.isSharable()); - - SimpleVector<int> copy1(v7); - QVERIFY(copy1.isSharedWith(v7)); - - v7.setSharable(false); - QVERIFY(!v7.isSharable()); - - QVERIFY(!copy1.isSharedWith(v7)); - QCOMPARE(v7.size(), copy1.size()); - for (size_t i = 0; i < copy1.size(); ++i) - QCOMPARE(v7[i], copy1[i]); - - SimpleVector<int> clone(v7); - QVERIFY(!clone.isSharedWith(v7)); - QCOMPARE(clone.size(), copy1.size()); - for (size_t i = 0; i < copy1.size(); ++i) - QCOMPARE(clone[i], copy1[i]); - - v7.setSharable(true); - QVERIFY(v7.isSharable()); - - SimpleVector<int> copy2(v7); - QVERIFY(copy2.isSharedWith(v7)); - } - - { - SimpleVector<int> null; - SimpleVector<int> empty(0, 5); - - QVERIFY(null.isSharable()); - QVERIFY(empty.isSharable()); - - null.setSharable(true); - empty.setSharable(true); - - QVERIFY(null.isSharable()); - QVERIFY(empty.isSharable()); - - QVERIFY(null.isEmpty()); - QVERIFY(empty.isEmpty()); - - null.setSharable(false); - empty.setSharable(false); - - QVERIFY(!null.isSharable()); - QVERIFY(!empty.isSharable()); - - QVERIFY(null.isEmpty()); - QVERIFY(empty.isEmpty()); - - null.setSharable(true); - empty.setSharable(true); - - QVERIFY(null.isSharable()); - QVERIFY(empty.isSharable()); - - QVERIFY(null.isEmpty()); - QVERIFY(empty.isEmpty()); - } -#endif } Q_DECLARE_METATYPE(SimpleVector<int>) @@ -574,11 +429,13 @@ void tst_QArrayData::simpleVectorReserve_data() QTest::newRow("non-empty") << SimpleVector<int>(5, 42) << size_t(5) << size_t(5); static const QStaticArrayData<int, 15> array = { - Q_STATIC_ARRAY_DATA_HEADER_INITIALIZER(int, 15), + { Q_BASIC_ATOMIC_INITIALIZER(-1), QArrayData::StaticDataFlags, 0 }, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } }; - QArrayDataPointerRef<int> p = { + const QArrayDataPointerRef<int> p = { static_cast<QTypedArrayData<int> *>( - const_cast<QArrayData *>(&array.header)) }; + const_cast<QArrayData *>(&array.header)), + const_cast<int *>(array.data), + sizeof(array.data) / sizeof(array.data[0]) }; QTest::newRow("static") << SimpleVector<int>(p) << size_t(0) << size_t(15); QTest::newRow("raw-data") << SimpleVector<int>::fromRawData(array.data, 15) << size_t(0) << size_t(15); @@ -641,15 +498,14 @@ struct Deallocator }; Q_DECLARE_METATYPE(const QArrayData *) -Q_DECLARE_METATYPE(QArrayData::AllocationOptions) +Q_DECLARE_METATYPE(QArrayData::ArrayOptions) void tst_QArrayData::allocate_data() { QTest::addColumn<size_t>("objectSize"); QTest::addColumn<size_t>("alignment"); - QTest::addColumn<QArrayData::AllocationOptions>("allocateOptions"); + QTest::addColumn<QArrayData::ArrayOptions>("allocateOptions"); QTest::addColumn<bool>("isCapacityReserved"); - QTest::addColumn<bool>("isSharable"); // ### Qt6: remove QTest::addColumn<const QArrayData *>("commonEmpty"); struct { @@ -657,35 +513,24 @@ void tst_QArrayData::allocate_data() size_t objectSize; size_t alignment; } types[] = { - { "char", sizeof(char), Q_ALIGNOF(char) }, - { "short", sizeof(short), Q_ALIGNOF(short) }, - { "void *", sizeof(void *), Q_ALIGNOF(void *) } + { "char", sizeof(char), alignof(char) }, + { "short", sizeof(short), alignof(short) }, + { "void *", sizeof(void *), alignof(void *) } }; - QArrayData *shared_empty = QArrayData::allocate(0, Q_ALIGNOF(QArrayData), 0); + QArrayData *shared_empty; + QArrayData::allocate(&shared_empty, 1, alignof(QArrayData), 0); QVERIFY(shared_empty); -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - QArrayData *unsharable_empty = QArrayData::allocate(0, Q_ALIGNOF(QArrayData), 0, QArrayData::Unsharable); - QVERIFY(unsharable_empty); -#endif - struct { char const *description; - QArrayData::AllocationOptions allocateOptions; + QArrayData::ArrayOptions allocateOptions; bool isCapacityReserved; - bool isSharable; const QArrayData *commonEmpty; } options[] = { - { "Default", QArrayData::Default, false, true, shared_empty }, - { "Reserved", QArrayData::CapacityReserved, true, true, shared_empty }, -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - { "Reserved | Unsharable", - QArrayData::CapacityReserved | QArrayData::Unsharable, true, false, - unsharable_empty }, - { "Unsharable", QArrayData::Unsharable, false, false, unsharable_empty }, -#endif - { "Grow", QArrayData::Grow, false, true, shared_empty } + { "Default", QArrayData::DefaultAllocationFlags, false, shared_empty }, + { "Reserved", QArrayData::CapacityReserved, true, shared_empty }, + { "Grow", QArrayData::GrowsForward, false, shared_empty } }; for (size_t i = 0; i < sizeof(types)/sizeof(types[0]); ++i) @@ -696,47 +541,45 @@ void tst_QArrayData::allocate_data() + QLatin1String(options[j].description))) << types[i].objectSize << types[i].alignment << options[j].allocateOptions << options[j].isCapacityReserved - << options[j].isSharable << options[j].commonEmpty; + << options[j].commonEmpty; } void tst_QArrayData::allocate() { QFETCH(size_t, objectSize); QFETCH(size_t, alignment); - QFETCH(QArrayData::AllocationOptions, allocateOptions); + QFETCH(QArrayData::ArrayOptions, allocateOptions); QFETCH(bool, isCapacityReserved); QFETCH(const QArrayData *, commonEmpty); // Minimum alignment that can be requested is that of QArrayData. // Typically, this alignment is sizeof(void *) and ensured by malloc. - size_t minAlignment = qMax(alignment, Q_ALIGNOF(QArrayData)); + size_t minAlignment = qMax(alignment, alignof(QArrayData)); // Shared Empty - QCOMPARE(QArrayData::allocate(objectSize, minAlignment, 0, - QArrayData::AllocationOptions(allocateOptions)), commonEmpty); + QArrayData *empty; + QCOMPARE((QArrayData::allocate(&empty, objectSize, minAlignment, 0, + QArrayData::ArrayOptions(allocateOptions)), empty), commonEmpty); Deallocator keeper(objectSize, minAlignment); keeper.headers.reserve(1024); for (int capacity = 1; capacity <= 1024; capacity <<= 1) { - QArrayData *data = QArrayData::allocate(objectSize, minAlignment, - capacity, QArrayData::AllocationOptions(allocateOptions)); + QArrayData *data; + void *dataPointer = QArrayData::allocate(&data, objectSize, minAlignment, + capacity, QArrayData::ArrayOptions(allocateOptions)); + keeper.headers.append(data); - QCOMPARE(data->size, 0); - if (allocateOptions & QArrayData::Grow) - QVERIFY(data->alloc > uint(capacity)); + if (allocateOptions & QArrayData::GrowsForward) + QVERIFY(data->allocatedCapacity() > uint(capacity)); else - QCOMPARE(data->alloc, uint(capacity)); - QCOMPARE(data->capacityReserved, uint(isCapacityReserved)); -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - QFETCH(bool, isSharable); - QCOMPARE(data->ref.isSharable(), isSharable); -#endif + QCOMPARE(data->allocatedCapacity(), size_t(capacity)); + QCOMPARE(bool(data->flags & QArrayData::CapacityReserved), isCapacityReserved); // Check that the allocated array can be used. Best tested with a // memory checker, such as valgrind, running. - ::memset(data->data(), 'A', objectSize * capacity); + ::memset(dataPointer, 'A', objectSize * capacity); } } @@ -744,47 +587,40 @@ void tst_QArrayData::reallocate() { QFETCH(size_t, objectSize); QFETCH(size_t, alignment); - QFETCH(QArrayData::AllocationOptions, allocateOptions); + QFETCH(QArrayData::ArrayOptions, allocateOptions); QFETCH(bool, isCapacityReserved); - // Maximum alignment that can be requested is that of QArrayData, - // otherwise, we can't use reallocate(). - Q_ASSERT(alignment <= Q_ALIGNOF(QArrayData)); - // Minimum alignment that can be requested is that of QArrayData. // Typically, this alignment is sizeof(void *) and ensured by malloc. - size_t minAlignment = qMax(alignment, Q_ALIGNOF(QArrayData)); + size_t minAlignment = qMax(alignment, alignof(QArrayData)); int capacity = 10; Deallocator keeper(objectSize, minAlignment); - QArrayData *data = QArrayData::allocate(objectSize, minAlignment, capacity, - QArrayData::AllocationOptions(allocateOptions) & ~QArrayData::Grow); + QArrayData *data; + void *dataPointer = QArrayData::allocate(&data, objectSize, minAlignment, capacity, + QArrayData::ArrayOptions(allocateOptions) & ~QArrayData::GrowsForward); keeper.headers.append(data); - memset(data->data(), 'A', objectSize * capacity); - data->size = capacity; + memset(dataPointer, 'A', objectSize * capacity); // now try to reallocate int newCapacity = 40; - data = QArrayData::reallocateUnaligned(data, objectSize, newCapacity, - QArrayData::AllocationOptions(allocateOptions)); + auto pair = QArrayData::reallocateUnaligned(data, dataPointer, objectSize, newCapacity, + QArrayData::ArrayOptions(allocateOptions)); + data = pair.first; + dataPointer = pair.second; QVERIFY(data); keeper.headers.clear(); keeper.headers.append(data); - QCOMPARE(data->size, capacity); - if (allocateOptions & QArrayData::Grow) - QVERIFY(data->alloc > uint(newCapacity)); + if (allocateOptions & QArrayData::GrowsForward) + QVERIFY(data->allocatedCapacity() > size_t(newCapacity)); else - QCOMPARE(data->alloc, uint(newCapacity)); - QCOMPARE(data->capacityReserved, uint(isCapacityReserved)); -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - QFETCH(bool, isSharable); - QCOMPARE(data->ref.isSharable(), isSharable); -#endif + QCOMPARE(data->allocatedCapacity(), size_t(newCapacity)); + QCOMPARE(!(data->flags & QArrayData::CapacityReserved), !isCapacityReserved); for (int i = 0; i < capacity; ++i) - QCOMPARE(static_cast<char *>(data->data())[i], 'A'); + QCOMPARE(static_cast<char *>(dataPointer)[i], 'A'); } class Unaligned @@ -808,95 +644,52 @@ void tst_QArrayData::alignment() // Minimum alignment that can be requested is that of QArrayData. // Typically, this alignment is sizeof(void *) and ensured by malloc. - size_t minAlignment = qMax(alignment, Q_ALIGNOF(QArrayData)); + size_t minAlignment = qMax(alignment, alignof(QArrayData)); Deallocator keeper(sizeof(Unaligned), minAlignment); keeper.headers.reserve(100); for (int i = 0; i < 100; ++i) { - QArrayData *data = QArrayData::allocate(sizeof(Unaligned), - minAlignment, 8, QArrayData::Default); + QArrayData *data; + void *dataPointer = QArrayData::allocate(&data, sizeof(Unaligned), + minAlignment, 8, QArrayData::DefaultAllocationFlags); keeper.headers.append(data); QVERIFY(data); - QCOMPARE(data->size, 0); - QVERIFY(data->alloc >= uint(8)); + QVERIFY(data->allocatedCapacity() >= uint(8)); // These conditions should hold as long as header and array are // allocated together - QVERIFY(data->offset >= qptrdiff(sizeof(QArrayData))); - QVERIFY(data->offset <= qptrdiff(sizeof(QArrayData) - + minAlignment - Q_ALIGNOF(QArrayData))); + qptrdiff offset = reinterpret_cast<char *>(dataPointer) - + reinterpret_cast<char *>(data); + QVERIFY(offset >= qptrdiff(sizeof(QArrayData))); + QVERIFY(offset <= qptrdiff(sizeof(QArrayData) + + minAlignment - alignof(QArrayData))); // Data is aligned - QCOMPARE(quintptr(quintptr(data->data()) % alignment), quintptr(0u)); + QCOMPARE(quintptr(quintptr(dataPointer) % alignment), quintptr(0u)); // Check that the allocated array can be used. Best tested with a // memory checker, such as valgrind, running. - ::memset(data->data(), 'A', sizeof(Unaligned) * 8); + ::memset(dataPointer, 'A', sizeof(Unaligned) * 8); } } void tst_QArrayData::typedData() { - QStaticArrayData<int, 10> data = { - Q_STATIC_ARRAY_DATA_HEADER_INITIALIZER(int, 10), - { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } - }; - QCOMPARE(data.header.size, 10); - - { - QTypedArrayData<int> *array = - static_cast<QTypedArrayData<int> *>(&data.header); - QCOMPARE(array->data(), data.data); - - int j = 0; - for (QTypedArrayData<int>::iterator iter = array->begin(); - iter != array->end(); ++iter, ++j) - QCOMPARE((const int *)iter, data.data + j); - QCOMPARE(j, 10); - } - - { - const QTypedArrayData<int> *array = - static_cast<const QTypedArrayData<int> *>(&data.header); - - QCOMPARE(array->data(), data.data); - - int j = 0; - for (QTypedArrayData<int>::const_iterator iter = array->begin(); - iter != array->end(); ++iter, ++j) - QCOMPARE((const int *)iter, data.data + j); - QCOMPARE(j, 10); - } - - { - QTypedArrayData<int> *null = QTypedArrayData<int>::sharedNull(); - QTypedArrayData<int> *empty = QTypedArrayData<int>::allocate(0); - - QVERIFY(null != empty); - - QCOMPARE(null->size, 0); - QCOMPARE(empty->size, 0); - - QCOMPARE(null->begin(), null->end()); - QCOMPARE(empty->begin(), empty->end()); - } - - { Deallocator keeper(sizeof(char), - Q_ALIGNOF(QTypedArrayData<char>::AlignmentDummy)); - QArrayData *array = QTypedArrayData<char>::allocate(10); + alignof(QTypedArrayData<char>::AlignmentDummy)); + QPair<QTypedArrayData<char> *, char *> pair = QTypedArrayData<char>::allocate(10); + QArrayData *array = pair.first; keeper.headers.append(array); QVERIFY(array); - QCOMPARE(array->size, 0); - QCOMPARE(array->alloc, 10u); + QCOMPARE(array->allocatedCapacity(), size_t(10)); // Check that the allocated array can be used. Best tested with a // memory checker, such as valgrind, running. - ::memset(array->data(), 0, 10 * sizeof(char)); + ::memset(pair.second, 0, 10 * sizeof(char)); keeper.headers.clear(); QTypedArrayData<short>::deallocate(array); @@ -906,17 +699,17 @@ void tst_QArrayData::typedData() { Deallocator keeper(sizeof(short), - Q_ALIGNOF(QTypedArrayData<short>::AlignmentDummy)); - QArrayData *array = QTypedArrayData<short>::allocate(10); + alignof(QTypedArrayData<short>::AlignmentDummy)); + QPair<QTypedArrayData<short> *, short *> pair = QTypedArrayData<short>::allocate(10); + QArrayData *array = pair.first; keeper.headers.append(array); QVERIFY(array); - QCOMPARE(array->size, 0); - QCOMPARE(array->alloc, 10u); + QCOMPARE(array->allocatedCapacity(), size_t(10)); // Check that the allocated array can be used. Best tested with a // memory checker, such as valgrind, running. - ::memset(array->data(), 0, 10 * sizeof(short)); + ::memset(pair.second, 0, 10 * sizeof(short)); keeper.headers.clear(); QTypedArrayData<short>::deallocate(array); @@ -926,17 +719,17 @@ void tst_QArrayData::typedData() { Deallocator keeper(sizeof(double), - Q_ALIGNOF(QTypedArrayData<double>::AlignmentDummy)); - QArrayData *array = QTypedArrayData<double>::allocate(10); + alignof(QTypedArrayData<double>::AlignmentDummy)); + QPair<QTypedArrayData<double> *, double *> pair = QTypedArrayData<double>::allocate(10); + QArrayData *array = pair.first; keeper.headers.append(array); QVERIFY(array); - QCOMPARE(array->size, 0); - QCOMPARE(array->alloc, 10u); + QCOMPARE(array->allocatedCapacity(), size_t(10)); // Check that the allocated array can be used. Best tested with a // memory checker, such as valgrind, running. - ::memset(array->data(), 0, 10 * sizeof(double)); + ::memset(pair.second, 0, 10 * sizeof(double)); keeper.headers.clear(); QTypedArrayData<double>::deallocate(array); @@ -1354,136 +1147,6 @@ static inline bool arrayIsFilledWith(const QArrayDataPointer<int> &array, return true; } -void tst_QArrayData::setSharable_data() -{ -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - QTest::addColumn<QArrayDataPointer<int> >("array"); - QTest::addColumn<size_t>("size"); - QTest::addColumn<size_t>("capacity"); - QTest::addColumn<bool>("isCapacityReserved"); - QTest::addColumn<int>("fillValue"); - - QArrayDataPointer<int> null; - QArrayDataPointer<int> empty; empty.clear(); - - static QStaticArrayData<int, 10> staticArrayData = { - Q_STATIC_ARRAY_DATA_HEADER_INITIALIZER(int, 10), - { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 } - }; - - QArrayDataPointer<int> emptyReserved(QTypedArrayData<int>::allocate(5, - QArrayData::CapacityReserved)); - QArrayDataPointer<int> nonEmpty(QTypedArrayData<int>::allocate(5, - QArrayData::Default)); - QArrayDataPointer<int> nonEmptyExtraCapacity( - QTypedArrayData<int>::allocate(10, QArrayData::Default)); - QArrayDataPointer<int> nonEmptyReserved(QTypedArrayData<int>::allocate(15, - QArrayData::CapacityReserved)); - QArrayDataPointer<int> staticArray( - static_cast<QTypedArrayData<int> *>(&staticArrayData.header)); - QArrayDataPointer<int> rawData( - QTypedArrayData<int>::fromRawData(staticArrayData.data, 10)); - - nonEmpty->copyAppend(5, 1); - nonEmptyExtraCapacity->copyAppend(5, 1); - nonEmptyReserved->copyAppend(7, 2); - - QTest::newRow("shared-null") << null << size_t(0) << size_t(0) << false << 0; - QTest::newRow("shared-empty") << empty << size_t(0) << size_t(0) << false << 0; - // unsharable-empty implicitly tested in shared-empty - QTest::newRow("empty-reserved") << emptyReserved << size_t(0) << size_t(5) << true << 0; - QTest::newRow("non-empty") << nonEmpty << size_t(5) << size_t(5) << false << 1; - QTest::newRow("non-empty-extra-capacity") << nonEmptyExtraCapacity << size_t(5) << size_t(10) << false << 1; - QTest::newRow("non-empty-reserved") << nonEmptyReserved << size_t(7) << size_t(15) << true << 2; - QTest::newRow("static-array") << staticArray << size_t(10) << size_t(0) << false << 3; - QTest::newRow("raw-data") << rawData << size_t(10) << size_t(0) << false << 3; -#endif -} - -void tst_QArrayData::setSharable() -{ -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - QFETCH(QArrayDataPointer<int>, array); - QFETCH(size_t, size); - QFETCH(size_t, capacity); - QFETCH(bool, isCapacityReserved); - QFETCH(int, fillValue); - - QVERIFY(array->ref.isShared()); // QTest has a copy - QVERIFY(array->ref.isSharable()); - - QCOMPARE(size_t(array->size), size); - QCOMPARE(size_t(array->alloc), capacity); - QCOMPARE(bool(array->capacityReserved), isCapacityReserved); - QVERIFY(arrayIsFilledWith(array, fillValue, size)); - - // shared-null becomes shared-empty, may otherwise detach - array.setSharable(true); - - QVERIFY(array->ref.isSharable()); - QVERIFY(arrayIsFilledWith(array, fillValue, size)); - - { - QArrayDataPointer<int> copy(array); - QVERIFY(array->ref.isShared()); - QVERIFY(array->ref.isSharable()); - QCOMPARE(copy.data(), array.data()); - } - - // Unshare, must detach - array.setSharable(false); - - // Immutability (alloc == 0) is lost on detach, as is additional capacity - // if capacityReserved flag is not set. - if ((capacity == 0 && size != 0) - || (!isCapacityReserved && capacity > size)) - capacity = size; - - QVERIFY(!array->ref.isShared()); - QVERIFY(!array->ref.isSharable()); - - QCOMPARE(size_t(array->size), size); - QCOMPARE(size_t(array->alloc), capacity); - QCOMPARE(bool(array->capacityReserved), isCapacityReserved); - QVERIFY(arrayIsFilledWith(array, fillValue, size)); - - { - QArrayDataPointer<int> copy(array); - QVERIFY(!array->ref.isShared()); - QVERIFY(!array->ref.isSharable()); - - // Null/empty is always shared - QCOMPARE(copy->ref.isShared(), !(size || isCapacityReserved)); - QVERIFY(copy->ref.isSharable()); - - QCOMPARE(size_t(copy->size), size); - QCOMPARE(size_t(copy->alloc), capacity); - QCOMPARE(bool(copy->capacityReserved), isCapacityReserved); - QVERIFY(arrayIsFilledWith(copy, fillValue, size)); - } - - // Make sharable, again - array.setSharable(true); - - QCOMPARE(array->ref.isShared(), !(size || isCapacityReserved)); - QVERIFY(array->ref.isSharable()); - - QCOMPARE(size_t(array->size), size); - QCOMPARE(size_t(array->alloc), capacity); - QCOMPARE(bool(array->capacityReserved), isCapacityReserved); - QVERIFY(arrayIsFilledWith(array, fillValue, size)); - - { - QArrayDataPointer<int> copy(array); - QVERIFY(array->ref.isShared()); - QCOMPARE(copy.data(), array.data()); - } - - QCOMPARE(array->ref.isShared(), !(size || isCapacityReserved)); - QVERIFY(array->ref.isSharable()); -#endif -} - struct ResetOnDtor { ResetOnDtor() @@ -1517,7 +1180,7 @@ void fromRawData_impl() { // Default: Immutable, sharable SimpleVector<T> raw = SimpleVector<T>::fromRawData(array, - sizeof(array)/sizeof(array[0]), QArrayData::Default); + sizeof(array)/sizeof(array[0]), QArrayData::DefaultRawFlags); QCOMPARE(raw.size(), size_t(11)); QCOMPARE((const T *)raw.constBegin(), array); @@ -1531,37 +1194,6 @@ void fromRawData_impl() QCOMPARE(raw.back(), T(11)); QVERIFY((const T *)raw.constBegin() != array); } - -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - { - // Immutable, unsharable - SimpleVector<T> raw = SimpleVector<T>::fromRawData(array, - sizeof(array)/sizeof(array[0]), QArrayData::Unsharable); - - QCOMPARE(raw.size(), size_t(11)); - QCOMPARE((const T *)raw.constBegin(), array); - QCOMPARE((const T *)raw.constEnd(), (const T *)(array + sizeof(array)/sizeof(array[0]))); - - SimpleVector<T> copy(raw); - QVERIFY(!copy.isSharedWith(raw)); - QVERIFY(!raw.isShared()); - - QCOMPARE(copy.size(), size_t(11)); - - for (size_t i = 0; i < 11; ++i) { - QCOMPARE(const_(copy)[i], const_(raw)[i]); - QCOMPARE(const_(copy)[i], T(i + 1)); - } - - QCOMPARE(raw.size(), size_t(11)); - QCOMPARE((const T *)raw.constBegin(), array); - QCOMPARE((const T *)raw.constEnd(), (const T *)(array + sizeof(array)/sizeof(array[0]))); - - // Detach - QCOMPARE(raw.back(), T(11)); - QVERIFY((const T *)raw.constBegin() != array); - } -#endif } void tst_QArrayData::fromRawData_data() @@ -1593,17 +1225,17 @@ void tst_QArrayData::literals() { { QArrayDataPointer<char> d = Q_ARRAY_LITERAL(char, "ABCDEFGHIJ"); - QCOMPARE(d->size, 10 + 1); + QCOMPARE(d.size, 10u + 1u); for (int i = 0; i < 10; ++i) - QCOMPARE(d->data()[i], char('A' + i)); + QCOMPARE(d.data()[i], char('A' + i)); } { // wchar_t is not necessarily 2-bytes QArrayDataPointer<wchar_t> d = Q_ARRAY_LITERAL(wchar_t, L"ABCDEFGHIJ"); - QCOMPARE(d->size, 10 + 1); + QCOMPARE(d.size, 10u + 1u); for (int i = 0; i < 10; ++i) - QCOMPARE(d->data()[i], wchar_t('A' + i)); + QCOMPARE(d.data()[i], wchar_t('A' + i)); } { @@ -1615,10 +1247,6 @@ void tst_QArrayData::literals() // v.capacity() is unspecified, for now QVERIFY(v.isStatic()); - -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - QVERIFY(v.isSharable()); -#endif QCOMPARE((void*)(const char*)(v.constBegin() + v.size()), (void*)(const char*)v.constEnd()); for (int i = 0; i < 10; ++i) @@ -1645,26 +1273,26 @@ void tst_QArrayData::variadicLiterals() { QArrayDataPointer<int> d = Q_ARRAY_LITERAL(int, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9); - QCOMPARE(d->size, 10); + QCOMPARE(d.size, 10u); for (int i = 0; i < 10; ++i) - QCOMPARE(d->data()[i], i); + QCOMPARE(d.data()[i], i); } { QArrayDataPointer<char> d = Q_ARRAY_LITERAL(char, 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'); - QCOMPARE(d->size, 10); + QCOMPARE(d.size, 10u); for (int i = 0; i < 10; ++i) - QCOMPARE(d->data()[i], char('A' + i)); + QCOMPARE(d.data()[i], char('A' + i)); } { QArrayDataPointer<const char *> d = Q_ARRAY_LITERAL(const char *, "A", "B", "C", "D", "E", "F", "G", "H", "I", "J"); - QCOMPARE(d->size, 10); + QCOMPARE(d.size, 10u); for (int i = 0; i < 10; ++i) { - QCOMPARE(d->data()[i][0], char('A' + i)); - QCOMPARE(d->data()[i][1], '\0'); + QCOMPARE(d.data()[i][0], char('A' + i)); + QCOMPARE(d.data()[i][1], '\0'); } } @@ -1677,10 +1305,6 @@ void tst_QArrayData::variadicLiterals() // v.capacity() is unspecified, for now QVERIFY(v.isStatic()); - -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - QVERIFY(v.isSharable()); -#endif QCOMPARE((const int *)(v.constBegin() + v.size()), (const int *)v.constEnd()); for (int i = 0; i < 7; ++i) diff --git a/tests/auto/corelib/tools/qarraydata_strictiterators/qarraydata_strictiterators.pro b/tests/auto/corelib/tools/qarraydata_strictiterators/qarraydata_strictiterators.pro deleted file mode 100644 index b01fbd84d1..0000000000 --- a/tests/auto/corelib/tools/qarraydata_strictiterators/qarraydata_strictiterators.pro +++ /dev/null @@ -1,3 +0,0 @@ -include(../qarraydata/qarraydata.pro) -TARGET = tst_qarraydata_strictiterators -DEFINES += QT_STRICT_ITERATORS=1 tst_QArrayData=tst_QArrayData_StrictIterators diff --git a/tests/auto/corelib/tools/qbitarray/tst_qbitarray.cpp b/tests/auto/corelib/tools/qbitarray/tst_qbitarray.cpp index 9a7c099228..b2c7915aa0 100644 --- a/tests/auto/corelib/tools/qbitarray/tst_qbitarray.cpp +++ b/tests/auto/corelib/tools/qbitarray/tst_qbitarray.cpp @@ -86,6 +86,9 @@ private slots: void resize(); void fromBits_data(); void fromBits(); + + void toUInt32_data(); + void toUInt32(); }; void tst_QBitArray::size_data() @@ -667,5 +670,95 @@ void tst_QBitArray::fromBits() QCOMPARE(QBitArray::fromBits(fromBits.bits(), fromBits.size()), expected); } +void tst_QBitArray::toUInt32_data() +{ + QTest::addColumn<QBitArray>("data"); + QTest::addColumn<int>("endianness"); + QTest::addColumn<bool>("check"); + QTest::addColumn<quint32>("result"); + + QTest::newRow("ctor") << QBitArray() + << static_cast<int>(QSysInfo::Endian::LittleEndian) + << true + << quint32(0); + + QTest::newRow("empty") << QBitArray(0) + << static_cast<int>(QSysInfo::Endian::LittleEndian) + << true + << quint32(0); + + QTest::newRow("LittleEndian4") << QStringToQBitArray(QString("0111")) + << static_cast<int>(QSysInfo::Endian::LittleEndian) + << true + << quint32(14); + + QTest::newRow("BigEndian4") << QStringToQBitArray(QString("0111")) + << static_cast<int>(QSysInfo::Endian::BigEndian) + << true + << quint32(7); + + QTest::newRow("LittleEndian8") << QStringToQBitArray(QString("01111111")) + << static_cast<int>(QSysInfo::Endian::LittleEndian) + << true + << quint32(254); + + QTest::newRow("BigEndian8") << QStringToQBitArray(QString("01111111")) + << static_cast<int>(QSysInfo::Endian::BigEndian) + << true + << quint32(127); + + QTest::newRow("LittleEndian16") << QStringToQBitArray(QString("0111111111111111")) + << static_cast<int>(QSysInfo::Endian::LittleEndian) + << true + << quint32(65534); + + QTest::newRow("BigEndian16") << QStringToQBitArray(QString("0111111111111111")) + << static_cast<int>(QSysInfo::Endian::BigEndian) + << true + << quint32(32767); + + QTest::newRow("LittleEndian31") << QBitArray(31, true) + << static_cast<int>(QSysInfo::Endian::LittleEndian) + << true + << quint32(2147483647); + + QTest::newRow("BigEndian31") << QBitArray(31, true) + << static_cast<int>(QSysInfo::Endian::BigEndian) + << true + << quint32(2147483647); + + QTest::newRow("LittleEndian32") << QBitArray(32, true) + << static_cast<int>(QSysInfo::Endian::LittleEndian) + << true + << quint32(4294967295); + + QTest::newRow("BigEndian32") << QBitArray(32, true) + << static_cast<int>(QSysInfo::Endian::BigEndian) + << true + << quint32(4294967295); + + QTest::newRow("LittleEndian33") << QBitArray(33, true) + << static_cast<int>(QSysInfo::Endian::LittleEndian) + << false + << quint32(0); + + QTest::newRow("BigEndian33") << QBitArray(33, true) + << static_cast<int>(QSysInfo::Endian::BigEndian) + << false + << quint32(0); +} + +void tst_QBitArray::toUInt32() +{ + QFETCH(QBitArray, data); + QFETCH(int, endianness); + QFETCH(bool, check); + QFETCH(quint32, result); + bool ok = false; + + QCOMPARE(data.toUInt32(static_cast<QSysInfo::Endian>(endianness), &ok), result); + QCOMPARE(ok, check); +} + QTEST_APPLESS_MAIN(tst_QBitArray) #include "tst_qbitarray.moc" diff --git a/tests/auto/corelib/tools/qflatmap/qflatmap.pro b/tests/auto/corelib/tools/qflatmap/qflatmap.pro new file mode 100644 index 0000000000..3927cee30c --- /dev/null +++ b/tests/auto/corelib/tools/qflatmap/qflatmap.pro @@ -0,0 +1,4 @@ +CONFIG += testcase +TARGET = tst_qflatmap +QT = core-private testlib +SOURCES = tst_qflatmap.cpp diff --git a/tests/auto/corelib/tools/qflatmap/tst_qflatmap.cpp b/tests/auto/corelib/tools/qflatmap/tst_qflatmap.cpp new file mode 100644 index 0000000000..a5ae6f5f44 --- /dev/null +++ b/tests/auto/corelib/tools/qflatmap/tst_qflatmap.cpp @@ -0,0 +1,453 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest/QtTest> + +#include <private/qflatmap_p.h> +#include <qbytearray.h> +#include <qstring.h> +#include <qstringview.h> +#include <qvarlengtharray.h> +#include <qvector.h> + +#include <algorithm> +#include <list> +#include <tuple> + +class tst_QFlatMap : public QObject +{ + Q_OBJECT +private slots: + void constructing(); + void constAccess(); + void insertion(); + void removal(); + void extraction(); + void iterators(); + void statefulComparator(); + void transparency(); + void viewIterators(); + void varLengthArray(); +}; + +void tst_QFlatMap::constructing() +{ + using Map = QFlatMap<int, QByteArray>; + Map fmDefault; + QVERIFY(fmDefault.isEmpty()); + QCOMPARE(fmDefault.size(), Map::size_type(0)); + QCOMPARE(fmDefault.size(), fmDefault.count()); + + auto key_compare = fmDefault.key_comp(); + auto selfbuilt_value_compare + = [&key_compare](const Map::value_type &a, const Map::value_type &b) + { + return key_compare(a.first, b.first); + }; + auto value_compare = fmDefault.value_comp(); + + Map::key_container_type kv = { 6, 2, 1 }; + Map::mapped_container_type mv = { "foo", "bar", "baz" }; + Map fmCopy{kv, mv}; + QCOMPARE(fmCopy.size(), Map::size_type(3)); + QVERIFY(std::is_sorted(fmCopy.begin(), fmCopy.end(), selfbuilt_value_compare)); + QVERIFY(std::is_sorted(fmCopy.begin(), fmCopy.end(), value_compare)); + + Map fmMove{ + Map::key_container_type{ 6, 2, 1 }, + Map::mapped_container_type{ "foo", "bar", "baz" } + }; + QCOMPARE(fmMove.size(), Map::size_type(3)); + QVERIFY(std::is_sorted(fmMove.begin(), fmMove.end(), value_compare)); + + auto fmInitList = Map{ { 1, 2 }, { "foo", "bar" } }; + QVERIFY(std::is_sorted(fmInitList.begin(), fmInitList.end(), value_compare)); + + auto fmRange = Map(fmCopy.begin(), fmCopy.end()); + QVERIFY(std::is_sorted(fmRange.begin(), fmRange.end(), value_compare)); + + kv.clear(); + mv.clear(); + std::vector<Map::value_type> sv; + for (auto it = fmRange.begin(); it != fmRange.end(); ++it) { + kv.push_back(it->first); + mv.push_back(it->second); + sv.push_back(*it); + } + auto fmFromSortedVectorCopy = Map(Qt::OrderedUniqueRange, kv, mv); + auto fmFromSortedVectorMove = Map(Qt::OrderedUniqueRange, Map::key_container_type(kv), + Map::mapped_container_type(mv)); + auto fmFromSortedInitList = Map(Qt::OrderedUniqueRange, { { 1, "foo" }, { 2, "bar" } }); + auto fmFromSortedRange = Map(Qt::OrderedUniqueRange, sv.begin(), sv.end()); +} + +void tst_QFlatMap::constAccess() +{ + using Map = QFlatMap<QByteArray, QByteArray>; + const Map m{ { { "foo", "FOO" }, { "bar", "BAR" } } }; + + const std::vector<Map::value_type> v{ { "foo", "FOO" }, { "bar", "BAR" } }; + + QCOMPARE(m.value("foo").data(), "FOO"); + QCOMPARE(m.value("bar").data(), "BAR"); + QCOMPARE(m.value("nix"), QByteArray()); + QCOMPARE(m.value("nix", "NIX").data(), "NIX"); + QCOMPARE(m["foo"].data(), "FOO"); + QCOMPARE(m["bar"].data(), "BAR"); + QCOMPARE(m["nix"], QByteArray()); + QVERIFY(m.contains("foo")); + QVERIFY(!m.contains("nix")); +} + +void tst_QFlatMap::insertion() +{ + using Map = QFlatMap<QByteArray, QByteArray>; + Map m; + QByteArray foo = "foo"; + m[foo] = foo.toUpper(); + m["bar"] = "BAR"; + m["baz"] = "BAZ"; + QVERIFY(m.insert("oof", "eek").second); + QVERIFY(!m.insert("oof", "OOF").second); + const std::vector<Map::value_type> container = { { "bla", "BLA" }, { "blubb", "BLUBB" } }; + m.insert(container.begin(), container.end()); + QCOMPARE(m.value("foo").data(), "FOO"); + QCOMPARE(m.value("bar").data(), "BAR"); + QCOMPARE(m.value("baz").data(), "BAZ"); + QCOMPARE(m.value("oof").data(), "OOF"); + QCOMPARE(m.value("bla").data(), "BLA"); + QCOMPARE(m.value("blubb").data(), "BLUBB"); + + Map::value_type a1[] = { { "narf", "NARF" }, + { "zort", "ZORT" }, + { "troz", "TROZ" } }; + Map::value_type a2[] = { { "gnampf", "GNAMPF" }, + { "narf", "NARFFFF" }, + { "narf", "NARFFFFF" }, + { "narf", "NARFFFFFF" } }; + m.insert(std::begin(a1), std::end(a1)); + m.insert(Qt::OrderedUniqueRange, std::begin(a2), std::end(a2)); + QCOMPARE(m.size(), 10); + QCOMPARE(m.value("narf").data(), "NARFFFFFF"); + QCOMPARE(m.value("gnampf").data(), "GNAMPF"); +} + +void tst_QFlatMap::extraction() +{ + using Map = QFlatMap<int, QByteArray>; + Map::key_container_type expectedKeys = { 1, 2, 3 }; + Map::mapped_container_type expectedValues = { "een", "twee", "dree" }; + Map m(expectedKeys, expectedValues); + auto keys = m.keys(); + auto values = m.values(); + QCOMPARE(keys, expectedKeys); + QCOMPARE(values, expectedValues); + Map::containers c = std::move(m).extract(); + QCOMPARE(c.keys, expectedKeys); + QCOMPARE(c.values, expectedValues); +} + +void tst_QFlatMap::iterators() +{ + using Map = QFlatMap<int, QByteArray>; + auto m = Map{ { 1, "foo" }, { 2, "bar" }, { 3, "baz" } }; + { + // forward / backward + Map::iterator a = m.begin(); + QVERIFY(a != m.end()); + QCOMPARE(a.key(), 1); + QCOMPARE(a.value(), "foo"); + ++a; + QCOMPARE(a.key(), 2); + QCOMPARE(a.value(), "bar"); + Map::iterator b = a++; + QCOMPARE(std::tie(a.key(), a.value()), std::make_tuple(3, "baz")); + QCOMPARE(std::tie(b.key(), b.value()), std::make_tuple(2, "bar")); + QCOMPARE(++a, m.end()); + --a; + QCOMPARE(std::tie(a.key(), a.value()), std::make_tuple(3, "baz")); + a.value() = "buzz"; + b = a--; + QCOMPARE(std::tie(a.key(), a.value()), std::make_tuple(2, "bar")); + QCOMPARE(std::tie(b.key(), b.value()), std::make_tuple(3, "buzz")); + b.value() = "baz"; + + // random access + a = m.begin(); + a += 2; + QCOMPARE(std::tie(a.key(), a.value()), std::make_tuple(3, "baz")); + a = m.begin() + 1; + QCOMPARE(std::tie(a.key(), a.value()), std::make_tuple(2, "bar")); + a = 1 + m.begin(); + QCOMPARE(std::tie(a.key(), a.value()), std::make_tuple(2, "bar")); + a = m.end() - 1; + QCOMPARE(std::tie(a.key(), a.value()), std::make_tuple(3, "baz")); + b = m.end(); + b -= 1; + QCOMPARE(std::tie(b.key(), b.value()), std::make_tuple(3, "baz")); + QCOMPARE(m.end() - m.begin(), m.size()); + + // comparison + a = m.begin() + m.size() - 1; + b = m.end() - 1; + QVERIFY(a == b); + a = m.begin(); + b = m.end(); + QVERIFY(a < b); + QVERIFY(a <= b); + QVERIFY(b > a); + QVERIFY(b >= a); + a = b; + QVERIFY(!(a < b)); + QVERIFY(a <= b); + QVERIFY(!(b > a)); + QVERIFY(b >= a); + + // de-referencing + a = m.begin(); + auto ref0 = *a; + QCOMPARE(ref0.first, 1); + QCOMPARE(ref0.second, "foo"); + auto ref1 = a[1]; + QCOMPARE(ref1.first, 2); + QCOMPARE(ref1.second, "bar"); + } + { + // forward / backward + Map::const_iterator a = m.cbegin(); + QVERIFY(a != m.cend()); + QCOMPARE(a.key(), 1); + QCOMPARE(a.value(), "foo"); + ++a; + QCOMPARE(a.key(), 2); + QCOMPARE(a.value(), "bar"); + Map::const_iterator b = a++; + QCOMPARE(std::tie(a.key(), a.value()), std::make_tuple(3, "baz")); + QCOMPARE(std::tie(b.key(), b.value()), std::make_tuple(2, "bar")); + QCOMPARE(++a, m.cend()); + --a; + QCOMPARE(std::tie(a.key(), a.value()), std::make_tuple(3, "baz")); + b = a--; + QCOMPARE(std::tie(a.key(), a.value()), std::make_tuple(2, "bar")); + + // random access + a = m.cbegin(); + a += 2; + QCOMPARE(std::tie(a.key(), a.value()), std::make_tuple(3, "baz")); + a = m.cbegin() + 1; + QCOMPARE(std::tie(a.key(), a.value()), std::make_tuple(2, "bar")); + a = 1 + m.cbegin(); + QCOMPARE(std::tie(a.key(), a.value()), std::make_tuple(2, "bar")); + a = m.cend() - 1; + QCOMPARE(std::tie(a.key(), a.value()), std::make_tuple(3, "baz")); + b = m.cend(); + b -= 1; + QCOMPARE(std::tie(b.key(), b.value()), std::make_tuple(3, "baz")); + QCOMPARE(m.cend() - m.cbegin(), m.size()); + + // comparison + a = m.cbegin() + m.size() - 1; + b = m.cend() - 1; + QVERIFY(a == b); + a = m.cbegin(); + b = m.cend(); + QVERIFY(a < b); + QVERIFY(a <= b); + QVERIFY(b > a); + QVERIFY(b >= a); + a = b; + QVERIFY(!(a < b)); + QVERIFY(a <= b); + QVERIFY(!(b > a)); + QVERIFY(b >= a); + + // de-referencing + a = m.cbegin(); + auto ref0 = *a; + QCOMPARE(ref0.first, 1); + QCOMPARE(ref0.second, "foo"); + auto ref1 = a[1]; + QCOMPARE(ref1.first, 2); + QCOMPARE(ref1.second, "bar"); + } + { + Map::iterator it = m.begin(); + Map::const_iterator cit = it; + Q_UNUSED(it); + Q_UNUSED(cit); + } + { + std::list<Map::value_type> revlst; + std::copy(m.begin(), m.end(), std::front_inserter(revlst)); + std::vector<Map::value_type> v0; + std::copy(revlst.begin(), revlst.end(), std::back_inserter(v0)); + std::vector<Map::value_type> v1; + std::copy(m.rbegin(), m.rend(), std::back_inserter(v1)); + const Map cm = m; + std::vector<Map::value_type> v2; + std::copy(cm.rbegin(), cm.rend(), std::back_inserter(v2)); + std::vector<Map::value_type> v3; + std::copy(m.crbegin(), m.crend(), std::back_inserter(v3)); + QCOMPARE(v0, v1); + QCOMPARE(v1, v2); + QCOMPARE(v2, v3); + } +} + +void tst_QFlatMap::removal() +{ + using Map = QFlatMap<int, QByteArray>; + Map m({ { 2, "bar" }, { 3, "baz" }, { 1, "foo" } }); + QCOMPARE(m.value(2).data(), "bar"); + QCOMPARE(m.take(2).data(), "bar"); + QVERIFY(!m.contains(2)); + QCOMPARE(m.size(), Map::size_type(2)); + QVERIFY(m.remove(1)); + QVERIFY(!m.contains(1)); + QVERIFY(!m.remove(1)); + QCOMPARE(m.size(), Map::size_type(1)); + m.clear(); + QVERIFY(m.isEmpty()); + QVERIFY(m.empty()); + + m[1] = "een"; + m[2] = "twee"; + m[3] = "dree"; + auto it = m.lower_bound(1); + QCOMPARE(it.key(), 1); + it = m.erase(it); + QCOMPARE(it.key(), 2); + QVERIFY(!m.contains(1)); +} + +void tst_QFlatMap::statefulComparator() +{ + struct CountingCompare { + mutable int count = 0; + + bool operator()(const QString &lhs, const QString &rhs) const + { + ++count; + return lhs < rhs; + } + }; + + using Map = QFlatMap<QString, QString, CountingCompare>; + auto m1 = Map{ { "en", "een"}, { "to", "twee" }, { "tre", "dree" } }; + QVERIFY(m1.key_comp().count > 0); + auto m2 = Map(m1.key_comp()); + QCOMPARE(m2.key_comp().count, m1.key_comp().count); + m2.insert(m1.begin(), m1.end()); + QVERIFY(m2.key_comp().count > m1.key_comp().count); +} + +void tst_QFlatMap::transparency() +{ + struct StringViewCompare + { + using is_transparent = void; + bool operator()(const QStringView &lhs, const QStringView &rhs) const + { + return lhs < rhs; + } + }; + + using Map = QFlatMap<QString, QString, StringViewCompare>; + auto m = Map{ { "one", "een" }, { "two", "twee" }, { "three", "dree" } }; + + const QString numbers = "one two three"; + const QStringView sv1{numbers.constData(), 3}; + const QStringView sv2{numbers.constData() + 4, 3}; + const QStringView sv3{numbers.constData() + 8, 5}; + QCOMPARE(m.lower_bound(sv1).value(), "een"); + QCOMPARE(m.lower_bound(sv2).value(), "twee"); + QCOMPARE(m.lower_bound(sv3).value(), "dree"); +} + +void tst_QFlatMap::viewIterators() +{ + using Map = QFlatMap<QByteArray, QByteArray>; + Map m({ { "yksi", "een"}, { "kaksi", "twee" }, { "kolme", "dree" } }); + { + std::vector<QByteArray> keys; + std::transform(m.begin(), m.end(), std::back_inserter(keys), + [](const Map::value_type &v) + { + return v.first; + }); + auto it = keys.begin(); + QCOMPARE(*it, "kaksi"); + QCOMPARE(it->length(), 5); + ++it; + QCOMPARE(*it, "kolme"); + it++; + QCOMPARE(*it, "yksi"); + ++it; + QCOMPARE(it, keys.end()); + --it; + QCOMPARE(*it, "yksi"); + it--; + QCOMPARE(*it, "kolme"); + } + { + std::vector<QByteArray> values; + std::transform(m.begin(), m.end(), std::back_inserter(values), + [](const Map::value_type &v) + { + return v.second; + }); + auto it = values.begin(); + QCOMPARE(*it, "twee"); + QCOMPARE(it->length(), 4); + ++it; + QCOMPARE(*it, "dree"); + it++; + QCOMPARE(*it, "een"); + ++it; + QCOMPARE(it, values.end()); + --it; + QCOMPARE(*it, "een"); + it--; + QCOMPARE(*it, "dree"); + } +} + +void tst_QFlatMap::varLengthArray() +{ + using Map = QFlatMap<int, QByteArray, std::less<int>, + QVarLengthArray<int, 1024>, QVarLengthArray<QByteArray, 1024>>; + Map m{ { 2, "twee" } }; + m.insert(1, "een"); + m.remove(1); + QVERIFY(!m.isEmpty()); + m.remove(2); + QVERIFY(m.isEmpty()); +} + +QTEST_APPLESS_MAIN(tst_QFlatMap) +#include "tst_qflatmap.moc" diff --git a/tests/auto/corelib/tools/qhash/tst_qhash.cpp b/tests/auto/corelib/tools/qhash/tst_qhash.cpp index b98ac38288..91cd3eb0bd 100644 --- a/tests/auto/corelib/tools/qhash/tst_qhash.cpp +++ b/tests/auto/corelib/tools/qhash/tst_qhash.cpp @@ -1373,13 +1373,6 @@ void tst_QHash::noNeedlessRehashes() void tst_QHash::const_shared_null() { QHash<int, QString> hash2; -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - QHash<int, QString> hash1; - hash1.setSharable(false); - QVERIFY(hash1.isDetached()); - - hash2.setSharable(true); -#endif QVERIFY(!hash2.isDetached()); } diff --git a/tests/auto/corelib/tools/qhash_strictiterators/qhash_strictiterators.pro b/tests/auto/corelib/tools/qhash_strictiterators/qhash_strictiterators.pro deleted file mode 100644 index 715e9bf0c9..0000000000 --- a/tests/auto/corelib/tools/qhash_strictiterators/qhash_strictiterators.pro +++ /dev/null @@ -1,3 +0,0 @@ -include(../qhash/qhash.pro) -TARGET = tst_qhash_strictiterators -DEFINES += QT_STRICT_ITERATORS tst_QHash=tst_QHash_StrictIterators diff --git a/tests/auto/corelib/tools/qlinkedlist/tst_qlinkedlist.cpp b/tests/auto/corelib/tools/qlinkedlist/tst_qlinkedlist.cpp index df42b5dea9..ed0abff456 100644 --- a/tests/auto/corelib/tools/qlinkedlist/tst_qlinkedlist.cpp +++ b/tests/auto/corelib/tools/qlinkedlist/tst_qlinkedlist.cpp @@ -225,8 +225,6 @@ private slots: void constSharedNullInt() const; void constSharedNullMovable() const; void constSharedNullComplex() const; - - void setSharableInt() const; private: template<typename T> void length() const; template<typename T> void first() const; @@ -1048,13 +1046,6 @@ template<typename T> void tst_QLinkedList::constSharedNull() const { QLinkedList<T> list2; -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - QLinkedList<T> list1; - list1.setSharable(false); - QVERIFY(list1.isDetached()); - - list2.setSharable(true); -#endif QVERIFY(!list2.isDetached()); } @@ -1077,57 +1068,5 @@ void tst_QLinkedList::constSharedNullComplex() const QCOMPARE(liveCount, Complex::getLiveCount()); } - -void tst_QLinkedList::setSharableInt() const -{ -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - QLinkedList<int> orglist; - orglist << 0 << 1 << 2 << 3 << 4 << 5; - int size = 6; - - QLinkedList<int> list; - list = orglist; - - QVERIFY(!list.isDetached()); - list.setSharable(true); - - QCOMPARE(list.size(), size); - - { - QLinkedList<int> copy(list); - QVERIFY(!copy.isDetached()); - QVERIFY(copy.isSharedWith(list)); - } - - list.setSharable(false); - QVERIFY(list.isDetached() || list.isSharedWith(QLinkedList<int>())); - - { - QLinkedList<int> copy(list); - - QVERIFY(copy.isDetached() || copy.isSharedWith(QLinkedList<int>())); - QCOMPARE(copy.size(), size); - QCOMPARE(copy, list); - } - - list.setSharable(true); - - { - QLinkedList<int> copy(list); - - QVERIFY(!copy.isDetached()); - QVERIFY(copy.isSharedWith(list)); - } - - QLinkedList<int>::const_iterator it = list.constBegin(); - for (int i = 0; i < list.size(); ++i) { - QCOMPARE(int(*it), i); - ++it; - } - - QCOMPARE(list.size(), size); -#endif -} - QTEST_APPLESS_MAIN(tst_QLinkedList) #include "tst_qlinkedlist.moc" diff --git a/tests/auto/corelib/tools/qlist/.gitignore b/tests/auto/corelib/tools/qlist/.gitignore deleted file mode 100644 index df208b6e78..0000000000 --- a/tests/auto/corelib/tools/qlist/.gitignore +++ /dev/null @@ -1 +0,0 @@ -tst_qlist diff --git a/tests/auto/corelib/tools/qlist/qlist.pro b/tests/auto/corelib/tools/qlist/qlist.pro deleted file mode 100644 index 118c607880..0000000000 --- a/tests/auto/corelib/tools/qlist/qlist.pro +++ /dev/null @@ -1,6 +0,0 @@ -CONFIG += testcase -TARGET = tst_qlist -QT = core testlib -qtConfig(c++14): CONFIG += c++14 -qtConfig(c++1z): CONFIG += c++1z -SOURCES = $$PWD/tst_qlist.cpp diff --git a/tests/auto/corelib/tools/qlist/tst_qlist.cpp b/tests/auto/corelib/tools/qlist/tst_qlist.cpp deleted file mode 100644 index cc9a3a16d1..0000000000 --- a/tests/auto/corelib/tools/qlist/tst_qlist.cpp +++ /dev/null @@ -1,2115 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - - -#include <QtTest/QtTest> -#include <QList> - -template <typename T, class MemoryLayout> -class is_qlist_array_memory_layout { - struct No { char c; }; - struct Yes { No n[2]; }; - Q_STATIC_ASSERT(sizeof(No) != sizeof(Yes)); - static No check(...); - static Yes check(MemoryLayout); -public: - enum { value = sizeof(check(typename QList<T>::MemoryLayout())) == sizeof(Yes) }; -}; - -struct Movable { - Movable(char input = 'j') - : i(input) - , state(Constructed) - { - ++liveCount; - } - Movable(const Movable &other) - : i(other.i) - , state(Constructed) - { - check(other.state, Constructed); - ++liveCount; - } - - ~Movable() - { - check(state, Constructed); - i = 0; - --liveCount; - state = Destructed; - } - - bool operator ==(const Movable &other) const - { - check(state, Constructed); - check(other.state, Constructed); - return i == other.i; - } - - bool operator<(const Movable &other) const - { - check(state, Constructed); - check(other.state, Constructed); - return i < other.i; - } - - Movable &operator=(const Movable &other) - { - check(state, Constructed); - check(other.state, Constructed); - i = other.i; - return *this; - } - char i; - - static int getLiveCount() { return liveCount; } -private: - static int liveCount; - - enum State { Constructed = 106, Destructed = 110 }; - uchar state; - - static void check(const uchar state1, const uchar state2) - { - QCOMPARE(state1, state2); - } -}; - -Q_STATIC_ASSERT(sizeof(Movable) < sizeof(void*)); - -int Movable::liveCount = 0; - -QT_BEGIN_NAMESPACE -Q_DECLARE_TYPEINFO(Movable, Q_MOVABLE_TYPE); -QT_END_NAMESPACE - -Q_DECLARE_METATYPE(Movable); - -int qHash(const Movable& movable) -{ - return qHash(movable.i); -} - -struct Optimal -{ - Optimal(char input = 'j') - : i(input), - state(Constructed) - { - ++liveCount; - } - Optimal(const Optimal &other) - : i(other.i), - state(Constructed) - { - check(other.state, Constructed); - ++liveCount; - } - - ~Optimal() - { - check(state, Constructed); - i = 0; - --liveCount; - state = Destructed; - } - - bool operator ==(const Optimal &other) const - { - check(state, Constructed); - check(other.state, Constructed); - return i == other.i; - } - - bool operator<(const Optimal &other) const - { - check(state, Constructed); - check(other.state, Constructed); - return i < other.i; - } - - Optimal &operator=(const Optimal &other) - { - check(state, Constructed); - check(other.state, Constructed); - i = other.i; - return *this; - } - char i; - - static int getLiveCount() { return liveCount; } -private: - static int liveCount; - - enum State { Constructed = 106, Destructed = 110 }; - uchar state; - char padding[sizeof(void*) - 2]; - - static void check(const uchar state1, const uchar state2) - { - QCOMPARE(state1, state2); - } -}; - -Q_STATIC_ASSERT(sizeof(Optimal) == sizeof(void*)); - -int Optimal::liveCount = 0; - -QT_BEGIN_NAMESPACE -Q_DECLARE_TYPEINFO(Optimal, Q_MOVABLE_TYPE); -QT_END_NAMESPACE - -Q_DECLARE_METATYPE(Optimal); - -int qHash(const Optimal& key) -{ - return qHash(key.i); -} - -struct Complex -{ - Complex(int val = 0) - : value(val) - , checkSum(this) - { - ++liveCount; - } - - Complex(Complex const &other) - : value(other.value) - , checkSum(this) - { - ++liveCount; - } - - Complex &operator=(Complex const &other) - { - check(); other.check(); - - value = other.value; - return *this; - } - - ~Complex() - { - --liveCount; - check(); - } - - operator int() const { return value; } - - bool operator==(Complex const &other) const - { - check(); other.check(); - return value == other.value; - } - - bool operator<(Complex const &other) const - { - check(); other.check(); - return value < other.value; - } - - void check() const - { - QVERIFY(this == checkSum); - } - - static int getLiveCount() { return liveCount; } -private: - static int liveCount; - - int value; - void *checkSum; -}; - -int Complex::liveCount = 0; - -Q_DECLARE_METATYPE(Complex); - -// Tests depend on the fact that: -Q_STATIC_ASSERT(!QTypeInfo<int>::isStatic); -Q_STATIC_ASSERT(!QTypeInfo<int>::isComplex); -Q_STATIC_ASSERT(!QTypeInfo<Movable>::isStatic); -Q_STATIC_ASSERT(QTypeInfo<Movable>::isComplex); -Q_STATIC_ASSERT(!QTypeInfo<Optimal>::isStatic); -Q_STATIC_ASSERT(QTypeInfo<Optimal>::isComplex); -Q_STATIC_ASSERT(QTypeInfo<Complex>::isStatic); -Q_STATIC_ASSERT(QTypeInfo<Complex>::isComplex); -// iow: -Q_STATIC_ASSERT(( is_qlist_array_memory_layout<int, QListData::NotIndirectLayout> ::value)); -Q_STATIC_ASSERT((!is_qlist_array_memory_layout<int, QListData::IndirectLayout> ::value)); - -Q_STATIC_ASSERT((!is_qlist_array_memory_layout<Optimal, QListData::InlineWithPaddingLayout> ::value)); -Q_STATIC_ASSERT((!is_qlist_array_memory_layout<Optimal, QListData::NotArrayCompatibleLayout>::value)); -Q_STATIC_ASSERT(( is_qlist_array_memory_layout<Optimal, QListData::NotIndirectLayout> ::value)); -Q_STATIC_ASSERT(( is_qlist_array_memory_layout<Optimal, QListData::ArrayCompatibleLayout> ::value)); -Q_STATIC_ASSERT((!is_qlist_array_memory_layout<Optimal, QListData::IndirectLayout> ::value)); - -Q_STATIC_ASSERT(( is_qlist_array_memory_layout<Movable, QListData::InlineWithPaddingLayout> ::value)); -Q_STATIC_ASSERT(( is_qlist_array_memory_layout<Movable, QListData::NotArrayCompatibleLayout>::value)); -Q_STATIC_ASSERT(( is_qlist_array_memory_layout<Movable, QListData::NotIndirectLayout> ::value)); -Q_STATIC_ASSERT((!is_qlist_array_memory_layout<Movable, QListData::ArrayCompatibleLayout> ::value)); -Q_STATIC_ASSERT((!is_qlist_array_memory_layout<Movable, QListData::IndirectLayout> ::value)); - -Q_STATIC_ASSERT((!is_qlist_array_memory_layout<Complex, QListData::InlineWithPaddingLayout> ::value)); -Q_STATIC_ASSERT(( is_qlist_array_memory_layout<Complex, QListData::NotArrayCompatibleLayout>::value)); -Q_STATIC_ASSERT((!is_qlist_array_memory_layout<Complex, QListData::NotIndirectLayout> ::value)); -Q_STATIC_ASSERT((!is_qlist_array_memory_layout<Complex, QListData::ArrayCompatibleLayout> ::value)); -Q_STATIC_ASSERT(( is_qlist_array_memory_layout<Complex, QListData::IndirectLayout> ::value)); - -class tst_QList : public QObject -{ - Q_OBJECT - -private slots: - void lengthOptimal() const; - void lengthMovable() const; - void lengthComplex() const; - void lengthSignature() const; - void appendOptimal() const; - void appendMovable() const; - void appendComplex() const; - void prepend() const; - void midOptimal() const; - void midMovable() const; - void midComplex() const; - void atOptimal() const; - void atMovable() const; - void atComplex() const; - void firstOptimal() const; - void firstMovable() const; - void firstComplex() const; - void lastOptimal() const; - void lastMovable() const; - void lastComplex() const; - void constFirst() const; - void constLast() const; - void cpp17ctad() const; - void beginOptimal() const; - void beginMovable() const; - void beginComplex() const; - void endOptimal() const; - void endMovable() const; - void endComplex() const; - void containsOptimal() const; - void containsMovable() const; - void containsComplex() const; - void countOptimal() const; - void countMovable() const; - void countComplex() const; - void emptyOptimal() const; - void emptyMovable() const; - void emptyComplex() const; - void endsWithOptimal() const; - void endsWithMovable() const; - void endsWithComplex() const; - void lastIndexOfOptimal() const; - void lastIndexOfMovable() const; - void lastIndexOfComplex() const; - void moveOptimal() const; - void moveMovable() const; - void moveComplex() const; - void removeAllOptimal() const; - void removeAllMovable() const; - void removeAllComplex() const; - void removeAtOptimal() const; - void removeAtMovable() const; - void removeAtComplex() const; - void removeOneOptimal() const; - void removeOneMovable() const; - void removeOneComplex() const; - void replaceOptimal() const; - void replaceMovable() const; - void replaceComplex() const; - void reverseIteratorsOptimal() const; - void reverseIteratorsMovable() const; - void reverseIteratorsComplex() const; - void startsWithOptimal() const; - void startsWithMovable() const; - void startsWithComplex() const; - void swapOptimal() const; - void swapMovable() const; - void swapComplex() const; - void takeAtOptimal() const; - void takeAtMovable() const; - void takeAtComplex() const; - void takeFirstOptimal() const; - void takeFirstMovable() const; - void takeFirstComplex() const; - void takeLastOptimal() const; - void takeLastMovable() const; - void takeLastComplex() const; -#if QT_VERSION < QT_VERSION_CHECK(6,0,0) - void toSetOptimal() const; - void toSetMovable() const; - void toSetComplex() const; - void toStdListOptimal() const; - void toStdListMovable() const; - void toStdListComplex() const; -#endif - void toVectorOptimal() const; - void toVectorMovable() const; - void toVectorComplex() const; - void valueOptimal() const; - void valueMovable() const; - void valueComplex() const; - - void testOperatorsOptimal() const; - void testOperatorsMovable() const; - void testOperatorsComplex() const; - void testSTLIteratorsOptimal() const; - void testSTLIteratorsMovable() const; - void testSTLIteratorsComplex() const; - - void initializeList() const; - - void constSharedNullOptimal() const; - void constSharedNullMovable() const; - void constSharedNullComplex() const; - void setSharableInt_data() const; - void setSharableInt() const; - void setSharableComplex_data() const; - void setSharableComplex() const; - void eraseValidIteratorsOnSharedList() const; - void insertWithValidIteratorsOnSharedList() const; - - void qhashOptimal() const { qhash<Optimal>(); } - void qhashMovable() const { qhash<Movable>(); } - void qhashComplex() const { qhash<Complex>(); } - void reserve() const; -private: - template<typename T> void length() const; - template<typename T> void append() const; - template<typename T> void mid() const; - template<typename T> void at() const; - template<typename T> void first() const; - template<typename T> void last() const; - template<typename T> void begin() const; - template<typename T> void end() const; - template<typename T> void contains() const; - template<typename T> void count() const; - template<typename T> void empty() const; - template<typename T> void endsWith() const; - template<typename T> void lastIndexOf() const; - template<typename T> void move() const; - template<typename T> void qhash() const; - template<typename T> void removeAll() const; - template<typename T> void removeAt() const; - template<typename T> void removeOne() const; - template<typename T> void replace() const; - template<typename T> void reverseIterators() const; - template<typename T> void startsWith() const; - template<typename T> void swap() const; - template<typename T> void takeAt() const; - template<typename T> void takeFirst() const; - template<typename T> void takeLast() const; -#if QT_VERSION < QT_VERSION_CHECK(6,0,0) - template<typename T> void toSet() const; - template<typename T> void toStdList() const; -#endif - template<typename T> void toVector() const; - template<typename T> void value() const; - - template<typename T> void testOperators() const; - template<typename T> void testSTLIterators() const; - - template<typename T> void constSharedNull() const; - - int dummyForGuard; -}; - -template<typename T> struct SimpleValue -{ - static T at(int index) - { - return values[index % maxSize]; - } - static const uint maxSize = 7; - static const T values[maxSize]; -}; - -template<> -const Optimal SimpleValue<Optimal>::values[] = { 10, 20, 30, 40, 100, 101, 102 }; -template<> -const Movable SimpleValue<Movable>::values[] = { 10, 20, 30, 40, 100, 101, 102 }; -template<> -const Complex SimpleValue<Complex>::values[] = { 10, 20, 30, 40, 100, 101, 102 }; - -// Make some macros for the tests to use in order to be slightly more readable... -#define T_FOO SimpleValue<T>::at(0) -#define T_BAR SimpleValue<T>::at(1) -#define T_BAZ SimpleValue<T>::at(2) -#define T_CAT SimpleValue<T>::at(3) -#define T_DOG SimpleValue<T>::at(4) -#define T_BLAH SimpleValue<T>::at(5) -#define T_WEEE SimpleValue<T>::at(6) - -template<typename T> -void tst_QList::length() const -{ - /* Empty list. */ - { - const QList<T> list; - QCOMPARE(list.length(), 0); - } - - /* One entry. */ - { - QList<T> list; - list.append(T_FOO); - QCOMPARE(list.length(), 1); - } - - /* Two entries. */ - { - QList<T> list; - list.append(T_FOO); - list.append(T_BAR); - QCOMPARE(list.length(), 2); - } - - /* Three entries. */ - { - QList<T> list; - list.append(T_FOO); - list.append(T_BAR); - list.append(T_BAZ); - QCOMPARE(list.length(), 3); - } -} - -void tst_QList::lengthOptimal() const -{ - const int liveCount = Optimal::getLiveCount(); - length<Optimal>(); - QCOMPARE(liveCount, Optimal::getLiveCount()); -} - -void tst_QList::lengthMovable() const -{ - const int liveCount = Movable::getLiveCount(); - length<Movable>(); - QCOMPARE(liveCount, Movable::getLiveCount()); -} - -void tst_QList::lengthComplex() const -{ - const int liveCount = Complex::getLiveCount(); - length<Complex>(); - QCOMPARE(liveCount, Complex::getLiveCount()); -} - -void tst_QList::lengthSignature() const -{ - /* Constness. */ - { - const QList<int> list; - /* The function should be const. */ - list.length(); - } -} - -template<typename T> -void tst_QList::append() const -{ - /* test append(const QList<T> &) function */ - T one(T_FOO); - T two(T_BAR); - T three(T_BAZ); - T four(T_CAT); - QList<T> list1; - QList<T> list2; - QList<T> listTotal; - list1.append(one); - list1.append(two); - list2.append(three); - list2.append(four); - list1.append(list2); - listTotal.append(one); - listTotal.append(two); - listTotal.append(three); - listTotal.append(four); - QCOMPARE(list1, listTotal); -} - -void tst_QList::appendOptimal() const -{ - const int liveCount = Optimal::getLiveCount(); - append<Optimal>(); - QCOMPARE(liveCount, Optimal::getLiveCount()); -} - -void tst_QList::appendMovable() const -{ - const int liveCount = Movable::getLiveCount(); - append<Movable>(); - QCOMPARE(liveCount, Movable::getLiveCount()); -} - -void tst_QList::appendComplex() const -{ - const int liveCount = Complex::getLiveCount(); - append<Complex>(); - QCOMPARE(liveCount, Complex::getLiveCount()); -} - -void tst_QList::prepend() const -{ - QList<int *> list; - int *t1 = new int(0); - list.prepend(t1); - QVERIFY(list.size() == 1); - QVERIFY(list.at(0) == t1); - int *t2 = new int(0); - list.prepend(t2); - QVERIFY(list.size() == 2); - QVERIFY(list.at(0) == t2); - QVERIFY(list.at(1) == t1); - int *t3 = new int(0); - list.prepend(t3); - QVERIFY(list.size() == 3); - QVERIFY(list.at(0) == t3); - QVERIFY(list.at(1) == t2); - QVERIFY(list.at(2) == t1); - list.removeAll(t2); - delete t2; - QVERIFY(list.size() == 2); - QVERIFY(list.at(0) == t3); - QVERIFY(list.at(1) == t1); - int *t4 = new int(0); - list.prepend(t4); - QVERIFY(list.size() == 3); - QVERIFY(list.at(0) == t4); - QVERIFY(list.at(1) == t3); - QVERIFY(list.at(2) == t1); - qDeleteAll(list); - list.clear(); -} - -template<typename T> -void tst_QList::mid() const -{ - QList<T> list; - list << T_FOO << T_BAR << T_BAZ << T_CAT << T_DOG << T_BLAH << T_WEEE; - - QCOMPARE(list.mid(3, 3), - QList<T>() << T_CAT << T_DOG << T_BLAH); - - QList<T> list1; - QCOMPARE(list1.mid(1, 1).length(), 0); -} - -void tst_QList::midOptimal() const -{ - const int liveCount = Optimal::getLiveCount(); - mid<Optimal>(); - QCOMPARE(liveCount, Optimal::getLiveCount()); -} - -void tst_QList::midMovable() const -{ - const int liveCount = Movable::getLiveCount(); - mid<Movable>(); - QCOMPARE(liveCount, Movable::getLiveCount()); -} - -void tst_QList::midComplex() const -{ - const int liveCount = Complex::getLiveCount(); - mid<Complex>(); - QCOMPARE(liveCount, Complex::getLiveCount()); -} - -template<typename T> -void tst_QList::at() const -{ - // test at() and make sure it functions correctly with some simple list manipulation. - QList<T> list; - - // create a list - list << T_FOO << T_BAR << T_BAZ; - QVERIFY(list.size() == 3); - QCOMPARE(list.at(0), T_FOO); - QCOMPARE(list.at(1), T_BAR); - QCOMPARE(list.at(2), T_BAZ); - - // append an item - list << T_CAT; - QVERIFY(list.size() == 4); - QCOMPARE(list.at(0), T_FOO); - QCOMPARE(list.at(1), T_BAR); - QCOMPARE(list.at(2), T_BAZ); - QCOMPARE(list.at(3), T_CAT); - - // remove an item - list.removeAt(1); - QVERIFY(list.size() == 3); - QCOMPARE(list.at(0), T_FOO); - QCOMPARE(list.at(1), T_BAZ); - QCOMPARE(list.at(2), T_CAT); -} - -void tst_QList::atOptimal() const -{ - const int liveCount = Optimal::getLiveCount(); - at<Optimal>(); - QCOMPARE(liveCount, Optimal::getLiveCount()); -} - -void tst_QList::atMovable() const -{ - const int liveCount = Movable::getLiveCount(); - at<Movable>(); - QCOMPARE(liveCount, Movable::getLiveCount()); -} - -void tst_QList::atComplex() const -{ - const int liveCount = Complex::getLiveCount(); - at<Complex>(); - QCOMPARE(liveCount, Complex::getLiveCount()); -} - -template<typename T> -void tst_QList::first() const -{ - QList<T> list; - list << T_FOO << T_BAR; - - QCOMPARE(list.first(), T_FOO); - - // remove an item, make sure it still works - list.pop_front(); - QVERIFY(list.size() == 1); - QCOMPARE(list.first(), T_BAR); -} - -void tst_QList::firstOptimal() const -{ - const int liveCount = Optimal::getLiveCount(); - first<Optimal>(); - QCOMPARE(liveCount, Optimal::getLiveCount()); -} - -void tst_QList::firstMovable() const -{ - const int liveCount = Movable::getLiveCount(); - first<Movable>(); - QCOMPARE(liveCount, Movable::getLiveCount()); -} - -void tst_QList::firstComplex() const -{ - const int liveCount = Complex::getLiveCount(); - first<Complex>(); - QCOMPARE(liveCount, Complex::getLiveCount()); -} - -void tst_QList::constFirst() const -{ - // Based on tst_QVector::constFirst() - QList<int> list; - list << 69 << 42 << 3; - - // test it starts ok - QCOMPARE(list.constFirst(), 69); - QVERIFY(list.isDetached()); - - QList<int> listCopy = list; - QVERIFY(!list.isDetached()); - QVERIFY(!listCopy.isDetached()); - QVERIFY(list.isSharedWith(listCopy)); - QVERIFY(listCopy.isSharedWith(list)); - - QCOMPARE(list.constFirst(), 69); - QCOMPARE(listCopy.constFirst(), 69); - - QVERIFY(!list.isDetached()); - QVERIFY(!listCopy.isDetached()); - QVERIFY(list.isSharedWith(listCopy)); - QVERIFY(listCopy.isSharedWith(list)); - - // test removal changes - list.removeAt(0); - QVERIFY(list.isDetached()); - QVERIFY(!list.isSharedWith(listCopy)); - QCOMPARE(list.constFirst(), 42); - QCOMPARE(listCopy.constFirst(), 69); - - listCopy = list; - QVERIFY(!list.isDetached()); - QVERIFY(!listCopy.isDetached()); - QVERIFY(list.isSharedWith(listCopy)); - QVERIFY(listCopy.isSharedWith(list)); - - QCOMPARE(list.constFirst(), 42); - QCOMPARE(listCopy.constFirst(), 42); - - QVERIFY(!list.isDetached()); - QVERIFY(!listCopy.isDetached()); - QVERIFY(list.isSharedWith(listCopy)); - QVERIFY(listCopy.isSharedWith(list)); - - // test prepend changes - list.prepend(23); - QVERIFY(list.isDetached()); - QVERIFY(!list.isSharedWith(listCopy)); - QCOMPARE(list.constFirst(), 23); - QCOMPARE(listCopy.constFirst(), 42); - - listCopy = list; - QVERIFY(!list.isDetached()); - QVERIFY(!listCopy.isDetached()); - QVERIFY(list.isSharedWith(listCopy)); - QVERIFY(listCopy.isSharedWith(list)); - - QCOMPARE(list.constFirst(), 23); - QCOMPARE(listCopy.constFirst(), 23); - - QVERIFY(!list.isDetached()); - QVERIFY(!listCopy.isDetached()); - QVERIFY(list.isSharedWith(listCopy)); - QVERIFY(listCopy.isSharedWith(list)); -} - -void tst_QList::constLast() const -{ - // Based on tst_QVector::constLast() - QList<int> list; - list << 69 << 42 << 3; - - // test it starts ok - QCOMPARE(list.constLast(), 3); - QVERIFY(list.isDetached()); - - QList<int> listCopy = list; - QVERIFY(!list.isDetached()); - QVERIFY(!listCopy.isDetached()); - QVERIFY(list.isSharedWith(listCopy)); - QVERIFY(listCopy.isSharedWith(list)); - - QCOMPARE(list.constLast(), 3); - QCOMPARE(listCopy.constLast(), 3); - - QVERIFY(!list.isDetached()); - QVERIFY(!listCopy.isDetached()); - QVERIFY(list.isSharedWith(listCopy)); - QVERIFY(listCopy.isSharedWith(list)); - - // test removal changes - list.removeLast(); - QVERIFY(list.isDetached()); - QVERIFY(!list.isSharedWith(listCopy)); - QCOMPARE(list.constLast(), 42); - QCOMPARE(listCopy.constLast(), 3); - - listCopy = list; - QVERIFY(!list.isDetached()); - QVERIFY(!listCopy.isDetached()); - QVERIFY(list.isSharedWith(listCopy)); - QVERIFY(listCopy.isSharedWith(list)); - - QCOMPARE(list.constLast(), 42); - QCOMPARE(listCopy.constLast(), 42); - - QVERIFY(!list.isDetached()); - QVERIFY(!listCopy.isDetached()); - QVERIFY(list.isSharedWith(listCopy)); - QVERIFY(listCopy.isSharedWith(list)); - - // test prepend changes - list.append(23); - QVERIFY(list.isDetached()); - QVERIFY(!list.isSharedWith(listCopy)); - QCOMPARE(list.constLast(), 23); - QCOMPARE(listCopy.constLast(), 42); - - listCopy = list; - QVERIFY(!list.isDetached()); - QVERIFY(!listCopy.isDetached()); - QVERIFY(list.isSharedWith(listCopy)); - QVERIFY(listCopy.isSharedWith(list)); - - QCOMPARE(list.constLast(), 23); - QCOMPARE(listCopy.constLast(), 23); - - QVERIFY(!list.isDetached()); - QVERIFY(!listCopy.isDetached()); - QVERIFY(list.isSharedWith(listCopy)); - QVERIFY(listCopy.isSharedWith(list)); -} - -void tst_QList::cpp17ctad() const -{ -#ifdef __cpp_deduction_guides -#define QVERIFY_IS_LIST_OF(obj, Type) \ - QVERIFY2((std::is_same<decltype(obj), QList<Type>>::value), \ - QMetaType::typeName(qMetaTypeId<decltype(obj)::value_type>())) -#define CHECK(Type, One, Two, Three) \ - do { \ - const Type v[] = {One, Two, Three}; \ - QList v1 = {One, Two, Three}; \ - QVERIFY_IS_LIST_OF(v1, Type); \ - QList v2(v1.begin(), v1.end()); \ - QVERIFY_IS_LIST_OF(v2, Type); \ - QList v3(std::begin(v), std::end(v)); \ - QVERIFY_IS_LIST_OF(v3, Type); \ - } while (false) \ - /*end*/ - CHECK(int, 1, 2, 3); - CHECK(double, 1.0, 2.0, 3.0); - CHECK(QString, QStringLiteral("one"), QStringLiteral("two"), QStringLiteral("three")); -#undef QVERIFY_IS_LIST_OF -#undef CHECK -#else - QSKIP("This test requires C++17 Constructor Template Argument Deduction support enabled in the compiler."); -#endif -} - -template<typename T> -void tst_QList::last() const -{ - QList<T> list; - list << T_FOO << T_BAR; - - QCOMPARE(list.last(), T_BAR); - - // remove an item, make sure it still works - list.pop_back(); - QVERIFY(list.size() == 1); - QCOMPARE(list.last(), T_FOO); -} - -void tst_QList::lastOptimal() const -{ - const int liveCount = Optimal::getLiveCount(); - last<Optimal>(); - QCOMPARE(liveCount, Optimal::getLiveCount()); -} - -void tst_QList::lastMovable() const -{ - const int liveCount = Movable::getLiveCount(); - last<Movable>(); - QCOMPARE(liveCount, Movable::getLiveCount()); -} - -void tst_QList::lastComplex() const -{ - const int liveCount = Complex::getLiveCount(); - last<Complex>(); - QCOMPARE(liveCount, Complex::getLiveCount()); -} - -template<typename T> -void tst_QList::begin() const -{ - QList<T> list; - list << T_FOO << T_BAR; - - QCOMPARE(*list.begin(), T_FOO); - - // remove an item, make sure it still works - list.pop_front(); - QVERIFY(list.size() == 1); - QCOMPARE(*list.begin(), T_BAR); -} - -void tst_QList::beginOptimal() const -{ - const int liveCount = Optimal::getLiveCount(); - begin<Optimal>(); - QCOMPARE(liveCount, Optimal::getLiveCount()); -} - -void tst_QList::beginMovable() const -{ - const int liveCount = Movable::getLiveCount(); - begin<Movable>(); - QCOMPARE(liveCount, Movable::getLiveCount()); -} - -void tst_QList::beginComplex() const -{ - const int liveCount = Complex::getLiveCount(); - begin<Complex>(); - QCOMPARE(liveCount, Complex::getLiveCount()); -} - -template<typename T> -void tst_QList::end() const -{ - QList<T> list; - list << T_FOO << T_BAR; - - QCOMPARE(*--list.end(), T_BAR); - - // remove an item, make sure it still works - list.pop_back(); - QVERIFY(list.size() == 1); - QCOMPARE(*--list.end(), T_FOO); -} - -void tst_QList::endOptimal() const -{ - const int liveCount = Optimal::getLiveCount(); - end<Optimal>(); - QCOMPARE(liveCount, Optimal::getLiveCount()); -} - -void tst_QList::endMovable() const -{ - const int liveCount = Movable::getLiveCount(); - end<Movable>(); - QCOMPARE(liveCount, Movable::getLiveCount()); -} - -void tst_QList::endComplex() const -{ - const int liveCount = Complex::getLiveCount(); - end<Complex>(); - QCOMPARE(liveCount, Complex::getLiveCount()); -} - -template<typename T> -void tst_QList::contains() const -{ - QList<T> list; - list << T_FOO << T_BAR << T_BAZ; - - QVERIFY(list.contains(T_FOO)); - QVERIFY(list.contains(T_BLAH) != true); - - // add it and make sure it matches - list.append(T_BLAH); - QVERIFY(list.contains(T_BLAH)); -} - -void tst_QList::containsOptimal() const -{ - const int liveCount = Optimal::getLiveCount(); - contains<Optimal>(); - QCOMPARE(liveCount, Optimal::getLiveCount()); -} - -void tst_QList::containsMovable() const -{ - const int liveCount = Movable::getLiveCount(); - contains<Movable>(); - QCOMPARE(liveCount, Movable::getLiveCount()); -} - -void tst_QList::containsComplex() const -{ - const int liveCount = Complex::getLiveCount(); - contains<Complex>(); - QCOMPARE(liveCount, Complex::getLiveCount()); -} - -template<typename T> -void tst_QList::count() const -{ - QList<T> list; - - // starts empty - QVERIFY(list.count() == 0); - - // goes up - list.append(T_FOO); - QVERIFY(list.count() == 1); - - // and up - list.append(T_BAR); - QVERIFY(list.count() == 2); - - // and down - list.pop_back(); - QVERIFY(list.count() == 1); - - // and empty. :) - list.pop_back(); - QVERIFY(list.count() == 0); -} - -void tst_QList::countOptimal() const -{ - const int liveCount = Optimal::getLiveCount(); - count<Optimal>(); - QCOMPARE(liveCount, Optimal::getLiveCount()); -} - -void tst_QList::countMovable() const -{ - const int liveCount = Movable::getLiveCount(); - count<Movable>(); - QCOMPARE(liveCount, Movable::getLiveCount()); -} - -void tst_QList::countComplex() const -{ - const int liveCount = Complex::getLiveCount(); - count<Complex>(); - QCOMPARE(liveCount, Complex::getLiveCount()); -} - -template<typename T> -void tst_QList::empty() const -{ - QList<T> list; - - // make sure it starts empty - QVERIFY(list.empty()); - - // and doesn't stay empty - list.append(T_FOO); - QVERIFY(!list.empty()); - - // and goes back to being empty - list.pop_back(); - QVERIFY(list.empty()); -} - -void tst_QList::emptyOptimal() const -{ - const int liveCount = Optimal::getLiveCount(); - empty<Optimal>(); - QCOMPARE(liveCount, Optimal::getLiveCount()); -} - -void tst_QList::emptyMovable() const -{ - const int liveCount = Movable::getLiveCount(); - empty<Movable>(); - QCOMPARE(liveCount, Movable::getLiveCount()); -} - -void tst_QList::emptyComplex() const -{ - const int liveCount = Complex::getLiveCount(); - empty<Complex>(); - QCOMPARE(liveCount, Complex::getLiveCount()); -} - -template<typename T> -void tst_QList::endsWith() const -{ - QList<T> list; - list << T_FOO << T_BAR << T_BAZ; - - // test it returns correctly in both cases - QVERIFY(list.endsWith(T_BAZ)); - QVERIFY(!list.endsWith(T_BAR)); - - // remove an item and make sure the end item changes - list.pop_back(); - QVERIFY(list.endsWith(T_BAR)); -} - -void tst_QList::endsWithOptimal() const -{ - const int liveCount = Optimal::getLiveCount(); - endsWith<Optimal>(); - QCOMPARE(liveCount, Optimal::getLiveCount()); -} - -void tst_QList::endsWithMovable() const -{ - const int liveCount = Movable::getLiveCount(); - endsWith<Movable>(); - QCOMPARE(liveCount, Movable::getLiveCount()); -} - -void tst_QList::endsWithComplex() const -{ - const int liveCount = Complex::getLiveCount(); - endsWith<Complex>(); - QCOMPARE(liveCount, Complex::getLiveCount()); -} - -template<typename T> -void tst_QList::lastIndexOf() const -{ - QList<T> list; - list << T_FOO << T_BAR << T_BAZ; - - // one instance of the target item - QVERIFY(list.lastIndexOf(T_BAZ) == 2); - - // shouldn't find this - QVERIFY(list.lastIndexOf(T_WEEE) == -1); - - // multiple instances - list.append(T_BAZ); - list.append(T_BAZ); - QVERIFY(list.lastIndexOf(T_BAZ) == 4); - - // search from the middle to find the last one - QVERIFY(list.lastIndexOf(T_BAZ, 3) == 3); - - // try to find none - QVERIFY(list.lastIndexOf(T_BAZ, 1) == -1); -} - -void tst_QList::lastIndexOfOptimal() const -{ - const int liveCount = Optimal::getLiveCount(); - lastIndexOf<Optimal>(); - QCOMPARE(liveCount, Optimal::getLiveCount()); -} - -void tst_QList::lastIndexOfMovable() const -{ - const int liveCount = Movable::getLiveCount(); - lastIndexOf<Movable>(); - QCOMPARE(liveCount, Movable::getLiveCount()); -} - -void tst_QList::lastIndexOfComplex() const -{ - const int liveCount = Complex::getLiveCount(); - lastIndexOf<Complex>(); - QCOMPARE(liveCount, Complex::getLiveCount()); -} - -template<typename T> -void tst_QList::move() const -{ - QList<T> list; - list << T_FOO << T_BAR << T_BAZ; - - // move an item - list.move(0, list.count() - 1); - QCOMPARE(list, QList<T>() << T_BAR << T_BAZ << T_FOO); - - // move it back - list.move(list.count() - 1, 0); - QCOMPARE(list, QList<T>() << T_FOO << T_BAR << T_BAZ); - - // move an item in the middle - list.move(1, 0); - QCOMPARE(list, QList<T>() << T_BAR << T_FOO << T_BAZ); -} - -void tst_QList::moveOptimal() const -{ - const int liveCount = Optimal::getLiveCount(); - move<Optimal>(); - QCOMPARE(liveCount, Optimal::getLiveCount()); -} - -void tst_QList::moveMovable() const -{ - const int liveCount = Movable::getLiveCount(); - move<Movable>(); - QCOMPARE(liveCount, Movable::getLiveCount()); -} - -void tst_QList::moveComplex() const -{ - const int liveCount = Complex::getLiveCount(); - move<Complex>(); - QCOMPARE(liveCount, Complex::getLiveCount()); -} - -template<typename T> -void tst_QList::removeAll() const -{ - QList<T> list; - list << T_FOO << T_BAR << T_BAZ; - - // remove one instance - list.removeAll(T_BAR); - QCOMPARE(list, QList<T>() << T_FOO << T_BAZ); - - // many instances - list << T_FOO << T_BAR << T_BAZ << T_FOO << T_BAR << T_BAZ << T_FOO << T_BAR << T_BAZ; - list.removeAll(T_BAR); - QCOMPARE(list, QList<T>() << T_FOO << T_BAZ << T_FOO << T_BAZ << T_FOO << T_BAZ << T_FOO << T_BAZ); - - // try remove something that doesn't exist - list.removeAll(T_WEEE); - QCOMPARE(list, QList<T>() << T_FOO << T_BAZ << T_FOO << T_BAZ << T_FOO << T_BAZ << T_FOO << T_BAZ); -} - -void tst_QList::removeAllOptimal() const -{ - const int liveCount = Optimal::getLiveCount(); - removeAll<Optimal>(); - QCOMPARE(liveCount, Optimal::getLiveCount()); -} - -void tst_QList::removeAllMovable() const -{ - const int liveCount = Movable::getLiveCount(); - removeAll<Movable>(); - QCOMPARE(liveCount, Movable::getLiveCount()); -} - -void tst_QList::removeAllComplex() const -{ - const int liveCount = Complex::getLiveCount(); - removeAll<Complex>(); - QCOMPARE(liveCount, Complex::getLiveCount()); -} - -template<typename T> -void tst_QList::removeAt() const -{ - QList<T> list; - list << T_FOO << T_BAR << T_BAZ; - - // middle - list.removeAt(1); - QCOMPARE(list, QList<T>() << T_FOO << T_BAZ); - - // start - list.removeAt(0); - QCOMPARE(list, QList<T>() << T_BAZ); - - // final - list.removeAt(0); - QCOMPARE(list, QList<T>()); -} - -void tst_QList::removeAtOptimal() const -{ - const int liveCount = Optimal::getLiveCount(); - removeAt<Optimal>(); - QCOMPARE(liveCount, Optimal::getLiveCount()); -} - -void tst_QList::removeAtMovable() const -{ - const int liveCount = Movable::getLiveCount(); - removeAt<Movable>(); - QCOMPARE(liveCount, Movable::getLiveCount()); -} - -void tst_QList::removeAtComplex() const -{ - const int liveCount = Complex::getLiveCount(); - removeAt<Complex>(); - QCOMPARE(liveCount, Complex::getLiveCount()); -} - -template<typename T> -void tst_QList::removeOne() const -{ - QList<T> list; - list << T_FOO << T_BAR << T_BAZ; - - // middle - list.removeOne(T_BAR); - QCOMPARE(list, QList<T>() << T_FOO << T_BAZ); - - // start - list.removeOne(T_FOO); - QCOMPARE(list, QList<T>() << T_BAZ); - - // last - list.removeOne(T_BAZ); - QCOMPARE(list, QList<T>()); - - // make sure it really only removes one :) - list << T_FOO << T_FOO; - list.removeOne(T_FOO); - QCOMPARE(list, QList<T>() << T_FOO); - - // try remove something that doesn't exist - list.removeOne(T_WEEE); - QCOMPARE(list, QList<T>() << T_FOO); -} - -void tst_QList::removeOneOptimal() const -{ - const int liveCount = Optimal::getLiveCount(); - removeOne<Optimal>(); - QCOMPARE(liveCount, Optimal::getLiveCount()); -} - -void tst_QList::removeOneMovable() const -{ - const int liveCount = Movable::getLiveCount(); - removeOne<Movable>(); - QCOMPARE(liveCount, Movable::getLiveCount()); -} - -void tst_QList::removeOneComplex() const -{ - const int liveCount = Complex::getLiveCount(); - removeOne<Complex>(); - QCOMPARE(liveCount, Complex::getLiveCount()); -} - -template<typename T> -void tst_QList::replace() const -{ - QList<T> list; - list << T_FOO << T_BAR << T_BAZ; - - // start - list.replace(0, T_CAT); - QCOMPARE(list, QList<T>() << T_CAT - << T_BAR << T_BAZ); - - // middle - list.replace(1, T_DOG); - QCOMPARE(list, QList<T>() << T_CAT - << T_DOG << T_BAZ); - - // end - list.replace(2, T_BLAH); - QCOMPARE(list, QList<T>() << T_CAT - << T_DOG << T_BLAH); -} - -void tst_QList::replaceOptimal() const -{ - const int liveCount = Optimal::getLiveCount(); - replace<Optimal>(); - QCOMPARE(liveCount, Optimal::getLiveCount()); -} - -void tst_QList::replaceMovable() const -{ - const int liveCount = Movable::getLiveCount(); - replace<Movable>(); - QCOMPARE(liveCount, Movable::getLiveCount()); -} - -void tst_QList::replaceComplex() const -{ - const int liveCount = Complex::getLiveCount(); - replace<Complex>(); - QCOMPARE(liveCount, Complex::getLiveCount()); -} - -template<typename T> -void tst_QList::reverseIterators() const -{ - QList<T> v; - v << T_CAT << T_DOG << T_BLAH << T_BAZ; - QList<T> vr = v; - std::reverse(vr.begin(), vr.end()); - const QList<T> &cvr = vr; - QVERIFY(std::equal(v.begin(), v.end(), vr.rbegin())); - QVERIFY(std::equal(v.begin(), v.end(), vr.crbegin())); - QVERIFY(std::equal(v.begin(), v.end(), cvr.rbegin())); - QVERIFY(std::equal(vr.rbegin(), vr.rend(), v.begin())); - QVERIFY(std::equal(vr.crbegin(), vr.crend(), v.begin())); - QVERIFY(std::equal(cvr.rbegin(), cvr.rend(), v.begin())); -} - -void tst_QList::reverseIteratorsOptimal() const -{ - const int liveCount = Optimal::getLiveCount(); - reverseIterators<Optimal>(); - QCOMPARE(liveCount, Optimal::getLiveCount()); -} - -void tst_QList::reverseIteratorsMovable() const -{ - const int liveCount = Movable::getLiveCount(); - reverseIterators<Movable>(); - QCOMPARE(liveCount, Movable::getLiveCount()); -} - -void tst_QList::reverseIteratorsComplex() const -{ - const int liveCount = Complex::getLiveCount(); - reverseIterators<Complex>(); - QCOMPARE(liveCount, Complex::getLiveCount()); -} - -template<typename T> -void tst_QList::startsWith() const -{ - QList<T> list; - list << T_FOO << T_BAR << T_BAZ; - - // make sure it starts ok - QVERIFY(list.startsWith(T_FOO)); - - // remove an item - list.removeFirst(); - QVERIFY(list.startsWith(T_BAR)); -} - -void tst_QList::startsWithOptimal() const -{ - const int liveCount = Optimal::getLiveCount(); - startsWith<Optimal>(); - QCOMPARE(liveCount, Optimal::getLiveCount()); -} - -void tst_QList::startsWithMovable() const -{ - const int liveCount = Movable::getLiveCount(); - startsWith<Movable>(); - QCOMPARE(liveCount, Movable::getLiveCount()); -} - -void tst_QList::startsWithComplex() const -{ - const int liveCount = Complex::getLiveCount(); - startsWith<Complex>(); - QCOMPARE(liveCount, Complex::getLiveCount()); -} - -template<typename T> -void tst_QList::swap() const -{ - QList<T> list; - list << T_FOO << T_BAR << T_BAZ; - - // swap - list.swapItemsAt(0, 2); - QCOMPARE(list, QList<T>() << T_BAZ << T_BAR << T_FOO); - - // swap again - list.swapItemsAt(1, 2); - QCOMPARE(list, QList<T>() << T_BAZ << T_FOO << T_BAR); - - QList<T> list2; - list2 << T_DOG << T_BLAH; - - list.swap(list2); - QCOMPARE(list, QList<T>() << T_DOG << T_BLAH); - QCOMPARE(list2, QList<T>() << T_BAZ << T_FOO << T_BAR); -} - -void tst_QList::swapOptimal() const -{ - const int liveCount = Optimal::getLiveCount(); - swap<Optimal>(); - QCOMPARE(liveCount, Optimal::getLiveCount()); -} - -void tst_QList::swapMovable() const -{ - const int liveCount = Movable::getLiveCount(); - swap<Movable>(); - QCOMPARE(liveCount, Movable::getLiveCount()); -} - -void tst_QList::swapComplex() const -{ - const int liveCount = Complex::getLiveCount(); - swap<Complex>(); - QCOMPARE(liveCount, Complex::getLiveCount()); -} - -template<typename T> -void tst_QList::takeAt() const -{ - QList<T> list; - list << T_FOO << T_BAR << T_BAZ; - - QCOMPARE(list.takeAt(0), T_FOO); - QVERIFY(list.size() == 2); - QCOMPARE(list.takeAt(1), T_BAZ); - QVERIFY(list.size() == 1); - QCOMPARE(list.takeAt(0), T_BAR); - QVERIFY(list.size() == 0); -} - -void tst_QList::takeAtOptimal() const -{ - const int liveCount = Optimal::getLiveCount(); - takeAt<Optimal>(); - QCOMPARE(liveCount, Optimal::getLiveCount()); -} - -void tst_QList::takeAtMovable() const -{ - const int liveCount = Movable::getLiveCount(); - takeAt<Movable>(); - QCOMPARE(liveCount, Movable::getLiveCount()); -} - -void tst_QList::takeAtComplex() const -{ - const int liveCount = Complex::getLiveCount(); - takeAt<Complex>(); - QCOMPARE(liveCount, Complex::getLiveCount()); -} - -template<typename T> -void tst_QList::takeFirst() const -{ - QList<T> list; - list << T_FOO << T_BAR << T_BAZ; - - QCOMPARE(list.takeFirst(), T_FOO); - QVERIFY(list.size() == 2); - QCOMPARE(list.takeFirst(), T_BAR); - QVERIFY(list.size() == 1); - QCOMPARE(list.takeFirst(), T_BAZ); - QVERIFY(list.size() == 0); -} - -void tst_QList::takeFirstOptimal() const -{ - const int liveCount = Optimal::getLiveCount(); - takeFirst<Optimal>(); - QCOMPARE(liveCount, Optimal::getLiveCount()); -} - -void tst_QList::takeFirstMovable() const -{ - const int liveCount = Movable::getLiveCount(); - takeFirst<Movable>(); - QCOMPARE(liveCount, Movable::getLiveCount()); -} - -void tst_QList::takeFirstComplex() const -{ - const int liveCount = Complex::getLiveCount(); - takeFirst<Complex>(); - QCOMPARE(liveCount, Complex::getLiveCount()); -} - -template<typename T> -void tst_QList::takeLast() const -{ - QList<T> list; - list << T_FOO << T_BAR << T_BAZ; - - QCOMPARE(list.takeLast(), T_BAZ); - QCOMPARE(list.takeLast(), T_BAR); - QCOMPARE(list.takeLast(), T_FOO); -} - -void tst_QList::takeLastOptimal() const -{ - const int liveCount = Optimal::getLiveCount(); - takeLast<Optimal>(); - QCOMPARE(liveCount, Optimal::getLiveCount()); -} - -void tst_QList::takeLastMovable() const -{ - const int liveCount = Movable::getLiveCount(); - takeLast<Movable>(); - QCOMPARE(liveCount, Movable::getLiveCount()); -} - -void tst_QList::takeLastComplex() const -{ - const int liveCount = Complex::getLiveCount(); - takeLast<Complex>(); - QCOMPARE(liveCount, Complex::getLiveCount()); -} - -#if QT_VERSION < QT_VERSION_CHECK(6,0,0) -template<typename T> -void tst_QList::toSet() const -{ - QList<T> list; - list << T_FOO << T_BAR << T_BAZ; - - // no duplicates - QCOMPARE(list.toSet(), QSet<T>() << T_FOO << T_BAR << T_BAZ); - QCOMPARE(list, QList<T>() << T_FOO << T_BAR << T_BAZ); - - // duplicates (is this more of a QSet test?) - list << T_FOO << T_BAR << T_BAZ; - QCOMPARE(list.toSet(), QSet<T>() << T_FOO << T_BAR << T_BAZ); - QCOMPARE(list, QList<T>() << T_FOO << T_BAR << T_BAZ - << T_FOO << T_BAR << T_BAZ); -} - -void tst_QList::toSetOptimal() const -{ - const int liveCount = Optimal::getLiveCount(); - toSet<Optimal>(); - QCOMPARE(liveCount, Optimal::getLiveCount()); -} - -void tst_QList::toSetMovable() const -{ - const int liveCount = Movable::getLiveCount(); - toSet<Movable>(); - QCOMPARE(liveCount, Movable::getLiveCount()); -} - -void tst_QList::toSetComplex() const -{ - const int liveCount = Complex::getLiveCount(); - toSet<Complex>(); - QCOMPARE(liveCount, Complex::getLiveCount()); -} - -template<typename T> -void tst_QList::toStdList() const -{ - QList<T> list; - list << T_FOO << T_BAR << T_BAZ; - - // yuck. - std::list<T> slist; - slist.push_back(T_FOO); - slist.push_back(T_BAR); - slist.push_back(T_BAZ); - - QCOMPARE(list.toStdList(), slist); - QCOMPARE(list, QList<T>() << T_FOO << T_BAR << T_BAZ); -} - -void tst_QList::toStdListOptimal() const -{ - const int liveCount = Optimal::getLiveCount(); - toStdList<Optimal>(); - QCOMPARE(liveCount, Optimal::getLiveCount()); -} - -void tst_QList::toStdListMovable() const -{ - const int liveCount = Movable::getLiveCount(); - toStdList<Movable>(); - QCOMPARE(liveCount, Movable::getLiveCount()); -} - -void tst_QList::toStdListComplex() const -{ - const int liveCount = Complex::getLiveCount(); - toStdList<Complex>(); - QCOMPARE(liveCount, Complex::getLiveCount()); -} -#endif - -template<typename T> -void tst_QList::toVector() const -{ - QList<T> list; - list << T_FOO << T_BAR << T_BAZ; - - QCOMPARE(list.toVector(), QVector<T>() << T_FOO << T_BAR << T_BAZ); -} - -void tst_QList::toVectorOptimal() const -{ - const int liveCount = Optimal::getLiveCount(); - toVector<Optimal>(); - QCOMPARE(liveCount, Optimal::getLiveCount()); -} - -void tst_QList::toVectorMovable() const -{ - const int liveCount = Movable::getLiveCount(); - toVector<Movable>(); - QCOMPARE(liveCount, Movable::getLiveCount()); -} - -void tst_QList::toVectorComplex() const -{ - const int liveCount = Complex::getLiveCount(); - toVector<Complex>(); - QCOMPARE(liveCount, Complex::getLiveCount()); -} - -template<typename T> -void tst_QList::value() const -{ - QList<T> list; - list << T_FOO << T_BAR << T_BAZ; - - // test real values - QCOMPARE(list.value(0), T_FOO); - QCOMPARE(list.value(2), T_BAZ); - - // test empty default - QCOMPARE(list.value(3), T()); - QCOMPARE(list.value(-1), T()); - - // test defaults - T defaultT(T_WEEE); - QCOMPARE(list.value(-1, defaultT), defaultT); - QCOMPARE(list.value(3, defaultT), defaultT); -} - -void tst_QList::valueOptimal() const -{ - const int liveCount = Optimal::getLiveCount(); - value<Optimal>(); - QCOMPARE(liveCount, Optimal::getLiveCount()); -} - -void tst_QList::valueMovable() const -{ - const int liveCount = Movable::getLiveCount(); - value<Movable>(); - QCOMPARE(liveCount, Movable::getLiveCount()); -} - -void tst_QList::valueComplex() const -{ - const int liveCount = Complex::getLiveCount(); - value<Complex>(); - QCOMPARE(liveCount, Complex::getLiveCount()); -} - -template<typename T> -void tst_QList::testOperators() const -{ - QList<T> list; - list << T_FOO << T_BAR << T_BAZ; - - QList<T> listtwo; - listtwo << T_FOO << T_BAR << T_BAZ; - - // test equal - QVERIFY(list == listtwo); - - // not equal - listtwo.append(T_CAT); - QVERIFY(list != listtwo); - - // += - list += listtwo; - QVERIFY(list.size() == 7); - QVERIFY(listtwo.size() == 4); - QCOMPARE(list, QList<T>() << T_FOO << T_BAR << T_BAZ - << T_FOO << T_BAR << T_BAZ << T_CAT); - - // = - list = listtwo; - QCOMPARE(list, listtwo); - QCOMPARE(list, QList<T>() << T_FOO << T_BAR << T_BAZ << T_CAT); - - // [] - QCOMPARE(list[0], T_FOO); - QCOMPARE(list[list.size() - 1], T_CAT); - - // <, >, <=, >= - QVERIFY(!(list < listtwo)); - QVERIFY(!(list > listtwo)); - QVERIFY( list <= listtwo); - QVERIFY( list >= listtwo); - listtwo.push_back(T_CAT); - QVERIFY( list < listtwo); - QVERIFY(!(list > listtwo)); - QVERIFY( list <= listtwo); - QVERIFY(!(list >= listtwo)); - QVERIFY(listtwo > list); - QVERIFY(listtwo >= list); -} - -void tst_QList::testOperatorsOptimal() const -{ - const int liveCount = Optimal::getLiveCount(); - testOperators<Optimal>(); - QCOMPARE(liveCount, Optimal::getLiveCount()); -} - -void tst_QList::testOperatorsMovable() const -{ - const int liveCount = Movable::getLiveCount(); - testOperators<Movable>(); - QCOMPARE(liveCount, Movable::getLiveCount()); -} - -void tst_QList::testOperatorsComplex() const -{ - const int liveCount = Complex::getLiveCount(); - testOperators<Complex>(); - QCOMPARE(liveCount, Complex::getLiveCount()); -} - -template<typename T> -void tst_QList::testSTLIterators() const -{ - QList<T> list; - - // create a list - list << T_FOO << T_BAR << T_BAZ; - typename QList<T>::iterator it = list.begin(); - QCOMPARE(*it, T_FOO); it++; - QCOMPARE(*it, T_BAR); it++; - QCOMPARE(*it, T_BAZ); it++; - QCOMPARE(it, list.end()); it--; - - // walk backwards - QCOMPARE(*it, T_BAZ); it--; - QCOMPARE(*it, T_BAR); it--; - QCOMPARE(*it, T_FOO); - - // test erase - it = list.erase(it); - QVERIFY(list.size() == 2); - QCOMPARE(*it, T_BAR); - - // test multiple erase - it = list.erase(it, it + 2); - QVERIFY(list.size() == 0); - QCOMPARE(it, list.end()); - - // insert again - it = list.insert(it, T_FOO); - QVERIFY(list.size() == 1); - QCOMPARE(*it, T_FOO); - - // insert again - it = list.insert(it, T_BAR); - QVERIFY(list.size() == 2); - QCOMPARE(*it++, T_BAR); - QCOMPARE(*it, T_FOO); -} - -void tst_QList::testSTLIteratorsOptimal() const -{ - const int liveCount = Optimal::getLiveCount(); - testSTLIterators<Optimal>(); - QCOMPARE(liveCount, Optimal::getLiveCount()); -} - -void tst_QList::testSTLIteratorsMovable() const -{ - const int liveCount = Movable::getLiveCount(); - testSTLIterators<Movable>(); - QCOMPARE(liveCount, Movable::getLiveCount()); -} - -void tst_QList::testSTLIteratorsComplex() const -{ - const int liveCount = Complex::getLiveCount(); - testSTLIterators<Complex>(); - QCOMPARE(liveCount, Complex::getLiveCount()); -} - -void tst_QList::initializeList() const -{ - QList<int> v1{2,3,4}; - QCOMPARE(v1, QList<int>() << 2 << 3 << 4); - QCOMPARE(v1, (QList<int>{2,3,4})); - - QList<QList<int>> v2{ v1, {1}, QList<int>(), {2,3,4} }; - QList<QList<int>> v3; - v3 << v1 << (QList<int>() << 1) << QList<int>() << v1; - QCOMPARE(v3, v2); -} - -template<typename T> -void tst_QList::constSharedNull() const -{ - QList<T> list2; -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - QList<T> list1; - list1.setSharable(false); - QVERIFY(list1.isDetached()); - - list2.setSharable(true); -#endif - QVERIFY(!list2.isDetached()); -} - -void tst_QList::constSharedNullOptimal() const -{ - const int liveCount = Optimal::getLiveCount(); - constSharedNull<Optimal>(); - QCOMPARE(liveCount, Optimal::getLiveCount()); -} - -void tst_QList::constSharedNullMovable() const -{ - const int liveCount = Movable::getLiveCount(); - constSharedNull<Movable>(); - QCOMPARE(liveCount, Movable::getLiveCount()); -} - -void tst_QList::constSharedNullComplex() const -{ - const int liveCount = Complex::getLiveCount(); - constSharedNull<Complex>(); - QCOMPARE(liveCount, Complex::getLiveCount()); -} - -template <class T> -void generateSetSharableData() -{ -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - QTest::addColumn<QList<T> >("list"); - QTest::addColumn<int>("size"); - - QTest::newRow("null") << QList<T>() << 0; - QTest::newRow("non-empty") << (QList<T>() << T(0) << T(1) << T(2) << T(3) << T(4)) << 5; -#endif -} - -template <class T> -void runSetSharableTest() -{ -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - QFETCH(QList<T>, list); - QFETCH(int, size); - - QVERIFY(!list.isDetached()); // Shared with QTest - - list.setSharable(true); - - QCOMPARE(list.size(), size); - - { - QList<T> copy(list); - QVERIFY(!copy.isDetached()); - QVERIFY(copy.isSharedWith(list)); - } - - list.setSharable(false); - QVERIFY(list.isDetached() || list.isSharedWith(QList<T>())); - - { - QList<T> copy(list); - - QVERIFY(copy.isDetached() || copy.isSharedWith(QList<T>())); - QCOMPARE(copy.size(), size); - QCOMPARE(copy, list); - } - - list.setSharable(true); - - { - QList<T> copy(list); - - QVERIFY(!copy.isDetached()); - QVERIFY(copy.isSharedWith(list)); - } - - for (int i = 0; i < list.size(); ++i) - QCOMPARE(int(list[i]), i); - - QCOMPARE(list.size(), size); -#endif -} - -void tst_QList::setSharableInt_data() const -{ - generateSetSharableData<int>(); -} - -void tst_QList::setSharableComplex_data() const -{ - generateSetSharableData<Complex>(); -} - -void tst_QList::setSharableInt() const -{ - runSetSharableTest<int>(); -} - -void tst_QList::setSharableComplex() const -{ - runSetSharableTest<Complex>(); -} - -void tst_QList::eraseValidIteratorsOnSharedList() const -{ - QList<int> a, b; - a.push_back(10); - a.push_back(20); - a.push_back(30); - QList<int>::iterator i = a.begin(); - ++i; - b = a; - a.erase(i); - QCOMPARE(b.size(), 3); - QCOMPARE(a.size(), 2); - QCOMPARE(a.at(0), 10); - QCOMPARE(a.at(1), 30); - - a.push_back(40); - a.push_back(50); - a.push_back(60); - QCOMPARE(a.size(), 5); - i = a.begin(); - b = a; - ++i; - QList<int>::iterator j = i; - ++j; - ++j; - a.erase(i, j); // remove 3 elements - QCOMPARE(b.size(), 5); - QCOMPARE(a.size(), 3); - QCOMPARE(a.at(0), 10); - QCOMPARE(a.at(1), 50); -} - -void tst_QList::insertWithValidIteratorsOnSharedList() const -{ - QList<int> a, b; - a.push_back(10); - a.push_back(20); - a.push_back(30); - QList<int>::iterator i = a.begin(); - ++i; - b = a; - a.insert(i, 15); - QCOMPARE(a.size(), b.size() + 1); - QCOMPARE(b.at(1), 20); - QCOMPARE(a.at(1), 15); -} - -template <typename T> -void tst_QList::qhash() const -{ - QList<T> l1, l2; - QCOMPARE(qHash(l1), qHash(l2)); - l1 << T_BAR; - l2 << T_BAR; - QCOMPARE(qHash(l1), qHash(l2)); -} - -void tst_QList::reserve() const -{ - // Note: - // This test depends on QList's current behavior that ints are stored in the array itself. - // This test would not work for QList<Complex>. - int capacity = 100; - QList<int> list; - list.reserve(capacity); - list << 0; - int *data = &list[0]; - - for (int i = 1; i < capacity; i++) { - list << i; - QCOMPARE(&list.at(0), data); - } - - QList<int> copy = list; - list.reserve(capacity / 2); - QCOMPARE(list.size(), capacity); // we didn't shrink the size! - - copy = list; - list.reserve(capacity * 2); - QCOMPARE(list.size(), capacity); - QVERIFY(&list.at(0) != data); -} - -QTEST_APPLESS_MAIN(tst_QList) -#include "tst_qlist.moc" diff --git a/tests/auto/corelib/tools/qlist_strictiterators/qlist_strictiterators.pro b/tests/auto/corelib/tools/qlist_strictiterators/qlist_strictiterators.pro deleted file mode 100644 index e39ad38919..0000000000 --- a/tests/auto/corelib/tools/qlist_strictiterators/qlist_strictiterators.pro +++ /dev/null @@ -1,3 +0,0 @@ -include(../qlist/qlist.pro) -TARGET = tst_qlist_strictiterators -DEFINES += QT_STRICT_ITERATORS tst_QList=tst_QList_StrictIterators diff --git a/tests/auto/corelib/tools/qmap/tst_qmap.cpp b/tests/auto/corelib/tools/qmap/tst_qmap.cpp index c3a8a88f0c..1638ebc992 100644 --- a/tests/auto/corelib/tools/qmap/tst_qmap.cpp +++ b/tests/auto/corelib/tools/qmap/tst_qmap.cpp @@ -68,7 +68,6 @@ private slots: void const_shared_null(); void equal_range(); - void setSharable(); void insert(); void insertMap(); @@ -1066,13 +1065,6 @@ void tst_QMap::qmultimap_specific() void tst_QMap::const_shared_null() { QMap<int, QString> map2; -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - QMap<int, QString> map1; - map1.setSharable(false); - QVERIFY(map1.isDetached()); - - map2.setSharable(true); -#endif QVERIFY(!map2.isDetached()); } @@ -1161,61 +1153,6 @@ const T &const_(const T &t) return t; } -void tst_QMap::setSharable() -{ -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - QMap<int, QString> map; - - map.insert(1, "um"); - map.insert(2, "dois"); - map.insert(4, "quatro"); - map.insert(5, "cinco"); - - map.setSharable(true); - QCOMPARE(map.size(), 4); - QCOMPARE(const_(map)[4], QString("quatro")); - - { - QMap<int, QString> copy(map); - - QVERIFY(!map.isDetached()); - QVERIFY(copy.isSharedWith(map)); - sanityCheckTree(copy, __LINE__); - } - - map.setSharable(false); - sanityCheckTree(map, __LINE__); - QVERIFY(map.isDetached()); - QCOMPARE(map.size(), 4); - QCOMPARE(const_(map)[4], QString("quatro")); - - { - QMap<int, QString> copy(map); - - QVERIFY(map.isDetached()); - QVERIFY(copy.isDetached()); - - QCOMPARE(copy.size(), 4); - QCOMPARE(const_(copy)[4], QString("quatro")); - - QCOMPARE(map, copy); - sanityCheckTree(map, __LINE__); - sanityCheckTree(copy, __LINE__); - } - - map.setSharable(true); - QCOMPARE(map.size(), 4); - QCOMPARE(const_(map)[4], QString("quatro")); - - { - QMap<int, QString> copy(map); - - QVERIFY(!map.isDetached()); - QVERIFY(copy.isSharedWith(map)); - } -#endif -} - void tst_QMap::insert() { QMap<QString, float> map; @@ -1510,17 +1447,16 @@ void tst_QMap::testInsertMultiWithHint() { QMap<int, int> map; - typedef QMap<int, int>::const_iterator cite; // Hack since we define QT_STRICT_ITERATORS - map.insertMulti(cite(map.end()), 64, 65); + map.insertMulti(map.end(), 64, 65); map[128] = 129; map[256] = 257; sanityCheckTree(map, __LINE__); - map.insertMulti(cite(map.end()), 512, 513); - map.insertMulti(cite(map.end()), 512, 513 * 2); + map.insertMulti(map.end(), 512, 513); + map.insertMulti(map.end(), 512, 513 * 2); sanityCheckTree(map, __LINE__); QCOMPARE(map.size(), 5); - map.insertMulti(cite(map.end()), 256, 258); // wrong hint + map.insertMulti(map.end(), 256, 258); // wrong hint sanityCheckTree(map, __LINE__); QCOMPARE(map.size(), 6); @@ -1532,23 +1468,23 @@ void tst_QMap::testInsertMultiWithHint() sanityCheckTree(map, __LINE__); QCOMPARE(map.size(), 8); - j = map.insertMulti(cite(j), 68, 259); + j = map.insertMulti(j, 68, 259); sanityCheckTree(map, __LINE__); QCOMPARE(map.size(), 9); - j = map.insertMulti(cite(j), 67, 67); + j = map.insertMulti(j, 67, 67); sanityCheckTree(map, __LINE__); QCOMPARE(map.size(), 10); - i = map.insertMulti(cite(i), 256, 259); + i = map.insertMulti(i, 256, 259); sanityCheckTree(map, __LINE__); QCOMPARE(map.size(), 11); - i = map.insertMulti(cite(i), 256, 260); + i = map.insertMulti(i, 256, 260); sanityCheckTree(map, __LINE__); QCOMPARE(map.size(), 12); - map.insertMulti(cite(i), 64, 67); + map.insertMulti(i, 64, 67); sanityCheckTree(map, __LINE__); QCOMPARE(map.size(), 13); diff --git a/tests/auto/corelib/tools/qmap_strictiterators/qmap_strictiterators.pro b/tests/auto/corelib/tools/qmap_strictiterators/qmap_strictiterators.pro deleted file mode 100644 index 6c1f4727c1..0000000000 --- a/tests/auto/corelib/tools/qmap_strictiterators/qmap_strictiterators.pro +++ /dev/null @@ -1,3 +0,0 @@ -include(../qmap/qmap.pro) -TARGET = tst_qmap_strictiterators -DEFINES += QT_STRICT_ITERATORS tst_QMap=tst_QMap_StrictIterators diff --git a/tests/auto/corelib/tools/qset/tst_qset.cpp b/tests/auto/corelib/tools/qset/tst_qset.cpp index 8a545712a2..6638ad8b60 100644 --- a/tests/auto/corelib/tools/qset/tst_qset.cpp +++ b/tests/auto/corelib/tools/qset/tst_qset.cpp @@ -26,8 +26,6 @@ ** ****************************************************************************/ -//#define QT_STRICT_ITERATORS - #include <QtTest/QtTest> #include <qset.h> #include <qdebug.h> diff --git a/tests/auto/corelib/tools/qvarlengtharray/tst_qvarlengtharray.cpp b/tests/auto/corelib/tools/qvarlengtharray/tst_qvarlengtharray.cpp index a1d0100f96..6220cc766a 100644 --- a/tests/auto/corelib/tools/qvarlengtharray/tst_qvarlengtharray.cpp +++ b/tests/auto/corelib/tools/qvarlengtharray/tst_qvarlengtharray.cpp @@ -827,7 +827,7 @@ void tst_QVarLengthArray::operators() // +=: not provided, emulate //myvla += myvlatwo; - Q_FOREACH (const QString &s, myvlatwo) + for (const QString &s : qAsConst(myvlatwo)) myvla.push_back(s); QCOMPARE(myvla, combined); diff --git a/tests/auto/corelib/tools/qvector/tst_qvector.cpp b/tests/auto/corelib/tools/qvector/tst_qvector.cpp index 08d5a8cd50..7a69e844d4 100644 --- a/tests/auto/corelib/tools/qvector/tst_qvector.cpp +++ b/tests/auto/corelib/tools/qvector/tst_qvector.cpp @@ -104,7 +104,7 @@ private: static void check(const State state1, const State state2) { - QCOMPARE(state1, state2); + QCOMPARE(int(state1), int(state2)); } }; @@ -174,7 +174,7 @@ private: { // check if c object has been moved QCOMPARE(c, c->that); - QCOMPARE(c->state, Constructed); + QCOMPARE(int(c->state), int(Constructed)); } }; QAtomicInt Custom::counter = 0; @@ -307,22 +307,11 @@ private slots: void reserve(); void reserveZero(); - void reallocAfterCopy_data(); - void reallocAfterCopy(); void initializeListInt(); void initializeListMovable(); void initializeListCustom(); void const_shared_null(); -#if 1 - // ### Qt6 remove this section - void setSharableInt_data(); - void setSharableInt(); - void setSharableMovable_data(); - void setSharableMovable(); - void setSharableCustom_data(); - void setSharableCustom(); -#endif void detachInt() const; void detachMovable() const; @@ -358,8 +347,6 @@ private: template<typename T> void size() const; template<typename T> void swap() const; template<typename T> void initializeList(); - template<typename T> void setSharable_data() const; - template<typename T> void setSharable() const; template<typename T> void detach() const; template<typename T> void detachThreadSafety() const; }; @@ -467,24 +454,6 @@ void tst_QVector::copyConstructor() const QVector<T> v2(v1); QCOMPARE(v1, v2); } -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - // ### Qt6 remove this section - { - QVector<T> v1; - v1.setSharable(false); - QVector<T> v2(v1); - QVERIFY(!v1.isSharedWith(v2)); - QCOMPARE(v1, v2); - } - { - QVector<T> v1; - v1 << value1 << value2 << value3 << value4; - v1.setSharable(false); - QVector<T> v2(v1); - QVERIFY(!v1.isSharedWith(v2)); - QCOMPARE(v1, v2); - } -#endif } void tst_QVector::copyConstructorInt() const @@ -665,17 +634,6 @@ void tst_QVector::append() const QVERIFY(v.size() == 3); QCOMPARE(v.at(v.size() - 1), SimpleValue<T>::at(0)); } -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - // ### Qt6 remove this section - { - QVector<T> v(2); - v.reserve(12); - v.setSharable(false); - v.append(SimpleValue<T>::at(0)); - QVERIFY(v.size() == 3); - QCOMPARE(v.last(), SimpleValue<T>::at(0)); - } -#endif { QVector<int> v; v << 1 << 2 << 3; @@ -766,16 +724,12 @@ void tst_QVector::capacity() const myvec.remove(3); myvec.remove(3); myvec.remove(3); - // TODO: is this a safe assumption? presumably it won't release memory until shrink(), but can we asser that is true? - QVERIFY(myvec.capacity() >= 6); myvec.squeeze(); QVERIFY(myvec.capacity() >= 3); myvec.remove(0); myvec.remove(0); myvec.remove(0); - // TODO: as above note - QVERIFY(myvec.capacity() >= 3); myvec.squeeze(); QVERIFY(myvec.capacity() == 0); } @@ -1019,20 +973,9 @@ void tst_QVector::endsWith() const template<typename T> void tst_QVector::eraseEmpty() const { - { - QVector<T> v; - v.erase(v.begin(), v.end()); - QCOMPARE(v.size(), 0); - } -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - // ### Qt6 remove this section - { - QVector<T> v; - v.setSharable(false); - v.erase(v.begin(), v.end()); - QCOMPARE(v.size(), 0); - } -#endif + QVector<T> v; + v.erase(v.begin(), v.end()); + QCOMPARE(v.size(), 0); } void tst_QVector::eraseEmptyInt() const @@ -1057,22 +1000,10 @@ void tst_QVector::eraseEmptyCustom() const template<typename T> void tst_QVector::eraseEmptyReserved() const { - { - QVector<T> v; - v.reserve(10); - v.erase(v.begin(), v.end()); - QCOMPARE(v.size(), 0); - } -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - // ### Qt6 remove this section - { - QVector<T> v; - v.reserve(10); - v.setSharable(false); - v.erase(v.begin(), v.end()); - QCOMPARE(v.size(), 0); - } -#endif + QVector<T> v; + v.reserve(10); + v.erase(v.begin(), v.end()); + QCOMPARE(v.size(), 0); } void tst_QVector::eraseEmptyReservedInt() const @@ -1179,21 +1110,6 @@ void tst_QVector::erase(bool shared) const if (shared) QCOMPARE(SimpleValue<T>::vector(12), *svc.copy); } -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - // ### Qt6 remove this section - { - QVector<T> v = SimpleValue<T>::vector(10); - SharedVectorChecker<T> svc(v, shared); - v.setSharable(false); - SharedVectorChecker<T> svc2(v, shared); - v.erase(v.begin() + 3); - QCOMPARE(v.size(), 9); - v.erase(v.begin(), v.end() - 1); - QCOMPARE(v.size(), 1); - if (shared) - QCOMPARE(SimpleValue<T>::vector(10), *svc.copy); - } -#endif } void tst_QVector::eraseInt() const @@ -1266,18 +1182,6 @@ template<typename T> void tst_QVector::eraseReserved() const v.erase(v.begin() + 1, v.end() - 1); QCOMPARE(v.size(), 2); } -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - // ### Qt6 remove this section - { - QVector<T> v(10); - v.reserve(16); - v.setSharable(false); - v.erase(v.begin() + 3); - QCOMPARE(v.size(), 9); - v.erase(v.begin(), v.end() - 1); - QCOMPARE(v.size(), 1); - } -#endif } void tst_QVector::eraseReservedInt() const @@ -2019,33 +1923,6 @@ void tst_QVector::resizePOD_data() const QTest::newRow("emptyReserved") << emptyReserved << 10; QTest::newRow("nonEmpty") << nonEmpty << 10; QTest::newRow("nonEmptyReserved") << nonEmptyReserved << 10; - -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - // ### Qt6 remove this section - QVector<int> nullNotShared; - QVector<int> emptyNotShared(0, 5); - QVector<int> emptyReservedNotShared; - QVector<int> nonEmptyNotShared; - QVector<int> nonEmptyReservedNotShared; - - emptyReservedNotShared.reserve(10); - nonEmptyReservedNotShared.reserve(15); - nonEmptyNotShared << 0 << 1 << 2 << 3 << 4; - nonEmptyReservedNotShared << 0 << 1 << 2 << 3 << 4 << 5 << 6; - QVERIFY(emptyReservedNotShared.capacity() >= 10); - QVERIFY(nonEmptyReservedNotShared.capacity() >= 15); - - emptyNotShared.setSharable(false); - emptyReservedNotShared.setSharable(false); - nonEmptyNotShared.setSharable(false); - nonEmptyReservedNotShared.setSharable(false); - - QTest::newRow("nullNotShared") << nullNotShared << 10; - QTest::newRow("emptyNotShared") << emptyNotShared << 10; - QTest::newRow("emptyReservedNotShared") << emptyReservedNotShared << 10; - QTest::newRow("nonEmptyNotShared") << nonEmptyNotShared << 10; - QTest::newRow("nonEmptyReservedNotShared") << nonEmptyReservedNotShared << 10; -#endif } void tst_QVector::resizePOD() const @@ -2094,33 +1971,6 @@ void tst_QVector::resizeComplexMovable_data() const QTest::newRow("emptyReserved") << emptyReserved << 10; QTest::newRow("nonEmpty") << nonEmpty << 10; QTest::newRow("nonEmptyReserved") << nonEmptyReserved << 10; - -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - // ### Qt6 remove this section - QVector<Movable> nullNotShared; - QVector<Movable> emptyNotShared(0, 'Q'); - QVector<Movable> emptyReservedNotShared; - QVector<Movable> nonEmptyNotShared; - QVector<Movable> nonEmptyReservedNotShared; - - emptyReservedNotShared.reserve(10); - nonEmptyReservedNotShared.reserve(15); - nonEmptyNotShared << '0' << '1' << '2' << '3' << '4'; - nonEmptyReservedNotShared << '0' << '1' << '2' << '3' << '4' << '5' << '6'; - QVERIFY(emptyReservedNotShared.capacity() >= 10); - QVERIFY(nonEmptyReservedNotShared.capacity() >= 15); - - emptyNotShared.setSharable(false); - emptyReservedNotShared.setSharable(false); - nonEmptyNotShared.setSharable(false); - nonEmptyReservedNotShared.setSharable(false); - - QTest::newRow("nullNotShared") << nullNotShared << 10; - QTest::newRow("emptyNotShared") << emptyNotShared << 10; - QTest::newRow("emptyReservedNotShared") << emptyReservedNotShared << 10; - QTest::newRow("nonEmptyNotShared") << nonEmptyNotShared << 10; - QTest::newRow("nonEmptyReservedNotShared") << nonEmptyReservedNotShared << 10; -#endif } void tst_QVector::resizeComplexMovable() const @@ -2173,33 +2023,6 @@ void tst_QVector::resizeComplex_data() const QTest::newRow("emptyReserved") << emptyReserved << 10; QTest::newRow("nonEmpty") << nonEmpty << 10; QTest::newRow("nonEmptyReserved") << nonEmptyReserved << 10; - -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - // ### Qt6 remove this section - QVector<Custom> nullNotShared; - QVector<Custom> emptyNotShared(0, '0'); - QVector<Custom> emptyReservedNotShared; - QVector<Custom> nonEmptyNotShared; - QVector<Custom> nonEmptyReservedNotShared; - - emptyReservedNotShared.reserve(10); - nonEmptyReservedNotShared.reserve(15); - nonEmptyNotShared << '0' << '1' << '2' << '3' << '4'; - nonEmptyReservedNotShared << '0' << '1' << '2' << '3' << '4' << '5' << '6'; - QVERIFY(emptyReservedNotShared.capacity() >= 10); - QVERIFY(nonEmptyReservedNotShared.capacity() >= 15); - - emptyNotShared.setSharable(false); - emptyReservedNotShared.setSharable(false); - nonEmptyNotShared.setSharable(false); - nonEmptyReservedNotShared.setSharable(false); - - QTest::newRow("nullNotShared") << nullNotShared << 10; - QTest::newRow("emptyNotShared") << emptyNotShared << 10; - QTest::newRow("emptyReservedNotShared") << emptyReservedNotShared << 10; - QTest::newRow("nonEmptyNotShared") << nonEmptyNotShared << 10; - QTest::newRow("nonEmptyReservedNotShared") << nonEmptyReservedNotShared << 10; -#endif } void tst_QVector::resizeComplex() const @@ -2512,87 +2335,6 @@ void tst_QVector::reserveZero() QVERIFY(vec.capacity() >= 1); } -// This is a regression test for QTBUG-11763, where memory would be reallocated -// soon after copying a QVector. -void tst_QVector::reallocAfterCopy_data() -{ - QTest::addColumn<int>("capacity"); - QTest::addColumn<int>("fill_size"); - QTest::addColumn<int>("func_id"); - QTest::addColumn<int>("result1"); - QTest::addColumn<int>("result2"); - QTest::addColumn<int>("result3"); - QTest::addColumn<int>("result4"); - - int result1, result2, result3, result4; - int fill_size; - for (int i = 70; i <= 100; i += 10) { - const QByteArray prefix = "reallocAfterCopy:" + QByteArray::number(i) + ','; - fill_size = i - 20; - for (int j = 0; j <= 3; j++) { - if (j == 0) { // append - result1 = i; - result2 = i; - result3 = i - 19; - result4 = i - 20; - } else if (j == 1) { // insert(0) - result1 = i; - result2 = i; - result3 = i - 19; - result4 = i - 20; - } else if (j == 2) { // insert(20) - result1 = i; - result2 = i; - result3 = i - 19; - result4 = i - 20; - } else if (j == 3) { // insert(0, 10) - result1 = i; - result2 = i; - result3 = i - 10; - result4 = i - 20; - } - QTest::newRow((prefix + QByteArray::number(j)).constData()) - << i << fill_size << j << result1 << result2 << result3 << result4; - } - } -} - -void tst_QVector::reallocAfterCopy() -{ - QFETCH(int, capacity); - QFETCH(int, fill_size); - QFETCH(int, func_id); - QFETCH(int, result1); - QFETCH(int, result2); - QFETCH(int, result3); - QFETCH(int, result4); - - QVector<qreal> v1; - QVector<qreal> v2; - - v1.reserve(capacity); - v1.resize(0); - v1.fill(qreal(1.0), fill_size); - - v2 = v1; - - // no need to test begin() and end(), there is a detach() in them - if (func_id == 0) { - v1.append(qreal(1.0)); //push_back is same as append - } else if (func_id == 1) { - v1.insert(0, qreal(1.0)); //push_front is same as prepend, insert(0) - } else if (func_id == 2) { - v1.insert(20, qreal(1.0)); - } else if (func_id == 3) { - v1.insert(0, 10, qreal(1.0)); - } - - QCOMPARE(v1.capacity(), result1); - QCOMPARE(v2.capacity(), result2); - QCOMPARE(v1.size(), result3); - QCOMPARE(v2.size(), result4); -} - template<typename T> void tst_QVector::initializeList() { @@ -2636,154 +2378,9 @@ void tst_QVector::initializeListCustom() void tst_QVector::const_shared_null() { QVector<int> v2; -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) - // ### Qt6 remove this section - QVector<int> v1; - v1.setSharable(false); - QVERIFY(v1.isDetached()); - - v2.setSharable(true); -#endif QVERIFY(!v2.isDetached()); } -#if !defined(QT_NO_UNSHARABLE_CONTAINERS) -// ### Qt6 remove this section -template<typename T> -void tst_QVector::setSharable_data() const -{ - QTest::addColumn<QVector<T> >("vector"); - QTest::addColumn<int>("size"); - QTest::addColumn<int>("capacity"); - QTest::addColumn<bool>("isCapacityReserved"); - - QVector<T> null; - QVector<T> empty(0, SimpleValue<T>::at(1)); - QVector<T> emptyReserved; - QVector<T> nonEmpty; - QVector<T> nonEmptyReserved; - - emptyReserved.reserve(10); - nonEmptyReserved.reserve(15); - - nonEmpty << SimpleValue<T>::at(0) << SimpleValue<T>::at(1) << SimpleValue<T>::at(2) << SimpleValue<T>::at(3) << SimpleValue<T>::at(4); - nonEmptyReserved << SimpleValue<T>::at(0) << SimpleValue<T>::at(1) << SimpleValue<T>::at(2) << SimpleValue<T>::at(3) << SimpleValue<T>::at(4) << SimpleValue<T>::at(5) << SimpleValue<T>::at(6); - - QVERIFY(emptyReserved.capacity() >= 10); - QVERIFY(nonEmptyReserved.capacity() >= 15); - - QTest::newRow("null") << null << 0 << 0 << false; - QTest::newRow("empty") << empty << 0 << 0 << false; - QTest::newRow("empty, Reserved") << emptyReserved << 0 << 10 << true; - QTest::newRow("non-empty") << nonEmpty << 5 << 0 << false; - QTest::newRow("non-empty, Reserved") << nonEmptyReserved << 7 << 15 << true; -} - -template<typename T> -void tst_QVector::setSharable() const -{ - QFETCH(QVector<T>, vector); - QFETCH(int, size); - QFETCH(int, capacity); - QFETCH(bool, isCapacityReserved); - - QVERIFY(!vector.isDetached()); // Shared with QTest - - vector.setSharable(true); - - QCOMPARE(vector.size(), size); - if (isCapacityReserved) - QVERIFY2(vector.capacity() >= capacity, - qPrintable(QString("Capacity is %1, expected at least %2.") - .arg(vector.capacity()) - .arg(capacity))); - - { - QVector<T> copy(vector); - - QVERIFY(!copy.isDetached()); - QVERIFY(copy.isSharedWith(vector)); - } - - vector.setSharable(false); - QVERIFY(vector.isDetached() || vector.isSharedWith(QVector<T>())); - - { - QVector<T> copy(vector); - - QVERIFY(copy.isDetached() || copy.isEmpty() || copy.isSharedWith(QVector<T>())); - QCOMPARE(copy.size(), size); - if (isCapacityReserved) - QVERIFY2(copy.capacity() >= capacity, - qPrintable(QString("Capacity is %1, expected at least %2.") - .arg(copy.capacity()) - .arg(capacity))); - QCOMPARE(copy, vector); - } - - vector.setSharable(true); - - { - QVector<T> copy(vector); - - QVERIFY(!copy.isDetached()); - QVERIFY(copy.isSharedWith(vector)); - } - - for (int i = 0; i < vector.size(); ++i) - QCOMPARE(vector[i], SimpleValue<T>::at(i)); - - QCOMPARE(vector.size(), size); - if (isCapacityReserved) - QVERIFY2(vector.capacity() >= capacity, - qPrintable(QString("Capacity is %1, expected at least %2.") - .arg(vector.capacity()) - .arg(capacity))); -} -#else -template<typename T> void tst_QVector::setSharable_data() const -{ -} - -template<typename T> void tst_QVector::setSharable() const -{ -} -#endif - -void tst_QVector::setSharableInt_data() -{ - setSharable_data<int>(); -} - -void tst_QVector::setSharableMovable_data() -{ - setSharable_data<Movable>(); -} - -void tst_QVector::setSharableCustom_data() -{ - setSharable_data<Custom>(); -} - -void tst_QVector::setSharableInt() -{ - setSharable<int>(); -} - -void tst_QVector::setSharableMovable() -{ - const int instancesCount = Movable::counter.loadAcquire(); - setSharable<Movable>(); - QCOMPARE(instancesCount, Movable::counter.loadAcquire()); -} - -void tst_QVector::setSharableCustom() -{ - const int instancesCount = Custom::counter.loadAcquire(); - setSharable<Custom>(); - QCOMPARE(instancesCount, Custom::counter.loadAcquire()); -} - template<typename T> void tst_QVector::detach() const { @@ -2791,7 +2388,7 @@ void tst_QVector::detach() const // detach an empty vector QVector<T> v; v.detach(); - QVERIFY(v.isDetached()); + QVERIFY(!v.isDetached()); QCOMPARE(v.size(), 0); QCOMPARE(v.capacity(), 0); } @@ -2801,7 +2398,7 @@ void tst_QVector::detach() const QVector<T> ref(v); QVERIFY(!v.isDetached()); v.detach(); - QVERIFY(v.isDetached()); + QVERIFY(!v.isDetached()); QCOMPARE(v.size(), 0); QCOMPARE(v.capacity(), 0); } diff --git a/tests/auto/corelib/tools/qvector_strictiterators/qvector_strictiterators.pro b/tests/auto/corelib/tools/qvector_strictiterators/qvector_strictiterators.pro deleted file mode 100644 index d6cad86aac..0000000000 --- a/tests/auto/corelib/tools/qvector_strictiterators/qvector_strictiterators.pro +++ /dev/null @@ -1,3 +0,0 @@ -include(../qvector/qvector.pro) -TARGET = tst_qvector_strictiterators -DEFINES += QT_STRICT_ITERATORS=1 tst_QVector=tst_QVector_StrictIterators diff --git a/tests/auto/corelib/tools/tools.pro b/tests/auto/corelib/tools/tools.pro index 49b2a1f075..be195ea037 100644 --- a/tests/auto/corelib/tools/tools.pro +++ b/tests/auto/corelib/tools/tools.pro @@ -4,7 +4,6 @@ SUBDIRS=\ containerapisymmetry \ qalgorithms \ qarraydata \ - qarraydata_strictiterators \ qbitarray \ qcache \ qcommandlineparser \ @@ -12,17 +11,14 @@ SUBDIRS=\ qcryptographichash \ qeasingcurve \ qexplicitlyshareddatapointer \ + qflatmap \ qfreelist \ qhash \ - qhash_strictiterators \ qhashfunctions \ qline \ qlinkedlist \ - qlist \ - qlist_strictiterators \ qmakearray \ qmap \ - qmap_strictiterators \ qmargins \ qmessageauthenticationcode \ qoffsetstringarray \ @@ -43,7 +39,6 @@ SUBDIRS=\ qtimeline \ qvarlengtharray \ qvector \ - qvector_strictiterators \ qversionnumber darwin: SUBDIRS += qmacautoreleasepool diff --git a/tests/auto/dbus/qdbusinterface/tst_qdbusinterface.cpp b/tests/auto/dbus/qdbusinterface/tst_qdbusinterface.cpp index 05480c6dd2..5453d9de61 100644 --- a/tests/auto/dbus/qdbusinterface/tst_qdbusinterface.cpp +++ b/tests/auto/dbus/qdbusinterface/tst_qdbusinterface.cpp @@ -31,6 +31,7 @@ #include <qcoreapplication.h> #include <qmetatype.h> #include <QtTest/QtTest> +#include <QtCore/qregularexpression.h> #include <QtCore/qvariant.h> #include <QtDBus/QtDBus> #include <QtDBus/private/qdbus_symbols_p.h> @@ -451,14 +452,16 @@ void tst_QDBusInterface::introspectVirtualObject() QDBusMessage message = QDBusMessage::createMethodCall(con.baseService(), path, "org.freedesktop.DBus.Introspectable", "Introspect"); QDBusMessage reply = con.call(message, QDBus::Block, 5000); QVERIFY(reply.arguments().at(0).toString().contains( - QRegExp("<node>.*zitroneneis.*<interface name=") )); + QRegularExpression("<node>.*zitroneneis.*<interface name=", + QRegularExpression::DotMatchesEverythingOption))); QDBusMessage message2 = QDBusMessage::createMethodCall(con.baseService(), path + "/foo", "org.freedesktop.DBus.Introspectable", "Introspect"); QDBusMessage reply2 = con.call(message2, QDBus::Block, 5000); QVERIFY(reply2.arguments().at(0).toString().contains( - QRegExp("<node>.*<interface name=\"org.qtproject.QtDBus.VirtualObject\">" - ".*<method name=\"klingeling\" />\n" - ".*</interface>.*<interface name=") )); + QRegularExpression("<node>.*<interface name=\"org.qtproject.QtDBus.VirtualObject\">" + ".*<method name=\"klingeling\" />\n" + ".*</interface>.*<interface name=", + QRegularExpression::DotMatchesEverythingOption))); } void tst_QDBusInterface::callMethod() diff --git a/tests/auto/dbus/qdbusmetatype/tst_qdbusmetatype.cpp b/tests/auto/dbus/qdbusmetatype/tst_qdbusmetatype.cpp index 4b926dcd05..ec3e71ac8f 100644 --- a/tests/auto/dbus/qdbusmetatype/tst_qdbusmetatype.cpp +++ b/tests/auto/dbus/qdbusmetatype/tst_qdbusmetatype.cpp @@ -402,7 +402,7 @@ void tst_QDBusMetaType::invalidTypes() else if (qstrcmp(QTest::currentDataTag(), "Invalid7") == 0) QTest::ignoreMessage(QtWarningMsg, "QDBusMarshaller: type `Invalid7' produces invalid D-BUS signature `()' (Did you forget to call beginStructure() ?)"); else if (qstrcmp(QTest::currentDataTag(), "QList<Invalid0>") == 0) - QTest::ignoreMessage(QtWarningMsg, "QDBusMarshaller: type `QList<Invalid0>' produces invalid D-BUS signature `a' (Did you forget to call beginStructure() ?)"); + QTest::ignoreMessage(QtWarningMsg, "QDBusMarshaller: type `QVector<Invalid0>' produces invalid D-BUS signature `a' (Did you forget to call beginStructure() ?)"); staticTypes(); staticTypes(); // run twice: the error messages should be printed once only diff --git a/tests/auto/gui/image/qpicture/tst_qpicture.cpp b/tests/auto/gui/image/qpicture/tst_qpicture.cpp index ec6bb8dcee..6287960457 100644 --- a/tests/auto/gui/image/qpicture/tst_qpicture.cpp +++ b/tests/auto/gui/image/qpicture/tst_qpicture.cpp @@ -37,6 +37,8 @@ #include <qscreen.h> #include <limits.h> +#ifndef QT_NO_PICTURE + class tst_QPicture : public QObject { Q_OBJECT @@ -45,7 +47,6 @@ public: tst_QPicture(); private slots: - void getSetCheck(); void devType(); void paintingActive(); void boundingRect(); @@ -56,31 +57,6 @@ private slots: void boundaryValues(); }; -// Testing get/set functions -void tst_QPicture::getSetCheck() -{ - QPictureIO obj1; - // const QPicture & QPictureIO::picture() - // void QPictureIO::setPicture(const QPicture &) - // const char * QPictureIO::format() - // void QPictureIO::setFormat(const char *) - const char var2[] = "PNG"; - obj1.setFormat(var2); - QCOMPARE(var2, obj1.format()); - obj1.setFormat((char *)0); - // The format is stored internally in a QString, so return is always a valid char * - QVERIFY(QString(obj1.format()).isEmpty()); - - // const char * QPictureIO::parameters() - // void QPictureIO::setParameters(const char *) - const char var3[] = "Bogus data"; - obj1.setParameters(var3); - QCOMPARE(var3, obj1.parameters()); - obj1.setParameters((char *)0); - // The format is stored internally in a QString, so return is always a valid char * - QVERIFY(QString(obj1.parameters()).isEmpty()); -} - tst_QPicture::tst_QPicture() { } @@ -316,6 +292,7 @@ void tst_QPicture::boundaryValues() painter.end(); } - QTEST_MAIN(tst_QPicture) #include "tst_qpicture.moc" + +#endif // QT_NO_PICTURE diff --git a/tests/auto/gui/kernel/kernel.pro b/tests/auto/gui/kernel/kernel.pro index 42135dae24..106e9050b8 100644 --- a/tests/auto/gui/kernel/kernel.pro +++ b/tests/auto/gui/kernel/kernel.pro @@ -4,11 +4,14 @@ SUBDIRS=\ qclipboard \ qcursor \ qdrag \ + qguiaction \ + qguiactiongroup \ qevent \ qfileopenevent \ qguieventdispatcher \ qguieventloop \ qguimetatype \ + qguishortcut \ qguitimer \ qguivariant \ qhighdpiscaling \ @@ -29,6 +32,12 @@ SUBDIRS=\ win32:!winrt:qtHaveModule(network): SUBDIRS += noqteventloop +!qtConfig(shortcut): SUBDIRS -= \ + qkeysequence \ + qguishortcut \ + qguimetatype \ + qguivariant + !qtHaveModule(widgets): SUBDIRS -= \ qmouseevent_modal \ qtouchevent @@ -36,6 +45,10 @@ win32:!winrt:qtHaveModule(network): SUBDIRS += noqteventloop !qtHaveModule(network): SUBDIRS -= \ qguieventloop +!qtConfig(action): SUBDIRS -= \ + qguiaction \ + qguiactiongroup + !qtConfig(highdpiscaling): SUBDIRS -= qhighdpiscaling !qtConfig(opengl): SUBDIRS -= qopenglwindow diff --git a/tests/auto/widgets/kernel/qaction/.gitignore b/tests/auto/gui/kernel/qguiaction/.gitignore index bf81f5bf2c..bf81f5bf2c 100644 --- a/tests/auto/widgets/kernel/qaction/.gitignore +++ b/tests/auto/gui/kernel/qguiaction/.gitignore diff --git a/tests/auto/gui/kernel/qguiaction/qguiaction.pro b/tests/auto/gui/kernel/qguiaction/qguiaction.pro new file mode 100644 index 0000000000..2a39636119 --- /dev/null +++ b/tests/auto/gui/kernel/qguiaction/qguiaction.pro @@ -0,0 +1,4 @@ +CONFIG += testcase +TARGET = tst_qguiaction +QT += gui-private core-private testlib +SOURCES += tst_qguiaction.cpp diff --git a/tests/auto/gui/kernel/qguiaction/tst_qguiaction.cpp b/tests/auto/gui/kernel/qguiaction/tst_qguiaction.cpp new file mode 100644 index 0000000000..9d45d4ae14 --- /dev/null +++ b/tests/auto/gui/kernel/qguiaction/tst_qguiaction.cpp @@ -0,0 +1,210 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest/QtTest> + +#include <qguiapplication.h> +#include <qevent.h> +#include <qguiaction.h> +#include <qguiactiongroup.h> +#include <qpa/qplatformtheme.h> + +#include <private/qguiapplication_p.h> + +class tst_QGuiAction : public QObject +{ + Q_OBJECT + +public: + tst_QGuiAction(); + +private slots: + void cleanup(); + void getSetCheck(); + void setText_data(); + void setText(); + void setIconText_data() { setText_data(); } + void setIconText(); +#if QT_CONFIG(shortcut) + void setStandardKeys(); + void task200823_tooltip(); +#endif + void task229128TriggeredSignalWithoutActiongroup(); + void setData(); + +private: + const int m_keyboardScheme; +}; + +tst_QGuiAction::tst_QGuiAction() + : m_keyboardScheme(QGuiApplicationPrivate::platformTheme()->themeHint(QPlatformTheme::KeyboardScheme).toInt()) +{ +} + +void tst_QGuiAction::cleanup() +{ + QVERIFY(QGuiApplication::topLevelWindows().isEmpty()); +} + +// Testing get/set functions +void tst_QGuiAction::getSetCheck() +{ + QGuiAction obj1(nullptr); + // QActionGroup * QAction::actionGroup() + // void QAction::setActionGroup(QActionGroup *) + auto var1 = new QGuiActionGroup(nullptr); + obj1.setActionGroup(var1); + QCOMPARE(var1, obj1.guiActionGroup()); + obj1.setActionGroup(nullptr); + QCOMPARE(obj1.guiActionGroup(), nullptr); + delete var1; + + QCOMPARE(obj1.priority(), QGuiAction::NormalPriority); + obj1.setPriority(QGuiAction::LowPriority); + QCOMPARE(obj1.priority(), QGuiAction::LowPriority); +} + +void tst_QGuiAction::setText_data() +{ + QTest::addColumn<QString>("text"); + QTest::addColumn<QString>("iconText"); + QTest::addColumn<QString>("textFromIconText"); + + //next we fill it with data + QTest::newRow("Normal") << "Action" << "Action" << "Action"; + QTest::newRow("Ampersand") << "Search && Destroy" << "Search & Destroy" << "Search && Destroy"; + QTest::newRow("Mnemonic and ellipsis") << "O&pen File ..." << "Open File" << "Open File"; +} + +void tst_QGuiAction::setText() +{ + QFETCH(QString, text); + + QGuiAction action(nullptr); + action.setText(text); + + QCOMPARE(action.text(), text); + + QFETCH(QString, iconText); + QCOMPARE(action.iconText(), iconText); +} + +void tst_QGuiAction::setIconText() +{ + QFETCH(QString, iconText); + + QGuiAction action(nullptr); + action.setIconText(iconText); + QCOMPARE(action.iconText(), iconText); + + QFETCH(QString, textFromIconText); + QCOMPARE(action.text(), textFromIconText); +} + +#if QT_CONFIG(shortcut) + +//basic testing of standard keys +void tst_QGuiAction::setStandardKeys() +{ + QGuiAction act(nullptr); + act.setShortcut(QKeySequence("CTRL+L")); + QList<QKeySequence> list; + act.setShortcuts(list); + act.setShortcuts(QKeySequence::Copy); + QCOMPARE(act.shortcut(), act.shortcuts().constFirst()); + + QList<QKeySequence> expected; + const QKeySequence ctrlC = QKeySequence(QStringLiteral("CTRL+C")); + const QKeySequence ctrlInsert = QKeySequence(QStringLiteral("CTRL+INSERT")); + switch (m_keyboardScheme) { + case QPlatformTheme::MacKeyboardScheme: + expected << ctrlC; + break; + case QPlatformTheme::WindowsKeyboardScheme: + expected << ctrlC << ctrlInsert; + break; + default: // X11 + expected << ctrlC << ctrlInsert << QKeySequence(QStringLiteral("F16")); + break; + } + + QCOMPARE(act.shortcuts(), expected); +} + +void tst_QGuiAction::task200823_tooltip() +{ + const QScopedPointer<QGuiAction> action(new QGuiAction("foo", nullptr)); + QString shortcut("ctrl+o"); + action->setShortcut(shortcut); + + // we want a non-standard tooltip that shows the shortcut + action->setToolTip(action->text() + QLatin1String(" (") + action->shortcut().toString() + QLatin1Char(')')); + + QString ref = QLatin1String("foo (") + QKeySequence(shortcut).toString() + QLatin1Char(')'); + QCOMPARE(action->toolTip(), ref); +} + +#endif // QT_CONFIG(shortcut) + +void tst_QGuiAction::task229128TriggeredSignalWithoutActiongroup() +{ + // test without a group + const QScopedPointer<QGuiAction> actionWithoutGroup(new QGuiAction("Test", nullptr)); + QSignalSpy spyWithoutGroup(actionWithoutGroup.data(), QOverload<bool>::of(&QGuiAction::triggered)); + QCOMPARE(spyWithoutGroup.count(), 0); + actionWithoutGroup->trigger(); + // signal should be emitted + QCOMPARE(spyWithoutGroup.count(), 1); + + // it is now a checkable checked action + actionWithoutGroup->setCheckable(true); + actionWithoutGroup->setChecked(true); + spyWithoutGroup.clear(); + QCOMPARE(spyWithoutGroup.count(), 0); + actionWithoutGroup->trigger(); + // signal should be emitted + QCOMPARE(spyWithoutGroup.count(), 1); +} + +void tst_QGuiAction::setData() // QTBUG-62006 +{ + QGuiAction act(nullptr); + QSignalSpy spy(&act, &QGuiAction::changed); + QCOMPARE(act.data(), QVariant()); + QCOMPARE(spy.count(), 0); + act.setData(QVariant()); + QCOMPARE(spy.count(), 0); + + act.setData(-1); + QCOMPARE(spy.count(), 1); + act.setData(-1); + QCOMPARE(spy.count(), 1); +} + +QTEST_MAIN(tst_QGuiAction) +#include "tst_qguiaction.moc" diff --git a/tests/auto/gui/kernel/qguiactiongroup/.gitignore b/tests/auto/gui/kernel/qguiactiongroup/.gitignore new file mode 100644 index 0000000000..daba003e96 --- /dev/null +++ b/tests/auto/gui/kernel/qguiactiongroup/.gitignore @@ -0,0 +1 @@ +tst_qactiongroup diff --git a/tests/auto/gui/kernel/qguiactiongroup/qguiactiongroup.pro b/tests/auto/gui/kernel/qguiactiongroup/qguiactiongroup.pro new file mode 100644 index 0000000000..7fd64e70f1 --- /dev/null +++ b/tests/auto/gui/kernel/qguiactiongroup/qguiactiongroup.pro @@ -0,0 +1,4 @@ +CONFIG += testcase +TARGET = tst_qactiongroup +QT += testlib +SOURCES += tst_qguiactiongroup.cpp diff --git a/tests/auto/gui/kernel/qguiactiongroup/tst_qguiactiongroup.cpp b/tests/auto/gui/kernel/qguiactiongroup/tst_qguiactiongroup.cpp new file mode 100644 index 0000000000..1ac14280fb --- /dev/null +++ b/tests/auto/gui/kernel/qguiactiongroup/tst_qguiactiongroup.cpp @@ -0,0 +1,235 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest/QtTest> + +#include <qguiaction.h> +#include <qguiactiongroup.h> + +class tst_QGuiActionGroup : public QObject +{ + Q_OBJECT + +private slots: + void cleanup() { QVERIFY(QGuiApplication::topLevelWindows().isEmpty()); } + void enabledPropagation(); + void visiblePropagation(); + void exclusive(); + void exclusiveOptional(); + void testActionInTwoQActionGroup(); + void unCheckCurrentAction(); +}; + +void tst_QGuiActionGroup::enabledPropagation() +{ + QGuiActionGroup testActionGroup(nullptr); + + auto childAction = new QGuiAction( &testActionGroup ); + auto anotherChildAction = new QGuiAction( &testActionGroup ); + auto freeAction = new QGuiAction(nullptr); + + QVERIFY( testActionGroup.isEnabled() ); + QVERIFY( childAction->isEnabled() ); + + testActionGroup.setEnabled( false ); + QVERIFY( !testActionGroup.isEnabled() ); + QVERIFY( !childAction->isEnabled() ); + QVERIFY( !anotherChildAction->isEnabled() ); + + childAction->setEnabled(true); + QVERIFY( !childAction->isEnabled()); + + anotherChildAction->setEnabled( false ); + + testActionGroup.setEnabled( true ); + QVERIFY( testActionGroup.isEnabled() ); + QVERIFY( childAction->isEnabled() ); + QVERIFY( !anotherChildAction->isEnabled() ); + + testActionGroup.setEnabled( false ); + auto lastChildAction = new QGuiAction(&testActionGroup); + + QVERIFY(!lastChildAction->isEnabled()); + testActionGroup.setEnabled( true ); + QVERIFY(lastChildAction->isEnabled()); + + freeAction->setEnabled(false); + testActionGroup.addAction(freeAction); + QVERIFY(!freeAction->isEnabled()); + delete freeAction; +} + +void tst_QGuiActionGroup::visiblePropagation() +{ + QGuiActionGroup testActionGroup(nullptr); + + auto childAction = new QGuiAction( &testActionGroup ); + auto anotherChildAction = new QGuiAction( &testActionGroup ); + auto freeAction = new QGuiAction(nullptr); + + QVERIFY( testActionGroup.isVisible() ); + QVERIFY( childAction->isVisible() ); + + testActionGroup.setVisible( false ); + QVERIFY( !testActionGroup.isVisible() ); + QVERIFY( !childAction->isVisible() ); + QVERIFY( !anotherChildAction->isVisible() ); + + anotherChildAction->setVisible(false); + + testActionGroup.setVisible( true ); + QVERIFY( testActionGroup.isVisible() ); + QVERIFY( childAction->isVisible() ); + + QVERIFY( !anotherChildAction->isVisible() ); + + testActionGroup.setVisible( false ); + auto lastChildAction = new QGuiAction(&testActionGroup); + + QVERIFY(!lastChildAction->isVisible()); + testActionGroup.setVisible( true ); + QVERIFY(lastChildAction->isVisible()); + + freeAction->setVisible(false); + testActionGroup.addAction(freeAction); + QVERIFY(!freeAction->isVisible()); + delete freeAction; +} + +void tst_QGuiActionGroup::exclusive() +{ + QGuiActionGroup group(nullptr); + group.setExclusive(false); + QVERIFY( !group.isExclusive() ); + + auto actOne = new QGuiAction(&group); + actOne->setCheckable( true ); + auto actTwo = new QGuiAction(&group); + actTwo->setCheckable( true ); + auto actThree = new QGuiAction(&group); + actThree->setCheckable( true ); + + group.setExclusive( true ); + QVERIFY( !actOne->isChecked() ); + QVERIFY( !actTwo->isChecked() ); + QVERIFY( !actThree->isChecked() ); + + actOne->setChecked( true ); + QVERIFY( actOne->isChecked() ); + QVERIFY( !actTwo->isChecked() ); + QVERIFY( !actThree->isChecked() ); + + actTwo->setChecked( true ); + QVERIFY( !actOne->isChecked() ); + QVERIFY( actTwo->isChecked() ); + QVERIFY( !actThree->isChecked() ); +} + +void tst_QGuiActionGroup::exclusiveOptional() +{ + QGuiActionGroup group(0); + group.setExclusive(true); + QVERIFY( group.isExclusive() ); + + auto actOne = new QGuiAction(&group); + actOne->setCheckable( true ); + auto actTwo = new QGuiAction(&group); + actTwo->setCheckable( true ); + auto actThree = new QGuiAction(&group); + actThree->setCheckable( true ); + + QVERIFY( !actOne->isChecked() ); + QVERIFY( !actTwo->isChecked() ); + QVERIFY( !actThree->isChecked() ); + + actOne->trigger(); + QVERIFY( actOne->isChecked() ); + QVERIFY( !actTwo->isChecked() ); + QVERIFY( !actThree->isChecked() ); + + actOne->trigger(); + QVERIFY( actOne->isChecked() ); + QVERIFY( !actTwo->isChecked() ); + QVERIFY( !actThree->isChecked() ); + + group.setExclusionPolicy(QGuiActionGroup::ExclusionPolicy::ExclusiveOptional); + QVERIFY( group.isExclusive() ); + + actOne->trigger(); + QVERIFY( !actOne->isChecked() ); + QVERIFY( !actTwo->isChecked() ); + QVERIFY( !actThree->isChecked() ); + + actTwo->trigger(); + QVERIFY( !actOne->isChecked() ); + QVERIFY( actTwo->isChecked() ); + QVERIFY( !actThree->isChecked() ); + + actTwo->trigger(); + QVERIFY( !actOne->isChecked() ); + QVERIFY( !actTwo->isChecked() ); + QVERIFY( !actThree->isChecked() ); +} + +void tst_QGuiActionGroup::testActionInTwoQActionGroup() +{ + QGuiAction action1("Action 1", this); + + QGuiActionGroup group1(this); + QGuiActionGroup group2(this); + + group1.addAction(&action1); + group2.addAction(&action1); + + QCOMPARE(action1.guiActionGroup(), &group2); + QCOMPARE(group2.guiActions().constFirst(), &action1); + QCOMPARE(group1.guiActions().isEmpty(), true); +} + +void tst_QGuiActionGroup::unCheckCurrentAction() +{ + QGuiActionGroup group(nullptr); + QGuiAction action1(&group) ,action2(&group); + action1.setCheckable(true); + action2.setCheckable(true); + QVERIFY(!action1.isChecked()); + QVERIFY(!action2.isChecked()); + action1.setChecked(true); + QVERIFY(action1.isChecked()); + QVERIFY(!action2.isChecked()); + auto current = group.checkedGuiAction(); + QCOMPARE(current, &action1); + current->setChecked(false); + QVERIFY(!action1.isChecked()); + QVERIFY(!action2.isChecked()); + QVERIFY(!group.checkedGuiAction()); +} + + +QTEST_MAIN(tst_QGuiActionGroup) +#include "tst_qguiactiongroup.moc" diff --git a/tests/auto/gui/kernel/qguimetatype/tst_qguimetatype.cpp b/tests/auto/gui/kernel/qguimetatype/tst_qguimetatype.cpp index 3ce65a6785..2645bb111e 100644 --- a/tests/auto/gui/kernel/qguimetatype/tst_qguimetatype.cpp +++ b/tests/auto/gui/kernel/qguimetatype/tst_qguimetatype.cpp @@ -181,9 +181,13 @@ template<> struct TestValueFactory<QMetaType::QCursor> { static QCursor *create() { return new QCursor(Qt::WaitCursor); } }; #endif + +#if QT_CONFIG(shortcut) template<> struct TestValueFactory<QMetaType::QKeySequence> { static QKeySequence *create() { return new QKeySequence(QKeySequence::Close); } }; +#endif + template<> struct TestValueFactory<QMetaType::QPen> { static QPen *create() { return new QPen(Qt::DashDotDotLine); } }; @@ -312,30 +316,10 @@ void tst_QGuiMetaType::sizeOf() QCOMPARE(QMetaType::sizeOf(type), size); } -#ifndef Q_ALIGNOF -template<uint N> -struct RoundToNextHighestPowerOfTwo -{ -private: - enum { V1 = N-1 }; - enum { V2 = V1 | (V1 >> 1) }; - enum { V3 = V2 | (V2 >> 2) }; - enum { V4 = V3 | (V3 >> 4) }; - enum { V5 = V4 | (V4 >> 8) }; - enum { V6 = V5 | (V5 >> 16) }; -public: - enum { Value = V6 + 1 }; -}; -#endif - template<class T> struct TypeAlignment { -#ifdef Q_ALIGNOF - enum { Value = Q_ALIGNOF(T) }; -#else - enum { Value = RoundToNextHighestPowerOfTwo<sizeof(T)>::Value }; -#endif + enum { Value = alignof(T) }; }; void tst_QGuiMetaType::flags_data() diff --git a/tests/auto/gui/kernel/qguishortcut/qguishortcut.pro b/tests/auto/gui/kernel/qguishortcut/qguishortcut.pro new file mode 100644 index 0000000000..1417dee213 --- /dev/null +++ b/tests/auto/gui/kernel/qguishortcut/qguishortcut.pro @@ -0,0 +1,4 @@ +CONFIG += testcase +TARGET = tst_qguishortcut +QT += testlib +SOURCES += tst_qguishortcut.cpp diff --git a/tests/auto/gui/kernel/qguishortcut/tst_qguishortcut.cpp b/tests/auto/gui/kernel/qguishortcut/tst_qguishortcut.cpp new file mode 100644 index 0000000000..bc3fb9862d --- /dev/null +++ b/tests/auto/gui/kernel/qguishortcut/tst_qguishortcut.cpp @@ -0,0 +1,82 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest/QtTest> +#include <QtGui/qguiapplication.h> +#include <QtGui/qguishortcut.h> +#include <QtGui/qpainter.h> +#include <QtGui/qrasterwindow.h> +#include <QtGui/qscreen.h> +#include <QtGui/qwindow.h> + +class tst_QGuiShortcut : public QObject +{ + Q_OBJECT +public: + +private slots: + void trigger(); +}; + +class ColoredWindow : public QRasterWindow { +public: + ColoredWindow(QColor c) : m_color(c) {} + +protected: + void paintEvent(QPaintEvent *event) override; + +private: + const QColor m_color; +}; + +void ColoredWindow::paintEvent(QPaintEvent *) +{ + QPainter p(this); + p.fillRect(QRect(QPoint(), size()), m_color); +} + +static void sendKey(QWindow *target, Qt::Key k, char c, Qt::KeyboardModifiers modifiers) +{ + QTest::sendKeyEvent(QTest::Press, target, k, c, modifiers); + QTest::sendKeyEvent(QTest::Release, target, k, c, modifiers); +} + +void tst_QGuiShortcut::trigger() +{ + ColoredWindow w(Qt::yellow); + w.setTitle(QTest::currentTestFunction()); + w.resize(QGuiApplication::primaryScreen()->size() / 4); + new QGuiShortcut(Qt::CTRL + Qt::Key_Q, &w, SLOT(close())); + w.show(); + QVERIFY(QTest::qWaitForWindowExposed(&w)); + sendKey(&w, Qt::Key_Q, 'q', Qt::ControlModifier); + QTRY_VERIFY(!w.isVisible()); +} + +QTEST_MAIN(tst_QGuiShortcut) +#include "tst_qguishortcut.moc" diff --git a/tests/auto/gui/kernel/qkeyevent/tst_qkeyevent.cpp b/tests/auto/gui/kernel/qkeyevent/tst_qkeyevent.cpp index 87a47bd93b..6a928cac7a 100644 --- a/tests/auto/gui/kernel/qkeyevent/tst_qkeyevent.cpp +++ b/tests/auto/gui/kernel/qkeyevent/tst_qkeyevent.cpp @@ -64,8 +64,10 @@ public: private slots: void basicEventDelivery(); +#if QT_CONFIG(shortcut) void modifiers_data(); void modifiers(); +#endif }; tst_QKeyEvent::tst_QKeyEvent() @@ -128,6 +130,8 @@ static QByteArray modifiersTestRowName(const QString &keySequence) return result; } +#if QT_CONFIG(shortcut) + void tst_QKeyEvent::modifiers_data() { struct Modifier @@ -198,5 +202,7 @@ void tst_QKeyEvent::modifiers() } } +#endif // QT_CONFIG(shortcut) + QTEST_MAIN(tst_QKeyEvent) #include "tst_qkeyevent.moc" diff --git a/tests/auto/gui/kernel/qpalette/tst_qpalette.cpp b/tests/auto/gui/kernel/qpalette/tst_qpalette.cpp index 6ce6422f48..a4764a47c0 100644 --- a/tests/auto/gui/kernel/qpalette/tst_qpalette.cpp +++ b/tests/auto/gui/kernel/qpalette/tst_qpalette.cpp @@ -41,6 +41,12 @@ private Q_SLOTS: void copySemantics(); void moveSemantics(); void setBrush(); + + void isBrushSet(); + void setAllPossibleBrushes(); + void noBrushesSetForDefaultPalette(); + void cannotCheckIfInvalidBrushSet(); + void checkIfBrushForCurrentGroupSet(); }; void tst_QPalette::roleValues_data() @@ -194,5 +200,62 @@ void tst_QPalette::setBrush() QVERIFY(pp.isCopyOf(p)); } +void tst_QPalette::isBrushSet() +{ + QPalette p; + + // Set only one color group + p.setBrush(QPalette::Active, QPalette::Mid, QBrush(Qt::red)); + QVERIFY(p.isBrushSet(QPalette::Active, QPalette::Mid)); + QVERIFY(!p.isBrushSet(QPalette::Inactive, QPalette::Mid)); + QVERIFY(!p.isBrushSet(QPalette::Disabled, QPalette::Mid)); + + // Set all color groups + p.setBrush(QPalette::LinkVisited, QBrush(Qt::green)); + QVERIFY(p.isBrushSet(QPalette::Active, QPalette::LinkVisited)); + QVERIFY(p.isBrushSet(QPalette::Inactive, QPalette::LinkVisited)); + QVERIFY(p.isBrushSet(QPalette::Disabled, QPalette::LinkVisited)); +} + +void tst_QPalette::setAllPossibleBrushes() +{ + QPalette p; + + QCOMPARE(p.resolve(), QPalette::ResolveMask(0)); + + for (int r = 0; r < QPalette::NColorRoles; ++r) { + p.setBrush(QPalette::All, QPalette::ColorRole(r), Qt::red); + } + + for (int r = 0; r < QPalette::NColorRoles; ++r) { + for (int g = 0; g < QPalette::NColorGroups; ++g) { + QVERIFY(p.isBrushSet(QPalette::ColorGroup(g), QPalette::ColorRole(r))); + } + } +} + +void tst_QPalette::noBrushesSetForDefaultPalette() +{ + QCOMPARE(QPalette().resolve(), QPalette::ResolveMask(0)); +} + +void tst_QPalette::cannotCheckIfInvalidBrushSet() +{ + QPalette p(Qt::red); + + QVERIFY(!p.isBrushSet(QPalette::All, QPalette::LinkVisited)); + QVERIFY(!p.isBrushSet(QPalette::Active, QPalette::NColorRoles)); +} + +void tst_QPalette::checkIfBrushForCurrentGroupSet() +{ + QPalette p; + + p.setCurrentColorGroup(QPalette::Disabled); + p.setBrush(QPalette::Current, QPalette::Link, QBrush(Qt::yellow)); + + QVERIFY(p.isBrushSet(QPalette::Current, QPalette::Link)); +} + QTEST_MAIN(tst_QPalette) #include "tst_qpalette.moc" diff --git a/tests/auto/gui/painting/qcolor/tst_qcolor.cpp b/tests/auto/gui/painting/qcolor/tst_qcolor.cpp index 07c820dc86..f8502c1e2f 100644 --- a/tests/auto/gui/painting/qcolor/tst_qcolor.cpp +++ b/tests/auto/gui/painting/qcolor/tst_qcolor.cpp @@ -1032,6 +1032,15 @@ void tst_QColor::setRgbF() QCOMPARE(qfloat16(b2), qfloat16(b)); } } + QVERIFY(color.isValid()); + QColor invalidRgb = color; + QColor invalidRgbF = color; + QTest::ignoreMessage(QtWarningMsg, "QColor::setRgb: RGB parameters out of range"); + invalidRgb.setRgb(-1, -1, -1); + QTest::ignoreMessage(QtWarningMsg, "QColor::setRgb: RGB parameters out of range"); + invalidRgbF.setRgb(-1, -1, -1, -1); + QVERIFY(!invalidRgb.isValid()); + QVERIFY(!invalidRgbF.isValid()); } void tst_QColor::setRgba() @@ -1146,6 +1155,16 @@ void tst_QColor::setHsv() QCOMPARE(v2, v); } } + QVERIFY(color.isValid()); + QVERIFY(color.isValid()); + QColor invalidHsv = color; + QColor invalidHsvF = color; + QTest::ignoreMessage(QtWarningMsg, "QColor::setHsv: HSV parameters out of range"); + invalidHsv.setHsv(-1, -1, -1); + QTest::ignoreMessage(QtWarningMsg, "QColor::setHsvF: HSV parameters out of range"); + invalidHsvF.setHsvF(-1, -1, -1); + QVERIFY(!invalidHsv.isValid()); + QVERIFY(!invalidHsvF.isValid()); } void tst_QColor::setCmyk() @@ -1271,6 +1290,15 @@ void tst_QColor::setCmyk() QCOMPARE(k2, k); } } + QVERIFY(color.isValid()); + QColor invalidCmyk = color; + QColor invalidCmykF = color; + QTest::ignoreMessage(QtWarningMsg, "QColor::setCmyk: CMYK parameters out of range"); + invalidCmyk.setCmyk(-1, -1, -1, -1, -1); + QTest::ignoreMessage(QtWarningMsg, "QColor::setCmykF: CMYK parameters out of range"); + invalidCmykF.setCmykF(-1, -1, -1, -1, -1); + QVERIFY(!invalidCmyk.isValid()); + QVERIFY(!invalidCmykF.isValid()); } void tst_QColor::setHsl() @@ -1372,6 +1400,15 @@ void tst_QColor::setHsl() QCOMPARE(l2, l); } } + QVERIFY(color.isValid()); + QColor invalidHsl = color; + QColor invalidHslF = color; + QTest::ignoreMessage(QtWarningMsg, "QColor::setHsl: HSL parameters out of range"); + invalidHsl.setHsl(-1, -1, -1, -1); + QTest::ignoreMessage(QtWarningMsg, "QColor::setHslF: HSL parameters out of range"); + invalidHslF.setHslF(-1, -1, -1, -1); + QVERIFY(!invalidHsl.isValid()); + QVERIFY(!invalidHslF.isValid()); } void tst_QColor::toRgb_data() diff --git a/tests/auto/network/access/access.pro b/tests/auto/network/access/access.pro index b140b5e9f2..d2b4d97b21 100644 --- a/tests/auto/network/access/access.pro +++ b/tests/auto/network/access/access.pro @@ -7,7 +7,6 @@ SUBDIRS=\ qnetworkrequest \ qhttpnetworkconnection \ qnetworkreply \ - spdy \ qnetworkcachemetadata \ qftp \ qhttpnetworkreply \ diff --git a/tests/auto/network/access/http2/tst_http2.cpp b/tests/auto/network/access/http2/tst_http2.cpp index 6f94692cb1..904cfd52b0 100644 --- a/tests/auto/network/access/http2/tst_http2.cpp +++ b/tests/auto/network/access/http2/tst_http2.cpp @@ -939,13 +939,6 @@ void tst_Http2::replyFinished() QVERIFY(http2Used.isValid()); QVERIFY(http2Used.toBool()); - const QVariant spdyUsed(reply->attribute(QNetworkRequest::SpdyWasUsedAttribute)); - if (!spdyUsed.isValid() || spdyUsed.toBool()) - stopEventLoop(); - - QVERIFY(spdyUsed.isValid()); - QVERIFY(!spdyUsed.toBool()); - const QVariant code(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute)); if (!code.isValid() || !code.canConvert<int>() || code.value<int>() != 200) stopEventLoop(); diff --git a/tests/auto/network/access/qnetworkreply/BLACKLIST b/tests/auto/network/access/qnetworkreply/BLACKLIST index 2a0651f96f..18450f1853 100644 --- a/tests/auto/network/access/qnetworkreply/BLACKLIST +++ b/tests/auto/network/access/qnetworkreply/BLACKLIST @@ -15,8 +15,6 @@ linux # QTBUG-71953 [getFromHttp] * !android !winrt -[getFromHttp:success-external] -* [getFromHttpIntoBuffer] osx [getFromHttpIntoBuffer2] diff --git a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp index c523b0c20e..a2b3248ab8 100644 --- a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp +++ b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp @@ -1914,10 +1914,6 @@ void tst_QNetworkReply::getFromHttp_data() << testDataDir + "/rfc3252.txt" << "http://" + QtNetworkSettings::httpServerName() + "/qtest/rfc3252.txt"; - QTest::newRow("success-external") - << testDataDir + "/rfc3252.txt" - << "http://www.ietf.org/rfc/rfc3252.txt"; - QTest::newRow("bigfile-internal") << testDataDir + "/bigfile" << "http://" + QtNetworkSettings::httpServerName() + "/qtest/bigfile"; diff --git a/tests/auto/network/access/spdy/BLACKLIST b/tests/auto/network/access/spdy/BLACKLIST deleted file mode 100644 index 5cf79327be..0000000000 --- a/tests/auto/network/access/spdy/BLACKLIST +++ /dev/null @@ -1,7 +0,0 @@ -[download] -opensuse-leap -[upload] -opensuse-leap -ubuntu-18.04 -b2qt - diff --git a/tests/auto/network/access/spdy/spdy.pro b/tests/auto/network/access/spdy/spdy.pro deleted file mode 100644 index cdbe60a19b..0000000000 --- a/tests/auto/network/access/spdy/spdy.pro +++ /dev/null @@ -1,7 +0,0 @@ -CONFIG += testcase -TARGET = tst_spdy -SOURCES += tst_spdy.cpp - -QT = core core-private network network-private testlib - -win32:CONFIG += insignificant_test # QTBUG-47128 diff --git a/tests/auto/network/access/spdy/tst_spdy.cpp b/tests/auto/network/access/spdy/tst_spdy.cpp deleted file mode 100644 index f4a5976558..0000000000 --- a/tests/auto/network/access/spdy/tst_spdy.cpp +++ /dev/null @@ -1,693 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - - -#include <QtTest/QtTest> -#include <QtNetwork/QNetworkAccessManager> -#include <QtNetwork/QNetworkReply> -#include <QtNetwork/QHttpPart> -#include <QtNetwork/QHttpMultiPart> -#include <QtNetwork/QNetworkProxy> -#include <QtNetwork/QAuthenticator> -#if defined(QT_BUILD_INTERNAL) && !defined(QT_NO_OPENSSL) -#include <QtNetwork/private/qsslsocket_openssl_p.h> -#endif // QT_BUILD_INTERNAL && !QT_NO_OPENSSL - -#include "../../../network-settings.h" - -Q_DECLARE_METATYPE(QAuthenticator*) - -class tst_Spdy: public QObject -{ - Q_OBJECT - -public: - tst_Spdy(); - ~tst_Spdy(); - -private Q_SLOTS: - void initTestCase(); - void settingsAndNegotiation_data(); - void settingsAndNegotiation(); -#ifndef QT_NO_NETWORKPROXY - void download_data(); - void download(); -#endif // !QT_NO_NETWORKPROXY - void headerFields(); -#ifndef QT_NO_NETWORKPROXY - void upload_data(); - void upload(); - void errors_data(); - void errors(); -#endif // !QT_NO_NETWORKPROXY - void multipleRequests_data(); - void multipleRequests(); - -private: - QNetworkAccessManager m_manager; - int m_multipleRequestsCount; - int m_multipleRepliesFinishedCount; - const QString m_rfc3252FilePath; - -protected Q_SLOTS: - void proxyAuthenticationRequired(const QNetworkProxy &, QAuthenticator *authenticator); - void multipleRequestsFinishedSlot(); -}; - -tst_Spdy::tst_Spdy() - : m_rfc3252FilePath(QFINDTESTDATA("../qnetworkreply/rfc3252.txt")) -{ -#if defined(QT_BUILD_INTERNAL) && !defined(QT_NO_SSL) && OPENSSL_VERSION_NUMBER >= 0x1000100fL && !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG) - qRegisterMetaType<QNetworkReply *>(); // for QSignalSpy - qRegisterMetaType<QAuthenticator *>(); - - connect(&m_manager, SIGNAL(proxyAuthenticationRequired(const QNetworkProxy &, QAuthenticator *)), - this, SLOT(proxyAuthenticationRequired(const QNetworkProxy &, QAuthenticator *))); -#else - QSKIP("Qt built withouth OpenSSL, or the OpenSSL version is too old"); -#endif // defined(QT_BUILD_INTERNAL) && !defined(QT_NO_SSL) ... -} - -tst_Spdy::~tst_Spdy() -{ -} - -void tst_Spdy::initTestCase() -{ - QVERIFY(!m_rfc3252FilePath.isEmpty()); - QVERIFY(QtNetworkSettings::verifyTestNetworkSettings()); -} - -void tst_Spdy::settingsAndNegotiation_data() -{ - QTest::addColumn<QUrl>("url"); - QTest::addColumn<bool>("setAttribute"); - QTest::addColumn<bool>("enabled"); - QTest::addColumn<QByteArray>("expectedProtocol"); - QTest::addColumn<QByteArray>("expectedContent"); - - QTest::newRow("default-settings") << QUrl("https://" + QtNetworkSettings::serverName() - + "/qtest/cgi-bin/echo.cgi?1") - << false << false << QByteArray() - << QByteArray("1"); - - QTest::newRow("http-url") << QUrl("http://" + QtNetworkSettings::serverName() - + "/qtest/cgi-bin/echo.cgi?1") - << true << true << QByteArray() - << QByteArray("1"); - - QTest::newRow("spdy-disabled") << QUrl("https://" + QtNetworkSettings::serverName() - + "/qtest/cgi-bin/echo.cgi?1") - << true << false << QByteArray() - << QByteArray("1"); - -#ifndef QT_NO_OPENSSL - QTest::newRow("spdy-enabled") << QUrl("https://" + QtNetworkSettings::serverName() - + "/qtest/cgi-bin/echo.cgi?1") - << true << true << QByteArray(QSslConfiguration::NextProtocolSpdy3_0) - << QByteArray("1"); -#endif // QT_NO_OPENSSL -} - -void tst_Spdy::settingsAndNegotiation() -{ - QFETCH(QUrl, url); - QFETCH(bool, setAttribute); - QFETCH(bool, enabled); - - QNetworkRequest request(url); - - if (setAttribute) { - request.setAttribute(QNetworkRequest::SpdyAllowedAttribute, QVariant(enabled)); - } - - QNetworkReply *reply = m_manager.get(request); - reply->ignoreSslErrors(); - QSignalSpy metaDataChangedSpy(reply, SIGNAL(metaDataChanged())); - QSignalSpy readyReadSpy(reply, SIGNAL(readyRead())); - QSignalSpy finishedSpy(reply, SIGNAL(finished())); - - QObject::connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop())); - QSignalSpy finishedManagerSpy(&m_manager, SIGNAL(finished(QNetworkReply*))); - - QTestEventLoop::instance().enterLoop(15); - QVERIFY(!QTestEventLoop::instance().timeout()); - - QFETCH(QByteArray, expectedProtocol); - -#ifndef QT_NO_OPENSSL - bool expectedSpdyUsed = (expectedProtocol == QSslConfiguration::NextProtocolSpdy3_0); - QCOMPARE(reply->attribute(QNetworkRequest::SpdyWasUsedAttribute).toBool(), expectedSpdyUsed); -#endif // QT_NO_OPENSSL - - QCOMPARE(metaDataChangedSpy.count(), 1); - QCOMPARE(finishedSpy.count(), 1); - - int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); - QCOMPARE(statusCode, 200); - - QByteArray content = reply->readAll(); - - QFETCH(QByteArray, expectedContent); - QCOMPARE(expectedContent, content); - -#ifndef QT_NO_OPENSSL - QSslConfiguration::NextProtocolNegotiationStatus expectedStatus = - (expectedProtocol.isEmpty()) - ? QSslConfiguration::NextProtocolNegotiationNone - : QSslConfiguration::NextProtocolNegotiationNegotiated; - QCOMPARE(reply->sslConfiguration().nextProtocolNegotiationStatus(), - expectedStatus); - - QCOMPARE(reply->sslConfiguration().nextNegotiatedProtocol(), expectedProtocol); -#endif // QT_NO_OPENSSL -} - -void tst_Spdy::proxyAuthenticationRequired(const QNetworkProxy &/*proxy*/, - QAuthenticator *authenticator) -{ - authenticator->setUser("qsockstest"); - authenticator->setPassword("password"); -} - -#ifndef QT_NO_NETWORKPROXY -void tst_Spdy::download_data() -{ - QTest::addColumn<QUrl>("url"); - QTest::addColumn<QString>("fileName"); - QTest::addColumn<QNetworkProxy>("proxy"); - - QTest::newRow("mediumfile") << QUrl("https://" + QtNetworkSettings::serverName() - + "/qtest/rfc3252.txt") - << m_rfc3252FilePath - << QNetworkProxy(); - - QHostInfo hostInfo = QHostInfo::fromName(QtNetworkSettings::serverName()); - QString proxyserver = hostInfo.addresses().first().toString(); - - QTest::newRow("mediumfile-http-proxy") << QUrl("https://" + QtNetworkSettings::serverName() - + "/qtest/rfc3252.txt") - << m_rfc3252FilePath - << QNetworkProxy(QNetworkProxy::HttpProxy, proxyserver, 3128); - - QTest::newRow("mediumfile-http-proxy-auth") << QUrl("https://" + QtNetworkSettings::serverName() - + "/qtest/rfc3252.txt") - << m_rfc3252FilePath - << QNetworkProxy(QNetworkProxy::HttpProxy, - proxyserver, 3129); - - QTest::newRow("mediumfile-socks-proxy") << QUrl("https://" + QtNetworkSettings::serverName() - + "/qtest/rfc3252.txt") - << m_rfc3252FilePath - << QNetworkProxy(QNetworkProxy::Socks5Proxy, proxyserver, 1080); - - QTest::newRow("mediumfile-socks-proxy-auth") << QUrl("https://" + QtNetworkSettings::serverName() - + "/qtest/rfc3252.txt") - << m_rfc3252FilePath - << QNetworkProxy(QNetworkProxy::Socks5Proxy, - proxyserver, 1081); - - QTest::newRow("bigfile") << QUrl("https://" + QtNetworkSettings::serverName() - + "/qtest/bigfile") - << QFINDTESTDATA("../qnetworkreply/bigfile") - << QNetworkProxy(); -} - -void tst_Spdy::download() -{ - QFETCH(QUrl, url); - QFETCH(QString, fileName); - QFETCH(QNetworkProxy, proxy); - - QNetworkRequest request(url); - request.setAttribute(QNetworkRequest::SpdyAllowedAttribute, true); - - if (proxy.type() != QNetworkProxy::DefaultProxy) { - m_manager.setProxy(proxy); - } - QNetworkReply *reply = m_manager.get(request); - reply->ignoreSslErrors(); - QSignalSpy metaDataChangedSpy(reply, SIGNAL(metaDataChanged())); - QSignalSpy downloadProgressSpy(reply, SIGNAL(downloadProgress(qint64, qint64))); - QSignalSpy readyReadSpy(reply, SIGNAL(readyRead())); - QSignalSpy finishedSpy(reply, SIGNAL(finished())); - - QObject::connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop())); - QSignalSpy finishedManagerSpy(&m_manager, SIGNAL(finished(QNetworkReply*))); - QSignalSpy proxyAuthRequiredSpy(&m_manager, SIGNAL( - proxyAuthenticationRequired(const QNetworkProxy &, - QAuthenticator *))); - - QTestEventLoop::instance().enterLoop(15); - QVERIFY(!QTestEventLoop::instance().timeout()); - - QCOMPARE(finishedManagerSpy.count(), 1); - QCOMPARE(metaDataChangedSpy.count(), 1); - QCOMPARE(finishedSpy.count(), 1); - QVERIFY(downloadProgressSpy.count() > 0); - QVERIFY(readyReadSpy.count() > 0); - - QVERIFY(proxyAuthRequiredSpy.count() <= 1); - - QCOMPARE(reply->error(), QNetworkReply::NoError); - QCOMPARE(reply->attribute(QNetworkRequest::SpdyWasUsedAttribute).toBool(), true); - QCOMPARE(reply->attribute(QNetworkRequest::ConnectionEncryptedAttribute).toBool(), true); - QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200); - - QFile file(fileName); - QVERIFY(file.open(QIODevice::ReadOnly)); - - qint64 contentLength = reply->header(QNetworkRequest::ContentLengthHeader).toLongLong(); - qint64 expectedContentLength = file.bytesAvailable(); - QCOMPARE(contentLength, expectedContentLength); - - QByteArray expectedContent = file.readAll(); - QByteArray content = reply->readAll(); - QCOMPARE(content, expectedContent); - - reply->deleteLater(); - m_manager.setProxy(QNetworkProxy()); // reset -} -#endif // !QT_NO_NETWORKPROXY - -void tst_Spdy::headerFields() -{ - QUrl url(QUrl("https://" + QtNetworkSettings::serverName())); - QNetworkRequest request(url); - request.setAttribute(QNetworkRequest::SpdyAllowedAttribute, true); - - QNetworkReply *reply = m_manager.get(request); - reply->ignoreSslErrors(); - - QObject::connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop())); - - QTestEventLoop::instance().enterLoop(15); - QVERIFY(!QTestEventLoop::instance().timeout()); - - QCOMPARE(reply->rawHeader("Content-Type"), QByteArray("text/html")); - QVERIFY(reply->rawHeader("Content-Length").toInt() > 0); - QVERIFY(reply->rawHeader("server").contains("Apache")); - - QCOMPARE(reply->header(QNetworkRequest::ContentTypeHeader).toByteArray(), QByteArray("text/html")); - QVERIFY(reply->header(QNetworkRequest::ContentLengthHeader).toLongLong() > 0); - QVERIFY(reply->header(QNetworkRequest::LastModifiedHeader).toDateTime().isValid()); - QVERIFY(reply->header(QNetworkRequest::ServerHeader).toByteArray().contains("Apache")); -} - -static inline QByteArray md5sum(const QByteArray &data) -{ - return QCryptographicHash::hash(data, QCryptographicHash::Md5).toHex().append('\n'); -} - -#ifndef QT_NO_NETWORKPROXY -void tst_Spdy::upload_data() -{ - QTest::addColumn<QUrl>("url"); - QTest::addColumn<QByteArray>("data"); - QTest::addColumn<QByteArray>("uploadMethod"); - QTest::addColumn<QObject *>("uploadObject"); - QTest::addColumn<QByteArray>("md5sum"); - QTest::addColumn<QNetworkProxy>("proxy"); - - - // 1. test uploading of byte arrays - - QUrl md5Url("https://" + QtNetworkSettings::serverName() + "/qtest/cgi-bin/md5sum.cgi"); - - QByteArray data; - data = ""; - QObject *dummyObject = 0; - QTest::newRow("empty") << md5Url << data << QByteArray("POST") << dummyObject - << md5sum(data) << QNetworkProxy(); - - data = "This is a normal message."; - QTest::newRow("generic") << md5Url << data << QByteArray("POST") << dummyObject - << md5sum(data) << QNetworkProxy(); - - data = "This is a message to show that Qt rocks!\r\n\n"; - QTest::newRow("small") << md5Url << data << QByteArray("POST") << dummyObject - << md5sum(data) << QNetworkProxy(); - - data = QByteArray("abcd\0\1\2\abcd",12); - QTest::newRow("with-nul") << md5Url << data << QByteArray("POST") << dummyObject - << md5sum(data) << QNetworkProxy(); - - data = QByteArray(4097, '\4'); - QTest::newRow("4k+1") << md5Url << data << QByteArray("POST") << dummyObject - << md5sum(data)<< QNetworkProxy(); - - QHostInfo hostInfo = QHostInfo::fromName(QtNetworkSettings::serverName()); - QString proxyserver = hostInfo.addresses().first().toString(); - - QTest::newRow("4k+1-with-http-proxy") << md5Url << data << QByteArray("POST") << dummyObject - << md5sum(data) - << QNetworkProxy(QNetworkProxy::HttpProxy, proxyserver, 3128); - - QTest::newRow("4k+1-with-http-proxy-auth") << md5Url << data << QByteArray("POST") << dummyObject - << md5sum(data) - << QNetworkProxy(QNetworkProxy::HttpProxy, - proxyserver, 3129); - - QTest::newRow("4k+1-with-socks-proxy") << md5Url << data << QByteArray("POST") << dummyObject - << md5sum(data) - << QNetworkProxy(QNetworkProxy::Socks5Proxy, proxyserver, 1080); - - QTest::newRow("4k+1-with-socks-proxy-auth") << md5Url << data << QByteArray("POST") << dummyObject - << md5sum(data) - << QNetworkProxy(QNetworkProxy::Socks5Proxy, - proxyserver, 1081); - - data = QByteArray(128*1024+1, '\177'); - QTest::newRow("128k+1") << md5Url << data << QByteArray("POST") << dummyObject - << md5sum(data) << QNetworkProxy(); - - data = QByteArray(128*1024+1, '\177'); - QTest::newRow("128k+1-put") << md5Url << data << QByteArray("PUT") << dummyObject - << md5sum(data) << QNetworkProxy(); - - data = QByteArray(2*1024*1024+1, '\177'); - QTest::newRow("2MB+1") << md5Url << data << QByteArray("POST") << dummyObject - << md5sum(data) << QNetworkProxy(); - - - // 2. test uploading of files - - QFile *file = new QFile(m_rfc3252FilePath); - file->open(QIODevice::ReadOnly); - QTest::newRow("file-26K") << md5Url << QByteArray() << QByteArray("POST") - << static_cast<QObject *>(file) - << QByteArray("b3e32ac459b99d3f59318f3ac31e4bee\n") << QNetworkProxy(); - - QFile *file2 = new QFile(QFINDTESTDATA("../qnetworkreply/image1.jpg")); - file2->open(QIODevice::ReadOnly); - QTest::newRow("file-1MB") << md5Url << QByteArray() << QByteArray("POST") - << static_cast<QObject *>(file2) - << QByteArray("87ef3bb319b004ba9e5e9c9fa713776e\n") << QNetworkProxy(); - - - // 3. test uploading of multipart - - QUrl multiPartUrl("https://" + QtNetworkSettings::serverName() + "/qtest/cgi-bin/multipart.cgi"); - - QHttpPart imagePart31; - imagePart31.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg")); - imagePart31.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"testImage1\"")); - imagePart31.setRawHeader("Content-Location", "http://my.test.location.tld"); - imagePart31.setRawHeader("Content-ID", "my@id.tld"); - QFile *file31 = new QFile(QFINDTESTDATA("../qnetworkreply/image1.jpg")); - file31->open(QIODevice::ReadOnly); - imagePart31.setBodyDevice(file31); - QHttpMultiPart *imageMultiPart3 = new QHttpMultiPart(QHttpMultiPart::FormDataType); - imageMultiPart3->append(imagePart31); - file31->setParent(imageMultiPart3); - QHttpPart imagePart32; - imagePart32.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg")); - imagePart32.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"testImage2\"")); - QFile *file32 = new QFile(QFINDTESTDATA("../qnetworkreply/image2.jpg")); - file32->open(QIODevice::ReadOnly); - imagePart32.setBodyDevice(file31); // check that resetting works - imagePart32.setBodyDevice(file32); - imageMultiPart3->append(imagePart32); - file32->setParent(imageMultiPart3); - QHttpPart imagePart33; - imagePart33.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg")); - imagePart33.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"testImage3\"")); - QFile *file33 = new QFile(QFINDTESTDATA("../qnetworkreply/image3.jpg")); - file33->open(QIODevice::ReadOnly); - imagePart33.setBodyDevice(file33); - imageMultiPart3->append(imagePart33); - file33->setParent(imageMultiPart3); - QByteArray expectedData = "content type: multipart/form-data; boundary=\"" - + imageMultiPart3->boundary(); - expectedData.append("\"\nkey: testImage1, value: 87ef3bb319b004ba9e5e9c9fa713776e\n" - "key: testImage2, value: 483761b893f7fb1bd2414344cd1f3dfb\n" - "key: testImage3, value: ab0eb6fd4fcf8b4436254870b4513033\n"); - - QTest::newRow("multipart-3images") << multiPartUrl << QByteArray() << QByteArray("POST") - << static_cast<QObject *>(imageMultiPart3) << expectedData - << QNetworkProxy(); -} - -void tst_Spdy::upload() -{ - QFETCH(QUrl, url); - QNetworkRequest request(url); - request.setAttribute(QNetworkRequest::SpdyAllowedAttribute, true); - - QFETCH(QByteArray, data); - QFETCH(QByteArray, uploadMethod); - QFETCH(QObject *, uploadObject); - QFETCH(QNetworkProxy, proxy); - - if (proxy.type() != QNetworkProxy::DefaultProxy) { - m_manager.setProxy(proxy); - } - - QNetworkReply *reply; - QHttpMultiPart *multiPart = 0; - - if (uploadObject) { - // upload via device - if (QIODevice *device = qobject_cast<QIODevice *>(uploadObject)) { - reply = m_manager.post(request, device); - } else if ((multiPart = qobject_cast<QHttpMultiPart *>(uploadObject))) { - reply = m_manager.post(request, multiPart); - } else { - QFAIL("got unknown upload device"); - } - } else { - // upload via byte array - if (uploadMethod == "PUT") { - reply = m_manager.put(request, data); - } else { - reply = m_manager.post(request, data); - } - } - - reply->ignoreSslErrors(); - QSignalSpy metaDataChangedSpy(reply, SIGNAL(metaDataChanged())); - QSignalSpy uploadProgressSpy(reply, SIGNAL(uploadProgress(qint64, qint64))); - QSignalSpy readyReadSpy(reply, SIGNAL(readyRead())); - QSignalSpy finishedSpy(reply, SIGNAL(finished())); - - QObject::connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop())); - QSignalSpy finishedManagerSpy(&m_manager, SIGNAL(finished(QNetworkReply*))); - - QTestEventLoop::instance().enterLoop(20); - QVERIFY(!QTestEventLoop::instance().timeout()); - - QCOMPARE(finishedManagerSpy.count(), 1); - QCOMPARE(metaDataChangedSpy.count(), 1); - QCOMPARE(finishedSpy.count(), 1); - QVERIFY(uploadProgressSpy.count() > 0); - QVERIFY(readyReadSpy.count() > 0); - - QCOMPARE(reply->error(), QNetworkReply::NoError); - QCOMPARE(reply->attribute(QNetworkRequest::SpdyWasUsedAttribute).toBool(), true); - QCOMPARE(reply->attribute(QNetworkRequest::ConnectionEncryptedAttribute).toBool(), true); - QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200); - - qint64 contentLength = reply->header(QNetworkRequest::ContentLengthHeader).toLongLong(); - if (!multiPart) // script to test multiparts does not return a content length - QCOMPARE(contentLength, 33); // 33 bytes for md5 sums (including new line) - - QFETCH(QByteArray, md5sum); - QByteArray content = reply->readAll(); - QCOMPARE(content, md5sum); - - reply->deleteLater(); - if (uploadObject) - uploadObject->deleteLater(); - - m_manager.setProxy(QNetworkProxy()); // reset -} - -void tst_Spdy::errors_data() -{ - QTest::addColumn<QUrl>("url"); - QTest::addColumn<QNetworkProxy>("proxy"); - QTest::addColumn<bool>("ignoreSslErrors"); - QTest::addColumn<int>("expectedReplyError"); - - QTest::newRow("http-404") << QUrl("https://" + QtNetworkSettings::serverName() + "/non-existent-url") - << QNetworkProxy() << true << int(QNetworkReply::ContentNotFoundError); - - QTest::newRow("ssl-errors") << QUrl("https://" + QtNetworkSettings::serverName()) - << QNetworkProxy() << false << int(QNetworkReply::SslHandshakeFailedError); - - QTest::newRow("host-not-found") << QUrl("https://this-host-does-not.exist") - << QNetworkProxy() - << true << int(QNetworkReply::HostNotFoundError); - - QTest::newRow("proxy-not-found") << QUrl("https://" + QtNetworkSettings::serverName()) - << QNetworkProxy(QNetworkProxy::HttpProxy, - "https://this-host-does-not.exist", 3128) - << true << int(QNetworkReply::HostNotFoundError); - - QHostInfo hostInfo = QHostInfo::fromName(QtNetworkSettings::serverName()); - QString proxyserver = hostInfo.addresses().first().toString(); - - QTest::newRow("proxy-unavailable") << QUrl("https://" + QtNetworkSettings::serverName()) - << QNetworkProxy(QNetworkProxy::HttpProxy, proxyserver, 10) - << true << int(QNetworkReply::UnknownNetworkError); - - QTest::newRow("no-proxy-credentials") << QUrl("https://" + QtNetworkSettings::serverName()) - << QNetworkProxy(QNetworkProxy::HttpProxy, proxyserver, 3129) - << true << int(QNetworkReply::ProxyAuthenticationRequiredError); -} - -void tst_Spdy::errors() -{ - QFETCH(QUrl, url); - QFETCH(QNetworkProxy, proxy); - QFETCH(bool, ignoreSslErrors); - QFETCH(int, expectedReplyError); - - QNetworkRequest request(url); - request.setAttribute(QNetworkRequest::SpdyAllowedAttribute, true); - - disconnect(&m_manager, SIGNAL(proxyAuthenticationRequired(const QNetworkProxy &, QAuthenticator *)), - 0, 0); - if (proxy.type() != QNetworkProxy::DefaultProxy) { - m_manager.setProxy(proxy); - } - QNetworkReply *reply = m_manager.get(request); - if (ignoreSslErrors) - reply->ignoreSslErrors(); - QSignalSpy finishedSpy(reply, SIGNAL(finished())); - QSignalSpy errorSpy(reply, SIGNAL(error(QNetworkReply::NetworkError))); - - QObject::connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop())); - - QTestEventLoop::instance().enterLoop(15); - QVERIFY(!QTestEventLoop::instance().timeout()); - - QCOMPARE(finishedSpy.count(), 1); - QCOMPARE(errorSpy.count(), 1); - - QCOMPARE(reply->error(), static_cast<QNetworkReply::NetworkError>(expectedReplyError)); - - m_manager.setProxy(QNetworkProxy()); // reset - m_manager.clearAccessCache(); // e.g. to get an SSL error we need a new connection - connect(&m_manager, SIGNAL(proxyAuthenticationRequired(const QNetworkProxy &, QAuthenticator *)), - this, SLOT(proxyAuthenticationRequired(const QNetworkProxy &, QAuthenticator *)), - Qt::UniqueConnection); // reset -} -#endif // !QT_NO_NETWORKPROXY - -void tst_Spdy::multipleRequests_data() -{ - QTest::addColumn<QList<QUrl> >("urls"); - - QString baseUrl = "https://" + QtNetworkSettings::serverName() + "/qtest/cgi-bin/echo.cgi?"; - QList<QUrl> urls; - for (int a = 1; a <= 50; ++a) - urls.append(QUrl(baseUrl + QLatin1String(QByteArray::number(a)))); - - QTest::newRow("one-request") << urls.mid(0, 1); - QTest::newRow("two-requests") << urls.mid(0, 2); - QTest::newRow("ten-requests") << urls.mid(0, 10); - QTest::newRow("twenty-requests") << urls.mid(0, 20); - QTest::newRow("fifty-requests") << urls; -} - -void tst_Spdy::multipleRequestsFinishedSlot() -{ - m_multipleRepliesFinishedCount++; - if (m_multipleRepliesFinishedCount == m_multipleRequestsCount) - QTestEventLoop::instance().exitLoop(); -} - -void tst_Spdy::multipleRequests() -{ - QFETCH(QList<QUrl>, urls); - m_multipleRequestsCount = urls.count(); - m_multipleRepliesFinishedCount = 0; - - QList<QNetworkReply *> replies; - QList<QSignalSpy *> metaDataChangedSpies; - QList<QSignalSpy *> readyReadSpies; - QList<QSignalSpy *> finishedSpies; - - foreach (const QUrl &url, urls) { - QNetworkRequest request(url); - request.setAttribute(QNetworkRequest::SpdyAllowedAttribute, true); - QNetworkReply *reply = m_manager.get(request); - replies.append(reply); - reply->ignoreSslErrors(); - QObject::connect(reply, SIGNAL(finished()), this, SLOT(multipleRequestsFinishedSlot())); - QSignalSpy *metaDataChangedSpy = new QSignalSpy(reply, SIGNAL(metaDataChanged())); - metaDataChangedSpies << metaDataChangedSpy; - QSignalSpy *readyReadSpy = new QSignalSpy(reply, SIGNAL(readyRead())); - readyReadSpies << readyReadSpy; - QSignalSpy *finishedSpy = new QSignalSpy(reply, SIGNAL(finished())); - finishedSpies << finishedSpy; - } - - QSignalSpy finishedManagerSpy(&m_manager, SIGNAL(finished(QNetworkReply*))); - - QTestEventLoop::instance().enterLoop(15); - QVERIFY(!QTestEventLoop::instance().timeout()); - - QCOMPARE(finishedManagerSpy.count(), m_multipleRequestsCount); - - for (int a = 0; a < replies.count(); ++a) { - -#ifndef QT_NO_OPENSSL - QCOMPARE(replies.at(a)->sslConfiguration().nextProtocolNegotiationStatus(), - QSslConfiguration::NextProtocolNegotiationNegotiated); - QCOMPARE(replies.at(a)->sslConfiguration().nextNegotiatedProtocol(), - QByteArray(QSslConfiguration::NextProtocolSpdy3_0)); -#endif // QT_NO_OPENSSL - - QCOMPARE(replies.at(a)->error(), QNetworkReply::NoError); - QCOMPARE(replies.at(a)->attribute(QNetworkRequest::SpdyWasUsedAttribute).toBool(), true); - QCOMPARE(replies.at(a)->attribute(QNetworkRequest::ConnectionEncryptedAttribute).toBool(), true); - QCOMPARE(replies.at(a)->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200); - - // using the echo script, a request to "echo.cgi?1" will return a body of "1" - QByteArray expectedContent = replies.at(a)->url().query().toUtf8(); - QByteArray content = replies.at(a)->readAll(); - QCOMPARE(expectedContent, content); - - QCOMPARE(metaDataChangedSpies.at(a)->count(), 1); - metaDataChangedSpies.at(a)->deleteLater(); - - QCOMPARE(finishedSpies.at(a)->count(), 1); - finishedSpies.at(a)->deleteLater(); - - QVERIFY(readyReadSpies.at(a)->count() > 0); - readyReadSpies.at(a)->deleteLater(); - - replies.at(a)->deleteLater(); - } -} - -QTEST_MAIN(tst_Spdy) - -#include "tst_spdy.moc" diff --git a/tests/auto/network/ssl/qdtls/tst_qdtls.cpp b/tests/auto/network/ssl/qdtls/tst_qdtls.cpp index 5d79b0f26b..3bbde484ce 100644 --- a/tests/auto/network/ssl/qdtls/tst_qdtls.cpp +++ b/tests/auto/network/ssl/qdtls/tst_qdtls.cpp @@ -162,7 +162,6 @@ Q_DECLARE_METATYPE(QSslSocket::SslMode) Q_DECLARE_METATYPE(QSslSocket::PeerVerifyMode) Q_DECLARE_METATYPE(QList<QSslCertificate>) Q_DECLARE_METATYPE(QSslKey) -Q_DECLARE_METATYPE(QVector<QSslError>) QT_BEGIN_NAMESPACE diff --git a/tests/auto/network/ssl/qocsp/tst_qocsp.cpp b/tests/auto/network/ssl/qocsp/tst_qocsp.cpp index 9716c04bbb..4eeea76205 100644 --- a/tests/auto/network/ssl/qocsp/tst_qocsp.cpp +++ b/tests/auto/network/ssl/qocsp/tst_qocsp.cpp @@ -60,7 +60,6 @@ using VectorOfErrors = QT_PREPEND_NAMESPACE(QVector<SslError>); using Latin1String = QT_PREPEND_NAMESPACE(QLatin1String); Q_DECLARE_METATYPE(SslError) -Q_DECLARE_METATYPE(VectorOfErrors) Q_DECLARE_METATYPE(Latin1String) QT_BEGIN_NAMESPACE diff --git a/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp b/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp index 5a643c11a2..274fb7b042 100644 --- a/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp +++ b/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp @@ -73,7 +73,7 @@ typedef QSharedPointer<QSslSocket> QSslSocketPtr; #else #define FLUKE_CERTIFICATE_ERROR QSslError::CertificateUntrusted #endif -#endif // QT_NO_SSL +#endif // QT_NO_OPENSSL // Detect ALPN (Application-Layer Protocol Negotiation) support #undef ALPN_SUPPORTED // Undef the variable first to be safe @@ -259,10 +259,14 @@ private slots: void signatureAlgorithm(); #endif - void disabledProtocols_data(); - void disabledProtocols(); + void unsupportedProtocols_data(); + void unsupportedProtocols(); void oldErrorsOnSocketReuse(); +#if QT_CONFIG(openssl) + void alertMissingCertificate(); + void alertInvalidCertificate(); +#endif // openssl void setEmptyDefaultConfiguration(); // this test should be last @@ -337,6 +341,8 @@ tst_QSslSocket::tst_QSslSocket() qRegisterMetaType<QSslError>("QSslError"); qRegisterMetaType<QAbstractSocket::SocketState>("QAbstractSocket::SocketState"); qRegisterMetaType<QAbstractSocket::SocketError>("QAbstractSocket::SocketError"); + qRegisterMetaType<QAlertLevel>("QAlertLevel"); + qRegisterMetaType<QAlertType>("QAlertType"); #ifndef QT_NO_OPENSSL qRegisterMetaType<QSslPreSharedKeyAuthenticator *>(); @@ -1179,25 +1185,6 @@ void tst_QSslSocket::protocol() QCOMPARE(socket->protocol(), QSsl::AnyProtocol); socket->abort(); } - { - // qt-test-server allows TlsV1, so it allows TlsV1SslV3 - socket->setProtocol(QSsl::TlsV1SslV3); - QCOMPARE(socket->protocol(), QSsl::TlsV1SslV3); - socket->connectToHostEncrypted(QtNetworkSettings::httpServerName(), 443); - if (setProxy && !socket->waitForEncrypted()) - QSKIP("Skipping flaky test - See QTBUG-29941"); - QCOMPARE(socket->protocol(), QSsl::TlsV1SslV3); - socket->abort(); - QCOMPARE(socket->protocol(), QSsl::TlsV1SslV3); - socket->connectToHost(QtNetworkSettings::httpServerName(), 443); - if (setProxy && !socket->waitForConnected()) - QSKIP("Skipping flaky test - See QTBUG-29941"); - socket->startClientEncryption(); - if (setProxy && !socket->waitForEncrypted()) - QSKIP("Skipping flaky test - See QTBUG-29941"); - QCOMPARE(socket->protocol(), QSsl::TlsV1SslV3); - socket->abort(); - } } class SslServer : public QTcpServer @@ -1229,6 +1216,8 @@ public: signals: void socketError(QAbstractSocket::SocketError); + void gotAlert(QAlertLevel level, QAlertType type, const QString &message); + void alertSent(QAlertLevel level, QAlertType type, const QString &message); protected: void incomingConnection(qintptr socketDescriptor) @@ -1240,6 +1229,8 @@ protected: if (ignoreSslErrors) connect(socket, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(ignoreErrorSlot())); connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SIGNAL(socketError(QAbstractSocket::SocketError))); + connect(socket, &QSslSocket::alertReceived, this, &SslServer::gotAlert); + connect(socket, &QSslSocket::alertSent, this, &SslServer::alertSent); QFile file(m_keyFile); QVERIFY(file.open(QIODevice::ReadOnly)); @@ -1303,20 +1294,13 @@ void tst_QSslSocket::protocolServerSide_data() QTest::addColumn<bool>("works"); QTest::newRow("tls1.0-tls1.0") << QSsl::TlsV1_0 << QSsl::TlsV1_0 << true; - QTest::newRow("tls1ssl3-tls1ssl3") << QSsl::TlsV1SslV3 << QSsl::TlsV1SslV3 << true; QTest::newRow("any-any") << QSsl::AnyProtocol << QSsl::AnyProtocol << true; QTest::newRow("secure-secure") << QSsl::SecureProtocols << QSsl::SecureProtocols << true; - QTest::newRow("tls1-tls1ssl3") << QSsl::TlsV1_0 << QSsl::TlsV1SslV3 << true; QTest::newRow("tls1.0-secure") << QSsl::TlsV1_0 << QSsl::SecureProtocols << true; QTest::newRow("tls1.0-any") << QSsl::TlsV1_0 << QSsl::AnyProtocol << true; - QTest::newRow("tls1ssl3-tls1.0") << QSsl::TlsV1SslV3 << QSsl::TlsV1_0 << true; - QTest::newRow("tls1ssl3-secure") << QSsl::TlsV1SslV3 << QSsl::SecureProtocols << true; - QTest::newRow("tls1ssl3-any") << QSsl::TlsV1SslV3 << QSsl::AnyProtocol << true; - QTest::newRow("secure-tls1.0") << QSsl::SecureProtocols << QSsl::TlsV1_0 << true; - QTest::newRow("secure-tls1ssl3") << QSsl::SecureProtocols << QSsl::TlsV1SslV3 << true; QTest::newRow("secure-any") << QSsl::SecureProtocols << QSsl::AnyProtocol << true; QTest::newRow("tls1.0orlater-tls1.0") << QSsl::TlsV1_0OrLater << QSsl::TlsV1_0 << true; @@ -1348,7 +1332,6 @@ void tst_QSslSocket::protocolServerSide_data() #endif // TLS1_3_VERSION QTest::newRow("any-tls1.0") << QSsl::AnyProtocol << QSsl::TlsV1_0 << true; - QTest::newRow("any-tls1ssl3") << QSsl::AnyProtocol << QSsl::TlsV1SslV3 << true; QTest::newRow("any-secure") << QSsl::AnyProtocol << QSsl::SecureProtocols << true; } @@ -4325,27 +4308,30 @@ void tst_QSslSocket::forwardReadChannelFinished() #endif // QT_NO_OPENSSL -void tst_QSslSocket::disabledProtocols_data() +void tst_QSslSocket::unsupportedProtocols_data() { - QTest::addColumn<QSsl::SslProtocol>("disabledProtocol"); - QTest::newRow("SslV2") << QSsl::SslV2; - QTest::newRow("SslV3") << QSsl::SslV3; + QTest::addColumn<QSsl::SslProtocol>("unsupportedProtocol"); + QTest::newRow("DtlsV1_0") << QSsl::DtlsV1_0; + QTest::newRow("DtlsV1_2") << QSsl::DtlsV1_2; + QTest::newRow("DtlsV1_0OrLater") << QSsl::DtlsV1_0OrLater; + QTest::newRow("DtlsV1_2OrLater") << QSsl::DtlsV1_2OrLater; + QTest::newRow("UnknownProtocol") << QSsl::UnknownProtocol; } -void tst_QSslSocket::disabledProtocols() +void tst_QSslSocket::unsupportedProtocols() { QFETCH_GLOBAL(const bool, setProxy); if (setProxy) return; - QFETCH(const QSsl::SslProtocol, disabledProtocol); + QFETCH(const QSsl::SslProtocol, unsupportedProtocol); const int timeoutMS = 500; // Test a client socket. { // 0. connectToHostEncrypted: client-side, non-blocking API, error is discovered // early, preventing any real connection from ever starting. QSslSocket socket; - socket.setProtocol(disabledProtocol); + socket.setProtocol(unsupportedProtocol); QCOMPARE(socket.error(), QAbstractSocket::UnknownSocketError); socket.connectToHostEncrypted(QStringLiteral("doesnotmatter.org"), 1010); QCOMPARE(socket.error(), QAbstractSocket::SslInvalidUserDataError); @@ -4363,7 +4349,7 @@ void tst_QSslSocket::disabledProtocols() socket.connectToHost(QHostAddress::LocalHost, server.serverPort()); QVERIFY(socket.waitForConnected(timeoutMS)); - socket.setProtocol(disabledProtocol); + socket.setProtocol(unsupportedProtocol); socket.startClientEncryption(); QCOMPARE(socket.error(), QAbstractSocket::SslInvalidUserDataError); } @@ -4377,7 +4363,7 @@ void tst_QSslSocket::disabledProtocols() // and then calls startServerEncryption() (which must fall). { SslServer server; - server.protocol = disabledProtocol; + server.protocol = unsupportedProtocol; QVERIFY(server.listen()); QTestEventLoop loop; @@ -4442,6 +4428,119 @@ void tst_QSslSocket::oldErrorsOnSocketReuse() #endif // QT_NO_SSL +#if QT_CONFIG(openssl) + +void (QSslSocket::*const tlsErrorSignal)(const QList<QSslError> &) = &QSslSocket::sslErrors; +void (QAbstractSocket::*const socketErrorSignal)(QAbstractSocket::SocketError) = &QAbstractSocket::error; + +void tst_QSslSocket::alertMissingCertificate() +{ + // In this test we want a server to abort the connection due to the failing + // client authentication. The server expected to send an alert before closing + // the connection, and the client expected to receive this alert and report it. + + QFETCH_GLOBAL(const bool, setProxy); + if (setProxy) // Not what we test here, bail out. + return; + + SslServer server; + if (!server.listen(QHostAddress::LocalHost)) + QSKIP("SslServer::listen() returned false"); + + // We want a certificate request to be sent to the client: + server.peerVerifyMode = QSslSocket::VerifyPeer; + // The only way we can force OpenSSL to send an alert - is to use + // a special option (so we fail before handshake is finished): + server.config.setMissingCertificateIsFatal(true); + + QSslSocket clientSocket; + connect(&clientSocket, tlsErrorSignal, [&clientSocket](const QList<QSslError> &errors){ + qDebug() << "ERR"; + clientSocket.ignoreSslErrors(errors); + }); + + QSignalSpy serverSpy(&server, &SslServer::alertSent); + QSignalSpy clientSpy(&clientSocket, &QSslSocket::alertReceived); + + clientSocket.connectToHostEncrypted(server.serverAddress().toString(), server.serverPort()); + + QTestEventLoop runner; + QTimer::singleShot(500, [&runner](){ + runner.exitLoop(); + }); + + int waitFor = 2; + auto earlyQuitter = [&runner, &waitFor](QAbstractSocket::SocketError) { + if (!--waitFor) + runner.exitLoop(); + }; + + // Presumably, RemoteHostClosedError for the client and SslHandshakeError + // for the server: + connect(&clientSocket, socketErrorSignal, earlyQuitter); + connect(&server, &SslServer::socketError, earlyQuitter); + + runner.enterLoopMSecs(1000); + + QVERIFY(serverSpy.count() > 0); + QVERIFY(clientSpy.count() > 0); + QVERIFY(server.socket && !server.socket->isEncrypted()); + QVERIFY(!clientSocket.isEncrypted()); +} + +void tst_QSslSocket::alertInvalidCertificate() +{ + // In this test a client will not ignore verification errors, + // it also will do 'early' checks, meaning the reported and + // not ignored _during_ the hanshake, not after. This ensures + // OpenSSL sends an alert. + QFETCH_GLOBAL(const bool, setProxy); + if (setProxy) // Not what we test here, bail out. + return; + + SslServer server; + if (!server.listen(QHostAddress::LocalHost)) + QSKIP("SslServer::listen() returned false"); + + QSslSocket clientSocket; + auto configuration = QSslConfiguration::defaultConfiguration(); + configuration.setHandshakeMustInterruptOnError(true); + QVERIFY(configuration.handshakeMustInterruptOnError()); + clientSocket.setSslConfiguration(configuration); + + QSignalSpy serverSpy(&server, &SslServer::gotAlert); + QSignalSpy clientSpy(&clientSocket, &QSslSocket::alertSent); + QSignalSpy interruptedSpy(&clientSocket, &QSslSocket::handshakeInterruptedOnError); + + clientSocket.connectToHostEncrypted(server.serverAddress().toString(), server.serverPort()); + + QTestEventLoop runner; + QTimer::singleShot(500, [&runner](){ + runner.exitLoop(); + }); + + int waitFor = 2; + auto earlyQuitter = [&runner, &waitFor](QAbstractSocket::SocketError) { + if (!--waitFor) + runner.exitLoop(); + }; + + // Presumably, RemoteHostClosedError for the server and SslHandshakeError + // for the client: + connect(&clientSocket, socketErrorSignal, earlyQuitter); + connect(&server, &SslServer::socketError, earlyQuitter); + + runner.enterLoopMSecs(1000); + + QVERIFY(serverSpy.count() > 0); + QVERIFY(clientSpy.count() > 0); + QVERIFY(interruptedSpy.count() > 0); + QVERIFY(server.socket && !server.socket->isEncrypted()); + QVERIFY(!clientSocket.isEncrypted()); +} + +#endif // openssl + QTEST_MAIN(tst_QSslSocket) #include "tst_qsslsocket.moc" diff --git a/tests/auto/opengl/opengl.pro b/tests/auto/opengl/opengl.pro index 963cda170d..a220deae24 100644 --- a/tests/auto/opengl/opengl.pro +++ b/tests/auto/opengl/opengl.pro @@ -1,6 +1,2 @@ -TEMPLATE=subdirs -SUBDIRS=\ - qgl \ - qglbuffer \ - qglfunctions \ - qglthreads \ +TEMPLATE = subdirs +#SUBDIRS = diff --git a/tests/auto/opengl/qgl/.gitignore b/tests/auto/opengl/qgl/.gitignore deleted file mode 100644 index bb6e921035..0000000000 --- a/tests/auto/opengl/qgl/.gitignore +++ /dev/null @@ -1 +0,0 @@ -tst_qgl diff --git a/tests/auto/opengl/qgl/BLACKLIST b/tests/auto/opengl/qgl/BLACKLIST deleted file mode 100644 index ec75ea16eb..0000000000 --- a/tests/auto/opengl/qgl/BLACKLIST +++ /dev/null @@ -1,8 +0,0 @@ -[graphicsViewClipping] -ubuntu-16.04 -rhel-7.6 -opensuse-leap -ubuntu-18.04 -rhel-7.4 -opensuse-42.3 - diff --git a/tests/auto/opengl/qgl/qgl.pro b/tests/auto/opengl/qgl/qgl.pro deleted file mode 100644 index af930c5be7..0000000000 --- a/tests/auto/opengl/qgl/qgl.pro +++ /dev/null @@ -1,11 +0,0 @@ -############################################################ -# Project file for autotest for file qgl.h -############################################################ - -CONFIG += testcase -TARGET = tst_qgl -requires(qtHaveModule(opengl)) -QT += widgets widgets-private opengl-private gui-private core-private testlib - -SOURCES += tst_qgl.cpp -RESOURCES = qgl.qrc diff --git a/tests/auto/opengl/qgl/qgl.qrc b/tests/auto/opengl/qgl/qgl.qrc deleted file mode 100644 index 70f425c1b9..0000000000 --- a/tests/auto/opengl/qgl/qgl.qrc +++ /dev/null @@ -1,5 +0,0 @@ -<!DOCTYPE RCC><RCC version="1.0"> -<qresource> - <file alias="designer.png">../../gui/image/qpixmap/images/designer.png</file> -</qresource> -</RCC> diff --git a/tests/auto/opengl/qgl/tst_qgl.cpp b/tests/auto/opengl/qgl/tst_qgl.cpp deleted file mode 100644 index 3cc9592fb1..0000000000 --- a/tests/auto/opengl/qgl/tst_qgl.cpp +++ /dev/null @@ -1,2524 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - - -#include <QtTest/QtTest> - -#include <qcoreapplication.h> -#include <qdebug.h> -#include <qgl.h> -#include <qglpixelbuffer.h> -#include <qglframebufferobject.h> -#include <qglcolormap.h> -#include <qpaintengine.h> -#include <qopenglfunctions.h> -#include <qopenglframebufferobject.h> -#include <qopenglpaintdevice.h> - -#include <QGraphicsView> -#include <QGraphicsProxyWidget> -#include <QVBoxLayout> - -#ifdef QT_BUILD_INTERNAL -#include <qpa/qplatformpixmap.h> -#include <QtOpenGL/private/qgl_p.h> -#include <QtGui/private/qimage_p.h> -#include <QtGui/private/qimagepixmapcleanuphooks_p.h> -#include <QtGui/private/qopenglextensions_p.h> -#endif - -class tst_QGL : public QObject -{ -Q_OBJECT - -public: - tst_QGL(); - virtual ~tst_QGL(); - - static void initMain(); - -private slots: - void initTestCase(); - void getSetCheck(); -#ifdef QT_BUILD_INTERNAL - void qglContextDefaultBindTexture(); - void openGLVersionCheck(); - void shareRegister(); - void textureCleanup(); -#endif - void partialGLWidgetUpdates_data(); - void partialGLWidgetUpdates(); - void glWidgetWithAlpha(); - void glWidgetRendering(); - void glFBOSimpleRendering(); - void glFBORendering(); - void currentFboSync(); - void multipleFBOInterleavedRendering(); - void glFBOUseInGLWidget(); - void glPBufferRendering(); - void glWidgetReparent(); - void glWidgetRenderPixmap(); - void colormap(); - void fboFormat(); - void testDontCrashOnDanglingResources(); - void replaceClipping(); - void clipTest(); - void destroyFBOAfterContext(); - void threadImages(); - void nullRectCrash(); - void graphicsViewClipping(); - void extensions(); -}; - -tst_QGL::tst_QGL() -{ -} - -tst_QGL::~tst_QGL() -{ -} - -void tst_QGL::initMain() -{ - QCoreApplication::setAttribute(Qt::AA_DisableHighDpiScaling); -} - -void tst_QGL::initTestCase() -{ - QGLWidget glWidget; - if (!glWidget.isValid()) - QSKIP("QGL is not supported on the test system"); -} - -class MyGLContext : public QGLContext -{ -public: - MyGLContext(const QGLFormat& format) : QGLContext(format) {} - bool windowCreated() const { return QGLContext::windowCreated(); } - void setWindowCreated(bool on) { QGLContext::setWindowCreated(on); } - bool initialized() const { return QGLContext::initialized(); } - void setInitialized(bool on) { QGLContext::setInitialized(on); } -}; - -class MyGLWidget : public QGLWidget -{ -public: - MyGLWidget() : QGLWidget() {} - bool autoBufferSwap() const { return QGLWidget::autoBufferSwap(); } - void setAutoBufferSwap(bool on) { QGLWidget::setAutoBufferSwap(on); } -}; - -static int appDefaultDepth() -{ - static int depth = 0; - if (depth == 0) { - QPixmap pm(1, 1); - depth = pm.depth(); - } - return depth; -} - -// Using INT_MIN and INT_MAX will cause failures on systems -// where "int" is 64-bit, so use the explicit values instead. -#define TEST_INT_MIN (-2147483647 - 1) -#define TEST_INT_MAX 2147483647 - -// Testing get/set functions -void tst_QGL::getSetCheck() -{ - QGLFormat obj1; - // int QGLFormat::depthBufferSize() - // void QGLFormat::setDepthBufferSize(int) - QCOMPARE(-1, obj1.depthBufferSize()); - obj1.setDepthBufferSize(0); - QCOMPARE(0, obj1.depthBufferSize()); - QTest::ignoreMessage(QtWarningMsg, "QGLFormat::setDepthBufferSize: Cannot set negative depth buffer size -2147483648"); - obj1.setDepthBufferSize(TEST_INT_MIN); - QCOMPARE(0, obj1.depthBufferSize()); // Makes no sense with a negative buffer size - obj1.setDepthBufferSize(3); - QTest::ignoreMessage(QtWarningMsg, "QGLFormat::setDepthBufferSize: Cannot set negative depth buffer size -1"); - obj1.setDepthBufferSize(-1); - QCOMPARE(3, obj1.depthBufferSize()); - obj1.setDepthBufferSize(TEST_INT_MAX); - QCOMPARE(TEST_INT_MAX, obj1.depthBufferSize()); - - // int QGLFormat::accumBufferSize() - // void QGLFormat::setAccumBufferSize(int) - QCOMPARE(-1, obj1.accumBufferSize()); - obj1.setAccumBufferSize(0); - QCOMPARE(0, obj1.accumBufferSize()); - QTest::ignoreMessage(QtWarningMsg, "QGLFormat::setAccumBufferSize: Cannot set negative accumulate buffer size -2147483648"); - obj1.setAccumBufferSize(TEST_INT_MIN); - QCOMPARE(0, obj1.accumBufferSize()); // Makes no sense with a negative buffer size - obj1.setAccumBufferSize(3); - QTest::ignoreMessage(QtWarningMsg, "QGLFormat::setAccumBufferSize: Cannot set negative accumulate buffer size -1"); - obj1.setAccumBufferSize(-1); - QCOMPARE(3, obj1.accumBufferSize()); - obj1.setAccumBufferSize(TEST_INT_MAX); - QCOMPARE(TEST_INT_MAX, obj1.accumBufferSize()); - - // int QGLFormat::redBufferSize() - // void QGLFormat::setRedBufferSize(int) - QCOMPARE(-1, obj1.redBufferSize()); - obj1.setRedBufferSize(0); - QCOMPARE(0, obj1.redBufferSize()); - QTest::ignoreMessage(QtWarningMsg, "QGLFormat::setRedBufferSize: Cannot set negative red buffer size -2147483648"); - obj1.setRedBufferSize(TEST_INT_MIN); - QCOMPARE(0, obj1.redBufferSize()); // Makes no sense with a negative buffer size - obj1.setRedBufferSize(3); - QTest::ignoreMessage(QtWarningMsg, "QGLFormat::setRedBufferSize: Cannot set negative red buffer size -1"); - obj1.setRedBufferSize(-1); - QCOMPARE(3, obj1.redBufferSize()); - obj1.setRedBufferSize(TEST_INT_MAX); - QCOMPARE(TEST_INT_MAX, obj1.redBufferSize()); - - // int QGLFormat::greenBufferSize() - // void QGLFormat::setGreenBufferSize(int) - QCOMPARE(-1, obj1.greenBufferSize()); - obj1.setGreenBufferSize(0); - QCOMPARE(0, obj1.greenBufferSize()); - QTest::ignoreMessage(QtWarningMsg, "QGLFormat::setGreenBufferSize: Cannot set negative green buffer size -2147483648"); - obj1.setGreenBufferSize(TEST_INT_MIN); - QCOMPARE(0, obj1.greenBufferSize()); // Makes no sense with a negative buffer size - obj1.setGreenBufferSize(3); - QTest::ignoreMessage(QtWarningMsg, "QGLFormat::setGreenBufferSize: Cannot set negative green buffer size -1"); - obj1.setGreenBufferSize(-1); - QCOMPARE(3, obj1.greenBufferSize()); - obj1.setGreenBufferSize(TEST_INT_MAX); - QCOMPARE(TEST_INT_MAX, obj1.greenBufferSize()); - - // int QGLFormat::blueBufferSize() - // void QGLFormat::setBlueBufferSize(int) - QCOMPARE(-1, obj1.blueBufferSize()); - obj1.setBlueBufferSize(0); - QCOMPARE(0, obj1.blueBufferSize()); - QTest::ignoreMessage(QtWarningMsg, "QGLFormat::setBlueBufferSize: Cannot set negative blue buffer size -2147483648"); - obj1.setBlueBufferSize(TEST_INT_MIN); - QCOMPARE(0, obj1.blueBufferSize()); // Makes no sense with a negative buffer size - obj1.setBlueBufferSize(3); - QTest::ignoreMessage(QtWarningMsg, "QGLFormat::setBlueBufferSize: Cannot set negative blue buffer size -1"); - obj1.setBlueBufferSize(-1); - QCOMPARE(3, obj1.blueBufferSize()); - obj1.setBlueBufferSize(TEST_INT_MAX); - QCOMPARE(TEST_INT_MAX, obj1.blueBufferSize()); - - // int QGLFormat::alphaBufferSize() - // void QGLFormat::setAlphaBufferSize(int) - QCOMPARE(-1, obj1.alphaBufferSize()); - QCOMPARE(false, obj1.alpha()); - QVERIFY(!obj1.testOption(QGL::AlphaChannel)); - QVERIFY(obj1.testOption(QGL::NoAlphaChannel)); - obj1.setAlphaBufferSize(1); - QCOMPARE(true, obj1.alpha()); // setAlphaBufferSize() enables alpha. - QCOMPARE(1, obj1.alphaBufferSize()); - QTest::ignoreMessage(QtWarningMsg, "QGLFormat::setAlphaBufferSize: Cannot set negative alpha buffer size -2147483648"); - obj1.setAlphaBufferSize(TEST_INT_MIN); - QCOMPARE(1, obj1.alphaBufferSize()); // Makes no sense with a negative buffer size - obj1.setAlphaBufferSize(3); - QTest::ignoreMessage(QtWarningMsg, "QGLFormat::setAlphaBufferSize: Cannot set negative alpha buffer size -1"); - obj1.setAlphaBufferSize(-1); - QCOMPARE(3, obj1.alphaBufferSize()); - obj1.setAlphaBufferSize(TEST_INT_MAX); - QCOMPARE(TEST_INT_MAX, obj1.alphaBufferSize()); - - // int QGLFormat::stencilBufferSize() - // void QGLFormat::setStencilBufferSize(int) - QCOMPARE(-1, obj1.stencilBufferSize()); - obj1.setStencilBufferSize(1); - QCOMPARE(1, obj1.stencilBufferSize()); - QTest::ignoreMessage(QtWarningMsg, "QGLFormat::setStencilBufferSize: Cannot set negative stencil buffer size -2147483648"); - obj1.setStencilBufferSize(TEST_INT_MIN); - QCOMPARE(1, obj1.stencilBufferSize()); // Makes no sense with a negative buffer size - obj1.setStencilBufferSize(3); - QTest::ignoreMessage(QtWarningMsg, "QGLFormat::setStencilBufferSize: Cannot set negative stencil buffer size -1"); - obj1.setStencilBufferSize(-1); - QCOMPARE(3, obj1.stencilBufferSize()); - obj1.setStencilBufferSize(TEST_INT_MAX); - QCOMPARE(TEST_INT_MAX, obj1.stencilBufferSize()); - - // bool QGLFormat::sampleBuffers() - // void QGLFormat::setSampleBuffers(bool) - QCOMPARE(false, obj1.sampleBuffers()); - QVERIFY(!obj1.testOption(QGL::SampleBuffers)); - QVERIFY(obj1.testOption(QGL::NoSampleBuffers)); - - obj1.setSampleBuffers(false); - QCOMPARE(false, obj1.sampleBuffers()); - QVERIFY(obj1.testOption(QGL::NoSampleBuffers)); - obj1.setSampleBuffers(true); - QCOMPARE(true, obj1.sampleBuffers()); - QVERIFY(obj1.testOption(QGL::SampleBuffers)); - - // int QGLFormat::samples() - // void QGLFormat::setSamples(int) - QCOMPARE(-1, obj1.samples()); - obj1.setSamples(0); - QCOMPARE(0, obj1.samples()); - QTest::ignoreMessage(QtWarningMsg, "QGLFormat::setSamples: Cannot have negative number of samples per pixel -2147483648"); - obj1.setSamples(TEST_INT_MIN); - QCOMPARE(0, obj1.samples()); // Makes no sense with a negative sample size - obj1.setSamples(3); - QTest::ignoreMessage(QtWarningMsg, "QGLFormat::setSamples: Cannot have negative number of samples per pixel -1"); - obj1.setSamples(-1); - QCOMPARE(3, obj1.samples()); - obj1.setSamples(TEST_INT_MAX); - QCOMPARE(TEST_INT_MAX, obj1.samples()); - - // int QGLFormat::swapInterval() - // void QGLFormat::setSwapInterval(int) - QCOMPARE(-1, obj1.swapInterval()); - obj1.setSwapInterval(0); - QCOMPARE(0, obj1.swapInterval()); - obj1.setSwapInterval(TEST_INT_MIN); - QCOMPARE(TEST_INT_MIN, obj1.swapInterval()); - obj1.setSwapInterval(-1); - QCOMPARE(-1, obj1.swapInterval()); - obj1.setSwapInterval(TEST_INT_MAX); - QCOMPARE(TEST_INT_MAX, obj1.swapInterval()); - - // bool QGLFormat::doubleBuffer() - // void QGLFormat::setDoubleBuffer(bool) - QCOMPARE(true, obj1.doubleBuffer()); - QVERIFY(obj1.testOption(QGL::DoubleBuffer)); - QVERIFY(!obj1.testOption(QGL::SingleBuffer)); - obj1.setDoubleBuffer(false); - QCOMPARE(false, obj1.doubleBuffer()); - QVERIFY(!obj1.testOption(QGL::DoubleBuffer)); - QVERIFY(obj1.testOption(QGL::SingleBuffer)); - obj1.setDoubleBuffer(true); - QCOMPARE(true, obj1.doubleBuffer()); - QVERIFY(obj1.testOption(QGL::DoubleBuffer)); - QVERIFY(!obj1.testOption(QGL::SingleBuffer)); - - // bool QGLFormat::depth() - // void QGLFormat::setDepth(bool) - QCOMPARE(true, obj1.depth()); - QVERIFY(obj1.testOption(QGL::DepthBuffer)); - QVERIFY(!obj1.testOption(QGL::NoDepthBuffer)); - obj1.setDepth(false); - QCOMPARE(false, obj1.depth()); - QVERIFY(!obj1.testOption(QGL::DepthBuffer)); - QVERIFY(obj1.testOption(QGL::NoDepthBuffer)); - obj1.setDepth(true); - QCOMPARE(true, obj1.depth()); - QVERIFY(obj1.testOption(QGL::DepthBuffer)); - QVERIFY(!obj1.testOption(QGL::NoDepthBuffer)); - - // bool QGLFormat::rgba() - // void QGLFormat::setRgba(bool) - QCOMPARE(true, obj1.rgba()); - QVERIFY(obj1.testOption(QGL::Rgba)); - QVERIFY(!obj1.testOption(QGL::ColorIndex)); - obj1.setRgba(false); - QCOMPARE(false, obj1.rgba()); - QVERIFY(!obj1.testOption(QGL::Rgba)); - QVERIFY(obj1.testOption(QGL::ColorIndex)); - obj1.setRgba(true); - QCOMPARE(true, obj1.rgba()); - QVERIFY(obj1.testOption(QGL::Rgba)); - QVERIFY(!obj1.testOption(QGL::ColorIndex)); - - // bool QGLFormat::alpha() - // void QGLFormat::setAlpha(bool) - QVERIFY(obj1.testOption(QGL::AlphaChannel)); - QVERIFY(!obj1.testOption(QGL::NoAlphaChannel)); - obj1.setAlpha(false); - QCOMPARE(false, obj1.alpha()); - QVERIFY(!obj1.testOption(QGL::AlphaChannel)); - QVERIFY(obj1.testOption(QGL::NoAlphaChannel)); - obj1.setAlpha(true); - QCOMPARE(true, obj1.alpha()); - QVERIFY(obj1.testOption(QGL::AlphaChannel)); - QVERIFY(!obj1.testOption(QGL::NoAlphaChannel)); - - // bool QGLFormat::accum() - // void QGLFormat::setAccum(bool) - obj1.setAccumBufferSize(0); - QCOMPARE(false, obj1.accum()); - QVERIFY(!obj1.testOption(QGL::AccumBuffer)); - QVERIFY(obj1.testOption(QGL::NoAccumBuffer)); - obj1.setAccum(false); - QCOMPARE(false, obj1.accum()); - QVERIFY(!obj1.testOption(QGL::AccumBuffer)); - QVERIFY(obj1.testOption(QGL::NoAccumBuffer)); - obj1.setAccum(true); - QCOMPARE(true, obj1.accum()); - QVERIFY(obj1.testOption(QGL::AccumBuffer)); - QVERIFY(!obj1.testOption(QGL::NoAccumBuffer)); - - // bool QGLFormat::stencil() - // void QGLFormat::setStencil(bool) - QCOMPARE(true, obj1.stencil()); - QVERIFY(obj1.testOption(QGL::StencilBuffer)); - QVERIFY(!obj1.testOption(QGL::NoStencilBuffer)); - obj1.setStencil(false); - QCOMPARE(false, obj1.stencil()); - QVERIFY(!obj1.testOption(QGL::StencilBuffer)); - QVERIFY(obj1.testOption(QGL::NoStencilBuffer)); - obj1.setStencil(true); - QCOMPARE(true, obj1.stencil()); - QVERIFY(obj1.testOption(QGL::StencilBuffer)); - QVERIFY(!obj1.testOption(QGL::NoStencilBuffer)); - - // bool QGLFormat::stereo() - // void QGLFormat::setStereo(bool) - QCOMPARE(false, obj1.stereo()); - QVERIFY(!obj1.testOption(QGL::StereoBuffers)); - QVERIFY(obj1.testOption(QGL::NoStereoBuffers)); - obj1.setStereo(false); - QCOMPARE(false, obj1.stereo()); - QVERIFY(!obj1.testOption(QGL::StereoBuffers)); - QVERIFY(obj1.testOption(QGL::NoStereoBuffers)); - obj1.setStereo(true); - QCOMPARE(true, obj1.stereo()); - QVERIFY(obj1.testOption(QGL::StereoBuffers)); - QVERIFY(!obj1.testOption(QGL::NoStereoBuffers)); - - // bool QGLFormat::directRendering() - // void QGLFormat::setDirectRendering(bool) - QCOMPARE(true, obj1.directRendering()); - QVERIFY(obj1.testOption(QGL::DirectRendering)); - QVERIFY(!obj1.testOption(QGL::IndirectRendering)); - obj1.setDirectRendering(false); - QCOMPARE(false, obj1.directRendering()); - QVERIFY(!obj1.testOption(QGL::DirectRendering)); - QVERIFY(obj1.testOption(QGL::IndirectRendering)); - obj1.setDirectRendering(true); - QCOMPARE(true, obj1.directRendering()); - QVERIFY(obj1.testOption(QGL::DirectRendering)); - QVERIFY(!obj1.testOption(QGL::IndirectRendering)); - - // bool QGLFormat::overlay() - // void QGLFormat::setOverlay(bool) - QCOMPARE(false, obj1.hasOverlay()); - QVERIFY(!obj1.testOption(QGL::HasOverlay)); - QVERIFY(obj1.testOption(QGL::NoOverlay)); - obj1.setOverlay(false); - QCOMPARE(false, obj1.hasOverlay()); - QVERIFY(!obj1.testOption(QGL::HasOverlay)); - QVERIFY(obj1.testOption(QGL::NoOverlay)); - obj1.setOverlay(true); - QCOMPARE(true, obj1.hasOverlay()); - QVERIFY(obj1.testOption(QGL::HasOverlay)); - QVERIFY(!obj1.testOption(QGL::NoOverlay)); - - // int QGLFormat::plane() - // void QGLFormat::setPlane(int) - QCOMPARE(0, obj1.plane()); - obj1.setPlane(0); - QCOMPARE(0, obj1.plane()); - obj1.setPlane(TEST_INT_MIN); - QCOMPARE(TEST_INT_MIN, obj1.plane()); - obj1.setPlane(TEST_INT_MAX); - QCOMPARE(TEST_INT_MAX, obj1.plane()); - - // int QGLFormat::major/minorVersion() - // void QGLFormat::setVersion(int, int) - QCOMPARE(obj1.majorVersion(), 2); - QCOMPARE(obj1.minorVersion(), 0); - obj1.setVersion(3, 2); - QCOMPARE(obj1.majorVersion(), 3); - QCOMPARE(obj1.minorVersion(), 2); - QTest::ignoreMessage(QtWarningMsg, "QGLFormat::setVersion: Cannot set zero or negative version number 0.1"); - obj1.setVersion(0, 1); - QCOMPARE(obj1.majorVersion(), 3); - QCOMPARE(obj1.minorVersion(), 2); - QTest::ignoreMessage(QtWarningMsg, "QGLFormat::setVersion: Cannot set zero or negative version number 3.-1"); - obj1.setVersion(3, -1); - QCOMPARE(obj1.majorVersion(), 3); - QCOMPARE(obj1.minorVersion(), 2); - obj1.setVersion(TEST_INT_MAX, TEST_INT_MAX - 1); - QCOMPARE(obj1.majorVersion(), TEST_INT_MAX); - QCOMPARE(obj1.minorVersion(), TEST_INT_MAX - 1); - - - // operator== and operator!= for QGLFormat - QGLFormat format1; - QGLFormat format2; - - QCOMPARE(format1, format2); - QVERIFY(!(format1 != format2)); - format1.setDoubleBuffer(false); - QVERIFY(!(format1 == format2)); - QVERIFY(format1 != format2); - format2.setDoubleBuffer(false); - QCOMPARE(format1, format2); - QVERIFY(!(format1 != format2)); - - format1.setDepthBufferSize(8); - QVERIFY(!(format1 == format2)); - QVERIFY(format1 != format2); - format2.setDepthBufferSize(8); - QCOMPARE(format1, format2); - QVERIFY(!(format1 != format2)); - - format1.setAccumBufferSize(8); - QVERIFY(!(format1 == format2)); - QVERIFY(format1 != format2); - format2.setAccumBufferSize(8); - QCOMPARE(format1, format2); - QVERIFY(!(format1 != format2)); - - format1.setRedBufferSize(8); - QVERIFY(!(format1 == format2)); - QVERIFY(format1 != format2); - format2.setRedBufferSize(8); - QCOMPARE(format1, format2); - QVERIFY(!(format1 != format2)); - - format1.setGreenBufferSize(8); - QVERIFY(!(format1 == format2)); - QVERIFY(format1 != format2); - format2.setGreenBufferSize(8); - QCOMPARE(format1, format2); - QVERIFY(!(format1 != format2)); - - format1.setBlueBufferSize(8); - QVERIFY(!(format1 == format2)); - QVERIFY(format1 != format2); - format2.setBlueBufferSize(8); - QCOMPARE(format1, format2); - QVERIFY(!(format1 != format2)); - - format1.setAlphaBufferSize(8); - QVERIFY(!(format1 == format2)); - QVERIFY(format1 != format2); - format2.setAlphaBufferSize(8); - QCOMPARE(format1, format2); - QVERIFY(!(format1 != format2)); - - format1.setStencilBufferSize(8); - QVERIFY(!(format1 == format2)); - QVERIFY(format1 != format2); - format2.setStencilBufferSize(8); - QCOMPARE(format1, format2); - QVERIFY(!(format1 != format2)); - - format1.setSamples(8); - QVERIFY(!(format1 == format2)); - QVERIFY(format1 != format2); - format2.setSamples(8); - QCOMPARE(format1, format2); - QVERIFY(!(format1 != format2)); - - format1.setSwapInterval(8); - QVERIFY(!(format1 == format2)); - QVERIFY(format1 != format2); - format2.setSwapInterval(8); - QCOMPARE(format1, format2); - QVERIFY(!(format1 != format2)); - - format1.setPlane(8); - QVERIFY(!(format1 == format2)); - QVERIFY(format1 != format2); - format2.setPlane(8); - QCOMPARE(format1, format2); - QVERIFY(!(format1 != format2)); - - format1.setVersion(3, 2); - QVERIFY(!(format1 == format2)); - QVERIFY(format1 != format2); - format2.setVersion(3, 2); - QCOMPARE(format1, format2); - QVERIFY(!(format1 != format2)); - - format1.setProfile(QGLFormat::CoreProfile); - QVERIFY(!(format1 == format2)); - QVERIFY(format1 != format2); - format2.setProfile(QGLFormat::CoreProfile); - QCOMPARE(format1, format2); - QVERIFY(!(format1 != format2)); - - format1.setOption(QGL::NoDeprecatedFunctions); - QVERIFY(!(format1 == format2)); - QVERIFY(format1 != format2); - format2.setOption(QGL::NoDeprecatedFunctions); - QCOMPARE(format1, format2); - QVERIFY(!(format1 != format2)); - - // Copy constructor and assignment for QGLFormat. - QGLFormat format3(format1); - QGLFormat format4; - QCOMPARE(format1, format3); - QVERIFY(format1 != format4); - format4 = format1; - QCOMPARE(format1, format4); - - // Check that modifying a copy doesn't affect the original. - format3.setRedBufferSize(16); - format4.setPlane(16); - QCOMPARE(format1.redBufferSize(), 8); - QCOMPARE(format1.plane(), 8); - - // Check the QGLFormat constructor that takes an option list. - QGLFormat format5 - (QGL::DepthBuffer | QGL::StereoBuffers | QGL::ColorIndex, 3); - QVERIFY(format5.depth()); - QVERIFY(format5.stereo()); - QVERIFY(format5.doubleBuffer()); // From defaultFormat() - QVERIFY(!format5.hasOverlay()); // From defaultFormat() - QVERIFY(!format5.rgba()); - QCOMPARE(format5.plane(), 3); - - // The default format should be the same as QGLFormat(). - QCOMPARE(QGLFormat::defaultFormat(), QGLFormat()); - - // Modify the default format and check that it was changed. - QGLFormat::setDefaultFormat(format1); - QCOMPARE(QGLFormat::defaultFormat(), format1); - - // Restore the default format. - QGLFormat::setDefaultFormat(QGLFormat()); - QCOMPARE(QGLFormat::defaultFormat(), QGLFormat()); - - // Check the default overlay format's expected values. - QGLFormat overlay(QGLFormat::defaultOverlayFormat()); - QCOMPARE(overlay.depthBufferSize(), -1); - QCOMPARE(overlay.accumBufferSize(), -1); - QCOMPARE(overlay.redBufferSize(), -1); - QCOMPARE(overlay.greenBufferSize(), -1); - QCOMPARE(overlay.blueBufferSize(), -1); - QCOMPARE(overlay.alphaBufferSize(), -1); - QCOMPARE(overlay.samples(), -1); - QCOMPARE(overlay.swapInterval(), -1); - QCOMPARE(overlay.plane(), 1); - QVERIFY(!overlay.sampleBuffers()); - QVERIFY(!overlay.doubleBuffer()); - QVERIFY(!overlay.depth()); - QVERIFY(!overlay.rgba()); - QVERIFY(!overlay.alpha()); - QVERIFY(!overlay.accum()); - QVERIFY(!overlay.stencil()); - QVERIFY(!overlay.stereo()); - QVERIFY(overlay.directRendering()); // Only option that should be on. - QVERIFY(!overlay.hasOverlay()); // Overlay doesn't need an overlay! - - // Modify the default overlay format and check that it was changed. - QGLFormat::setDefaultOverlayFormat(format1); - QCOMPARE(QGLFormat::defaultOverlayFormat(), format1); - - // Restore the default overlay format. - QGLFormat::setDefaultOverlayFormat(overlay); - QCOMPARE(QGLFormat::defaultOverlayFormat(), overlay); - - MyGLContext obj2(obj1); - // bool QGLContext::windowCreated() - // void QGLContext::setWindowCreated(bool) - obj2.setWindowCreated(false); - QCOMPARE(false, obj2.windowCreated()); - obj2.setWindowCreated(true); - QCOMPARE(true, obj2.windowCreated()); - - // bool QGLContext::initialized() - // void QGLContext::setInitialized(bool) - obj2.setInitialized(false); - QCOMPARE(false, obj2.initialized()); - obj2.setInitialized(true); - QCOMPARE(true, obj2.initialized()); - - MyGLWidget obj3; - // bool QGLWidget::autoBufferSwap() - // void QGLWidget::setAutoBufferSwap(bool) - obj3.setAutoBufferSwap(false); - QCOMPARE(false, obj3.autoBufferSwap()); - obj3.setAutoBufferSwap(true); - QCOMPARE(true, obj3.autoBufferSwap()); -} - -#ifdef QT_BUILD_INTERNAL -QT_BEGIN_NAMESPACE -extern QGLFormat::OpenGLVersionFlags qOpenGLVersionFlagsFromString(const QString &versionString); -QT_END_NAMESPACE -#endif - -#ifdef QT_BUILD_INTERNAL -void tst_QGL::openGLVersionCheck() -{ - QString versionString; - QGLFormat::OpenGLVersionFlags expectedFlag; - QGLFormat::OpenGLVersionFlags versionFlag; - - versionString = "1.1 Irix 6.5"; - expectedFlag = QGLFormat::OpenGL_Version_1_1; - versionFlag = qOpenGLVersionFlagsFromString(versionString); - QCOMPARE(versionFlag, expectedFlag); - - versionString = "1.2 Microsoft"; - expectedFlag = QGLFormat::OpenGL_Version_1_2 | QGLFormat::OpenGL_Version_1_1; - versionFlag = qOpenGLVersionFlagsFromString(versionString); - QCOMPARE(versionFlag, expectedFlag); - - versionString = "1.2.1"; - expectedFlag = QGLFormat::OpenGL_Version_1_2 | QGLFormat::OpenGL_Version_1_1; - versionFlag = qOpenGLVersionFlagsFromString(versionString); - QCOMPARE(versionFlag, expectedFlag); - - versionString = "1.3 NVIDIA"; - expectedFlag = QGLFormat::OpenGL_Version_1_3 | QGLFormat::OpenGL_Version_1_2 | QGLFormat::OpenGL_Version_1_1; - versionFlag = qOpenGLVersionFlagsFromString(versionString); - QCOMPARE(versionFlag, expectedFlag); - - versionString = "1.4"; - expectedFlag = QGLFormat::OpenGL_Version_1_4 | QGLFormat::OpenGL_Version_1_3 | QGLFormat::OpenGL_Version_1_2 | QGLFormat::OpenGL_Version_1_1; - versionFlag = qOpenGLVersionFlagsFromString(versionString); - QCOMPARE(versionFlag, expectedFlag); - - versionString = "1.5 NVIDIA"; - expectedFlag = QGLFormat::OpenGL_Version_1_5 | QGLFormat::OpenGL_Version_1_4 | QGLFormat::OpenGL_Version_1_3 | QGLFormat::OpenGL_Version_1_2 | QGLFormat::OpenGL_Version_1_1; - versionFlag = qOpenGLVersionFlagsFromString(versionString); - QCOMPARE(versionFlag, expectedFlag); - - versionString = "2.0.2 NVIDIA 87.62"; - expectedFlag = QGLFormat::OpenGL_Version_2_0 | QGLFormat::OpenGL_Version_1_5 | QGLFormat::OpenGL_Version_1_4 | QGLFormat::OpenGL_Version_1_3 | QGLFormat::OpenGL_Version_1_2 | QGLFormat::OpenGL_Version_1_1; - versionFlag = qOpenGLVersionFlagsFromString(versionString); - QCOMPARE(versionFlag, expectedFlag); - - versionString = "2.1 NVIDIA"; - expectedFlag = QGLFormat::OpenGL_Version_2_1 | QGLFormat::OpenGL_Version_2_0 | QGLFormat::OpenGL_Version_1_5 | QGLFormat::OpenGL_Version_1_4 | QGLFormat::OpenGL_Version_1_3 | QGLFormat::OpenGL_Version_1_2 | QGLFormat::OpenGL_Version_1_1; - versionFlag = qOpenGLVersionFlagsFromString(versionString); - QCOMPARE(versionFlag, expectedFlag); - - versionString = "2.1"; - expectedFlag = QGLFormat::OpenGL_Version_2_1 | QGLFormat::OpenGL_Version_2_0 | QGLFormat::OpenGL_Version_1_5 | QGLFormat::OpenGL_Version_1_4 | QGLFormat::OpenGL_Version_1_3 | QGLFormat::OpenGL_Version_1_2 | QGLFormat::OpenGL_Version_1_1; - versionFlag = qOpenGLVersionFlagsFromString(versionString); - QCOMPARE(versionFlag, expectedFlag); - - versionString = "OpenGL ES-CM 1.0 ATI"; - expectedFlag = QGLFormat::OpenGL_ES_Common_Version_1_0 | QGLFormat::OpenGL_ES_CommonLite_Version_1_0; - versionFlag = qOpenGLVersionFlagsFromString(versionString); - QCOMPARE(versionFlag, expectedFlag); - - versionString = "OpenGL ES-CL 1.0 ATI"; - expectedFlag = QGLFormat::OpenGL_ES_CommonLite_Version_1_0; - versionFlag = qOpenGLVersionFlagsFromString(versionString); - QCOMPARE(versionFlag, expectedFlag); - - versionString = "OpenGL ES-CM 1.1 ATI"; - expectedFlag = QGLFormat::OpenGL_ES_Common_Version_1_1 | QGLFormat::OpenGL_ES_CommonLite_Version_1_1 | QGLFormat::OpenGL_ES_Common_Version_1_0 | QGLFormat::OpenGL_ES_CommonLite_Version_1_0; - versionFlag = qOpenGLVersionFlagsFromString(versionString); - QCOMPARE(versionFlag, expectedFlag); - - versionString = "OpenGL ES-CL 1.1 ATI"; - expectedFlag = QGLFormat::OpenGL_ES_CommonLite_Version_1_1 | QGLFormat::OpenGL_ES_CommonLite_Version_1_0; - versionFlag = qOpenGLVersionFlagsFromString(versionString); - QCOMPARE(versionFlag, expectedFlag); - - versionString = "OpenGL ES 2.0 ATI"; - expectedFlag = QGLFormat::OpenGL_ES_Version_2_0; - versionFlag = qOpenGLVersionFlagsFromString(versionString); - QCOMPARE(versionFlag, expectedFlag); - - versionString = "3.0"; - expectedFlag = QGLFormat::OpenGL_Version_3_0 | QGLFormat::OpenGL_Version_2_1 | QGLFormat::OpenGL_Version_2_0 | QGLFormat::OpenGL_Version_1_5 | QGLFormat::OpenGL_Version_1_4 | QGLFormat::OpenGL_Version_1_3 | QGLFormat::OpenGL_Version_1_2 | QGLFormat::OpenGL_Version_1_1; - versionFlag = qOpenGLVersionFlagsFromString(versionString); - QCOMPARE(versionFlag, expectedFlag); - - QGLWidget glWidget; - glWidget.show(); - glWidget.makeCurrent(); - - // This is unfortunately the only test we can make on the actual openGLVersionFlags() - // However, the complicated parts are in openGLVersionFlags(const QString &versionString) - // tested above - -#if defined(QT_OPENGL_ES_2) - QVERIFY(QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_ES_Version_2_0); -#else - if (QOpenGLContext::currentContext()->isOpenGLES()) - QVERIFY(QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_ES_Version_2_0); - else - QVERIFY(QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_Version_1_1); -#endif //defined(QT_OPENGL_ES_2) -} -#endif //QT_BUILD_INTERNAL - -static bool fuzzyComparePixels(const QRgb testPixel, const QRgb refPixel, const char* file, int line, int x = -1, int y = -1) -{ - static int maxFuzz = 1; - static bool maxFuzzSet = false; - - // On 16 bpp systems, we need to allow for more fuzz: - if (!maxFuzzSet) { - maxFuzzSet = true; - if (appDefaultDepth() < 24) - maxFuzz = 32; - } - - int redFuzz = qAbs(qRed(testPixel) - qRed(refPixel)); - int greenFuzz = qAbs(qGreen(testPixel) - qGreen(refPixel)); - int blueFuzz = qAbs(qBlue(testPixel) - qBlue(refPixel)); - int alphaFuzz = qAbs(qAlpha(testPixel) - qAlpha(refPixel)); - - if (refPixel != 0 && testPixel == 0) { - QString msg; - if (x >= 0) { - msg = QString("Test pixel [%1, %2] is null (black) when it should be (%3,%4,%5,%6)") - .arg(x).arg(y) - .arg(qRed(refPixel)).arg(qGreen(refPixel)).arg(qBlue(refPixel)).arg(qAlpha(refPixel)); - } else { - msg = QString("Test pixel is null (black) when it should be (%2,%3,%4,%5)") - .arg(qRed(refPixel)).arg(qGreen(refPixel)).arg(qBlue(refPixel)).arg(qAlpha(refPixel)); - } - - QTest::qFail(msg.toLatin1(), file, line); - return false; - } - - if (redFuzz > maxFuzz || greenFuzz > maxFuzz || blueFuzz > maxFuzz || alphaFuzz > maxFuzz) { - QString msg; - - if (x >= 0) - msg = QString("Pixel [%1,%2]: ").arg(x).arg(y); - else - msg = QString("Pixel "); - - msg += QString("Max fuzz (%1) exceeded: (%2,%3,%4,%5) vs (%6,%7,%8,%9)") - .arg(maxFuzz) - .arg(qRed(testPixel)).arg(qGreen(testPixel)).arg(qBlue(testPixel)).arg(qAlpha(testPixel)) - .arg(qRed(refPixel)).arg(qGreen(refPixel)).arg(qBlue(refPixel)).arg(qAlpha(refPixel)); - QTest::qFail(msg.toLatin1(), file, line); - return false; - } - return true; -} - -static void fuzzyCompareImages(const QImage &testImage, const QImage &referenceImage, const char* file, int line) -{ - QCOMPARE(testImage.width(), referenceImage.width()); - QCOMPARE(testImage.height(), referenceImage.height()); - - for (int y = 0; y < testImage.height(); y++) { - for (int x = 0; x < testImage.width(); x++) { - if (!fuzzyComparePixels(testImage.pixel(x, y), referenceImage.pixel(x, y), file, line, x, y)) { - // Might as well save the images for easier debugging: - referenceImage.save("referenceImage.png"); - testImage.save("testImage.png"); - return; - } - } - } -} - -#define QFUZZY_COMPARE_IMAGES(A,B) \ - fuzzyCompareImages(A, B, __FILE__, __LINE__) - -#define QFUZZY_COMPARE_PIXELS(A,B) \ - fuzzyComparePixels(A, B, __FILE__, __LINE__) - -class UnclippedWidget : public QWidget -{ -public: - bool painted; - - UnclippedWidget() - : painted(false) - { - } - - void paintEvent(QPaintEvent *) - { - QPainter p(this); - p.fillRect(rect().adjusted(-1000, -1000, 1000, 1000), Qt::black); - - painted = true; - } -}; - -void tst_QGL::graphicsViewClipping() -{ - const int size = 64; - UnclippedWidget *widget = new UnclippedWidget; - widget->setFixedSize(size, size); - - QGraphicsScene scene; - - scene.addWidget(widget)->setPos(0, 0); - - QGraphicsView view(&scene); - // Use Qt::Tool as fully decorated windows have a minimum width of 160 on Windows. - view.setWindowFlags(view.windowFlags() | Qt::Tool); - view.setBackgroundBrush(Qt::white); - view.resize(2*size, 2*size); - - QGLWidget *viewport = new QGLWidget; - view.setViewport(viewport); - view.show(); - qApp->setActiveWindow(&view); - - if (!viewport->isValid()) - return; - - scene.setSceneRect(view.viewport()->rect()); - - QVERIFY(QTest::qWaitForWindowExposed(view.viewport()->windowHandle())); - #ifdef Q_OS_MAC - // The black rectangle jumps from the center to the upper left for some reason. - QTest::qWait(100); - #endif - - QTRY_VERIFY(widget->painted); - - QImage image = viewport->grabFrameBuffer(); - QImage expected = image; - - QPainter p(&expected); - p.fillRect(expected.rect(), Qt::white); - p.fillRect(QRect(0, 0, size, size), Qt::black); - p.end(); - - QFUZZY_COMPARE_IMAGES(image, expected); -} - -void tst_QGL::partialGLWidgetUpdates_data() -{ - QTest::addColumn<bool>("doubleBufferedContext"); - QTest::addColumn<bool>("autoFillBackground"); - QTest::addColumn<bool>("supportsPartialUpdates"); - - QTest::newRow("Double buffered context") << true << true << false; - QTest::newRow("Double buffered context without auto-fill background") << true << false << false; - QTest::newRow("Single buffered context") << false << true << false; - QTest::newRow("Single buffered context without auto-fill background") << false << false << true; -} - -void tst_QGL::partialGLWidgetUpdates() -{ - QFETCH(bool, doubleBufferedContext); - QFETCH(bool, autoFillBackground); - QFETCH(bool, supportsPartialUpdates); - - class MyGLWidget : public QGLWidget - { - public: - QRegion paintEventRegion; - void paintEvent(QPaintEvent *e) - { - paintEventRegion = e->region(); - } - }; - - QGLFormat format = QGLFormat::defaultFormat(); - format.setDoubleBuffer(doubleBufferedContext); - QGLFormat::setDefaultFormat(format); - - MyGLWidget widget; - widget.setFixedSize(150, 150); - widget.setAutoFillBackground(autoFillBackground); - widget.show(); - QVERIFY(QTest::qWaitForWindowExposed(&widget)); - QCoreApplication::processEvents(); // Process all queued paint events - - if (widget.format().doubleBuffer() != doubleBufferedContext) - QSKIP("Platform does not support requested format"); - - widget.paintEventRegion = QRegion(); - widget.repaint(50, 50, 50, 50); - - if (supportsPartialUpdates) - QCOMPARE(widget.paintEventRegion, QRegion(50, 50, 50, 50)); - else - QCOMPARE(widget.paintEventRegion, QRegion(widget.rect())); -} - - -// This tests that rendering to a QGLPBuffer using QPainter works. -void tst_QGL::glPBufferRendering() -{ - if (!QGLPixelBuffer::hasOpenGLPbuffers()) - QSKIP("QGLPixelBuffer not supported on this platform"); - - QGLPixelBuffer* pbuf = new QGLPixelBuffer(128, 128); - - QPainter p; - bool begun = p.begin(pbuf); - QVERIFY(begun); - - QPaintEngine::Type engineType = p.paintEngine()->type(); - QVERIFY(engineType == QPaintEngine::OpenGL || engineType == QPaintEngine::OpenGL2); - - p.fillRect(0, 0, 128, 128, Qt::red); - p.fillRect(32, 32, 64, 64, Qt::blue); - p.end(); - - QImage fb = pbuf->toImage(); - delete pbuf; - - QImage reference(128, 128, fb.format()); - p.begin(&reference); - p.fillRect(0, 0, 128, 128, Qt::red); - p.fillRect(32, 32, 64, 64, Qt::blue); - p.end(); - - QFUZZY_COMPARE_IMAGES(fb, reference); -} - -void tst_QGL::glWidgetWithAlpha() -{ - QGLWidget* w = new QGLWidget(QGLFormat(QGL::AlphaChannel)); - w->show(); - QVERIFY(QTest::qWaitForWindowExposed(w)); - - delete w; -} - - -void qt_opengl_draw_test_pattern(QPainter* painter, int width, int height) -{ - QPainterPath intersectingPath; - intersectingPath.moveTo(0, 0); - intersectingPath.lineTo(100, 0); - intersectingPath.lineTo(0, 100); - intersectingPath.lineTo(100, 100); - intersectingPath.closeSubpath(); - - QPainterPath trianglePath; - trianglePath.moveTo(50, 0); - trianglePath.lineTo(100, 100); - trianglePath.lineTo(0, 100); - trianglePath.closeSubpath(); - - painter->setTransform(QTransform()); // reset xform - painter->fillRect(-1, -1, width+2, height+2, Qt::red); // Background - painter->translate(14, 14); - painter->fillPath(intersectingPath, Qt::blue); // Test stencil buffer works - painter->translate(128, 0); - painter->setClipPath(trianglePath); // Test depth buffer works - painter->setTransform(QTransform()); // reset xform ready for fill - painter->fillRect(-1, -1, width+2, height+2, Qt::green); -} - -void qt_opengl_check_test_pattern(const QImage& img) -{ - // As we're doing more than trivial painting, we can't just compare to - // an image rendered with raster. Instead, we sample at well-defined - // test-points: - QFUZZY_COMPARE_PIXELS(img.pixel(39, 64), QColor(Qt::red).rgb()); - QFUZZY_COMPARE_PIXELS(img.pixel(89, 64), QColor(Qt::red).rgb()); - QFUZZY_COMPARE_PIXELS(img.pixel(64, 39), QColor(Qt::blue).rgb()); - QFUZZY_COMPARE_PIXELS(img.pixel(64, 89), QColor(Qt::blue).rgb()); - - QFUZZY_COMPARE_PIXELS(img.pixel(167, 39), QColor(Qt::red).rgb()); - QFUZZY_COMPARE_PIXELS(img.pixel(217, 39), QColor(Qt::red).rgb()); - QFUZZY_COMPARE_PIXELS(img.pixel(192, 64), QColor(Qt::green).rgb()); -} - -class GLWidget : public QGLWidget -{ -public: - GLWidget(QWidget* p = 0) - : QGLWidget(p), beginOk(false), engineType(QPaintEngine::MaxUser) {} - bool beginOk; - QPaintEngine::Type engineType; - void paintGL() - { - QPainter p; - beginOk = p.begin(this); - QPaintEngine* pe = p.paintEngine(); - engineType = pe->type(); - - qt_opengl_draw_test_pattern(&p, width(), height()); - - // No p.end() or swap buffers, should be done automatically - } - -}; - -void tst_QGL::glWidgetRendering() -{ - GLWidget w; - w.resize(256, 128); - w.show(); - - QVERIFY(QTest::qWaitForWindowExposed(&w)); - - QVERIFY(w.beginOk); - QVERIFY(w.engineType == QPaintEngine::OpenGL || w.engineType == QPaintEngine::OpenGL2); - -#if defined(Q_OS_QNX) - // glReadPixels reads from the back buffer. On QNX the buffer is not preserved - // after a buffer swap. This is why we have to swap the buffer explicitly before calling - // grabFrameBuffer to retrieve the content of the front buffer. - w.swapBuffers(); -#endif - QImage fb = w.grabFrameBuffer(false); - qt_opengl_check_test_pattern(fb); -} - -void tst_QGL::glFBOSimpleRendering() -{ - if (!QGLFramebufferObject::hasOpenGLFramebufferObjects()) - QSKIP("QGLFramebufferObject not supported on this platform"); - - QGLWidget glw; - glw.makeCurrent(); - - // No multisample with combined depth/stencil attachment: - QGLFramebufferObjectFormat fboFormat; - fboFormat.setAttachment(QGLFramebufferObject::NoAttachment); - - QGLFramebufferObject *fbo = new QGLFramebufferObject(200, 100, fboFormat); - - fbo->bind(); - - QOpenGLFunctions *funcs = QOpenGLContext::currentContext()->functions(); - funcs->glClearColor(1.0, 0.0, 0.0, 1.0); - funcs->glClear(GL_COLOR_BUFFER_BIT); - funcs->glFinish(); - - QImage fb = fbo->toImage().convertToFormat(QImage::Format_RGB32); - QImage reference(fb.size(), QImage::Format_RGB32); - reference.fill(0xffff0000); - - QFUZZY_COMPARE_IMAGES(fb, reference); - - delete fbo; -} - -// NOTE: This tests that CombinedDepthStencil attachment works by assuming the -// GL2 engine is being used and is implemented the same way as it was when -// this autotest was written. If this is not the case, there may be some -// false-positives: I.e. The test passes when either the depth or stencil -// buffer is actually missing. But that's probably ok anyway. -void tst_QGL::glFBORendering() -{ -#if defined(Q_OS_QNX) - QSKIP("Reading the QGLFramebufferObject is unsupported on this platform"); -#endif - if (!QGLFramebufferObject::hasOpenGLFramebufferObjects()) - QSKIP("QGLFramebufferObject not supported on this platform"); - - QGLWidget glw; - glw.makeCurrent(); - - // No multisample with combined depth/stencil attachment: - QGLFramebufferObjectFormat fboFormat; - fboFormat.setAttachment(QGLFramebufferObject::CombinedDepthStencil); - - // Don't complicate things by using NPOT: - QGLFramebufferObject *fbo = new QGLFramebufferObject(256, 128, fboFormat); - - if (fbo->attachment() != QGLFramebufferObject::CombinedDepthStencil) { - delete fbo; - QSKIP("FBOs missing combined depth~stencil support"); - } - - QPainter fboPainter; - bool painterBegun = fboPainter.begin(fbo); - QVERIFY(painterBegun); - - qt_opengl_draw_test_pattern(&fboPainter, fbo->width(), fbo->height()); - - fboPainter.end(); - - QImage fb = fbo->toImage().convertToFormat(QImage::Format_RGB32); - delete fbo; - - qt_opengl_check_test_pattern(fb); -} - -class QOpenGLFramebufferObjectPaintDevice : public QOpenGLPaintDevice -{ -public: - QOpenGLFramebufferObjectPaintDevice(int width, int height) - : QOpenGLPaintDevice(width, height) - , m_fbo(width, height, QOpenGLFramebufferObject::CombinedDepthStencil) - { - } - - void ensureActiveTarget() - { - m_fbo.bind(); - } - - QImage toImage() const - { - return m_fbo.toImage(); - } - -private: - QOpenGLFramebufferObject m_fbo; -}; - -void tst_QGL::currentFboSync() -{ - if (!QGLFramebufferObject::hasOpenGLFramebufferObjects()) - QSKIP("QGLFramebufferObject not supported on this platform"); - -#if defined(Q_OS_QNX) - QSKIP("Reading the QGLFramebufferObject is unsupported on this platform"); -#endif - - QGLWidget glw; - glw.makeCurrent(); - - // For some reason we offer inter-operatibility between QGL and QOpenGL - // paint engines. (?!) Let's check if the two engines can be used to perform - // drawing in turns on different targets within the same context. - - { - QGLFramebufferObject fbo1(256, 256, QGLFramebufferObject::CombinedDepthStencil); - - QOpenGLFramebufferObjectPaintDevice fbo2(256, 256); - - QImage sourceImage(256, 256, QImage::Format_ARGB32_Premultiplied); - QPainter sourcePainter(&sourceImage); - qt_opengl_draw_test_pattern(&sourcePainter, 256, 256); - - QPainter fbo1Painter(&fbo1); - - QPainter fbo2Painter(&fbo2); - fbo2Painter.drawImage(0, 0, sourceImage); - fbo2Painter.end(); - - QImage fbo2Image = fbo2.toImage(); - - fbo1Painter.drawImage(0, 0, sourceImage); - fbo1Painter.end(); - - QGLFramebufferObject::bindDefault(); - - // Convert the QGLFBO's result since QOpenGLFBO uses a wider - // variety of possible return formats. - QCOMPARE(fbo1.toImage().convertToFormat(fbo2Image.format()), fbo2Image); - } - - { - QGLFramebufferObject fbo1(512, 512, QGLFramebufferObject::CombinedDepthStencil); - - QOpenGLFramebufferObjectPaintDevice fbo2(256, 256); - - QImage sourceImage(256, 256, QImage::Format_ARGB32_Premultiplied); - QPainter sourcePainter(&sourceImage); - qt_opengl_draw_test_pattern(&sourcePainter, 256, 256); - - QPainter fbo2Painter(&fbo2); - fbo2Painter.drawImage(0, 0, sourceImage); - QImage fbo2Image1 = fbo2.toImage(); - fbo2Painter.fillRect(0, 0, 256, 256, Qt::white); - - QPainter fbo1Painter(&fbo1); - fbo1Painter.drawImage(0, 0, sourceImage); - fbo1Painter.end(); - - // check that the OpenGL paint engine now knows it needs to sync - fbo2Painter.drawImage(0, 0, sourceImage); - QImage fbo2Image2 = fbo2.toImage(); - - fbo2Painter.end(); - - QCOMPARE(fbo2Image1, fbo2Image2); - } -} - -// Tests multiple QPainters active on different FBOs at the same time, with -// interleaving painting. Performance-wise, this is sub-optimal, but it still -// has to work flawlessly -void tst_QGL::multipleFBOInterleavedRendering() -{ - if (!QGLFramebufferObject::hasOpenGLFramebufferObjects()) - QSKIP("QGLFramebufferObject not supported on this platform"); - - QGLWidget glw; - glw.makeCurrent(); - - // No multisample with combined depth/stencil attachment: - QGLFramebufferObjectFormat fboFormat; - fboFormat.setAttachment(QGLFramebufferObject::CombinedDepthStencil); - - QGLFramebufferObject *fbo1 = new QGLFramebufferObject(256, 128, fboFormat); - QGLFramebufferObject *fbo2 = new QGLFramebufferObject(256, 128, fboFormat); - QGLFramebufferObject *fbo3 = new QGLFramebufferObject(256, 128, fboFormat); - - if ( (fbo1->attachment() != QGLFramebufferObject::CombinedDepthStencil) || - (fbo2->attachment() != QGLFramebufferObject::CombinedDepthStencil) || - (fbo3->attachment() != QGLFramebufferObject::CombinedDepthStencil) ) - { - delete fbo1; - delete fbo2; - delete fbo3; - QSKIP("FBOs missing combined depth~stencil support"); - } - - QPainter fbo1Painter; - QPainter fbo2Painter; - QPainter fbo3Painter; - - QVERIFY(fbo1Painter.begin(fbo1)); - QVERIFY(fbo2Painter.begin(fbo2)); - QVERIFY(fbo3Painter.begin(fbo3)); - - // Confirm we're using the GL2 engine, as interleaved rendering isn't supported - // on the GL1 engine: - if (fbo1Painter.paintEngine()->type() != QPaintEngine::OpenGL2) - QSKIP("Interleaved GL rendering requires OpenGL 2.0 or higher"); - - QPainterPath intersectingPath; - intersectingPath.moveTo(0, 0); - intersectingPath.lineTo(100, 0); - intersectingPath.lineTo(0, 100); - intersectingPath.lineTo(100, 100); - intersectingPath.closeSubpath(); - - QPainterPath trianglePath; - trianglePath.moveTo(50, 0); - trianglePath.lineTo(100, 100); - trianglePath.lineTo(0, 100); - trianglePath.closeSubpath(); - - fbo1Painter.fillRect(0, 0, fbo1->width(), fbo1->height(), Qt::red); // Background - fbo2Painter.fillRect(0, 0, fbo2->width(), fbo2->height(), Qt::green); // Background - fbo3Painter.fillRect(0, 0, fbo3->width(), fbo3->height(), Qt::blue); // Background - - fbo1Painter.translate(14, 14); - fbo2Painter.translate(14, 14); - fbo3Painter.translate(14, 14); - - fbo1Painter.fillPath(intersectingPath, Qt::blue); // Test stencil buffer works - fbo2Painter.fillPath(intersectingPath, Qt::red); // Test stencil buffer works - fbo3Painter.fillPath(intersectingPath, Qt::green); // Test stencil buffer works - - fbo1Painter.translate(128, 0); - fbo2Painter.translate(128, 0); - fbo3Painter.translate(128, 0); - - fbo1Painter.setClipPath(trianglePath); - fbo2Painter.setClipPath(trianglePath); - fbo3Painter.setClipPath(trianglePath); - - fbo1Painter.setTransform(QTransform()); // reset xform - fbo2Painter.setTransform(QTransform()); // reset xform - fbo3Painter.setTransform(QTransform()); // reset xform - - fbo1Painter.fillRect(0, 0, fbo1->width(), fbo1->height(), Qt::green); - fbo2Painter.fillRect(0, 0, fbo2->width(), fbo2->height(), Qt::blue); - fbo3Painter.fillRect(0, 0, fbo3->width(), fbo3->height(), Qt::red); - - fbo1Painter.end(); - fbo2Painter.end(); - fbo3Painter.end(); - - QImage fb1 = fbo1->toImage().convertToFormat(QImage::Format_RGB32); - QImage fb2 = fbo2->toImage().convertToFormat(QImage::Format_RGB32); - QImage fb3 = fbo3->toImage().convertToFormat(QImage::Format_RGB32); - delete fbo1; - delete fbo2; - delete fbo3; - - // As we're doing more than trivial painting, we can't just compare to - // an image rendered with raster. Instead, we sample at well-defined - // test-points: - QFUZZY_COMPARE_PIXELS(fb1.pixel(39, 64), QColor(Qt::red).rgb()); - QFUZZY_COMPARE_PIXELS(fb1.pixel(89, 64), QColor(Qt::red).rgb()); - QFUZZY_COMPARE_PIXELS(fb1.pixel(64, 39), QColor(Qt::blue).rgb()); - QFUZZY_COMPARE_PIXELS(fb1.pixel(64, 89), QColor(Qt::blue).rgb()); - QFUZZY_COMPARE_PIXELS(fb1.pixel(167, 39), QColor(Qt::red).rgb()); - QFUZZY_COMPARE_PIXELS(fb1.pixel(217, 39), QColor(Qt::red).rgb()); - QFUZZY_COMPARE_PIXELS(fb1.pixel(192, 64), QColor(Qt::green).rgb()); - - QFUZZY_COMPARE_PIXELS(fb2.pixel(39, 64), QColor(Qt::green).rgb()); - QFUZZY_COMPARE_PIXELS(fb2.pixel(89, 64), QColor(Qt::green).rgb()); - QFUZZY_COMPARE_PIXELS(fb2.pixel(64, 39), QColor(Qt::red).rgb()); - QFUZZY_COMPARE_PIXELS(fb2.pixel(64, 89), QColor(Qt::red).rgb()); - QFUZZY_COMPARE_PIXELS(fb2.pixel(167, 39), QColor(Qt::green).rgb()); - QFUZZY_COMPARE_PIXELS(fb2.pixel(217, 39), QColor(Qt::green).rgb()); - QFUZZY_COMPARE_PIXELS(fb2.pixel(192, 64), QColor(Qt::blue).rgb()); - - QFUZZY_COMPARE_PIXELS(fb3.pixel(39, 64), QColor(Qt::blue).rgb()); - QFUZZY_COMPARE_PIXELS(fb3.pixel(89, 64), QColor(Qt::blue).rgb()); - QFUZZY_COMPARE_PIXELS(fb3.pixel(64, 39), QColor(Qt::green).rgb()); - QFUZZY_COMPARE_PIXELS(fb3.pixel(64, 89), QColor(Qt::green).rgb()); - QFUZZY_COMPARE_PIXELS(fb3.pixel(167, 39), QColor(Qt::blue).rgb()); - QFUZZY_COMPARE_PIXELS(fb3.pixel(217, 39), QColor(Qt::blue).rgb()); - QFUZZY_COMPARE_PIXELS(fb3.pixel(192, 64), QColor(Qt::red).rgb()); -} - -class FBOUseInGLWidget : public QGLWidget -{ -public: - bool widgetPainterBeginOk; - bool fboPainterBeginOk; - QImage fboImage; -protected: - void paintEvent(QPaintEvent*) - { - QPainter widgetPainter; - widgetPainterBeginOk = widgetPainter.begin(this); - QGLFramebufferObjectFormat fboFormat; - fboFormat.setAttachment(QGLFramebufferObject::NoAttachment); - QGLFramebufferObject *fbo = new QGLFramebufferObject(100, 100, fboFormat); - - QPainter fboPainter; - fboPainterBeginOk = fboPainter.begin(fbo); - fboPainter.fillRect(-1, -1, 130, 130, Qt::red); - fboPainter.end(); - fboImage = fbo->toImage(); - - widgetPainter.fillRect(-1, -1, width()+2, height()+2, Qt::blue); - - delete fbo; - } - -}; - -void tst_QGL::glFBOUseInGLWidget() -{ - if (!QGLFramebufferObject::hasOpenGLFramebufferObjects()) - QSKIP("QGLFramebufferObject not supported on this platform"); - - FBOUseInGLWidget w; - w.resize(100, 100); - w.showNormal(); - - QVERIFY(QTest::qWaitForWindowExposed(&w)); - - QVERIFY(w.widgetPainterBeginOk); - QVERIFY(w.fboPainterBeginOk); - -#if defined(Q_OS_QNX) - // glReadPixels reads from the back buffer. On QNX the buffer is not preserved - // after a buffer swap. This is why we have to swap the buffer explicitly before calling - // grabFrameBuffer to retrieve the content of the front buffer - w.swapBuffers(); -#endif - - QImage widgetFB = w.grabFrameBuffer(false); - QImage widgetReference(widgetFB.size(), widgetFB.format()); - widgetReference.fill(0xff0000ff); - QFUZZY_COMPARE_IMAGES(widgetFB, widgetReference); - - QImage fboReference(w.fboImage.size(), w.fboImage.format()); - fboReference.fill(0xffff0000); - QFUZZY_COMPARE_IMAGES(w.fboImage, fboReference); -} - -void tst_QGL::glWidgetReparent() -{ - // Try it as a top-level first: - GLWidget *widget = new GLWidget; - widget->setObjectName(QStringLiteral("glWidget1")); - widget->setGeometry(0, 0, 200, 30); - widget->show(); - - QWidget grandParentWidget; - grandParentWidget.setObjectName(QStringLiteral("grandParentWidget")); - grandParentWidget.setPalette(Qt::blue); - QVBoxLayout grandParentLayout(&grandParentWidget); - - QWidget parentWidget(&grandParentWidget); - parentWidget.setObjectName(QStringLiteral("parentWidget")); - grandParentLayout.addWidget(&parentWidget); - parentWidget.setPalette(Qt::green); - parentWidget.setAutoFillBackground(true); - QVBoxLayout parentLayout(&parentWidget); - - grandParentWidget.setGeometry(0, 100, 200, 200); - grandParentWidget.show(); - - QVERIFY(QTest::qWaitForWindowExposed(widget)); - QVERIFY(QTest::qWaitForWindowExposed(&grandParentWidget)); - - QVERIFY(parentWidget.children().count() == 1); // The layout - - // Now both widgets should be created & shown, time to re-parent: - parentLayout.addWidget(widget); - - QVERIFY(QTest::qWaitForWindowExposed(&grandParentWidget)); - - QVERIFY(parentWidget.children().count() == 2); // Layout & glwidget - QVERIFY(parentWidget.children().contains(widget)); - QTRY_VERIFY(widget->height() > 30); - - delete widget; - - QVERIFY(QTest::qWaitForWindowExposed(&grandParentWidget)); - - QVERIFY(parentWidget.children().count() == 1); // The layout - - // Now do pretty much the same thing, but don't show the - // widget first: - widget = new GLWidget; - widget->setObjectName(QStringLiteral("glWidget2")); - parentLayout.addWidget(widget); - - QVERIFY(QTest::qWaitForWindowExposed(&grandParentWidget)); - - QVERIFY(parentWidget.children().count() == 2); // Layout & glwidget - QVERIFY(parentWidget.children().contains(widget)); - QVERIFY(widget->height() > 30); - - delete widget; -} - -class RenderPixmapWidget : public QGLWidget -{ -protected: - void initializeGL() { - // Set some gl state: - QOpenGLContext::currentContext()->functions()->glClearColor(1.0, 0.0, 0.0, 1.0); - } - - void paintGL() { - QOpenGLContext::currentContext()->functions()->glClear(GL_COLOR_BUFFER_BIT); - } -}; - -void tst_QGL::glWidgetRenderPixmap() -{ - RenderPixmapWidget *w = new RenderPixmapWidget; - - QSize pmSize = QSize(100, 100); - QPixmap pm = w->renderPixmap(pmSize.width(), pmSize.height(), false); - - delete w; - - QImage fb = pm.toImage().convertToFormat(QImage::Format_RGB32); - QImage reference(pmSize, QImage::Format_RGB32); - reference.fill(0xffff0000); - - QFUZZY_COMPARE_IMAGES(fb, reference); -} - -class ColormapExtended : public QGLColormap -{ -public: - ColormapExtended() {} - - Qt::HANDLE handle() { return QGLColormap::handle(); } - void setHandle(Qt::HANDLE handle) { QGLColormap::setHandle(handle); } -}; - -void tst_QGL::colormap() -{ - // Check the properties of the default empty colormap. - QGLColormap cmap1; - QVERIFY(cmap1.isEmpty()); - QCOMPARE(cmap1.size(), 0); - QCOMPARE(cmap1.entryRgb(0), QRgb(0)); - QCOMPARE(cmap1.entryRgb(-1), QRgb(0)); - QCOMPARE(cmap1.entryRgb(100), QRgb(0)); - QVERIFY(!cmap1.entryColor(0).isValid()); - QVERIFY(!cmap1.entryColor(-1).isValid()); - QVERIFY(!cmap1.entryColor(100).isValid()); - QCOMPARE(cmap1.find(qRgb(255, 0, 0)), -1); - QCOMPARE(cmap1.findNearest(qRgb(255, 0, 0)), -1); - - // Set an entry and re-test. - cmap1.setEntry(56, qRgb(255, 0, 0)); - // The colormap is still considered "empty" even though it - // has entries in it now. The isEmpty() method is used to - // detect when the colormap is in use by a GL widget, - // not to detect when it is empty! - QVERIFY(cmap1.isEmpty()); - QCOMPARE(cmap1.size(), 256); - QCOMPARE(cmap1.entryRgb(0), QRgb(0)); - QVERIFY(cmap1.entryColor(0) == QColor(0, 0, 0, 255)); - QVERIFY(cmap1.entryRgb(56) == qRgb(255, 0, 0)); - QVERIFY(cmap1.entryColor(56) == QColor(255, 0, 0, 255)); - QCOMPARE(cmap1.find(qRgb(255, 0, 0)), 56); - QCOMPARE(cmap1.findNearest(qRgb(255, 0, 0)), 56); - - // Set some more entries. - static QRgb const colors[] = { - qRgb(255, 0, 0), - qRgb(0, 255, 0), - qRgb(255, 255, 255), - qRgb(0, 0, 255), - qRgb(0, 0, 0) - }; - cmap1.setEntry(57, QColor(0, 255, 0)); - cmap1.setEntries(3, colors + 2, 58); - cmap1.setEntries(5, colors, 251); - int idx; - for (idx = 0; idx < 5; ++idx) { - QVERIFY(cmap1.entryRgb(56 + idx) == colors[idx]); - QVERIFY(cmap1.entryColor(56 + idx) == QColor(colors[idx])); - QVERIFY(cmap1.entryRgb(251 + idx) == colors[idx]); - QVERIFY(cmap1.entryColor(251 + idx) == QColor(colors[idx])); - } - QCOMPARE(cmap1.size(), 256); - - // Perform color lookups. - QCOMPARE(cmap1.find(qRgb(255, 0, 0)), 56); - QCOMPARE(cmap1.find(qRgb(0, 0, 0)), 60); // Actually finds 0, 0, 0, 255. - QCOMPARE(cmap1.find(qRgba(0, 0, 0, 0)), 0); - QCOMPARE(cmap1.find(qRgb(0, 255, 0)), 57); - QCOMPARE(cmap1.find(qRgb(255, 255, 255)), 58); - QCOMPARE(cmap1.find(qRgb(0, 0, 255)), 59); - QCOMPARE(cmap1.find(qRgb(140, 0, 0)), -1); - QCOMPARE(cmap1.find(qRgb(0, 140, 0)), -1); - QCOMPARE(cmap1.find(qRgb(0, 0, 140)), -1); - QCOMPARE(cmap1.find(qRgb(64, 0, 0)), -1); - QCOMPARE(cmap1.find(qRgb(0, 64, 0)), -1); - QCOMPARE(cmap1.find(qRgb(0, 0, 64)), -1); - QCOMPARE(cmap1.findNearest(qRgb(255, 0, 0)), 56); - QCOMPARE(cmap1.findNearest(qRgb(0, 0, 0)), 60); - QCOMPARE(cmap1.findNearest(qRgba(0, 0, 0, 0)), 0); - QCOMPARE(cmap1.findNearest(qRgb(0, 255, 0)), 57); - QCOMPARE(cmap1.findNearest(qRgb(255, 255, 255)), 58); - QCOMPARE(cmap1.findNearest(qRgb(0, 0, 255)), 59); - QCOMPARE(cmap1.findNearest(qRgb(140, 0, 0)), 56); - QCOMPARE(cmap1.findNearest(qRgb(0, 140, 0)), 57); - QCOMPARE(cmap1.findNearest(qRgb(0, 0, 140)), 59); - QCOMPARE(cmap1.findNearest(qRgb(64, 0, 0)), 0); - QCOMPARE(cmap1.findNearest(qRgb(0, 64, 0)), 0); - QCOMPARE(cmap1.findNearest(qRgb(0, 0, 64)), 0); - - // Make some copies of the colormap and check that they are the same. - QGLColormap cmap2(cmap1); - QGLColormap cmap3; - cmap3 = cmap1; - QVERIFY(cmap2.isEmpty()); - QVERIFY(cmap3.isEmpty()); - QCOMPARE(cmap2.size(), 256); - QCOMPARE(cmap3.size(), 256); - for (idx = 0; idx < 256; ++idx) { - QCOMPARE(cmap1.entryRgb(idx), cmap2.entryRgb(idx)); - QCOMPARE(cmap1.entryRgb(idx), cmap3.entryRgb(idx)); - } - - // Modify an entry in one of the copies and recheck the original. - cmap2.setEntry(45, qRgb(255, 0, 0)); - for (idx = 0; idx < 256; ++idx) { - if (idx != 45) - QCOMPARE(cmap1.entryRgb(idx), cmap2.entryRgb(idx)); - else - QCOMPARE(cmap2.entryRgb(45), qRgb(255, 0, 0)); - QCOMPARE(cmap1.entryRgb(idx), cmap3.entryRgb(idx)); - } - - // Check that setting the handle will cause isEmpty() to work right. - ColormapExtended cmap4; - cmap4.setEntry(56, qRgb(255, 0, 0)); - QVERIFY(cmap4.isEmpty()); - QCOMPARE(cmap4.size(), 256); - cmap4.setHandle(Qt::HANDLE(42)); - QCOMPARE(cmap4.handle(), Qt::HANDLE(42)); - QVERIFY(!cmap4.isEmpty()); - QCOMPARE(cmap4.size(), 256); -} - -#ifndef GL_TEXTURE_3D -#define GL_TEXTURE_3D 0x806F -#endif - -#ifndef GL_RGB16 -#define GL_RGB16 0x8054 -#endif - -void tst_QGL::fboFormat() -{ - // Check the initial conditions. - QGLFramebufferObjectFormat format1; - QCOMPARE(format1.samples(), 0); - QCOMPARE(format1.attachment(), QGLFramebufferObject::NoAttachment); - QCOMPARE(int(format1.textureTarget()), int(GL_TEXTURE_2D)); - int expectedFormat = -#ifdef QT_OPENGL_ES_2 - GL_RGBA; -#else - QOpenGLContext::openGLModuleType() != QOpenGLContext::LibGL ? GL_RGBA : GL_RGBA8; -#endif - QCOMPARE(int(format1.internalTextureFormat()), expectedFormat); - - // Modify the values and re-check. - format1.setSamples(8); - format1.setAttachment(QGLFramebufferObject::CombinedDepthStencil); - format1.setTextureTarget(GL_TEXTURE_3D); - format1.setInternalTextureFormat(GL_RGB16); - QCOMPARE(format1.samples(), 8); - QCOMPARE(format1.attachment(), QGLFramebufferObject::CombinedDepthStencil); - QCOMPARE(int(format1.textureTarget()), int(GL_TEXTURE_3D)); - QCOMPARE(int(format1.internalTextureFormat()), int(GL_RGB16)); - - // Make copies and check that they are the same. - QGLFramebufferObjectFormat format2(format1); - QGLFramebufferObjectFormat format3; - QCOMPARE(format2.samples(), 8); - QCOMPARE(format2.attachment(), QGLFramebufferObject::CombinedDepthStencil); - QCOMPARE(int(format2.textureTarget()), int(GL_TEXTURE_3D)); - QCOMPARE(int(format2.internalTextureFormat()), int(GL_RGB16)); - format3 = format1; - QCOMPARE(format3.samples(), 8); - QCOMPARE(format3.attachment(), QGLFramebufferObject::CombinedDepthStencil); - QCOMPARE(int(format3.textureTarget()), int(GL_TEXTURE_3D)); - QCOMPARE(int(format3.internalTextureFormat()), int(GL_RGB16)); - - // Modify the copies and check that the original is unchanged. - format2.setSamples(9); - format3.setTextureTarget(GL_TEXTURE_2D); - QCOMPARE(format1.samples(), 8); - QCOMPARE(format1.attachment(), QGLFramebufferObject::CombinedDepthStencil); - QCOMPARE(int(format1.textureTarget()), int(GL_TEXTURE_3D)); - QCOMPARE(int(format1.internalTextureFormat()), int(GL_RGB16)); - - // operator== and operator!= for QGLFramebufferObjectFormat. - QGLFramebufferObjectFormat format1c; - QGLFramebufferObjectFormat format2c; - - QCOMPARE(format1c, format2c); - QVERIFY(!(format1c != format2c)); - format1c.setSamples(8); - QVERIFY(!(format1c == format2c)); - QVERIFY(format1c != format2c); - format2c.setSamples(8); - QCOMPARE(format1c, format2c); - QVERIFY(!(format1c != format2c)); - - format1c.setAttachment(QGLFramebufferObject::CombinedDepthStencil); - QVERIFY(!(format1c == format2c)); - QVERIFY(format1c != format2c); - format2c.setAttachment(QGLFramebufferObject::CombinedDepthStencil); - QCOMPARE(format1c, format2c); - QVERIFY(!(format1c != format2c)); - - format1c.setTextureTarget(GL_TEXTURE_3D); - QVERIFY(!(format1c == format2c)); - QVERIFY(format1c != format2c); - format2c.setTextureTarget(GL_TEXTURE_3D); - QCOMPARE(format1c, format2c); - QVERIFY(!(format1c != format2c)); - - format1c.setInternalTextureFormat(GL_RGB16); - QVERIFY(!(format1c == format2c)); - QVERIFY(format1c != format2c); - format2c.setInternalTextureFormat(GL_RGB16); - QCOMPARE(format1c, format2c); - QVERIFY(!(format1c != format2c)); - - QGLFramebufferObjectFormat format3c(format1c); - QGLFramebufferObjectFormat format4c; - QCOMPARE(format1c, format3c); - QVERIFY(!(format1c != format3c)); - format3c.setInternalTextureFormat( -#ifdef QT_OPENGL_ES_2 - GL_RGBA -#else - QOpenGLContext::openGLModuleType() != QOpenGLContext::LibGL ? GL_RGBA : GL_RGBA8 -#endif - ); - QVERIFY(!(format1c == format3c)); - QVERIFY(format1c != format3c); - - format4c = format1c; - QCOMPARE(format1c, format4c); - QVERIFY(!(format1c != format4c)); - format4c.setInternalTextureFormat( -#ifdef QT_OPENGL_ES_2 - GL_RGBA -#else - QOpenGLContext::openGLModuleType() != QOpenGLContext::LibGL ? GL_RGBA : GL_RGBA8 -#endif - ); - QVERIFY(!(format1c == format4c)); - QVERIFY(format1c != format4c); -} - -void tst_QGL::testDontCrashOnDanglingResources() -{ - // We have a number of Q_GLOBAL_STATICS inside the Qt OpenGL - // module. This test is verify that we don't crash as a result of - // them calling into libgl on application shutdown. - QWidget *widget = new UnclippedWidget(); - widget->show(); - qApp->processEvents(); - widget->hide(); -} - -class ReplaceClippingGLWidget : public QGLWidget -{ -public: - void paint(QPainter *painter) - { - painter->fillRect(rect(), Qt::white); - - QPainterPath path; - path.addRect(0, 0, 100, 100); - path.addRect(50, 50, 100, 100); - - painter->setClipRect(0, 0, 150, 150); - painter->fillPath(path, Qt::red); - - painter->translate(150, 150); - painter->setClipRect(0, 0, 150, 150); - painter->fillPath(path, Qt::red); - } - -protected: - void paintEvent(QPaintEvent*) - { - // clear the stencil with junk - QOpenGLFunctions *funcs = QOpenGLContext::currentContext()->functions(); - funcs->glStencilMask(0xFFFF); - funcs->glClearStencil(0xFFFF); - funcs->glDisable(GL_STENCIL_TEST); - funcs->glDisable(GL_SCISSOR_TEST); - funcs->glClear(GL_STENCIL_BUFFER_BIT); - - QPainter painter(this); - paint(&painter); - } -}; - -void tst_QGL::replaceClipping() -{ - ReplaceClippingGLWidget glw; - glw.resize(300, 300); - glw.show(); - - QVERIFY(QTest::qWaitForWindowExposed(&glw)); - - QImage reference(300, 300, QImage::Format_RGB32); - QPainter referencePainter(&reference); - glw.paint(&referencePainter); - referencePainter.end(); - -#if defined(Q_OS_QNX) - // glReadPixels reads from the back buffer. On QNX the buffer is not preserved - // after a buffer swap. This is why we have to swap the buffer explicitly before calling - // grabFrameBuffer to retrieve the content of the front buffer - glw.swapBuffers(); -#endif - const QImage widgetFB = glw.grabFrameBuffer(false).convertToFormat(QImage::Format_RGB32); - - // Sample pixels in a grid pattern which avoids false failures due to - // off-by-one pixel errors on some buggy GL implementations - for (int x = 25; x < reference.width(); x += 50) { - for (int y = 25; y < reference.width(); y += 50) { - QFUZZY_COMPARE_PIXELS(widgetFB.pixel(x, y), reference.pixel(x, y)); - } - } -} - -class ClipTestGLWidget : public QGLWidget -{ -public: - void paint(QPainter *painter) - { - painter->fillRect(-1, -1, width()+2, height()+2, Qt::white); - painter->setClipRect(10, 10, width()-20, height()-20); - painter->fillRect(rect(), Qt::cyan); - - painter->save(); - painter->setClipRect(10, 10, 100, 100, Qt::IntersectClip); - - painter->fillRect(rect(), Qt::blue); - - painter->save(); - painter->setClipRect(10, 10, 50, 50, Qt::IntersectClip); - painter->fillRect(rect(), Qt::red); - painter->restore(); - painter->fillRect(0, 0, 40, 40, Qt::white); - painter->save(); - - painter->setClipRect(0, 0, 35, 35, Qt::IntersectClip); - painter->fillRect(rect(), Qt::black); - painter->restore(); - - painter->fillRect(0, 0, 30, 30, Qt::magenta); - - painter->save(); - painter->setClipRect(60, 10, 50, 50, Qt::ReplaceClip); - painter->fillRect(rect(), Qt::green); - painter->restore(); - - painter->restore(); - - painter->translate(100, 100); - - { - QPainterPath path; - path.addRect(10, 10, 100, 100); - path.addRect(10, 10, 10, 10); - painter->setClipPath(path, Qt::IntersectClip); - } - - painter->fillRect(rect(), Qt::blue); - - painter->save(); - { - QPainterPath path; - path.addRect(10, 10, 50, 50); - path.addRect(10, 10, 10, 10); - painter->setClipPath(path, Qt::IntersectClip); - } - painter->fillRect(rect(), Qt::red); - painter->restore(); - painter->fillRect(0, 0, 40, 40, Qt::white); - painter->save(); - - { - QPainterPath path; - path.addRect(0, 0, 35, 35); - path.addRect(10, 10, 10, 10); - painter->setClipPath(path, Qt::IntersectClip); - } - painter->fillRect(rect(), Qt::black); - painter->restore(); - - painter->fillRect(0, 0, 30, 30, Qt::magenta); - - painter->save(); - { - QPainterPath path; - path.addRect(60, 10, 50, 50); - path.addRect(10, 10, 10, 10); - painter->setClipPath(path, Qt::ReplaceClip); - } - painter->fillRect(rect(), Qt::green); - painter->restore(); - } - -protected: - void paintEvent(QPaintEvent*) - { - QPainter painter(this); - paint(&painter); - } -}; - -void tst_QGL::clipTest() -{ - ClipTestGLWidget glw; - glw.resize(220, 220); - glw.showNormal(); - - QVERIFY(QTest::qWaitForWindowExposed(&glw)); - - QImage reference(glw.size(), QImage::Format_RGB32); - QPainter referencePainter(&reference); - glw.paint(&referencePainter); - referencePainter.end(); - -#if defined(Q_OS_QNX) - // glReadPixels reads from the back buffer. On QNX the buffer is not preserved - // after a buffer swap. This is why we have to swap the buffer explicitly before calling - // grabFrameBuffer to retrieve the content of the front buffer - glw.swapBuffers(); -#endif - const QImage widgetFB = glw.grabFrameBuffer(false).convertToFormat(QImage::Format_RGB32); - - // Sample pixels in a grid pattern which avoids false failures due to - // off-by-one pixel errors on some buggy GL implementations - for (int x = 2; x < reference.width(); x += 5) { - for (int y = 2; y < reference.height(); y += 5) { - QFUZZY_COMPARE_PIXELS(widgetFB.pixel(x, y), reference.pixel(x, y)); - } - } -} - -void tst_QGL::destroyFBOAfterContext() -{ - if (!QGLFramebufferObject::hasOpenGLFramebufferObjects()) - QSKIP("QGLFramebufferObject not supported on this platform"); - - QGLWidget *glw = new QGLWidget(); - glw->makeCurrent(); - - // No multisample with combined depth/stencil attachment: - QGLFramebufferObjectFormat fboFormat; - fboFormat.setAttachment(QGLFramebufferObject::CombinedDepthStencil); - - // Don't complicate things by using NPOT: - QGLFramebufferObject *fbo = new QGLFramebufferObject(256, 128, fboFormat); - - // The handle should be valid until the context is destroyed. - QVERIFY(fbo->handle() != 0); - QVERIFY(fbo->isValid()); - - delete glw; - - // The handle should now be zero. - QVERIFY(!fbo->handle()); - QVERIFY(!fbo->isValid()); - - delete fbo; -} - -#ifdef QT_BUILD_INTERNAL - -class tst_QGLResource -{ -public: - tst_QGLResource(const QGLContext * = 0) {} - ~tst_QGLResource() { ++deletions; } - - static int deletions; -}; - -int tst_QGLResource::deletions = 0; - -#ifdef TODO -Q_GLOBAL_STATIC(QOpenGLContextGroupResource<tst_QGLResource>, qt_shared_test) -#endif //TODO -#endif // QT_BUILD_INTERNAL - -#ifdef QT_BUILD_INTERNAL -void tst_QGL::shareRegister() -{ -#ifdef TODO - // Create a context. - QGLWidget *glw1 = new QGLWidget(); - glw1->makeCurrent(); - - // Nothing should be sharing with glw1's context yet. - QVERIFY(!glw1->isSharing()); - - // Create a guard for the first context. - QOpenGLSharedResourceGuard guard(glw1->context()->contextHandle()); - QCOMPARE(guard.id(), 0); - guard.setId(3); - QCOMPARE(guard.id(), 3); - - // Request a tst_QGLResource object for the first context. - tst_QGLResource *res1 = qt_shared_test()->value(glw1->context()->contextHandle()); - QVERIFY(res1); - QCOMPARE(qt_shared_test()->value(glw1->context()->contextHandle()), res1); - - // Create another context that shares with the first. - QVERIFY(!glw1->isSharing()); - QGLWidget *glw2 = new QGLWidget(0, glw1); - if (!glw2->isSharing()) { - delete glw2; - delete glw1; - QSKIP("Context sharing is not supported"); - } - QVERIFY(glw1->isSharing()); - QVERIFY(glw1->context() != glw2->context()); - - // Check that the first context's resource is also on the second. - QCOMPARE(qt_shared_test()->value(glw1->context()), res1); - QCOMPARE(qt_shared_test()->value(glw2->context()), res1); - - // Guard should still be the same. - QCOMPARE(guard.context(), glw1->context()); - QCOMPARE(guard.id(), 3); - - // Check the sharing relationships. - QVERIFY(QGLContext::areSharing(glw1->context(), glw1->context())); - QVERIFY(QGLContext::areSharing(glw2->context(), glw2->context())); - QVERIFY(QGLContext::areSharing(glw1->context(), glw2->context())); - QVERIFY(QGLContext::areSharing(glw2->context(), glw1->context())); - QVERIFY(!QGLContext::areSharing(0, glw2->context())); - QVERIFY(!QGLContext::areSharing(glw1->context(), 0)); - QVERIFY(!QGLContext::areSharing(0, 0)); - - // Create a third context, not sharing with the others. - QGLWidget *glw3 = new QGLWidget(); - QVERIFY(!glw3->isSharing()); - - // Create a guard on the standalone context. - QGLSharedResourceGuard guard3(glw3->context()); - guard3.setId(5); - - // Request a resource to the third context. - tst_QGLResource *res3 = qt_shared_test()->value(glw3->context()); - QVERIFY(res3); - QCOMPARE(qt_shared_test()->value(glw1->context()), res1); - QCOMPARE(qt_shared_test()->value(glw2->context()), res1); - QCOMPARE(qt_shared_test()->value(glw3->context()), res3); - - // Check the sharing relationships again. - QVERIFY(QGLContext::areSharing(glw1->context(), glw1->context())); - QVERIFY(QGLContext::areSharing(glw2->context(), glw2->context())); - QVERIFY(QGLContext::areSharing(glw1->context(), glw2->context())); - QVERIFY(QGLContext::areSharing(glw2->context(), glw1->context())); - QVERIFY(!QGLContext::areSharing(glw1->context(), glw3->context())); - QVERIFY(!QGLContext::areSharing(glw2->context(), glw3->context())); - QVERIFY(!QGLContext::areSharing(glw3->context(), glw1->context())); - QVERIFY(!QGLContext::areSharing(glw3->context(), glw2->context())); - QVERIFY(QGLContext::areSharing(glw3->context(), glw3->context())); - QVERIFY(!QGLContext::areSharing(0, glw2->context())); - QVERIFY(!QGLContext::areSharing(glw1->context(), 0)); - QVERIFY(!QGLContext::areSharing(0, glw3->context())); - QVERIFY(!QGLContext::areSharing(glw3->context(), 0)); - QVERIFY(!QGLContext::areSharing(0, 0)); - - // Shared guard should still be the same. - QCOMPARE(guard.context(), glw1->context()); - QCOMPARE(guard.id(), 3); - - // Delete the first context. - delete glw1; - - // The second context should no longer register as sharing. - QVERIFY(!glw2->isSharing()); - - // The first context's resource should transfer to the second context. - QCOMPARE(tst_QGLResource::deletions, 0); - QCOMPARE(qt_shared_test()->value(glw2->context()), res1); - QCOMPARE(qt_shared_test()->value(glw3->context()), res3); - - // Shared guard should now be the second context, with the id the same. - QCOMPARE(guard.context(), glw2->context()); - QCOMPARE(guard.id(), 3); - QCOMPARE(guard3.context(), glw3->context()); - QCOMPARE(guard3.id(), 5); - - // Clean up and check that the resources are properly deleted. - delete glw2; - QCOMPARE(tst_QGLResource::deletions, 1); - delete glw3; - QCOMPARE(tst_QGLResource::deletions, 2); - - // Guards should now be null and the id zero. - QVERIFY(guard.context() == 0); - QVERIFY(guard.id() == 0); - QVERIFY(guard3.context() == 0); - QVERIFY(guard3.id() == 0); -#endif //TODO -} -#endif - -// Tests QGLContext::bindTexture with default options -#ifdef QT_BUILD_INTERNAL -void tst_QGL::qglContextDefaultBindTexture() -{ - QGLWidget w; - w.makeCurrent(); - QGLContext *ctx = const_cast<QGLContext*>(w.context()); - - QImage *boundImage = new QImage(256, 256, QImage::Format_RGB32); - boundImage->fill(0xFFFFFFFF); - QPixmap *boundPixmap = new QPixmap(256, 256); - boundPixmap->fill(Qt::red); - - int startCacheItemCount = QGLTextureCache::instance()->size(); - - GLuint boundImageTextureId = ctx->bindTexture(*boundImage); - GLuint boundPixmapTextureId = ctx->bindTexture(*boundPixmap); - - // Make sure the image & pixmap have been added to the cache: - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount+2); - - // Make sure the image & pixmap have the is_cached flag set: - QVERIFY(QImagePixmapCleanupHooks::isImageCached(*boundImage)); - QVERIFY(QImagePixmapCleanupHooks::isPixmapCached(*boundPixmap)); - - QOpenGLFunctions *funcs = QOpenGLContext::currentContext()->functions(); - // Make sure the texture IDs returned are valid: - QCOMPARE(funcs->glIsTexture(boundImageTextureId), GLboolean(GL_TRUE)); - QCOMPARE(funcs->glIsTexture(boundPixmapTextureId), GLboolean(GL_TRUE)); - - // Make sure the textures are still valid after we delete the image/pixmap: - // Also check that although the textures are left intact, the cache entries are removed: - delete boundImage; - boundImage = 0; - QCOMPARE(funcs->glIsTexture(boundImageTextureId), GLboolean(GL_TRUE)); - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount+1); - delete boundPixmap; - boundPixmap = 0; - QCOMPARE(funcs->glIsTexture(boundPixmapTextureId), GLboolean(GL_TRUE)); - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount); - - // Finally, make sure QGLContext::deleteTexture deletes the texture IDs: - ctx->deleteTexture(boundImageTextureId); - ctx->deleteTexture(boundPixmapTextureId); - QCOMPARE(funcs->glIsTexture(boundImageTextureId), GLboolean(GL_FALSE)); - QCOMPARE(funcs->glIsTexture(boundPixmapTextureId), GLboolean(GL_FALSE)); -} -#endif - -#ifdef QT_BUILD_INTERNAL -void tst_QGL::textureCleanup() -{ - QGLWidget w; - w.resize(200,200); - w.show(); - QVERIFY(QTest::qWaitForWindowExposed(&w)); - w.makeCurrent(); - - // Test pixmaps which have been loaded via QPixmapCache are removed from the texture cache - // when the pixmap cache is cleared - { - int startCacheItemCount = QGLTextureCache::instance()->size(); - QPainter p(&w); - - QPixmap boundPixmap(":designer.png"); - - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount); - - p.drawPixmap(0, 0, boundPixmap); - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount+1); - - // Need to call end for the GL2 paint engine to release references to pixmap if using tfp - p.end(); - - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount+1); - - // Check that the texture doesn't get removed from the cache when the pixmap is cleared - // as it should still be in the cache: - boundPixmap = QPixmap(); - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount+1); - - QPixmapCache::clear(); - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount); - } - - // Test pixmaps which have been loaded via QPixmapCache are removed from the texture cache - // when they are explicitly removed from the pixmap cache - { - int startCacheItemCount = QGLTextureCache::instance()->size(); - QPainter p(&w); - - QPixmap boundPixmap(128, 128); - QString cacheKey = QString::fromLatin1("myPixmap"); - QPixmapCache::insert(cacheKey, boundPixmap); - - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount); - - p.drawPixmap(0, 0, boundPixmap); - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount+1); - - // Need to call end for the GL2 paint engine to release references to pixmap if using tfp - p.end(); - - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount+1); - - // Check that the texture doesn't get removed from the cache when the pixmap is cleared - // as it should still be in the cache: - boundPixmap = QPixmap(); - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount+1); - - // Finally, we check that the texture cache entry is removed when we remove the - // pixmap cache entry, which should hold the last reference: - QPixmapCache::remove(cacheKey); - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount); - } - - // Check images & pixmaps are removed from the cache when they are deleted - { - int startCacheItemCount = QGLTextureCache::instance()->size(); - QPainter p(&w); - - QImage *boundImage = new QImage(256, 256, QImage::Format_RGB32); - boundImage->fill(0xFFFFFFFF); - QPixmap *boundPixmap = new QPixmap(256, 256); - boundPixmap->fill(Qt::red); - - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount); - - p.drawImage(0, 0, *boundImage); - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount+1); - - p.drawPixmap(0, 0, *boundPixmap); - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount+2); - - // Need to call end for the GL2 paint engine to release references to pixmap if using tfp - p.end(); - - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount+2); - - delete boundImage; - boundImage = 0; - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount+1); - - delete boundPixmap; - boundPixmap = 0; - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount); - } - - // Check images & pixmaps are removed from the cache when they are assigned to - { - int startCacheItemCount = QGLTextureCache::instance()->size(); - QPainter p(&w); - - QImage boundImage(256, 256, QImage::Format_RGB32); - boundImage.fill(0xFFFFFFFF); - QPixmap boundPixmap(256, 256); - boundPixmap.fill(Qt::red); - - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount); - - p.drawImage(0, 0, boundImage); - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount+1); - - p.drawPixmap(0, 0, boundPixmap); - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount+2); - - // Need to call end for the GL2 paint engine to release references to pixmap if using tfp - p.end(); - - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount+2); - - boundImage = QImage(64, 64, QImage::Format_RGB32); - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount+1); - - boundPixmap = QPixmap(64, 64); - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount); - } - - // Check images & pixmaps are removed from the cache when they are modified (detached) - { - int startCacheItemCount = QGLTextureCache::instance()->size(); - QPainter p(&w); - - QImage boundImage(256, 256, QImage::Format_RGB32); - boundImage.fill(0xFFFFFFFF); - QPixmap boundPixmap(256, 256); - boundPixmap.fill(Qt::red); - - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount); - - p.drawImage(0, 0, boundImage); - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount+1); - - p.drawPixmap(0, 0, boundPixmap); - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount+2); - - // Need to call end for the GL2 paint engine to release references to pixmap if using tfp - p.end(); - - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount+2); - - boundImage.fill(0x00000000); - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount+1); - - boundPixmap.fill(Qt::blue); - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount); - } - - // Check that images/pixmaps aren't removed from the cache if a shallow copy has been made - QImage copyOfImage; - QPixmap copyOfPixmap; - int startCacheItemCount = QGLTextureCache::instance()->size(); - { - QPainter p(&w); - - QImage boundImage(256, 256, QImage::Format_RGB32); - boundImage.fill(0xFFFFFFFF); - QPixmap boundPixmap(256, 256); - boundPixmap.fill(Qt::red); - - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount); - - p.drawImage(0, 0, boundImage); - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount+1); - - p.drawPixmap(0, 0, boundPixmap); - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount+2); - - // Need to call end for the GL2 paint engine to release references to pixmap if using tfp - p.end(); - - copyOfImage = boundImage; - copyOfPixmap = boundPixmap; - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount+2); - } // boundImage & boundPixmap would have been deleted when they went out of scope - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount+2); - - copyOfImage = QImage(); - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount+1); - - copyOfPixmap = QPixmap(); - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount); -} -#endif - -namespace ThreadImages { - -class Producer : public QObject -{ - Q_OBJECT -public: - Producer() - { - startTimer(20); - - QThread *thread = new QThread; - thread->start(); - - connect(this, SIGNAL(destroyed()), thread, SLOT(quit())); - - moveToThread(thread); - connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); - } - -signals: - void imageReady(const QImage &image); - -protected: - void timerEvent(QTimerEvent *) - { - QImage image(256, 256, QImage::Format_RGB32); - QLinearGradient g(0, 0, 0, 256); - g.setColorAt(0, QColor(255, 180, 180)); - g.setColorAt(1, Qt::white); - g.setSpread(QGradient::ReflectSpread); - - QBrush brush(g); - brush.setTransform(QTransform::fromTranslate(0, delta)); - delta += 10; - - QPainter p(&image); - p.fillRect(image.rect(), brush); - - if (images.size() > 10) - images.removeFirst(); - - images.append(image); - - emit imageReady(image); - } - -private: - QList<QImage> images; - int delta; -}; - - -class DisplayWidget : public QGLWidget -{ - Q_OBJECT -public: - DisplayWidget(QWidget *parent) : QGLWidget(parent) {} - void paintEvent(QPaintEvent *) - { - QPainter p(this); - p.drawImage(rect(), m_image); - } - -public slots: - void setImage(const QImage &image) - { - m_image = image; - update(); - } - -private: - QImage m_image; -}; - -class Widget : public QWidget -{ - Q_OBJECT -public: - Widget() - : iterations(0) - , display(0) - , producer(new Producer) - { - startTimer(400); - connect(this, SIGNAL(destroyed()), producer, SLOT(deleteLater())); - } - - int iterations; - -protected: - void timerEvent(QTimerEvent *) - { - ++iterations; - - delete display; - display = new DisplayWidget(this); - connect(producer, SIGNAL(imageReady(QImage)), display, SLOT(setImage(QImage))); - - display->setGeometry(rect()); - display->show(); - } - -private: - DisplayWidget *display; - Producer *producer; -}; - -} - -void tst_QGL::threadImages() -{ - ThreadImages::Widget *widget = new ThreadImages::Widget; - widget->show(); - - while (widget->iterations <= 5) { - qApp->processEvents(); - } - - delete widget; -} - -void tst_QGL::nullRectCrash() -{ - if (!QGLFramebufferObject::hasOpenGLFramebufferObjects()) - QSKIP("QGLFramebufferObject not supported on this platform"); - - QGLWidget glw; - glw.makeCurrent(); - - QGLFramebufferObjectFormat fboFormat; - fboFormat.setAttachment(QGLFramebufferObject::CombinedDepthStencil); - - QGLFramebufferObject *fbo = new QGLFramebufferObject(128, 128, fboFormat); - - QPainter fboPainter(fbo); - - fboPainter.setPen(QPen(QColor(255, 127, 127, 127), 2)); - fboPainter.setBrush(QColor(127, 255, 127, 127)); - fboPainter.drawRect(QRectF()); - - fboPainter.end(); -} - -void tst_QGL::extensions() -{ - QGLWidget glw; - glw.makeCurrent(); - - QOpenGLContext *ctx = QOpenGLContext::currentContext(); - QVERIFY(ctx); - QOpenGLFunctions *funcs = ctx->functions(); - QVERIFY(funcs); - QSurfaceFormat format = ctx->format(); - -#ifdef QT_BUILD_INTERNAL - QOpenGLExtensions *exts = static_cast<QOpenGLExtensions *>(funcs); - QOpenGLExtensions::OpenGLExtensions allExts = exts->openGLExtensions(); - // Mipmapping is always available in GL2/GLES2+. Verify this. - if (format.majorVersion() >= 2) - QVERIFY(allExts.testFlag(QOpenGLExtensions::GenerateMipmap)); -#endif - - // Now look for some features should always be available in a given version. - QOpenGLFunctions::OpenGLFeatures allFeatures = funcs->openGLFeatures(); - QVERIFY(allFeatures.testFlag(QOpenGLFunctions::Multitexture)); - if (format.majorVersion() >= 2) { - QVERIFY(allFeatures.testFlag(QOpenGLFunctions::Shaders)); - QVERIFY(allFeatures.testFlag(QOpenGLFunctions::Buffers)); - QVERIFY(allFeatures.testFlag(QOpenGLFunctions::Multisample)); - QVERIFY(!ctx->isOpenGLES() || allFeatures.testFlag(QOpenGLFunctions::Framebuffers)); - QVERIFY(allFeatures.testFlag(QOpenGLFunctions::NPOTTextures) - && allFeatures.testFlag(QOpenGLFunctions::NPOTTextureRepeat)); - if (ctx->isOpenGLES()) { - QVERIFY(!allFeatures.testFlag(QOpenGLFunctions::FixedFunctionPipeline)); - QVERIFY(allFeatures.testFlag(QOpenGLFunctions::Framebuffers)); - } - } - if (format.majorVersion() >= 3) - QVERIFY(allFeatures.testFlag(QOpenGLFunctions::Framebuffers)); -} - -QTEST_MAIN(tst_QGL) -#include "tst_qgl.moc" diff --git a/tests/auto/opengl/qglbuffer/qglbuffer.pro b/tests/auto/opengl/qglbuffer/qglbuffer.pro deleted file mode 100644 index f12a191f79..0000000000 --- a/tests/auto/opengl/qglbuffer/qglbuffer.pro +++ /dev/null @@ -1,10 +0,0 @@ -############################################################ -# Project file for autotest for file qglbuffer.h -############################################################ - -CONFIG += testcase -TARGET = tst_qglbuffer -requires(qtHaveModule(opengl)) -QT += opengl widgets testlib - -SOURCES += tst_qglbuffer.cpp diff --git a/tests/auto/opengl/qglbuffer/tst_qglbuffer.cpp b/tests/auto/opengl/qglbuffer/tst_qglbuffer.cpp deleted file mode 100644 index c7d26e757f..0000000000 --- a/tests/auto/opengl/qglbuffer/tst_qglbuffer.cpp +++ /dev/null @@ -1,257 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtOpenGL module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtTest/QtTest> -#include <QtOpenGL/qgl.h> -#include <QtOpenGL/qglbuffer.h> - -class tst_QGLBuffer : public QObject -{ - Q_OBJECT -public: - tst_QGLBuffer() {} - ~tst_QGLBuffer() {} - -private slots: - void vertexBuffer_data(); - void vertexBuffer(); - void indexBuffer_data(); - void indexBuffer(); - void bufferSharing(); - -private: - void testBuffer(QGLBuffer::Type type); -}; - -void tst_QGLBuffer::vertexBuffer_data() -{ - QTest::addColumn<int>("usagePattern"); - - QTest::newRow("StreamDraw") << int(QGLBuffer::StreamDraw); - QTest::newRow("StaticDraw") << int(QGLBuffer::StaticDraw); - QTest::newRow("DynamicDraw") << int(QGLBuffer::DynamicDraw); -} - -void tst_QGLBuffer::vertexBuffer() -{ - testBuffer(QGLBuffer::VertexBuffer); -} - -void tst_QGLBuffer::indexBuffer_data() -{ - vertexBuffer_data(); -} - -void tst_QGLBuffer::indexBuffer() -{ - testBuffer(QGLBuffer::IndexBuffer); -} - -void tst_QGLBuffer::testBuffer(QGLBuffer::Type type) -{ - QFETCH(int, usagePattern); - - QGLWidget w; - w.makeCurrent(); - - // Create the local object, but not the buffer in the server. - QGLBuffer buffer(type); - QCOMPARE(buffer.usagePattern(), QGLBuffer::StaticDraw); - buffer.setUsagePattern(QGLBuffer::UsagePattern(usagePattern)); - - // Check the initial state. - QCOMPARE(buffer.type(), type); - QVERIFY(!buffer.isCreated()); - QCOMPARE(buffer.bufferId(), GLuint(0)); - QCOMPARE(buffer.usagePattern(), QGLBuffer::UsagePattern(usagePattern)); - QCOMPARE(buffer.size(), -1); - - // Should not be able to bind it yet because it isn't created. - QVERIFY(!buffer.bind()); - - // Create the buffer - if this fails, then assume that the - // GL implementation does not support buffers at all. - if (!buffer.create()) - QSKIP("Buffers are not supported on this platform"); - - // Should now have a buffer id. - QVERIFY(buffer.bufferId() != 0); - - // Bind the buffer and upload some data. - QVERIFY(buffer.bind()); - static GLfloat const data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; - buffer.allocate(data, sizeof(data)); - - // Check the buffer size. - QCOMPARE(buffer.size(), int(sizeof(data))); - - // Map the buffer and read back its contents. - bool haveMap = false; - GLfloat *mapped = reinterpret_cast<GLfloat *> - (buffer.map(QGLBuffer::ReadOnly)); - if (mapped) { - for (int index = 0; index < 9; ++index) - QCOMPARE(mapped[index], data[index]); - buffer.unmap(); - haveMap = true; - } else { - qWarning("QGLBuffer::map() is not supported on this platform"); - } - - // Read back the buffer contents using read(). - bool haveRead = false; - GLfloat readdata[9]; - if (buffer.read(0, readdata, sizeof(readdata))) { - for (int index = 0; index < 9; ++index) - QCOMPARE(readdata[index], data[index]); - haveRead = true; - } else { - qWarning("QGLBuffer::read() is not supported on this platform"); - } - - // Write some different data to a specific location and check it. - static GLfloat const diffdata[] = {11, 12, 13}; - buffer.write(sizeof(GLfloat) * 3, diffdata, sizeof(diffdata)); - if (haveMap) { - mapped = reinterpret_cast<GLfloat *>(buffer.map(QGLBuffer::ReadOnly)); - QVERIFY(mapped != 0); - for (int index = 0; index < 9; ++index) { - if (index >= 3 && index <= 5) - QCOMPARE(mapped[index], diffdata[index - 3]); - else - QCOMPARE(mapped[index], data[index]); - } - buffer.unmap(); - } - if (haveRead) { - QVERIFY(buffer.read(0, readdata, sizeof(readdata))); - for (int index = 0; index < 9; ++index) { - if (index >= 3 && index <= 5) - QCOMPARE(readdata[index], diffdata[index - 3]); - else - QCOMPARE(readdata[index], data[index]); - } - } - - // Write to the buffer using the return value from map. - if (haveMap) { - mapped = reinterpret_cast<GLfloat *>(buffer.map(QGLBuffer::WriteOnly)); - QVERIFY(mapped != 0); - mapped[6] = 14; - buffer.unmap(); - - mapped = reinterpret_cast<GLfloat *>(buffer.map(QGLBuffer::ReadOnly)); - QVERIFY(mapped != 0); - static GLfloat const diff2data[] = {11, 12, 13, 14}; - for (int index = 0; index < 9; ++index) { - if (index >= 3 && index <= 6) - QCOMPARE(mapped[index], diff2data[index - 3]); - else - QCOMPARE(mapped[index], data[index]); - } - buffer.unmap(); - } - - // Resize the buffer. - buffer.allocate(sizeof(GLfloat) * 20); - QCOMPARE(buffer.size(), int(sizeof(GLfloat) * 20)); - buffer.allocate(0, sizeof(GLfloat) * 32); - QCOMPARE(buffer.size(), int(sizeof(GLfloat) * 32)); - - // Release the buffer. - buffer.release(); -} - -void tst_QGLBuffer::bufferSharing() -{ -#if defined(Q_OS_WIN) - // Needs investigation on Windows: QTBUG-29692 - QSKIP("Unreproducible timeout on Windows (MSVC/MinGW) CI bots"); -#endif - -#if defined(Q_OS_QNX) - QSKIP("Crashes on QNX when destroying the second QGLWidget (see QTBUG-38275)"); -#endif - - QGLWidget *w1 = new QGLWidget(); - w1->makeCurrent(); - - QGLWidget *w2 = new QGLWidget(0, w1); - if (!w2->isSharing()) { - delete w2; - delete w1; - QSKIP("Context sharing is not supported on this platform"); - } - - // Bind the buffer in the first context and write some data to it. - QGLBuffer buffer(QGLBuffer::VertexBuffer); - if (!buffer.create()) - QSKIP("Buffers are not supported on this platform"); - QVERIFY(buffer.isCreated()); - QVERIFY(buffer.bind()); - static GLfloat const data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; - buffer.allocate(data, sizeof(data)); - QCOMPARE(buffer.size(), int(sizeof(data))); - buffer.release(); - - // Bind the buffer in the second context and read back the data. - w2->makeCurrent(); - QVERIFY(buffer.bind()); - QCOMPARE(buffer.size(), int(sizeof(data))); - GLfloat readdata[9]; - if (buffer.read(0, readdata, sizeof(readdata))) { - for (int index = 0; index < 9; ++index) - QCOMPARE(readdata[index], data[index]); - } - buffer.release(); - - // Delete the first context. - delete w1; - - // Make the second context current again because deleting the first - // one will call doneCurrent() even though it wasn't current! - w2->makeCurrent(); - - // The buffer should still be valid in the second context. - QVERIFY(buffer.bufferId() != 0); - QVERIFY(buffer.isCreated()); - QVERIFY(buffer.bind()); - QCOMPARE(buffer.size(), int(sizeof(data))); - buffer.release(); - - // Delete the second context. - delete w2; - - // The buffer should now be invalid. - QCOMPARE(buffer.bufferId(), GLuint(0)); - QVERIFY(!buffer.isCreated()); -} - -QTEST_MAIN(tst_QGLBuffer) - -#include "tst_qglbuffer.moc" diff --git a/tests/auto/opengl/qglfunctions/qglfunctions.pro b/tests/auto/opengl/qglfunctions/qglfunctions.pro deleted file mode 100644 index 9b349eaf34..0000000000 --- a/tests/auto/opengl/qglfunctions/qglfunctions.pro +++ /dev/null @@ -1,6 +0,0 @@ -CONFIG += testcase -TARGET = tst_qglfunctions -requires(qtHaveModule(opengl)) -QT += opengl widgets testlib - -SOURCES += tst_qglfunctions.cpp diff --git a/tests/auto/opengl/qglfunctions/tst_qglfunctions.cpp b/tests/auto/opengl/qglfunctions/tst_qglfunctions.cpp deleted file mode 100644 index 93d06659c9..0000000000 --- a/tests/auto/opengl/qglfunctions/tst_qglfunctions.cpp +++ /dev/null @@ -1,233 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtOpenGL module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtTest/QtTest> -#include <QtOpenGL/qglfunctions.h> - -class tst_QGLFunctions : public QObject -{ - Q_OBJECT -public: - tst_QGLFunctions() {} - ~tst_QGLFunctions() {} - -private slots: - void features(); - void multitexture(); - void blendColor(); - -private: - static bool hasExtension(const char *name); -}; - -bool tst_QGLFunctions::hasExtension(const char *name) -{ - QString extensions = - QString::fromLatin1 - (reinterpret_cast<const char *>(QOpenGLContext::currentContext()->functions()->glGetString(GL_EXTENSIONS))); - return extensions.split(QLatin1Char(' ')).contains - (QString::fromLatin1(name)); -} - -// Check that the reported features are consistent with the platform. -void tst_QGLFunctions::features() -{ - // Before being associated with a context, there should be - // no features enabled. - QGLFunctions funcs; - QVERIFY(!funcs.openGLFeatures()); - QVERIFY(!funcs.hasOpenGLFeature(QGLFunctions::Multitexture)); - QVERIFY(!funcs.hasOpenGLFeature(QGLFunctions::Shaders)); - QVERIFY(!funcs.hasOpenGLFeature(QGLFunctions::Buffers)); - QVERIFY(!funcs.hasOpenGLFeature(QGLFunctions::Framebuffers)); - QVERIFY(!funcs.hasOpenGLFeature(QGLFunctions::BlendColor)); - QVERIFY(!funcs.hasOpenGLFeature(QGLFunctions::BlendEquation)); - QVERIFY(!funcs.hasOpenGLFeature(QGLFunctions::BlendEquationSeparate)); - QVERIFY(!funcs.hasOpenGLFeature(QGLFunctions::BlendFuncSeparate)); - QVERIFY(!funcs.hasOpenGLFeature(QGLFunctions::BlendSubtract)); - QVERIFY(!funcs.hasOpenGLFeature(QGLFunctions::CompressedTextures)); - QVERIFY(!funcs.hasOpenGLFeature(QGLFunctions::Multisample)); - QVERIFY(!funcs.hasOpenGLFeature(QGLFunctions::StencilSeparate)); - QVERIFY(!funcs.hasOpenGLFeature(QGLFunctions::NPOTTextures)); - - // Make a context current. - QGLWidget glw; - if (!glw.isValid()) - QSKIP("Could not create a GL context"); - glw.makeCurrent(); - funcs.initializeGLFunctions(); - - // Validate the features against what we expect for this platform. - if (QOpenGLContext::currentContext()->isOpenGLES()) { -#if !defined(QT_OPENGL_ES) || defined(QT_OPENGL_ES_2) - QGLFunctions::OpenGLFeatures allFeatures = - (QGLFunctions::Multitexture | - QGLFunctions::Shaders | - QGLFunctions::Buffers | - QGLFunctions::Framebuffers | - QGLFunctions::BlendColor | - QGLFunctions::BlendEquation | - QGLFunctions::BlendEquationSeparate | - QGLFunctions::BlendFuncSeparate | - QGLFunctions::BlendSubtract | - QGLFunctions::CompressedTextures | - QGLFunctions::Multisample | - QGLFunctions::StencilSeparate | - QGLFunctions::NPOTTextures); - QVERIFY((funcs.openGLFeatures() & allFeatures) == allFeatures); - QVERIFY(funcs.hasOpenGLFeature(QGLFunctions::Multitexture)); - QVERIFY(funcs.hasOpenGLFeature(QGLFunctions::Shaders)); - QVERIFY(funcs.hasOpenGLFeature(QGLFunctions::Buffers)); - QVERIFY(funcs.hasOpenGLFeature(QGLFunctions::Framebuffers)); - QVERIFY(funcs.hasOpenGLFeature(QGLFunctions::BlendColor)); - QVERIFY(funcs.hasOpenGLFeature(QGLFunctions::BlendEquation)); - QVERIFY(funcs.hasOpenGLFeature(QGLFunctions::BlendEquationSeparate)); - QVERIFY(funcs.hasOpenGLFeature(QGLFunctions::BlendFuncSeparate)); - QVERIFY(funcs.hasOpenGLFeature(QGLFunctions::BlendSubtract)); - QVERIFY(funcs.hasOpenGLFeature(QGLFunctions::CompressedTextures)); - QVERIFY(funcs.hasOpenGLFeature(QGLFunctions::Multisample)); - QVERIFY(funcs.hasOpenGLFeature(QGLFunctions::StencilSeparate)); - QVERIFY(funcs.hasOpenGLFeature(QGLFunctions::NPOTTextures)); -#elif defined(QT_OPENGL_ES) && !defined(QT_OPENGL_ES_2) - QVERIFY(funcs.hasOpenGLFeature(QGLFunctions::Multitexture)); - QVERIFY(funcs.hasOpenGLFeature(QGLFunctions::Buffers)); - QVERIFY(funcs.hasOpenGLFeature(QGLFunctions::CompressedTextures)); - QVERIFY(funcs.hasOpenGLFeature(QGLFunctions::Multisample)); - - QVERIFY(!funcs.hasOpenGLFeature(QGLFunctions::Shaders)); - QVERIFY(!funcs.hasOpenGLFeature(QGLFunctions::BlendColor)); - QVERIFY(!funcs.hasOpenGLFeature(QGLFunctions::StencilSeparate)); - - QCOMPARE(funcs.hasOpenGLFeature(QGLFunctions::Framebuffers), - hasExtension("GL_OES_framebuffer_object")); - QCOMPARE(funcs.hasOpenGLFeature(QGLFunctions::BlendEquationSeparate), - hasExtension("GL_OES_blend_equation_separate")); - QCOMPARE(funcs.hasOpenGLFeature(QGLFunctions::BlendFuncSeparate), - hasExtension("GL_OES_blend_func_separate")); - QCOMPARE(funcs.hasOpenGLFeature(QGLFunctions::BlendSubtract), - hasExtension("GL_OES_blend_subtract")); - QCOMPARE(funcs.hasOpenGLFeature(QGLFunctions::NPOTTextures), - hasExtension("GL_OES_texture_npot")); -#endif - } else { - // We check for both the extension name and the minimum OpenGL version - // for the feature. This will help us catch situations where a platform - // doesn't list an extension by name but does have the feature by virtue - // of its version number. - QGLFormat::OpenGLVersionFlags versions = QGLFormat::openGLVersionFlags(); - QCOMPARE(funcs.hasOpenGLFeature(QGLFunctions::Multitexture), - hasExtension("GL_ARB_multitexture") || - (versions & QGLFormat::OpenGL_Version_1_3) != 0); - QCOMPARE(funcs.hasOpenGLFeature(QGLFunctions::Shaders), - hasExtension("GL_ARB_shader_objects") || - (versions & QGLFormat::OpenGL_Version_2_0) != 0); - QCOMPARE(funcs.hasOpenGLFeature(QGLFunctions::Buffers), - (versions & QGLFormat::OpenGL_Version_1_5) != 0); - QCOMPARE(funcs.hasOpenGLFeature(QGLFunctions::Framebuffers), - hasExtension("GL_EXT_framebuffer_object") || - hasExtension("GL_ARB_framebuffer_object")); - QCOMPARE(funcs.hasOpenGLFeature(QGLFunctions::BlendColor), - hasExtension("GL_EXT_blend_color") || - (versions & QGLFormat::OpenGL_Version_1_2) != 0); - QCOMPARE(funcs.hasOpenGLFeature(QGLFunctions::BlendEquation), - (versions & QGLFormat::OpenGL_Version_1_2) != 0); - QCOMPARE(funcs.hasOpenGLFeature(QGLFunctions::BlendEquationSeparate), - hasExtension("GL_EXT_blend_equation_separate") || - (versions & QGLFormat::OpenGL_Version_2_0) != 0); - QCOMPARE(funcs.hasOpenGLFeature(QGLFunctions::BlendFuncSeparate), - hasExtension("GL_EXT_blend_func_separate") || - (versions & QGLFormat::OpenGL_Version_1_4) != 0); - QCOMPARE(funcs.hasOpenGLFeature(QGLFunctions::BlendSubtract), - hasExtension("GL_EXT_blend_subtract")); - QCOMPARE(funcs.hasOpenGLFeature(QGLFunctions::CompressedTextures), - hasExtension("GL_ARB_texture_compression") || - (versions & QGLFormat::OpenGL_Version_1_3) != 0); - QCOMPARE(funcs.hasOpenGLFeature(QGLFunctions::Multisample), - hasExtension("GL_ARB_multisample") || - (versions & QGLFormat::OpenGL_Version_1_3) != 0); - QCOMPARE(funcs.hasOpenGLFeature(QGLFunctions::StencilSeparate), - (versions & QGLFormat::OpenGL_Version_2_0) != 0); - QCOMPARE(funcs.hasOpenGLFeature(QGLFunctions::NPOTTextures), - hasExtension("GL_ARB_texture_non_power_of_two") || - (versions & QGLFormat::OpenGL_Version_2_0) != 0); - } -} - -// Verify that the multitexture functions appear to resolve and work. -void tst_QGLFunctions::multitexture() -{ - QOpenGLFunctions funcs; - QGLWidget glw; - if (!glw.isValid()) - QSKIP("Could not create a GL context"); - glw.makeCurrent(); - funcs.initializeOpenGLFunctions(); - - if (!funcs.hasOpenGLFeature(QOpenGLFunctions::Multitexture)) - QSKIP("Multitexture functions are not supported"); - - funcs.glActiveTexture(GL_TEXTURE1); - - GLint active = 0; - funcs.glGetIntegerv(GL_ACTIVE_TEXTURE, &active); - QCOMPARE(active, GL_TEXTURE1); - - funcs.glActiveTexture(GL_TEXTURE0); - - active = 0; - funcs.glGetIntegerv(GL_ACTIVE_TEXTURE, &active); - QCOMPARE(active, GL_TEXTURE0); -} - -// Verify that the glBlendColor() function appears to resolve and work. -void tst_QGLFunctions::blendColor() -{ - QOpenGLFunctions funcs; - QGLWidget glw; - if (!glw.isValid()) - QSKIP("Could not create a GL context"); - glw.makeCurrent(); - funcs.initializeOpenGLFunctions(); - - if (!funcs.hasOpenGLFeature(QOpenGLFunctions::BlendColor)) - QSKIP("glBlendColor() is not supported"); - - funcs.glBlendColor(0.0f, 1.0f, 0.0f, 1.0f); - - GLfloat colors[4] = {0.5f, 0.5f, 0.5f, 0.5f}; - funcs.glGetFloatv(GL_BLEND_COLOR, colors); - - QCOMPARE(colors[0], 0.0f); - QCOMPARE(colors[1], 1.0f); - QCOMPARE(colors[2], 0.0f); - QCOMPARE(colors[3], 1.0f); -} - -QTEST_MAIN(tst_QGLFunctions) - -#include "tst_qglfunctions.moc" diff --git a/tests/auto/opengl/qglthreads/qglthreads.pro b/tests/auto/opengl/qglthreads/qglthreads.pro deleted file mode 100644 index 9aa21fb3a2..0000000000 --- a/tests/auto/opengl/qglthreads/qglthreads.pro +++ /dev/null @@ -1,7 +0,0 @@ -CONFIG += testcase -TARGET = tst_qglthreads -requires(qtHaveModule(opengl)) -QT += opengl widgets testlib gui-private core-private - -HEADERS += tst_qglthreads.h -SOURCES += tst_qglthreads.cpp diff --git a/tests/auto/opengl/qglthreads/tst_qglthreads.cpp b/tests/auto/opengl/qglthreads/tst_qglthreads.cpp deleted file mode 100644 index e12f6d9c18..0000000000 --- a/tests/auto/opengl/qglthreads/tst_qglthreads.cpp +++ /dev/null @@ -1,687 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtTest/QtTest> -#include <QtCore/QtCore> -#include <QtGui/QtGui> -#include <private/qguiapplication_p.h> -#include <qpa/qplatformintegration.h> -#include <QtWidgets/QApplication> -#include <QtOpenGL/QtOpenGL> -#include <qelapsedtimer.h> -#include "tst_qglthreads.h" - -#ifndef QT_OPENGL_ES_2 -#include <QtGui/QOpenGLFunctions_1_0> -#endif - -#define RUNNING_TIME 5000 - -tst_QGLThreads::tst_QGLThreads(QObject *parent) - : QObject(parent) -{ -} - -/* - - swapInThread - - The purpose of this testcase is to verify that it is possible to do rendering into - a GL context from the GUI thread, then swap the contents in from a background thread. - - The usecase for this is to have the background thread do the waiting for vertical - sync while the GUI thread is idle. - - Currently the locking is handled directly in the paintEvent(). For the actual usecase - in Qt, the locking is done in the windowsurface before starting any drawing while - unlocking is done after all drawing has been done. - */ - - -class SwapThread : public QThread -{ - Q_OBJECT -public: - SwapThread(QGLWidget *widget) - : m_context(widget->context()) - , m_swapTriggered(false) - { - moveToThread(this); - } - - void run() { - QElapsedTimer timer; - timer.start(); - while (timer.elapsed() < RUNNING_TIME) { - lock(); - waitForReadyToSwap(); - - m_context->makeCurrent(); - m_context->swapBuffers(); - m_context->doneCurrent(); - - m_context->moveToThread(qApp->thread()); - - signalSwapDone(); - unlock(); - } - - m_swapTriggered = false; - } - - void lock() { m_mutex.lock(); } - void unlock() { m_mutex.unlock(); } - - void waitForSwapDone() { if (m_swapTriggered) m_swapDone.wait(&m_mutex); } - void waitForReadyToSwap() { if (!m_swapTriggered) m_readyToSwap.wait(&m_mutex); } - - void signalReadyToSwap() - { - if (!isRunning()) - return; - m_readyToSwap.wakeAll(); - m_swapTriggered = true; - } - - void signalSwapDone() - { - m_swapTriggered = false; - m_swapDone.wakeAll(); - } - -private: - QGLContext *m_context; - QMutex m_mutex; - QWaitCondition m_readyToSwap; - QWaitCondition m_swapDone; - - bool m_swapTriggered; -}; - -class ForegroundWidget : public QGLWidget -{ -public: - ForegroundWidget(const QGLFormat &format) - : QGLWidget(format), m_thread(0) - { - setAutoBufferSwap(false); - } - - void resizeEvent(QResizeEvent *e) - { - m_thread->lock(); - QGLWidget::resizeEvent(e); - m_thread->unlock(); - } - - void paintEvent(QPaintEvent *) - { - m_thread->lock(); - m_thread->waitForSwapDone(); - - makeCurrent(); - QPainter p(this); - p.fillRect(rect(), QColor(QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256), QRandomGenerator::global()->bounded(256))); - p.setPen(Qt::red); - p.setFont(QFont("SansSerif", 24)); - p.drawText(rect(), Qt::AlignCenter, "This is an autotest"); - p.end(); - doneCurrent(); - - if (m_thread->isRunning()) { - context()->moveToThread(m_thread); - m_thread->signalReadyToSwap(); - } - - m_thread->unlock(); - - update(); - } - - void setThread(SwapThread *thread) { - m_thread = thread; - } - - SwapThread *m_thread; -}; - -void tst_QGLThreads::swapInThread() -{ - if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::ThreadedOpenGL)) - QSKIP("No platformsupport for ThreadedOpenGL"); - QGLFormat format; - format.setSwapInterval(1); - ForegroundWidget widget(format); - SwapThread thread(&widget); - widget.setThread(&thread); - widget.show(); - - QVERIFY(QTest::qWaitForWindowExposed(&widget)); - thread.start(); - - while (thread.isRunning()) { - qApp->processEvents(); - } - - widget.hide(); - - QVERIFY(true); -} - -/* - renderInThread - - This test sets up a scene and renders it in a different thread. - For simplicity, the scene is simply a bunch of rectangles, but - if that works, we're in good shape.. - */ - -static inline float qrandom() { return (QRandomGenerator::global()->bounded(100)) / 100.f; } - -void renderAScene(int w, int h) -{ - QOpenGLFunctions *funcs = QOpenGLContext::currentContext()->functions(); - - if (QOpenGLContext::currentContext()->isOpenGLES()) { - Q_UNUSED(w); - Q_UNUSED(h); - QGLShaderProgram program; - program.addShaderFromSourceCode(QGLShader::Vertex, "attribute highp vec2 pos; void main() { gl_Position = vec4(pos.xy, 1.0, 1.0); }"); - program.addShaderFromSourceCode(QGLShader::Fragment, "uniform lowp vec4 color; void main() { gl_FragColor = color; }"); - program.bindAttributeLocation("pos", 0); - program.bind(); - - funcs->glEnableVertexAttribArray(0); - - for (int i=0; i<1000; ++i) { - GLfloat pos[] = { - (QRandomGenerator::global()->bounded(100)) / 100.f, - (QRandomGenerator::global()->bounded(100)) / 100.f, - (QRandomGenerator::global()->bounded(100)) / 100.f, - (QRandomGenerator::global()->bounded(100)) / 100.f, - (QRandomGenerator::global()->bounded(100)) / 100.f, - (QRandomGenerator::global()->bounded(100)) / 100.f - }; - - funcs->glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, pos); - funcs->glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); - } - } else { -#ifndef QT_OPENGL_ES_2 - QOpenGLFunctions_1_0 *gl1funcs = QOpenGLContext::currentContext()->versionFunctions<QOpenGLFunctions_1_0>(); - gl1funcs->initializeOpenGLFunctions(); - - gl1funcs->glViewport(0, 0, w, h); - - gl1funcs->glMatrixMode(GL_PROJECTION); - gl1funcs->glLoadIdentity(); - gl1funcs->glFrustum(0, w, h, 0, 1, 100); - gl1funcs->glTranslated(0, 0, -1); - - gl1funcs->glMatrixMode(GL_MODELVIEW); - gl1funcs->glLoadIdentity(); - - for (int i=0;i<1000; ++i) { - gl1funcs->glBegin(GL_TRIANGLES); - gl1funcs->glColor3f(qrandom(), qrandom(), qrandom()); - gl1funcs->glVertex2f(qrandom() * w, qrandom() * h); - gl1funcs->glColor3f(qrandom(), qrandom(), qrandom()); - gl1funcs->glVertex2f(qrandom() * w, qrandom() * h); - gl1funcs->glColor3f(qrandom(), qrandom(), qrandom()); - gl1funcs->glVertex2f(qrandom() * w, qrandom() * h); - gl1funcs->glEnd(); - } -#endif - } -} - -class ThreadSafeGLWidget : public QGLWidget -{ -public: - ThreadSafeGLWidget(QWidget *parent = 0) : QGLWidget(parent) {} - void paintEvent(QPaintEvent *) - { - // ignored as we're anyway swapping as fast as we can - }; - - void resizeEvent(QResizeEvent *e) - { - mutex.lock(); - newSize = e->size(); - mutex.unlock(); - }; - - QMutex mutex; - QSize newSize; -}; - -class SceneRenderingThread : public QThread -{ - Q_OBJECT -public: - SceneRenderingThread(ThreadSafeGLWidget *widget) - : m_widget(widget) - { - moveToThread(this); - m_size = widget->size(); - } - - void run() { - QElapsedTimer timer; - timer.start(); - failure = false; - - while (timer.elapsed() < RUNNING_TIME && !failure) { - - m_widget->makeCurrent(); - - m_widget->mutex.lock(); - QSize s = m_widget->newSize; - m_widget->mutex.unlock(); - - QOpenGLFunctions *funcs = QOpenGLContext::currentContext()->functions(); - if (s != m_size) { - funcs->glViewport(0, 0, s.width(), s.height()); - } - - if (QGLContext::currentContext() != m_widget->context()) { - failure = true; - break; - } - - funcs->glClear(GL_COLOR_BUFFER_BIT); - - int w = m_widget->width(); - int h = m_widget->height(); - - renderAScene(w, h); - - int color; - funcs->glReadPixels(w / 2, h / 2, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &color); - - m_widget->swapBuffers(); - } - - m_widget->doneCurrent(); - } - - bool failure; - -private: - ThreadSafeGLWidget *m_widget; - QSize m_size; -}; - -void tst_QGLThreads::renderInThread_data() -{ - QTest::addColumn<bool>("resize"); - QTest::addColumn<bool>("update"); - - QTest::newRow("basic") << false << false; - QTest::newRow("with-resize") << true << false; - QTest::newRow("with-update") << false << true; - QTest::newRow("with-resize-and-update") << true << true; -} - -void tst_QGLThreads::renderInThread() -{ - if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::ThreadedOpenGL)) - QSKIP("No platformsupport for ThreadedOpenGL"); - - QFETCH(bool, resize); - QFETCH(bool, update); - -#if defined(Q_OS_MACOS) - if (resize) - QSKIP("gldSetZero crashes in render thread, QTBUG-68524"); -#endif - - ThreadSafeGLWidget widget; - widget.resize(200, 200); - SceneRenderingThread thread(&widget); - - widget.show(); - QVERIFY(QTest::qWaitForWindowExposed(&widget)); - widget.doneCurrent(); - - widget.context()->moveToThread(&thread); - - thread.start(); - - int value = 10; - while (thread.isRunning()) { - if (resize) - widget.resize(200 + value, 200 + value); - if (update) - widget.update(100 + value, 100 + value, 20, 20); - qApp->processEvents(); - value = -value; - - QThread::msleep(100); - } - - QVERIFY(!thread.failure); -} - -class Device -{ -public: - virtual ~Device() {} - virtual QPaintDevice *realPaintDevice() = 0; - virtual void prepareDevice() {} - virtual void moveToThread(QThread *) {} -}; - -class GLWidgetWrapper : public Device -{ -public: - GLWidgetWrapper() { - widget.resize(150, 150); - widget.show(); - QVERIFY(QTest::qWaitForWindowExposed(&widget)); - widget.doneCurrent(); - } - QPaintDevice *realPaintDevice() { return &widget; } - void moveToThread(QThread *thread) { widget.context()->moveToThread(thread); } - - ThreadSafeGLWidget widget; -}; - -class PixmapWrapper : public Device -{ -public: - PixmapWrapper() { pixmap = new QPixmap(512, 512); } - ~PixmapWrapper() { delete pixmap; } - QPaintDevice *realPaintDevice() { return pixmap; } - - QPixmap *pixmap; -}; - -class PixelBufferWrapper : public Device -{ -public: - PixelBufferWrapper() { pbuffer = new QGLPixelBuffer(512, 512); } - ~PixelBufferWrapper() { delete pbuffer; } - QPaintDevice *realPaintDevice() { return pbuffer; } - void moveToThread(QThread *thread) { pbuffer->context()->moveToThread(thread); } - - QGLPixelBuffer *pbuffer; -}; - - -class FrameBufferObjectWrapper : public Device -{ -public: - FrameBufferObjectWrapper() { - widget.makeCurrent(); - fbo = new QGLFramebufferObject(512, 512); - widget.doneCurrent(); - } - ~FrameBufferObjectWrapper() { delete fbo; } - QPaintDevice *realPaintDevice() { return fbo; } - void prepareDevice() { widget.makeCurrent(); } - void moveToThread(QThread *thread) { widget.context()->moveToThread(thread); } - - ThreadSafeGLWidget widget; - QGLFramebufferObject *fbo; -}; - - -class ThreadPainter : public QObject -{ - Q_OBJECT -public: - ThreadPainter(Device *pd) : device(pd), fail(true) { - pixmap = QPixmap(40, 40); - pixmap.fill(Qt::green); - QPainter p(&pixmap); - p.drawLine(0, 0, 40, 40); - p.drawLine(0, 40, 40, 0); - } - -public slots: - void draw() { - bool beginFailed = false; - QElapsedTimer timer; - timer.start(); - int rotAngle = 10; - device->prepareDevice(); - QPaintDevice *paintDevice = device->realPaintDevice(); - QSize s(paintDevice->width(), paintDevice->height()); - while (timer.elapsed() < RUNNING_TIME) { - QPainter p; - if (!p.begin(paintDevice)) { - beginFailed = true; - break; - } - p.translate(s.width()/2, s.height()/2); - p.rotate(rotAngle); - p.translate(-s.width()/2, -s.height()/2); - p.fillRect(0, 0, s.width(), s.height(), Qt::red); - QRect rect(QPoint(0, 0), s); - p.drawPixmap(10, 10, pixmap); - p.drawTiledPixmap(50, 50, 100, 100, pixmap); - p.drawText(rect.center(), "This is a piece of text"); - p.end(); - rotAngle += 2; - QThread::msleep(20); - } - - device->moveToThread(qApp->thread()); - - fail = beginFailed; - QThread::currentThread()->quit(); - } - - bool failed() { return fail; } - -private: - QPixmap pixmap; - Device *device; - bool fail; -}; - -template <class T> -class PaintThreadManager -{ -public: - PaintThreadManager(int count) : numThreads(count) - { - for (int i=0; i<numThreads; ++i) - devices.append(new T); - // Wait until resize events are processed on the internal - // QGLWidgets of the buffers to suppress errors - // about makeCurrent() from the wrong thread. - QCoreApplication::processEvents(); - for (int i=0; i<numThreads; ++i) { - devices.append(new T); - threads.append(new QThread); - painters.append(new ThreadPainter(devices.at(i))); - painters.at(i)->moveToThread(threads.at(i)); - painters.at(i)->connect(threads.at(i), SIGNAL(started()), painters.at(i), SLOT(draw())); - devices.at(i)->moveToThread(threads.at(i)); - } - } - - ~PaintThreadManager() { - qDeleteAll(threads); - qDeleteAll(painters); - qDeleteAll(devices); - } - - - void start() { - for (int i=0; i<numThreads; ++i) - threads.at(i)->start(); - } - - bool areRunning() { - bool running = false; - for (int i=0; i<numThreads; ++i){ - if (threads.at(i)->isRunning()) - running = true; - } - - return running; - } - - bool failed() { - for (int i=0; i<numThreads; ++i) { - if (painters.at(i)->failed()) - return true; - } - - return false; - } - -private: - QList<QThread *> threads; - QList<Device *> devices; - QList<ThreadPainter *> painters; - int numThreads; -}; - -/* - This test uses QPainter to draw onto different QGLWidgets in - different threads at the same time. The ThreadSafeGLWidget is - necessary to handle paint and resize events that might come from - the main thread at any time while the test is running. The resize - and paint events would cause makeCurrent() calls to be issued from - within the QGLWidget while the widget's context was current in - another thread, which would cause errors. -*/ -void tst_QGLThreads::painterOnGLWidgetInThread() -{ - //QTBUG-46446 tst_qglthreads is unstable on windows 7 - if (QGuiApplication::platformName().compare("windows 7", Qt::CaseInsensitive)) - QSKIP("Doesn't work on this platform. QTBUG-46446"); - if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::ThreadedOpenGL)) - QSKIP("No platformsupport for ThreadedOpenGL"); - if (!((QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_Version_2_0) || - (QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_ES_Version_2_0))) { - QSKIP("The OpenGL based threaded QPainter tests requires OpenGL/ES 2.0."); - } - - PaintThreadManager<GLWidgetWrapper> painterThreads(5); - painterThreads.start(); - - while (painterThreads.areRunning()) { - qApp->processEvents(); - QThread::msleep(100); - } - QVERIFY(!painterThreads.failed()); -} - -/* - This test uses QPainter to draw onto different QPixmaps in - different threads at the same time. -*/ -void tst_QGLThreads::painterOnPixmapInThread() -{ - if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::ThreadedOpenGL) - || !QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::ThreadedPixmaps)) - QSKIP("No platformsupport for ThreadedOpenGL or ThreadedPixmaps"); - PaintThreadManager<PixmapWrapper> painterThreads(5); - painterThreads.start(); - - while (painterThreads.areRunning()) { - qApp->processEvents(); - QThread::msleep(100); - } - QVERIFY(!painterThreads.failed()); -} - -/* This test uses QPainter to draw onto different QGLPixelBuffer - objects in different threads at the same time. -*/ -void tst_QGLThreads::painterOnPboInThread() -{ - //QTBUG-46446 tst_qglthreads is unstable on windows 7 - if (QGuiApplication::platformName().compare("windows 7", Qt::CaseInsensitive)) - QSKIP("Doesn't work on this platform. QTBUG-46446"); - if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::ThreadedOpenGL)) - QSKIP("No platformsupport for ThreadedOpenGL"); - if (!((QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_Version_2_0) || - (QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_ES_Version_2_0))) { - QSKIP("The OpenGL based threaded QPainter tests requires OpenGL/ES 2.0."); - } - - if (!QGLPixelBuffer::hasOpenGLPbuffers()) { - QSKIP("This system doesn't support pbuffers."); - } - - PaintThreadManager<PixelBufferWrapper> painterThreads(5); - painterThreads.start(); - - while (painterThreads.areRunning()) { - qApp->processEvents(); - QThread::msleep(100); - } - QVERIFY(!painterThreads.failed()); -} - -/* This test uses QPainter to draw onto different - QGLFramebufferObjects (bound in a QGLWidget's context) in different - threads at the same time. -*/ -void tst_QGLThreads::painterOnFboInThread() -{ - //QTBUG-46446 tst_qglthreads is unstable on windows 7 - if (QGuiApplication::platformName().compare("windows 7", Qt::CaseInsensitive)) - QSKIP("Doesn't work on this platform. QTBUG-46446"); - if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::ThreadedOpenGL)) - QSKIP("No platformsupport for ThreadedOpenGL"); - if (!((QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_Version_2_0) || - (QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_ES_Version_2_0))) { - QSKIP("The OpenGL based threaded QPainter tests requires OpenGL/ES 2.0."); - } - - if (!QGLFramebufferObject::hasOpenGLFramebufferObjects()) { - QSKIP("This system doesn't support framebuffer objects."); - } - - PaintThreadManager<FrameBufferObjectWrapper> painterThreads(5); - painterThreads.start(); - - while (painterThreads.areRunning()) { - qApp->processEvents(); - QThread::msleep(100); - } - QVERIFY(!painterThreads.failed()); -} - -int main(int argc, char **argv) -{ - QApplication app(argc, argv); - QTEST_DISABLE_KEYPAD_NAVIGATION \ - - tst_QGLThreads tc; - return QTest::qExec(&tc, argc, argv); -} - -#include "tst_qglthreads.moc" diff --git a/tests/auto/opengl/qglthreads/tst_qglthreads.h b/tests/auto/opengl/qglthreads/tst_qglthreads.h deleted file mode 100644 index e4b496c163..0000000000 --- a/tests/auto/opengl/qglthreads/tst_qglthreads.h +++ /dev/null @@ -1,51 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef TST_QGLTHREADS_H -#define TST_QGLTHREADS_H - -#include <QObject> - -class tst_QGLThreads : public QObject -{ -Q_OBJECT -public: - explicit tst_QGLThreads(QObject *parent = 0); - -private slots: - void swapInThread(); - - void renderInThread_data(); - void renderInThread(); - void painterOnGLWidgetInThread(); - void painterOnPixmapInThread(); - void painterOnPboInThread(); - void painterOnFboInThread(); -}; - -#endif // TST_QGLTHREADS_H diff --git a/tests/auto/other/compiler/tst_compiler.cpp b/tests/auto/other/compiler/tst_compiler.cpp index de15f4c62d..78026665be 100644 --- a/tests/auto/other/compiler/tst_compiler.cpp +++ b/tests/auto/other/compiler/tst_compiler.cpp @@ -634,7 +634,7 @@ void tst_Compiler::cxx11_alignas() struct S { alignas(double) char c; }; - QCOMPARE(Q_ALIGNOF(S), Q_ALIGNOF(double)); + QCOMPARE(alignof(S), alignof(double)); #endif } @@ -1396,7 +1396,7 @@ void tst_Compiler::cxx11_unrestricted_unions() ~U() {} }; U u; - std::aligned_storage<sizeof(QString), Q_ALIGNOF(QString)> as; + std::aligned_storage<sizeof(QString), alignof(QString)> as; Q_UNUSED(u); Q_UNUSED(as); diff --git a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp index 0e61647e76..ed38976d94 100644 --- a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp +++ b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp @@ -203,11 +203,15 @@ private slots: void applicationTest(); void mainWindowTest(); void subWindowTest(); +#if QT_CONFIG(shortcut) void buttonTest(); +#endif void scrollBarTest(); void tabTest(); void tabWidgetTest(); +#if QT_CONFIG(shortcut) void menuTest(); +#endif void spinBoxTest(); void doubleSpinBoxTest(); void textEditTest(); @@ -234,8 +238,10 @@ private slots: void dockWidgetTest(); void comboBoxTest(); void accessibleName(); +#if QT_CONFIG(shortcut) void labelTest(); void accelerators(); +#endif void bridgeTest(); void focusChild(); @@ -1027,6 +1033,8 @@ public Q_SLOTS: } }; +#if QT_CONFIG(shortcut) + void tst_QAccessibility::buttonTest() { QWidget window; @@ -1199,6 +1207,8 @@ void tst_QAccessibility::buttonTest() // test->release(); } +#endif // QT_CONFIG(shortcut) + void tst_QAccessibility::scrollBarTest() { QScrollBar *scrollBar = new QScrollBar(Qt::Horizontal); @@ -1408,6 +1418,8 @@ void tst_QAccessibility::tabWidgetTest() QTestAccessibility::clearEvents(); } +#if QT_CONFIG(shortcut) + void tst_QAccessibility::menuTest() { { @@ -1618,6 +1630,8 @@ void tst_QAccessibility::menuTest() QTestAccessibility::clearEvents(); } +#endif // QT_CONFIG(shortcut) + void tst_QAccessibility::spinBoxTest() { QSpinBox * const spinBox = new QSpinBox(); @@ -3630,6 +3644,8 @@ void tst_QAccessibility::comboBoxTest() QTestAccessibility::clearEvents(); } +#if QT_CONFIG(shortcut) + void tst_QAccessibility::labelTest() { QWidget *window = new QWidget; @@ -3730,6 +3746,8 @@ void tst_QAccessibility::accelerators() QTestAccessibility::clearEvents(); } +#endif // QT_CONFIG(shortcut) + #ifdef QT_SUPPORTS_IACCESSIBLE2 static IUnknown *queryIA2(IAccessible *acc, const IID &iid) { diff --git a/tests/auto/other/qfocusevent/tst_qfocusevent.cpp b/tests/auto/other/qfocusevent/tst_qfocusevent.cpp index 260ba12a97..9285d5b5da 100644 --- a/tests/auto/other/qfocusevent/tst_qfocusevent.cpp +++ b/tests/auto/other/qfocusevent/tst_qfocusevent.cpp @@ -91,7 +91,9 @@ private slots: void checkReason_BackTab(); void checkReason_Popup(); void checkReason_focusWidget(); +#if QT_CONFIG(shortcut) void checkReason_Shortcut(); +#endif void checkReason_ActiveWindow(); private: @@ -250,6 +252,8 @@ QT_BEGIN_NAMESPACE QT_END_NAMESPACE #endif +#if QT_CONFIG(shortcut) + void tst_QFocusEvent::checkReason_Shortcut() { initWidget(); @@ -288,6 +292,8 @@ void tst_QFocusEvent::checkReason_Shortcut() #endif } +#endif // QT_CONFIG(shortcut) + void tst_QFocusEvent::checkReason_focusWidget() { // This test checks that a widget doesn't loose diff --git a/tests/auto/other/toolsupport/tst_toolsupport.cpp b/tests/auto/other/toolsupport/tst_toolsupport.cpp index ab7bca8322..9591eca16a 100644 --- a/tests/auto/other/toolsupport/tst_toolsupport.cpp +++ b/tests/auto/other/toolsupport/tst_toolsupport.cpp @@ -97,14 +97,14 @@ void tst_toolsupport::offsets_data() { QTestData &data = QTest::newRow("sizeof(QObjectData)") << sizeof(QObjectData); - data << 28 << 48; // vptr + 3 ptr + 2 int + ptr + data << 36 << 64; // vptr + 2 ptr + (2*ptr + int) + 2 int + ptr } #if RUN_MEMBER_OFFSET_TEST { QTestData &data = QTest::newRow("QObjectPrivate::extraData") << pmm_to_offsetof(&QObjectPrivate::extraData); - data << 28 << 48; // sizeof(QObjectData) + data << 36 << 64; // sizeof(QObjectData) } { @@ -126,9 +126,9 @@ void tst_toolsupport::offsets_data() #ifdef Q_PROCESSOR_X86 // x86 32-bit has weird alignment rules. Refer to QtPrivate::AlignOf in // qglobal.h for more details. - data << 152 << 224; + data << 184 << 288; #else - data << 156 << 224; + data << 188 << 288; #endif } #endif diff --git a/tests/auto/testlib/selftests/expected_signaldumper.lightxml b/tests/auto/testlib/selftests/expected_signaldumper.lightxml index 443f649bb6..8ce57e4b84 100644 --- a/tests/auto/testlib/selftests/expected_signaldumper.lightxml +++ b/tests/auto/testlib/selftests/expected_signaldumper.lightxml @@ -542,7 +542,7 @@ <Description><![CDATA[Signal: SignalSlotClass(_POINTER_) qByteArraySignal (QByteArray(Test bytearray))]]></Description> </Message> <Message type="info" file="" line="0"> - <Description><![CDATA[Signal: SignalSlotClass(_POINTER_) qListSignal (QList<int>())]]></Description> + <Description><![CDATA[Signal: SignalSlotClass(_POINTER_) qListSignal (QVector<int>())]]></Description> </Message> <Message type="info" file="" line="0"> <Description><![CDATA[Signal: SignalSlotClass(_POINTER_) qVectorSignal (QVector<int>())]]></Description> diff --git a/tests/auto/testlib/selftests/expected_signaldumper.tap b/tests/auto/testlib/selftests/expected_signaldumper.tap index e2d664f4f1..39419280d4 100644 --- a/tests/auto/testlib/selftests/expected_signaldumper.tap +++ b/tests/auto/testlib/selftests/expected_signaldumper.tap @@ -134,7 +134,7 @@ ok 18 - slotEmittingSignalOldSyntax(queued) # Signal: SignalSlotClass(_POINTER_) qStringRefSignal ((QString&)@_POINTER_) # Signal: SignalSlotClass(_POINTER_) qStringConstRefSignal (QString(Test string)) # Signal: SignalSlotClass(_POINTER_) qByteArraySignal (QByteArray(Test bytearray)) -# Signal: SignalSlotClass(_POINTER_) qListSignal (QList<int>()) +# Signal: SignalSlotClass(_POINTER_) qListSignal (QVector<int>()) # Signal: SignalSlotClass(_POINTER_) qVectorSignal (QVector<int>()) # Signal: SignalSlotClass(_POINTER_) qVectorRefSignal ((QVector<int>&)@_POINTER_) # Signal: SignalSlotClass(_POINTER_) qVectorConstRefSignal (QVector<int>()) diff --git a/tests/auto/testlib/selftests/expected_signaldumper.teamcity b/tests/auto/testlib/selftests/expected_signaldumper.teamcity index 0fc568e086..15bb4ddfe1 100644 --- a/tests/auto/testlib/selftests/expected_signaldumper.teamcity +++ b/tests/auto/testlib/selftests/expected_signaldumper.teamcity @@ -54,7 +54,7 @@ ##teamcity[testStdOut name='slotEmittingSignalOldSyntax(queued)' out='INFO: Signal: SignalSlotClass(_POINTER_) signalWithoutParameters ()|nINFO: Signal: QEventDispatcherPlatform(_POINTER_) awake ()|nINFO: Signal: SignalSlotClass(_POINTER_) nestedSignal ()' flowId='tst_Signaldumper'] ##teamcity[testFinished name='slotEmittingSignalOldSyntax(queued)' flowId='tst_Signaldumper'] ##teamcity[testStarted name='variousTypes()' flowId='tst_Signaldumper'] -##teamcity[testStdOut name='variousTypes()' out='INFO: Signal: SignalSlotClass(_POINTER_) qStringSignal (QString(Test string))|nINFO: Signal: SignalSlotClass(_POINTER_) qStringRefSignal ((QString&)@_POINTER_)|nINFO: Signal: SignalSlotClass(_POINTER_) qStringConstRefSignal (QString(Test string))|nINFO: Signal: SignalSlotClass(_POINTER_) qByteArraySignal (QByteArray(Test bytearray))|nINFO: Signal: SignalSlotClass(_POINTER_) qListSignal (QList<int>())|nINFO: Signal: SignalSlotClass(_POINTER_) qVectorSignal (QVector<int>())|nINFO: Signal: SignalSlotClass(_POINTER_) qVectorRefSignal ((QVector<int>&)@_POINTER_)|nINFO: Signal: SignalSlotClass(_POINTER_) qVectorConstRefSignal (QVector<int>())|nINFO: Signal: SignalSlotClass(_POINTER_) qVectorConstPointerSignal ((const QVector<int>*)_POINTER_)|nINFO: Signal: SignalSlotClass(_POINTER_) qVectorPointerConstSignal ()|nINFO: Signal: SignalSlotClass(_POINTER_) qVariantSignal (QVariant())|nINFO: Signal: SignalSlotClass(_POINTER_) qVariantSignal (QVariant())' flowId='tst_Signaldumper'] +##teamcity[testStdOut name='variousTypes()' out='INFO: Signal: SignalSlotClass(_POINTER_) qStringSignal (QString(Test string))|nINFO: Signal: SignalSlotClass(_POINTER_) qStringRefSignal ((QString&)@_POINTER_)|nINFO: Signal: SignalSlotClass(_POINTER_) qStringConstRefSignal (QString(Test string))|nINFO: Signal: SignalSlotClass(_POINTER_) qByteArraySignal (QByteArray(Test bytearray))|nINFO: Signal: SignalSlotClass(_POINTER_) qListSignal (QVector<int>())|nINFO: Signal: SignalSlotClass(_POINTER_) qVectorSignal (QVector<int>())|nINFO: Signal: SignalSlotClass(_POINTER_) qVectorRefSignal ((QVector<int>&)@_POINTER_)|nINFO: Signal: SignalSlotClass(_POINTER_) qVectorConstRefSignal (QVector<int>())|nINFO: Signal: SignalSlotClass(_POINTER_) qVectorConstPointerSignal ((const QVector<int>*)_POINTER_)|nINFO: Signal: SignalSlotClass(_POINTER_) qVectorPointerConstSignal ()|nINFO: Signal: SignalSlotClass(_POINTER_) qVariantSignal (QVariant())|nINFO: Signal: SignalSlotClass(_POINTER_) qVariantSignal (QVariant())' flowId='tst_Signaldumper'] ##teamcity[testFinished name='variousTypes()' flowId='tst_Signaldumper'] ##teamcity[testStarted name='deletingSender()' flowId='tst_Signaldumper'] ##teamcity[testStdOut name='deletingSender()' out='INFO: Signal: SignalSlotClass(_POINTER_) signalWithoutParameters ()' flowId='tst_Signaldumper'] diff --git a/tests/auto/testlib/selftests/expected_signaldumper.txt b/tests/auto/testlib/selftests/expected_signaldumper.txt index 0ee8cd38a2..92d609d14c 100644 --- a/tests/auto/testlib/selftests/expected_signaldumper.txt +++ b/tests/auto/testlib/selftests/expected_signaldumper.txt @@ -134,7 +134,7 @@ INFO : tst_Signaldumper::variousTypes() Signal: SignalSlotClass(_POINTER_) qSt INFO : tst_Signaldumper::variousTypes() Signal: SignalSlotClass(_POINTER_) qStringRefSignal ((QString&)@_POINTER_) INFO : tst_Signaldumper::variousTypes() Signal: SignalSlotClass(_POINTER_) qStringConstRefSignal (QString(Test string)) INFO : tst_Signaldumper::variousTypes() Signal: SignalSlotClass(_POINTER_) qByteArraySignal (QByteArray(Test bytearray)) -INFO : tst_Signaldumper::variousTypes() Signal: SignalSlotClass(_POINTER_) qListSignal (QList<int>()) +INFO : tst_Signaldumper::variousTypes() Signal: SignalSlotClass(_POINTER_) qListSignal (QVector<int>()) INFO : tst_Signaldumper::variousTypes() Signal: SignalSlotClass(_POINTER_) qVectorSignal (QVector<int>()) INFO : tst_Signaldumper::variousTypes() Signal: SignalSlotClass(_POINTER_) qVectorRefSignal ((QVector<int>&)@_POINTER_) INFO : tst_Signaldumper::variousTypes() Signal: SignalSlotClass(_POINTER_) qVectorConstRefSignal (QVector<int>()) diff --git a/tests/auto/testlib/selftests/expected_signaldumper.xml b/tests/auto/testlib/selftests/expected_signaldumper.xml index f11a0c3ce6..01b0471268 100644 --- a/tests/auto/testlib/selftests/expected_signaldumper.xml +++ b/tests/auto/testlib/selftests/expected_signaldumper.xml @@ -544,7 +544,7 @@ <Description><![CDATA[Signal: SignalSlotClass(_POINTER_) qByteArraySignal (QByteArray(Test bytearray))]]></Description> </Message> <Message type="info" file="" line="0"> - <Description><![CDATA[Signal: SignalSlotClass(_POINTER_) qListSignal (QList<int>())]]></Description> + <Description><![CDATA[Signal: SignalSlotClass(_POINTER_) qListSignal (QVector<int>())]]></Description> </Message> <Message type="info" file="" line="0"> <Description><![CDATA[Signal: SignalSlotClass(_POINTER_) qVectorSignal (QVector<int>())]]></Description> diff --git a/tests/auto/testlib/selftests/expected_signaldumper.xunitxml b/tests/auto/testlib/selftests/expected_signaldumper.xunitxml index cbf7075ba1..6609f518a2 100644 --- a/tests/auto/testlib/selftests/expected_signaldumper.xunitxml +++ b/tests/auto/testlib/selftests/expected_signaldumper.xunitxml @@ -142,7 +142,7 @@ <!-- message="Signal: SignalSlotClass(_POINTER_) qStringRefSignal ((QString&)@_POINTER_)" type="info" --> <!-- message="Signal: SignalSlotClass(_POINTER_) qStringConstRefSignal (QString(Test string))" type="info" --> <!-- message="Signal: SignalSlotClass(_POINTER_) qByteArraySignal (QByteArray(Test bytearray))" type="info" --> - <!-- message="Signal: SignalSlotClass(_POINTER_) qListSignal (QList<int>())" type="info" --> + <!-- message="Signal: SignalSlotClass(_POINTER_) qListSignal (QVector<int>())" type="info" --> <!-- message="Signal: SignalSlotClass(_POINTER_) qVectorSignal (QVector<int>())" type="info" --> <!-- message="Signal: SignalSlotClass(_POINTER_) qVectorRefSignal ((QVector<int>&)@_POINTER_)" type="info" --> <!-- message="Signal: SignalSlotClass(_POINTER_) qVectorConstRefSignal (QVector<int>())" type="info" --> @@ -274,7 +274,7 @@ <![CDATA[Signal: SignalSlotClass(_POINTER_) qStringRefSignal ((QString&)@_POINTER_)]]> <![CDATA[Signal: SignalSlotClass(_POINTER_) qStringConstRefSignal (QString(Test string))]]> <![CDATA[Signal: SignalSlotClass(_POINTER_) qByteArraySignal (QByteArray(Test bytearray))]]> -<![CDATA[Signal: SignalSlotClass(_POINTER_) qListSignal (QList<int>())]]> +<![CDATA[Signal: SignalSlotClass(_POINTER_) qListSignal (QVector<int>())]]> <![CDATA[Signal: SignalSlotClass(_POINTER_) qVectorSignal (QVector<int>())]]> <![CDATA[Signal: SignalSlotClass(_POINTER_) qVectorRefSignal ((QVector<int>&)@_POINTER_)]]> <![CDATA[Signal: SignalSlotClass(_POINTER_) qVectorConstRefSignal (QVector<int>())]]> diff --git a/tests/auto/tools/moc/allmocs_baseline_in.json b/tests/auto/tools/moc/allmocs_baseline_in.json index 8cb397190c..c8abba6a8f 100644 --- a/tests/auto/tools/moc/allmocs_baseline_in.json +++ b/tests/auto/tools/moc/allmocs_baseline_in.json @@ -2,68 +2,6 @@ { "classes": [ { - "className": "MyBooooooostishClass", - "qualifiedClassName": "MyBooooooostishClass", - "signals": [ - { - "access": "public", - "name": "mySignal", - "returnType": "void" - } - ], - "slots": [ - { - "access": "public", - "name": "mySlot", - "returnType": "void" - } - ], - "superClasses": [ - { - "access": "public", - "name": "QObject" - } - ] - } - ], - "inputFile": "no-keywords.h", - "outputRevision": 67 - }, - { - "classes": [ - { - "className": "Task87883", - "qualifiedClassName": "Task87883", - "superClasses": [ - { - "access": "public", - "name": "QObject" - } - ] - } - ], - "inputFile": "task87883.h", - "outputRevision": 67 - }, - { - "classes": [ - { - "className": "IfdefedClass", - "qualifiedClassName": "IfdefedClass", - "superClasses": [ - { - "access": "public", - "name": "QObject" - } - ] - } - ], - "inputFile": "c-comments.h", - "outputRevision": 67 - }, - { - "classes": [ - { "className": "BackslashNewlines", "qualifiedClassName": "BackslashNewlines", "slots": [ @@ -87,340 +25,8 @@ { "classes": [ { - "className": "OldStyleCast", - "qualifiedClassName": "OldStyleCast", - "slots": [ - { - "access": "public", - "name": "foo", - "returnType": "void" - }, - { - "access": "public", - "arguments": [ - { - "type": "int" - }, - { - "type": "int*" - }, - { - "type": "const int*" - }, - { - "type": "volatile int*" - }, - { - "type": "const int*volatile*" - } - ], - "name": "bar", - "returnType": "int" - }, - { - "access": "public", - "arguments": [ - { - "type": "int" - }, - { - "type": "QObject*const" - } - ], - "name": "slot", - "returnType": "void" - } - ], - "superClasses": [ - { - "access": "public", - "name": "QObject" - } - ] - } - ], - "inputFile": "oldstyle-casts.h", - "outputRevision": 67 - }, - { - "classes": [ - { - "className": "SlotsWithVoidTemplateTest", - "qualifiedClassName": "SlotsWithVoidTemplateTest", - "signals": [ - { - "access": "public", - "arguments": [ - { - "type": "TestTemplate<void>" - } - ], - "name": "mySignal", - "returnType": "void" - }, - { - "access": "public", - "name": "myVoidSignal", - "returnType": "void" - }, - { - "access": "public", - "name": "myVoidSignal2", - "returnType": "void" - } - ], - "slots": [ - { - "access": "public", - "name": "dummySlot", - "returnType": "void" - }, - { - "access": "public", - "name": "dummySlot2", - "returnType": "void" - }, - { - "access": "public", - "arguments": [ - { - "type": "TestTemplate<void>" - } - ], - "name": "anotherSlot", - "returnType": "void" - }, - { - "access": "public", - "name": "mySlot", - "returnType": "TestTemplate<void>" - } - ], - "superClasses": [ - { - "access": "public", - "name": "QObject" - } - ] - } - ], - "inputFile": "slots-with-void-template.h", - "outputRevision": 67 - }, - { - "classes": [ - { - "className": "InvokableBeforeReturnType", - "methods": [ - { - "access": "public", - "name": "foo", - "returnType": "const char*" - } - ], - "qualifiedClassName": "InvokableBeforeReturnType", - "superClasses": [ - { - "access": "public", - "name": "QObject" - } - ] - }, - { - "className": "InvokableBeforeInline", - "methods": [ - { - "access": "public", - "name": "foo", - "returnType": "void" - }, - { - "access": "public", - "name": "bar", - "returnType": "void" - } - ], - "qualifiedClassName": "InvokableBeforeInline", - "superClasses": [ - { - "access": "public", - "name": "QObject" - } - ] - } - ], - "inputFile": "qinvokable.h", - "outputRevision": 67 - }, - { - "classes": [ - { - "className": "Bar", - "enums": [ - { - "alias": "Flag", - "isClass": false, - "isFlag": true, - "name": "Flags", - "values": [ - "Read", - "Write" - ] - } - ], - "properties": [ - { - "constant": false, - "designable": true, - "final": false, - "name": "flags", - "read": "flags", - "scriptable": true, - "stored": true, - "type": "Flags", - "user": false, - "write": "setFlags" - } - ], - "qualifiedClassName": "Foo::Bar", - "superClasses": [ - { - "access": "public", - "name": "QObject" - } - ] - }, - { - "className": "Baz", - "properties": [ - { - "constant": false, - "designable": true, - "final": false, - "name": "flags", - "read": "flags", - "scriptable": true, - "stored": true, - "type": "Foo::Bar::Flags", - "user": false, - "write": "setFlags" - }, - { - "constant": false, - "designable": true, - "final": false, - "name": "flagsList", - "read": "flagsList", - "scriptable": true, - "stored": true, - "type": "QList<Foo::Bar::Flags>", - "user": false, - "write": "setFlagsList" - } - ], - "qualifiedClassName": "Foo::Baz", - "superClasses": [ - { - "access": "public", - "name": "QObject" - } - ] - } - ], - "inputFile": "namespaced-flags.h", - "outputRevision": 67 - }, - { - "classes": [ - { - "className": "Foo", - "qualifiedClassName": "BBB::Foo", - "signals": [ - { - "access": "public", - "arguments": [ - { - "type": "QList<QList<int> >" - } - ], - "name": "foo", - "returnType": "void" - }, - { - "access": "public", - "arguments": [ - { - "type": "QList<QList<int> >" - } - ], - "name": "foo2", - "returnType": "void" - }, - { - "access": "public", - "arguments": [ - { - "type": "QList< ::AAA::BaseA*>" - } - ], - "name": "bar", - "returnType": "void" - }, - { - "access": "public", - "arguments": [ - { - "type": "QList< ::AAA::BaseA*>" - } - ], - "name": "bar2", - "returnType": "void" - }, - { - "access": "public", - "arguments": [ - { - "type": "QList<const ::AAA::BaseA*>" - } - ], - "name": "bar3", - "returnType": "void" - } - ], - "superClasses": [ - { - "access": "public", - "name": "QObject" - }, - { - "access": "public", - "name": "::AAA::BaseA" - } - ] - } - ], - "inputFile": "trigraphs.h", - "outputRevision": 67 - }, - { - "classes": [ - { - "classInfos": [ - { - "name": "Test", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\x53" - }, - { - "name": "Test2", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\123" - }, - { - "name": "Test3", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\nb" - } - ], - "className": "StringLiterals", - "qualifiedClassName": "StringLiterals", + "className": "IfdefedClass", + "qualifiedClassName": "IfdefedClass", "superClasses": [ { "access": "public", @@ -429,7 +35,7 @@ ] } ], - "inputFile": "escapes-in-string-literals.h", + "inputFile": "c-comments.h", "outputRevision": 67 }, { @@ -466,475 +72,6 @@ { "classes": [ { - "className": "TestQPrivateSlots", - "methods": [ - { - "access": "private", - "name": "method1", - "returnType": "void" - } - ], - "qualifiedClassName": "TestQPrivateSlots", - "slots": [ - { - "access": "private", - "name": "_q_privateslot", - "returnType": "void" - } - ], - "superClasses": [ - { - "access": "public", - "name": "QObject" - } - ] - } - ], - "inputFile": "qprivateslots.h", - "outputRevision": 67 - }, - { - "classes": [ - { - "className": "GadgetWithNoEnums", - "gadget": true, - "qualifiedClassName": "GadgetWithNoEnums" - }, - { - "className": "DerivedGadgetWithEnums", - "enums": [ - { - "isClass": false, - "isFlag": false, - "name": "FooEnum", - "values": [ - "FooValue" - ] - } - ], - "gadget": true, - "qualifiedClassName": "DerivedGadgetWithEnums", - "superClasses": [ - { - "access": "public", - "name": "GadgetWithNoEnums" - } - ] - } - ], - "inputFile": "gadgetwithnoenums.h", - "outputRevision": 67 - }, - { - "classes": [ - { - "className": "DirInIncludePath", - "interfaces": [ - [ - { - "className": "MyInterface", - "id": "\"MyInterface\"" - } - ] - ], - "qualifiedClassName": "DirInIncludePath", - "superClasses": [ - { - "access": "public", - "name": "QObject" - }, - { - "access": "public", - "name": "MyInterface" - } - ] - } - ], - "inputFile": "dir-in-include-path.h", - "outputRevision": 67 - }, - { - "classes": [ - { - "className": "SingleFunctionKeywordBeforeReturnType", - "qualifiedClassName": "SingleFunctionKeywordBeforeReturnType", - "signals": [ - { - "access": "public", - "name": "mySignal", - "returnType": "void" - } - ], - "slots": [ - { - "access": "public", - "name": "mySlot", - "returnType": "void" - } - ], - "superClasses": [ - { - "access": "public", - "name": "QObject" - } - ] - }, - { - "className": "SingleFunctionKeywordBeforeInline", - "qualifiedClassName": "SingleFunctionKeywordBeforeInline", - "signals": [ - { - "access": "public", - "name": "mySignal", - "returnType": "void" - } - ], - "slots": [ - { - "access": "public", - "name": "mySlot", - "returnType": "void" - } - ], - "superClasses": [ - { - "access": "public", - "name": "QObject" - } - ] - }, - { - "className": "SingleFunctionKeywordAfterInline", - "qualifiedClassName": "SingleFunctionKeywordAfterInline", - "signals": [ - { - "access": "public", - "name": "mySignal", - "returnType": "void" - } - ], - "slots": [ - { - "access": "public", - "name": "mySlot", - "returnType": "void" - } - ], - "superClasses": [ - { - "access": "public", - "name": "QObject" - } - ] - } - ], - "inputFile": "single_function_keyword.h", - "outputRevision": 67 - }, - { - "classes": [ - { - "className": "Task192552", - "qualifiedClassName": "Task192552", - "superClasses": [ - { - "access": "public", - "name": "QObject" - } - ] - } - ], - "inputFile": "task192552.h", - "outputRevision": 67 - }, - { - "classes": [ - { - "className": "InlineSlotsWithThrowDeclaration", - "qualifiedClassName": "InlineSlotsWithThrowDeclaration", - "slots": [ - { - "access": "public", - "name": "a", - "returnType": "void" - }, - { - "access": "public", - "name": "b", - "returnType": "void" - }, - { - "access": "public", - "name": "c", - "returnType": "void" - }, - { - "access": "public", - "name": "d", - "returnType": "void" - }, - { - "access": "public", - "name": "e", - "returnType": "void" - } - ], - "superClasses": [ - { - "access": "public", - "name": "QObject" - } - ] - } - ], - "inputFile": "task189996.h", - "outputRevision": 67 - }, - { - "classes": [ - { - "className": "TestObject", - "qualifiedClassName": "NS_A::NS_B::TestObject", - "superClasses": [ - { - "access": "public", - "name": "QObject" - } - ] - }, - { - "className": "TestMain", - "qualifiedClassName": "NS_A::NS_Main::TestMain", - "superClasses": [ - { - "access": "public", - "name": "QObject" - } - ] - } - ], - "inputFile": "task234909.h", - "outputRevision": 67 - }, - { - "classes": [ - { - "className": "TypenameWithUnsigned", - "qualifiedClassName": "TypenameWithUnsigned", - "slots": [ - { - "access": "public", - "arguments": [ - { - "type": "uint" - } - ], - "name": "a", - "returnType": "void" - }, - { - "access": "public", - "arguments": [ - { - "name": "u", - "type": "uint" - } - ], - "name": "b", - "returnType": "void" - }, - { - "access": "public", - "arguments": [ - { - "type": "uint*" - } - ], - "name": "c", - "returnType": "void" - }, - { - "access": "public", - "arguments": [ - { - "name": "p", - "type": "uint*" - } - ], - "name": "d", - "returnType": "void" - }, - { - "access": "public", - "arguments": [ - { - "type": "uint&" - } - ], - "name": "e", - "returnType": "void" - }, - { - "access": "public", - "arguments": [ - { - "name": "r", - "type": "uint&" - } - ], - "name": "f", - "returnType": "void" - }, - { - "access": "public", - "arguments": [ - { - "type": "unsigned1" - } - ], - "name": "g", - "returnType": "void" - }, - { - "access": "public", - "arguments": [ - { - "name": "u1", - "type": "unsigned1" - } - ], - "name": "h", - "returnType": "void" - }, - { - "access": "public", - "arguments": [ - { - "type": "uint" - }, - { - "type": "unsigned1" - } - ], - "name": "i", - "returnType": "void" - }, - { - "access": "public", - "arguments": [ - { - "type": "unsigned1" - }, - { - "type": "uint" - } - ], - "name": "j", - "returnType": "void" - }, - { - "access": "public", - "arguments": [ - { - "type": "unsignedQImage" - } - ], - "name": "k", - "returnType": "void" - }, - { - "access": "public", - "arguments": [ - { - "name": "uqi", - "type": "unsignedQImage" - } - ], - "name": "l", - "returnType": "void" - } - ], - "superClasses": [ - { - "access": "public", - "name": "QObject" - } - ] - } - ], - "inputFile": "task240368.h", - "outputRevision": 67 - }, - { - "classes": [ - { - "className": "PureVirtualSignalsTest", - "qualifiedClassName": "PureVirtualSignalsTest", - "signals": [ - { - "access": "public", - "name": "mySignal", - "returnType": "void" - }, - { - "access": "public", - "name": "myOtherSignal", - "returnType": "void" - }, - { - "access": "public", - "arguments": [ - { - "name": "foo", - "type": "int" - } - ], - "name": "mySignal2", - "returnType": "void" - } - ], - "superClasses": [ - { - "access": "public", - "name": "QObject" - } - ] - }, - { - "className": "PureVirtualSignalsImpl", - "qualifiedClassName": "PureVirtualSignalsImpl", - "signals": [ - { - "access": "public", - "name": "mySignal", - "returnType": "void" - }, - { - "access": "public", - "arguments": [ - { - "name": "foo", - "type": "int" - } - ], - "name": "mySignal2", - "returnType": "void" - } - ], - "superClasses": [ - { - "access": "public", - "name": "PureVirtualSignalsTest" - } - ] - } - ], - "inputFile": "pure-virtual-signals.h", - "outputRevision": 67 - }, - { - "classes": [ - { "className": "CXX11Enums", "enums": [ { @@ -1101,102 +238,6 @@ { "classes": [ { - "className": "FinalTestClassQt", - "qualifiedClassName": "FinalTestClassQt", - "superClasses": [ - { - "access": "public", - "name": "QObject" - } - ] - }, - { - "className": "ExportedFinalTestClassQt", - "qualifiedClassName": "ExportedFinalTestClassQt", - "superClasses": [ - { - "access": "public", - "name": "QObject" - } - ] - }, - { - "className": "ExportedFinalTestClassQtX", - "qualifiedClassName": "ExportedFinalTestClassQtX", - "superClasses": [ - { - "access": "public", - "name": "QObject" - } - ] - }, - { - "className": "FinalTestClassCpp11", - "qualifiedClassName": "FinalTestClassCpp11", - "superClasses": [ - { - "access": "public", - "name": "QObject" - } - ] - }, - { - "className": "ExportedFinalTestClassCpp11", - "qualifiedClassName": "ExportedFinalTestClassCpp11", - "superClasses": [ - { - "access": "public", - "name": "QObject" - } - ] - }, - { - "className": "ExportedFinalTestClassCpp11X", - "qualifiedClassName": "ExportedFinalTestClassCpp11X", - "superClasses": [ - { - "access": "public", - "name": "QObject" - } - ] - }, - { - "className": "SealedTestClass", - "qualifiedClassName": "SealedTestClass", - "superClasses": [ - { - "access": "public", - "name": "QObject" - } - ] - }, - { - "className": "ExportedSealedTestClass", - "qualifiedClassName": "ExportedSealedTestClass", - "superClasses": [ - { - "access": "public", - "name": "QObject" - } - ] - }, - { - "className": "ExportedSealedTestClassX", - "qualifiedClassName": "ExportedSealedTestClassX", - "superClasses": [ - { - "access": "public", - "name": "QObject" - } - ] - } - ], - "inputFile": "cxx11-final-classes.h", - "outputRevision": 67 - }, - { - "classes": [ - { "className": "ExplicitOverrideControlBase", "qualifiedClassName": "ExplicitOverrideControlBase", "slots": [ @@ -1491,6 +532,196 @@ { "classes": [ { + "className": "FinalTestClassQt", + "qualifiedClassName": "FinalTestClassQt", + "superClasses": [ + { + "access": "public", + "name": "QObject" + } + ] + }, + { + "className": "ExportedFinalTestClassQt", + "qualifiedClassName": "ExportedFinalTestClassQt", + "superClasses": [ + { + "access": "public", + "name": "QObject" + } + ] + }, + { + "className": "ExportedFinalTestClassQtX", + "qualifiedClassName": "ExportedFinalTestClassQtX", + "superClasses": [ + { + "access": "public", + "name": "QObject" + } + ] + }, + { + "className": "FinalTestClassCpp11", + "qualifiedClassName": "FinalTestClassCpp11", + "superClasses": [ + { + "access": "public", + "name": "QObject" + } + ] + }, + { + "className": "ExportedFinalTestClassCpp11", + "qualifiedClassName": "ExportedFinalTestClassCpp11", + "superClasses": [ + { + "access": "public", + "name": "QObject" + } + ] + }, + { + "className": "ExportedFinalTestClassCpp11X", + "qualifiedClassName": "ExportedFinalTestClassCpp11X", + "superClasses": [ + { + "access": "public", + "name": "QObject" + } + ] + }, + { + "className": "SealedTestClass", + "qualifiedClassName": "SealedTestClass", + "superClasses": [ + { + "access": "public", + "name": "QObject" + } + ] + }, + { + "className": "ExportedSealedTestClass", + "qualifiedClassName": "ExportedSealedTestClass", + "superClasses": [ + { + "access": "public", + "name": "QObject" + } + ] + }, + { + "className": "ExportedSealedTestClassX", + "qualifiedClassName": "ExportedSealedTestClassX", + "superClasses": [ + { + "access": "public", + "name": "QObject" + } + ] + } + ], + "inputFile": "cxx11-final-classes.h", + "outputRevision": 67 + }, + { + "classes": [ + { + "className": "ClassInNamespace", + "enums": [ + { + "isClass": false, + "isFlag": false, + "name": "GadEn", + "values": [ + "Value" + ] + } + ], + "gadget": true, + "qualifiedClassName": "CXX17Namespace::A::B::C::D::ClassInNamespace" + }, + { + "className": "D", + "enums": [ + { + "isClass": false, + "isFlag": false, + "name": "NamEn", + "values": [ + "Value" + ] + } + ], + "gadget": true, + "qualifiedClassName": "CXX17Namespace::A::B::C::D" + } + ], + "inputFile": "cxx17-namespaces.h", + "outputRevision": 67 + }, + { + "classes": [ + { + "className": "DirInIncludePath", + "interfaces": [ + [ + { + "className": "MyInterface", + "id": "\"MyInterface\"" + } + ] + ], + "qualifiedClassName": "DirInIncludePath", + "superClasses": [ + { + "access": "public", + "name": "QObject" + }, + { + "access": "public", + "name": "MyInterface" + } + ] + } + ], + "inputFile": "dir-in-include-path.h", + "outputRevision": 67 + }, + { + "classes": [ + { + "classInfos": [ + { + "name": "Test", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\x53" + }, + { + "name": "Test2", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\123" + }, + { + "name": "Test3", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\nb" + } + ], + "className": "StringLiterals", + "qualifiedClassName": "StringLiterals", + "superClasses": [ + { + "access": "public", + "name": "QObject" + } + ] + } + ], + "inputFile": "escapes-in-string-literals.h", + "outputRevision": 67 + }, + { + "classes": [ + { "className": "ForwardDeclaredParamClass", "qualifiedClassName": "ForwardDeclaredParamClass", "signals": [ @@ -1691,6 +922,345 @@ { "classes": [ { + "className": "FunctionWithAttributes", + "qualifiedClassName": "FunctionWithAttributes", + "slots": [ + { + "access": "public", + "name": "test1", + "returnType": "void" + }, + { + "access": "public", + "name": "test2", + "returnType": "void" + } + ], + "superClasses": [ + { + "access": "public", + "name": "QObject" + } + ] + } + ], + "inputFile": "function-with-attributes.h", + "outputRevision": 67 + }, + { + "classes": [ + { + "className": "GadgetWithNoEnums", + "gadget": true, + "qualifiedClassName": "GadgetWithNoEnums" + }, + { + "className": "DerivedGadgetWithEnums", + "enums": [ + { + "isClass": false, + "isFlag": false, + "name": "FooEnum", + "values": [ + "FooValue" + ] + } + ], + "gadget": true, + "qualifiedClassName": "DerivedGadgetWithEnums", + "superClasses": [ + { + "access": "public", + "name": "GadgetWithNoEnums" + } + ] + } + ], + "inputFile": "gadgetwithnoenums.h", + "outputRevision": 67 + }, + { + "classes": [ + { + "className": "BaseGadget", + "gadget": true, + "qualifiedClassName": "GrandParentGadget::BaseGadget" + }, + { + "className": "DerivedGadget", + "gadget": true, + "qualifiedClassName": "GrandParentGadget::DerivedGadget", + "superClasses": [ + { + "access": "public", + "name": "Derived" + } + ] + }, + { + "className": "CRTPDerivedGadget", + "gadget": true, + "qualifiedClassName": "GrandParentGadget::CRTPDerivedGadget", + "superClasses": [ + { + "access": "public", + "name": "CRTP<CRTPDerivedGadget>" + } + ] + } + ], + "inputFile": "grand-parent-gadget-class.h", + "outputRevision": 67 + }, + { + "classes": [ + { + "className": "FooNamespace", + "enums": [ + { + "isClass": true, + "isFlag": false, + "name": "Enum1", + "values": [ + "Key1", + "Key2" + ] + } + ], + "gadget": true, + "qualifiedClassName": "FooNamespace" + }, + { + "className": "FooNestedNamespace", + "enums": [ + { + "isClass": true, + "isFlag": false, + "name": "Enum2", + "values": [ + "Key3", + "Key4" + ] + }, + { + "isClass": true, + "isFlag": false, + "name": "Enum3", + "values": [ + "Key5", + "Key6" + ] + } + ], + "gadget": true, + "qualifiedClassName": "FooNamespace::FooNestedNamespace" + }, + { + "className": "FooMoreNestedNamespace", + "enums": [ + { + "isClass": true, + "isFlag": false, + "name": "Enum4", + "values": [ + "Key7", + "Key8" + ] + } + ], + "gadget": true, + "qualifiedClassName": "FooNamespace::FooNestedNamespace::FooMoreNestedNamespace" + } + ], + "inputFile": "namespace.h", + "outputRevision": 67 + }, + { + "classes": [ + { + "className": "Bar", + "enums": [ + { + "alias": "Flag", + "isClass": false, + "isFlag": true, + "name": "Flags", + "values": [ + "Read", + "Write" + ] + } + ], + "properties": [ + { + "constant": false, + "designable": true, + "final": false, + "name": "flags", + "read": "flags", + "scriptable": true, + "stored": true, + "type": "Flags", + "user": false, + "write": "setFlags" + } + ], + "qualifiedClassName": "Foo::Bar", + "superClasses": [ + { + "access": "public", + "name": "QObject" + } + ] + }, + { + "className": "Baz", + "properties": [ + { + "constant": false, + "designable": true, + "final": false, + "name": "flags", + "read": "flags", + "scriptable": true, + "stored": true, + "type": "Foo::Bar::Flags", + "user": false, + "write": "setFlags" + }, + { + "constant": false, + "designable": true, + "final": false, + "name": "flagsList", + "read": "flagsList", + "scriptable": true, + "stored": true, + "type": "QVector<Foo::Bar::Flags>", + "user": false, + "write": "setFlagsList" + } + ], + "qualifiedClassName": "Foo::Baz", + "superClasses": [ + { + "access": "public", + "name": "QObject" + } + ] + } + ], + "inputFile": "namespaced-flags.h", + "outputRevision": 67 + }, + { + "classes": [ + { + "className": "MyBooooooostishClass", + "qualifiedClassName": "MyBooooooostishClass", + "signals": [ + { + "access": "public", + "name": "mySignal", + "returnType": "void" + } + ], + "slots": [ + { + "access": "public", + "name": "mySlot", + "returnType": "void" + } + ], + "superClasses": [ + { + "access": "public", + "name": "QObject" + } + ] + } + ], + "inputFile": "no-keywords.h", + "outputRevision": 67 + }, + { + "classes": [ + { + "className": "Derived", + "gadget": true, + "qualifiedClassName": "NonGadgetParent::Derived", + "superClasses": [ + { + "access": "public", + "name": "Base" + } + ] + } + ], + "inputFile": "non-gadget-parent-class.h", + "outputRevision": 67 + }, + { + "classes": [ + { + "className": "OldStyleCast", + "qualifiedClassName": "OldStyleCast", + "slots": [ + { + "access": "public", + "name": "foo", + "returnType": "void" + }, + { + "access": "public", + "arguments": [ + { + "type": "int" + }, + { + "type": "int*" + }, + { + "type": "const int*" + }, + { + "type": "volatile int*" + }, + { + "type": "const int*volatile*" + } + ], + "name": "bar", + "returnType": "int" + }, + { + "access": "public", + "arguments": [ + { + "type": "int" + }, + { + "type": "QObject*const" + } + ], + "name": "slot", + "returnType": "void" + } + ], + "superClasses": [ + { + "access": "public", + "name": "QObject" + } + ] + } + ], + "inputFile": "oldstyle-casts.h", + "outputRevision": 67 + }, + { + "classes": [ + { "classInfos": [ { "name": "TestString", @@ -1890,17 +1460,44 @@ { "classes": [ { - "className": "FunctionWithAttributes", - "qualifiedClassName": "FunctionWithAttributes", - "slots": [ + "className": "TestPluginMetaData", + "qualifiedClassName": "TestPluginMetaData", + "superClasses": [ { "access": "public", - "name": "test1", + "name": "QObject" + } + ] + } + ], + "inputFile": "plugin_metadata.h", + "outputRevision": 67 + }, + { + "classes": [ + { + "className": "PureVirtualSignalsTest", + "qualifiedClassName": "PureVirtualSignalsTest", + "signals": [ + { + "access": "public", + "name": "mySignal", "returnType": "void" }, { "access": "public", - "name": "test2", + "name": "myOtherSignal", + "returnType": "void" + }, + { + "access": "public", + "arguments": [ + { + "name": "foo", + "type": "int" + } + ], + "name": "mySignal2", "returnType": "void" } ], @@ -1910,16 +1507,73 @@ "name": "QObject" } ] + }, + { + "className": "PureVirtualSignalsImpl", + "qualifiedClassName": "PureVirtualSignalsImpl", + "signals": [ + { + "access": "public", + "name": "mySignal", + "returnType": "void" + }, + { + "access": "public", + "arguments": [ + { + "name": "foo", + "type": "int" + } + ], + "name": "mySignal2", + "returnType": "void" + } + ], + "superClasses": [ + { + "access": "public", + "name": "PureVirtualSignalsTest" + } + ] } ], - "inputFile": "function-with-attributes.h", + "inputFile": "pure-virtual-signals.h", "outputRevision": 67 }, { "classes": [ { - "className": "TestPluginMetaData", - "qualifiedClassName": "TestPluginMetaData", + "className": "InvokableBeforeReturnType", + "methods": [ + { + "access": "public", + "name": "foo", + "returnType": "const char*" + } + ], + "qualifiedClassName": "InvokableBeforeReturnType", + "superClasses": [ + { + "access": "public", + "name": "QObject" + } + ] + }, + { + "className": "InvokableBeforeInline", + "methods": [ + { + "access": "public", + "name": "foo", + "returnType": "void" + }, + { + "access": "public", + "name": "bar", + "returnType": "void" + } + ], + "qualifiedClassName": "InvokableBeforeInline", "superClasses": [ { "access": "public", @@ -1928,24 +1582,28 @@ ] } ], - "inputFile": "plugin_metadata.h", + "inputFile": "qinvokable.h", "outputRevision": 67 }, { "classes": [ { - "className": "KDAB", - "enums": [ + "className": "TestQPrivateSlots", + "methods": [ { - "isClass": false, - "isFlag": false, - "name": "Salaries", - "values": [ - "Steve" - ] + "access": "private", + "name": "method1", + "returnType": "void" + } + ], + "qualifiedClassName": "TestQPrivateSlots", + "slots": [ + { + "access": "private", + "name": "_q_privateslot", + "returnType": "void" } ], - "qualifiedClassName": "KDAB", "superClasses": [ { "access": "public", @@ -1954,7 +1612,7 @@ ] } ], - "inputFile": "single-quote-digit-separator-n3781.h", + "inputFile": "qprivateslots.h", "outputRevision": 67 }, { @@ -1971,14 +1629,15 @@ ] } ], - "qualifiedClassName": "QTBUG_2151::A", - "superClasses": [ - { - "access": "public", - "name": "QObject" - } - ] - }, + "gadget": true, + "qualifiedClassName": "QTBUG_35657::A" + } + ], + "inputFile": "qtbug-35657-gadget.h", + "outputRevision": 67 + }, + { + "classes": [ { "className": "B", "properties": [ @@ -1994,7 +1653,7 @@ "user": false } ], - "qualifiedClassName": "QTBUG_2151::B", + "qualifiedClassName": "QTBUG_35657::B", "superClasses": [ { "access": "public", @@ -2003,7 +1662,7 @@ ] } ], - "inputFile": "related-metaobjects-in-namespaces.h", + "inputFile": "related-metaobjects-in-gadget.h", "outputRevision": 67 }, { @@ -2020,66 +1679,15 @@ ] } ], - "gadget": true, - "qualifiedClassName": "QTBUG_35657::A" - } - ], - "inputFile": "qtbug-35657-gadget.h", - "outputRevision": 67 - }, - { - "classes": [ - { - "className": "Derived", - "gadget": true, - "qualifiedClassName": "NonGadgetParent::Derived", - "superClasses": [ - { - "access": "public", - "name": "Base" - } - ] - } - ], - "inputFile": "non-gadget-parent-class.h", - "outputRevision": 67 - }, - { - "classes": [ - { - "className": "BaseGadget", - "gadget": true, - "qualifiedClassName": "GrandParentGadget::BaseGadget" - }, - { - "className": "DerivedGadget", - "gadget": true, - "qualifiedClassName": "GrandParentGadget::DerivedGadget", + "qualifiedClassName": "QTBUG_2151::A", "superClasses": [ { "access": "public", - "name": "Derived" + "name": "QObject" } ] }, { - "className": "CRTPDerivedGadget", - "gadget": true, - "qualifiedClassName": "GrandParentGadget::CRTPDerivedGadget", - "superClasses": [ - { - "access": "public", - "name": "CRTP<CRTPDerivedGadget>" - } - ] - } - ], - "inputFile": "grand-parent-gadget-class.h", - "outputRevision": 67 - }, - { - "classes": [ - { "className": "B", "properties": [ { @@ -2094,7 +1702,7 @@ "user": false } ], - "qualifiedClassName": "QTBUG_35657::B", + "qualifiedClassName": "QTBUG_2151::B", "superClasses": [ { "access": "public", @@ -2103,7 +1711,7 @@ ] } ], - "inputFile": "related-metaobjects-in-gadget.h", + "inputFile": "related-metaobjects-in-namespaces.h", "outputRevision": 67 }, { @@ -2520,100 +2128,449 @@ { "classes": [ { - "className": "FooNamespace", + "className": "KDAB", "enums": [ { - "isClass": true, + "isClass": false, "isFlag": false, - "name": "Enum1", + "name": "Salaries", "values": [ - "Key1", - "Key2" + "Steve" ] } ], - "gadget": true, - "qualifiedClassName": "FooNamespace" + "qualifiedClassName": "KDAB", + "superClasses": [ + { + "access": "public", + "name": "QObject" + } + ] + } + ], + "inputFile": "single-quote-digit-separator-n3781.h", + "outputRevision": 67 + }, + { + "classes": [ + { + "className": "SingleFunctionKeywordBeforeReturnType", + "qualifiedClassName": "SingleFunctionKeywordBeforeReturnType", + "signals": [ + { + "access": "public", + "name": "mySignal", + "returnType": "void" + } + ], + "slots": [ + { + "access": "public", + "name": "mySlot", + "returnType": "void" + } + ], + "superClasses": [ + { + "access": "public", + "name": "QObject" + } + ] }, { - "className": "FooNestedNamespace", - "enums": [ + "className": "SingleFunctionKeywordBeforeInline", + "qualifiedClassName": "SingleFunctionKeywordBeforeInline", + "signals": [ { - "isClass": true, - "isFlag": false, - "name": "Enum2", - "values": [ - "Key3", - "Key4" - ] - }, + "access": "public", + "name": "mySignal", + "returnType": "void" + } + ], + "slots": [ { - "isClass": true, - "isFlag": false, - "name": "Enum3", - "values": [ - "Key5", - "Key6" - ] + "access": "public", + "name": "mySlot", + "returnType": "void" } ], - "gadget": true, - "qualifiedClassName": "FooNamespace::FooNestedNamespace" + "superClasses": [ + { + "access": "public", + "name": "QObject" + } + ] }, { - "className": "FooMoreNestedNamespace", - "enums": [ + "className": "SingleFunctionKeywordAfterInline", + "qualifiedClassName": "SingleFunctionKeywordAfterInline", + "signals": [ { - "isClass": true, - "isFlag": false, - "name": "Enum4", - "values": [ - "Key7", - "Key8" - ] + "access": "public", + "name": "mySignal", + "returnType": "void" } ], - "gadget": true, - "qualifiedClassName": "FooNamespace::FooNestedNamespace::FooMoreNestedNamespace" + "slots": [ + { + "access": "public", + "name": "mySlot", + "returnType": "void" + } + ], + "superClasses": [ + { + "access": "public", + "name": "QObject" + } + ] } ], - "inputFile": "namespace.h", + "inputFile": "single_function_keyword.h", "outputRevision": 67 }, { "classes": [ { - "className": "ClassInNamespace", - "enums": [ + "className": "SlotsWithVoidTemplateTest", + "qualifiedClassName": "SlotsWithVoidTemplateTest", + "signals": [ { - "isClass": false, - "isFlag": false, - "name": "GadEn", - "values": [ - "Value" - ] + "access": "public", + "arguments": [ + { + "type": "TestTemplate<void>" + } + ], + "name": "mySignal", + "returnType": "void" + }, + { + "access": "public", + "name": "myVoidSignal", + "returnType": "void" + }, + { + "access": "public", + "name": "myVoidSignal2", + "returnType": "void" } ], - "gadget": true, - "qualifiedClassName": "CXX17Namespace::A::B::C::D::ClassInNamespace" + "slots": [ + { + "access": "public", + "name": "dummySlot", + "returnType": "void" + }, + { + "access": "public", + "name": "dummySlot2", + "returnType": "void" + }, + { + "access": "public", + "arguments": [ + { + "type": "TestTemplate<void>" + } + ], + "name": "anotherSlot", + "returnType": "void" + }, + { + "access": "public", + "name": "mySlot", + "returnType": "TestTemplate<void>" + } + ], + "superClasses": [ + { + "access": "public", + "name": "QObject" + } + ] + } + ], + "inputFile": "slots-with-void-template.h", + "outputRevision": 67 + }, + { + "classes": [ + { + "className": "Task192552", + "qualifiedClassName": "Task192552", + "superClasses": [ + { + "access": "public", + "name": "QObject" + } + ] + } + ], + "inputFile": "task192552.h", + "outputRevision": 67 + }, + { + "classes": [ + { + "className": "TestObject", + "qualifiedClassName": "NS_A::NS_B::TestObject", + "superClasses": [ + { + "access": "public", + "name": "QObject" + } + ] }, { - "className": "D", - "enums": [ + "className": "TestMain", + "qualifiedClassName": "NS_A::NS_Main::TestMain", + "superClasses": [ { - "isClass": false, - "isFlag": false, - "name": "NamEn", - "values": [ - "Value" - ] + "access": "public", + "name": "QObject" + } + ] + } + ], + "inputFile": "task234909.h", + "outputRevision": 67 + }, + { + "classes": [ + { + "className": "TypenameWithUnsigned", + "qualifiedClassName": "TypenameWithUnsigned", + "slots": [ + { + "access": "public", + "arguments": [ + { + "type": "uint" + } + ], + "name": "a", + "returnType": "void" + }, + { + "access": "public", + "arguments": [ + { + "name": "u", + "type": "uint" + } + ], + "name": "b", + "returnType": "void" + }, + { + "access": "public", + "arguments": [ + { + "type": "uint*" + } + ], + "name": "c", + "returnType": "void" + }, + { + "access": "public", + "arguments": [ + { + "name": "p", + "type": "uint*" + } + ], + "name": "d", + "returnType": "void" + }, + { + "access": "public", + "arguments": [ + { + "type": "uint&" + } + ], + "name": "e", + "returnType": "void" + }, + { + "access": "public", + "arguments": [ + { + "name": "r", + "type": "uint&" + } + ], + "name": "f", + "returnType": "void" + }, + { + "access": "public", + "arguments": [ + { + "type": "unsigned1" + } + ], + "name": "g", + "returnType": "void" + }, + { + "access": "public", + "arguments": [ + { + "name": "u1", + "type": "unsigned1" + } + ], + "name": "h", + "returnType": "void" + }, + { + "access": "public", + "arguments": [ + { + "type": "uint" + }, + { + "type": "unsigned1" + } + ], + "name": "i", + "returnType": "void" + }, + { + "access": "public", + "arguments": [ + { + "type": "unsigned1" + }, + { + "type": "uint" + } + ], + "name": "j", + "returnType": "void" + }, + { + "access": "public", + "arguments": [ + { + "type": "unsignedQImage" + } + ], + "name": "k", + "returnType": "void" + }, + { + "access": "public", + "arguments": [ + { + "name": "uqi", + "type": "unsignedQImage" + } + ], + "name": "l", + "returnType": "void" } ], - "gadget": true, - "qualifiedClassName": "CXX17Namespace::A::B::C::D" + "superClasses": [ + { + "access": "public", + "name": "QObject" + } + ] } ], - "inputFile": "cxx17-namespaces.h", + "inputFile": "task240368.h", + "outputRevision": 67 + }, + { + "classes": [ + { + "className": "Task87883", + "qualifiedClassName": "Task87883", + "superClasses": [ + { + "access": "public", + "name": "QObject" + } + ] + } + ], + "inputFile": "task87883.h", + "outputRevision": 67 + }, + { + "classes": [ + { + "className": "Foo", + "qualifiedClassName": "BBB::Foo", + "signals": [ + { + "access": "public", + "arguments": [ + { + "type": "QVector<QVector<int> >" + } + ], + "name": "foo", + "returnType": "void" + }, + { + "access": "public", + "arguments": [ + { + "type": "QVector<QVector<int> >" + } + ], + "name": "foo2", + "returnType": "void" + }, + { + "access": "public", + "arguments": [ + { + "type": "QVector< ::AAA::BaseA*>" + } + ], + "name": "bar", + "returnType": "void" + }, + { + "access": "public", + "arguments": [ + { + "type": "QVector< ::AAA::BaseA*>" + } + ], + "name": "bar2", + "returnType": "void" + }, + { + "access": "public", + "arguments": [ + { + "type": "QVector<const ::AAA::BaseA*>" + } + ], + "name": "bar3", + "returnType": "void" + } + ], + "superClasses": [ + { + "access": "public", + "name": "QObject" + }, + { + "access": "public", + "name": "::AAA::BaseA" + } + ] + } + ], + "inputFile": "trigraphs.h", "outputRevision": 67 } ] diff --git a/tests/auto/tools/moc/moc.pro b/tests/auto/tools/moc/moc.pro index 1794bafd2c..93ca330126 100644 --- a/tests/auto/tools/moc/moc.pro +++ b/tests/auto/tools/moc/moc.pro @@ -15,7 +15,7 @@ cross_compile: DEFINES += MOC_CROSS_COMPILED HEADERS += using-namespaces.h no-keywords.h task87883.h c-comments.h backslash-newlines.h oldstyle-casts.h \ slots-with-void-template.h qinvokable.h namespaced-flags.h trigraphs.h \ escapes-in-string-literals.h cstyle-enums.h qprivateslots.h gadgetwithnoenums.h \ - dir-in-include-path.h single_function_keyword.h task192552.h task189996.h \ + dir-in-include-path.h single_function_keyword.h task192552.h \ task234909.h task240368.h pure-virtual-signals.h cxx11-enums.h \ cxx11-final-classes.h \ cxx11-explicit-override-control.h \ diff --git a/tests/auto/tools/moc/task189996.h b/tests/auto/tools/moc/task189996.h deleted file mode 100644 index f94a051b3a..0000000000 --- a/tests/auto/tools/moc/task189996.h +++ /dev/null @@ -1,47 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -// inline functions can have throw declarations - -#ifndef TASK189996_H -#define TASK189996_H - -#include <QObject> - -class InlineSlotsWithThrowDeclaration : public QObject -{ - Q_OBJECT - -public slots: - void a() throw() { } - void b() const throw() { } - void c() throw(); - void d() throw(int) { } - void e() const throw(int,double) { } -}; - -#endif diff --git a/tests/auto/tools/moc/tst_moc.cpp b/tests/auto/tools/moc/tst_moc.cpp index 6b202f79a6..e5de647930 100644 --- a/tests/auto/tools/moc/tst_moc.cpp +++ b/tests/auto/tools/moc/tst_moc.cpp @@ -630,7 +630,6 @@ public: private slots: void initTestCase(); - void slotWithException() throw(MyStruct); void dontStripNamespaces(); void oldStyleCasts(); void warnOnExtraSignalSlotQualifiaction(); @@ -672,7 +671,6 @@ private slots: void templateGtGt(); void qprivateslots(); void qprivateproperties(); - void inlineSlotsWithThrowDeclaration(); void warnOnPropertyWithoutREAD(); void constructors(); void typenameWithUnsigned(); @@ -781,12 +779,6 @@ void tst_Moc::initTestCase() #endif } -void tst_Moc::slotWithException() throw(MyStruct) -{ - // be happy - QVERIFY(true); -} - void tst_Moc::dontStripNamespaces() { Sender sender; @@ -821,7 +813,7 @@ void tst_Moc::oldStyleCasts() QStringList args; args << "-c" << "-x" << "c++" << "-Wold-style-cast" << "-I" << "." - << "-I" << qtIncludePath << "-o" << "/dev/null" << "-fPIC" << "-std=c++11" << "-"; + << "-I" << qtIncludePath << "-o" << "/dev/null" << "-fPIC" << "-std=c++1z" << "-"; proc.start("gcc", args); QVERIFY(proc.waitForStarted()); proc.write(mocOut); @@ -891,7 +883,7 @@ void tst_Moc::inputFileNameWithDotsButNoExtension() QStringList args; args << "-c" << "-x" << "c++" << "-I" << ".." - << "-I" << qtIncludePath << "-o" << "/dev/null" << "-fPIC" << "-std=c++11" << "-"; + << "-I" << qtIncludePath << "-o" << "/dev/null" << "-fPIC" << "-std=c++1z" << "-"; proc.start("gcc", args); QVERIFY(proc.waitForStarted()); proc.write(mocOut); @@ -1171,7 +1163,7 @@ void tst_Moc::ignoreOptionClashes() QStringList gccArgs; gccArgs << "-c" << "-x" << "c++" << "-I" << ".." << "-I" << qtIncludePath << "-I" << includeDir << "-o" << "/dev/null" - << "-fPIC" << "-std=c++11" << "-"; + << "-fPIC" << "-std=c++1z" << "-"; proc.start("gcc", gccArgs); QVERIFY(proc.waitForStarted()); proc.write(mocOut); @@ -1590,21 +1582,6 @@ void tst_Moc::qprivateproperties() } -#include "task189996.h" - -void InlineSlotsWithThrowDeclaration::c() throw() {} - -void tst_Moc::inlineSlotsWithThrowDeclaration() -{ - InlineSlotsWithThrowDeclaration tst; - const QMetaObject *mobj = tst.metaObject(); - QVERIFY(mobj->indexOfSlot("a()") != -1); - QVERIFY(mobj->indexOfSlot("b()") != -1); - QVERIFY(mobj->indexOfSlot("c()") != -1); - QVERIFY(mobj->indexOfSlot("d()") != -1); - QVERIFY(mobj->indexOfSlot("e()") != -1); -} - void tst_Moc::warnOnPropertyWithoutREAD() { #ifdef MOC_CROSS_COMPILED @@ -1866,7 +1843,7 @@ void tst_Moc::notifyError() QStringList args; args << "-c" << "-x" << "c++" << "-I" << "." - << "-I" << qtIncludePath << "-o" << "/dev/null" << "-fPIC" << "-std=c++11" << "-"; + << "-I" << qtIncludePath << "-o" << "/dev/null" << "-fPIC" << "-std=c++1z" << "-"; proc.start("gcc", args); QVERIFY(proc.waitForStarted()); proc.write(mocOut); diff --git a/tests/auto/widgets/dialogs/qwizard/tst_qwizard.cpp b/tests/auto/widgets/dialogs/qwizard/tst_qwizard.cpp index 9ae4508bc1..dae274a8b6 100644 --- a/tests/auto/widgets/dialogs/qwizard/tst_qwizard.cpp +++ b/tests/auto/widgets/dialogs/qwizard/tst_qwizard.cpp @@ -96,8 +96,9 @@ private slots: void task248107_backButton(); void task255350_fieldObjectDestroyed(); void taskQTBUG_25691_fieldObjectDestroyed2(); +#if QT_CONFIG(shortcut) void taskQTBUG_46894_nextButtonShortcut(); - +#endif /* Things that could be added: @@ -2703,6 +2704,8 @@ void tst_QWizard::taskQTBUG_25691_fieldObjectDestroyed2() ::taskQTBUG_25691_fieldObjectDestroyed2(); } +#if QT_CONFIG(shortcut) + void tst_QWizard::taskQTBUG_46894_nextButtonShortcut() { for (int i = 0; i < QWizard::NStyles; ++i) { @@ -2717,5 +2720,7 @@ void tst_QWizard::taskQTBUG_46894_nextButtonShortcut() } } +#endif // QT_CONFIG(shortcut) + QTEST_MAIN(tst_QWizard) #include "tst_qwizard.moc" diff --git a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp index 262e1772a0..0010718d3e 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp @@ -450,7 +450,9 @@ private slots: void modality_keyEvents(); void itemIsInFront(); void scenePosChange(); +#if QT_CONFIG(shortcut) void textItem_shortcuts(); +#endif void scroll(); void focusHandling_data(); void focusHandling(); @@ -10801,6 +10803,8 @@ void tst_QGraphicsItem::scenePosChange() QCOMPARE(child2->changes.count(QGraphicsItem::ItemScenePositionHasChanged), 0); } +#if QT_CONFIG(shortcut) + void tst_QGraphicsItem::textItem_shortcuts() { if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::WindowActivation)) @@ -10840,6 +10844,8 @@ void tst_QGraphicsItem::textItem_shortcuts() QTRY_COMPARE(item->textCursor().selectedText(), item->toPlainText()); } +#endif // QT_CONFIG(shortcut) + void tst_QGraphicsItem::scroll() { // Create two overlapping rectangles in the scene: diff --git a/tests/auto/widgets/graphicsview/qgraphicsview/qgraphicsview.pro b/tests/auto/widgets/graphicsview/qgraphicsview/qgraphicsview.pro index 8ed19697a4..e95cdcf7d8 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsview/qgraphicsview.pro +++ b/tests/auto/widgets/graphicsview/qgraphicsview/qgraphicsview.pro @@ -4,6 +4,7 @@ TARGET = tst_qgraphicsview QT += widgets widgets-private testlib QT += core-private gui-private testlib-private +qtConfig(opengl): QT += opengl SOURCES += tst_qgraphicsview.cpp tst_qgraphicsview_2.cpp HEADERS += tst_qgraphicsview.h diff --git a/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp b/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp index ea89e2422b..d521c6f11c 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp @@ -48,8 +48,8 @@ #include <QtWidgets/QBoxLayout> #include <QtWidgets/QStyle> #include <QtWidgets/QPushButton> -#ifndef QT_NO_OPENGL -#include <QtWidgets/QOpenGLWidget> +#if QT_CONFIG(opengl) +#include <QtOpenGL/QOpenGLWidget> #endif #include <private/qgraphicsscene_p.h> #include <private/qgraphicsview_p.h> @@ -154,7 +154,7 @@ private slots: void sceneRect_growing(); void setSceneRect(); void viewport(); -#ifndef QT_NO_OPENGL +#if QT_CONFIG(opengl) void openGLViewport(); #endif void dragMode_scrollHand(); @@ -659,7 +659,7 @@ void tst_QGraphicsView::viewport() QVERIFY(QTest::qWaitForWindowExposed(&view)); } -#ifndef QT_NO_OPENGL +#if QT_CONFIG(opengl) void tst_QGraphicsView::openGLViewport() { if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::OpenGL)) diff --git a/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp b/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp index d5813d64ff..bb098f32c2 100644 --- a/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp +++ b/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp @@ -1744,7 +1744,7 @@ void tst_QHeaderView::restoreQt4State() QCOMPARE(h2.length(), old_length); QCOMPARE(h2.saveState(), old_state); #else - QSKIP("Qt4 compatibility no longer needed in Qt6") + QSKIP("Qt4 compatibility no longer needed in Qt6"); #endif } diff --git a/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp b/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp index ea3eb5fd0c..544069243f 100644 --- a/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp +++ b/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp @@ -331,8 +331,10 @@ private slots: void selectColumn_data(); void selectColumn(); +#if QT_CONFIG(shortcut) void selectall_data(); void selectall(); +#endif void visualRect_data(); void visualRect(); @@ -1843,6 +1845,8 @@ void tst_QTableView::selectColumn() QCOMPARE(view.selectionModel()->selectedIndexes().at(i).column(), column); } +#if QT_CONFIG(shortcut) + void tst_QTableView::selectall_data() { QTest::addColumn<int>("rowCount"); @@ -1999,6 +2003,8 @@ void tst_QTableView::selectall() QCOMPARE(view.selectedIndexes().count(), 0); } +#endif // QT_CONFIG(shortcut) + void tst_QTableView::visualRect_data() { QTest::addColumn<int>("rowCount"); diff --git a/tests/auto/widgets/kernel/kernel.pro b/tests/auto/widgets/kernel/kernel.pro index af85a2bd13..9d0bf58b03 100644 --- a/tests/auto/widgets/kernel/kernel.pro +++ b/tests/auto/widgets/kernel/kernel.pro @@ -1,7 +1,5 @@ TEMPLATE=subdirs SUBDIRS=\ - qaction \ - qactiongroup \ qapplication \ qboxlayout \ qdesktopwidget \ @@ -13,7 +11,6 @@ SUBDIRS=\ qtooltip \ qwidget \ qwidget_window \ - qwidgetaction \ qwidgetmetatype \ qwidgetsvariant \ qwindowcontainer \ @@ -22,3 +19,11 @@ SUBDIRS=\ darwin:SUBDIRS -= \ # Uses native recognizers qgesturerecognizer \ + +!qtConfig(action):SUBDIRS -= \ + qaction \ + qactiongroup \ + qwidgetaction + +!qtConfig(shortcut): SUBDIRS -= \ + qshortcut diff --git a/tests/auto/widgets/kernel/qaction/tst_qaction.cpp b/tests/auto/widgets/kernel/qaction/tst_qaction.cpp index 1247f48dd0..cf8539da68 100644 --- a/tests/auto/widgets/kernel/qaction/tst_qaction.cpp +++ b/tests/auto/widgets/kernel/qaction/tst_qaction.cpp @@ -50,30 +50,25 @@ public: private slots: void init(); void cleanup(); - void getSetCheck(); - void setText_data(); - void setText(); - void setIconText_data() { setText_data(); } - void setIconText(); void setUnknownFont(); void actionEvent(); - void setStandardKeys(); +#if QT_CONFIG(shortcut) void alternateShortcuts(); void enabledVisibleInteraction(); - void task200823_tooltip(); - void task229128TriggeredSignalWithoutActiongroup(); +#endif void task229128TriggeredSignalWhenInActiongroup(); +#if QT_CONFIG(shortcut) void repeat(); - void setData(); void keysequence(); // QTBUG-53381 void disableShortcutsWithBlockedWidgets_data(); void disableShortcutsWithBlockedWidgets(); void shortcutFromKeyEvent(); // QTBUG-48325 +#endif private: QEvent::Type m_lastEventType; const int m_keyboardScheme; - QAction *m_lastAction; + QGuiAction *m_lastAction; }; tst_QAction::tst_QAction() @@ -92,33 +87,6 @@ void tst_QAction::cleanup() QVERIFY(QApplication::topLevelWidgets().isEmpty()); } -// Testing get/set functions -void tst_QAction::getSetCheck() -{ - QAction obj1(nullptr); - // QActionGroup * QAction::actionGroup() - // void QAction::setActionGroup(QActionGroup *) - QActionGroup *var1 = new QActionGroup(nullptr); - obj1.setActionGroup(var1); - QCOMPARE(var1, obj1.actionGroup()); - obj1.setActionGroup(nullptr); - QCOMPARE(obj1.actionGroup(), nullptr); - delete var1; - - // QMenu * QAction::menu() - // void QAction::setMenu(QMenu *) - QMenu *var2 = new QMenu(nullptr); - obj1.setMenu(var2); - QCOMPARE(var2, obj1.menu()); - obj1.setMenu(nullptr); - QCOMPARE(obj1.menu(), nullptr); - delete var2; - - QCOMPARE(obj1.priority(), QAction::NormalPriority); - obj1.setPriority(QAction::LowPriority); - QCOMPARE(obj1.priority(), QAction::LowPriority); -} - class MyWidget : public QWidget { Q_OBJECT @@ -133,43 +101,6 @@ private: tst_QAction *m_test; }; -void tst_QAction::setText_data() -{ - QTest::addColumn<QString>("text"); - QTest::addColumn<QString>("iconText"); - QTest::addColumn<QString>("textFromIconText"); - - //next we fill it with data - QTest::newRow("Normal") << "Action" << "Action" << "Action"; - QTest::newRow("Ampersand") << "Search && Destroy" << "Search & Destroy" << "Search && Destroy"; - QTest::newRow("Mnemonic and ellipsis") << "O&pen File ..." << "Open File" << "Open File"; -} - -void tst_QAction::setText() -{ - QFETCH(QString, text); - - QAction action(nullptr); - action.setText(text); - - QCOMPARE(action.text(), text); - - QFETCH(QString, iconText); - QCOMPARE(action.iconText(), iconText); -} - -void tst_QAction::setIconText() -{ - QFETCH(QString, iconText); - - QAction action(nullptr); - action.setIconText(iconText); - QCOMPARE(action.iconText(), iconText); - - QFETCH(QString, textFromIconText); - QCOMPARE(action.text(), textFromIconText); -} - void tst_QAction::setUnknownFont() // QTBUG-42728 { QAction action(nullptr); @@ -221,34 +152,7 @@ void tst_QAction::actionEvent() QCOMPARE(m_lastAction, &a); } -//basic testing of standard keys -void tst_QAction::setStandardKeys() -{ - QAction act(nullptr); - act.setShortcut(QKeySequence("CTRL+L")); - QList<QKeySequence> list; - act.setShortcuts(list); - act.setShortcuts(QKeySequence::Copy); - QCOMPARE(act.shortcut(), act.shortcuts().constFirst()); - - QList<QKeySequence> expected; - const QKeySequence ctrlC = QKeySequence(QStringLiteral("CTRL+C")); - const QKeySequence ctrlInsert = QKeySequence(QStringLiteral("CTRL+INSERT")); - switch (m_keyboardScheme) { - case QPlatformTheme::MacKeyboardScheme: - expected << ctrlC; - break; - case QPlatformTheme::WindowsKeyboardScheme: - expected << ctrlC << ctrlInsert; - break; - default: // X11 - expected << ctrlC << ctrlInsert << QKeySequence(QStringLiteral("F16")); - break; - } - - QCOMPARE(act.shortcuts(), expected); -} - +#if QT_CONFIG(shortcut) void tst_QAction::alternateShortcuts() { @@ -354,38 +258,7 @@ void tst_QAction::enabledVisibleInteraction() QCOMPARE(spy.count(), 1); //act is visible and enabled, so trigger } -void tst_QAction::task200823_tooltip() -{ - const QScopedPointer<QAction> action(new QAction("foo", nullptr)); - QString shortcut("ctrl+o"); - action->setShortcut(shortcut); - - // we want a non-standard tooltip that shows the shortcut - action->setToolTip(action->text() + QLatin1String(" (") + action->shortcut().toString() + QLatin1Char(')')); - - QString ref = QLatin1String("foo (") + QKeySequence(shortcut).toString() + QLatin1Char(')'); - QCOMPARE(action->toolTip(), ref); -} - -void tst_QAction::task229128TriggeredSignalWithoutActiongroup() -{ - // test without a group - const QScopedPointer<QAction> actionWithoutGroup(new QAction("Test", nullptr)); - QSignalSpy spyWithoutGroup(actionWithoutGroup.data(), QOverload<bool>::of(&QAction::triggered)); - QCOMPARE(spyWithoutGroup.count(), 0); - actionWithoutGroup->trigger(); - // signal should be emitted - QCOMPARE(spyWithoutGroup.count(), 1); - - // it is now a checkable checked action - actionWithoutGroup->setCheckable(true); - actionWithoutGroup->setChecked(true); - spyWithoutGroup.clear(); - QCOMPARE(spyWithoutGroup.count(), 0); - actionWithoutGroup->trigger(); - // signal should be emitted - QCOMPARE(spyWithoutGroup.count(), 1); -} +#endif // QT_CONFIG(shortcut) void tst_QAction::task229128TriggeredSignalWhenInActiongroup() { @@ -408,6 +281,8 @@ void tst_QAction::task229128TriggeredSignalWhenInActiongroup() QCOMPARE(actionSpy.count(), 1); } +#if QT_CONFIG(shortcut) + void tst_QAction::repeat() { if (QGuiApplication::platformName().startsWith(QLatin1String("wayland"), Qt::CaseInsensitive)) @@ -452,21 +327,6 @@ void tst_QAction::repeat() QCOMPARE(spy.count(), 2); } -void tst_QAction::setData() // QTBUG-62006 -{ - QAction act(nullptr); - QSignalSpy spy(&act, &QAction::changed); - QCOMPARE(act.data(), QVariant()); - QCOMPARE(spy.count(), 0); - act.setData(QVariant()); - QCOMPARE(spy.count(), 0); - - act.setData(-1); - QCOMPARE(spy.count(), 1); - act.setData(-1); - QCOMPARE(spy.count(), 1); -} - void tst_QAction::disableShortcutsWithBlockedWidgets_data() { QTest::addColumn<Qt::ShortcutContext>("shortcutContext"); @@ -556,5 +416,7 @@ void tst_QAction::shortcutFromKeyEvent() QCOMPARE(testWidget.shortcutOverrideCount, 1); } +#endif // QT_CONFIG(shortcut) + QTEST_MAIN(tst_QAction) #include "tst_qaction.moc" diff --git a/tests/auto/widgets/kernel/qactiongroup/tst_qactiongroup.cpp b/tests/auto/widgets/kernel/qactiongroup/tst_qactiongroup.cpp index 524040d003..d3b07ba26a 100644 --- a/tests/auto/widgets/kernel/qactiongroup/tst_qactiongroup.cpp +++ b/tests/auto/widgets/kernel/qactiongroup/tst_qactiongroup.cpp @@ -38,166 +38,9 @@ class tst_QActionGroup : public QObject private slots: void cleanup() { QVERIFY(QApplication::topLevelWidgets().isEmpty()); } - void enabledPropagation(); - void visiblePropagation(); - void exclusive(); - void exclusiveOptional(); void separators(); - void testActionInTwoQActionGroup(); - void unCheckCurrentAction(); }; -void tst_QActionGroup::enabledPropagation() -{ - QActionGroup testActionGroup(nullptr); - - QAction* childAction = new QAction( &testActionGroup ); - QAction* anotherChildAction = new QAction( &testActionGroup ); - QAction* freeAction = new QAction(nullptr); - - QVERIFY( testActionGroup.isEnabled() ); - QVERIFY( childAction->isEnabled() ); - - testActionGroup.setEnabled( false ); - QVERIFY( !testActionGroup.isEnabled() ); - QVERIFY( !childAction->isEnabled() ); - QVERIFY( !anotherChildAction->isEnabled() ); - - childAction->setEnabled(true); - QVERIFY( !childAction->isEnabled()); - - anotherChildAction->setEnabled( false ); - - testActionGroup.setEnabled( true ); - QVERIFY( testActionGroup.isEnabled() ); - QVERIFY( childAction->isEnabled() ); - QVERIFY( !anotherChildAction->isEnabled() ); - - testActionGroup.setEnabled( false ); - QAction *lastChildAction = new QAction(&testActionGroup); - - QVERIFY(!lastChildAction->isEnabled()); - testActionGroup.setEnabled( true ); - QVERIFY(lastChildAction->isEnabled()); - - freeAction->setEnabled(false); - testActionGroup.addAction(freeAction); - QVERIFY(!freeAction->isEnabled()); - delete freeAction; -} - -void tst_QActionGroup::visiblePropagation() -{ - QActionGroup testActionGroup(nullptr); - - QAction* childAction = new QAction( &testActionGroup ); - QAction* anotherChildAction = new QAction( &testActionGroup ); - QAction* freeAction = new QAction(nullptr); - - QVERIFY( testActionGroup.isVisible() ); - QVERIFY( childAction->isVisible() ); - - testActionGroup.setVisible( false ); - QVERIFY( !testActionGroup.isVisible() ); - QVERIFY( !childAction->isVisible() ); - QVERIFY( !anotherChildAction->isVisible() ); - - anotherChildAction->setVisible(false); - - testActionGroup.setVisible( true ); - QVERIFY( testActionGroup.isVisible() ); - QVERIFY( childAction->isVisible() ); - - QVERIFY( !anotherChildAction->isVisible() ); - - testActionGroup.setVisible( false ); - QAction *lastChildAction = new QAction(&testActionGroup); - - QVERIFY(!lastChildAction->isVisible()); - testActionGroup.setVisible( true ); - QVERIFY(lastChildAction->isVisible()); - - freeAction->setVisible(false); - testActionGroup.addAction(freeAction); - QVERIFY(!freeAction->isVisible()); - delete freeAction; -} - -void tst_QActionGroup::exclusive() -{ - QActionGroup group(nullptr); - group.setExclusive(false); - QVERIFY( !group.isExclusive() ); - - QAction* actOne = new QAction( &group ); - actOne->setCheckable( true ); - QAction* actTwo = new QAction( &group ); - actTwo->setCheckable( true ); - QAction* actThree = new QAction( &group ); - actThree->setCheckable( true ); - - group.setExclusive( true ); - QVERIFY( !actOne->isChecked() ); - QVERIFY( !actTwo->isChecked() ); - QVERIFY( !actThree->isChecked() ); - - actOne->setChecked( true ); - QVERIFY( actOne->isChecked() ); - QVERIFY( !actTwo->isChecked() ); - QVERIFY( !actThree->isChecked() ); - - actTwo->setChecked( true ); - QVERIFY( !actOne->isChecked() ); - QVERIFY( actTwo->isChecked() ); - QVERIFY( !actThree->isChecked() ); -} - -void tst_QActionGroup::exclusiveOptional() -{ - QActionGroup group(0); - group.setExclusive(true); - QVERIFY( group.isExclusive() ); - - QAction* actOne = new QAction( &group ); - actOne->setCheckable( true ); - QAction* actTwo = new QAction( &group ); - actTwo->setCheckable( true ); - QAction* actThree = new QAction( &group ); - actThree->setCheckable( true ); - - QVERIFY( !actOne->isChecked() ); - QVERIFY( !actTwo->isChecked() ); - QVERIFY( !actThree->isChecked() ); - - actOne->trigger(); - QVERIFY( actOne->isChecked() ); - QVERIFY( !actTwo->isChecked() ); - QVERIFY( !actThree->isChecked() ); - - actOne->trigger(); - QVERIFY( actOne->isChecked() ); - QVERIFY( !actTwo->isChecked() ); - QVERIFY( !actThree->isChecked() ); - - group.setExclusionPolicy( QActionGroup::ExclusionPolicy::ExclusiveOptional ); - QVERIFY( group.isExclusive() ); - - actOne->trigger(); - QVERIFY( !actOne->isChecked() ); - QVERIFY( !actTwo->isChecked() ); - QVERIFY( !actThree->isChecked() ); - - actTwo->trigger(); - QVERIFY( !actOne->isChecked() ); - QVERIFY( actTwo->isChecked() ); - QVERIFY( !actThree->isChecked() ); - - actTwo->trigger(); - QVERIFY( !actOne->isChecked() ); - QVERIFY( !actTwo->isChecked() ); - QVERIFY( !actThree->isChecked() ); -} - void tst_QActionGroup::separators() { QMainWindow mw; @@ -233,40 +76,5 @@ void tst_QActionGroup::separators() QCOMPARE(menu.actions().size(), 3); } -void tst_QActionGroup::testActionInTwoQActionGroup() -{ - QAction action1("Action 1", this); - - QActionGroup group1(this); - QActionGroup group2(this); - - group1.addAction(&action1); - group2.addAction(&action1); - - QCOMPARE(action1.actionGroup(), &group2); - QCOMPARE(group2.actions().first(), &action1); - QCOMPARE(group1.actions().isEmpty(), true); -} - -void tst_QActionGroup::unCheckCurrentAction() -{ - QActionGroup group(nullptr); - QAction action1(&group) ,action2(&group); - action1.setCheckable(true); - action2.setCheckable(true); - QVERIFY(!action1.isChecked()); - QVERIFY(!action2.isChecked()); - action1.setChecked(true); - QVERIFY(action1.isChecked()); - QVERIFY(!action2.isChecked()); - QAction *current = group.checkedAction(); - QCOMPARE(current, &action1); - current->setChecked(false); - QVERIFY(!action1.isChecked()); - QVERIFY(!action2.isChecked()); - QVERIFY(!group.checkedAction()); -} - - QTEST_MAIN(tst_QActionGroup) #include "tst_qactiongroup.moc" diff --git a/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp b/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp index c6760000f4..45a35fe4f1 100644 --- a/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp +++ b/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp @@ -99,7 +99,9 @@ class tst_QFormLayout : public QObject private slots: void cleanup(); void rowCount(); +#if QT_CONFIG(shortcut) void buddies(); +#endif void getItemPosition(); void wrapping(); void spacing(); @@ -190,6 +192,8 @@ void tst_QFormLayout::rowCount() //TODO: remove items } +#if QT_CONFIG(shortcut) + void tst_QFormLayout::buddies() { QWidget w; @@ -218,6 +222,8 @@ void tst_QFormLayout::buddies() //TODO: empty label? } +#endif // QT_CONFIG(shortcut) + void tst_QFormLayout::getItemPosition() { QWidget w; @@ -687,17 +693,21 @@ void tst_QFormLayout::insertRow_QString_QWidget() layout->insertRow(-5, "&Name:", fld1); QLabel *label1 = qobject_cast<QLabel *>(layout->itemAt(0, QFormLayout::LabelRole)->widget()); QVERIFY(label1 != 0); +#if QT_CONFIG(shortcut) QCOMPARE(label1->buddy(), fld1); - +#endif layout->insertRow(0, "&Email:", fld2); QLabel *label2 = qobject_cast<QLabel *>(layout->itemAt(0, QFormLayout::LabelRole)->widget()); QVERIFY(label2 != 0); +#if QT_CONFIG(shortcut) QCOMPARE(label2->buddy(), fld2); - +#endif layout->insertRow(5, "&Age:", fld3); QLabel *label3 = qobject_cast<QLabel *>(layout->itemAt(2, QFormLayout::LabelRole)->widget()); QVERIFY(label3 != 0); +#if QT_CONFIG(shortcut) QCOMPARE(label3->buddy(), fld3); +#endif } void tst_QFormLayout::insertRow_QString_QLayout() @@ -711,21 +721,27 @@ void tst_QFormLayout::insertRow_QString_QLayout() layout->insertRow(-5, "&Name:", fld1); QLabel *label1 = qobject_cast<QLabel *>(layout->itemAt(0, QFormLayout::LabelRole)->widget()); QVERIFY(label1 != 0); +#if QT_CONFIG(shortcut) QVERIFY(!label1->buddy()); +#endif QCOMPARE(layout->rowCount(), 1); layout->insertRow(0, "&Email:", fld2); QLabel *label2 = qobject_cast<QLabel *>(layout->itemAt(0, QFormLayout::LabelRole)->widget()); QVERIFY(label2 != 0); +#if QT_CONFIG(shortcut) QVERIFY(!label2->buddy()); +#endif QCOMPARE(layout->rowCount(), 2); layout->insertRow(5, "&Age:", fld3); QLabel *label3 = qobject_cast<QLabel *>(layout->itemAt(2, QFormLayout::LabelRole)->widget()); QVERIFY(label3 != 0); +#if QT_CONFIG(shortcut) QVERIFY(!label3->buddy()); +#endif QCOMPARE(layout->rowCount(), 3); } diff --git a/tests/auto/widgets/widgets/qabstractbutton/tst_qabstractbutton.cpp b/tests/auto/widgets/widgets/qabstractbutton/tst_qabstractbutton.cpp index eb108a40de..e5a891912f 100644 --- a/tests/auto/widgets/widgets/qabstractbutton/tst_qabstractbutton.cpp +++ b/tests/auto/widgets/widgets/qabstractbutton/tst_qabstractbutton.cpp @@ -34,7 +34,9 @@ #include <qapplication.h> #include <qpainter.h> #include <qstyleoption.h> -#include <qkeysequence.h> +#if QT_CONFIG(shortcut) +# include <qkeysequence.h> +#endif #include <qevent.h> #include <qgridlayout.h> #include <qabstractbutton.h> @@ -59,7 +61,9 @@ private slots: void setText(); void setIcon(); +#if QT_CONFIG(shortcut) void setShortcut(); +#endif void animateClick(); @@ -68,7 +72,9 @@ private slots: void isChecked(); void toggled(); void setEnabled(); +#if QT_CONFIG(shortcut) void shortcutEvents(); +#endif void stopRepeatTimer(); void mouseReleased(); // QTBUG-53244 @@ -164,8 +170,10 @@ void tst_QAbstractButton::init() testWidget->setEnabled( true ); testWidget->setDown( false ); testWidget->setAutoRepeat( false ); +#if QT_CONFIG(shortcut) QKeySequence seq; testWidget->setShortcut( seq ); +#endif toggle_count = 0; press_count = 0; @@ -336,17 +344,17 @@ void tst_QAbstractButton::setText() QCOMPARE( testWidget->text(), QString("simple") ); testWidget->setText("&ersand"); QCOMPARE( testWidget->text(), QString("&ersand") ); -#ifndef Q_OS_MAC // no mneonics on Mac. +#if QT_CONFIG(shortcut) && !defined(Q_OS_DARWIN) // no mnemonics on Mac. QCOMPARE( testWidget->shortcut(), QKeySequence("ALT+A")); #endif testWidget->setText("te&st"); QCOMPARE( testWidget->text(), QString("te&st") ); -#ifndef Q_OS_MAC // no mneonics on Mac. +#if QT_CONFIG(shortcut) && !defined(Q_OS_DARWIN) // no mnemonics on Mac. QCOMPARE( testWidget->shortcut(), QKeySequence("ALT+S")); #endif testWidget->setText("foo"); QCOMPARE( testWidget->text(), QString("foo") ); -#ifndef Q_OS_MAC // no mneonics on Mac. +#if QT_CONFIG(shortcut) && !defined(Q_OS_DARWIN) // no mnemonics on Mac. QCOMPARE( testWidget->shortcut(), QKeySequence()); #endif } @@ -471,6 +479,7 @@ void tst_QAbstractButton::toggled() testWidget->setCheckable(false); } +#if QT_CONFIG(shortcut) void tst_QAbstractButton::setShortcut() { if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::WindowActivation)) @@ -502,6 +511,7 @@ void tst_QAbstractButton::setShortcut() // qDebug() << click_count; } +#endif // QT_CONFIG(shortcut) void tst_QAbstractButton::animateClick() { @@ -512,6 +522,8 @@ void tst_QAbstractButton::animateClick() QTRY_VERIFY( !testWidget->isDown() ); } +#if QT_CONFIG(shortcut) + void tst_QAbstractButton::shortcutEvents() { MyButton button; @@ -535,6 +547,8 @@ void tst_QAbstractButton::shortcutEvents() QCOMPARE(clickedSpy.count(), 3); } +#endif // QT_CONFIG(shortcut) + void tst_QAbstractButton::stopRepeatTimer() { MyButton button; diff --git a/tests/auto/widgets/widgets/qcommandlinkbutton/tst_qcommandlinkbutton.cpp b/tests/auto/widgets/widgets/qcommandlinkbutton/tst_qcommandlinkbutton.cpp index 0044d33c66..45a23984e0 100644 --- a/tests/auto/widgets/widgets/qcommandlinkbutton/tst_qcommandlinkbutton.cpp +++ b/tests/auto/widgets/widgets/qcommandlinkbutton/tst_qcommandlinkbutton.cpp @@ -51,7 +51,9 @@ private slots: void getSetCheck(); void pressed(); +#if QT_CONFIG(shortcut) void setAccel(); +#endif void isCheckable(); void setDown(); void popupCrash(); @@ -133,8 +135,10 @@ void tst_QCommandLinkButton::init() testWidget->setText("Test"); testWidget->setDescription("Description text."); testWidget->setEnabled( true ); +#if QT_CONFIG(shortcut) QKeySequence seq; testWidget->setShortcut( seq ); +#endif resetCounters(); } @@ -327,6 +331,8 @@ void tst_QCommandLinkButton::toggled() QVERIFY( click_count == 1 ); } +#if QT_CONFIG(shortcut) + /* If we press an accelerator key we ONLY get a pressed signal and NOT a released or clicked signal. @@ -355,6 +361,8 @@ void tst_QCommandLinkButton::setAccel() QTest::qWait(200); } +#endif // QT_CONFIG(shortcut) + void tst_QCommandLinkButton::animateClick() { QVERIFY( !testWidget->isDown() ); diff --git a/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp b/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp index 264625777f..9eae1f10ea 100644 --- a/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp +++ b/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp @@ -262,6 +262,8 @@ private slots: void timeSpec(); void timeSpecBug(); void timeSpecInit(); + void setDateTime_data(); + void setDateTime(); void monthEdgeCase(); void setLocale(); @@ -3476,6 +3478,54 @@ void tst_QDateTimeEdit::timeSpecInit() QCOMPARE(widget.dateTime(), utc); } +void tst_QDateTimeEdit::setDateTime_data() +{ + QTest::addColumn<Qt::TimeSpec>("spec"); + QDateTime localNoon(QDate(2019, 12, 24), QTime(12, 0), Qt::LocalTime); +#if 0 // Not yet supported + QTest::addColumn<int>("offset"); + QTest::addColumn<QByteArray>("zoneName"); + + QTest::newRow("OffsetFromUTC/LocalTime") + << Qt::OffsetFromUTC << 7200 << "" + << localNoon << localNoon.toOffsetFromUtc(7200); +#if QT_CONFIG(timezone) + QTest::newRow("TimeZone/LocalTime") + << Qt::TimeZone << 0 << "Europe/Berlin" + << localNoon << localNoon.toTimeZone(QTimeZone("Europe/Berlin")); +#endif +#endif // unsupported + QTest::addColumn<QDateTime>("store"); + QTest::addColumn<QDateTime>("expect"); + QTest::newRow("LocalTime/LocalTime") + << Qt::LocalTime // << 0 << "" + << localNoon << localNoon; + QTest::newRow("LocalTime/UTC") + << Qt::LocalTime // << 0 << "" + << localNoon.toUTC() << localNoon; + QTest::newRow("UTC/LocalTime") + << Qt::UTC // << 0 << "" + << localNoon << localNoon.toUTC(); + QTest::newRow("UTC/UTC") + << Qt::UTC // << 0 << "" + << localNoon.toUTC() << localNoon.toUTC(); +} + +void tst_QDateTimeEdit::setDateTime() +{ + QFETCH(const Qt::TimeSpec, spec); +#if 0 // Not yet supported + QFETCH(const int, offset); + QFETCH(const QByteArray, zoneName); +#endif // configuring the spec, when OffsetFromUTC or TimeZone + QFETCH(const QDateTime, store); + QFETCH(const QDateTime, expect); + QDateTimeEdit editor; + editor.setTimeSpec(spec); + editor.setDateTime(store); + QCOMPARE(editor.dateTime(), expect); +} + void tst_QDateTimeEdit::cachedDayTest() { testWidget->setDisplayFormat("MM/dd"); diff --git a/tests/auto/widgets/widgets/qdoublespinbox/tst_qdoublespinbox.cpp b/tests/auto/widgets/widgets/qdoublespinbox/tst_qdoublespinbox.cpp index c293a4bdd2..c6de750482 100644 --- a/tests/auto/widgets/widgets/qdoublespinbox/tst_qdoublespinbox.cpp +++ b/tests/auto/widgets/widgets/qdoublespinbox/tst_qdoublespinbox.cpp @@ -166,7 +166,9 @@ private slots: void doubleDot(); +#if QT_CONFIG(shortcut) void undoRedo(); +#endif void valueFromTextAndValidate_data(); void valueFromTextAndValidate(); @@ -1025,6 +1027,8 @@ void tst_QDoubleSpinBox::doubleDot() QCOMPARE(spin.lineEdit()->cursorPosition(), 2); } +#if QT_CONFIG(shortcut) + void tst_QDoubleSpinBox::undoRedo() { //test undo/redo feature (in conjunction with the "undoRedoEnabled" property) @@ -1073,6 +1077,8 @@ void tst_QDoubleSpinBox::undoRedo() QVERIFY(!spin.lineEdit()->isRedoAvailable()); } +#endif // QT_CONFIG(shortcut) + struct task199226_DoubleSpinBox : public QDoubleSpinBox { task199226_DoubleSpinBox(QWidget *parent = 0) : QDoubleSpinBox(parent) {} diff --git a/tests/auto/widgets/widgets/qlabel/tst_qlabel.cpp b/tests/auto/widgets/widgets/qlabel/tst_qlabel.cpp index f599ac73c6..7760e12cca 100644 --- a/tests/auto/widgets/widgets/qlabel/tst_qlabel.cpp +++ b/tests/auto/widgets/widgets/qlabel/tst_qlabel.cpp @@ -68,7 +68,7 @@ private Q_SLOTS: void setText_data(); void setText(); void setTextFormat(); -#ifndef Q_OS_MAC +#if QT_CONFIG(shortcut) && !defined(Q_OS_DARWIN) void setBuddy(); #endif void setNum(); @@ -88,8 +88,10 @@ private Q_SLOTS: void unicodeText_data(); void unicodeText(); +#if QT_CONFIG(shortcut) void mnemonic_data(); void mnemonic(); +#endif void selection(); #ifndef QT_NO_CONTEXTMENU @@ -116,6 +118,7 @@ void tst_QLabel::getSetCheck() obj1.setWordWrap(true); QCOMPARE(true, obj1.wordWrap()); +#if QT_CONFIG(shortcut) // QWidget * QLabel::buddy() // void QLabel::setBuddy(QWidget *) QWidget *var2 = new QWidget(); @@ -124,6 +127,7 @@ void tst_QLabel::getSetCheck() obj1.setBuddy((QWidget *)0); QCOMPARE((QWidget *)0, obj1.buddy()); delete var2; +#endif // QT_CONFIG(shortcut) // QMovie * QLabel::movie() // void QLabel::setMovie(QMovie *) @@ -153,7 +157,9 @@ void tst_QLabel::cleanupTestCase() void tst_QLabel::init() { testWidget->setTextFormat( Qt::AutoText ); +# if QT_CONFIG(shortcut) testWidget->setBuddy( 0 ); +#endif testWidget->setIndent( 0 ); testWidget->setAlignment( Qt::AlignLeft | Qt::AlignVCenter ); testWidget->setScaledContents( false ); @@ -169,7 +175,7 @@ void tst_QLabel::cleanup() } // Set buddy doesn't make much sense on OS X -#ifndef Q_OS_MAC +#if QT_CONFIG(shortcut) && !defined(Q_OS_DARWIN) void tst_QLabel::setBuddy() { testWidget->hide(); @@ -204,7 +210,7 @@ void tst_QLabel::setBuddy() delete test_box; } -#endif +#endif // QT_CONFIG(shortcut) && !Q_OS_DARWIN void tst_QLabel::setText_data() { @@ -469,6 +475,8 @@ void tst_QLabel::unicodeText() testWidget->show(); } +#if QT_CONFIG(shortcut) + void tst_QLabel::mnemonic_data() { QTest::addColumn<QString>("text"); @@ -513,6 +521,8 @@ void tst_QLabel::mnemonic() QCOMPARE(d->shortcutCursor.selectedText(), expectedShortcutCursor); } +#endif // QT_CONFIG(shortcut) + void tst_QLabel::selection() { QLabel label; diff --git a/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp b/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp index 6408df3f11..bf31f12958 100644 --- a/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp +++ b/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp @@ -56,7 +56,9 @@ #include <qsortfilterproxymodel.h> #include <qdebug.h> #include <qscreen.h> -#include <qshortcut.h> +#if QT_CONFIG(shortcut) +# include <qshortcut.h> +#endif #include "qcommonstyle.h" #include "qstyleoption.h" @@ -133,9 +135,11 @@ private slots: void clearInputMask(); +#if QT_CONFIG(shortcut) void keypress_inputMask_data(); void keypress_inputMask(); void keypress_inputMethod_inputMask(); +#endif void inputMaskAndValidator_data(); void inputMaskAndValidator(); @@ -217,7 +221,7 @@ private slots: void setSelection_data(); void setSelection(); -#ifndef QT_NO_CLIPBOARD +#if QT_CONFIG(clipboard) && QT_CONFIG(shortcut) void cut(); void cutWithoutSelection(); #endif @@ -297,8 +301,10 @@ private slots: void shouldShowPlaceholderText(); void QTBUG1266_setInputMaskEmittingTextEdited(); +#if QT_CONFIG(shortcut) void shortcutOverrideOnReadonlyLineEdit_data(); void shortcutOverrideOnReadonlyLineEdit(); +#endif void QTBUG59957_clearButtonLeftmostAction(); void QTBUG_60319_setInputMaskCheckImSurroundingText(); void testQuickSelectionWithMouse(); @@ -317,7 +323,9 @@ private: void psKeyClick(QWidget *target, Qt::Key key, Qt::KeyboardModifiers pressState = {}); void psKeyClick(QTestEventList &keys, Qt::Key key, Qt::KeyboardModifiers pressState = {}); bool unselectingWithLeftOrRightChangesCursorPosition(); +#if QT_CONFIG(shortcut) void addKeySequenceStandardKey(QTestEventList &keys, QKeySequence::StandardKey); +#endif QLineEdit *ensureTestWidget(); bool validInput; @@ -713,6 +721,8 @@ void tst_QLineEdit::clearInputMask() QCOMPARE(testWidget->inputMask(), QString()); } +#if QT_CONFIG(shortcut) + void tst_QLineEdit::keypress_inputMask_data() { QTest::addColumn<QString>("mask"); @@ -838,6 +848,8 @@ void tst_QLineEdit::keypress_inputMethod_inputMask() QCOMPARE(testWidget->text(), QStringLiteral("EE.EE.EE")); } +#endif // QT_CONFIG(shortcut) + void tst_QLineEdit::hasAcceptableInputMask_data() { QTest::addColumn<QString>("optionalMask"); @@ -1989,6 +2001,8 @@ void tst_QLineEdit::psKeyClick(QTestEventList &keys, Qt::Key key, Qt::KeyboardMo keys.addKeyClick(key, pressState); } +#if QT_CONFIG(shortcut) + void tst_QLineEdit::addKeySequenceStandardKey(QTestEventList &keys, QKeySequence::StandardKey key) { QKeySequence keyseq = QKeySequence(key); @@ -1996,6 +2010,8 @@ void tst_QLineEdit::addKeySequenceStandardKey(QTestEventList &keys, QKeySequence keys.addKeyClick( Qt::Key( keyseq[i] & ~Qt::KeyboardModifierMask), Qt::KeyboardModifier(keyseq[i] & Qt::KeyboardModifierMask) ); } +#endif // QT_CONFIG(shortcut) + void tst_QLineEdit::cursorPosition() { QLineEdit *testWidget = ensureTestWidget(); @@ -3026,7 +3042,7 @@ void tst_QLineEdit::setSelection() QCOMPARE(testWidget->cursorPosition(), expectedCursor); } -#ifndef QT_NO_CLIPBOARD +#if QT_CONFIG(clipboard) && QT_CONFIG(shortcut) void tst_QLineEdit::cut() { if (QGuiApplication::platformName().startsWith(QLatin1String("wayland"), Qt::CaseInsensitive)) @@ -3127,7 +3143,7 @@ void tst_QLineEdit::cutWithoutSelection() QCOMPARE(clipboard->text(), origText.left(selectionLength)); } -#endif // !QT_NO_CLIPBOARD +#endif // QT_CONFIG(clipboard) && QT_CONFIG(shortcut) class InputMaskValidator : public QValidator { @@ -3975,7 +3991,9 @@ void tst_QLineEdit::taskQTBUG_7395_readOnlyShortcut() le.setReadOnly(true); QAction action(QString::fromLatin1("hello"), &le); +#if QT_CONFIG(shortcut) action.setShortcut(QString::fromLatin1("p")); +#endif QSignalSpy spy(&action, SIGNAL(triggered())); le.addAction(&action); @@ -4710,6 +4728,8 @@ void tst_QLineEdit::QTBUG1266_setInputMaskEmittingTextEdited() QCOMPARE(spy.count(), 0); } +#if QT_CONFIG(shortcut) + void tst_QLineEdit::shortcutOverrideOnReadonlyLineEdit_data() { QTest::addColumn<QKeySequence>("keySequence"); @@ -4769,6 +4789,8 @@ void tst_QLineEdit::shortcutOverrideOnReadonlyLineEdit() QCOMPARE(spy.count(), activationCount); } +#endif // QT_CONFIG(shortcut) + void tst_QLineEdit::QTBUG59957_clearButtonLeftmostAction() { #ifndef QT_BUILD_INTERNAL diff --git a/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp b/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp index e3b046e448..352a6314f3 100644 --- a/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp +++ b/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp @@ -2694,30 +2694,6 @@ void tst_QMdiArea::nativeSubWindows() foreach (QMdiSubWindow *subWindow, mdiArea.subWindowList()) QVERIFY(subWindow->internalWinId()); } - -#ifndef QT_NO_OPENGL - { - if (!QGLFormat::hasOpenGL()) - QSKIP("QGL not supported on this platform"); - - QMdiArea mdiArea; - QGLWidget *glViewport = new QGLWidget; - mdiArea.setViewport(glViewport); - mdiArea.addSubWindow(new QWidget); - mdiArea.addSubWindow(new QWidget); - mdiArea.show(); - QVERIFY(QTest::qWaitForWindowExposed(&mdiArea)); - - const QGLContext *context = glViewport->context(); - if (!context || !context->isValid()) - QSKIP("QGL is broken, cannot continue test"); - - // The viewport and all the sub-windows must be native. - QVERIFY(mdiArea.viewport()->internalWinId()); - foreach (QMdiSubWindow *subWindow, mdiArea.subWindowList()) - QVERIFY(subWindow->internalWinId()); - } -#endif } void tst_QMdiArea::task_209615() diff --git a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp index 1e20b7598f..2d74c20469 100644 --- a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp +++ b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp @@ -481,7 +481,7 @@ void tst_QMenu::overrideMenuAction() // On Mac and Windows CE, we need to create native key events to test menu // action activation, so skip this part of the test. -#if !defined(Q_OS_DARWIN) +#if QT_CONFIG(shortcut) && !defined(Q_OS_DARWIN) QAction *aQuit = new QAction("Quit", &w); aQuit->setShortcut(QKeySequence("Ctrl+X")); m->addAction(aQuit); @@ -499,7 +499,7 @@ void tst_QMenu::overrideMenuAction() //test if the menu still pops out QTest::keyClick(&w, Qt::Key_F, Qt::AltModifier); QTRY_VERIFY(m->isVisible()); -#endif +#endif // QT_CONFIG(shortcut) && !Q_OS_DARWIN delete aFileMenu; @@ -1706,10 +1706,13 @@ void tst_QMenu::QTBUG_61039_menu_shortcuts() QSKIP("Window activation is not supported"); QAction *actionKamen = new QAction("Action Kamen"); +#if QT_CONFIG(shortcut) actionKamen->setShortcut(QKeySequence(QLatin1String("K"))); - +#endif QAction *actionJoe = new QAction("Action Joe"); +#if QT_CONFIG(shortcut) actionJoe->setShortcut(QKeySequence(QLatin1String("Ctrl+J"))); +#endif QMenu menu; menu.addAction(actionKamen); diff --git a/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp b/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp index b255930138..8cbe821a68 100644 --- a/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp +++ b/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp @@ -232,19 +232,25 @@ TestMenu tst_QMenuBar::initSimpleMenuBar(QMenuBar *mb, bool forceNonNative) { connect(mb, SIGNAL(triggered(QAction*)), this, SLOT(onSimpleActivated(QAction*))); QMenu *menu = mb->addMenu(QStringLiteral("&accel")); QAction *action = menu->addAction(QStringLiteral("menu1") ); +#if QT_CONFIG(shortcut) action->setShortcut(QKeySequence(Qt::ALT + Qt::Key_A)); action->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_A)); +#endif connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(onSimpleActivated(QAction*))); result.menus << menu; result.actions << action; menu = mb->addMenu(QStringLiteral("accel1")); action = menu->addAction(QStringLiteral("&Open...") ); +#if QT_CONFIG(shortcut) action->setShortcut(Qt::Key_O); +#endif result.actions << action; action = menu->addAction(QStringLiteral("action")); +#if QT_CONFIG(shortcut) action->setShortcut(QKeySequence(Qt::ALT + Qt::Key_Z)); +#endif result.actions << action; result.menus << menu; @@ -283,7 +289,9 @@ QAction *tst_QMenuBar::createCharacterAction(QMenu *menu, char lowerAscii) QAction *action = menu->addAction(text); action->setObjectName(text); action->setData(QVariant(int(lowerAscii))); +#if QT_CONFIG(shortcut) action->setShortcut(Qt::CTRL + (lowerAscii - 'a' + Qt::Key_A)); +#endif connect(action, SIGNAL(triggered()), this, SLOT(onComplexActionTriggered())); return action; } @@ -318,7 +326,9 @@ TestMenu tst_QMenuBar::initComplexMenuBar(QMenuBar *mb) QAction *action = mb->addAction(QStringLiteral("M&enu 3")); action->setData(QVariant(3)); +#if QT_CONFIG(shortcut) action->setShortcut(Qt::ALT + Qt::Key_J); +#endif connect(action, SIGNAL(triggered()), this, SLOT(onComplexActionTriggered())); result.actions << action; @@ -1422,7 +1432,9 @@ void tst_QMenuBar::taskQTBUG4965_escapeEaten() menubar.setNativeMenuBar(false); QMenu menu("menu1"); QAction *first = menubar.addMenu(&menu); +#if QT_CONFIG(shortcut) menu.addAction("quit", &menubar, SLOT(close()), QKeySequence("ESC")); +#endif centerOnScreen(&menubar); menubar.show(); QApplication::setActiveWindow(&menubar); diff --git a/tests/auto/widgets/widgets/qopenglwidget/qopenglwidget.pro b/tests/auto/widgets/widgets/qopenglwidget/qopenglwidget.pro index 2d4cff9e10..039f5a71b8 100644 --- a/tests/auto/widgets/widgets/qopenglwidget/qopenglwidget.pro +++ b/tests/auto/widgets/widgets/qopenglwidget/qopenglwidget.pro @@ -1,5 +1,5 @@ CONFIG += testcase TARGET = tst_qopenglwidget -QT += gui-private core-private testlib widgets +QT += opengl gui-private core-private testlib widgets SOURCES += tst_qopenglwidget.cpp diff --git a/tests/auto/widgets/widgets/qopenglwidget/tst_qopenglwidget.cpp b/tests/auto/widgets/widgets/qopenglwidget/tst_qopenglwidget.cpp index 17a5fe2cd9..e96e292525 100644 --- a/tests/auto/widgets/widgets/qopenglwidget/tst_qopenglwidget.cpp +++ b/tests/auto/widgets/widgets/qopenglwidget/tst_qopenglwidget.cpp @@ -26,7 +26,7 @@ ** ****************************************************************************/ -#include <QtWidgets/QOpenGLWidget> +#include <QtOpenGL/QOpenGLWidget> #include <QtGui/QOpenGLFunctions> #include <QtGui/QPainter> #include <QtGui/QScreen> diff --git a/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp b/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp index 6f4838be7a..d0ed68c0c8 100644 --- a/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp +++ b/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp @@ -53,7 +53,9 @@ private slots: void getSetCheck(); void autoRepeat(); void pressed(); +#if QT_CONFIG(shortcut) void setAccel(); +#endif void isCheckable(); void setDown(); void popupCrash(); @@ -65,7 +67,9 @@ private slots: void defaultAndAutoDefault(); void sizeHint_data(); void sizeHint(); +#if QT_CONFIG(shortcut) void taskQTBUG_20191_shortcutWithKeypadModifer(); +#endif void emitReleasedAfterChange(); protected slots: @@ -125,8 +129,10 @@ void tst_QPushButton::init() testWidget->setDown( false ); testWidget->setText("Test"); testWidget->setEnabled( true ); +#if QT_CONFIG(shortcut) QKeySequence seq; testWidget->setShortcut( seq ); +#endif resetCounters(); } @@ -318,6 +324,8 @@ void tst_QPushButton::toggled() QVERIFY( click_count == 1 ); } +#if QT_CONFIG(shortcut) + /* If we press an accelerator key we ONLY get a pressed signal and NOT a released or clicked signal. @@ -349,6 +357,8 @@ void tst_QPushButton::setAccel() QTRY_VERIFY( !testWidget->isDown() ); } +#endif // QT_CONFIG(shortcut) + void tst_QPushButton::animateClick() { QVERIFY( !testWidget->isDown() ); @@ -571,6 +581,8 @@ void tst_QPushButton::sizeHint() } } +#if QT_CONFIG(shortcut) + void tst_QPushButton::taskQTBUG_20191_shortcutWithKeypadModifer() { // setup a dialog with two buttons @@ -617,6 +629,8 @@ void tst_QPushButton::taskQTBUG_20191_shortcutWithKeypadModifer() QCOMPARE(spy2.count(), 1); } +#endif // QT_CONFIG(shortcut) + void tst_QPushButton::emitReleasedAfterChange() { QPushButton *button1 = new QPushButton("A"); diff --git a/tests/auto/widgets/widgets/qradiobutton/tst_qradiobutton.cpp b/tests/auto/widgets/widgets/qradiobutton/tst_qradiobutton.cpp index 7123acfdc3..5c7d3bf1e9 100644 --- a/tests/auto/widgets/widgets/qradiobutton/tst_qradiobutton.cpp +++ b/tests/auto/widgets/widgets/qradiobutton/tst_qradiobutton.cpp @@ -44,12 +44,16 @@ public: virtual ~tst_QRadioButton(){}; private slots: +#if QT_CONFIG(shortcut) void task190739_focus(); +#endif void minimumSizeHint(); private: }; +#if QT_CONFIG(shortcut) + void tst_QRadioButton::task190739_focus() { if (QGuiApplication::platformName().startsWith(QLatin1String("wayland"), Qt::CaseInsensitive)) @@ -84,6 +88,7 @@ void tst_QRadioButton::task190739_focus() QVERIFY(!radio1.hasFocus()); } +#endif // QT_CONFIG(shortcut) void tst_QRadioButton::minimumSizeHint() { diff --git a/tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp b/tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp index 30c57c73e5..b5d2e68118 100644 --- a/tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp +++ b/tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp @@ -47,7 +47,9 @@ #include <QLocale> #include <QDoubleSpinBox> #include <QVBoxLayout> -#include <QKeySequence> +#if QT_CONFIG(shortcut) +# include <QKeySequence> +#endif #include <QStackedWidget> #include <QDebug> #include <QStyleOptionSpinBox> @@ -173,7 +175,10 @@ private slots: void removeAll(); void startWithDash(); + +#if QT_CONFIG(shortcut) void undoRedo(); +#endif void specialValue(); void textFromValue(); @@ -1024,6 +1029,8 @@ void tst_QSpinBox::startWithDash() QCOMPARE(spin.text(), QString("0")); } +#if QT_CONFIG(shortcut) + void tst_QSpinBox::undoRedo() { //test undo/redo feature (in conjunction with the "undoRedoEnabled" property) @@ -1076,6 +1083,8 @@ void tst_QSpinBox::undoRedo() QVERIFY(!spin.lineEdit()->isRedoAvailable()); } +#endif // QT_CONFIG(shortcut) + void tst_QSpinBox::specialValue() { if (QGuiApplication::platformName().startsWith(QLatin1String("wayland"), Qt::CaseInsensitive)) diff --git a/tests/auto/widgets/widgets/qtoolbar/tst_qtoolbar.cpp b/tests/auto/widgets/widgets/qtoolbar/tst_qtoolbar.cpp index 61252831ed..1d5ac7c819 100644 --- a/tests/auto/widgets/widgets/qtoolbar/tst_qtoolbar.cpp +++ b/tests/auto/widgets/widgets/qtoolbar/tst_qtoolbar.cpp @@ -40,7 +40,9 @@ #include <qwidgetaction.h> #include <qtoolbutton.h> #include <qlineedit.h> -#include <qkeysequence.h> +#if QT_CONFIG(shortcut) +# include <qkeysequence.h> +#endif #include <qmenu.h> #include <qlabel.h> #include <private/qtoolbarextension_p.h> diff --git a/tests/auto/widgets/widgets/widgets.pro b/tests/auto/widgets/widgets/widgets.pro index c6325aac15..66950fa85a 100644 --- a/tests/auto/widgets/widgets/widgets.pro +++ b/tests/auto/widgets/widgets/widgets.pro @@ -47,6 +47,9 @@ SUBDIRS=\ qtoolbox \ qtoolbutton \ +!qtConfig(shortcut): SUBDIRS -= \ + qkeysequenceedit + # The following tests depend on private API: !qtConfig(private_tests): SUBDIRS -= \ qabstractspinbox \ diff --git a/tests/auto/xml/dom/qdom/tst_qdom.cpp b/tests/auto/xml/dom/qdom/tst_qdom.cpp index a2a5b22cad..9cb06f5185 100644 --- a/tests/auto/xml/dom/qdom/tst_qdom.cpp +++ b/tests/auto/xml/dom/qdom/tst_qdom.cpp @@ -33,7 +33,7 @@ #include <QDebug> #include <QFile> #include <QList> -#include <QRegExp> +#include <QRegularExpression> #include <QTextStream> #include <QtTest/QtTest> #include <QtXml> @@ -517,10 +517,10 @@ void tst_QDom::save_data() QTest::addColumn<int>("indent"); QTest::addColumn<QString>("res"); - QTest::newRow( "01" ) << doc01 << 0 << QString(doc01).replace( QRegExp(" "), "" ); + QTest::newRow( "01" ) << doc01 << 0 << QString(doc01).replace( QRegularExpression(" "), "" ); QTest::newRow( "02" ) << doc01 << 1 << doc01; - QTest::newRow( "03" ) << doc01 << 2 << QString(doc01).replace( QRegExp(" "), " " ); - QTest::newRow( "04" ) << doc01 << 10 << QString(doc01).replace( QRegExp(" "), " " ); + QTest::newRow( "03" ) << doc01 << 2 << QString(doc01).replace( QRegularExpression(" "), " " ); + QTest::newRow( "04" ) << doc01 << 10 << QString(doc01).replace( QRegularExpression(" "), " " ); } void tst_QDom::save() diff --git a/tests/benchmarks/corelib/io/qdiriterator/main.cpp b/tests/benchmarks/corelib/io/qdiriterator/main.cpp index eae752d99a..60c75ead4d 100644 --- a/tests/benchmarks/corelib/io/qdiriterator/main.cpp +++ b/tests/benchmarks/corelib/io/qdiriterator/main.cpp @@ -44,9 +44,19 @@ #include "qfilesystemiterator.h" +#if QT_HAS_INCLUDE(<filesystem>) && defined(__cpp_lib_filesystem) && __cpp_lib_filesystem >= 201703L +#define HAS_STD_FILESYSTEM +#endif + +#ifdef HAS_STD_FILESYSTEM +#include <filesystem> +#endif + class tst_qdiriterator : public QObject { Q_OBJECT + + void data(); private slots: void posix(); void posix_data() { data(); } @@ -54,7 +64,8 @@ private slots: void diriterator_data() { data(); } void fsiterator(); void fsiterator_data() { data(); } - void data(); + void stdRecursiveDirectoryIterator(); + void stdRecursiveDirectoryIterator_data() { data(); } }; @@ -235,6 +246,28 @@ void tst_qdiriterator::fsiterator() qDebug() << count; } +void tst_qdiriterator::stdRecursiveDirectoryIterator() +{ +#ifdef HAS_STD_FILESYSTEM + QFETCH(QByteArray, dirpath); + + int count = 0; + + QBENCHMARK { + int c = 0; + for (auto obj : std::filesystem::recursive_directory_iterator(dirpath.data())) { + if (obj.is_directory()) + continue; + c++; + } + count = c; + } + qDebug() << count; +#else + QSKIP("Not supported."); +#endif +} + QTEST_MAIN(tst_qdiriterator) #include "main.moc" diff --git a/tests/benchmarks/corelib/io/qdiriterator/qdiriterator.pro b/tests/benchmarks/corelib/io/qdiriterator/qdiriterator.pro index 061b22a5d1..4b28946f18 100644 --- a/tests/benchmarks/corelib/io/qdiriterator/qdiriterator.pro +++ b/tests/benchmarks/corelib/io/qdiriterator/qdiriterator.pro @@ -3,6 +3,8 @@ TARGET = tst_bench_qdiriterator QT = core testlib CONFIG += release +# Enable c++17 support for std::filesystem +qtConfig(c++1z): CONFIG += c++17 SOURCES += main.cpp qfilesystemiterator.cpp HEADERS += qfilesystemiterator.h diff --git a/tests/benchmarks/corelib/kernel/qobject/main.cpp b/tests/benchmarks/corelib/kernel/qobject/main.cpp index 04ca69ad3b..918227f74e 100644 --- a/tests/benchmarks/corelib/kernel/qobject/main.cpp +++ b/tests/benchmarks/corelib/kernel/qobject/main.cpp @@ -51,8 +51,55 @@ private slots: void connect_disconnect_benchmark_data(); void connect_disconnect_benchmark(); void receiver_destroyed_benchmark(); + + void stdAllocator(); }; +class QObjectUsingStandardAllocator : public QObject +{ + Q_OBJECT +public: + QObjectUsingStandardAllocator() + { + } +}; + +template<class T> +inline void allocator() +{ + // We need to allocate certain amount of objects otherwise the new implementation + // may re-use the previous allocation, hiding the somehow high cost of allocation. It + // also helps us to reduce the noise ratio, which is high for memory allocation. + // + // The check depends on memory allocation performance, which is quite non-deterministic. + // When a new memory is requested, the new operator, depending on implementation, is trying + // to re-use existing, already allocated for the process memory. If there is not enough, it + // asks OS to give more. Of course the first case is faster then the second. In the same + // time, from an application perspective the first is also more likely. + // + // As a result, depending on which use-case one wants to test, it may be recommended to run this + // test in separation from others, to "force" expensive code path in the memory allocation. + // + // The time based results are heavily affected by background noise. One really needs to + // prepare OS (no other tasks, CPU and RAM reservations) to run this test, or use + // instruction counting which seems to be less fragile. + + const int count = 256 * 1024; + + QScopedPointer<T> objects[count]; + QBENCHMARK_ONCE { + for (int i = 0; i < count; ++i) + objects[i].reset(new T); + for (int i = 0; i < count; ++i) + objects[i].reset(); + } +} + +void QObjectBenchmark::stdAllocator() +{ + allocator<QObjectUsingStandardAllocator>(); +} + struct Functor { void operator()(){} }; diff --git a/tests/benchmarks/corelib/tools/qvector/outofline.cpp b/tests/benchmarks/corelib/tools/qvector/outofline.cpp index 76a4edaa10..7182a43008 100644 --- a/tests/benchmarks/corelib/tools/qvector/outofline.cpp +++ b/tests/benchmarks/corelib/tools/qvector/outofline.cpp @@ -54,7 +54,7 @@ QVector<double> mixedvector_fill_and_return_helper() std::vector<double> v(N); for (int i = 0; i != N; ++i) v[i] = i; - return QVector<double>::fromStdVector(v); + return QVector<double>(v.begin(), v.end()); } diff --git a/tests/benchmarks/corelib/tools/qvector/qrawvector.h b/tests/benchmarks/corelib/tools/qvector/qrawvector.h index 16a911c63a..9ad5f771bd 100644 --- a/tests/benchmarks/corelib/tools/qvector/qrawvector.h +++ b/tests/benchmarks/corelib/tools/qvector/qrawvector.h @@ -130,78 +130,9 @@ public: bool contains(const T &t) const; int count(const T &t) const; -#ifdef QT_STRICT_ITERATORS - class iterator { - public: - T *i; - typedef std::random_access_iterator_tag iterator_category; - typedef ptrdiff_t difference_type; - typedef T value_type; - typedef T *pointer; - typedef T &reference; - - inline iterator() : i(0) {} - inline iterator(T *n) : i(n) {} - inline iterator(const iterator &o): i(o.i){} - inline T &operator*() const { return *i; } - inline T *operator->() const { return i; } - inline T &operator[](int j) const { return *(i + j); } - inline bool operator==(const iterator &o) const { return i == o.i; } - inline bool operator!=(const iterator &o) const { return i != o.i; } - inline bool operator<(const iterator& other) const { return i < other.i; } - inline bool operator<=(const iterator& other) const { return i <= other.i; } - inline bool operator>(const iterator& other) const { return i > other.i; } - inline bool operator>=(const iterator& other) const { return i >= other.i; } - inline iterator &operator++() { ++i; return *this; } - inline iterator operator++(int) { T *n = i; ++i; return n; } - inline iterator &operator--() { i--; return *this; } - inline iterator operator--(int) { T *n = i; i--; return n; } - inline iterator &operator+=(int j) { i+=j; return *this; } - inline iterator &operator-=(int j) { i-=j; return *this; } - inline iterator operator+(int j) const { return iterator(i+j); } - inline iterator operator-(int j) const { return iterator(i-j); } - inline int operator-(iterator j) const { return i - j.i; } - }; - friend class iterator; - - class const_iterator { - public: - T *i; - typedef std::random_access_iterator_tag iterator_category; - typedef ptrdiff_t difference_type; - typedef T value_type; - typedef const T *pointer; - typedef const T &reference; - - inline const_iterator() : i(0) {} - inline const_iterator(T *n) : i(n) {} - inline const_iterator(const const_iterator &o): i(o.i) {} - inline explicit const_iterator(const iterator &o): i(o.i) {} - inline const T &operator*() const { return *i; } - inline const T *operator->() const { return i; } - inline const T &operator[](int j) const { return *(i + j); } - inline bool operator==(const const_iterator &o) const { return i == o.i; } - inline bool operator!=(const const_iterator &o) const { return i != o.i; } - inline bool operator<(const const_iterator& other) const { return i < other.i; } - inline bool operator<=(const const_iterator& other) const { return i <= other.i; } - inline bool operator>(const const_iterator& other) const { return i > other.i; } - inline bool operator>=(const const_iterator& other) const { return i >= other.i; } - inline const_iterator &operator++() { ++i; return *this; } - inline const_iterator operator++(int) { T *n = i; ++i; return n; } - inline const_iterator &operator--() { i--; return *this; } - inline const_iterator operator--(int) { T *n = i; i--; return n; } - inline const_iterator &operator+=(int j) { i+=j; return *this; } - inline const_iterator &operator-=(int j) { i+=j; return *this; } - inline const_iterator operator+(int j) const { return const_iterator(i+j); } - inline const_iterator operator-(int j) const { return const_iterator(i-j); } - inline int operator-(const_iterator j) const { return i - j.i; } - }; - friend class const_iterator; -#else // STL-style typedef T *iterator; typedef const T *const_iterator; -#endif inline iterator begin() { return m_begin; } inline const_iterator begin() const { return m_begin; } inline const_iterator constBegin() const { return m_begin; } @@ -280,11 +211,7 @@ private: } static Q_DECL_CONSTEXPR int alignOfTypedData() { -#ifdef Q_ALIGNOF - return Q_ALIGNOF(AlignmentDummy); -#else - return sizeof(void *); -#endif + return alignof(AlignmentDummy); } public: diff --git a/tests/benchmarks/network/access/qfile_vs_qnetworkaccessmanager/main.cpp b/tests/benchmarks/network/access/qfile_vs_qnetworkaccessmanager/main.cpp index 46bb1791b4..1f3f38eaaf 100644 --- a/tests/benchmarks/network/access/qfile_vs_qnetworkaccessmanager/main.cpp +++ b/tests/benchmarks/network/access/qfile_vs_qnetworkaccessmanager/main.cpp @@ -105,7 +105,7 @@ void qfile_vs_qnetworkaccessmanager::qnamFileRead() } qint64 elapsed = t.elapsed(); - qDebug() << endl << "Finished!"; + qDebug() << Qt::endl << "Finished!"; qDebug() << "Bytes:" << size; qDebug() << "Speed:" << (qreal(size*iterations) / 1024.0) / (qreal(elapsed) / 1000.0) << "KB/sec"; } @@ -138,7 +138,7 @@ void qfile_vs_qnetworkaccessmanager::qnamImmediateFileRead() } qint64 elapsed = t.elapsed(); - qDebug() << endl << "Finished!"; + qDebug() << Qt::endl << "Finished!"; qDebug() << "Bytes:" << size; qDebug() << "Speed:" << (qreal(size*iterations) / 1024.0) / (qreal(elapsed) / 1000.0) << "KB/sec"; } @@ -167,7 +167,7 @@ void qfile_vs_qnetworkaccessmanager::qfileFileRead() } qint64 elapsed = t.elapsed(); - qDebug() << endl << "Finished!"; + qDebug() << Qt::endl << "Finished!"; qDebug() << "Bytes:" << size; qDebug() << "Speed:" << (qreal(size*iterations) / 1024.0) / (qreal(elapsed) / 1000.0) << "KB/sec"; } diff --git a/tests/benchmarks/network/access/qnetworkreply/tst_qnetworkreply.cpp b/tests/benchmarks/network/access/qnetworkreply/tst_qnetworkreply.cpp index c182ef7ebf..6dd7eaee6b 100644 --- a/tests/benchmarks/network/access/qnetworkreply/tst_qnetworkreply.cpp +++ b/tests/benchmarks/network/access/qnetworkreply/tst_qnetworkreply.cpp @@ -544,15 +544,10 @@ void tst_qnetworkreply::echoPerformance() void tst_qnetworkreply::preConnectEncrypted() { QFETCH(int, sleepTime); - QFETCH(QSslConfiguration, sslConfiguration); - bool spdyEnabled = !sslConfiguration.isNull(); - QString hostName = QLatin1String("www.google.com"); QNetworkAccessManager manager; QNetworkRequest request(QUrl("https://" + hostName)); - if (spdyEnabled) - request.setAttribute(QNetworkRequest::SpdyAllowedAttribute, true); // make sure we have a full request including // DNS lookup, TCP and SSL handshakes @@ -578,12 +573,7 @@ void tst_qnetworkreply::preConnectEncrypted() manager.clearAccessCache(); // now try to make the connection beforehand - if (spdyEnabled) { - request.setAttribute(QNetworkRequest::SpdyAllowedAttribute, true); - manager.connectToHostEncrypted(hostName, 443, sslConfiguration); - } else { - manager.connectToHostEncrypted(hostName); - } + manager.connectToHostEncrypted(hostName); QTestEventLoop::instance().enterLoopMSecs(sleepTime); // now make another request and hopefully use the existing connection @@ -591,8 +581,6 @@ void tst_qnetworkreply::preConnectEncrypted() QNetworkReply *preConnectReply = normalResult.first; QVERIFY(!QTestEventLoop::instance().timeout()); QVERIFY(preConnectReply->error() == QNetworkReply::NoError); - bool spdyWasUsed = preConnectReply->attribute(QNetworkRequest::SpdyWasUsedAttribute).toBool(); - QCOMPARE(spdyEnabled, spdyWasUsed); qint64 preConnectElapsed = preConnectResult.second; qDebug() << request.url().toString() << "full request:" << normalElapsed << "ms, pre-connect request:" << preConnectElapsed << "ms, difference:" @@ -605,27 +593,11 @@ void tst_qnetworkreply::preConnectEncrypted_data() { #ifndef QT_NO_OPENSSL QTest::addColumn<int>("sleepTime"); - QTest::addColumn<QSslConfiguration>("sslConfiguration"); - // start a new normal request after preconnecting is done - QTest::newRow("HTTPS-2secs") << 2000 << QSslConfiguration(); + QTest::newRow("HTTPS-2secs") << 2000; // start a new normal request while preconnecting is in-flight - QTest::newRow("HTTPS-100ms") << 100 << QSslConfiguration(); - - QSslConfiguration spdySslConf = QSslConfiguration::defaultConfiguration(); - QList<QByteArray> nextProtocols = QList<QByteArray>() - << QSslConfiguration::NextProtocolSpdy3_0 - << QSslConfiguration::NextProtocolHttp1_1; - spdySslConf.setAllowedNextProtocols(nextProtocols); - -#if defined(QT_BUILD_INTERNAL) && !defined(QT_NO_SSL) && OPENSSL_VERSION_NUMBER >= 0x1000100fL && !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG) - // start a new SPDY request while preconnecting is done - QTest::newRow("SPDY-2secs") << 2000 << spdySslConf; - - // start a new SPDY request while preconnecting is in-flight - QTest::newRow("SPDY-100ms") << 100 << spdySslConf; -#endif // defined (QT_BUILD_INTERNAL) && !defined(QT_NO_SSL) ... + QTest::newRow("HTTPS-100ms") << 100; #endif // QT_NO_OPENSSL } diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chiptester.cpp b/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chiptester.cpp index dfa08b6869..1eaa5f6578 100644 --- a/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chiptester.cpp +++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chiptester.cpp @@ -56,13 +56,6 @@ void ChipTester::setAntialias(bool enabled) setRenderHint(QPainter::Antialiasing, enabled); } -void ChipTester::setOpenGL(bool enabled) -{ -#ifndef QT_NO_OPENGL - setViewport(enabled ? new QGLWidget(QGLFormat(QGL::SampleBuffers)) : 0); -#endif -} - void ChipTester::setOperation(Operation operation) { this->operation = operation; diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chiptester.h b/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chiptester.h index d85686c94e..e4c9197142 100644 --- a/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chiptester.h +++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chiptester.h @@ -51,7 +51,6 @@ public: ChipTester(QWidget *parent = 0); void setAntialias(bool enabled); - void setOpenGL(bool enabled); void runBenchmark(); void setOperation(Operation operation); diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp b/tests/benchmarks/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp index 9bb5231528..25fc439883 100644 --- a/tests/benchmarks/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp +++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp @@ -382,31 +382,22 @@ void tst_QGraphicsView::mapRectFromScene() void tst_QGraphicsView::chipTester_data() { QTest::addColumn<bool>("antialias"); - QTest::addColumn<bool>("opengl"); QTest::addColumn<int>("operation"); - QTest::newRow("rotate, normal") << false << false << 0; - QTest::newRow("rotate, normal, antialias") << true << false << 0; - QTest::newRow("rotate, opengl") << false << true << 0; - QTest::newRow("rotate, opengl, antialias") << true << true << 0; - QTest::newRow("zoom, normal") << false << false << 1; - QTest::newRow("zoom, normal, antialias") << true << false << 1; - QTest::newRow("zoom, opengl") << false << true << 1; - QTest::newRow("zoom, opengl, antialias") << true << true << 1; - QTest::newRow("translate, normal") << false << false << 2; - QTest::newRow("translate, normal, antialias") << true << false << 2; - QTest::newRow("translate, opengl") << false << true << 2; - QTest::newRow("translate, opengl, antialias") << true << true << 2; + QTest::newRow("rotate") << false << 0; + QTest::newRow("rotate, antialias") << true << 0; + QTest::newRow("zoom") << false << 1; + QTest::newRow("zoom, antialias") << true << 1; + QTest::newRow("translate") << false << 2; + QTest::newRow("translate, antialias") << true << 2; } void tst_QGraphicsView::chipTester() { QFETCH(bool, antialias); - QFETCH(bool, opengl); QFETCH(int, operation); ChipTester tester; tester.setAntialias(antialias); - tester.setOpenGL(opengl); tester.setOperation(ChipTester::Operation(operation)); tester.show(); QVERIFY(QTest::qWaitForWindowExposed(&tester)); diff --git a/tests/manual/cocoa/menurama/menurama.pro b/tests/manual/cocoa/menurama/menurama.pro index da6f224e0d..f0928be31d 100644 --- a/tests/manual/cocoa/menurama/menurama.pro +++ b/tests/manual/cocoa/menurama/menurama.pro @@ -4,9 +4,7 @@ # #------------------------------------------------- -QT += core gui - -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets +QT += core gui widgets TARGET = Menurama TEMPLATE = app diff --git a/tests/manual/corelib/tools/qhash/main.cpp b/tests/manual/corelib/tools/qhash/main.cpp index b2c40f2183..298d1777ea 100644 --- a/tests/manual/corelib/tools/qhash/main.cpp +++ b/tests/manual/corelib/tools/qhash/main.cpp @@ -27,7 +27,6 @@ ****************************************************************************/ #include <QDebug> -//#define QT_STRICT_ITERATORS #include <QHash> void testEraseNoError() diff --git a/tests/manual/corelib/tools/qlist/main.cpp b/tests/manual/corelib/tools/qlist/main.cpp index 3f8ade5778..0b54105f5e 100644 --- a/tests/manual/corelib/tools/qlist/main.cpp +++ b/tests/manual/corelib/tools/qlist/main.cpp @@ -26,7 +26,6 @@ ** ****************************************************************************/ #include <QDebug> -//#define QT_STRICT_ITERATORS #include <QVector> void testErase() { @@ -55,4 +54,4 @@ int main() // testErase(); testInsert(); return 0; -}
\ No newline at end of file +} diff --git a/tests/manual/corelib/tools/qset/main.cpp b/tests/manual/corelib/tools/qset/main.cpp index 1066e53e7d..701c8889db 100644 --- a/tests/manual/corelib/tools/qset/main.cpp +++ b/tests/manual/corelib/tools/qset/main.cpp @@ -27,7 +27,6 @@ ****************************************************************************/ #include <QDebug> -//#define QT_STRICT_ITERATORS #include <QSet> void testErase() diff --git a/tests/manual/corelib/tools/qvarlengtharray/main.cpp b/tests/manual/corelib/tools/qvarlengtharray/main.cpp index 8580d97a36..0544bb0c4b 100644 --- a/tests/manual/corelib/tools/qvarlengtharray/main.cpp +++ b/tests/manual/corelib/tools/qvarlengtharray/main.cpp @@ -27,7 +27,6 @@ ****************************************************************************/ #include <QDebug> -//#define QT_STRICT_ITERATORS #include <QVarLengthArray> void testErase() diff --git a/tests/manual/corelib/tools/qvector/main.cpp b/tests/manual/corelib/tools/qvector/main.cpp index e3dc89b149..1b35123f15 100644 --- a/tests/manual/corelib/tools/qvector/main.cpp +++ b/tests/manual/corelib/tools/qvector/main.cpp @@ -27,7 +27,6 @@ ****************************************************************************/ #include <QDebug> -//#define QT_STRICT_ITERATORS #include <QVector> void testErase() diff --git a/tests/manual/diaglib/debugproxystyle.cpp b/tests/manual/diaglib/debugproxystyle.cpp index ed35af5962..809613cd1d 100644 --- a/tests/manual/diaglib/debugproxystyle.cpp +++ b/tests/manual/diaglib/debugproxystyle.cpp @@ -68,8 +68,8 @@ QDebug operator<<(QDebug debug, const QStyleOption *option) } else { debug << "QStyleOption("; } - debug << "rect=" << option->rect.width() << 'x' << option->rect.height() - << forcesign << option->rect.x() << option->rect.y() << noforcesign; + debug << "rect=" << option->rect.width() << 'x' << option->rect.height() << Qt::forcesign + << option->rect.x() << option->rect.y() << Qt::noforcesign; if (option->state != QStyle::State_None) debug << ", state=" << option->state; #if QT_VERSION >= 0x050000 diff --git a/tests/manual/diaglib/diaglib.pri b/tests/manual/diaglib/diaglib.pri index b57ee75841..ace9caecc6 100644 --- a/tests/manual/diaglib/diaglib.pri +++ b/tests/manual/diaglib/diaglib.pri @@ -17,20 +17,8 @@ win32:!winrt: { SOURCES += $$PWD/nativewindowdump.cpp } -greaterThan(QT_MAJOR_VERSION, 4) { - QT += gui-private core-private - contains(QT, widgets) { - HEADERS += \ - $$PWD/qwidgetdump.h \ - $$PWD/debugproxystyle.h \ - $$PWD/logwidget.h - - SOURCES += \ - $$PWD/qwidgetdump.cpp \ - $$PWD/debugproxystyle.cpp \ - $$PWD/logwidget.cpp - } -} else { +QT += gui-private core-private +contains(QT, widgets) { HEADERS += \ $$PWD/qwidgetdump.h \ $$PWD/debugproxystyle.h \ @@ -40,14 +28,17 @@ greaterThan(QT_MAJOR_VERSION, 4) { $$PWD/qwidgetdump.cpp \ $$PWD/debugproxystyle.cpp \ $$PWD/logwidget.cpp + QT += widgets-private } contains(QT, opengl) { -HEADERS += \ - $$PWD/glinfo.h + HEADERS += \ + $$PWD/glinfo.h -SOURCES += \ - $$PWD/glinfo.cpp + SOURCES += \ + $$PWD/glinfo.cpp + + QT += opengl } DEFINES += QT_DIAG_LIB diff --git a/tests/manual/diaglib/qwidgetdump.cpp b/tests/manual/diaglib/qwidgetdump.cpp index 5a2966021b..926d2aaf35 100644 --- a/tests/manual/diaglib/qwidgetdump.cpp +++ b/tests/manual/diaglib/qwidgetdump.cpp @@ -86,14 +86,16 @@ static void dumpWidgetRecursion(QTextStream &str, const QWidget *w, formatWidgetClass(str, w); str << ' ' << (w->isVisible() ? "[visible] " : "[hidden] "); if (const WId nativeWinId = w->internalWinId()) - str << "[native: " << hex << showbase << nativeWinId << dec << noshowbase << "] "; + str << "[native: " << Qt::hex << Qt::showbase << nativeWinId << Qt::dec << Qt::noshowbase + << "] "; if (w->isWindow()) str << "[top] "; str << (w->testAttribute(Qt::WA_Mapped) ? "[mapped] " : "[not mapped] "); if (w->testAttribute(Qt::WA_DontCreateNativeAncestors)) str << "[NoNativeAncestors] "; if (const int states = w->windowState()) - str << "windowState=" << hex << showbase << states << dec << noshowbase << ' '; + str << "windowState=" << Qt::hex << Qt::showbase << states << Qt::dec << Qt::noshowbase + << ' '; formatRect(str, w->geometry()); if (w->isWindow()) { str << ' ' << w->logicalDpiX() << "DPI"; diff --git a/tests/manual/diaglib/qwindowdump.cpp b/tests/manual/diaglib/qwindowdump.cpp index 381b683359..2be26ff142 100644 --- a/tests/manual/diaglib/qwindowdump.cpp +++ b/tests/manual/diaglib/qwindowdump.cpp @@ -61,8 +61,8 @@ void formatObject(QTextStream &str, const QObject *o) void formatRect(QTextStream &str, const QRect &geom) { - str << geom.width() << 'x' << geom.height() - << forcesign << geom.x() << geom.y() << noforcesign; + str << geom.width() << 'x' << geom.height() << Qt::forcesign << geom.x() << geom.y() + << Qt::noforcesign; } #define debugType(s, type, typeConstant) \ @@ -75,7 +75,7 @@ if (flags & flagConstant) \ void formatWindowFlags(QTextStream &str, Qt::WindowFlags flags) { - str << showbase << hex << unsigned(flags) << dec << noshowbase; + str << Qt::showbase << Qt::hex << unsigned(flags) << Qt::dec << Qt::noshowbase; const Qt::WindowFlags windowType = flags & Qt::WindowType_Mask; debugFlag(str, flags, Qt::Window) debugType(str, windowType, Qt::Dialog) @@ -123,7 +123,8 @@ void formatWindow(QTextStream &str, const QWindow *w, FormatWindowOptions option formatObject(str, w); str << ' ' << (w->isVisible() ? "[visible] " : "[hidden] "); if (const WId nativeWinId = pw ? pw->winId() : WId(0)) - str << "[native: " << hex << showbase << nativeWinId << dec << noshowbase << "] "; + str << "[native: " << Qt::hex << Qt::showbase << nativeWinId << Qt::dec << Qt::noshowbase + << "] "; if (w->isTopLevel()) str << "[top] "; if (w->isExposed()) diff --git a/tests/manual/diaglib/textdump.cpp b/tests/manual/diaglib/textdump.cpp index 383ec4edb0..33455a2a56 100644 --- a/tests/manual/diaglib/textdump.cpp +++ b/tests/manual/diaglib/textdump.cpp @@ -408,8 +408,8 @@ struct FormattingContext static void formatCharacter(QTextStream &str, const QChar &qc, FormattingContext &context) { const ushort unicode = qc.unicode(); - str << "U+" << qSetFieldWidth(4) << qSetPadChar('0') << uppercasedigits << hex << unicode - << dec << qSetFieldWidth(0) << ' '; + str << "U+" << qSetFieldWidth(4) << qSetPadChar('0') << Qt::uppercasedigits << Qt::hex + << unicode << Qt::dec << qSetFieldWidth(0) << ' '; const EnumLookup *specialChar = enumLookup(unicode, specialCharactersEnumLookup, sizeof(specialCharactersEnumLookup) / sizeof(EnumLookup)); if (specialChar) @@ -477,7 +477,7 @@ QString dumpTextAsCode(const QString &text) { QString result; QTextStream str(&result); - str << " QString result;\n" << hex << showbase; + str << " QString result;\n" << Qt::hex << Qt::showbase; for (QChar c : text) str << " result += QChar(" << c.unicode() << ");\n"; str << '\n'; diff --git a/tests/manual/dialogs/dialogs.pro b/tests/manual/dialogs/dialogs.pro index d765b8cf05..1beedc251e 100644 --- a/tests/manual/dialogs/dialogs.pro +++ b/tests/manual/dialogs/dialogs.pro @@ -1,9 +1,5 @@ -QT += core gui - -greaterThan(QT_MAJOR_VERSION, 4) { - QT += widgets - qtHaveModule(printsupport): QT += printsupport -} +QT += core gui widgets +qtHaveModule(printsupport): QT += printsupport TARGET = dialogs TEMPLATE = app diff --git a/tests/manual/dialogs/messageboxpanel.cpp b/tests/manual/dialogs/messageboxpanel.cpp index 07b387f988..6a305523ea 100644 --- a/tests/manual/dialogs/messageboxpanel.cpp +++ b/tests/manual/dialogs/messageboxpanel.cpp @@ -39,6 +39,8 @@ #include <QLineEdit> #include <QLabel> #include <QCheckBox> +#include <QRegularExpressionValidator> +#include <QRegularExpression> MessageBoxPanel::MessageBoxPanel(QWidget *parent) : QWidget(parent) ,m_iconComboBox(new QComboBox) @@ -80,7 +82,7 @@ MessageBoxPanel::MessageBoxPanel(QWidget *parent) : QWidget(parent) // buttons mask optionsLayout->addWidget(new QLabel(QString::fromLatin1("Message box button mask (in hex)"))); - m_validator = new QRegExpValidator(QRegExp("0[xX]?[0-9a-fA-F]+"), this); + m_validator = new QRegularExpressionValidator(QRegularExpression("0[xX]?[0-9a-fA-F]+"), this); m_buttonsMask->setMaxLength(10); m_buttonsMask->setValidator(m_validator); m_buttonsMask->setText(QString::fromLatin1("0x00300400")); diff --git a/tests/manual/dialogs/printdialogpanel.cpp b/tests/manual/dialogs/printdialogpanel.cpp index b7447e3d64..dcd8b43bf3 100644 --- a/tests/manual/dialogs/printdialogpanel.cpp +++ b/tests/manual/dialogs/printdialogpanel.cpp @@ -190,7 +190,8 @@ QTextStream &operator<<(QTextStream &s, const QSizeF &size) QTextStream &operator<<(QTextStream &s, const QRectF &rect) { - s << rect.width() << 'x' << rect.height() << forcesign << rect.x() << rect.y() << noforcesign; + s << rect.width() << 'x' << rect.height() << Qt::forcesign << rect.x() << rect.y() + << Qt::noforcesign; return s; } diff --git a/tests/manual/gestures/graphicsview/graphicsview.pro b/tests/manual/gestures/graphicsview/graphicsview.pro index 9ecd0b372f..a20c4b3948 100644 --- a/tests/manual/gestures/graphicsview/graphicsview.pro +++ b/tests/manual/gestures/graphicsview/graphicsview.pro @@ -1,5 +1,7 @@ QT += widgets +TARGET = tst_manual_graphicsview + SOURCES += main.cpp \ imageitem.cpp \ gestures.cpp \ diff --git a/tests/manual/highdpi/main.cpp b/tests/manual/highdpi/main.cpp index 0c4b5c88ae..2a9fb6aa0c 100644 --- a/tests/manual/highdpi/main.cpp +++ b/tests/manual/highdpi/main.cpp @@ -75,7 +75,7 @@ static QTextStream &operator<<(QTextStream &str, const QSizeF &s) static QTextStream &operator<<(QTextStream &str, const QRect &r) { - str << r.width() << 'x' << r.height() << forcesign << r.x() << r.y() << noforcesign; + str << r.width() << 'x' << r.height() << Qt::forcesign << r.x() << r.y() << Qt::noforcesign; return str; } diff --git a/tests/manual/manual.pro b/tests/manual/manual.pro index 42f9878e44..de13bc799e 100644 --- a/tests/manual/manual.pro +++ b/tests/manual/manual.pro @@ -67,8 +67,4 @@ qtConfig(opengl) { win32: SUBDIRS -= network_remote_stresstest network_stresstest -lessThan(QT_MAJOR_VERSION, 5): SUBDIRS -= bearerex lance qnetworkaccessmanager/qget qmimedatabase qnetworkreply \ -qpainfo qscreen socketengine xembed-raster xembed-widgets windowtransparency \ -embeddedintoforeignwindow foreignwindows - qtConfig(vulkan): SUBDIRS += qvulkaninstance diff --git a/tests/manual/qcursor/childwidget/childwidget.pro b/tests/manual/qcursor/childwidget/childwidget.pro index 9ca41c5b4f..9492ec2280 100644 --- a/tests/manual/qcursor/childwidget/childwidget.pro +++ b/tests/manual/qcursor/childwidget/childwidget.pro @@ -1,5 +1,5 @@ TEMPLATE = app -TARGET = childwidget +TARGET = tst_manual_childwidget INCLUDEPATH += . QT += widgets diff --git a/tests/manual/qcursor/qcursorhighdpi/qcursorhighdpi.pro b/tests/manual/qcursor/qcursorhighdpi/qcursorhighdpi.pro index 3a8fc25b33..b0a5a75a67 100644 --- a/tests/manual/qcursor/qcursorhighdpi/qcursorhighdpi.pro +++ b/tests/manual/qcursor/qcursorhighdpi/qcursorhighdpi.pro @@ -1,6 +1,5 @@ TEMPLATE = app -QT = core gui -greaterThan(QT_MAJOR_VERSION, 4): QT += gui-private core-private widgets +QT = core gui gui-private core-private widgets CONFIG -= app_bundle SOURCES += main.cpp win32: LIBS += -lUser32 diff --git a/tests/manual/qdesktopservices/qdesktopservices.pro b/tests/manual/qdesktopservices/qdesktopservices.pro index baa3c325ff..d2c5703870 100644 --- a/tests/manual/qdesktopservices/qdesktopservices.pro +++ b/tests/manual/qdesktopservices/qdesktopservices.pro @@ -1,6 +1,6 @@ QT += testlib -TARGET = tst_qdesktopservices +TARGET = tst_manual_qdesktopservices CONFIG += cmdline TEMPLATE = app diff --git a/tests/manual/qhttpnetworkconnection/main.cpp b/tests/manual/qhttpnetworkconnection/main.cpp index 5b670a51e2..d67d76699c 100644 --- a/tests/manual/qhttpnetworkconnection/main.cpp +++ b/tests/manual/qhttpnetworkconnection/main.cpp @@ -58,7 +58,7 @@ void tst_qhttpnetworkconnection::bigRemoteFile() QVERIFY(!QTestEventLoop::instance().timeout()); size = reply->size(); delete reply; - qDebug() << "Finished!" << endl; + qDebug() << "Finished!" << Qt::endl; qDebug() << "Time:" << t.elapsed() << "msec"; qDebug() << "Bytes:" << size; qDebug() << "Speed:" << (size / qreal(1024)) / (t.elapsed() / qreal(1000)) << "KB/sec"; diff --git a/tests/manual/qhttpnetworkconnection/qhttpnetworkconnection.pro b/tests/manual/qhttpnetworkconnection/qhttpnetworkconnection.pro index 62838785d6..f6763e434d 100644 --- a/tests/manual/qhttpnetworkconnection/qhttpnetworkconnection.pro +++ b/tests/manual/qhttpnetworkconnection/qhttpnetworkconnection.pro @@ -1,5 +1,5 @@ TEMPLATE = app -TARGET = tst_qhttpnetworkconnection +TARGET = tst_manual_qhttpnetworkconnection QT -= gui QT += network testlib diff --git a/tests/manual/qnetworkaccessmanager/qget/qget.cpp b/tests/manual/qnetworkaccessmanager/qget/qget.cpp index 639506af63..14bdb589ff 100644 --- a/tests/manual/qnetworkaccessmanager/qget/qget.cpp +++ b/tests/manual/qnetworkaccessmanager/qget/qget.cpp @@ -39,33 +39,41 @@ void printShortUsage() { - qDebug() << QCoreApplication::applicationName() << " [options] [list of urls]" << endl - << "Get one or more urls using QNetworkAccessManager" << endl - << "--help to display detailed usage" << endl; + qDebug() << QCoreApplication::applicationName() << " [options] [list of urls]" << Qt::endl + << "Get one or more urls using QNetworkAccessManager" << Qt::endl + << "--help to display detailed usage" << Qt::endl; } void printUsage() { - qDebug() << QCoreApplication::applicationName() << " [options] [list of urls]" << endl - << "Get one or more urls using QNetworkAccessManager" << endl + qDebug() << QCoreApplication::applicationName() << " [options] [list of urls]" << Qt::endl + << "Get one or more urls using QNetworkAccessManager" << Qt::endl << "Options:" - << "--help This message" << endl - << "--user=<username> Set username to use for authentication" << endl - << "--password=<password> Set password to use for authentication" << endl - << "--proxy-user=<username> Set username to use for proxy authentication" << endl - << "--proxy-password=<password> Set password to use for proxy authentication" << endl - << "--proxy=on Use system proxy (default)" << endl - << "--proxy=off Don't use system proxy" << endl - << "--proxy=<host:port>[,type] Use specified proxy" << endl - << " ,http HTTP proxy (default)" << endl - << " ,socks SOCKS5 proxy" << endl - << " ,ftp FTP proxy" << endl - << " ,httpcaching HTTP caching proxy (no CONNECT method)" << endl - << "--headers=filename Set request headers from file contents" << endl - << "--post=filename upload the file to the next url using HTTP POST" << endl - << "--put=filename upload the file to the next url using HTTP PUT" << endl - << "--content-type=<MIME> set content-type header for upload" << endl - << "--serial don't run requests in parallel" << endl; + << "--help This message" << Qt::endl + << "--user=<username> Set username to use for authentication" + << Qt::endl + << "--password=<password> Set password to use for authentication" + << Qt::endl + << "--proxy-user=<username> Set username to use for proxy authentication" + << Qt::endl + << "--proxy-password=<password> Set password to use for proxy authentication" + << Qt::endl + << "--proxy=on Use system proxy (default)" << Qt::endl + << "--proxy=off Don't use system proxy" << Qt::endl + << "--proxy=<host:port>[,type] Use specified proxy" << Qt::endl + << " ,http HTTP proxy (default)" << Qt::endl + << " ,socks SOCKS5 proxy" << Qt::endl + << " ,ftp FTP proxy" << Qt::endl + << " ,httpcaching HTTP caching proxy (no CONNECT method)" + << Qt::endl + << "--headers=filename Set request headers from file contents" + << Qt::endl + << "--post=filename upload the file to the next url using HTTP POST" + << Qt::endl + << "--put=filename upload the file to the next url using HTTP PUT" + << Qt::endl + << "--content-type=<MIME> set content-type header for upload" << Qt::endl + << "--serial don't run requests in parallel" << Qt::endl; } int main(int argc, char *argv[]) diff --git a/tests/manual/qnetworkconfiguration/qnetworkconfiguration.pro b/tests/manual/qnetworkconfiguration/qnetworkconfiguration.pro index 25ef41b92a..13c229e885 100644 --- a/tests/manual/qnetworkconfiguration/qnetworkconfiguration.pro +++ b/tests/manual/qnetworkconfiguration/qnetworkconfiguration.pro @@ -1,5 +1,5 @@ TEMPLATE = app -TARGET = tst_qnetworkconfiguration +TARGET = tst_manual_qnetworkconfiguration QT -= gui QT += network testlib diff --git a/tests/manual/qnetworkconfigurationmanager/qnetworkconfigurationmanager.pro b/tests/manual/qnetworkconfigurationmanager/qnetworkconfigurationmanager.pro index 8f9314cc96..072b330894 100644 --- a/tests/manual/qnetworkconfigurationmanager/qnetworkconfigurationmanager.pro +++ b/tests/manual/qnetworkconfigurationmanager/qnetworkconfigurationmanager.pro @@ -1,5 +1,5 @@ TEMPLATE = app -TARGET = tst_qnetworkconfigurationmanager +TARGET = tst_manual_qnetworkconfigurationmanager QT -= gui QT += network testlib diff --git a/tests/manual/qnetworkreply/main.cpp b/tests/manual/qnetworkreply/main.cpp index afac7a7095..01bd30a854 100644 --- a/tests/manual/qnetworkreply/main.cpp +++ b/tests/manual/qnetworkreply/main.cpp @@ -58,9 +58,6 @@ private slots: void setSslConfiguration_data(); void setSslConfiguration(); void uploadToFacebook(); - void spdy_data(); - void spdy(); - void spdyMultipleRequestsPerHost(); void proxyAuthentication_data(); void proxyAuthentication(); void authentication(); @@ -290,126 +287,6 @@ void tst_qnetworkreply::uploadToFacebook() } } -void tst_qnetworkreply::spdy_data() -{ - QTest::addColumn<QString>("host"); - QTest::addColumn<bool>("setAttribute"); - QTest::addColumn<bool>("enabled"); - QTest::addColumn<QByteArray>("expectedProtocol"); - - QList<QString> hosts = QList<QString>() - << QStringLiteral("www.google.com") // sends SPDY and 30x redirect - << QStringLiteral("www.google.de") // sends SPDY and 200 OK - << QStringLiteral("mail.google.com") // sends SPDY and 200 OK - << QStringLiteral("www.youtube.com") // sends SPDY and 200 OK - << QStringLiteral("www.dropbox.com") // no SPDY, but NPN which selects HTTP - << QStringLiteral("www.facebook.com") // sends SPDY and 200 OK - << QStringLiteral("graph.facebook.com") // sends SPDY and 200 OK - << QStringLiteral("www.twitter.com") // sends SPDY and 30x redirect - << QStringLiteral("twitter.com") // sends SPDY and 200 OK - << QStringLiteral("api.twitter.com"); // sends SPDY and 200 OK - - foreach (const QString &host, hosts) { - QByteArray tag = host.toLocal8Bit(); - tag.append("-not-used"); - QTest::newRow(tag) - << QStringLiteral("https://") + host - << false - << false - << QByteArray(); - - tag = host.toLocal8Bit(); - tag.append("-disabled"); - QTest::newRow(tag) - << QStringLiteral("https://") + host - << true - << false - << QByteArray(); - - if (host != QStringLiteral("api.twitter.com")) { // they don't offer an API over HTTP - tag = host.toLocal8Bit(); - tag.append("-no-https-url"); - QTest::newRow(tag) - << QStringLiteral("http://") + host - << true - << true - << QByteArray(); - } - -#ifndef QT_NO_OPENSSL - tag = host.toLocal8Bit(); - tag.append("-enabled"); - QTest::newRow(tag) - << QStringLiteral("https://") + host - << true - << true - << (host == QStringLiteral("www.dropbox.com") - ? QByteArray(QSslConfiguration::NextProtocolHttp1_1) - : QByteArray(QSslConfiguration::NextProtocolSpdy3_0)); -#endif // QT_NO_OPENSSL - } -} - -void tst_qnetworkreply::spdy() -{ -#if defined(QT_BUILD_INTERNAL) && !defined(QT_NO_SSL) && OPENSSL_VERSION_NUMBER >= 0x1000100fL && !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG) - - m_manager.clearAccessCache(); - - QFETCH(QString, host); - QUrl url(host); - QNetworkRequest request(url); - - QFETCH(bool, setAttribute); - QFETCH(bool, enabled); - if (setAttribute) { - request.setAttribute(QNetworkRequest::SpdyAllowedAttribute, QVariant(enabled)); - } - - QNetworkReply *reply = m_manager.get(request); - QObject::connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop())); - - QSignalSpy metaDataChangedSpy(reply, SIGNAL(metaDataChanged())); - QSignalSpy readyReadSpy(reply, SIGNAL(readyRead())); - QSignalSpy finishedSpy(reply, SIGNAL(finished())); - QSignalSpy finishedManagerSpy(&m_manager, SIGNAL(finished(QNetworkReply*))); - - QTestEventLoop::instance().enterLoop(15); - QVERIFY(!QTestEventLoop::instance().timeout()); - - QFETCH(QByteArray, expectedProtocol); - - bool expectedSpdyUsed = (expectedProtocol == QSslConfiguration::NextProtocolSpdy3_0); - QCOMPARE(reply->attribute(QNetworkRequest::SpdyWasUsedAttribute).toBool(), expectedSpdyUsed); - - QCOMPARE(metaDataChangedSpy.count(), 1); - QCOMPARE(finishedSpy.count(), 1); - QCOMPARE(finishedManagerSpy.count(), 1); - - QUrl redirectUrl = reply->header(QNetworkRequest::LocationHeader).toUrl(); - QByteArray content = reply->readAll(); - - int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); - QVERIFY(statusCode >= 200 && statusCode < 500); - if (statusCode == 200 || statusCode >= 400) { - QVERIFY(readyReadSpy.count() > 0); - QVERIFY(!content.isEmpty()); - } else if (statusCode >= 300 && statusCode < 400) { - QVERIFY(!redirectUrl.isEmpty()); - } - - QSslConfiguration::NextProtocolNegotiationStatus expectedStatus = - expectedProtocol.isNull() ? QSslConfiguration::NextProtocolNegotiationNone - : QSslConfiguration::NextProtocolNegotiationNegotiated; - QCOMPARE(reply->sslConfiguration().nextProtocolNegotiationStatus(), - expectedStatus); - - QCOMPARE(reply->sslConfiguration().nextNegotiatedProtocol(), expectedProtocol); -#else - QSKIP("Qt built withouth OpenSSL, or the OpenSSL version is too old"); -#endif // defined(QT_BUILD_INTERNAL) && !defined(QT_NO_SSL) ... -} - void tst_qnetworkreply::spdyReplyFinished() { static int finishedCount = 0; @@ -419,85 +296,6 @@ void tst_qnetworkreply::spdyReplyFinished() QTestEventLoop::instance().exitLoop(); } -void tst_qnetworkreply::spdyMultipleRequestsPerHost() -{ -#if defined(QT_BUILD_INTERNAL) && !defined(QT_NO_SSL) && OPENSSL_VERSION_NUMBER >= 0x1000100fL && !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG) - - QList<QNetworkRequest> requests; - requests - << QNetworkRequest(QUrl("https://www.facebook.com")) - << QNetworkRequest(QUrl("https://www.facebook.com/images/fb_icon_325x325.png")) - - << QNetworkRequest(QUrl("https://www.google.de")) - << QNetworkRequest(QUrl("https://www.google.de/preferences?hl=de")) - << QNetworkRequest(QUrl("https://www.google.de/intl/de/policies/?fg=1")) - << QNetworkRequest(QUrl("https://www.google.de/intl/de/about.html?fg=1")) - << QNetworkRequest(QUrl("https://www.google.de/services/?fg=1")) - << QNetworkRequest(QUrl("https://www.google.de/intl/de/ads/?fg=1")) - - << QNetworkRequest(QUrl("https://i1.ytimg.com/li/tnHdj3df7iM/default.jpg")) - << QNetworkRequest(QUrl("https://i1.ytimg.com/li/7Dr1BKwqctY/default.jpg")) - << QNetworkRequest(QUrl("https://i1.ytimg.com/li/hfZhJdhTqX8/default.jpg")) - << QNetworkRequest(QUrl("https://i1.ytimg.com/vi/14Nprh8163I/hqdefault.jpg")) - ; - QList<QNetworkReply *> replies; - QList<QSignalSpy *> metaDataChangedSpies; - QList<QSignalSpy *> readyReadSpies; - QList<QSignalSpy *> finishedSpies; - - QSignalSpy finishedManagerSpy(&m_manager, SIGNAL(finished(QNetworkReply*))); - - foreach (QNetworkRequest request, requests) { - request.setAttribute(QNetworkRequest::SpdyAllowedAttribute, true); - QNetworkReply *reply = m_manager.get(request); - QObject::connect(reply, SIGNAL(finished()), this, SLOT(spdyReplyFinished())); - replies << reply; - QSignalSpy *metaDataChangedSpy = new QSignalSpy(reply, SIGNAL(metaDataChanged())); - metaDataChangedSpies << metaDataChangedSpy; - QSignalSpy *readyReadSpy = new QSignalSpy(reply, SIGNAL(readyRead())); - readyReadSpies << readyReadSpy; - QSignalSpy *finishedSpy = new QSignalSpy(reply, SIGNAL(finished())); - finishedSpies << finishedSpy; - } - - QCOMPARE(requests.count(), replies.count()); - - QTestEventLoop::instance().enterLoop(15); - QVERIFY(!QTestEventLoop::instance().timeout()); - - QCOMPARE(finishedManagerSpy.count(), requests.count()); - - for (int a = 0; a < replies.count(); ++a) { - - QCOMPARE(replies.at(a)->sslConfiguration().nextProtocolNegotiationStatus(), - QSslConfiguration::NextProtocolNegotiationNegotiated); - QCOMPARE(replies.at(a)->sslConfiguration().nextNegotiatedProtocol(), - QByteArray(QSslConfiguration::NextProtocolSpdy3_0)); - - QCOMPARE(replies.at(a)->error(), QNetworkReply::NoError); - QCOMPARE(replies.at(a)->attribute(QNetworkRequest::SpdyWasUsedAttribute).toBool(), true); - QCOMPARE(replies.at(a)->attribute(QNetworkRequest::ConnectionEncryptedAttribute).toBool(), true); - QCOMPARE(replies.at(a)->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200); - - QByteArray content = replies.at(a)->readAll(); - QVERIFY(content.count() > 0); - - QCOMPARE(metaDataChangedSpies.at(a)->count(), 1); - metaDataChangedSpies.at(a)->deleteLater(); - - QCOMPARE(finishedSpies.at(a)->count(), 1); - finishedSpies.at(a)->deleteLater(); - - QVERIFY(readyReadSpies.at(a)->count() > 0); - readyReadSpies.at(a)->deleteLater(); - - replies.at(a)->deleteLater(); - } -#else - QSKIP("Qt built withouth OpenSSL, or the OpenSSL version is too old"); -#endif // defined(QT_BUILD_INTERNAL) && !defined(QT_NO_SSL) ... -} - void tst_qnetworkreply::proxyAuthentication_data() { QTest::addColumn<QUrl>("url"); @@ -586,7 +384,7 @@ void tst_qnetworkreply::npnWithEmptyList() // QTBUG-40714 QUrl url(QStringLiteral("https://www.ossifrage.net/")); QNetworkRequest request(url); - request.setAttribute(QNetworkRequest::SpdyAllowedAttribute, QVariant(true)); + request.setAttribute(QNetworkRequest::Http2AllowedAttribute, QVariant(true)); QNetworkReply *reply = m_manager.get(request); QObject::connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop())); diff --git a/tests/manual/qnetworkreply/qnetworkreply.pro b/tests/manual/qnetworkreply/qnetworkreply.pro index eddcbdff1d..2457acd749 100644 --- a/tests/manual/qnetworkreply/qnetworkreply.pro +++ b/tests/manual/qnetworkreply/qnetworkreply.pro @@ -1,5 +1,5 @@ TEMPLATE = app -TARGET = tst_qnetworkreply +TARGET = tst_manual_qnetworkreply QT -= gui QT += core-private network network-private testlib diff --git a/tests/manual/qscreen/main.cpp b/tests/manual/qscreen/main.cpp index 0728d66bf9..ab92216d22 100644 --- a/tests/manual/qscreen/main.cpp +++ b/tests/manual/qscreen/main.cpp @@ -192,15 +192,15 @@ static inline QString msgScreenChange(const QWidget *w, const QScreen *oldScreen if (!newScreen) { result = QLatin1String("Screen changed --> null"); } else if (!oldScreen) { - QTextStream(&result) << "Screen changed null --> \"" - << newScreen->name() << "\" at " << pos.x() << ',' << pos.y() << " geometry: " - << geometry.width() << 'x' << geometry.height() << forcesign << geometry.x() - << geometry.y() << '.'; + QTextStream(&result) << "Screen changed null --> \"" << newScreen->name() << "\" at " + << pos.x() << ',' << pos.y() << " geometry: " << geometry.width() + << 'x' << geometry.height() << Qt::forcesign << geometry.x() + << geometry.y() << '.'; } else { QTextStream(&result) << "Screen changed \"" << oldScreen->name() << "\" --> \"" - << newScreen->name() << "\" at " << pos.x() << ',' << pos.y() << " geometry: " - << geometry.width() << 'x' << geometry.height() << forcesign << geometry.x() - << geometry.y() << '.'; + << newScreen->name() << "\" at " << pos.x() << ',' << pos.y() + << " geometry: " << geometry.width() << 'x' << geometry.height() + << Qt::forcesign << geometry.x() << geometry.y() << '.'; } return result; } diff --git a/tests/manual/qssloptions/main.cpp b/tests/manual/qssloptions/main.cpp index 0f06071b41..cc65c57f33 100644 --- a/tests/manual/qssloptions/main.cpp +++ b/tests/manual/qssloptions/main.cpp @@ -37,13 +37,13 @@ int main(int argc, char **argv) if (argc < 3) { QTextStream out(stdout); - out << "Usage: " << argv[0] << " host port [options]" << endl; - out << "The options can be one or more of the following:" << endl; - out << "enable_empty_fragments" << endl; - out << "disable_session_tickets" << endl; - out << "disable_compression" << endl; - out << "disable_sni" << endl; - out << "enable_unsafe_reneg" << endl; + out << "Usage: " << argv[0] << " host port [options]" << Qt::endl; + out << "The options can be one or more of the following:" << Qt::endl; + out << "enable_empty_fragments" << Qt::endl; + out << "disable_session_tickets" << Qt::endl; + out << "disable_compression" << Qt::endl; + out << "disable_sni" << Qt::endl; + out << "enable_unsafe_reneg" << Qt::endl; return 1; } diff --git a/tests/manual/qsslsocket/qsslsocket.pro b/tests/manual/qsslsocket/qsslsocket.pro index c297d887ba..511d31898f 100644 --- a/tests/manual/qsslsocket/qsslsocket.pro +++ b/tests/manual/qsslsocket/qsslsocket.pro @@ -3,4 +3,4 @@ CONFIG += testcase SOURCES += main.cpp QT = core network testlib -TARGET = tst_qsslsocket +TARGET = tst_manual_qsslsocket diff --git a/tests/manual/qtexteditlist/qtexteditlist.pro b/tests/manual/qtexteditlist/qtexteditlist.pro index 953333f3ee..972e054445 100644 --- a/tests/manual/qtexteditlist/qtexteditlist.pro +++ b/tests/manual/qtexteditlist/qtexteditlist.pro @@ -1,6 +1,6 @@ #This project can be used to verify QTBUG-5111 case. QT += core gui -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets +QT += widgets TARGET = qtexteditlist TEMPLATE = app SOURCES += main.cpp widget.cpp diff --git a/tests/manual/qtexttableborders/qtexttableborders.pro b/tests/manual/qtexttableborders/qtexttableborders.pro index 7e454f978d..3805ac6ed0 100644 --- a/tests/manual/qtexttableborders/qtexttableborders.pro +++ b/tests/manual/qtexttableborders/qtexttableborders.pro @@ -1,7 +1,6 @@ #This project can be used to verify QTBUG-36152 case. -QT += core gui printsupport +QT += core gui printsupport widgets CONFIG += c++11 -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = qtexttableborders TEMPLATE = app SOURCES += main.cpp widget.cpp diff --git a/tests/manual/qtouchevent/qtouchevent.pro b/tests/manual/qtouchevent/qtouchevent.pro index 81384eaf24..4ba921d301 100644 --- a/tests/manual/qtouchevent/qtouchevent.pro +++ b/tests/manual/qtouchevent/qtouchevent.pro @@ -1,5 +1,4 @@ -QT += testlib -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets +QT += testlib widgets SOURCES = main.cpp \ touchwidget.cpp FORMS += form.ui diff --git a/tests/manual/repaint/mainwindow/mainwindow.pro b/tests/manual/repaint/mainwindow/mainwindow.pro index f20e5fe402..419436032c 100644 --- a/tests/manual/repaint/mainwindow/mainwindow.pro +++ b/tests/manual/repaint/mainwindow/mainwindow.pro @@ -1,3 +1,4 @@ +TARGET = tst_manual_mainwindow QT += widgets HEADERS += ../shared/shared.h SOURCES += main.cpp diff --git a/tests/manual/repaint/scrollarea/scrollarea.pro b/tests/manual/repaint/scrollarea/scrollarea.pro index f20e5fe402..deff158cce 100644 --- a/tests/manual/repaint/scrollarea/scrollarea.pro +++ b/tests/manual/repaint/scrollarea/scrollarea.pro @@ -1,3 +1,4 @@ QT += widgets +TARGET = tst_manual_scrollarea HEADERS += ../shared/shared.h SOURCES += main.cpp diff --git a/tests/manual/repaint/toplevel/toplevel.pro b/tests/manual/repaint/toplevel/toplevel.pro index a881c24f56..d142fd19bb 100644 --- a/tests/manual/repaint/toplevel/toplevel.pro +++ b/tests/manual/repaint/toplevel/toplevel.pro @@ -1,5 +1,6 @@ CONFIG += console QT += widgets +TARGET = tst_manual_toplevel HEADERS += ../shared/shared.h SOURCES += main.cpp diff --git a/tests/manual/touch/main.cpp b/tests/manual/touch/main.cpp index a244230a22..8572e18955 100644 --- a/tests/manual/touch/main.cpp +++ b/tests/manual/touch/main.cpp @@ -526,7 +526,7 @@ void MainWindow::updateScreenLabel() const QRect geometry = screen->geometry(); const qreal dpr = screen->devicePixelRatio(); str << '"' << screen->name() << "\" " << geometry.width() << 'x' << geometry.height() - << forcesign << geometry.x() << geometry.y() << noforcesign; + << Qt::forcesign << geometry.x() << geometry.y() << Qt::noforcesign; if (!qFuzzyCompare(dpr, qreal(1))) str << ", dpr=" << dpr; m_screenLabel->setText(text); diff --git a/tests/manual/touch/touch.pro b/tests/manual/touch/touch.pro index fcb3c47f43..08e3fdcd71 100644 --- a/tests/manual/touch/touch.pro +++ b/tests/manual/touch/touch.pro @@ -1,5 +1,4 @@ TEMPLATE = app -QT = core gui -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets +QT = core gui widgets CONFIG -= app_bundle SOURCES += main.cpp diff --git a/tests/manual/unc/unc.pro b/tests/manual/unc/unc.pro index 977bd0c177..a1536a03db 100644 --- a/tests/manual/unc/unc.pro +++ b/tests/manual/unc/unc.pro @@ -1,5 +1,4 @@ -QT += core gui -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets +QT += core gui widgets TEMPLATE = app diff --git a/tests/manual/widgetgrab/widgetgrab.pro b/tests/manual/widgetgrab/widgetgrab.pro index d206fb1df1..c354711197 100644 --- a/tests/manual/widgetgrab/widgetgrab.pro +++ b/tests/manual/widgetgrab/widgetgrab.pro @@ -1,9 +1,5 @@ -QT += core gui +QT += core gui widgets TARGET = widgetgrab TEMPLATE = app SOURCES += main.cpp - -greaterThan(QT_MAJOR_VERSION, 4) { - QT += widgets -} diff --git a/tests/manual/widgets/styles/styles.pro b/tests/manual/widgets/styles/styles.pro index d302ae0691..1830e21705 100644 --- a/tests/manual/widgets/styles/styles.pro +++ b/tests/manual/widgets/styles/styles.pro @@ -1,5 +1,6 @@ TEMPLATE = app QT = widgets +TARGET = tst_manual_styles CONFIG += cmdline CONFIG += c++11 diff --git a/tests/manual/widgets/widgets.pro b/tests/manual/widgets/widgets.pro index e3942a49e9..03aaa880b8 100644 --- a/tests/manual/widgets/widgets.pro +++ b/tests/manual/widgets/widgets.pro @@ -1,3 +1,2 @@ TEMPLATE = subdirs -SUBDIRS = itemviews qgraphicsview kernel widgets -greaterThan(QT_MAJOR_VERSION, 4): SUBDIRS += styles +SUBDIRS = itemviews qgraphicsview kernel widgets styles diff --git a/tests/manual/widgets/widgets/bigmenucreator/bigmenucreator.pro b/tests/manual/widgets/widgets/bigmenucreator/bigmenucreator.pro index 69fbea3834..408dab6482 100644 --- a/tests/manual/widgets/widgets/bigmenucreator/bigmenucreator.pro +++ b/tests/manual/widgets/widgets/bigmenucreator/bigmenucreator.pro @@ -4,9 +4,7 @@ # #------------------------------------------------- -QT += core gui - -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets +QT += core gui widgets TARGET = BigMenuCreator TEMPLATE = app diff --git a/tests/manual/windowchildgeometry/windowchildgeometry.pro b/tests/manual/windowchildgeometry/windowchildgeometry.pro index 921acd8a4e..7722547ce7 100644 --- a/tests/manual/windowchildgeometry/windowchildgeometry.pro +++ b/tests/manual/windowchildgeometry/windowchildgeometry.pro @@ -1,5 +1,4 @@ -QT += core gui -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets +QT += core gui widgets TARGET = windowchildgeometry TEMPLATE = app diff --git a/tests/manual/windowflags/previewwindow.cpp b/tests/manual/windowflags/previewwindow.cpp index ef3966830b..893dbc9a41 100644 --- a/tests/manual/windowflags/previewwindow.cpp +++ b/tests/manual/windowflags/previewwindow.cpp @@ -48,7 +48,8 @@ void PreviewWindow::paintEvent(QPaintEvent *event) static void formatWindowFlags(QTextStream &str, Qt::WindowFlags flags) { - str << "Window flags: " << hex << showbase << unsigned(flags) << noshowbase << dec << ' '; + str << "Window flags: " << Qt::hex << Qt::showbase << unsigned(flags) << Qt::noshowbase + << Qt::dec << ' '; switch (flags & Qt::WindowType_Mask) { case Qt::Window: str << "Qt::Window"; @@ -125,7 +126,8 @@ static void formatWindowFlags(QTextStream &str, Qt::WindowFlags flags) static void formatWindowStates(QTextStream &str, Qt::WindowStates states) { - str << "Window states: " << hex << showbase << unsigned(states) << noshowbase << dec << ' '; + str << "Window states: " << Qt::hex << Qt::showbase << unsigned(states) << Qt::noshowbase + << Qt::dec << ' '; if (states & Qt::WindowActive) { str << "Qt::WindowActive "; states &= ~Qt::WindowActive; @@ -150,7 +152,7 @@ static void formatWindowStates(QTextStream &str, Qt::WindowStates states) QTextStream &operator<<(QTextStream &str, const QRect &r) { - str << r.width() << 'x' << r.height() << forcesign << r.x() << r.y() << noforcesign; + str << r.width() << 'x' << r.height() << Qt::forcesign << r.x() << r.y() << Qt::noforcesign; return str; } diff --git a/tests/manual/windowflags/windowflags.pro b/tests/manual/windowflags/windowflags.pro index ba0f75b65c..4cd60ae6cf 100644 --- a/tests/manual/windowflags/windowflags.pro +++ b/tests/manual/windowflags/windowflags.pro @@ -1,3 +1,5 @@ +TARGET = tst_manual_windowflags + HEADERS = controllerwindow.h \ previewwindow.h \ controls.h @@ -7,4 +9,4 @@ SOURCES = controllerwindow.cpp \ main.cpp \ controls.cpp -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets +QT += widgets diff --git a/tests/manual/windowgeometry/windowgeometry.pro b/tests/manual/windowgeometry/windowgeometry.pro index e717799649..ee99f1950c 100644 --- a/tests/manual/windowgeometry/windowgeometry.pro +++ b/tests/manual/windowgeometry/windowgeometry.pro @@ -1,5 +1,4 @@ -QT += core gui -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets +QT += core gui widgets TARGET = windowgeometry TEMPLATE = app diff --git a/tests/manual/windowmodality/windowmodality.pro b/tests/manual/windowmodality/windowmodality.pro index b29e939d27..973579c508 100644 --- a/tests/manual/windowmodality/windowmodality.pro +++ b/tests/manual/windowmodality/windowmodality.pro @@ -1,3 +1,3 @@ SOURCES = main.cpp FORMS = widget.ui dialog.ui -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport +QT += widgets printsupport diff --git a/tests/manual/xembed-raster/xembed-raster.pro b/tests/manual/xembed-raster/xembed-raster.pro index adaf9c4d25..4c9fee07b8 100644 --- a/tests/manual/xembed-raster/xembed-raster.pro +++ b/tests/manual/xembed-raster/xembed-raster.pro @@ -1,5 +1,5 @@ TEMPLATE = app -TARGET= rasterwindow +TARGET= tst_manual_rasterwindow QT += gui SOURCES += \ diff --git a/tests/manual/xembed-widgets/xembed-widgets.pro b/tests/manual/xembed-widgets/xembed-widgets.pro index e406ee47fd..28d13d5b61 100644 --- a/tests/manual/xembed-widgets/xembed-widgets.pro +++ b/tests/manual/xembed-widgets/xembed-widgets.pro @@ -1,5 +1,5 @@ TEMPLATE = app -TARGET= lineedits +TARGET= tst_manual_lineedits QT += widgets SOURCES += \ |