summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/auto.pro2
-rw-r--r--tests/auto/corelib/animation/qpauseanimation/BLACKLIST2
-rw-r--r--tests/auto/corelib/animation/qpropertyanimation/BLACKLIST2
-rw-r--r--tests/auto/corelib/animation/qpropertyanimation/qpropertyanimation.pro2
-rw-r--r--tests/auto/corelib/animation/qpropertyanimation/tst_qpropertyanimation.cpp235
-rw-r--r--tests/auto/corelib/global/qfloat16/tst_qfloat16.cpp2
-rwxr-xr-x[-rw-r--r--]tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp26
-rw-r--r--tests/auto/corelib/io/qloggingregistry/tst_qloggingregistry.cpp6
-rw-r--r--tests/auto/corelib/kernel/qobject/tst_qobject.cpp11
-rw-r--r--tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp32
-rw-r--r--tests/auto/corelib/tools/qdatetime/BLACKLIST3
-rw-r--r--tests/auto/network/socket/qudpsocket/BLACKLIST5
-rw-r--r--tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp20
-rw-r--r--tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp12
-rw-r--r--tests/auto/widgets/effects/qgraphicseffect/tst_qgraphicseffect.cpp21
-rw-r--r--tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp24
-rw-r--r--tests/auto/widgets/widgets/qsplitter/BLACKLIST2
17 files changed, 318 insertions, 89 deletions
diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro
index a1ffe5b3ce..fbd89e4045 100644
--- a/tests/auto/auto.pro
+++ b/tests/auto/auto.pro
@@ -35,7 +35,7 @@ else:!qtConfig(process): SUBDIRS -= tools
# Disable the QtDBus tests if we can't connect to the session bus
!cross_compile:qtHaveModule(dbus) {
- !system("dbus-send --session --type=signal / local.AutotestCheck.Hello >/dev/null 2>&1") {
+ !system("dbus-send --session --type=signal / local.AutotestCheck.Hello >$$QMAKE_SYSTEM_NULL_DEVICE 2>&1") {
qtConfig(dbus-linked): \
error("QtDBus is enabled but session bus is not available. Please check the installation.")
else: \
diff --git a/tests/auto/corelib/animation/qpauseanimation/BLACKLIST b/tests/auto/corelib/animation/qpauseanimation/BLACKLIST
index 8fc1b07502..a49ed2a617 100644
--- a/tests/auto/corelib/animation/qpauseanimation/BLACKLIST
+++ b/tests/auto/corelib/animation/qpauseanimation/BLACKLIST
@@ -4,3 +4,5 @@ osx-10.9
*
[multipleSequentialGroups]
osx
+[noTimerUpdates]
+osx
diff --git a/tests/auto/corelib/animation/qpropertyanimation/BLACKLIST b/tests/auto/corelib/animation/qpropertyanimation/BLACKLIST
index a7e95b1e97..a8719b241a 100644
--- a/tests/auto/corelib/animation/qpropertyanimation/BLACKLIST
+++ b/tests/auto/corelib/animation/qpropertyanimation/BLACKLIST
@@ -2,3 +2,5 @@
windows
[startBackwardWithoutEndValue]
windows
+[startWithoutStartValue]
+osx
diff --git a/tests/auto/corelib/animation/qpropertyanimation/qpropertyanimation.pro b/tests/auto/corelib/animation/qpropertyanimation/qpropertyanimation.pro
index bfeb183abf..72a36876b7 100644
--- a/tests/auto/corelib/animation/qpropertyanimation/qpropertyanimation.pro
+++ b/tests/auto/corelib/animation/qpropertyanimation/qpropertyanimation.pro
@@ -1,4 +1,4 @@
CONFIG += testcase
TARGET = tst_qpropertyanimation
-QT = core gui widgets testlib
+QT = core gui widgets testlib core-private
SOURCES = tst_qpropertyanimation.cpp
diff --git a/tests/auto/corelib/animation/qpropertyanimation/tst_qpropertyanimation.cpp b/tests/auto/corelib/animation/qpropertyanimation/tst_qpropertyanimation.cpp
index cf4c4e1bdb..41a051a719 100644
--- a/tests/auto/corelib/animation/qpropertyanimation/tst_qpropertyanimation.cpp
+++ b/tests/auto/corelib/animation/qpropertyanimation/tst_qpropertyanimation.cpp
@@ -29,6 +29,7 @@
#include <QtTest/QtTest>
#include <QtCore/qpropertyanimation.h>
#include <QtCore/qvariantanimation.h>
+#include <private/qabstractanimation_p.h>
#include <QtGui/qtouchdevice.h>
#include <QtWidgets/qwidget.h>
@@ -74,6 +75,80 @@ public:
MyObject o;
};
+class TestAnimationDriver : public QAnimationDriver
+{
+public:
+ TestAnimationDriver()
+ : QAnimationDriver()
+ , m_elapsed(0)
+ {
+ QUnifiedTimer::instance()->installAnimationDriver(this);
+ }
+
+ ~TestAnimationDriver()
+ {
+ // This is to ensure that running animations are removed from the list of actual running
+ // animations.
+ QCoreApplication::sendPostedEvents();
+ QUnifiedTimer::instance()->uninstallAnimationDriver(this);
+ }
+
+ void wait(qint64 ms)
+ {
+ /*
+ * When QAbstractAnimation::start() is called it will end up calling
+ * QAnimationTimer::registerAnimation(). This will do
+ *
+ * QMetaObject::invokeMethod(inst, "startAnimations", Qt::QueuedConnection); // typeof(inst) == QAnimationTimer
+ *
+ * startAnimations() will again fire a queued connection to actually add the animation
+ * to the list of running animations:
+ *
+ * QMetaObject::invokeMethod(inst, "startTimers", Qt::QueuedConnection); // typeof(inst) == QUnifiedTimer
+ *
+ * We therefore have to call QCoreApplication::sendPostedEvents() twice here.
+ */
+ QCoreApplication::sendPostedEvents();
+ QCoreApplication::sendPostedEvents();
+
+ // Simulates the ideal animation update freqency (approx. 60Hz)
+ static const int interval = 1000/60;
+ qint64 until = m_elapsed + ms;
+ while (m_elapsed < until) {
+ advanceAnimation(m_elapsed);
+ m_elapsed += interval;
+ }
+ advanceAnimation(m_elapsed);
+ // This is to make sure that animations that were started with DeleteWhenStopped
+ // will actually delete themselves within the test function.
+ // Normally, they won't be deleted until the main event loop is processed.
+ // Therefore, have to explicitly say that we want to process DeferredDelete events. Same
+ // trick is used by QTest::qWait().
+ QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete);
+ }
+
+ qint64 elapsed() const override
+ {
+ return m_elapsed;
+ }
+
+ void start() override
+ {
+ d_func()->running = true;
+ m_elapsed = 0;
+ emit started();
+ }
+
+ void stop() override
+ {
+ d_func()->running = false;
+ emit stopped();
+ }
+
+private:
+ qint64 m_elapsed;
+ Q_DECLARE_PRIVATE(QAnimationDriver)
+};
class tst_QPropertyAnimation : public QObject
{
@@ -261,40 +336,44 @@ void tst_QPropertyAnimation::statesAndSignals()
QCOMPARE(currentLoopSpy.count(), 2);
runningSpy.clear();
- anim->start();
- QTest::qWait(1000);
- QTRY_COMPARE(anim->state(), QAnimationGroup::Stopped);
- QCOMPARE(runningSpy.count(), 2); //started and stopped again
- runningSpy.clear();
- QCOMPARE(finishedSpy.count(), 1);
- QCOMPARE(anim->currentLoopTime(), 100);
- QCOMPARE(anim->currentLoop(), 2);
- QCOMPARE(currentLoopSpy.count(), 4);
-
- anim->start(); // auto-rewinds
- QCOMPARE(anim->state(), QAnimationGroup::Running);
- QCOMPARE(anim->currentTime(), 0);
- QCOMPARE(anim->currentLoop(), 0);
- QCOMPARE(currentLoopSpy.count(), 5);
- QCOMPARE(runningSpy.count(), 1); // anim has started
- QCOMPARE(finishedSpy.count(), 1);
- QCOMPARE(anim->currentLoop(), 0);
- runningSpy.clear();
-
- QTest::qWait(1000);
-
- QCOMPARE(currentLoopSpy.count(), 7);
- QCOMPARE(anim->state(), QAnimationGroup::Stopped);
- QCOMPARE(anim->currentLoop(), 2);
- QCOMPARE(runningSpy.count(), 1); // anim has stopped
- QCOMPARE(finishedSpy.count(), 2);
- QCOMPARE(anim->currentLoopTime(), 100);
-
- delete anim;
+ {
+ TestAnimationDriver timeDriver;
+ anim->start();
+ timeDriver.wait(1000);
+ QCOMPARE(anim->state(), QAnimationGroup::Stopped);
+ QCOMPARE(runningSpy.count(), 2); //started and stopped again
+ runningSpy.clear();
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(anim->currentLoopTime(), 100);
+ QCOMPARE(anim->currentLoop(), 2);
+ QCOMPARE(currentLoopSpy.count(), 4);
+
+ anim->start(); // auto-rewinds
+ QCOMPARE(anim->state(), QAnimationGroup::Running);
+ QCOMPARE(anim->currentTime(), 0);
+ QCOMPARE(anim->currentLoop(), 0);
+ QCOMPARE(currentLoopSpy.count(), 5);
+ QCOMPARE(runningSpy.count(), 1); // anim has started
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(anim->currentLoop(), 0);
+ runningSpy.clear();
+
+ timeDriver.wait(1000);
+
+ QCOMPARE(currentLoopSpy.count(), 7);
+ QCOMPARE(anim->state(), QAnimationGroup::Stopped);
+ QCOMPARE(anim->currentLoop(), 2);
+ QCOMPARE(runningSpy.count(), 1); // anim has stopped
+ QCOMPARE(finishedSpy.count(), 2);
+ QCOMPARE(anim->currentLoopTime(), 100);
+
+ delete anim;
+ }
}
void tst_QPropertyAnimation::deletion1()
{
+ TestAnimationDriver timeDriver;
QObject *object = new QWidget;
QPointer<QPropertyAnimation> anim = new QPropertyAnimation(object, "minimumWidth");
@@ -312,23 +391,23 @@ void tst_QPropertyAnimation::deletion1()
QVERIFY(anim);
QCOMPARE(anim->state(), QAnimationGroup::Running);
- QTest::qWait(100);
+ timeDriver.wait(100);
QVERIFY(anim);
QCOMPARE(anim->state(), QAnimationGroup::Running);
- QTest::qWait(150);
+ timeDriver.wait(150);
QVERIFY(anim); //The animation should not have been deleted
- QTRY_COMPARE(anim->state(), QAnimationGroup::Stopped);
+ QCOMPARE(anim->state(), QAnimationGroup::Stopped);
QCOMPARE(runningSpy.count(), 2);
QCOMPARE(finishedSpy.count(), 1);
anim->start(QVariantAnimation::DeleteWhenStopped);
QVERIFY(anim);
QCOMPARE(anim->state(), QAnimationGroup::Running);
- QTest::qWait(100);
+ timeDriver.wait(100);
QVERIFY(anim);
QCOMPARE(anim->state(), QAnimationGroup::Running);
- QTest::qWait(150);
- QTRY_COMPARE(runningSpy.count(), 4);
+ timeDriver.wait(150);
+ QCOMPARE(runningSpy.count(), 4);
QCOMPARE(finishedSpy.count(), 2);
QVERIFY(!anim); //The animation must have been deleted
delete object;
@@ -336,6 +415,7 @@ void tst_QPropertyAnimation::deletion1()
void tst_QPropertyAnimation::deletion2()
{
+ TestAnimationDriver timeDriver;
//test that the animation get deleted if the object is deleted
QObject *object = new QWidget;
QPointer<QPropertyAnimation> anim = new QPropertyAnimation(object,"minimumWidth");
@@ -354,7 +434,7 @@ void tst_QPropertyAnimation::deletion2()
anim->setDuration(200);
anim->start();
- QTest::qWait(50);
+ timeDriver.wait(50);
QVERIFY(anim);
QCOMPARE(anim->state(), QAnimationGroup::Running);
@@ -363,7 +443,7 @@ void tst_QPropertyAnimation::deletion2()
//we can't call deletaLater directly because the delete would only happen in the next loop of _this_ event loop
QTimer::singleShot(0, object, SLOT(deleteLater()));
- QTest::qWait(50);
+ timeDriver.wait(50);
QVERIFY(!anim->targetObject());
}
@@ -371,6 +451,7 @@ void tst_QPropertyAnimation::deletion2()
void tst_QPropertyAnimation::deletion3()
{
//test that the stopped signal is emit when the animation is destroyed
+ TestAnimationDriver timeDriver;
QObject *object = new QWidget;
QPropertyAnimation *anim = new QPropertyAnimation(object,"minimumWidth");
anim->setStartValue(10);
@@ -385,7 +466,7 @@ void tst_QPropertyAnimation::deletion3()
anim->start();
- QTest::qWait(50);
+ timeDriver.wait(50);
QCOMPARE(anim->state(), QAnimationGroup::Running);
QCOMPARE(runningSpy.count(), 1);
QCOMPARE(finishedSpy.count(), 0);
@@ -432,6 +513,7 @@ public:
void tst_QPropertyAnimation::noStartValue()
{
+ TestAnimationDriver timeDriver;
StartValueTester o;
o.setProperty("ole", 42);
o.values.clear();
@@ -441,7 +523,8 @@ void tst_QPropertyAnimation::noStartValue()
a.setDuration(250);
a.start();
- QTRY_COMPARE(o.values.value(o.values.size() - 1, -1), 420);
+ timeDriver.wait(a.duration());
+ QCOMPARE(o.values.value(o.values.size() - 1, -1), 420);
QCOMPARE(o.values.first(), 42);
}
@@ -471,6 +554,7 @@ void tst_QPropertyAnimation::startWhenAnotherIsRunning()
StartValueTester o;
o.setProperty("ole", 42);
o.values.clear();
+ TestAnimationDriver timeDriver;
{
//normal case: the animation finishes and is deleted
@@ -479,18 +563,17 @@ void tst_QPropertyAnimation::startWhenAnotherIsRunning()
QSignalSpy runningSpy(anim.data(), &QVariantAnimation::stateChanged);
QVERIFY(runningSpy.isValid());
anim->start(QVariantAnimation::DeleteWhenStopped);
- QTest::qWait(anim->duration() + 100);
- QTRY_COMPARE(runningSpy.count(), 2); //started and then stopped
+ timeDriver.wait(anim->duration());
+ QCOMPARE(runningSpy.count(), 2); //started and then stopped
QVERIFY(!anim);
}
-
{
QPointer<QVariantAnimation> anim = new QPropertyAnimation(&o, "ole");
anim->setEndValue(100);
QSignalSpy runningSpy(anim.data(), &QVariantAnimation::stateChanged);
QVERIFY(runningSpy.isValid());
anim->start(QVariantAnimation::DeleteWhenStopped);
- QTest::qWait(anim->duration()/2);
+ timeDriver.wait(anim->duration()/2);
QPointer<QVariantAnimation> anim2 = new QPropertyAnimation(&o, "ole");
anim2->setEndValue(100);
QCOMPARE(runningSpy.count(), 1);
@@ -498,11 +581,11 @@ void tst_QPropertyAnimation::startWhenAnotherIsRunning()
//anim2 will interrupt anim1
QMetaObject::invokeMethod(anim2, "start", Qt::QueuedConnection, Q_ARG(QAbstractAnimation::DeletionPolicy, QVariantAnimation::DeleteWhenStopped));
- QTest::qWait(50);
+ timeDriver.wait(50);
QVERIFY(!anim); //anim should have been deleted
QVERIFY(anim2);
- QTest::qWait(anim2->duration());
- QTRY_VERIFY(!anim2); //anim2 is finished: it should have been deleted by now
+ timeDriver.wait(anim2->duration());
+ QVERIFY(!anim2); //anim2 is finished: it should have been deleted by now
QVERIFY(!anim);
}
@@ -559,6 +642,7 @@ void tst_QPropertyAnimation::easingcurve()
void tst_QPropertyAnimation::startWithoutStartValue()
{
+ TestAnimationDriver timeDriver;
QObject o;
o.setProperty("ole", 42);
QCOMPARE(o.property("ole").toInt(), 42);
@@ -568,14 +652,14 @@ void tst_QPropertyAnimation::startWithoutStartValue()
anim.start();
- QTest::qWait(100);
+ timeDriver.wait(100);
int current = anim.currentValue().toInt();
//it is somewhere in the animation
QVERIFY(current > 42);
QVERIFY(current < 100);
- QTest::qWait(200);
- QTRY_COMPARE(anim.state(), QVariantAnimation::Stopped);
+ timeDriver.wait(200);
+ QCOMPARE(anim.state(), QVariantAnimation::Stopped);
current = anim.currentValue().toInt();
QCOMPARE(current, 100);
QCOMPARE(o.property("ole").toInt(), current);
@@ -586,7 +670,7 @@ void tst_QPropertyAnimation::startWithoutStartValue()
// the default start value will reevaluate the current property
// and set it to the end value of the last iteration
QCOMPARE(current, 100);
- QTest::qWait(100);
+ timeDriver.wait(100);
current = anim.currentValue().toInt();
//it is somewhere in the animation
QVERIFY(current >= 100);
@@ -595,6 +679,7 @@ void tst_QPropertyAnimation::startWithoutStartValue()
void tst_QPropertyAnimation::startBackwardWithoutEndValue()
{
+ TestAnimationDriver timeDriver;
QObject o;
o.setProperty("ole", 42);
QCOMPARE(o.property("ole").toInt(), 42);
@@ -608,14 +693,14 @@ void tst_QPropertyAnimation::startBackwardWithoutEndValue()
QCOMPARE(anim.state(), QAbstractAnimation::Running);
QCOMPARE(o.property("ole").toInt(), 42); //the initial value
- QTest::qWait(100);
+ timeDriver.wait(100);
int current = anim.currentValue().toInt();
//it is somewhere in the animation
QVERIFY(current > 42);
QVERIFY(current < 100);
- QTest::qWait(200);
- QTRY_COMPARE(anim.state(), QVariantAnimation::Stopped);
+ timeDriver.wait(200);
+ QCOMPARE(anim.state(), QVariantAnimation::Stopped);
current = anim.currentValue().toInt();
QCOMPARE(current, 100);
QCOMPARE(o.property("ole").toInt(), current);
@@ -626,7 +711,7 @@ void tst_QPropertyAnimation::startBackwardWithoutEndValue()
// the default start value will reevaluate the current property
// and set it to the end value of the last iteration
QCOMPARE(current, 100);
- QTest::qWait(100);
+ timeDriver.wait(100);
current = anim.currentValue().toInt();
//it is somewhere in the animation
QVERIFY(current >= 100);
@@ -636,6 +721,7 @@ void tst_QPropertyAnimation::startBackwardWithoutEndValue()
void tst_QPropertyAnimation::playForwardBackward()
{
+ TestAnimationDriver timeDriver;
QObject o;
o.setProperty("ole", 0);
QCOMPARE(o.property("ole").toInt(), 0);
@@ -644,16 +730,16 @@ void tst_QPropertyAnimation::playForwardBackward()
anim.setStartValue(0);
anim.setEndValue(100);
anim.start();
- QTest::qWait(anim.duration() + 100);
- QTRY_COMPARE(anim.state(), QAbstractAnimation::Stopped);
+ timeDriver.wait(anim.duration());
+ QCOMPARE(anim.state(), QAbstractAnimation::Stopped);
QCOMPARE(anim.currentTime(), anim.duration());
//the animation is at the end
anim.setDirection(QVariantAnimation::Backward);
anim.start();
QCOMPARE(anim.state(), QAbstractAnimation::Running);
- QTest::qWait(anim.duration() + 100);
- QTRY_COMPARE(anim.state(), QAbstractAnimation::Stopped);
+ timeDriver.wait(anim.duration());
+ QCOMPARE(anim.state(), QAbstractAnimation::Stopped);
QCOMPARE(anim.currentTime(), 0);
//the direction is backward
@@ -661,8 +747,8 @@ void tst_QPropertyAnimation::playForwardBackward()
anim.start();
QCOMPARE(anim.state(), QAbstractAnimation::Running);
QCOMPARE(anim.currentTime(), anim.duration());
- QTest::qWait(anim.duration() + 100);
- QTRY_COMPARE(anim.state(), QAbstractAnimation::Stopped);
+ timeDriver.wait(anim.duration());
+ QCOMPARE(anim.state(), QAbstractAnimation::Stopped);
QCOMPARE(anim.currentTime(), 0);
}
@@ -1106,21 +1192,21 @@ void tst_QPropertyAnimation::restart()
void tst_QPropertyAnimation::valueChanged()
{
-
+ TestAnimationDriver timeDriver;
//we check that we receive the valueChanged signal
MyErrorObject o;
o.setOle(0);
QCOMPARE(o.property("ole").toInt(), 0);
QPropertyAnimation anim(&o, "ole");
anim.setEndValue(5);
- anim.setDuration(1000);
+ anim.setDuration(200);
QSignalSpy spy(&anim, &QPropertyAnimation::valueChanged);
QVERIFY(spy.isValid());
anim.start();
+ // Drive animation forward to its end
+ timeDriver.wait(anim.duration());
- QTest::qWait(anim.duration() + 100);
-
- QTRY_COMPARE(anim.state(), QAbstractAnimation::Stopped);
+ QCOMPARE(anim.state(), QAbstractAnimation::Stopped);
QCOMPARE(anim.currentTime(), anim.duration());
//let's check that the values go forward
@@ -1153,6 +1239,7 @@ public:
void tst_QPropertyAnimation::twoAnimations()
{
+ TestAnimationDriver timeDriver;
MySyncObject o1, o2;
o1.setOle(0);
o2.setOle(0);
@@ -1169,8 +1256,8 @@ void tst_QPropertyAnimation::twoAnimations()
o1.anim.start();
o2.anim.start();
- QTest::qWait(o1.anim.duration() + 100);
- QTRY_COMPARE(o1.anim.state(), QAbstractAnimation::Stopped);
+ timeDriver.wait(o1.anim.duration());
+ QCOMPARE(o1.anim.state(), QAbstractAnimation::Stopped);
QCOMPARE(o2.anim.state(), QAbstractAnimation::Stopped);
QCOMPARE(o1.ole(), 1000);
@@ -1209,6 +1296,7 @@ public:
void tst_QPropertyAnimation::deletedInUpdateCurrentTime()
{
+ TestAnimationDriver timeDriver;
// this test case reproduces an animation being deleted in the updateCurrentTime of
// another animation(was causing segfault).
// the deleted animation must have been started after the animation that is deleting.
@@ -1219,9 +1307,9 @@ void tst_QPropertyAnimation::deletedInUpdateCurrentTime()
MyComposedAnimation composedAnimation(&o, "value", "realValue");
composedAnimation.start();
QCOMPARE(composedAnimation.state(), QAbstractAnimation::Running);
- QTest::qWait(composedAnimation.duration() + 100);
+ timeDriver.wait(composedAnimation.duration());
- QTRY_COMPARE(composedAnimation.state(), QAbstractAnimation::Stopped);
+ QCOMPARE(composedAnimation.state(), QAbstractAnimation::Stopped);
QCOMPARE(o.value(), 1000);
}
@@ -1293,6 +1381,7 @@ public:
void tst_QPropertyAnimation::recursiveAnimations()
{
+ TestAnimationDriver timeDriver;
RecursiveObject o;
QPropertyAnimation anim;
anim.setTargetObject(&o);
@@ -1301,9 +1390,9 @@ void tst_QPropertyAnimation::recursiveAnimations()
anim.setEndValue(4000);
anim.start();
- QTest::qWait(anim.duration() + o.animation.duration());
- QTRY_COMPARE(anim.state(), QAbstractAnimation::Stopped);
- QTRY_COMPARE(o.animation.state(), QAbstractAnimation::Stopped);
+ timeDriver.wait(anim.duration() + o.animation.duration());
+ QCOMPARE(anim.state(), QAbstractAnimation::Stopped);
+ QCOMPARE(o.animation.state(), QAbstractAnimation::Stopped);
QCOMPARE(o.y(), qreal(4000));
}
diff --git a/tests/auto/corelib/global/qfloat16/tst_qfloat16.cpp b/tests/auto/corelib/global/qfloat16/tst_qfloat16.cpp
index 9bd87e3f21..6b98e3a823 100644
--- a/tests/auto/corelib/global/qfloat16/tst_qfloat16.cpp
+++ b/tests/auto/corelib/global/qfloat16/tst_qfloat16.cpp
@@ -158,12 +158,14 @@ void tst_qfloat16::qNan()
qfloat16 nan = qQNaN();
QVERIFY(!(0. > nan));
QVERIFY(!(0. < nan));
+ QVERIFY(!qIsInf(nan));
QVERIFY(qIsNaN(nan));
QVERIFY(qIsNaN(nan + 1.f));
QVERIFY(qIsNaN(-nan));
qfloat16 inf = qInf();
QVERIFY(inf > qfloat16(0));
QVERIFY(-inf < qfloat16(0));
+ QVERIFY(!qIsNaN(inf));
QVERIFY(qIsInf(inf));
QVERIFY(qIsInf(-inf));
QVERIFY(qIsInf(2.f*inf));
diff --git a/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp b/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp
index 44e79985d4..02b70c317e 100644..100755
--- a/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp
+++ b/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp
@@ -64,6 +64,15 @@
#define Q_NO_SYMLINKS
#endif
+#if defined(Q_OS_WIN)
+QT_BEGIN_NAMESPACE
+extern Q_CORE_EXPORT int qt_ntfs_permission_lookup;
+QT_END_NAMESPACE
+# ifndef Q_OS_WINRT
+bool IsUserAdmin();
+# endif
+#endif
+
inline bool qIsLikelyToBeFat(const QString &path)
{
QByteArray name = QStorageInfo(path).fileSystemType().toLower();
@@ -1592,6 +1601,15 @@ void tst_QFileInfo::isWritable()
QVERIFY2(fi.exists(), msgDoesNotExist(fi.absoluteFilePath()).constData());
QVERIFY(!fi.isWritable());
#endif
+
+#if defined (Q_OS_WIN) && !defined(Q_OS_WINRT)
+ QScopedValueRollback<int> ntfsMode(qt_ntfs_permission_lookup);
+ qt_ntfs_permission_lookup = 1;
+ QFileInfo fi2(QFile::decodeName(qgetenv("SystemRoot") + "/system.ini"));
+ QVERIFY(fi2.exists());
+ QCOMPARE(fi2.isWritable(), IsUserAdmin());
+#endif
+
#if defined (Q_OS_QNX) // On QNX /etc is usually on a read-only filesystem
QVERIFY(!QFileInfo("/etc/passwd").isWritable());
#elif defined (Q_OS_UNIX) && !defined(Q_OS_VXWORKS) // VxWorks does not have users/groups
@@ -1765,7 +1783,7 @@ void tst_QFileInfo::detachingOperations()
}
#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
-BOOL IsUserAdmin()
+bool IsUserAdmin()
{
BOOL b;
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
@@ -1783,13 +1801,9 @@ BOOL IsUserAdmin()
FreeSid(AdministratorsGroup);
}
- return(b);
+ return b != FALSE;
}
-QT_BEGIN_NAMESPACE
-extern Q_CORE_EXPORT int qt_ntfs_permission_lookup;
-QT_END_NAMESPACE
-
#endif // Q_OS_WIN && !Q_OS_WINRT
#ifndef Q_OS_WINRT
diff --git a/tests/auto/corelib/io/qloggingregistry/tst_qloggingregistry.cpp b/tests/auto/corelib/io/qloggingregistry/tst_qloggingregistry.cpp
index 15c63d4acd..a74ea3a89e 100644
--- a/tests/auto/corelib/io/qloggingregistry/tst_qloggingregistry.cpp
+++ b/tests/auto/corelib/io/qloggingregistry/tst_qloggingregistry.cpp
@@ -212,7 +212,7 @@ private slots:
qunsetenv("QT_LOGGING_RULES");
qputenv("QT_LOGGING_CONF", QFINDTESTDATA("qtlogging.ini").toLocal8Bit());
- registry.initalizeRules();
+ registry.initializeRules();
QCOMPARE(registry.ruleSets[QLoggingRegistry::ApiRules].size(), 0);
QCOMPARE(registry.ruleSets[QLoggingRegistry::ConfigRules].size(), 0);
@@ -220,7 +220,7 @@ private slots:
// check that QT_LOGGING_RULES take precedence
qputenv("QT_LOGGING_RULES", "Digia.*=true");
- registry.initalizeRules();
+ registry.initializeRules();
QCOMPARE(registry.ruleSets[QLoggingRegistry::EnvironmentRules].size(), 2);
QCOMPARE(registry.ruleSets[QLoggingRegistry::EnvironmentRules].at(1).enabled, true);
}
@@ -246,7 +246,7 @@ private slots:
file.close();
QLoggingRegistry registry;
- registry.initalizeRules();
+ registry.initializeRules();
QCOMPARE(registry.ruleSets[QLoggingRegistry::ConfigRules].size(), 1);
// remove file again
diff --git a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
index 5ecdd92228..1f98f64340 100644
--- a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
+++ b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
@@ -151,6 +151,7 @@ private slots:
void deleteLaterInAboutToBlockHandler();
void mutableFunctor();
void checkArgumentsForNarrowing();
+ void nullReceiver();
};
struct QObjectCreatedOnShutdown
@@ -7422,6 +7423,16 @@ void tst_QObject::checkArgumentsForNarrowing()
#undef FITS
}
+void tst_QObject::nullReceiver()
+{
+ QObject o;
+ QObject *nullObj = nullptr; // Passing nullptr directly doesn't compile with gcc 4.8
+ QVERIFY(!connect(&o, &QObject::destroyed, nullObj, &QObject::deleteLater));
+ QVERIFY(!connect(&o, &QObject::destroyed, nullObj, [] {}));
+ QVERIFY(!connect(&o, &QObject::destroyed, nullObj, Functor_noexcept()));
+ QVERIFY(!connect(&o, SIGNAL(destroyed()), nullObj, SLOT(deleteLater())));
+}
+
// Test for QtPrivate::HasQ_OBJECT_Macro
Q_STATIC_ASSERT(QtPrivate::HasQ_OBJECT_Macro<tst_QObject>::Value);
Q_STATIC_ASSERT(!QtPrivate::HasQ_OBJECT_Macro<SiblingDeleter>::Value);
diff --git a/tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp b/tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp
index 8f0d83ce32..7ea467b6ef 100644
--- a/tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp
+++ b/tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp
@@ -101,6 +101,7 @@ Q_OBJECT
public:
SignalEmitter(QObject *parent = 0)
: QObject(parent) {}
+public Q_SLOTS:
void emitSignalWithNoArg()
{ emit signalWithNoArg(); }
void emitSignalWithIntArg(int arg)
@@ -251,6 +252,7 @@ private slots:
void qtbug_46059();
void qtbug_46703();
void postEventFromBeginSelectTransitions();
+ void dontProcessSlotsWhenMachineIsNotRunning();
};
class TestState : public QState
@@ -6658,5 +6660,35 @@ void tst_QStateMachine::postEventFromBeginSelectTransitions()
QVERIFY(machine.isRunning());
}
+void tst_QStateMachine::dontProcessSlotsWhenMachineIsNotRunning()
+{
+ QStateMachine machine;
+ QState initialState;
+ QFinalState finalState;
+
+ struct Emitter : SignalEmitter
+ {
+ QThread thread;
+ Emitter(QObject *parent = nullptr) : SignalEmitter(parent)
+ {
+ moveToThread(&thread);
+ thread.start();
+ }
+ } emitter;
+
+ initialState.addTransition(&emitter, &Emitter::signalWithNoArg, &finalState);
+ QTimer::singleShot(0, [&]() {
+ metaObject()->invokeMethod(&emitter, "emitSignalWithNoArg");
+ metaObject()->invokeMethod(&emitter, "emitSignalWithNoArg");
+ });
+ machine.addState(&initialState);
+ machine.addState(&finalState);
+ machine.setInitialState(&initialState);
+ machine.start();
+ connect(&machine, &QStateMachine::finished, &emitter.thread, &QThread::quit);
+ QSignalSpy signalSpy(&machine, &QStateMachine::finished);
+ QTRY_COMPARE_WITH_TIMEOUT(signalSpy.count(), 1, 100);
+}
+
QTEST_MAIN(tst_QStateMachine)
#include "tst_qstatemachine.moc"
diff --git a/tests/auto/corelib/tools/qdatetime/BLACKLIST b/tests/auto/corelib/tools/qdatetime/BLACKLIST
new file mode 100644
index 0000000000..e78f5cfd87
--- /dev/null
+++ b/tests/auto/corelib/tools/qdatetime/BLACKLIST
@@ -0,0 +1,3 @@
+[operator_eqeq]
+ubuntu-16.04
+b2qt
diff --git a/tests/auto/network/socket/qudpsocket/BLACKLIST b/tests/auto/network/socket/qudpsocket/BLACKLIST
index 5b8d4f1e34..d58a850a1f 100644
--- a/tests/auto/network/socket/qudpsocket/BLACKLIST
+++ b/tests/auto/network/socket/qudpsocket/BLACKLIST
@@ -18,7 +18,12 @@ osx
osx
[broadcasting]
osx
+ubuntu-16.04
[zeroLengthDatagram]
osx
[linkLocalIPv6]
redhatenterpriselinuxworkstation-6.6
+[pendingDatagramSize]
+ubuntu-16.04
+[readyReadForEmptyDatagram]
+ubuntu-16.04
diff --git a/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp b/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp
index 4e800dfd63..bbac03b708 100644
--- a/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp
+++ b/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp
@@ -55,6 +55,13 @@
#include <errno.h>
#endif
+#ifdef Q_OS_UNIX
+# include <sys/socket.h>
+#endif
+#if defined(Q_OS_LINUX) || defined(Q_OS_WIN) || defined(SO_NREAD)
+# define RELIABLE_BYTES_AVAILABLE
+#endif
+
Q_DECLARE_METATYPE(QHostAddress)
QT_FORWARD_DECLARE_CLASS(QUdpSocket)
@@ -1678,7 +1685,7 @@ void tst_QUdpSocket::linkLocalIPv4()
foreach (QNetworkAddressEntry addr, iface.addressEntries()) {
if (addr.ip().isInSubnet(localMask, 16)) {
addresses << addr.ip();
- qDebug() << addr.ip();
+ qDebug() << "Found IPv4 link local address" << addr.ip();
}
}
}
@@ -1703,7 +1710,6 @@ void tst_QUdpSocket::linkLocalIPv4()
QVERIFY(s->writeDatagram(testData, s->localAddress(), neutral.localPort()));
QVERIFY2(neutral.waitForReadyRead(10000), QtNetworkSettings::msgSocketError(neutral).constData());
- QVERIFY2(s->waitForReadyRead(10000), QtNetworkSettings::msgSocketError(*s).constData());
QNetworkDatagram dgram = neutral.receiveDatagram(testData.length() * 2);
QVERIFY(dgram.isValid());
QCOMPARE(dgram.senderAddress(), s->localAddress());
@@ -1726,7 +1732,7 @@ void tst_QUdpSocket::linkLocalIPv4()
}
QVERIFY(neutral.writeDatagram(dgram.makeReply(testData)));
-
+ QVERIFY2(s->waitForReadyRead(10000), QtNetworkSettings::msgSocketError(*s).constData());
dgram = s->receiveDatagram(testData.length() * 2);
QVERIFY(dgram.isValid());
QCOMPARE(dgram.data(), testData);
@@ -1764,7 +1770,9 @@ void tst_QUdpSocket::readyRead()
// make sure only one signal was emitted
QCOMPARE(spy.count(), 1);
QVERIFY(receiver.hasPendingDatagrams());
+#ifdef RELIABLE_BYTES_AVAILABLE
QCOMPARE(receiver.bytesAvailable(), qint64(2));
+#endif
QCOMPARE(receiver.pendingDatagramSize(), qint64(2));
// write another datagram
@@ -1786,7 +1794,9 @@ void tst_QUdpSocket::readyRead()
QTest::qWait(100);
QCOMPARE(spy.count(), 2);
QVERIFY(receiver.hasPendingDatagrams());
+#ifdef RELIABLE_BYTES_AVAILABLE
QCOMPARE(receiver.bytesAvailable(), qint64(3));
+#endif
QCOMPARE(receiver.pendingDatagramSize(), qint64(3));
}
@@ -1814,7 +1824,9 @@ void tst_QUdpSocket::readyReadForEmptyDatagram()
char buf[1];
QVERIFY(receiver.hasPendingDatagrams());
QCOMPARE(receiver.pendingDatagramSize(), qint64(0));
+#ifdef RELIABLE_BYTES_AVAILABLE
QCOMPARE(receiver.bytesAvailable(), qint64(0));
+#endif
QCOMPARE(receiver.readDatagram(buf, sizeof buf), qint64(0));
}
@@ -1823,7 +1835,9 @@ void tst_QUdpSocket::async_readDatagramSlot()
char buf[1];
QVERIFY(m_asyncReceiver->hasPendingDatagrams());
QCOMPARE(m_asyncReceiver->pendingDatagramSize(), qint64(1));
+#ifdef RELIABLE_BYTES_AVAILABLE
QCOMPARE(m_asyncReceiver->bytesAvailable(), qint64(1));
+#endif
QCOMPARE(m_asyncReceiver->readDatagram(buf, sizeof(buf)), qint64(1));
if (buf[0] == '2') {
diff --git a/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp b/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp
index 31df66e312..979d5c632e 100644
--- a/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp
+++ b/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp
@@ -239,13 +239,18 @@ void tst_QFileSystemModel::readOnly()
QCOMPARE(model->isReadOnly(), true);
QTemporaryFile file(flatDirTestPath + QStringLiteral("/XXXXXX.dat"));
QVERIFY2(file.open(), qPrintable(file.errorString()));
+ const QString fileName = file.fileName();
+ file.close();
+
+ const QFileInfo fileInfo(fileName);
+ QTRY_VERIFY(QDir(flatDirTestPath).entryInfoList().contains(fileInfo));
QModelIndex root = model->setRootPath(flatDirTestPath);
QTRY_VERIFY(model->rowCount(root) > 0);
- QVERIFY(!(model->flags(model->index(file.fileName())) & Qt::ItemIsEditable));
+ QVERIFY(!(model->flags(model->index(fileName)) & Qt::ItemIsEditable));
model->setReadOnly(false);
QCOMPARE(model->isReadOnly(), false);
- QVERIFY(model->flags(model->index(file.fileName())) & Qt::ItemIsEditable);
+ QVERIFY(model->flags(model->index(fileName)) & Qt::ItemIsEditable);
}
class CustomFileIconProvider : public QFileIconProvider
@@ -729,6 +734,9 @@ void tst_QFileSystemModel::sortPersistentIndex()
{
QTemporaryFile file(flatDirTestPath + QStringLiteral("/XXXXXX.dat"));
QVERIFY2(file.open(), qPrintable(file.errorString()));
+ const QFileInfo fileInfo(file.fileName());
+ file.close();
+ QTRY_VERIFY(QDir(flatDirTestPath).entryInfoList().contains(fileInfo));
QModelIndex root = model->setRootPath(flatDirTestPath);
QTRY_VERIFY(model->rowCount(root) > 0);
diff --git a/tests/auto/widgets/effects/qgraphicseffect/tst_qgraphicseffect.cpp b/tests/auto/widgets/effects/qgraphicseffect/tst_qgraphicseffect.cpp
index a1cb729849..dfe5baba71 100644
--- a/tests/auto/widgets/effects/qgraphicseffect/tst_qgraphicseffect.cpp
+++ b/tests/auto/widgets/effects/qgraphicseffect/tst_qgraphicseffect.cpp
@@ -52,6 +52,7 @@ private slots:
void boundingRect2();
void draw();
void opacity();
+ void nestedOpaqueOpacity();
void grayscale();
void colorize();
void drawPixmapItem();
@@ -407,6 +408,26 @@ void tst_QGraphicsEffect::opacity()
QCOMPARE(effect->m_opacity, qreal(0.5));
}
+void tst_QGraphicsEffect::nestedOpaqueOpacity()
+{
+ // QTBUG-60231: Nesting widgets with a QGraphicsEffect on a toplevel with
+ // QGraphicsOpacityEffect caused crashes due to constructing several
+ // QPainter instances on a device in the fast path for
+ // QGraphicsOpacityEffect::opacity=1
+ QWidget topLevel;
+ topLevel.setWindowTitle(QTest::currentTestFunction());
+ topLevel.resize(320, 200);
+ QGraphicsOpacityEffect *opacityEffect = new QGraphicsOpacityEffect;
+ opacityEffect->setOpacity(1);
+ topLevel.setGraphicsEffect(opacityEffect);
+ QWidget *child = new QWidget(&topLevel);
+ child->resize(topLevel.size() / 2);
+ QGraphicsDropShadowEffect *childEffect = new QGraphicsDropShadowEffect;
+ child->setGraphicsEffect(childEffect);
+ topLevel.show();
+ QVERIFY(QTest::qWaitForWindowExposed(&topLevel));
+}
+
void tst_QGraphicsEffect::grayscale()
{
if (qApp->desktop()->depth() < 24)
diff --git a/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp b/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp
index b2e1a2d9b5..4c6dd341b3 100644
--- a/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp
+++ b/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp
@@ -332,6 +332,17 @@ public:
endRemoveColumns();
}
+ void removeAddLastColumnLayoutChanged() // for taskQTBUG_41124
+ {
+ // make sure QHeaderView::_q_layoutChanged() is called
+ emit layoutAboutToBeChanged();
+ --cols;
+ emit layoutChanged();
+ emit layoutAboutToBeChanged();
+ ++cols;
+ emit layoutChanged();
+ }
+
void removeAllColumns()
{
beginRemoveColumns(QModelIndex(), 0, cols - 1);
@@ -1326,6 +1337,19 @@ void tst_QTreeView::columnHidden()
for (int c = 0; c < model.columnCount(); ++c)
QCOMPARE(view.isColumnHidden(c), true);
view.update();
+
+ // QTBUG_41124:
+ // QHeaderViewPrivate::_q_layoutChanged was not called because it was
+ // disconnected in QTreeView::setModel(). _q_layoutChanged restores
+ // the hidden sections which is tested here
+ view.setColumnHidden(model.cols - 1, true);
+ model.removeAddLastColumnLayoutChanged();
+ // we removed the last column and added a new one
+ // (with layoutToBeChanged/layoutChanged() for both) so column
+ // 1 is a new column and therefore must not be hidden when
+ // _q_layoutChanged() is called and is doing the right stuff
+ QCOMPARE(view.isColumnHidden(model.cols - 1), false);
+
}
void tst_QTreeView::rowHidden()
diff --git a/tests/auto/widgets/widgets/qsplitter/BLACKLIST b/tests/auto/widgets/widgets/qsplitter/BLACKLIST
new file mode 100644
index 0000000000..1352805cd7
--- /dev/null
+++ b/tests/auto/widgets/widgets/qsplitter/BLACKLIST
@@ -0,0 +1,2 @@
+[replaceWidget:visible, not collapsed]
+xcb