summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2016-08-01 08:51:18 +0200
committerLiang Qi <liang.qi@qt.io>2016-08-01 10:03:21 +0200
commit3cb7302480390e5149a9cf6f49ac1ca94ef63f97 (patch)
tree831134f1053214ab0d5ba4d406cf7b860ed7c578 /tests
parent2ff1557937c398a7fb5cc7ba120e7ca3b5eacd36 (diff)
parentf24cc53cc27d8ed4be4c1d0d2df059dd6a6909a9 (diff)
Merge remote-tracking branch 'origin/5.6' into 5.7
Conflicts: src/widgets/itemviews/qabstractitemview.cpp src/widgets/itemviews/qabstractitemview_p.h Change-Id: I54589b1365103cb1749186af92aab03a49c94b64
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/corelib/tools/qvector/tst_qvector.cpp22
-rw-r--r--tests/auto/gui/image/qimage/tst_qimage.cpp38
-rw-r--r--tests/auto/other/qobjectrace/tst_qobjectrace.cpp175
-rw-r--r--tests/auto/widgets/itemviews/qitemdelegate/qitemdelegate.pro2
-rw-r--r--tests/auto/widgets/itemviews/qitemdelegate/tst_qitemdelegate.cpp62
5 files changed, 296 insertions, 3 deletions
diff --git a/tests/auto/corelib/tools/qvector/tst_qvector.cpp b/tests/auto/corelib/tools/qvector/tst_qvector.cpp
index 825cb05d74..374fec221e 100644
--- a/tests/auto/corelib/tools/qvector/tst_qvector.cpp
+++ b/tests/auto/corelib/tools/qvector/tst_qvector.cpp
@@ -271,6 +271,7 @@ private slots:
void testOperators() const;
void reserve();
+ void reserveZero();
void reallocAfterCopy_data();
void reallocAfterCopy();
void initializeListInt();
@@ -2365,13 +2366,34 @@ void tst_QVector::reserve()
{
QVector<Foo> a;
a.resize(2);
+ QCOMPARE(fooCtor, 2);
QVector<Foo> b(a);
b.reserve(1);
QCOMPARE(b.size(), a.size());
+ QCOMPARE(fooDtor, 0);
}
QCOMPARE(fooCtor, fooDtor);
}
+// This is a regression test for QTBUG-51758
+void tst_QVector::reserveZero()
+{
+ QVector<int> vec;
+ vec.detach();
+ vec.reserve(0); // should not crash
+ QCOMPARE(vec.size(), 0);
+ QCOMPARE(vec.capacity(), 0);
+ vec.squeeze();
+ QCOMPARE(vec.size(), 0);
+ QCOMPARE(vec.capacity(), 0);
+ vec.reserve(-1);
+ QCOMPARE(vec.size(), 0);
+ QCOMPARE(vec.capacity(), 0);
+ vec.append(42);
+ QCOMPARE(vec.size(), 1);
+ QVERIFY(vec.capacity() >= 1);
+}
+
// This is a regression test for QTBUG-11763, where memory would be reallocated
// soon after copying a QVector.
void tst_QVector::reallocAfterCopy_data()
diff --git a/tests/auto/gui/image/qimage/tst_qimage.cpp b/tests/auto/gui/image/qimage/tst_qimage.cpp
index 9e4a1abbb1..85d258de5b 100644
--- a/tests/auto/gui/image/qimage/tst_qimage.cpp
+++ b/tests/auto/gui/image/qimage/tst_qimage.cpp
@@ -94,6 +94,8 @@ private slots:
void setPixel_data();
void setPixel();
+ void defaultColorTable_data();
+ void defaultColorTable();
void setColorCount();
void setColor();
@@ -1450,6 +1452,38 @@ void tst_QImage::convertToFormatPreserveText()
QCOMPARE(imgResult2.textKeys(), listResult);
}
+void tst_QImage::defaultColorTable_data()
+{
+ QTest::addColumn<QImage::Format>("format");
+ QTest::addColumn<int>("createdDataCount");
+ QTest::addColumn<int>("externalDataCount");
+
+ // For historical reasons, internally created mono images get a default colormap.
+ // Externally created and Indexed8 images do not.
+ QTest::newRow("Mono") << QImage::Format_Mono << 2 << 0;
+ QTest::newRow("MonoLSB") << QImage::Format_MonoLSB << 2 << 0;
+ QTest::newRow("Indexed8") << QImage::Format_Indexed8 << 0 << 0;
+ QTest::newRow("ARGB32_PM") << QImage::Format_A2BGR30_Premultiplied << 0 << 0;
+}
+
+void tst_QImage::defaultColorTable()
+{
+ QFETCH(QImage::Format, format);
+ QFETCH(int, createdDataCount);
+ QFETCH(int, externalDataCount);
+
+ QImage img1(1, 1, format);
+ QCOMPARE(img1.colorCount(), createdDataCount);
+ QCOMPARE(img1.colorTable().size(), createdDataCount);
+
+ quint32 buf;
+ QImage img2(reinterpret_cast<uchar *>(&buf), 1, 1, format);
+ QCOMPARE(img2.colorCount(), externalDataCount);
+
+ QImage nullImg(0, 0, format);
+ QCOMPARE(nullImg.colorCount(), 0);
+}
+
void tst_QImage::setColorCount()
{
QImage img(0, 0, QImage::Format_Indexed8);
@@ -3182,8 +3216,8 @@ void tst_QImage::pixel()
QImage monolsb(&a, 1, 1, QImage::Format_MonoLSB);
QImage indexed(&a, 1, 1, QImage::Format_Indexed8);
- QCOMPARE(QColor(mono.pixel(0, 0)), QColor(Qt::black));
- QCOMPARE(QColor(monolsb.pixel(0, 0)), QColor(Qt::black));
+ mono.pixel(0, 0); // Don't crash
+ monolsb.pixel(0, 0); // Don't crash
indexed.pixel(0, 0); // Don't crash
}
}
diff --git a/tests/auto/other/qobjectrace/tst_qobjectrace.cpp b/tests/auto/other/qobjectrace/tst_qobjectrace.cpp
index ae5953aa35..aa78d70716 100644
--- a/tests/auto/other/qobjectrace/tst_qobjectrace.cpp
+++ b/tests/auto/other/qobjectrace/tst_qobjectrace.cpp
@@ -46,6 +46,7 @@ class tst_QObjectRace: public QObject
private slots:
void moveToThreadRace();
void destroyRace();
+ void disconnectRace();
};
class RaceObject : public QObject
@@ -293,6 +294,180 @@ void tst_QObjectRace::destroyRace()
delete threads[i];
}
+static QAtomicInteger<unsigned> countedStructObjectsCount;
+struct CountedFunctor
+{
+ CountedFunctor() : destroyed(false) { countedStructObjectsCount.fetchAndAddRelaxed(1); }
+ CountedFunctor(const CountedFunctor &) : destroyed(false) { countedStructObjectsCount.fetchAndAddRelaxed(1); }
+ CountedFunctor &operator=(const CountedFunctor &) { return *this; }
+ ~CountedFunctor() { destroyed = true; countedStructObjectsCount.fetchAndAddRelaxed(-1);}
+ void operator()() const {QCOMPARE(destroyed, false);}
+
+private:
+ bool destroyed;
+};
+
+class DisconnectRaceSenderObject : public QObject
+{
+ Q_OBJECT
+signals:
+ void theSignal();
+};
+
+class DisconnectRaceThread : public QThread
+{
+ Q_OBJECT
+
+ DisconnectRaceSenderObject *sender;
+ bool emitSignal;
+public:
+ DisconnectRaceThread(DisconnectRaceSenderObject *s, bool emitIt)
+ : QThread(), sender(s), emitSignal(emitIt)
+ {
+ }
+
+ void run()
+ {
+ while (!isInterruptionRequested()) {
+ QMetaObject::Connection conn = connect(sender, &DisconnectRaceSenderObject::theSignal,
+ sender, CountedFunctor(), Qt::BlockingQueuedConnection);
+ if (emitSignal)
+ emit sender->theSignal();
+ disconnect(conn);
+ yieldCurrentThread();
+ }
+ }
+};
+
+class DeleteReceiverRaceSenderThread : public QThread
+{
+ Q_OBJECT
+
+ DisconnectRaceSenderObject *sender;
+public:
+ DeleteReceiverRaceSenderThread(DisconnectRaceSenderObject *s)
+ : QThread(), sender(s)
+ {
+ }
+
+ void run()
+ {
+ while (!isInterruptionRequested()) {
+ emit sender->theSignal();
+ yieldCurrentThread();
+ }
+ }
+};
+
+class DeleteReceiverRaceReceiver : public QObject
+{
+ Q_OBJECT
+
+ DisconnectRaceSenderObject *sender;
+ QObject *receiver;
+ QTimer *timer;
+public:
+ DeleteReceiverRaceReceiver(DisconnectRaceSenderObject *s)
+ : QObject(), sender(s), receiver(0)
+ {
+ timer = new QTimer(this);
+ connect(timer, &QTimer::timeout, this, &DeleteReceiverRaceReceiver::onTimeout);
+ timer->start(1);
+ }
+
+ void onTimeout()
+ {
+ if (receiver)
+ delete receiver;
+ receiver = new QObject;
+ connect(sender, &DisconnectRaceSenderObject::theSignal, receiver, CountedFunctor(), Qt::BlockingQueuedConnection);
+ }
+};
+
+class DeleteReceiverRaceReceiverThread : public QThread
+{
+ Q_OBJECT
+
+ DisconnectRaceSenderObject *sender;
+public:
+ DeleteReceiverRaceReceiverThread(DisconnectRaceSenderObject *s)
+ : QThread(), sender(s)
+ {
+ }
+
+ void run()
+ {
+ QScopedPointer<DeleteReceiverRaceReceiver> receiver(new DeleteReceiverRaceReceiver(sender));
+ exec();
+ }
+};
+
+void tst_QObjectRace::disconnectRace()
+{
+ enum { ThreadCount = 20, TimeLimit = 3000 };
+
+ QCOMPARE(countedStructObjectsCount.load(), 0u);
+
+ {
+ QScopedPointer<DisconnectRaceSenderObject> sender(new DisconnectRaceSenderObject());
+ QScopedPointer<QThread> senderThread(new QThread());
+ senderThread->start();
+ sender->moveToThread(senderThread.data());
+
+ DisconnectRaceThread *threads[ThreadCount];
+ for (int i = 0; i < ThreadCount; ++i) {
+ threads[i] = new DisconnectRaceThread(sender.data(), !(i % 10));
+ threads[i]->start();
+ }
+
+ QTime timeLimiter;
+ timeLimiter.start();
+
+ while (timeLimiter.elapsed() < TimeLimit)
+ QTest::qWait(10);
+
+ for (int i = 0; i < ThreadCount; ++i) {
+ threads[i]->requestInterruption();
+ QVERIFY(threads[i]->wait(300));
+ delete threads[i];
+ }
+
+ senderThread->quit();
+ QVERIFY(senderThread->wait(300));
+ }
+
+ QCOMPARE(countedStructObjectsCount.load(), 0u);
+
+ {
+ QScopedPointer<DisconnectRaceSenderObject> sender(new DisconnectRaceSenderObject());
+ QScopedPointer<DeleteReceiverRaceSenderThread> senderThread(new DeleteReceiverRaceSenderThread(sender.data()));
+ senderThread->start();
+ sender->moveToThread(senderThread.data());
+
+ DeleteReceiverRaceReceiverThread *threads[ThreadCount];
+ for (int i = 0; i < ThreadCount; ++i) {
+ threads[i] = new DeleteReceiverRaceReceiverThread(sender.data());
+ threads[i]->start();
+ }
+
+ QTime timeLimiter;
+ timeLimiter.start();
+
+ while (timeLimiter.elapsed() < TimeLimit)
+ QTest::qWait(10);
+
+ senderThread->requestInterruption();
+ QVERIFY(senderThread->wait(300));
+
+ for (int i = 0; i < ThreadCount; ++i) {
+ threads[i]->quit();
+ QVERIFY(threads[i]->wait(300));
+ delete threads[i];
+ }
+ }
+
+ QCOMPARE(countedStructObjectsCount.load(), 0u);
+}
QTEST_MAIN(tst_QObjectRace)
#include "tst_qobjectrace.moc"
diff --git a/tests/auto/widgets/itemviews/qitemdelegate/qitemdelegate.pro b/tests/auto/widgets/itemviews/qitemdelegate/qitemdelegate.pro
index f7fb41e60c..02a71f8101 100644
--- a/tests/auto/widgets/itemviews/qitemdelegate/qitemdelegate.pro
+++ b/tests/auto/widgets/itemviews/qitemdelegate/qitemdelegate.pro
@@ -1,6 +1,6 @@
CONFIG += testcase
TARGET = tst_qitemdelegate
-QT += widgets testlib
+QT += widgets widgets-private testlib
SOURCES += tst_qitemdelegate.cpp
win32:!wince:!winrt: LIBS += -luser32
diff --git a/tests/auto/widgets/itemviews/qitemdelegate/tst_qitemdelegate.cpp b/tests/auto/widgets/itemviews/qitemdelegate/tst_qitemdelegate.cpp
index 34713bdff9..972dabdcb8 100644
--- a/tests/auto/widgets/itemviews/qitemdelegate/tst_qitemdelegate.cpp
+++ b/tests/auto/widgets/itemviews/qitemdelegate/tst_qitemdelegate.cpp
@@ -51,6 +51,8 @@
#include <QPlainTextEdit>
#include <QDialog>
+#include <QtWidgets/private/qabstractitemdelegate_p.h>
+
Q_DECLARE_METATYPE(QAbstractItemDelegate::EndEditHint)
#if defined (Q_OS_WIN) && !defined(Q_OS_WINCE) && !defined(Q_OS_WINRT)
@@ -216,6 +218,8 @@ private slots:
void task257859_finalizeEdit();
void QTBUG4435_keepSelectionOnCheck();
+
+ void QTBUG16469_textForRole();
};
@@ -1521,6 +1525,64 @@ void tst_QItemDelegate::testLineEditValidation()
QCOMPARE(item->data(Qt::DisplayRole).toString(), QStringLiteral("abc,def"));
}
+void tst_QItemDelegate::QTBUG16469_textForRole()
+{
+#ifndef QT_BUILD_INTERNAL
+ QSKIP("This test requires a developer build");
+#else
+ struct TestDelegate : public QItemDelegate
+ {
+ QString textForRole(Qt::ItemDataRole role, const QVariant &value, const QLocale &locale)
+ {
+ QAbstractItemDelegatePrivate *d = reinterpret_cast<QAbstractItemDelegatePrivate *>(qGetPtrHelper(d_ptr));
+ return d->textForRole(role, value, locale);
+ }
+ } delegate;
+ QLocale locale;
+
+ const float f = 123.456f;
+ QCOMPARE(delegate.textForRole(Qt::DisplayRole, f, locale), locale.toString(f));
+ QCOMPARE(delegate.textForRole(Qt::ToolTipRole, f, locale), locale.toString(f));
+ const double d = 123.456;
+ QCOMPARE(delegate.textForRole(Qt::DisplayRole, d, locale), locale.toString(d, 'g', 6));
+ QCOMPARE(delegate.textForRole(Qt::ToolTipRole, d, locale), locale.toString(d, 'g', 6));
+ const int i = 1234567;
+ QCOMPARE(delegate.textForRole(Qt::DisplayRole, i, locale), locale.toString(i));
+ QCOMPARE(delegate.textForRole(Qt::ToolTipRole, i, locale), locale.toString(i));
+ const qlonglong ll = 1234567;
+ QCOMPARE(delegate.textForRole(Qt::DisplayRole, ll, locale), locale.toString(ll));
+ QCOMPARE(delegate.textForRole(Qt::ToolTipRole, ll, locale), locale.toString(ll));
+ const uint ui = 1234567;
+ QCOMPARE(delegate.textForRole(Qt::DisplayRole, ui, locale), locale.toString(ui));
+ QCOMPARE(delegate.textForRole(Qt::ToolTipRole, ui, locale), locale.toString(ui));
+ const qulonglong ull = 1234567;
+ QCOMPARE(delegate.textForRole(Qt::DisplayRole, ull, locale), locale.toString(ull));
+ QCOMPARE(delegate.textForRole(Qt::ToolTipRole, ull, locale), locale.toString(ull));
+
+ const QDateTime dateTime = QDateTime::currentDateTime();
+ const QDate date = dateTime.date();
+ const QTime time = dateTime.time();
+ const QString shortDate = locale.toString(date, QLocale::ShortFormat);
+ const QString longDate = locale.toString(date, QLocale::LongFormat);
+ const QString shortTime = locale.toString(time, QLocale::ShortFormat);
+ const QString longTime = locale.toString(time, QLocale::LongFormat);
+ QCOMPARE(delegate.textForRole(Qt::DisplayRole, date, locale), shortDate);
+ QCOMPARE(delegate.textForRole(Qt::ToolTipRole, date, locale), longDate);
+ QCOMPARE(delegate.textForRole(Qt::DisplayRole, time, locale), shortTime);
+ QCOMPARE(delegate.textForRole(Qt::ToolTipRole, time, locale), longTime);
+ QCOMPARE(delegate.textForRole(Qt::DisplayRole, dateTime, locale), shortDate + QLatin1Char(' ') + shortTime);
+ QCOMPARE(delegate.textForRole(Qt::ToolTipRole, dateTime, locale), longDate + QLatin1Char(' ') + longTime);
+
+ const QString text("text");
+ QCOMPARE(delegate.textForRole(Qt::DisplayRole, text, locale), text);
+ QCOMPARE(delegate.textForRole(Qt::ToolTipRole, text, locale), text);
+ const QString multipleLines("multiple\nlines");
+ QString multipleLines2 = multipleLines;
+ multipleLines2.replace(QLatin1Char('\n'), QChar::LineSeparator);
+ QCOMPARE(delegate.textForRole(Qt::DisplayRole, multipleLines, locale), multipleLines2);
+ QCOMPARE(delegate.textForRole(Qt::ToolTipRole, multipleLines, locale), multipleLines);
+#endif
+}
// ### _not_ covered: