summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorFrederik Gladhorn <frederik.gladhorn@theqtcompany.com>2015-03-09 09:23:55 +0000
committerThe Qt Project <gerrit-noreply@qt-project.org>2015-03-09 11:19:22 +0000
commit4dc459837b42cbfff9a8e0325dc3319cc87e02ac (patch)
treefa1ebc0a089b3d52c656610fae6a1425f0d0852f /tests
parentd815de8c26ccee33713e37a0fec2982755dcfe1f (diff)
parent6cef72d0b4f6cd676203688a2562f0a9a620c7fb (diff)
Merge "Merge remote-tracking branch 'origin/5.5' into dev" into refs/staging/dev
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp13
-rw-r--r--tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp4
-rw-r--r--tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp13
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/char/char.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/char16_t/char16_t.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/char32_t/char32_t.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/cxx11/char/char.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/cxx11/char16_t/char16_t.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/cxx11/char32_t/char32_t.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/cxx11/int/int.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/cxx11/long/long.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/cxx11/qlonglong/qlonglong.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/cxx11/qptrdiff/qptrdiff.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/cxx11/quintptr/quintptr.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/cxx11/qulonglong/qulonglong.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/cxx11/schar/schar.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/cxx11/short/short.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/cxx11/uchar/uchar.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/cxx11/uint/uint.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/cxx11/ulong/ulong.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/cxx11/ushort/ushort.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/cxx11/wchar_t/wchar_t.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/gcc/char/char.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/gcc/char16_t/char16_t.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/gcc/char32_t/char32_t.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/gcc/int/int.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/gcc/long/long.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/gcc/qlonglong/qlonglong.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/gcc/qptrdiff/qptrdiff.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/gcc/quintptr/quintptr.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/gcc/qulonglong/qulonglong.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/gcc/schar/schar.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/gcc/short/short.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/gcc/uchar/uchar.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/gcc/uint/uint.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/gcc/ulong/ulong.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/gcc/ushort/ushort.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/gcc/wchar_t/wchar_t.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/int/int.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/long/long.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/qatomicinteger.pri19
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/qatomicinteger.pro39
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/qlonglong/qlonglong.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/qptrdiff/qptrdiff.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/quintptr/quintptr.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/qulonglong/qulonglong.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/schar/schar.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/short/short.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/tst_qatomicinteger.cpp24
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/uchar/uchar.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/uint/uint.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/ulong/ulong.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/ushort/ushort.pro1
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/wchar_t/wchar_t.pro1
-rw-r--r--tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp53
-rw-r--r--tests/auto/corelib/tools/qstring/tst_qstring.cpp9
-rw-r--r--tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp234
-rw-r--r--tests/auto/network/kernel/qhostaddress/tst_qhostaddress.cpp53
-rw-r--r--tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp159
-rw-r--r--tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp36
-rw-r--r--tests/manual/dialogs/printdialogpanel.cpp49
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());
}