diff options
author | Frederik Gladhorn <frederik.gladhorn@theqtcompany.com> | 2015-03-09 09:23:55 +0000 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2015-03-09 11:19:22 +0000 |
commit | 4dc459837b42cbfff9a8e0325dc3319cc87e02ac (patch) | |
tree | fa1ebc0a089b3d52c656610fae6a1425f0d0852f /tests | |
parent | d815de8c26ccee33713e37a0fec2982755dcfe1f (diff) | |
parent | 6cef72d0b4f6cd676203688a2562f0a9a620c7fb (diff) |
Merge "Merge remote-tracking branch 'origin/5.5' into dev" into refs/staging/dev
Diffstat (limited to 'tests')
61 files changed, 683 insertions, 70 deletions
diff --git a/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp b/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp index 93a6daa6b9..ff4963a960 100644 --- a/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp +++ b/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp @@ -102,10 +102,15 @@ void tst_QCoreApplication::qAppName() const char* appName = "tst_qcoreapplication"; #endif - int argc = 1; - char *argv[] = { const_cast<char*>(appName) }; - TestApplication app(argc, argv); - QCOMPARE(::qAppName(), QString::fromLatin1(appName)); + { + int argc = 1; + char *argv[] = { const_cast<char*>(appName) }; + TestApplication app(argc, argv); + QCOMPARE(::qAppName(), QString::fromLatin1(appName)); + QCOMPARE(QCoreApplication::applicationName(), QString::fromLatin1(appName)); + } + // The application name should still be available after destruction; + // global statics often rely on this. QCOMPARE(QCoreApplication::applicationName(), QString::fromLatin1(appName)); } diff --git a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp index 717a7633f5..88b1bebb29 100644 --- a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp +++ b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp @@ -661,6 +661,9 @@ template<> struct TestValueFactory<QMetaType::QUuid> { template<> struct TestValueFactory<QMetaType::QModelIndex> { static QModelIndex *create() { return new QModelIndex(); } }; +template<> struct TestValueFactory<QMetaType::QPersistentModelIndex> { + static QPersistentModelIndex *create() { return new QPersistentModelIndex(); } +}; template<> struct TestValueFactory<QMetaType::QRegExp> { static QRegExp *create() { @@ -1735,6 +1738,7 @@ struct StreamingTraits DECLARE_NONSTREAMABLE(void) DECLARE_NONSTREAMABLE(void*) DECLARE_NONSTREAMABLE(QModelIndex) +DECLARE_NONSTREAMABLE(QPersistentModelIndex) DECLARE_NONSTREAMABLE(QJsonValue) DECLARE_NONSTREAMABLE(QJsonObject) DECLARE_NONSTREAMABLE(QJsonArray) diff --git a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp index 32674c587c..1f5132d369 100644 --- a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp +++ b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp @@ -248,6 +248,7 @@ private slots: void movabilityTest(); void variantInVariant(); void userConversion(); + void modelIndexConversion(); void forwardDeclare(); void debugStream_data(); @@ -3846,6 +3847,17 @@ void tst_QVariant::userConversion() } } +void tst_QVariant::modelIndexConversion() +{ + QVariant modelIndexVariant = QModelIndex(); + QVERIFY(modelIndexVariant.canConvert(QMetaType::QPersistentModelIndex)); + QVERIFY(modelIndexVariant.convert(QMetaType::QPersistentModelIndex)); + QCOMPARE(modelIndexVariant.type(), QVariant::PersistentModelIndex); + QVERIFY(modelIndexVariant.canConvert(QMetaType::QModelIndex)); + QVERIFY(modelIndexVariant.convert(QMetaType::QModelIndex)); + QCOMPARE(modelIndexVariant.type(), QVariant::ModelIndex); +} + class Forward; Q_DECLARE_OPAQUE_POINTER(Forward*) Q_DECLARE_METATYPE(Forward*) @@ -4073,6 +4085,7 @@ void tst_QVariant::implicitConstruction() F(EasingCurve) \ F(Uuid) \ F(ModelIndex) \ + F(PersistentModelIndex) \ F(RegularExpression) \ F(JsonValue) \ F(JsonObject) \ diff --git a/tests/auto/corelib/thread/qatomicinteger/char/char.pro b/tests/auto/corelib/thread/qatomicinteger/char/char.pro index 51ef1add8f..1e97d5cbae 100644 --- a/tests/auto/corelib/thread/qatomicinteger/char/char.pro +++ b/tests/auto/corelib/thread/qatomicinteger/char/char.pro @@ -1,2 +1 @@ -TYPE = $$basename(PWD) include(../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/char16_t/char16_t.pro b/tests/auto/corelib/thread/qatomicinteger/char16_t/char16_t.pro index 51ef1add8f..1e97d5cbae 100644 --- a/tests/auto/corelib/thread/qatomicinteger/char16_t/char16_t.pro +++ b/tests/auto/corelib/thread/qatomicinteger/char16_t/char16_t.pro @@ -1,2 +1 @@ -TYPE = $$basename(PWD) include(../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/char32_t/char32_t.pro b/tests/auto/corelib/thread/qatomicinteger/char32_t/char32_t.pro index 51ef1add8f..1e97d5cbae 100644 --- a/tests/auto/corelib/thread/qatomicinteger/char32_t/char32_t.pro +++ b/tests/auto/corelib/thread/qatomicinteger/char32_t/char32_t.pro @@ -1,2 +1 @@ -TYPE = $$basename(PWD) include(../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/cxx11/char/char.pro b/tests/auto/corelib/thread/qatomicinteger/cxx11/char/char.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/cxx11/char/char.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/cxx11/char16_t/char16_t.pro b/tests/auto/corelib/thread/qatomicinteger/cxx11/char16_t/char16_t.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/cxx11/char16_t/char16_t.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/cxx11/char32_t/char32_t.pro b/tests/auto/corelib/thread/qatomicinteger/cxx11/char32_t/char32_t.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/cxx11/char32_t/char32_t.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/cxx11/int/int.pro b/tests/auto/corelib/thread/qatomicinteger/cxx11/int/int.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/cxx11/int/int.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/cxx11/long/long.pro b/tests/auto/corelib/thread/qatomicinteger/cxx11/long/long.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/cxx11/long/long.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/cxx11/qlonglong/qlonglong.pro b/tests/auto/corelib/thread/qatomicinteger/cxx11/qlonglong/qlonglong.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/cxx11/qlonglong/qlonglong.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/cxx11/qptrdiff/qptrdiff.pro b/tests/auto/corelib/thread/qatomicinteger/cxx11/qptrdiff/qptrdiff.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/cxx11/qptrdiff/qptrdiff.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/cxx11/quintptr/quintptr.pro b/tests/auto/corelib/thread/qatomicinteger/cxx11/quintptr/quintptr.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/cxx11/quintptr/quintptr.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/cxx11/qulonglong/qulonglong.pro b/tests/auto/corelib/thread/qatomicinteger/cxx11/qulonglong/qulonglong.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/cxx11/qulonglong/qulonglong.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/cxx11/schar/schar.pro b/tests/auto/corelib/thread/qatomicinteger/cxx11/schar/schar.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/cxx11/schar/schar.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/cxx11/short/short.pro b/tests/auto/corelib/thread/qatomicinteger/cxx11/short/short.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/cxx11/short/short.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/cxx11/uchar/uchar.pro b/tests/auto/corelib/thread/qatomicinteger/cxx11/uchar/uchar.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/cxx11/uchar/uchar.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/cxx11/uint/uint.pro b/tests/auto/corelib/thread/qatomicinteger/cxx11/uint/uint.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/cxx11/uint/uint.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/cxx11/ulong/ulong.pro b/tests/auto/corelib/thread/qatomicinteger/cxx11/ulong/ulong.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/cxx11/ulong/ulong.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/cxx11/ushort/ushort.pro b/tests/auto/corelib/thread/qatomicinteger/cxx11/ushort/ushort.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/cxx11/ushort/ushort.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/cxx11/wchar_t/wchar_t.pro b/tests/auto/corelib/thread/qatomicinteger/cxx11/wchar_t/wchar_t.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/cxx11/wchar_t/wchar_t.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/gcc/char/char.pro b/tests/auto/corelib/thread/qatomicinteger/gcc/char/char.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/gcc/char/char.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/gcc/char16_t/char16_t.pro b/tests/auto/corelib/thread/qatomicinteger/gcc/char16_t/char16_t.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/gcc/char16_t/char16_t.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/gcc/char32_t/char32_t.pro b/tests/auto/corelib/thread/qatomicinteger/gcc/char32_t/char32_t.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/gcc/char32_t/char32_t.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/gcc/int/int.pro b/tests/auto/corelib/thread/qatomicinteger/gcc/int/int.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/gcc/int/int.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/gcc/long/long.pro b/tests/auto/corelib/thread/qatomicinteger/gcc/long/long.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/gcc/long/long.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/gcc/qlonglong/qlonglong.pro b/tests/auto/corelib/thread/qatomicinteger/gcc/qlonglong/qlonglong.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/gcc/qlonglong/qlonglong.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/gcc/qptrdiff/qptrdiff.pro b/tests/auto/corelib/thread/qatomicinteger/gcc/qptrdiff/qptrdiff.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/gcc/qptrdiff/qptrdiff.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/gcc/quintptr/quintptr.pro b/tests/auto/corelib/thread/qatomicinteger/gcc/quintptr/quintptr.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/gcc/quintptr/quintptr.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/gcc/qulonglong/qulonglong.pro b/tests/auto/corelib/thread/qatomicinteger/gcc/qulonglong/qulonglong.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/gcc/qulonglong/qulonglong.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/gcc/schar/schar.pro b/tests/auto/corelib/thread/qatomicinteger/gcc/schar/schar.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/gcc/schar/schar.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/gcc/short/short.pro b/tests/auto/corelib/thread/qatomicinteger/gcc/short/short.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/gcc/short/short.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/gcc/uchar/uchar.pro b/tests/auto/corelib/thread/qatomicinteger/gcc/uchar/uchar.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/gcc/uchar/uchar.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/gcc/uint/uint.pro b/tests/auto/corelib/thread/qatomicinteger/gcc/uint/uint.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/gcc/uint/uint.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/gcc/ulong/ulong.pro b/tests/auto/corelib/thread/qatomicinteger/gcc/ulong/ulong.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/gcc/ulong/ulong.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/gcc/ushort/ushort.pro b/tests/auto/corelib/thread/qatomicinteger/gcc/ushort/ushort.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/gcc/ushort/ushort.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/gcc/wchar_t/wchar_t.pro b/tests/auto/corelib/thread/qatomicinteger/gcc/wchar_t/wchar_t.pro new file mode 100644 index 0000000000..64401f0229 --- /dev/null +++ b/tests/auto/corelib/thread/qatomicinteger/gcc/wchar_t/wchar_t.pro @@ -0,0 +1 @@ +include(../../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/int/int.pro b/tests/auto/corelib/thread/qatomicinteger/int/int.pro index 51ef1add8f..1e97d5cbae 100644 --- a/tests/auto/corelib/thread/qatomicinteger/int/int.pro +++ b/tests/auto/corelib/thread/qatomicinteger/int/int.pro @@ -1,2 +1 @@ -TYPE = $$basename(PWD) include(../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/long/long.pro b/tests/auto/corelib/thread/qatomicinteger/long/long.pro index 51ef1add8f..1e97d5cbae 100644 --- a/tests/auto/corelib/thread/qatomicinteger/long/long.pro +++ b/tests/auto/corelib/thread/qatomicinteger/long/long.pro @@ -1,2 +1 @@ -TYPE = $$basename(PWD) include(../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/qatomicinteger.pri b/tests/auto/corelib/thread/qatomicinteger/qatomicinteger.pri index dc7cc8bcec..d9ebe64d5b 100644 --- a/tests/auto/corelib/thread/qatomicinteger/qatomicinteger.pri +++ b/tests/auto/corelib/thread/qatomicinteger/qatomicinteger.pri @@ -1,7 +1,20 @@ -isEmpty(TYPE): error("Project must define TYPE variable") +# Get our build type from the directory name +TYPE = $$basename(_PRO_FILE_PWD_) +dn = $$dirname(_PRO_FILE_PWD_) +FORCE = $$basename(dn) + +equals(FORCE, cxx11) { + suffix = Cxx11_$$TYPE + DEFINES += QT_ATOMIC_FORCE_CXX11 +} else: equals(FORCE, gcc) { + suffix = Gcc_$$TYPE + DEFINES += QT_ATOMIC_FORCE_GCC +} else { + suffix = $$TYPE +} CONFIG += testcase parallel_test QT = core testlib -TARGET = tst_qatomicinteger_$$TYPE +TARGET = tst_qatomicinteger_$$lower($$suffix) SOURCES = $$PWD/tst_qatomicinteger.cpp -DEFINES += QATOMIC_TEST_TYPE=$$TYPE tst_QAtomicIntegerXX=tst_QAtomicInteger_$$TYPE +DEFINES += QATOMIC_TEST_TYPE=$$TYPE tst_QAtomicIntegerXX=tst_QAtomicInteger_$$suffix diff --git a/tests/auto/corelib/thread/qatomicinteger/qatomicinteger.pro b/tests/auto/corelib/thread/qatomicinteger/qatomicinteger.pro index 373e8801a4..58e5b157bd 100644 --- a/tests/auto/corelib/thread/qatomicinteger/qatomicinteger.pro +++ b/tests/auto/corelib/thread/qatomicinteger/qatomicinteger.pro @@ -17,3 +17,42 @@ SUBDIRS=\ ushort \ wchar_t \ + +contains(QT_CONFIG, c++11)|msvc: SUBDIRS +=\ + cxx11/char \ + cxx11/char16_t \ + cxx11/char32_t \ + cxx11/int \ + cxx11/long \ + cxx11/qlonglong \ + cxx11/qptrdiff \ + cxx11/quintptr \ + cxx11/qulonglong \ + cxx11/schar \ + cxx11/short \ + cxx11/uchar \ + cxx11/uint \ + cxx11/ulong \ + cxx11/ushort \ + cxx11/wchar_t \ + + +# The GCC-style atomics only support 32-bit and pointer-sized but add +# them all anyway so we ensure the macros are properly defined +gcc: SUBDIRS +=\ + gcc/char \ + gcc/char16_t \ + gcc/char32_t \ + gcc/int \ + gcc/long \ + gcc/qlonglong \ + gcc/qptrdiff \ + gcc/quintptr \ + gcc/qulonglong \ + gcc/schar \ + gcc/short \ + gcc/uchar \ + gcc/uint \ + gcc/ulong \ + gcc/ushort \ + gcc/wchar_t \ diff --git a/tests/auto/corelib/thread/qatomicinteger/qlonglong/qlonglong.pro b/tests/auto/corelib/thread/qatomicinteger/qlonglong/qlonglong.pro index 51ef1add8f..1e97d5cbae 100644 --- a/tests/auto/corelib/thread/qatomicinteger/qlonglong/qlonglong.pro +++ b/tests/auto/corelib/thread/qatomicinteger/qlonglong/qlonglong.pro @@ -1,2 +1 @@ -TYPE = $$basename(PWD) include(../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/qptrdiff/qptrdiff.pro b/tests/auto/corelib/thread/qatomicinteger/qptrdiff/qptrdiff.pro index 51ef1add8f..1e97d5cbae 100644 --- a/tests/auto/corelib/thread/qatomicinteger/qptrdiff/qptrdiff.pro +++ b/tests/auto/corelib/thread/qatomicinteger/qptrdiff/qptrdiff.pro @@ -1,2 +1 @@ -TYPE = $$basename(PWD) include(../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/quintptr/quintptr.pro b/tests/auto/corelib/thread/qatomicinteger/quintptr/quintptr.pro index 51ef1add8f..1e97d5cbae 100644 --- a/tests/auto/corelib/thread/qatomicinteger/quintptr/quintptr.pro +++ b/tests/auto/corelib/thread/qatomicinteger/quintptr/quintptr.pro @@ -1,2 +1 @@ -TYPE = $$basename(PWD) include(../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/qulonglong/qulonglong.pro b/tests/auto/corelib/thread/qatomicinteger/qulonglong/qulonglong.pro index 51ef1add8f..1e97d5cbae 100644 --- a/tests/auto/corelib/thread/qatomicinteger/qulonglong/qulonglong.pro +++ b/tests/auto/corelib/thread/qatomicinteger/qulonglong/qulonglong.pro @@ -1,2 +1 @@ -TYPE = $$basename(PWD) include(../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/schar/schar.pro b/tests/auto/corelib/thread/qatomicinteger/schar/schar.pro index 51ef1add8f..1e97d5cbae 100644 --- a/tests/auto/corelib/thread/qatomicinteger/schar/schar.pro +++ b/tests/auto/corelib/thread/qatomicinteger/schar/schar.pro @@ -1,2 +1 @@ -TYPE = $$basename(PWD) include(../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/short/short.pro b/tests/auto/corelib/thread/qatomicinteger/short/short.pro index 51ef1add8f..1e97d5cbae 100644 --- a/tests/auto/corelib/thread/qatomicinteger/short/short.pro +++ b/tests/auto/corelib/thread/qatomicinteger/short/short.pro @@ -1,2 +1 @@ -TYPE = $$basename(PWD) include(../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/tst_qatomicinteger.cpp b/tests/auto/corelib/thread/qatomicinteger/tst_qatomicinteger.cpp index cb01237b85..d3c85c54a7 100644 --- a/tests/auto/corelib/thread/qatomicinteger/tst_qatomicinteger.cpp +++ b/tests/auto/corelib/thread/qatomicinteger/tst_qatomicinteger.cpp @@ -31,6 +31,30 @@ ** ****************************************************************************/ +#ifdef QT_ATOMIC_FORCE_CXX11 +// We need to check if this compiler has C++11 atomics and constexpr support. +// We can't rely on qcompilerdetection.h because it forces all of qglobal.h to +// be included, which causes qbasicatomic.h to be included too. +// Incomplete, but ok +# if defined(__INTEL_COMPILER) && __INTEL_COMPILER >= 1500 && (__cplusplus >= 201103L || defined(__INTEL_CXX11_MODE__)) +# elif defined(__clang__) && (__cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)) +# if !__has_feature(cxx_constexpr) || !__has_feature(cxx_atomic) || !__has_include(<atomic>) +# undef QT_ATOMIC_FORCE_CXX11 +# endif +# elif defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && (__cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)) +# elif defined(_MSC_VER) && _MSC_VER >= 1900 + // We need MSVC 2015 because of: atomics (2012), constexpr (2015), and unrestricted unions (2015). + // Support for constexpr is not working completely on MSVC 2015 but it's enough for the test. +# else +# undef QT_ATOMIC_FORCE_CXX11 +# endif + +# ifndef QT_ATOMIC_FORCE_CXX11 +# undef QATOMIC_TEST_TYPE +# define QATOMIC_TEST_TYPE unsupported +# endif +#endif + #include <QtTest> #include <QAtomicInt> diff --git a/tests/auto/corelib/thread/qatomicinteger/uchar/uchar.pro b/tests/auto/corelib/thread/qatomicinteger/uchar/uchar.pro index 51ef1add8f..1e97d5cbae 100644 --- a/tests/auto/corelib/thread/qatomicinteger/uchar/uchar.pro +++ b/tests/auto/corelib/thread/qatomicinteger/uchar/uchar.pro @@ -1,2 +1 @@ -TYPE = $$basename(PWD) include(../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/uint/uint.pro b/tests/auto/corelib/thread/qatomicinteger/uint/uint.pro index 51ef1add8f..1e97d5cbae 100644 --- a/tests/auto/corelib/thread/qatomicinteger/uint/uint.pro +++ b/tests/auto/corelib/thread/qatomicinteger/uint/uint.pro @@ -1,2 +1 @@ -TYPE = $$basename(PWD) include(../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/ulong/ulong.pro b/tests/auto/corelib/thread/qatomicinteger/ulong/ulong.pro index 51ef1add8f..1e97d5cbae 100644 --- a/tests/auto/corelib/thread/qatomicinteger/ulong/ulong.pro +++ b/tests/auto/corelib/thread/qatomicinteger/ulong/ulong.pro @@ -1,2 +1 @@ -TYPE = $$basename(PWD) include(../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/ushort/ushort.pro b/tests/auto/corelib/thread/qatomicinteger/ushort/ushort.pro index 51ef1add8f..1e97d5cbae 100644 --- a/tests/auto/corelib/thread/qatomicinteger/ushort/ushort.pro +++ b/tests/auto/corelib/thread/qatomicinteger/ushort/ushort.pro @@ -1,2 +1 @@ -TYPE = $$basename(PWD) include(../qatomicinteger.pri) diff --git a/tests/auto/corelib/thread/qatomicinteger/wchar_t/wchar_t.pro b/tests/auto/corelib/thread/qatomicinteger/wchar_t/wchar_t.pro index 51ef1add8f..1e97d5cbae 100644 --- a/tests/auto/corelib/thread/qatomicinteger/wchar_t/wchar_t.pro +++ b/tests/auto/corelib/thread/qatomicinteger/wchar_t/wchar_t.pro @@ -1,2 +1 @@ -TYPE = $$basename(PWD) include(../qatomicinteger.pri) diff --git a/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp b/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp index c6806086d3..446e56e936 100644 --- a/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp +++ b/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp @@ -142,6 +142,9 @@ private slots: void isDaylightTime() const; void daylightTransitions() const; void timeZones() const; +#if defined(Q_OS_UNIX) + void systemTimeZoneChange() const; +#endif void invalid() const; @@ -2984,6 +2987,56 @@ void tst_QDateTime::timeZones() const QCOMPARE(future.offsetFromUtc(), 28800); } +#if defined(Q_OS_UNIX) +// Currently disabled on Windows as adjusting the timezone +// requires additional privileges that aren't normally +// enabled for a process. This can be achieved by calling +// AdjustTokenPrivileges() and then SetTimeZoneInformation(), +// which will require linking to a different library to access that API. +static void setTimeZone(const QByteArray &tz) +{ + qputenv("TZ", tz); + ::tzset(); + +// following left for future reference, see comment above +// #if defined(Q_OS_WIN32) +// ::_tzset(); +// #endif +} + +void tst_QDateTime::systemTimeZoneChange() const +{ + struct ResetTZ { + QByteArray original; + ResetTZ() : original(qgetenv("TZ")) {} + ~ResetTZ() { setTimeZone(original); } + } scopedReset; + + // Set the timezone to Brisbane time + setTimeZone(QByteArray("AEST-10:00")); + + QDateTime localDate = QDateTime(QDate(2012, 6, 1), QTime(2, 15, 30), Qt::LocalTime); + QDateTime utcDate = QDateTime(QDate(2012, 6, 1), QTime(2, 15, 30), Qt::UTC); + QDateTime tzDate = QDateTime(QDate(2012, 6, 1), QTime(2, 15, 30), QTimeZone("Australia/Brisbane")); + qint64 localMsecs = localDate.toMSecsSinceEpoch(); + qint64 utcMsecs = utcDate.toMSecsSinceEpoch(); + qint64 tzMsecs = tzDate.toMSecsSinceEpoch(); + + // check that Australia/Brisbane is known + QVERIFY(tzDate.timeZone().isValid()); + + // Change to Indian time + setTimeZone(QByteArray("IST-05:30")); + + QCOMPARE(localDate, QDateTime(QDate(2012, 6, 1), QTime(2, 15, 30), Qt::LocalTime)); + QVERIFY(localMsecs != localDate.toMSecsSinceEpoch()); + QCOMPARE(utcDate, QDateTime(QDate(2012, 6, 1), QTime(2, 15, 30), Qt::UTC)); + QCOMPARE(utcDate.toMSecsSinceEpoch(), utcMsecs); + QCOMPARE(tzDate, QDateTime(QDate(2012, 6, 1), QTime(2, 15, 30), QTimeZone("Australia/Brisbane"))); + QCOMPARE(tzDate.toMSecsSinceEpoch(), tzMsecs); +} +#endif + void tst_QDateTime::invalid() const { QDateTime invalidDate = QDateTime(QDate(0, 0, 0), QTime(-1, -1, -1)); diff --git a/tests/auto/corelib/tools/qstring/tst_qstring.cpp b/tests/auto/corelib/tools/qstring/tst_qstring.cpp index 52c3e65a24..8cd9610542 100644 --- a/tests/auto/corelib/tools/qstring/tst_qstring.cpp +++ b/tests/auto/corelib/tools/qstring/tst_qstring.cpp @@ -2040,6 +2040,9 @@ void tst_QString::simplified() QFETCH(QString, full); QFETCH(QString, simple); + QString orig_full = full; + orig_full.data(); // forces a detach + QString result = full.simplified(); if (simple.isNull()) { QVERIFY2(result.isNull(), qPrintable("'" + full + "' did not yield null: " + result)); @@ -2048,6 +2051,12 @@ void tst_QString::simplified() } else { QCOMPARE(result, simple); } + QCOMPARE(full, orig_full); + + // without detaching: + QString copy1 = full; + QCOMPARE(qMove(full).simplified(), simple); + QCOMPARE(full, orig_full); // force a detach if (!full.isEmpty()) diff --git a/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp b/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp index ed93ff24b0..2c38e4c111 100644 --- a/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp +++ b/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp @@ -35,6 +35,52 @@ #include <QtCore/qmath.h> #include <QtGui/qquaternion.h> +// This is a more tolerant version of qFuzzyCompare that also handles the case +// where one or more of the values being compare are close to zero +static inline bool myFuzzyCompare(float p1, float p2) +{ + if (qFuzzyIsNull(p1) && qFuzzyIsNull(p2)) + return true; + return qAbs(qAbs(p1) - qAbs(p2)) <= 0.00003f; +} + +static inline bool myFuzzyCompare(const QVector3D &v1, const QVector3D &v2) +{ + return myFuzzyCompare(v1.x(), v2.x()) + && myFuzzyCompare(v1.y(), v2.y()) + && myFuzzyCompare(v1.z(), v2.z()); +} + +static inline bool myFuzzyCompare(const QQuaternion &q1, const QQuaternion &q2) +{ + const float d = QQuaternion::dotProduct(q1, q2); + return myFuzzyCompare(d * d, 1.0f); +} + +static inline bool myFuzzyCompareRadians(float p1, float p2) +{ + static const float fPI = float(M_PI); + if (p1 < -fPI) + p1 += 2.0f * fPI; + else if (p1 > fPI) + p1 -= 2.0f * fPI; + + if (p2 < -fPI) + p2 += 2.0f * fPI; + else if (p2 > fPI) + p2 -= 2.0f * fPI; + + return qAbs(qAbs(p1) - qAbs(p2)) <= qDegreesToRadians(0.05f); +} + +static inline bool myFuzzyCompareDegrees(float p1, float p2) +{ + p1 = qDegreesToRadians(p1); + p2 = qDegreesToRadians(p2); + return myFuzzyCompareRadians(p1, p2); +} + + class tst_QQuaternion : public QObject { Q_OBJECT @@ -45,6 +91,9 @@ public: private slots: void create(); + void dotProduct_data(); + void dotProduct(); + void length_data(); void length(); @@ -86,6 +135,12 @@ private slots: void fromRotationMatrix_data(); void fromRotationMatrix(); + void fromAxes_data(); + void fromAxes(); + + void rotationTo_data(); + void rotationTo(); + void fromEulerAngles_data(); void fromEulerAngles(); @@ -219,6 +274,58 @@ void tst_QQuaternion::create() QCOMPARE(v10.w(), 34.0f); } +// Test the computation of dot product. +void tst_QQuaternion::dotProduct_data() +{ + QTest::addColumn<float>("x1"); + QTest::addColumn<float>("y1"); + QTest::addColumn<float>("z1"); + QTest::addColumn<float>("scalar1"); + QTest::addColumn<float>("x2"); + QTest::addColumn<float>("y2"); + QTest::addColumn<float>("z2"); + QTest::addColumn<float>("scalar2"); + QTest::addColumn<float>("dot"); + + QTest::newRow("null") + << 0.0f << 0.0f << 0.0f << 0.0f + << 0.0f << 0.0f << 0.0f << 0.0f + << 0.0f; + + QTest::newRow("identity") + << 0.0f << 0.0f << 0.0f << 1.0f + << 0.0f << 0.0f << 0.0f << 1.0f + << 1.0f; + + QTest::newRow("unitvec") + << 1.0f << 0.0f << 0.0f << 0.0f + << 0.0f << 1.0f << 0.0f << 0.0f + << 0.0f; + + QTest::newRow("complex") + << 1.0f << 2.0f << 3.0f << 4.0f + << 4.0f << 5.0f << 6.0f << 7.0f + << 60.0f; +} +void tst_QQuaternion::dotProduct() +{ + QFETCH(float, x1); + QFETCH(float, y1); + QFETCH(float, z1); + QFETCH(float, scalar1); + QFETCH(float, x2); + QFETCH(float, y2); + QFETCH(float, z2); + QFETCH(float, scalar2); + QFETCH(float, dot); + + QQuaternion q1(scalar1, x1, y1, z1); + QQuaternion q2(scalar2, x2, y2, z2); + + QCOMPARE(QQuaternion::dotProduct(q1, q2), dot); + QCOMPARE(QQuaternion::dotProduct(q2, q1), dot); +} + // Test length computation for quaternions. void tst_QQuaternion::length_data() { @@ -771,40 +878,115 @@ void tst_QQuaternion::fromRotationMatrix() QVERIFY(qFuzzyCompare(answer, result) || qFuzzyCompare(-answer, result)); } -// This is a more tolerant version of qFuzzyCompare that also handles the case -// where one or more of the values being compare are close to zero -static inline bool myFuzzyCompare(float p1, float p2) +// Test quaternion convertion to and from orthonormal axes. +void tst_QQuaternion::fromAxes_data() { - if (qFuzzyIsNull(p1)) - return qFuzzyIsNull(p2); - if (qFuzzyIsNull(p2)) - return false; - // a very slightly looser version of qFuzzyCompare - // for use with values that are not very close to zero - return qAbs(p1 - p2) <= 0.00003f * qMin(qAbs(p1), qAbs(p2)); -} + QTest::addColumn<float>("x1"); + QTest::addColumn<float>("y1"); + QTest::addColumn<float>("z1"); + QTest::addColumn<float>("angle"); + QTest::addColumn<QVector3D>("xAxis"); + QTest::addColumn<QVector3D>("yAxis"); + QTest::addColumn<QVector3D>("zAxis"); -static inline bool myFuzzyCompareRadians(float p1, float p2) + QTest::newRow("null") + << 0.0f << 0.0f << 0.0f << 0.0f + << QVector3D(1, 0, 0) << QVector3D(0, 1, 0) << QVector3D(0, 0, 1); + + QTest::newRow("xonly") + << 1.0f << 0.0f << 0.0f << 90.0f + << QVector3D(1, 0, 0) << QVector3D(0, 0, 1) << QVector3D(0, -1, 0); + + QTest::newRow("yonly") + << 0.0f << 1.0f << 0.0f << 180.0f + << QVector3D(-1, 0, 0) << QVector3D(0, 1, 0) << QVector3D(0, 0, -1); + + QTest::newRow("zonly") + << 0.0f << 0.0f << 1.0f << 270.0f + << QVector3D(0, -1, 0) << QVector3D(1, 0, 0) << QVector3D(0, 0, 1); + + QTest::newRow("complex") + << 1.0f << 2.0f << -3.0f << 45.0f + << QVector3D(0.728028, -0.525105, -0.440727) << QVector3D(0.608789, 0.790791, 0.0634566) << QVector3D(0.315202, -0.314508, 0.895395); +} +void tst_QQuaternion::fromAxes() { - static const float fPI = float(M_PI); - if (p1 < -fPI) - p1 += 2.0f * fPI; - else if (p1 > fPI) - p1 -= 2.0f * fPI; + QFETCH(float, x1); + QFETCH(float, y1); + QFETCH(float, z1); + QFETCH(float, angle); + QFETCH(QVector3D, xAxis); + QFETCH(QVector3D, yAxis); + QFETCH(QVector3D, zAxis); - if (p2 < -fPI) - p2 += 2.0f * fPI; - else if (p2 > fPI) - p2 -= 2.0f * fPI; + QQuaternion result = QQuaternion::fromAxisAndAngle(QVector3D(x1, y1, z1), angle); - return qAbs(qAbs(p1) - qAbs(p2)) <= qDegreesToRadians(0.05f); + QVector3D axes[3]; + result.getAxes(&axes[0], &axes[1], &axes[2]); + QVERIFY(myFuzzyCompare(axes[0], xAxis)); + QVERIFY(myFuzzyCompare(axes[1], yAxis)); + QVERIFY(myFuzzyCompare(axes[2], zAxis)); + + QQuaternion answer = QQuaternion::fromAxes(axes[0], axes[1], axes[2]); + + QVERIFY(qFuzzyCompare(answer, result) || qFuzzyCompare(-answer, result)); } -static inline bool myFuzzyCompareDegrees(float p1, float p2) +// Test shortest arc quaternion. +void tst_QQuaternion::rotationTo_data() { - p1 = qDegreesToRadians(p1); - p2 = qDegreesToRadians(p2); - return myFuzzyCompareRadians(p1, p2); + QTest::addColumn<QVector3D>("from"); + QTest::addColumn<QVector3D>("to"); + + // same + QTest::newRow("+X -> +X") << QVector3D(10.0f, 0.0f, 0.0f) << QVector3D(10.0f, 0.0f, 0.0f); + QTest::newRow("-X -> -X") << QVector3D(-10.0f, 0.0f, 0.0f) << QVector3D(-10.0f, 0.0f, 0.0f); + QTest::newRow("+Y -> +Y") << QVector3D(0.0f, 10.0f, 0.0f) << QVector3D(0.0f, 10.0f, 0.0f); + QTest::newRow("-Y -> -Y") << QVector3D(0.0f, -10.0f, 0.0f) << QVector3D(0.0f, -10.0f, 0.0f); + QTest::newRow("+Z -> +Z") << QVector3D(0.0f, 0.0f, 10.0f) << QVector3D(0.0f, 0.0f, 10.0f); + QTest::newRow("-Z -> -Z") << QVector3D(0.0f, 0.0f, -10.0f) << QVector3D(0.0f, 0.0f, -10.0f); + QTest::newRow("+X+Y+Z -> +X+Y+Z") << QVector3D(10.0f, 10.0f, 10.0f) << QVector3D(10.0f, 10.0f, 10.0f); + QTest::newRow("-X-Y-Z -> -X-Y-Z") << QVector3D(-10.0f, -10.0f, -10.0f) << QVector3D(-10.0f, -10.0f, -10.0f); + + // arbitrary + QTest::newRow("+Z -> +X") << QVector3D(0.0f, 0.0f, 10.0f) << QVector3D(10.0f, 0.0f, 0.0f); + QTest::newRow("+Z -> -X") << QVector3D(0.0f, 0.0f, 10.0f) << QVector3D(-10.0f, 0.0f, 0.0f); + QTest::newRow("+Z -> +Y") << QVector3D(0.0f, 0.0f, 10.0f) << QVector3D(0.0f, 10.0f, 0.0f); + QTest::newRow("+Z -> -Y") << QVector3D(0.0f, 0.0f, 10.0f) << QVector3D(0.0f, -10.0f, 0.0f); + QTest::newRow("-Z -> +X") << QVector3D(0.0f, 0.0f, -10.0f) << QVector3D(10.0f, 0.0f, 0.0f); + QTest::newRow("-Z -> -X") << QVector3D(0.0f, 0.0f, -10.0f) << QVector3D(-10.0f, 0.0f, 0.0f); + QTest::newRow("-Z -> +Y") << QVector3D(0.0f, 0.0f, -10.0f) << QVector3D(0.0f, 10.0f, 0.0f); + QTest::newRow("-Z -> -Y") << QVector3D(0.0f, 0.0f, -10.0f) << QVector3D(0.0f, -10.0f, 0.0f); + QTest::newRow("+X -> +Y") << QVector3D(10.0f, 0.0f, 0.0f) << QVector3D(0.0f, 10.0f, 0.0f); + QTest::newRow("+X -> -Y") << QVector3D(10.0f, 0.0f, 0.0f) << QVector3D(0.0f, -10.0f, 0.0f); + QTest::newRow("-X -> +Y") << QVector3D(-10.0f, 0.0f, 0.0f) << QVector3D(0.0f, 10.0f, 0.0f); + QTest::newRow("-X -> -Y") << QVector3D(-10.0f, 0.0f, 0.0f) << QVector3D(0.0f, -10.0f, 0.0f); + QTest::newRow("+X+Y+Z -> +X-Y-Z") << QVector3D(10.0f, 10.0f, 10.0f) << QVector3D(10.0f, -10.0f, -10.0f); + QTest::newRow("-X-Y+Z -> -X+Y-Z") << QVector3D(-10.0f, -10.0f, 10.0f) << QVector3D(-10.0f, 10.0f, -10.0f); + QTest::newRow("+X+Y+Z -> +Z") << QVector3D(10.0f, 10.0f, 10.0f) << QVector3D(0.0f, 0.0f, 10.0f); + + // collinear + QTest::newRow("+X -> -X") << QVector3D(10.0f, 0.0f, 0.0f) << QVector3D(-10.0f, 0.0f, 0.0f); + QTest::newRow("+Y -> -Y") << QVector3D(0.0f, 10.0f, 0.0f) << QVector3D(0.0f, -10.0f, 0.0f); + QTest::newRow("+Z -> -Z") << QVector3D(0.0f, 0.0f, 10.0f) << QVector3D(0.0f, 0.0f, -10.0f); + QTest::newRow("+X+Y+Z -> -X-Y-Z") << QVector3D(10.0f, 10.0f, 10.0f) << QVector3D(-10.0f, -10.0f, -10.0f); +} +void tst_QQuaternion::rotationTo() +{ + QFETCH(QVector3D, from); + QFETCH(QVector3D, to); + + QQuaternion q1 = QQuaternion::rotationTo(from, to); + QVERIFY(myFuzzyCompare(q1, q1.normalized())); + QVector3D vec1(q1 * from); + vec1 *= (to.length() / from.length()); // discard rotated length + QVERIFY(myFuzzyCompare(vec1, to)); + + QQuaternion q2 = QQuaternion::rotationTo(to, from); + QVERIFY(myFuzzyCompare(q2, q2.normalized())); + QVector3D vec2(q2 * to); + vec2 *= (from.length() / to.length()); // discard rotated length + QVERIFY(myFuzzyCompare(vec2, from)); } // Test quaternion creation from an axis and an angle. diff --git a/tests/auto/network/kernel/qhostaddress/tst_qhostaddress.cpp b/tests/auto/network/kernel/qhostaddress/tst_qhostaddress.cpp index 49a030aaaa..ef24cbf3c8 100644 --- a/tests/auto/network/kernel/qhostaddress/tst_qhostaddress.cpp +++ b/tests/auto/network/kernel/qhostaddress/tst_qhostaddress.cpp @@ -83,6 +83,8 @@ private slots: void isInSubnet(); void isLoopback_data(); void isLoopback(); + void convertv4v6_data(); + void convertv4v6(); }; QT_BEGIN_NAMESPACE @@ -313,6 +315,10 @@ void tst_QHostAddress::compare_data() QTest::newRow("5") << QHostAddress(QHostAddress::LocalHost) << QHostAddress(QHostAddress::Broadcast) << false; QTest::newRow("6") << QHostAddress(QHostAddress::LocalHost) << QHostAddress(QHostAddress::LocalHostIPv6) << false; QTest::newRow("7") << QHostAddress() << QHostAddress(QHostAddress::LocalHostIPv6) << false; + + Q_IPV6ADDR localhostv4mapped = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 127, 0, 0, 1 }; + QTest::newRow("v4-v4mapped") << QHostAddress(QHostAddress::LocalHost) << QHostAddress("::ffff:127.0.0.1") << false; + QTest::newRow("v4-v4mapped-2") << QHostAddress(QHostAddress::LocalHost) << QHostAddress(localhostv4mapped) << false; } void tst_QHostAddress::compare() @@ -322,6 +328,7 @@ void tst_QHostAddress::compare() QFETCH(bool, result); QCOMPARE(first == second, result); + QCOMPARE(second == first, result); if (result == true) QVERIFY(qHash(first) == qHash(second)); } @@ -657,5 +664,51 @@ void tst_QHostAddress::isLoopback() QCOMPARE(address.isLoopback(), result); } +void tst_QHostAddress::convertv4v6_data() +{ + QTest::addColumn<QHostAddress>("source"); + QTest::addColumn<int>("protocol"); + QTest::addColumn<QHostAddress>("result"); + + QTest::newRow("any-to-v4") << QHostAddress(QHostAddress::Any) << 4 << QHostAddress(QHostAddress::AnyIPv4); + QTest::newRow("any-to-v6") << QHostAddress(QHostAddress::Any) << 6 << QHostAddress(QHostAddress::AnyIPv6); + QTest::newRow("anyv4-to-v6") << QHostAddress(QHostAddress::AnyIPv4) << 6 << QHostAddress(QHostAddress::AnyIPv6); + QTest::newRow("anyv6-to-v4") << QHostAddress(QHostAddress::AnyIPv6) << 4 << QHostAddress(QHostAddress::AnyIPv4); + + QTest::newRow("v4mapped-to-v4") << QHostAddress("::ffff:192.0.2.1") << 4 << QHostAddress("192.0.2.1"); + QTest::newRow("v4-to-v4mapped") << QHostAddress("192.0.2.1") << 6 << QHostAddress("::ffff:192.0.2.1"); + + // we won't convert 127.0.0.1 to ::1 or vice-versa: + // you can connect to a v4 server socket with ::ffff:127.0.0.1, but not with ::1 + QTest::newRow("localhost-to-v4mapped") << QHostAddress(QHostAddress::LocalHost) << 6 << QHostAddress("::ffff:127.0.0.1"); + QTest::newRow("v4mapped-to-localhost") << QHostAddress("::ffff:127.0.0.1") << 4 << QHostAddress(QHostAddress::LocalHost); + + // in turn, that means localhost6 doesn't convert to v4 + QTest::newRow("localhost6-to-v4") << QHostAddress(QHostAddress::LocalHostIPv6) << 4 << QHostAddress(); + + // some other v6 addresses that won't convert to v4 + QTest::newRow("v4compat-to-v4") << QHostAddress("::192.0.2.1") << 4 << QHostAddress(); + QTest::newRow("localhostv4compat-to-v4") << QHostAddress("::127.0.0.1") << 4 << QHostAddress(); + QTest::newRow("v6global-to-v4") << QHostAddress("2001:db8::1") << 4 << QHostAddress(); + QTest::newRow("v6multicast-to-v4") << QHostAddress("ff02::1") << 4 << QHostAddress(); +} + +void tst_QHostAddress::convertv4v6() +{ + QFETCH(QHostAddress, source); + QFETCH(int, protocol); + QFETCH(QHostAddress, result); + + if (protocol == 4) { + bool ok; + quint32 v4 = source.toIPv4Address(&ok); + QCOMPARE(ok, result.protocol() == QAbstractSocket::IPv4Protocol); + if (ok) + QCOMPARE(QHostAddress(v4), result); + } else if (protocol == 6) { + QCOMPARE(QHostAddress(source.toIPv6Address()), result); + } +} + QTEST_MAIN(tst_QHostAddress) #include "tst_qhostaddress.moc" diff --git a/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp b/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp index 13d8a21794..109e48ed74 100644 --- a/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp +++ b/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp @@ -73,6 +73,7 @@ // RVCT compiles also unused inline methods # include <QNetworkProxy> +#include <time.h> #ifdef Q_OS_LINUX #include <stdio.h> #include <stdlib.h> @@ -123,6 +124,8 @@ private slots: void constructing(); void bind_data(); void bind(); + void bindThenResolveHost_data(); + void bindThenResolveHost(); void setInvalidSocketDescriptor(); #ifndef Q_OS_WINRT void setSocketDescriptor(); @@ -246,6 +249,9 @@ private: int earlyBytesWrittenCount; int earlyReadyReadCount; QString stressTestDir; + + QString firstFailName; + QHostInfo firstFailInfo; }; enum ProxyTests { @@ -298,7 +304,10 @@ public: }; tst_QTcpSocket::tst_QTcpSocket() + : firstFailName("qt-test-server-first-fail") { + qsrand(time(NULL)); + tmpSocket = 0; //This code relates to the socketsConstructedBeforeEventLoop test case @@ -309,6 +318,8 @@ tst_QTcpSocket::tst_QTcpSocket() connect(earlyConstructedSockets->endPoints[0], SIGNAL(readyRead()), this, SLOT(earlySocketReadyRead())); connect(earlyConstructedSockets->endPoints[1], SIGNAL(bytesWritten(qint64)), this, SLOT(earlySocketBytesSent(qint64))); earlyConstructedSockets->endPoints[1]->write("hello work"); + + firstFailInfo.setAddresses(QList<QHostAddress>() << QHostAddress("224.0.0.0") << QtNetworkSettings::serverIP()); } tst_QTcpSocket::~tst_QTcpSocket() @@ -390,6 +401,7 @@ void tst_QTcpSocket::init() } qt_qhostinfo_clear_cache(); + qt_qhostinfo_cache_inject(firstFailName, firstFailInfo); } QTcpSocket *tst_QTcpSocket::newSocket() const @@ -487,9 +499,12 @@ void tst_QTcpSocket::constructing() void tst_QTcpSocket::bind_data() { QTest::addColumn<QString>("stringAddr"); + QTest::addColumn<int>("port"); QTest::addColumn<bool>("successExpected"); QTest::addColumn<QString>("stringExpectedLocalAddress"); + bool testIpv6 = false; + // iterate all interfaces, add all addresses on them as test data QList<QNetworkInterface> interfaces = QNetworkInterface::allInterfaces(); foreach (const QNetworkInterface &netinterface, interfaces) { @@ -502,10 +517,26 @@ void tst_QTcpSocket::bind_data() continue; // link-local bind will fail, at least on Linux, so skip it. QString ip(entry.ip().toString()); - QTest::newRow(ip.toLatin1().constData()) << ip << true << ip; + QTest::newRow(ip.toLatin1().constData()) << ip << 0 << true << ip; + + if (!testIpv6 && entry.ip().protocol() == QAbstractSocket::IPv6Protocol) + testIpv6 = true; } } + // test binding to localhost + QTest::newRow("0.0.0.0") << "0.0.0.0" << 0 << true << "0.0.0.0"; + if (testIpv6) + QTest::newRow("[::]") << "::" << 0 << true << "::"; + + // and binding with a port number... + // Since we want to test that we got the port number we asked for, we need a random port number. + // We use random in case a previous run of the test left the port lingering open. + // -1 indicates "random port" + QTest::newRow("0.0.0.0:randomport") << "0.0.0.0" << -1 << true << "0.0.0.0"; + if (testIpv6) + QTest::newRow("[::]:randomport") << "::" << -1 << true << "::"; + // additionally, try bind to known-bad addresses, and make sure this doesn't work // these ranges are guaranteed to be reserved for 'documentation purposes', // and thus, should be unused in the real world. Not that I'm assuming the @@ -514,8 +545,16 @@ void tst_QTcpSocket::bind_data() knownBad << "198.51.100.1"; knownBad << "2001:0DB8::1"; foreach (const QString &badAddress, knownBad) { - QTest::newRow(badAddress.toLatin1().constData()) << badAddress << false << QString(); + QTest::newRow(badAddress.toLatin1().constData()) << badAddress << 0 << false << QString(); } + +#ifdef Q_OS_UNIX + // try to bind to a privileged ports + // we should fail if we're not root (unless the ports are in use!) + QTest::newRow("127.0.0.1:1") << "127.0.0.1" << 1 << !geteuid() << (geteuid() ? QString() : "127.0.0.1"); + if (testIpv6) + QTest::newRow("[::]:1") << "::" << 1 << !geteuid() << (geteuid() ? QString() : "::"); +#endif } void tst_QTcpSocket::bind() @@ -524,23 +563,124 @@ void tst_QTcpSocket::bind() if (setProxy) return; // QTBUG-22964 for proxies, QTBUG-29972 for QSKIP QFETCH(QString, stringAddr); + QFETCH(int, port); QFETCH(bool, successExpected); QFETCH(QString, stringExpectedLocalAddress); QHostAddress addr(stringAddr); QHostAddress expectedLocalAddress(stringExpectedLocalAddress); + QTcpSocket dummySocket; // used only to "use up" a file descriptor + dummySocket.bind(); + QTcpSocket *socket = newSocket(); - qDebug() << "Binding " << addr; + quint16 boundPort; + qintptr fd; if (successExpected) { - QVERIFY2(socket->bind(addr), qPrintable(socket->errorString())); + bool randomPort = port == -1; + int attemptsLeft = 5; // only used with randomPort + do { + if (randomPort) { + // try to get a random port number + // we do this to ensure we're not trying to bind to the same port as we've just used in + // a previous run - race condition with the OS actually freeing the port + Q_STATIC_ASSERT(RAND_MAX > 1024); + port = qrand() & USHRT_MAX; + if (port < 1024) + continue; + } + + bool bindSuccess = socket->bind(addr, port); + if (!bindSuccess && randomPort && socket->error() == QTcpSocket::AddressInUseError) { + // we may have been unlucky and hit an already open port, so try another + --attemptsLeft; + continue; + } + + QVERIFY2(bindSuccess, qPrintable(socket->errorString() + ", tried port " + QString::number(port))); + break; + } while (randomPort && attemptsLeft); + + QCOMPARE(socket->state(), QAbstractSocket::BoundState); + boundPort = socket->localPort(); + if (port) + QCOMPARE(int(boundPort), port); + fd = socket->socketDescriptor(); + QVERIFY(fd != INVALID_SOCKET); } else { - QVERIFY(!socket->bind(addr)); + QVERIFY(!socket->bind(addr, port)); + QCOMPARE(socket->localPort(), quint16(0)); } QCOMPARE(socket->localAddress(), expectedLocalAddress); + if (successExpected) { + // try to use the socket and expect it to remain working + QTcpServer server; + QVERIFY(server.listen(addr)); + + // free up the file descriptor + dummySocket.close(); + + QHostAddress remoteAddr = addr; + if (addr == QHostAddress::AnyIPv4) + remoteAddr = QHostAddress::LocalHost; + else if (addr == QHostAddress::AnyIPv6) + remoteAddr = QHostAddress::LocalHostIPv6; + + socket->connectToHost(remoteAddr, server.serverPort()); + QVERIFY2(socket->waitForConnected(2000), socket->errorString().toLocal8Bit()); + QVERIFY(server.waitForNewConnection(2000)); + + QTcpSocket *acceptedSocket = server.nextPendingConnection(); + QCOMPARE(socket->localPort(), boundPort); + QCOMPARE(acceptedSocket->peerPort(), boundPort); + QCOMPARE(socket->localAddress(), remoteAddr); + QCOMPARE(socket->socketDescriptor(), fd); + } + + delete socket; +} + +//---------------------------------------------------------------------------------- + +void tst_QTcpSocket::bindThenResolveHost_data() +{ + QTest::addColumn<QString>("hostName"); + QTest::newRow("ip-literal") << QtNetworkSettings::serverIP().toString(); + QTest::newRow("name") << QtNetworkSettings::serverName(); + QTest::newRow("first-fail") << firstFailName; +} + +// similar to the previous test, but we'll connect to a host name that needs resolving +void tst_QTcpSocket::bindThenResolveHost() +{ + QFETCH_GLOBAL(bool, setProxy); + if (setProxy) + return; // doesn't make sense to test binding locally with proxies + + QFETCH(QString, hostName); + + QTcpSocket dummySocket; // used only to "use up" a file descriptor + dummySocket.bind(); + + QTcpSocket *socket = newSocket(); + + QVERIFY2(socket->bind(QHostAddress(QHostAddress::AnyIPv4), 0), socket->errorString().toLocal8Bit()); + QCOMPARE(socket->state(), QAbstractSocket::BoundState); + quint16 boundPort = socket->localPort(); + qintptr fd = socket->socketDescriptor(); + QVERIFY(fd != INVALID_SOCKET); + + dummySocket.close(); + + socket->connectToHost(hostName, 80); + QVERIFY2(socket->waitForConnected(), "Network timeout"); + + QCOMPARE(socket->localPort(), boundPort); + QCOMPARE(socket->socketDescriptor(), fd); + delete socket; } @@ -593,13 +733,10 @@ void tst_QTcpSocket::setSocketDescriptor() QCOMPARE(socket->socketDescriptor(), (qintptr)sock); qt_qhostinfo_clear_cache(); //avoid the HostLookupState being skipped due to address being in cache from previous test. - socket->connectToHost(QtNetworkSettings::serverName(), 143); + socket->connectToHost(QtNetworkSettings::serverName(), 80); QCOMPARE(socket->state(), QTcpSocket::HostLookupState); QCOMPARE(socket->socketDescriptor(), (qintptr)sock); QVERIFY(socket->waitForConnected(10000)); - // skip this, it has been broken for years, see task 260735 - // if somebody complains, consider fixing it, but it might break existing applications. - QEXPECT_FAIL("", "bug has been around for years, will not fix without need", Continue); QCOMPARE(socket->socketDescriptor(), (qintptr)sock); delete socket; #ifdef Q_OS_WIN @@ -616,8 +753,8 @@ void tst_QTcpSocket::socketDescriptor() QCOMPARE(socket->socketDescriptor(), (qintptr)-1); socket->connectToHost(QtNetworkSettings::serverName(), 143); - QVERIFY((socket->state() == QAbstractSocket::HostLookupState && socket->socketDescriptor() == -1) || - (socket->state() == QAbstractSocket::ConnectingState && socket->socketDescriptor() != -1)); + QVERIFY(socket->state() == QAbstractSocket::HostLookupState || + socket->state() == QAbstractSocket::ConnectingState); QVERIFY(socket->waitForConnected(10000)); QVERIFY(socket->state() == QAbstractSocket::ConnectedState); QVERIFY(socket->socketDescriptor() != -1); diff --git a/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp b/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp index 76d4543da9..4bd330b04f 100644 --- a/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp +++ b/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp @@ -85,7 +85,8 @@ private slots: void dualStack(); void dualStackAutoBinding(); void dualStackNoIPv4onV6only(); - void readLine(); + void connectToHost(); + void bindAndConnectToHost(); void pendingDatagramSize(); void writeDatagram(); void performance(); @@ -621,7 +622,7 @@ void tst_QUdpSocket::empty_connectedSlot() //---------------------------------------------------------------------------------- -void tst_QUdpSocket::readLine() +void tst_QUdpSocket::connectToHost() { QUdpSocket socket1; QUdpSocket socket2; @@ -629,10 +630,41 @@ void tst_QUdpSocket::readLine() socket1.setProperty("_q_networksession", QVariant::fromValue(networkSession)); socket2.setProperty("_q_networksession", QVariant::fromValue(networkSession)); #endif + + QVERIFY2(socket1.bind(), socket1.errorString().toLatin1().constData()); + + socket2.connectToHost(makeNonAny(socket1.localAddress()), socket1.localPort()); + QVERIFY(socket2.waitForConnected(5000)); +} + +//---------------------------------------------------------------------------------- + +void tst_QUdpSocket::bindAndConnectToHost() +{ + QUdpSocket socket1; + QUdpSocket socket2; + QUdpSocket dummysocket; +#ifdef FORCE_SESSION + socket1.setProperty("_q_networksession", QVariant::fromValue(networkSession)); + socket2.setProperty("_q_networksession", QVariant::fromValue(networkSession)); + dummysocket.setProperty("_q_networksession", QVariant::fromValue(networkSession)); +#endif + + // we use the dummy socket to use up a file descriptor + dummysocket.bind(); + + QVERIFY2(socket2.bind(), socket2.errorString().toLatin1()); + quint16 boundPort = socket2.localPort(); + qintptr fd = socket2.socketDescriptor(); + QVERIFY2(socket1.bind(), socket1.errorString().toLatin1().constData()); + dummysocket.close(); socket2.connectToHost(makeNonAny(socket1.localAddress()), socket1.localPort()); QVERIFY(socket2.waitForConnected(5000)); + + QCOMPARE(socket2.localPort(), boundPort); + QCOMPARE(socket2.socketDescriptor(), fd); } //---------------------------------------------------------------------------------- diff --git a/tests/manual/dialogs/printdialogpanel.cpp b/tests/manual/dialogs/printdialogpanel.cpp index d7291b016d..202a291e5f 100644 --- a/tests/manual/dialogs/printdialogpanel.cpp +++ b/tests/manual/dialogs/printdialogpanel.cpp @@ -50,6 +50,7 @@ #include <QGridLayout> #include <QFormLayout> #include <QVBoxLayout> +#include <QMessageBox> #include <QDoubleSpinBox> #include <QPainter> #include <QFont> @@ -258,9 +259,27 @@ static void drawVertCmRuler(QPainter &painter, int x, int y1, int y2) } } -static void print(QPrinter *printer) +static bool print(QPrinter *printer, QString *errorMessage) { - QPainter painter(printer); + QPainter painter; + + if (!printer->isValid()) { + *errorMessage = QLatin1String("Invalid printer."); + return false; + } + + if (printer->printerState() != QPrinter::Idle) { + *errorMessage = QLatin1String("Printer not idle (state ") + + QString::number(printer->printerState()) + + QLatin1String(")."); + return false; + } + + if (!painter.begin(printer)) { + *errorMessage = QLatin1String("QPainter::begin() failed."); + return false; + } + const QRectF pageF = printer->pageRect(); QFont font = painter.font(); @@ -280,8 +299,8 @@ static void print(QPrinter *printer) << *printer; if (!painter.device()->logicalDpiY() || !painter.device()->logicalDpiX()) { - qWarning() << Q_FUNC_INFO << "Bailing out due to invalid DPI: " << msg; - return; + *errorMessage = QLatin1String("Bailing out due to invalid DPI."); + return false; } painter.drawRect(pageF); @@ -296,7 +315,21 @@ static void print(QPrinter *printer) textPoint.ry() += (15 * charHeight) / 10; } - painter.end(); + if (!painter.end()) { + *errorMessage = QLatin1String("QPainter::end() failed."); + return false; + } + + return true; +} + +static bool print(QPrinter *printer, QWidget *dialogParent) +{ + QString errorMessage; + const bool result = print(printer, &errorMessage); + if (!result) + QMessageBox::warning(dialogParent, QLatin1String("Printing Failed"), errorMessage); + return result; } class PrintPreviewDialog : public QPrintPreviewDialog { @@ -308,7 +341,7 @@ public: } public slots: - void slotPaintRequested(QPrinter *p) { print(p); } + void slotPaintRequested(QPrinter *p) { print(p, this); } }; PrintDialogPanel::PrintDialogPanel(QWidget *parent) @@ -669,7 +702,7 @@ void PrintDialogPanel::showPrintDialog() dialog.setOptions(m_panel.m_dialogOptionsGroupBox->value<QPrintDialog::PrintDialogOptions>()); if (dialog.exec() == QDialog::Accepted) { retrieveSettings(m_printer.data()); - print(m_printer.data()); + print(m_printer.data(), this); } } @@ -693,7 +726,7 @@ void PrintDialogPanel::showPageSetupDialog() void PrintDialogPanel::directPrint() { applySettings(m_printer.data()); - print(m_printer.data()); + print(m_printer.data(), this); retrieveSettings(m_printer.data()); } |