summaryrefslogtreecommitdiffstats
path: root/tests/auto
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto')
-rw-r--r--tests/auto/cmake/CMakeLists.txt2
-rw-r--r--tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp11
-rw-r--r--tests/auto/corelib/global/qflags/tst_qflags.cpp116
-rw-r--r--tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp3
-rw-r--r--tests/auto/corelib/io/qprocess/tst_qprocess.cpp34
-rw-r--r--tests/auto/corelib/json/tst_qtjson.cpp77
-rw-r--r--tests/auto/corelib/kernel/qobject/tst_qobject.cpp25
-rw-r--r--tests/auto/corelib/thread/qthreadpool/tst_qthreadpool.cpp53
-rw-r--r--tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp20
-rw-r--r--tests/auto/corelib/tools/qhash/tst_qhash.cpp22
-rw-r--r--tests/auto/corelib/tools/qlocale/tst_qlocale.cpp1
-rw-r--r--tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp8
-rw-r--r--tests/auto/opengl/qgl/tst_qgl.cpp4
-rw-r--r--tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp46
-rw-r--r--tests/auto/tools/moc/tst_moc.cpp10
-rw-r--r--tests/auto/widgets/dialogs/dialogs.pro2
-rw-r--r--tests/auto/widgets/dialogs/qprogressdialog/tst_qprogressdialog.cpp11
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp28
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp1
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicssceneindex/tst_qgraphicssceneindex.cpp2
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp47
-rw-r--r--tests/auto/widgets/itemviews/qitemdelegate/tst_qitemdelegate.cpp131
-rw-r--r--tests/auto/widgets/itemviews/qtableview/qtableview.pro1
-rw-r--r--tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp4
-rw-r--r--tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp12
-rw-r--r--tests/auto/widgets/widgets/qstackedwidget/qstackedwidget.pro1
26 files changed, 624 insertions, 48 deletions
diff --git a/tests/auto/cmake/CMakeLists.txt b/tests/auto/cmake/CMakeLists.txt
index 25f2ab6a87..0f794915ee 100644
--- a/tests/auto/cmake/CMakeLists.txt
+++ b/tests/auto/cmake/CMakeLists.txt
@@ -121,7 +121,7 @@ test_module_includes(
)
expect_pass(test_concurrent_module)
expect_pass(test_openglextensions_module)
-if (QT_WITH_ANGLE OR (NOT WIN32 AND NOT APPLE))
+if (QT_WITH_ANGLE OR (NOT WIN32 AND NOT APPLE AND NOT NO_EGL))
expect_pass(test_egl_lib)
endif()
expect_pass(test_opengl_lib)
diff --git a/tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp b/tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp
index b5f736cfbb..616fe33309 100644
--- a/tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp
+++ b/tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp
@@ -1917,6 +1917,17 @@ void tst_QTextCodec::codecForHtml_data()
html = "<!DOCTYPE html><html><head><meta charset=\" utf' 8 /><title>Test</title></head>";
QTest::newRow("invalid charset, early terminator (')") << html << noDefault << fallback;
+
+ const char src[] = { char(0xff), char(0xfe), char(0x7a), char(0x03), 0, 0 };
+ html = src;
+ QTest::newRow("greek text UTF-16LE") << html << 106 << 1014;
+
+ html = "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\"><span style=\"color: rgb(0, 0, 0); font-family: "
+ "'Galatia SIL'; font-size: 27px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; "
+ "line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: "
+ "auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; display: inline !important; float: "
+ "none;\">&#x37b</span>\000";
+ QTest::newRow("greek text UTF-8") << html << 106 << 106;
}
void tst_QTextCodec::codecForHtml()
diff --git a/tests/auto/corelib/global/qflags/tst_qflags.cpp b/tests/auto/corelib/global/qflags/tst_qflags.cpp
index b9b817d688..e50a6b63fe 100644
--- a/tests/auto/corelib/global/qflags/tst_qflags.cpp
+++ b/tests/auto/corelib/global/qflags/tst_qflags.cpp
@@ -49,6 +49,7 @@ private slots:
void testFlagMultiBits() const;
void constExpr();
void signedness();
+ void classEnum();
};
void tst_QFlags::testFlag() const
@@ -137,6 +138,121 @@ void tst_QFlags::signedness()
QtPrivate::is_signed<Qt::Alignment::Int>::value));
}
+#if defined(Q_COMPILER_CLASS_ENUM)
+enum class MyStrictEnum { StrictZero, StrictOne, StrictTwo, StrictFour=4 };
+Q_DECLARE_FLAGS( MyStrictFlags, MyStrictEnum )
+Q_DECLARE_OPERATORS_FOR_FLAGS( MyStrictFlags )
+
+Q_STATIC_ASSERT( !QTypeInfo<MyStrictFlags>::isComplex );
+Q_STATIC_ASSERT( !QTypeInfo<MyStrictFlags>::isStatic );
+Q_STATIC_ASSERT( !QTypeInfo<MyStrictFlags>::isLarge );
+Q_STATIC_ASSERT( !QTypeInfo<MyStrictFlags>::isPointer );
+#endif
+
+void tst_QFlags::classEnum()
+{
+#if defined(Q_COMPILER_CLASS_ENUM)
+ // The main aim of the test is making sure it compiles
+ // The QCOMPARE are there as an extra
+ MyStrictEnum e1 = MyStrictEnum::StrictOne;
+ MyStrictEnum e2 = MyStrictEnum::StrictTwo;
+
+ MyStrictFlags f1(MyStrictEnum::StrictOne);
+ QCOMPARE(f1, 1);
+
+ MyStrictFlags f2(e2);
+ QCOMPARE(f2, 2);
+
+ MyStrictFlags f0;
+ QCOMPARE(f0, 0);
+
+ MyStrictFlags f3(e2 | e1);
+ QCOMPARE(f3, 3);
+
+ QVERIFY(f3.testFlag(MyStrictEnum::StrictOne));
+ QVERIFY(!f1.testFlag(MyStrictEnum::StrictTwo));
+
+ QVERIFY(!f0);
+
+ QCOMPARE(f3 & int(1), 1);
+ QCOMPARE(f3 & uint(1), 1);
+ QCOMPARE(f3 & MyStrictEnum::StrictOne, 1);
+
+ MyStrictFlags aux;
+ aux = f3;
+ aux &= int(1);
+ QCOMPARE(aux, 1);
+
+ aux = f3;
+ aux &= uint(1);
+ QCOMPARE(aux, 1);
+
+ aux = f3;
+ aux &= MyStrictEnum::StrictOne;
+ QCOMPARE(aux, 1);
+
+ aux = f3;
+ aux &= f1;
+ QCOMPARE(aux, 1);
+
+ aux = f3 ^ f3;
+ QCOMPARE(aux, 0);
+
+ aux = f3 ^ f1;
+ QCOMPARE(aux, 2);
+
+ aux = f3 ^ f0;
+ QCOMPARE(aux, 3);
+
+ aux = f3 ^ MyStrictEnum::StrictOne;
+ QCOMPARE(aux, 2);
+
+ aux = f3 ^ MyStrictEnum::StrictZero;
+ QCOMPARE(aux, 3);
+
+ aux = f3;
+ aux ^= f3;
+ QCOMPARE(aux, 0);
+
+ aux = f3;
+ aux ^= f1;
+ QCOMPARE(aux, 2);
+
+ aux = f3;
+ aux ^= f0;
+ QCOMPARE(aux, 3);
+
+ aux = f3;
+ aux ^= MyStrictEnum::StrictOne;
+ QCOMPARE(aux, 2);
+
+ aux = f3;
+ aux ^= MyStrictEnum::StrictZero;
+ QCOMPARE(aux, 3);
+
+ aux = f1 | f2;
+ QCOMPARE(aux, 3);
+
+ aux = MyStrictEnum::StrictOne | MyStrictEnum::StrictTwo;
+ QCOMPARE(aux, 3);
+
+ aux = f1;
+ aux |= f2;
+ QCOMPARE(aux, 3);
+
+ aux = MyStrictEnum::StrictOne;
+ aux |= MyStrictEnum::StrictTwo;
+ QCOMPARE(aux, 3);
+
+ aux = ~f1;
+ QCOMPARE(aux, -2);
+
+ // Just to make sure it compiles
+ if (false)
+ qDebug() << f3;
+#endif
+}
+
// (statically) check QTypeInfo for QFlags instantiations:
enum MyEnum { Zero, One, Two, Four=4 };
Q_DECLARE_FLAGS( MyFlags, MyEnum )
diff --git a/tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp b/tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp
index d7fc76d980..3607467ff9 100644
--- a/tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp
+++ b/tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp
@@ -268,7 +268,8 @@ static int NColorRoles[] = {
QPalette::ToolTipText + 1, // Qt_4_5
QPalette::ToolTipText + 1, // Qt_4_6
QPalette::ToolTipText + 1, // Qt_5_0
- 0 // add the correct value for Qt_5_1 here later
+ QPalette::ToolTipText + 1, // Qt_5_1
+ 0 // add the correct value for Qt_5_2 here later
};
// Testing get/set functions
diff --git a/tests/auto/corelib/io/qprocess/tst_qprocess.cpp b/tests/auto/corelib/io/qprocess/tst_qprocess.cpp
index f01e319872..613bfd5c17 100644
--- a/tests/auto/corelib/io/qprocess/tst_qprocess.cpp
+++ b/tests/auto/corelib/io/qprocess/tst_qprocess.cpp
@@ -152,6 +152,7 @@ private slots:
void invalidProgramString_data();
void invalidProgramString();
void onlyOneStartedSignal();
+ void finishProcessBeforeReadingDone();
// keep these at the end, since they use lots of processes and sometimes
// caused obscure failures to occur in tests that followed them (esp. on the Mac)
@@ -2168,6 +2169,39 @@ void tst_QProcess::onlyOneStartedSignal()
QCOMPARE(spyFinished.count(), 1);
}
+//-----------------------------------------------------------------------------
+
+class BlockOnReadStdOut : public QObject
+{
+ Q_OBJECT
+public:
+ BlockOnReadStdOut(QProcess *process)
+ {
+ connect(process, SIGNAL(readyReadStandardOutput()), SLOT(block()));
+ }
+
+public slots:
+ void block()
+ {
+ QThread::sleep(1);
+ }
+};
+
+void tst_QProcess::finishProcessBeforeReadingDone()
+{
+ QProcess process;
+ BlockOnReadStdOut blocker(&process);
+ QEventLoop loop;
+ connect(&process, SIGNAL(finished(int)), &loop, SLOT(quit()));
+ process.start("testProcessOutput/testProcessOutput");
+ QVERIFY(process.waitForStarted());
+ loop.exec();
+ QStringList lines = QString::fromLocal8Bit(process.readAllStandardOutput()).split(
+ QRegExp(QStringLiteral("[\r\n]")), QString::SkipEmptyParts);
+ QVERIFY(!lines.isEmpty());
+ QCOMPARE(lines.last(), QStringLiteral("10239 -this is a number"));
+}
+
#endif //QT_NO_PROCESS
QTEST_MAIN(tst_QProcess)
diff --git a/tests/auto/corelib/json/tst_qtjson.cpp b/tests/auto/corelib/json/tst_qtjson.cpp
index 543226978c..010c8acb5f 100644
--- a/tests/auto/corelib/json/tst_qtjson.cpp
+++ b/tests/auto/corelib/json/tst_qtjson.cpp
@@ -234,9 +234,54 @@ void tst_QtJson::testNumbers()
QJsonArray array;
for (int i = 0; i < n; ++i)
array.append((double)numbers[i]);
+
+ QByteArray serialized = QJsonDocument(array).toJson();
+ QJsonDocument json = QJsonDocument::fromJson(serialized);
+ QJsonArray array2 = json.array();
+
+ QCOMPARE(array.size(), array2.size());
+ for (int i = 0; i < array.size(); ++i) {
+ QCOMPARE(array.at(i).type(), QJsonValue::Double);
+ QCOMPARE(array.at(i).toDouble(), (double)numbers[i]);
+ QCOMPARE(array2.at(i).type(), QJsonValue::Double);
+ QCOMPARE(array2.at(i).toDouble(), (double)numbers[i]);
+ }
+ }
+
+ {
+ qint64 numbers[] = {
+ 0,
+ -1,
+ 1,
+ (1UL<<54),
+ (1UL<<55),
+ (1UL<<56),
+ -(1UL<<54),
+ -(1UL<<55),
+ -(1UL<<56),
+ (1UL<<54) - 1,
+ (1UL<<55) - 1,
+ (1UL<<56) - 1,
+ -((1UL<<54) - 1),
+ -((1UL<<55) - 1),
+ -((1UL<<56) - 1)
+ };
+ int n = sizeof(numbers)/sizeof(qint64);
+
+ QJsonArray array;
+ for (int i = 0; i < n; ++i)
+ array.append((double)numbers[i]);
+
+ QByteArray serialized = QJsonDocument(array).toJson();
+ QJsonDocument json = QJsonDocument::fromJson(serialized);
+ QJsonArray array2 = json.array();
+
+ QCOMPARE(array.size(), array2.size());
for (int i = 0; i < array.size(); ++i) {
QCOMPARE(array.at(i).type(), QJsonValue::Double);
QCOMPARE(array.at(i).toDouble(), (double)numbers[i]);
+ QCOMPARE(array2.at(i).type(), QJsonValue::Double);
+ QCOMPARE(array2.at(i).toDouble(), (double)numbers[i]);
}
}
@@ -245,18 +290,18 @@ void tst_QtJson::testNumbers()
0,
-1,
1,
- (1<<26),
- (1<<27),
- (1<<28),
- -(1<<26),
- -(1<<27),
- -(1<<28),
- (1<<26) - 1,
- (1<<27) - 1,
- (1<<28) - 1,
- -((1<<26) - 1),
- -((1<<27) - 1),
- -((1<<28) - 1),
+ (1UL<<54),
+ (1UL<<55),
+ (1UL<<56),
+ -(1UL<<54),
+ -(1UL<<55),
+ -(1UL<<56),
+ (1UL<<54) - 1,
+ (1UL<<55) - 1,
+ (1UL<<56) - 1,
+ -((1UL<<54) - 1),
+ -((1UL<<55) - 1),
+ -((1UL<<56) - 1),
1.1,
0.1,
-0.1,
@@ -269,9 +314,17 @@ void tst_QtJson::testNumbers()
QJsonArray array;
for (int i = 0; i < n; ++i)
array.append(numbers[i]);
+
+ QByteArray serialized = QJsonDocument(array).toJson();
+ QJsonDocument json = QJsonDocument::fromJson(serialized);
+ QJsonArray array2 = json.array();
+
+ QCOMPARE(array.size(), array2.size());
for (int i = 0; i < array.size(); ++i) {
QCOMPARE(array.at(i).type(), QJsonValue::Double);
QCOMPARE(array.at(i).toDouble(), numbers[i]);
+ QCOMPARE(array2.at(i).type(), QJsonValue::Double);
+ QCOMPARE(array2.at(i).toDouble(), numbers[i]);
}
}
diff --git a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
index 06fc89f657..d16369de02 100644
--- a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
+++ b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
@@ -145,6 +145,7 @@ private slots:
void connectFunctorArgDifference();
void connectFunctorOverloads();
void disconnectDoesNotLeakFunctor();
+ void connectBase();
};
struct QObjectCreatedOnShutdown
@@ -5811,5 +5812,29 @@ void tst_QObject::disconnectDoesNotLeakFunctor()
QCOMPARE(countedStructObjectsCount, 0);
}
+class SubSender : public SenderObject {
+ Q_OBJECT
+};
+
+void tst_QObject::connectBase()
+{
+ SubSender sub;
+ ReceiverObject r1;
+ r1.reset();
+
+ QVERIFY( connect( &sub, &SubSender::signal1 , &r1, &ReceiverObject::slot1 ) );
+ QVERIFY( connect( &sub, static_cast<void (SenderObject::*)()>(&SubSender::signal2) , &r1, &ReceiverObject::slot2 ) );
+ QVERIFY( connect( &sub, static_cast<void (SubSender::*)()>(&SubSender::signal3) , &r1, &ReceiverObject::slot3 ) );
+
+ sub.emitSignal1();
+ sub.emitSignal2();
+ sub.emitSignal3();
+
+ QCOMPARE( r1.count_slot1, 1 );
+ QCOMPARE( r1.count_slot2, 1 );
+ QCOMPARE( r1.count_slot3, 1 );
+}
+
+
QTEST_MAIN(tst_QObject)
#include "tst_qobject.moc"
diff --git a/tests/auto/corelib/thread/qthreadpool/tst_qthreadpool.cpp b/tests/auto/corelib/thread/qthreadpool/tst_qthreadpool.cpp
index 8a72ae5bce..fb34afb880 100644
--- a/tests/auto/corelib/thread/qthreadpool/tst_qthreadpool.cpp
+++ b/tests/auto/corelib/thread/qthreadpool/tst_qthreadpool.cpp
@@ -94,6 +94,8 @@ private slots:
void tryStart();
void tryStartPeakThreadCount();
void tryStartCount();
+ void priorityStart_data();
+ void priorityStart();
void waitForDone();
void waitForDoneTimeout();
void destroyingWaitsForTasksToFinish();
@@ -747,6 +749,57 @@ void tst_QThreadPool::tryStartCount()
}
}
+void tst_QThreadPool::priorityStart_data()
+{
+ QTest::addColumn<int>("otherCount");
+ QTest::newRow("0") << 0;
+ QTest::newRow("1") << 1;
+ QTest::newRow("2") << 2;
+}
+
+void tst_QThreadPool::priorityStart()
+{
+ class Holder : public QRunnable
+ {
+ public:
+ QSemaphore &sem;
+ Holder(QSemaphore &sem) : sem(sem) {}
+ void run()
+ {
+ sem.acquire();
+ }
+ };
+ class Runner : public QRunnable
+ {
+ public:
+ QAtomicPointer<QRunnable> &ptr;
+ Runner(QAtomicPointer<QRunnable> &ptr) : ptr(ptr) {}
+ void run()
+ {
+ ptr.testAndSetRelaxed(0, this);
+ }
+ };
+
+ QFETCH(int, otherCount);
+ QSemaphore sem;
+ QAtomicPointer<QRunnable> firstStarted;
+ QRunnable *expected;
+ QThreadPool threadPool;
+ threadPool.setMaxThreadCount(1); // start only one thread at a time
+
+ // queue the holder first
+ // We need to be sure that all threads are active when we
+ // queue the two Runners
+ threadPool.start(new Holder(sem));
+ while (otherCount--)
+ threadPool.start(new Runner(firstStarted), 0); // priority 0
+ threadPool.start(expected = new Runner(firstStarted), 1); // priority 1
+
+ sem.release();
+ QVERIFY(threadPool.waitForDone());
+ QCOMPARE(firstStarted.load(), expected);
+}
+
void tst_QThreadPool::waitForDone()
{
QTime total, pass;
diff --git a/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp b/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp
index 6cfcf74069..0ec3f64020 100644
--- a/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp
+++ b/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp
@@ -1398,13 +1398,19 @@ void tst_QDateTime::operator_insert_extract()
{
QDataStream dataStream(&byteArray, QIODevice::WriteOnly);
dataStream.setVersion(dataStreamVersion);
- if (dataStreamVersion >= QDataStream::Qt_5_0) {
+ if (dataStreamVersion == QDataStream::Qt_5_0) {
// Qt 5 serialises as UTC and converts back to the stored timeSpec when
// deserialising; we don't need to do it ourselves...
dataStream << dateTime << dateTime;
} else {
- // ... but lower versions don't, so we have to here.
+ // ... but other versions don't, so we have to here.
dataStream << dateTimeAsUTC << dateTimeAsUTC;
+ // We'll also make sure that a deserialised local datetime is the same
+ // time of day (potentially different UTC time), regardless of which
+ // timezone it was serialised in. E.g.: Tue Aug 14 08:00:00 2012
+ // serialised in WST should be deserialised as Tue Aug 14 08:00:00 2012
+ // HST.
+ dataStream << dateTime;
}
}
@@ -1420,7 +1426,7 @@ void tst_QDateTime::operator_insert_extract()
QDateTime deserialised;
dataStream >> deserialised;
- if (dataStreamVersion >= QDataStream::Qt_5_0) {
+ if (dataStreamVersion == QDataStream::Qt_5_0) {
// Ensure local time is still correct. Again, Qt 5 handles the timeSpec
// conversion (in this case, UTC => LocalTime) for us when deserialising.
QCOMPARE(deserialised, expectedLocalTime);
@@ -1453,6 +1459,14 @@ void tst_QDateTime::operator_insert_extract()
QCOMPARE(deserialised, expectedLocalTime);
// Sanity check UTC times.
QCOMPARE(deserialised.toUTC(), expectedLocalTime.toUTC());
+
+ if (dataStreamVersion != QDataStream::Qt_5_0) {
+ // Deserialised local datetime should be the same time of day,
+ // regardless of which timezone it was serialised in.
+ QDateTime localDeserialized;
+ dataStream >> localDeserialized;
+ QCOMPARE(localDeserialized, dateTime);
+ }
}
qputenv("TZ", previousTimeZone.toLocal8Bit().constData());
diff --git a/tests/auto/corelib/tools/qhash/tst_qhash.cpp b/tests/auto/corelib/tools/qhash/tst_qhash.cpp
index 1cbf181286..71428310b8 100644
--- a/tests/auto/corelib/tools/qhash/tst_qhash.cpp
+++ b/tests/auto/corelib/tools/qhash/tst_qhash.cpp
@@ -75,6 +75,9 @@ private slots:
void const_shared_null();
void twoArguments_qHash();
void initializerList();
+
+ void qthash_data();
+ void qthash();
};
struct Foo {
@@ -1330,5 +1333,24 @@ void tst_QHash::initializerList()
#endif
}
+void tst_QHash::qthash_data()
+{
+ QTest::addColumn<QString>("key");
+ QTest::addColumn<uint>("hash");
+
+ QTest::newRow("null") << QString() << 0u;
+ QTest::newRow("empty") << QStringLiteral("") << 0u;
+ QTest::newRow("abcdef") << QStringLiteral("abcdef") << 108567222u;
+ QTest::newRow("tqbfjotld") << QStringLiteral("The quick brown fox jumps over the lazy dog") << 140865879u;
+ QTest::newRow("42") << QStringLiteral("42") << 882u;
+}
+
+void tst_QHash::qthash()
+{
+ QFETCH(QString, key);
+ const uint result = qt_hash(key);
+ QTEST(result, "hash");
+}
+
QTEST_APPLESS_MAIN(tst_QHash)
#include "tst_qhash.moc"
diff --git a/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp b/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp
index f8775bc75f..0f6015ebdc 100644
--- a/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp
+++ b/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp
@@ -350,6 +350,7 @@ void tst_QLocale::ctor()
TEST_CTOR("es_ES", Spanish, Spain)
TEST_CTOR("es_419", Spanish, LatinAmericaAndTheCaribbean)
TEST_CTOR("es-419", Spanish, LatinAmericaAndTheCaribbean)
+ TEST_CTOR("fr_MA", French, Morocco)
// test default countries for languages
TEST_CTOR("zh", Chinese, China)
diff --git a/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp b/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp
index c77b4eea42..7cd8642f26 100644
--- a/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp
+++ b/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp
@@ -510,11 +510,11 @@ void tst_QKeySequence::toStringFromKeycode_data()
QTest::newRow("A") << QKeySequence(Qt::Key_A) << "A";
QTest::newRow("-1") << QKeySequence(-1) << "";
QTest::newRow("Unknown") << QKeySequence(Qt::Key_unknown) << "";
- QTest::newRow("Ctrl+Numpad+Ins") << QKeySequence(Qt::ControlModifier | Qt::KeypadModifier | Qt::Key_Insert) << "Ctrl+Numpad+Ins";
- QTest::newRow("Ctrl+Numpad+Del") << QKeySequence(Qt::ControlModifier | Qt::KeypadModifier | Qt::Key_Delete) << "Ctrl+Numpad+Del";
- QTest::newRow("Ctrl+Alt+Numpad+Del") << QKeySequence(Qt::ControlModifier | Qt::AltModifier | Qt::KeypadModifier | Qt::Key_Delete) << "Ctrl+Alt+Numpad+Del";
+ QTest::newRow("Ctrl+Num+Ins") << QKeySequence(Qt::ControlModifier | Qt::KeypadModifier | Qt::Key_Insert) << "Ctrl+Num+Ins";
+ QTest::newRow("Ctrl+Num+Del") << QKeySequence(Qt::ControlModifier | Qt::KeypadModifier | Qt::Key_Delete) << "Ctrl+Num+Del";
+ QTest::newRow("Ctrl+Alt+Num+Del") << QKeySequence(Qt::ControlModifier | Qt::AltModifier | Qt::KeypadModifier | Qt::Key_Delete) << "Ctrl+Alt+Num+Del";
QTest::newRow("Ctrl+Ins") << QKeySequence(Qt::ControlModifier | Qt::Key_Insert) << "Ctrl+Ins";
- QTest::newRow("Ctrl+Numpad+Ins(1)") << QKeySequence(Qt::Key_Insert | Qt::KeypadModifier | Qt::ControlModifier) << "Ctrl+Numpad+Ins";
+ QTest::newRow("Ctrl+Num+Ins(1)") << QKeySequence(Qt::Key_Insert | Qt::KeypadModifier | Qt::ControlModifier) << "Ctrl+Num+Ins";
}
void tst_QKeySequence::toStringFromKeycode()
diff --git a/tests/auto/opengl/qgl/tst_qgl.cpp b/tests/auto/opengl/qgl/tst_qgl.cpp
index 00973cf533..28ec699427 100644
--- a/tests/auto/opengl/qgl/tst_qgl.cpp
+++ b/tests/auto/opengl/qgl/tst_qgl.cpp
@@ -875,6 +875,10 @@ void tst_QGL::graphicsViewClipping()
scene.setSceneRect(view.viewport()->rect());
QVERIFY(QTest::qWaitForWindowExposed(&view));
+ #ifdef Q_OS_MAC
+ // The black rectangle jumps from the center to the upper left for some reason.
+ QTest::qWait(100);
+ #endif
QTRY_VERIFY(widget->painted);
diff --git a/tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp b/tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp
index b117edddd4..0261224543 100644
--- a/tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp
+++ b/tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp
@@ -45,6 +45,8 @@
#include <qpagesetupdialog.h>
#include <qpainter.h>
#include <qprintdialog.h>
+#include <qprintpreviewdialog.h>
+#include <qprintpreviewwidget.h>
#include <qprinterinfo.h>
#include <qvariant.h>
#include <qpainter.h>
@@ -98,6 +100,7 @@ private slots:
void testMargins_data();
void testMargins();
void testPageSetupDialog();
+ void testPrintPreviewDialog();
void testMulitpleSets_data();
void testMulitpleSets();
void testPageMargins_data();
@@ -242,6 +245,49 @@ void tst_QPrinter::testPageSetupDialog()
}
}
+// A preview dialog showing 4 pages for testPrintPreviewDialog().
+
+class MyPreviewDialog : public QPrintPreviewDialog {
+ Q_OBJECT
+public:
+ MyPreviewDialog(QPrinter *p) : QPrintPreviewDialog(p)
+ {
+ connect(this, SIGNAL(paintRequested(QPrinter*)), this, SLOT(slotPaintRequested(QPrinter*)));
+ }
+
+public slots:
+ void slotPaintRequested(QPrinter *p);
+};
+
+void MyPreviewDialog::slotPaintRequested(QPrinter *p)
+{
+ enum { pageCount = 4 };
+ QPainter painter;
+ painter.begin(p);
+ for (int i = 0; i < pageCount; ++i) {
+ const QRect f = p->pageRect(QPrinter::DevicePixel).toRect();
+ painter.fillRect(f, Qt::white);
+ painter.drawText(f.center(), QString::fromLatin1("Page %1").arg(i + 1));
+ if (i != pageCount - 1)
+ p->newPage();
+ }
+ painter.end();
+}
+
+void tst_QPrinter::testPrintPreviewDialog()
+{
+ // QTBUG-14517: Showing the dialog with Qt::WindowMaximized caused it to switch to
+ // page 2 due to the scrollbar logic (besides testing for crashes).
+ QPrinter printer;
+ MyPreviewDialog dialog(&printer);
+ dialog.setWindowState(Qt::WindowMaximized);
+ dialog.show();
+ QVERIFY(QTest::qWaitForWindowExposed(&dialog));
+ QPrintPreviewWidget *widget = dialog.findChild<QPrintPreviewWidget *>();
+ QVERIFY(widget);
+ QCOMPARE(widget->currentPage(), 1);
+}
+
#ifdef Q_OS_WIN
// QPrinter::winPageSize(): Windows only.
void tst_QPrinter::testPageSize()
diff --git a/tests/auto/tools/moc/tst_moc.cpp b/tests/auto/tools/moc/tst_moc.cpp
index 3cd2f1f936..3459bede85 100644
--- a/tests/auto/tools/moc/tst_moc.cpp
+++ b/tests/auto/tools/moc/tst_moc.cpp
@@ -79,6 +79,9 @@
QT_USE_NAMESPACE
+template <bool b> struct QTBUG_31218 {};
+struct QTBUG_31218_Derived : QTBUG_31218<-1<0> {};
+
struct MyStruct {};
struct MyStruct2 {};
@@ -322,6 +325,8 @@ public slots:
signals:
void signalWithArray(const double[3]);
void signalWithNamedArray(const double namedArray[3]);
+ void signalWithIterator(QList<QUrl>::iterator);
+ void signalWithListPointer(QList<QUrl>*); //QTBUG-31002
private slots:
// for tst_Moc::preprocessorConditionals
@@ -1734,6 +1739,11 @@ void tst_Moc::warnings()
#endif
QProcess proc;
+
+ QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
+ env.insert("QT_MESSAGE_PATTERN", "no qDebug or qWarning please");
+ proc.setProcessEnvironment(env);
+
proc.start("moc", args);
QVERIFY(proc.waitForStarted());
diff --git a/tests/auto/widgets/dialogs/dialogs.pro b/tests/auto/widgets/dialogs/dialogs.pro
index e767c9767e..acff1df5ba 100644
--- a/tests/auto/widgets/dialogs/dialogs.pro
+++ b/tests/auto/widgets/dialogs/dialogs.pro
@@ -14,7 +14,7 @@ SUBDIRS=\
qsidebar \
qwizard \
-wince*:SUBDIRS -= qabstractprintdialog
+wince*|!qtHaveModule(printsupport):SUBDIRS -= qabstractprintdialog
!contains(QT_CONFIG, private_tests): SUBDIRS -= \
qsidebar \
diff --git a/tests/auto/widgets/dialogs/qprogressdialog/tst_qprogressdialog.cpp b/tests/auto/widgets/dialogs/qprogressdialog/tst_qprogressdialog.cpp
index d49f356d8c..68502f0d8d 100644
--- a/tests/auto/widgets/dialogs/qprogressdialog/tst_qprogressdialog.cpp
+++ b/tests/auto/widgets/dialogs/qprogressdialog/tst_qprogressdialog.cpp
@@ -46,6 +46,7 @@
#include <qdebug.h>
#include <qprogressdialog.h>
#include <qlabel.h>
+#include <qthread.h>
class tst_QProgressDialog : public QObject
{
@@ -58,6 +59,7 @@ public:
private slots:
void getSetCheck();
void task198202();
+ void QTBUG_31046();
};
tst_QProgressDialog::tst_QProgressDialog()
@@ -149,5 +151,14 @@ void tst_QProgressDialog::task198202()
QCOMPARE(dlg.sizeHint().height(), futureHeight);
}
+void tst_QProgressDialog::QTBUG_31046()
+{
+ QProgressDialog dlg("", "", 50, 60);
+ dlg.setValue(0);
+ QThread::msleep(200);
+ dlg.setValue(50);
+ QCOMPARE(50, dlg.value());
+}
+
QTEST_MAIN(tst_QProgressDialog)
#include "tst_qprogressdialog.moc"
diff --git a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp
index 37190c3cf2..3e24257736 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp
@@ -470,6 +470,7 @@ private slots:
void QTBUG_13473_sceneposchange();
void QTBUG_16374_crashInDestructor();
void QTBUG_20699_focusScopeCrash();
+ void QTBUG_30990_rightClickSelection();
private:
QList<QGraphicsItem *> paintedItems;
@@ -11468,5 +11469,32 @@ void tst_QGraphicsItem::QTBUG_20699_focusScopeCrash()
fs.setFocus();
}
+void tst_QGraphicsItem::QTBUG_30990_rightClickSelection()
+{
+ QGraphicsScene scene;
+ QGraphicsItem *item1 = scene.addRect(10, 10, 10, 10);
+ item1->setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsMovable);
+ QGraphicsItem *item2 = scene.addRect(100, 100, 10, 10);
+ item2->setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsMovable);
+
+ // right mouse press & release over an item should not make it selected
+ sendMousePress(&scene, item1->boundingRect().center(), Qt::RightButton);
+ QVERIFY(!item1->isSelected());
+ sendMouseRelease(&scene, item1->boundingRect().center(), Qt::RightButton);
+ QVERIFY(!item1->isSelected());
+
+ // right mouse press over one item, moving over another item,
+ // and then releasing should make neither of the items selected
+ sendMousePress(&scene, item1->boundingRect().center(), Qt::RightButton);
+ QVERIFY(!item1->isSelected());
+ QVERIFY(!item2->isSelected());
+ sendMouseMove(&scene, item2->boundingRect().center(), Qt::RightButton);
+ QVERIFY(!item1->isSelected());
+ QVERIFY(!item2->isSelected());
+ sendMouseRelease(&scene, item2->boundingRect().center(), Qt::RightButton);
+ QVERIFY(!item1->isSelected());
+ QVERIFY(!item2->isSelected());
+}
+
QTEST_MAIN(tst_QGraphicsItem)
#include "tst_qgraphicsitem.moc"
diff --git a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp
index beea46c979..c2e6d33adb 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp
@@ -983,6 +983,7 @@ void tst_QGraphicsProxyWidget::hoverEnterLeaveEvent()
// in
QTest::mouseMove(&view, QPoint(50, 50));
+ QSKIP("QTBUG-25294");
QTRY_COMPARE(widget->testAttribute(Qt::WA_UnderMouse), hasWidget ? true : false);
// ### this attribute isn't supported
QCOMPARE(widget->enterCount, hasWidget ? 1 : 0);
diff --git a/tests/auto/widgets/graphicsview/qgraphicssceneindex/tst_qgraphicssceneindex.cpp b/tests/auto/widgets/graphicsview/qgraphicssceneindex/tst_qgraphicssceneindex.cpp
index 7794fde2c7..dd432912f3 100644
--- a/tests/auto/widgets/graphicsview/qgraphicssceneindex/tst_qgraphicssceneindex.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicssceneindex/tst_qgraphicssceneindex.cpp
@@ -307,8 +307,8 @@ void tst_QGraphicsSceneIndex::clear()
QGraphicsView view(&scene);
view.show();
- QVERIFY(QTest::qWaitForWindowActive(&view));
qApp->setActiveWindow(&view);
+ QVERIFY(QTest::qWaitForWindowActive(&view));
scene.clear();
// Make sure the index is re-generated after QGraphicsScene::clear();
diff --git a/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp b/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp
index 4cfdfccd63..31439e203c 100644
--- a/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp
@@ -1214,7 +1214,7 @@ void tst_QGraphicsWidget::layoutDirection()
{
QFETCH(Qt::LayoutDirection, layoutDirection);
QGraphicsScene scene;
- QGraphicsView *view = new QGraphicsView(&scene);
+ QScopedPointer<QGraphicsView> view(new QGraphicsView(&scene));
SubQGraphicsWidget widget;
scene.addItem(&widget);
QCOMPARE(widget.layoutDirection(), Qt::LeftToRight);
@@ -1229,14 +1229,13 @@ void tst_QGraphicsWidget::layoutDirection()
widget.setLayoutDirection(layoutDirection);
QCOMPARE(widget.testAttribute(Qt::WA_SetLayoutDirection), true);
view->show();
- QVERIFY(QTest::qWaitForWindowExposed(view));
+ QVERIFY(QTest::qWaitForWindowExposed(view.data()));
for (int i = 0; i < children.count(); ++i) {
QTRY_COMPARE(children[i]->layoutDirection(), layoutDirection);
QTRY_COMPARE(children[i]->testAttribute(Qt::WA_SetLayoutDirection), false);
view->repaint();
QTRY_COMPARE(children[i]->m_painterLayoutDirection, layoutDirection);
}
- delete view;
}
void tst_QGraphicsWidget::paint_data()
@@ -1696,8 +1695,26 @@ void tst_QGraphicsWidget::verifyFocusChain()
delete w;
}
{
+ // QTBUG-30923:
+ // Child QGraphicsWidget with tabFocusFirst gets removed & deleted should not crash.
+ // This case simulates what QtQuick1 does when you have QGraphicsObject based
+ // item in different qml views that are loaded one after another.
+ QGraphicsItem *parent1 = new QGraphicsRectItem(0); // root item
+ scene.addItem(parent1);
+ for (int i = 0; i < 2; i++) {
+ SubQGraphicsWidget *w1 = new SubQGraphicsWidget(parent1);
+ w1->setFocusPolicy(Qt::StrongFocus);
+ w1->setFocus();
+ QVERIFY(w1->hasFocus());
+ scene.removeItem(w1);
+ delete w1;
+ QApplication::processEvents();
+ }
+ delete parent1;
+ }
+ {
// remove the tabFocusFirst widget from the scene.
- QWidget *window = new QWidget;
+ QScopedPointer<QWidget> window(new QWidget);
QVBoxLayout *layout = new QVBoxLayout;
window->setLayout(layout);
QLineEdit *lineEdit = new QLineEdit;
@@ -1717,8 +1734,8 @@ void tst_QGraphicsWidget::verifyFocusChain()
w1_2->setFocusPolicy(Qt::StrongFocus);
scene.addItem(w1_2);
window->show();
- QApplication::setActiveWindow(window);
- QVERIFY(QTest::qWaitForWindowActive(window));
+ QApplication::setActiveWindow(window.data());
+ QVERIFY(QTest::qWaitForWindowActive(window.data()));
lineEdit->setFocus();
QTRY_VERIFY(lineEdit->hasFocus());
@@ -1758,7 +1775,6 @@ void tst_QGraphicsWidget::verifyFocusChain()
QTest::keyPress(QApplication::focusWidget(), Qt::Key_Tab);
QTRY_VERIFY(w1_3->hasFocus());
QTRY_VERIFY(compareFocusChain(view, QList<QGraphicsItem*>() << w1_3 << w1_4));
- delete window;
}
}
@@ -2962,16 +2978,16 @@ void tst_QGraphicsWidget::respectHFW()
QGraphicsScene scene;
HFWWidget *window = new HFWWidget;
scene.addItem(window);
- QGraphicsView *view = new QGraphicsView(&scene);
+ QScopedPointer<QGraphicsView> view(new QGraphicsView(&scene));
view->resize(400, 400);
view->setSceneRect(-100, -100, 300,300);
view->show();
window->setGeometry(0, 0, 70, 70);
- QVERIFY(QTest::qWaitForWindowActive(view));
+ QVERIFY(QTest::qWaitForWindowActive(view.data()));
{ // here we go - simulate a interactive resize of the window
- QTest::mouseMove(view, view->mapFromScene(71, 71)); // bottom right corner
+ QTest::mouseMove(view.data(), view->mapFromScene(71, 71)); // bottom right corner
QTest::mousePress(view->viewport(), Qt::LeftButton, 0, view->mapFromScene(71, 71), 200);
view->grabMouse();
@@ -3157,15 +3173,14 @@ void tst_QGraphicsWidget::initialShow2()
QGraphicsScene dummyScene(0, 0, 200, 200);
dummyScene.addItem(new QGraphicsRectItem(0, 0, 100, 100));
- QGraphicsView *dummyView = new QGraphicsView(&dummyScene);
+ QScopedPointer<QGraphicsView> dummyView(new QGraphicsView(&dummyScene));
dummyView->setWindowFlags(Qt::X11BypassWindowManagerHint);
EventSpy paintSpy(dummyView->viewport(), QEvent::Paint);
dummyView->show();
- qApp->setActiveWindow(dummyView);
- QVERIFY(QTest::qWaitForWindowActive(dummyView));
+ qApp->setActiveWindow(dummyView.data());
+ QVERIFY(QTest::qWaitForWindowActive(dummyView.data()));
const int expectedRepaintCount = paintSpy.count();
- delete dummyView;
- dummyView = 0;
+ dummyView.reset();
MyGraphicsWidget *widget = new MyGraphicsWidget;
widget->resize(100, 100);
@@ -3179,7 +3194,7 @@ void tst_QGraphicsWidget::initialShow2()
qApp->setActiveWindow(&view);
QVERIFY(QTest::qWaitForWindowActive(&view));
-#if defined(Q_OS_WIN) || defined(UBUNTU_LUCID)
+#ifdef UBUNTU_LUCID
QEXPECT_FAIL("", "QTBUG-20778", Abort);
#endif
QTRY_COMPARE(widget->repaints, expectedRepaintCount);
diff --git a/tests/auto/widgets/itemviews/qitemdelegate/tst_qitemdelegate.cpp b/tests/auto/widgets/itemviews/qitemdelegate/tst_qitemdelegate.cpp
index d47eebe03a..538cc7bb4c 100644
--- a/tests/auto/widgets/itemviews/qitemdelegate/tst_qitemdelegate.cpp
+++ b/tests/auto/widgets/itemviews/qitemdelegate/tst_qitemdelegate.cpp
@@ -232,6 +232,8 @@ private slots:
void enterKey_data();
void enterKey();
void comboBox();
+ void testLineEditValidation_data();
+ void testLineEditValidation();
void task257859_finalizeEdit();
void QTBUG4435_keepSelectionOnCheck();
@@ -1413,6 +1415,135 @@ void tst_QItemDelegate::comboBox()
QCOMPARE(data.toBool(), false);
}
+void tst_QItemDelegate::testLineEditValidation_data()
+{
+ QTest::addColumn<int>("key");
+
+ QTest::newRow("enter") << int(Qt::Key_Enter);
+ QTest::newRow("return") << int(Qt::Key_Return);
+ QTest::newRow("tab") << int(Qt::Key_Tab);
+ QTest::newRow("backtab") << int(Qt::Key_Backtab);
+ QTest::newRow("escape") << int(Qt::Key_Escape);
+}
+
+void tst_QItemDelegate::testLineEditValidation()
+{
+ QFETCH(int, key);
+
+ struct TestDelegate : public QItemDelegate
+ {
+ virtual QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
+ {
+ Q_UNUSED(option);
+ Q_UNUSED(index);
+
+ QLineEdit *editor = new QLineEdit(parent);
+ QRegularExpression re("\\w+,\\w+"); // two words separated by a comma
+ editor->setValidator(new QRegularExpressionValidator(re, editor));
+ editor->setObjectName(QStringLiteral("TheEditor"));
+ return editor;
+ }
+ } delegate;
+
+ QStandardItemModel model;
+ // need a couple of dummy items to test tab and back tab
+ model.appendRow(new QStandardItem(QStringLiteral("dummy")));
+ QStandardItem *item = new QStandardItem(QStringLiteral("abc,def"));
+ model.appendRow(item);
+ model.appendRow(new QStandardItem(QStringLiteral("dummy")));
+
+ QListView view;
+ view.setModel(&model);
+ view.setItemDelegate(&delegate);
+ view.show();
+ view.setFocus();
+ QApplication::setActiveWindow(&view);
+ QVERIFY(QTest::qWaitForWindowActive(&view));
+
+ QList<QLineEdit *> lineEditors;
+ QPointer<QLineEdit> editor;
+ QPersistentModelIndex index = model.indexFromItem(item);
+
+ view.setCurrentIndex(index);
+ view.edit(index);
+ QTest::qWait(30);
+
+ lineEditors = view.findChildren<QLineEdit *>(QStringLiteral("TheEditor"));
+ QCOMPARE(lineEditors.count(), 1);
+ editor = lineEditors.at(0);
+ editor->clear();
+
+ // first try to set a valid text
+ QTest::keyClicks(editor, QStringLiteral("foo,bar"));
+ QTest::qWait(30);
+
+ // close the editor
+ QTest::keyClick(editor, Qt::Key(key));
+ QTest::qWait(30);
+
+ QVERIFY(editor.isNull());
+ if (key != Qt::Key_Escape)
+ QCOMPARE(item->data(Qt::DisplayRole).toString(), QStringLiteral("foo,bar"));
+ else
+ QCOMPARE(item->data(Qt::DisplayRole).toString(), QStringLiteral("abc,def"));
+
+ // now an invalid (but partially matching) text
+ view.setCurrentIndex(index);
+ view.edit(index);
+ QTest::qWait(30);
+
+ lineEditors = view.findChildren<QLineEdit *>(QStringLiteral("TheEditor"));
+ QCOMPARE(lineEditors.count(), 1);
+ editor = lineEditors.at(0);
+ editor->clear();
+
+ // edit
+ QTest::keyClicks(editor, QStringLiteral("foobar"));
+ QTest::qWait(30);
+
+ // try to close the editor
+ QTest::keyClick(editor, Qt::Key(key));
+ QTest::qWait(30);
+
+ if (key != Qt::Key_Escape) {
+ QVERIFY(!editor.isNull());
+ QCOMPARE(qApp->focusWidget(), editor.data());
+ QCOMPARE(editor->text(), QStringLiteral("foobar"));
+ QCOMPARE(item->data(Qt::DisplayRole).toString(), QStringLiteral("foo,bar"));
+ } else {
+ QVERIFY(editor.isNull());
+ QCOMPARE(item->data(Qt::DisplayRole).toString(), QStringLiteral("abc,def"));
+ }
+
+ // reset the view to forcibly close the editor
+ view.reset();
+ QTest::qWait(30);
+
+ // set a valid text again
+ view.setCurrentIndex(index);
+ view.edit(index);
+ QTest::qWait(30);
+
+ lineEditors = view.findChildren<QLineEdit *>(QStringLiteral("TheEditor"));
+ QCOMPARE(lineEditors.count(), 1);
+ editor = lineEditors.at(0);
+ editor->clear();
+
+ // set a valid text
+ QTest::keyClicks(editor, QStringLiteral("gender,bender"));
+ QTest::qWait(30);
+
+ // close the editor
+ QTest::keyClick(editor, Qt::Key(key));
+ QTest::qWait(30);
+
+ QVERIFY(editor.isNull());
+ if (key != Qt::Key_Escape)
+ QCOMPARE(item->data(Qt::DisplayRole).toString(), QStringLiteral("gender,bender"));
+ else
+ QCOMPARE(item->data(Qt::DisplayRole).toString(), QStringLiteral("abc,def"));
+}
+
// ### _not_ covered:
diff --git a/tests/auto/widgets/itemviews/qtableview/qtableview.pro b/tests/auto/widgets/itemviews/qtableview/qtableview.pro
index 41016ff984..0814af77fb 100644
--- a/tests/auto/widgets/itemviews/qtableview/qtableview.pro
+++ b/tests/auto/widgets/itemviews/qtableview/qtableview.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qtableview
QT += widgets widgets-private testlib
QT += core-private gui-private
diff --git a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
index 25e1dc3fa0..fefa7333d1 100644
--- a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
+++ b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
@@ -4010,10 +4010,6 @@ void tst_QWidget::update()
QApplication::processEvents();
QApplication::processEvents();
-
-#ifdef Q_OS_MAC
- QEXPECT_FAIL(0, "Cocoa compositor says to paint this twice.", Continue);
-#endif
QTRY_COMPARE(w.numPaintEvents, 1);
QCOMPARE(w.visibleRegion(), QRegion(w.rect()));
diff --git a/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp b/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp
index 6364a736cd..f5d92be95d 100644
--- a/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp
+++ b/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp
@@ -1705,6 +1705,11 @@ void tst_QMdiArea::tileSubWindows()
subWindow->setMinimumSize(minSize);
QCOMPARE(workspace.size(), QSize(350, 150));
+
+ // Prevent scrollbars from messing up the expected viewport calculation below
+ workspace.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ workspace.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+
workspace.tileSubWindows();
// The sub-windows are now tiled like this:
// | win 1 || win 2 || win 3 |
@@ -1723,11 +1728,12 @@ void tst_QMdiArea::tileSubWindows()
#ifdef Q_OS_WINCE
QSKIP("Not fixed yet! See task 197453");
#endif
-#ifdef Q_OS_MAC
- QEXPECT_FAIL("", "QTBUG-25298", Abort);
-#endif
QTRY_COMPARE(workspace.viewport()->rect().size(), expectedViewportSize);
+ // Restore original scrollbar behavior for test below
+ workspace.setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
+ workspace.setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
+
// Not enough space for all sub-windows to be visible -> provide scroll bars.
workspace.resize(160, 150);
qApp->processEvents();
diff --git a/tests/auto/widgets/widgets/qstackedwidget/qstackedwidget.pro b/tests/auto/widgets/widgets/qstackedwidget/qstackedwidget.pro
index d016caf393..2e8b86f35a 100644
--- a/tests/auto/widgets/widgets/qstackedwidget/qstackedwidget.pro
+++ b/tests/auto/widgets/widgets/qstackedwidget/qstackedwidget.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qstackedwidget
QT += widgets testlib
SOURCES += tst_qstackedwidget.cpp