aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2019-02-16 01:03:22 +0100
committerQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2019-02-16 01:03:22 +0100
commit7d80264fa7fc71bc68ed091ff8ba97bdd7970dc4 (patch)
treee3d6878189a6079dd61cde0b20f7f10cc4d1ffb0 /tests
parent27c0e9d709aba97bd522fd3e53a53c4ff3c4d71b (diff)
parentfee0fcfef08a05ed4ba9369d2352c876b514d69c (diff)
Merge remote-tracking branch 'origin/5.13' into dev
Diffstat (limited to 'tests')
m---------tests/auto/qml/ecmascripttests/test2620
-rw-r--r--tests/auto/qml/qqmlapplicationengine/testapp/delayedExit.qml11
-rw-r--r--tests/auto/qml/qqmlapplicationengine/testapp/delayedQuit.qml (renamed from tests/auto/qml/qqmlapplicationengine/testapp/main.qml)0
-rw-r--r--tests/auto/qml/qqmlapplicationengine/testapp/immediateExit.qml8
-rw-r--r--tests/auto/qml/qqmlapplicationengine/testapp/immediateQuit.qml8
-rw-r--r--tests/auto/qml/qqmlapplicationengine/testapp/main.cpp2
-rw-r--r--tests/auto/qml/qqmlapplicationengine/testapp/main.qrc5
-rw-r--r--tests/auto/qml/qqmlapplicationengine/tst_qqmlapplicationengine.cpp44
-rw-r--r--tests/auto/qml/qqmlconnections/data/override-proxy-type.qml13
-rw-r--r--tests/auto/qml/qqmlconnections/tst_qqmlconnections.cpp25
-rw-r--r--tests/auto/qml/qqmlpropertycache/data/passQGadget.qml12
-rw-r--r--tests/auto/qml/qqmlpropertycache/tst_qqmlpropertycache.cpp39
-rw-r--r--tests/auto/quick/pointerhandlers/flickableinterop/tst_flickableinterop.cpp2
-rw-r--r--tests/auto/quick/pointerhandlers/qquickpointerhandler/tst_qquickpointerhandler.cpp16
-rw-r--r--tests/auto/quick/qquickanimations/BLACKLIST6
-rw-r--r--tests/auto/quick/qquickbehaviors/BLACKLIST2
-rw-r--r--tests/auto/quick/qquickcanvasitem/data/tst_strokeStyle.qml35
-rw-r--r--tests/auto/quick/qquickflickable/BLACKLIST7
-rw-r--r--tests/auto/quick/qquickfontmetrics/tst_quickfontmetrics.cpp2
-rw-r--r--tests/auto/quick/qquickgridview/BLACKLIST2
-rw-r--r--tests/auto/quick/qquickimage/BLACKLIST4
-rw-r--r--tests/auto/quick/qquicklistview/BLACKLIST2
-rw-r--r--tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp109
-rw-r--r--tests/auto/quick/qquicktableview/data/hiderowsandcolumns.qml85
-rw-r--r--tests/auto/quick/qquicktableview/data/usefaultyrowcolumnprovider.qml6
-rw-r--r--tests/auto/quick/qquicktableview/data/userowcolumnprovider.qml14
-rw-r--r--tests/auto/quick/qquicktableview/tst_qquicktableview.cpp189
-rw-r--r--tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp28
-rw-r--r--tests/auto/quick/qquicktextinput/BLACKLIST3
-rw-r--r--tests/auto/quick/qquickvisualdatamodel/data/externalManagedModel.qml65
-rw-r--r--tests/auto/quick/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp68
-rw-r--r--tests/auto/quick/shared/viewtestutil.cpp30
-rw-r--r--tests/auto/quick/shared/viewtestutil.h8
-rw-r--r--tests/manual/scenegraph_lancelot/data/borderimages/borderimage_borders_exceed_height.qml2
-rw-r--r--tests/manual/scenegraph_lancelot/data/borderimages/borderimage_borders_exceed_width.qml2
-rw-r--r--tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_smoothed.qml2
-rw-r--r--tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed.qml2
-rw-r--r--tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_border_overlap.qml2
-rw-r--r--tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_negative_borders.qml2
-rw-r--r--tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_borders.qml2
-rw-r--r--tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_bottom.qml2
-rw-r--r--tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_center.qml2
-rw-r--r--tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_left.qml2
-rw-r--r--tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_right.qml2
-rw-r--r--tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_right_left.qml2
-rw-r--r--tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_top.qml2
-rw-r--r--tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_top_bottom.qml2
47 files changed, 719 insertions, 159 deletions
diff --git a/tests/auto/qml/ecmascripttests/test262 b/tests/auto/qml/ecmascripttests/test262
-Subproject 3c69133cc419840c1be34638039cd8c48a7ef58
+Subproject 6b0c42c63c2492bd0a7a96d3179d122b5f71793
diff --git a/tests/auto/qml/qqmlapplicationengine/testapp/delayedExit.qml b/tests/auto/qml/qqmlapplicationengine/testapp/delayedExit.qml
new file mode 100644
index 0000000000..3d67c958bb
--- /dev/null
+++ b/tests/auto/qml/qqmlapplicationengine/testapp/delayedExit.qml
@@ -0,0 +1,11 @@
+import QtQml 2.0
+
+QtObject {
+ id: root
+ property Timer t: Timer { interval: 1; running: true; onTriggered: Qt.exit(0); }
+ property Connections c: Connections {
+ target: Qt.application
+ onAboutToQuit: console.log("End");
+ }
+ Component.onCompleted: console.log("Start: " + Qt.application.arguments[1]);
+}
diff --git a/tests/auto/qml/qqmlapplicationengine/testapp/main.qml b/tests/auto/qml/qqmlapplicationengine/testapp/delayedQuit.qml
index c75485a7f7..c75485a7f7 100644
--- a/tests/auto/qml/qqmlapplicationengine/testapp/main.qml
+++ b/tests/auto/qml/qqmlapplicationengine/testapp/delayedQuit.qml
diff --git a/tests/auto/qml/qqmlapplicationengine/testapp/immediateExit.qml b/tests/auto/qml/qqmlapplicationengine/testapp/immediateExit.qml
new file mode 100644
index 0000000000..46634f3f51
--- /dev/null
+++ b/tests/auto/qml/qqmlapplicationengine/testapp/immediateExit.qml
@@ -0,0 +1,8 @@
+import QtQml 2.0
+
+QtObject {
+ Component.onCompleted: {
+ console.log("End: " + Qt.application.arguments[1]);
+ Qt.exit(0)
+ }
+}
diff --git a/tests/auto/qml/qqmlapplicationengine/testapp/immediateQuit.qml b/tests/auto/qml/qqmlapplicationengine/testapp/immediateQuit.qml
new file mode 100644
index 0000000000..1da9d1201a
--- /dev/null
+++ b/tests/auto/qml/qqmlapplicationengine/testapp/immediateQuit.qml
@@ -0,0 +1,8 @@
+import QtQml 2.0
+
+QtObject {
+ Component.onCompleted: {
+ console.log("End: " + Qt.application.arguments[1]);
+ Qt.quit()
+ }
+}
diff --git a/tests/auto/qml/qqmlapplicationengine/testapp/main.cpp b/tests/auto/qml/qqmlapplicationengine/testapp/main.cpp
index a57889fe86..be0d98a2df 100644
--- a/tests/auto/qml/qqmlapplicationengine/testapp/main.cpp
+++ b/tests/auto/qml/qqmlapplicationengine/testapp/main.cpp
@@ -32,6 +32,6 @@
int main (int argc, char *argv[])
{
QCoreApplication app(argc, argv);
- QQmlApplicationEngine e(QUrl("qrc:///main.qml"));
+ QQmlApplicationEngine e(QUrl(QString("qrc:///") + argv[1]));
return app.exec();
}
diff --git a/tests/auto/qml/qqmlapplicationengine/testapp/main.qrc b/tests/auto/qml/qqmlapplicationengine/testapp/main.qrc
index 5f6483ac33..82b695bbd8 100644
--- a/tests/auto/qml/qqmlapplicationengine/testapp/main.qrc
+++ b/tests/auto/qml/qqmlapplicationengine/testapp/main.qrc
@@ -1,5 +1,8 @@
<RCC>
<qresource prefix="/">
- <file>main.qml</file>
+ <file>immediateQuit.qml</file>
+ <file>immediateExit.qml</file>
+ <file>delayedQuit.qml</file>
+ <file>delayedExit.qml</file>
</qresource>
</RCC>
diff --git a/tests/auto/qml/qqmlapplicationengine/tst_qqmlapplicationengine.cpp b/tests/auto/qml/qqmlapplicationengine/tst_qqmlapplicationengine.cpp
index daeb9b5455..ce654dc45e 100644
--- a/tests/auto/qml/qqmlapplicationengine/tst_qqmlapplicationengine.cpp
+++ b/tests/auto/qml/qqmlapplicationengine/tst_qqmlapplicationengine.cpp
@@ -46,6 +46,7 @@ private slots:
void initTestCase();
void basicLoading();
void testNonResolvedPath();
+ void application_data();
void application();
void applicationProperties();
void removeObjectsWhenDestroyed();
@@ -111,35 +112,56 @@ void tst_qqmlapplicationengine::testNonResolvedPath()
}
}
+void tst_qqmlapplicationengine::application_data()
+{
+ QTest::addColumn<QByteArray>("qmlFile");
+ QTest::addColumn<QByteArray>("expectedStdErr");
+
+ QTest::newRow("delayed quit") << QByteArray("delayedQuit.qml")
+ << QByteArray("qml: Start: delayedQuit.qml\nqml: End\n");
+ QTest::newRow("delayed exit") << QByteArray("delayedExit.qml")
+ << QByteArray("qml: Start: delayedExit.qml\nqml: End\n");
+ QTest::newRow("immediate quit") << QByteArray("immediateQuit.qml")
+ << QByteArray("qml: End: immediateQuit.qml\n");
+ QTest::newRow("immediate exit") << QByteArray("immediateExit.qml")
+ << QByteArray("qml: End: immediateExit.qml\n");
+}
+
void tst_qqmlapplicationengine::application()
{
/* This test batches together some tests about running an external application
written with QQmlApplicationEngine. The application tests the following functionality
which is easier to do by watching a separate process:
- -Loads relative paths from the working directory
- -quits when quit is called
- -emits aboutToQuit after quit is called
- -has access to application command line arguments
+ - Loads relative paths from the working directory
+ - Quits when quit is called
+ - Exits when exit is called
+ - Emits aboutToQuit after quit is called
+ - Has access to application command line arguments
Note that checking the output means that on builds with extra debugging, this might fail with a false positive.
Also the testapp is automatically built and installed in shadow builds, so it does NOT use testData
*/
+
+ QFETCH(QByteArray, qmlFile);
+ QFETCH(QByteArray, expectedStdErr);
+
#if QT_CONFIG(process)
QDir::setCurrent(buildDir);
QProcess *testProcess = new QProcess(this);
QStringList args;
- args << QLatin1String("testData");
+ args << qmlFile; // QML file passed as an argument is going to be run by testapp.
testProcess->start(QLatin1String("testapp/testapp"), args);
QVERIFY(testProcess->waitForFinished(5000));
QCOMPARE(testProcess->exitCode(), 0);
- QByteArray test_stdout = testProcess->readAllStandardOutput();
- QByteArray test_stderr = testProcess->readAllStandardError();
- QByteArray test_stderr_target("qml: Start: testData\nqml: End\n");
+ QByteArray testStdOut = testProcess->readAllStandardOutput();
+ QByteArray testStdErr = testProcess->readAllStandardError();
#ifdef Q_OS_WIN
- test_stderr_target.replace('\n', QByteArray("\r\n"));
+ expectedStdErr.replace('\n', QByteArray("\r\n"));
#endif
- QCOMPARE(test_stdout, QByteArray(""));
- QVERIFY(QString(test_stderr).endsWith(QString(test_stderr_target)));
+ QCOMPARE(testStdOut, QByteArray(""));
+ QVERIFY2(QString(testStdErr).endsWith(QString(expectedStdErr)),
+ QByteArray("\nExpected ending:\n") + expectedStdErr
+ + QByteArray("\nActual output:\n") + testStdErr);
delete testProcess;
QDir::setCurrent(srcDir);
#else // process
diff --git a/tests/auto/qml/qqmlconnections/data/override-proxy-type.qml b/tests/auto/qml/qqmlconnections/data/override-proxy-type.qml
new file mode 100644
index 0000000000..80e459966b
--- /dev/null
+++ b/tests/auto/qml/qqmlconnections/data/override-proxy-type.qml
@@ -0,0 +1,13 @@
+import QtQml 2.12
+import test.proxy 1.0
+
+Proxy {
+ property int testEnum: 0;
+ id: proxy
+ property Connections connections: Connections {
+ target: proxy
+ onSomeSignal: testEnum = Proxy.EnumValue;
+ }
+
+ Component.onCompleted: someSignal()
+}
diff --git a/tests/auto/qml/qqmlconnections/tst_qqmlconnections.cpp b/tests/auto/qml/qqmlconnections/tst_qqmlconnections.cpp
index 8ef00f8080..dc29363fcf 100644
--- a/tests/auto/qml/qqmlconnections/tst_qqmlconnections.cpp
+++ b/tests/auto/qml/qqmlconnections/tst_qqmlconnections.cpp
@@ -55,6 +55,7 @@ private slots:
void disabledAtStart();
void clearImplicitTarget();
void onWithoutASignal();
+ void noAcceleratedGlobalLookup();
private:
QQmlEngine engine;
@@ -407,6 +408,30 @@ void tst_qqmlconnections::onWithoutASignal()
QVERIFY(item == nullptr); // should parse error, and not give us an item (or crash).
}
+class Proxy : public QObject
+{
+ Q_OBJECT
+public:
+ enum MyEnum { EnumValue = 20, AnotherEnumValue };
+ Q_ENUM(MyEnum)
+
+signals:
+ void someSignal();
+};
+
+void tst_qqmlconnections::noAcceleratedGlobalLookup()
+{
+ qRegisterMetaType<Proxy::MyEnum>();
+ qmlRegisterType<Proxy>("test.proxy", 1, 0, "Proxy");
+ QQmlEngine engine;
+ QQmlComponent c(&engine, testFileUrl("override-proxy-type.qml"));
+ QVERIFY(c.isReady());
+ QScopedPointer<QObject> object(c.create());
+ const QVariant val = object->property("testEnum");
+ QCOMPARE(val.type(), QMetaType::Int);
+ QCOMPARE(val.toInt(), int(Proxy::EnumValue));
+}
+
QTEST_MAIN(tst_qqmlconnections)
#include "tst_qqmlconnections.moc"
diff --git a/tests/auto/qml/qqmlpropertycache/data/passQGadget.qml b/tests/auto/qml/qqmlpropertycache/data/passQGadget.qml
new file mode 100644
index 0000000000..86fdd920ed
--- /dev/null
+++ b/tests/auto/qml/qqmlpropertycache/data/passQGadget.qml
@@ -0,0 +1,12 @@
+import QtQml 2.2
+
+QtObject {
+ property var result;
+
+ property Connections connections: Connections {
+ target: emitter
+ onEmitGadget: function(gadget) {
+ result = gadget.someProperty;
+ }
+ }
+}
diff --git a/tests/auto/qml/qqmlpropertycache/tst_qqmlpropertycache.cpp b/tests/auto/qml/qqmlpropertycache/tst_qqmlpropertycache.cpp
index 5abda7b854..07237c9157 100644
--- a/tests/auto/qml/qqmlpropertycache/tst_qqmlpropertycache.cpp
+++ b/tests/auto/qml/qqmlpropertycache/tst_qqmlpropertycache.cpp
@@ -50,6 +50,7 @@ private slots:
void signalHandlers();
void signalHandlersDerived();
void passForeignEnums();
+ void passQGadget();
void metaObjectSize_data();
void metaObjectSize();
void metaObjectChecksum();
@@ -362,6 +363,44 @@ void tst_qqmlpropertycache::passForeignEnums()
Q_DECLARE_METATYPE(MyEnum::Option1)
Q_DECLARE_METATYPE(MyEnum::ShortEnum)
+QT_BEGIN_NAMESPACE
+class SimpleGadget
+{
+ Q_GADGET
+ Q_PROPERTY(bool someProperty READ someProperty)
+public:
+ bool someProperty() const { return true; }
+};
+
+// Avoids NeedsCreation and NeedsDestruction flags
+Q_DECLARE_TYPEINFO(SimpleGadget, Q_PRIMITIVE_TYPE);
+QT_END_NAMESPACE
+
+class GadgetEmitter : public QObject
+{
+ Q_OBJECT
+signals:
+ void emitGadget(SimpleGadget);
+};
+
+void tst_qqmlpropertycache::passQGadget()
+{
+ qRegisterMetaType<SimpleGadget>();
+
+ GadgetEmitter emitter;
+ engine.rootContext()->setContextProperty("emitter", &emitter);
+ QQmlComponent component(&engine, testFile("passQGadget.qml"));
+ QVERIFY(component.isReady());
+
+ QScopedPointer<QObject> obj(component.create(engine.rootContext()));
+ QVariant before = obj->property("result");
+ QVERIFY(before.isNull());
+ emit emitter.emitGadget(SimpleGadget());
+ QVariant after = obj->property("result");
+ QCOMPARE(QMetaType::Type(after.type()), QMetaType::Bool);
+ QVERIFY(after.toBool());
+}
+
class TestClass : public QObject
{
Q_OBJECT
diff --git a/tests/auto/quick/pointerhandlers/flickableinterop/tst_flickableinterop.cpp b/tests/auto/quick/pointerhandlers/flickableinterop/tst_flickableinterop.cpp
index cf2ac4a830..f4ed051e1f 100644
--- a/tests/auto/quick/pointerhandlers/flickableinterop/tst_flickableinterop.cpp
+++ b/tests/auto/quick/pointerhandlers/flickableinterop/tst_flickableinterop.cpp
@@ -741,7 +741,7 @@ void tst_FlickableInterop::touchAndDragHandlerOnFlickable()
QQuickTouchUtils::flush(window);
}
if (!(buttonDragHandler && !pressDelay))
- QVERIFY(flickable->contentY() >= dragThreshold);
+ QTRY_VERIFY(flickable->contentY() >= dragThreshold);
if (buttonTapHandler)
QCOMPARE(buttonTapHandler->isPressed(), false);
touchSeq.release(1, p1, window).commit();
diff --git a/tests/auto/quick/pointerhandlers/qquickpointerhandler/tst_qquickpointerhandler.cpp b/tests/auto/quick/pointerhandlers/qquickpointerhandler/tst_qquickpointerhandler.cpp
index feb356a7d5..2b6482465c 100644
--- a/tests/auto/quick/pointerhandlers/qquickpointerhandler/tst_qquickpointerhandler.cpp
+++ b/tests/auto/quick/pointerhandlers/qquickpointerhandler/tst_qquickpointerhandler.cpp
@@ -188,7 +188,10 @@ public:
QQuickPointerHandler::handlePointerEventImpl(event);
if (!enabled())
return;
- ++eventCount;
+ if (event->isPressEvent())
+ ++pressEventCount;
+ if (event->isReleaseEvent())
+ ++releaseEventCount;
EventItem *item = qmlobject_cast<EventItem *>(target());
if (!item) {
event->point(0)->setGrabberPointerHandler(this);
@@ -218,7 +221,8 @@ public:
static_cast<Qt::TouchPointState>(point->state()), stateChange, eventPos(point), point->scenePosition()));
}
- int eventCount = 0;
+ int pressEventCount = 0;
+ int releaseEventCount = 0;
};
class tst_PointerHandlers : public QQmlDataTest
@@ -646,9 +650,9 @@ void tst_PointerHandlers::handlerInWindow()
QPoint p1(20, 20);
QTest::mousePress(window, Qt::LeftButton, Qt::NoModifier, p1);
- QTRY_COMPARE(handler->eventCount, 1);
+ QTRY_COMPARE(handler->pressEventCount, 1);
QTest::mouseRelease(window, Qt::LeftButton, Qt::NoModifier, p1);
- QTRY_COMPARE(handler->eventCount, 2);
+ QTRY_COMPARE(handler->releaseEventCount, 1);
}
void tst_PointerHandlers::dynamicCreationInWindow()
@@ -670,9 +674,9 @@ void tst_PointerHandlers::dynamicCreationInWindow()
QPoint p1(20, 20);
QTest::mousePress(window, Qt::LeftButton, Qt::NoModifier, p1);
- QTRY_COMPARE(handler->eventCount, 1);
+ QTRY_COMPARE(handler->pressEventCount, 1);
QTest::mouseRelease(window, Qt::LeftButton, Qt::NoModifier, p1);
- QTRY_COMPARE(handler->eventCount, 2);
+ QTRY_COMPARE(handler->releaseEventCount, 1);
}
QTEST_MAIN(tst_PointerHandlers)
diff --git a/tests/auto/quick/qquickanimations/BLACKLIST b/tests/auto/quick/qquickanimations/BLACKLIST
deleted file mode 100644
index e011db46b7..0000000000
--- a/tests/auto/quick/qquickanimations/BLACKLIST
+++ /dev/null
@@ -1,6 +0,0 @@
-# QTBUG-45466 QTBUG-29062
-[simpleProperty]
-osx-10.9 developer-build
-[simplePath]
-windows gcc developer-build
-
diff --git a/tests/auto/quick/qquickbehaviors/BLACKLIST b/tests/auto/quick/qquickbehaviors/BLACKLIST
deleted file mode 100644
index 9be4da176d..0000000000
--- a/tests/auto/quick/qquickbehaviors/BLACKLIST
+++ /dev/null
@@ -1,2 +0,0 @@
-[currentValue]
-windows
diff --git a/tests/auto/quick/qquickcanvasitem/data/tst_strokeStyle.qml b/tests/auto/quick/qquickcanvasitem/data/tst_strokeStyle.qml
index 22803a19ce..a3f1ab0a9b 100644
--- a/tests/auto/quick/qquickcanvasitem/data/tst_strokeStyle.qml
+++ b/tests/auto/quick/qquickcanvasitem/data/tst_strokeStyle.qml
@@ -3,6 +3,8 @@ import QtQuick 2.0
CanvasTestCase {
id:testCase
name: "strokeStyle"
+ property color anotherColor: "#0000ff"
+ property color emptyColor
function init_data() { return testData("2d"); }
function test_default(row) {
var canvas = createCanvasObject(row);
@@ -46,4 +48,37 @@ CanvasTestCase {
comparePixel(ctx,0,0,255,255,255,255);
canvas.destroy()
}
+ function test_colorFromObjectToString(row) {
+ var canvas = createCanvasObject(row);
+ var ctx = canvas.getContext('2d');
+
+ ctx.reset();
+ ctx.strokeStyle = anotherColor
+ ctx.strokeStyle = "red";
+ compare(ctx.strokeStyle, "#ff0000");
+
+ ctx.strokeStyle = anotherColor
+ ctx.strokeStyle = "black";
+ compare(ctx.strokeStyle, "#000000");
+
+ ctx.strokeStyle = "white";
+ ctx.strokeStyle = anotherColor
+ compare(ctx.strokeStyle, "#0000ff");
+ canvas.destroy()
+ }
+ function test_withInvalidColor(row) {
+ var canvas = createCanvasObject(row);
+ var ctx = canvas.getContext('2d');
+
+ ctx.reset();
+ ctx.strokeStyle = emptyColor
+ compare(ctx.strokeStyle, "#000000");
+ ctx.strokeStyle = "red";
+ compare(ctx.strokeStyle, "#ff0000");
+ ctx.strokeStyle = emptyColor
+ compare(ctx.strokeStyle, "#000000");
+ ctx.strokeStyle = anotherColor;
+ compare(ctx.strokeStyle, "#0000ff");
+ canvas.destroy()
+ }
}
diff --git a/tests/auto/quick/qquickflickable/BLACKLIST b/tests/auto/quick/qquickflickable/BLACKLIST
deleted file mode 100644
index cc91754e68..0000000000
--- a/tests/auto/quick/qquickflickable/BLACKLIST
+++ /dev/null
@@ -1,7 +0,0 @@
-# QTBUG-26696
-[rebound]
-osx
-[stopAtBounds]
-windows developer-build
-[returnToBounds]
-osx
diff --git a/tests/auto/quick/qquickfontmetrics/tst_quickfontmetrics.cpp b/tests/auto/quick/qquickfontmetrics/tst_quickfontmetrics.cpp
index 6e516f51e1..ef61c45225 100644
--- a/tests/auto/quick/qquickfontmetrics/tst_quickfontmetrics.cpp
+++ b/tests/auto/quick/qquickfontmetrics/tst_quickfontmetrics.cpp
@@ -127,7 +127,7 @@ void tst_QuickFontMetrics::functions()
QFontMetricsF expected = QFontMetricsF(QFont());
QCOMPARE(metrics.elidedText(text, mode, width, flags), expected.elidedText(text, mode, width, flags));
- QCOMPARE(metrics.advanceWidth(text), expected.width(text));
+ QCOMPARE(metrics.advanceWidth(text), expected.horizontalAdvance(text));
QCOMPARE(metrics.boundingRect(text), expected.boundingRect(text));
QCOMPARE(metrics.tightBoundingRect(text), expected.tightBoundingRect(text));
}
diff --git a/tests/auto/quick/qquickgridview/BLACKLIST b/tests/auto/quick/qquickgridview/BLACKLIST
deleted file mode 100644
index 9eb9940aa5..0000000000
--- a/tests/auto/quick/qquickgridview/BLACKLIST
+++ /dev/null
@@ -1,2 +0,0 @@
-[snapOneRow:horizontal, right to left]
-windows
diff --git a/tests/auto/quick/qquickimage/BLACKLIST b/tests/auto/quick/qquickimage/BLACKLIST
deleted file mode 100644
index d15fae1b67..0000000000
--- a/tests/auto/quick/qquickimage/BLACKLIST
+++ /dev/null
@@ -1,4 +0,0 @@
-# QTBUG-65978
-[nullPixmapPaint]
-b2qt
-
diff --git a/tests/auto/quick/qquicklistview/BLACKLIST b/tests/auto/quick/qquicklistview/BLACKLIST
index 15aea4be19..e22d52294f 100644
--- a/tests/auto/quick/qquicklistview/BLACKLIST
+++ b/tests/auto/quick/qquicklistview/BLACKLIST
@@ -1,5 +1,3 @@
-[QTBUG_38209]
-*
[enforceRange_withoutHighlight]
osx
#QTBUG-53863
diff --git a/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp b/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp
index 558ca2e759..52d1458a53 100644
--- a/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp
+++ b/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp
@@ -43,31 +43,6 @@
#include <QtGui/QScreen>
#include <qpa/qwindowsysteminterface.h>
-// Initialize view, set Url, center in available geometry, move mouse away if desired
-static bool initView(QQuickView &v, const QUrl &url, bool moveMouseOut, QByteArray *errorMessage)
-{
- v.setBaseSize(QSize(240,320));
- v.setSource(url);
- while (v.status() == QQuickView::Loading)
- QTest::qWait(10);
- if (v.status() != QQuickView::Ready) {
- foreach (const QQmlError &e, v.errors())
- errorMessage->append(e.toString().toLocal8Bit() + '\n');
- return false;
- }
- const QRect screenGeometry = v.screen()->availableGeometry();
- const QSize size = v.size();
- const QPoint offset = QPoint(size.width() / 2, size.height() / 2);
- v.setFramePosition(screenGeometry.center() - offset);
-#if QT_CONFIG(cursor) // Get the cursor out of the way.
- if (moveMouseOut)
- QCursor::setPos(v.geometry().topRight() + QPoint(100, 100));
-#else
- Q_UNUSED(moveMouseOut)
-#endif
- return true;
-}
-
class CircleMask : public QObject
{
Q_OBJECT
@@ -235,7 +210,7 @@ void tst_QQuickMouseArea::dragProperties()
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("dragproperties.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("dragproperties.qml"), true, &errorMessage), errorMessage.constData());
window.show();
QVERIFY(QTest::qWaitForWindowExposed(&window));
QVERIFY(window.rootObject() != nullptr);
@@ -333,7 +308,7 @@ void tst_QQuickMouseArea::resetDrag()
QQuickView window;
QByteArray errorMessage;
window.rootContext()->setContextProperty("haveTarget", QVariant(true));
- QVERIFY2(initView(window, testFileUrl("dragreset.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("dragreset.qml"), true, &errorMessage), errorMessage.constData());
window.show();
QVERIFY(QTest::qWaitForWindowExposed(&window));
QVERIFY(window.rootObject() != nullptr);
@@ -363,7 +338,7 @@ void tst_QQuickMouseArea::dragging()
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("dragging.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("dragging.qml"), true, &errorMessage), errorMessage.constData());
window.show();
QVERIFY(QTest::qWaitForWindowExposed(&window));
@@ -428,7 +403,7 @@ void tst_QQuickMouseArea::dragSmoothed()
{
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("dragging.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("dragging.qml"), true, &errorMessage), errorMessage.constData());
window.show();
QVERIFY(QTest::qWaitForWindowExposed(&window));
@@ -482,7 +457,7 @@ void tst_QQuickMouseArea::dragThreshold()
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("dragging.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("dragging.qml"), true, &errorMessage), errorMessage.constData());
window.show();
QVERIFY(QTest::qWaitForWindowExposed(&window));
@@ -540,7 +515,7 @@ void tst_QQuickMouseArea::invalidDrag()
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("dragging.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("dragging.qml"), true, &errorMessage), errorMessage.constData());
window.show();
QVERIFY(QTest::qWaitForWindowExposed(&window));
QVERIFY(window.rootObject() != nullptr);
@@ -589,7 +564,7 @@ void tst_QQuickMouseArea::cancelDragging()
{
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("dragging.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("dragging.qml"), true, &errorMessage), errorMessage.constData());
window.show();
QVERIFY(QTest::qWaitForWindowExposed(&window));
@@ -644,7 +619,7 @@ void tst_QQuickMouseArea::availableDistanceLessThanDragThreshold()
{
QQuickView view;
QByteArray errorMessage;
- QVERIFY2(initView(view, testFileUrl("availableDistanceLessThanDragThreshold.qml"), true, &errorMessage),
+ QVERIFY2(QQuickTest::initView(view, testFileUrl("availableDistanceLessThanDragThreshold.qml"), true, &errorMessage),
errorMessage.constData());
view.show();
view.requestActivate();
@@ -672,7 +647,7 @@ void tst_QQuickMouseArea::setDragOnPressed()
{
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("setDragOnPressed.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("setDragOnPressed.qml"), true, &errorMessage), errorMessage.constData());
window.show();
QVERIFY(QTest::qWaitForWindowExposed(&window));
QVERIFY(window.rootObject() != nullptr);
@@ -716,7 +691,7 @@ void tst_QQuickMouseArea::updateMouseAreaPosOnClick()
{
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("updateMousePosOnClick.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("updateMousePosOnClick.qml"), true, &errorMessage), errorMessage.constData());
window.show();
QVERIFY(QTest::qWaitForWindowExposed(&window));
QVERIFY(window.rootObject() != nullptr);
@@ -744,7 +719,7 @@ void tst_QQuickMouseArea::updateMouseAreaPosOnResize()
{
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("updateMousePosOnResize.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("updateMousePosOnResize.qml"), true, &errorMessage), errorMessage.constData());
window.show();
QVERIFY(QTest::qWaitForWindowExposed(&window));
QVERIFY(window.rootObject() != nullptr);
@@ -780,7 +755,7 @@ void tst_QQuickMouseArea::noOnClickedWithPressAndHold()
// We handle onPressAndHold, therefore no onClicked
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("clickandhold.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("clickandhold.qml"), true, &errorMessage), errorMessage.constData());
window.show();
QVERIFY(QTest::qWaitForWindowExposed(&window));
QVERIFY(window.rootObject() != nullptr);
@@ -812,7 +787,7 @@ void tst_QQuickMouseArea::noOnClickedWithPressAndHold()
// We do not handle onPressAndHold, therefore we get onClicked
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("noclickandhold.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("noclickandhold.qml"), true, &errorMessage), errorMessage.constData());
window.show();
QVERIFY(QTest::qWaitForWindowExposed(&window));
QVERIFY(window.rootObject() != nullptr);
@@ -835,7 +810,7 @@ void tst_QQuickMouseArea::onMousePressRejected()
{
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("rejectEvent.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("rejectEvent.qml"), true, &errorMessage), errorMessage.constData());
window.show();
QVERIFY(QTest::qWaitForWindowExposed(&window));
QVERIFY(window.rootObject() != nullptr);
@@ -882,7 +857,7 @@ void tst_QQuickMouseArea::pressedCanceledOnWindowDeactivate()
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("pressedCanceled.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("pressedCanceled.qml"), true, &errorMessage), errorMessage.constData());
window.show();
QVERIFY(QTest::qWaitForWindowExposed(&window));
QVERIFY(window.rootObject() != nullptr);
@@ -955,7 +930,7 @@ void tst_QQuickMouseArea::doubleClick()
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("doubleclick.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("doubleclick.qml"), true, &errorMessage), errorMessage.constData());
window.show();
QVERIFY(QTest::qWaitForWindowExposed(&window));
QVERIFY(window.rootObject() != nullptr);
@@ -992,7 +967,7 @@ void tst_QQuickMouseArea::clickTwice()
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("clicktwice.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("clicktwice.qml"), true, &errorMessage), errorMessage.constData());
window.show();
QVERIFY(QTest::qWaitForWindowExposed(&window));
QVERIFY(window.rootObject() != nullptr);
@@ -1028,7 +1003,7 @@ void tst_QQuickMouseArea::invalidClick()
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("doubleclick.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("doubleclick.qml"), true, &errorMessage), errorMessage.constData());
window.show();
QVERIFY(QTest::qWaitForWindowExposed(&window));
QVERIFY(window.rootObject() != nullptr);
@@ -1061,7 +1036,7 @@ void tst_QQuickMouseArea::pressedOrdering()
{
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("pressedOrdering.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("pressedOrdering.qml"), true, &errorMessage), errorMessage.constData());
window.show();
QVERIFY(QTest::qWaitForWindowExposed(&window));
QVERIFY(window.rootObject() != nullptr);
@@ -1087,7 +1062,7 @@ void tst_QQuickMouseArea::preventStealing()
{
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("preventstealing.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("preventstealing.qml"), true, &errorMessage), errorMessage.constData());
window.show();
QVERIFY(QTest::qWaitForWindowExposed(&window));
QVERIFY(window.rootObject() != nullptr);
@@ -1161,7 +1136,7 @@ void tst_QQuickMouseArea::clickThrough()
//With no handlers defined click, doubleClick and PressAndHold should propagate to those with handlers
QScopedPointer<QQuickView> window(new QQuickView);
QByteArray errorMessage;
- QVERIFY2(initView(*window.data(), testFileUrl("clickThrough.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(*window.data(), testFileUrl("clickThrough.qml"), true, &errorMessage), errorMessage.constData());
window->show();
QVERIFY(QTest::qWaitForWindowExposed(window.data()));
QVERIFY(window->rootObject() != nullptr);
@@ -1195,7 +1170,7 @@ void tst_QQuickMouseArea::clickThrough()
window.reset(new QQuickView);
//With handlers defined click, doubleClick and PressAndHold should propagate only when explicitly ignored
- QVERIFY2(initView(*window.data(), testFileUrl("clickThrough2.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(*window.data(), testFileUrl("clickThrough2.qml"), true, &errorMessage), errorMessage.constData());
window->show();
QVERIFY(QTest::qWaitForWindowExposed(window.data()));
QVERIFY(window->rootObject() != nullptr);
@@ -1269,7 +1244,7 @@ void tst_QQuickMouseArea::clickThrough()
window.reset(new QQuickView);
//QTBUG-34368 - Shouldn't propagate to disabled mouse areas
- QVERIFY2(initView(*window.data(), testFileUrl("qtbug34368.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(*window.data(), testFileUrl("qtbug34368.qml"), true, &errorMessage), errorMessage.constData());
window->show();
QVERIFY(QTest::qWaitForWindowExposed(window.data()));
QVERIFY(window->rootObject() != nullptr);
@@ -1291,7 +1266,7 @@ void tst_QQuickMouseArea::clickThrough()
window.reset(new QQuickView);
//QTBUG-49100
- QVERIFY2(initView(*window.data(), testFileUrl("qtbug49100.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(*window.data(), testFileUrl("qtbug49100.qml"), true, &errorMessage), errorMessage.constData());
window->show();
QVERIFY(QTest::qWaitForWindowExposed(window.data()));
QVERIFY(window->rootObject() != nullptr);
@@ -1306,7 +1281,7 @@ void tst_QQuickMouseArea::hoverPosition()
{
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("hoverPosition.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("hoverPosition.qml"), true, &errorMessage), errorMessage.constData());
QQuickItem *root = window.rootObject();
QVERIFY(root != nullptr);
@@ -1325,7 +1300,7 @@ void tst_QQuickMouseArea::hoverPropagation()
//QTBUG-18175, to behave like GV did.
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("hoverPropagation.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("hoverPropagation.qml"), true, &errorMessage), errorMessage.constData());
QQuickItem *root = window.rootObject();
QVERIFY(root != nullptr);
@@ -1352,7 +1327,7 @@ void tst_QQuickMouseArea::hoverVisible()
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("hoverVisible.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("hoverVisible.qml"), true, &errorMessage), errorMessage.constData());
QQuickItem *root = window.rootObject();
QVERIFY(root != nullptr);
@@ -1380,7 +1355,7 @@ void tst_QQuickMouseArea::hoverAfterPress()
{
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("hoverAfterPress.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("hoverAfterPress.qml"), true, &errorMessage), errorMessage.constData());
QQuickItem *root = window.rootObject();
QVERIFY(root != nullptr);
@@ -1406,7 +1381,7 @@ void tst_QQuickMouseArea::subtreeHoverEnabled()
{
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("qtbug54019.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("qtbug54019.qml"), true, &errorMessage), errorMessage.constData());
QQuickItem *root = window.rootObject();
QVERIFY(root != nullptr);
@@ -1426,7 +1401,7 @@ void tst_QQuickMouseArea::disableAfterPress()
{
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("dragging.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("dragging.qml"), true, &errorMessage), errorMessage.constData());
window.show();
QVERIFY(QTest::qWaitForWindowExposed(&window));
QVERIFY(window.rootObject() != nullptr);
@@ -1529,7 +1504,7 @@ void tst_QQuickMouseArea::onWheel()
{
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("wheel.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("wheel.qml"), true, &errorMessage), errorMessage.constData());
QQuickItem *root = window.rootObject();
QVERIFY(root != nullptr);
@@ -1573,7 +1548,7 @@ void tst_QQuickMouseArea::transformedMouseArea()
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("transformedMouseArea.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("transformedMouseArea.qml"), true, &errorMessage), errorMessage.constData());
window.show();
QVERIFY(QTest::qWaitForWindowExposed(&window));
QVERIFY(window.rootObject() != nullptr);
@@ -1681,7 +1656,7 @@ void tst_QQuickMouseArea::pressedMultipleButtons()
QQuickView view;
QByteArray errorMessage;
- QVERIFY2(initView(view, testFileUrl("simple.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(view, testFileUrl("simple.qml"), true, &errorMessage), errorMessage.constData());
view.show();
QVERIFY(QTest::qWaitForWindowExposed(&view));
QVERIFY(view.rootObject() != nullptr);
@@ -1712,7 +1687,7 @@ void tst_QQuickMouseArea::changeAxis()
{
QQuickView view;
QByteArray errorMessage;
- QVERIFY2(initView(view, testFileUrl("changeAxis.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(view, testFileUrl("changeAxis.qml"), true, &errorMessage), errorMessage.constData());
view.show();
QVERIFY(QTest::qWaitForWindowExposed(&view));
QTRY_VERIFY(view.rootObject() != nullptr);
@@ -1805,7 +1780,7 @@ void tst_QQuickMouseArea::moveAndReleaseWithoutPress()
{
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("moveAndReleaseWithoutPress.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("moveAndReleaseWithoutPress.qml"), true, &errorMessage), errorMessage.constData());
window.show();
QVERIFY(QTest::qWaitForWindowExposed(&window));
@@ -1845,7 +1820,7 @@ void tst_QQuickMouseArea::nestedStopAtBounds()
QQuickView view;
QByteArray errorMessage;
- QVERIFY2(initView(view, testFileUrl("nestedStopAtBounds.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(view, testFileUrl("nestedStopAtBounds.qml"), true, &errorMessage), errorMessage.constData());
view.show();
view.requestActivate();
QVERIFY(QTest::qWaitForWindowExposed(&view));
@@ -1898,7 +1873,7 @@ void tst_QQuickMouseArea::nestedFlickableStopAtBounds()
{
QQuickView view;
QByteArray errorMessage;
- QVERIFY2(initView(view, testFileUrl("nestedFlickableStopAtBounds.qml"), false, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(view, testFileUrl("nestedFlickableStopAtBounds.qml"), false, &errorMessage), errorMessage.constData());
view.show();
view.requestActivate();
QVERIFY(QTest::qWaitForWindowExposed(&view));
@@ -2000,7 +1975,7 @@ void tst_QQuickMouseArea::containsPress()
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("containsPress.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("containsPress.qml"), true, &errorMessage), errorMessage.constData());
window.show();
window.requestActivate();
QVERIFY(QTest::qWaitForWindowExposed(&window));
@@ -2053,7 +2028,7 @@ void tst_QQuickMouseArea::ignoreBySource()
{
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("ignoreBySource.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("ignoreBySource.qml"), true, &errorMessage), errorMessage.constData());
window.show();
QVERIFY(QTest::qWaitForWindowExposed(&window));
QVERIFY(window.rootObject());
@@ -2194,7 +2169,7 @@ void tst_QQuickMouseArea::pressAndHold()
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("pressAndHold.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("pressAndHold.qml"), true, &errorMessage), errorMessage.constData());
window.show();
window.requestActivate();
QVERIFY(QTest::qWaitForWindowExposed(&window));
@@ -2239,7 +2214,7 @@ void tst_QQuickMouseArea::pressOneAndTapAnother()
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("twoMouseAreas.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("twoMouseAreas.qml"), true, &errorMessage), errorMessage.constData());
window.show();
window.requestActivate();
QVERIFY(QTest::qWaitForWindowExposed(&window));
@@ -2292,7 +2267,7 @@ void tst_QQuickMouseArea::mask()
{
QQuickView window;
QByteArray errorMessage;
- QVERIFY2(initView(window, testFileUrl("mask.qml"), true, &errorMessage), errorMessage.constData());
+ QVERIFY2(QQuickTest::initView(window, testFileUrl("mask.qml"), true, &errorMessage), errorMessage.constData());
window.show();
window.requestActivate();
QVERIFY(QTest::qWaitForWindowExposed(&window));
diff --git a/tests/auto/quick/qquicktableview/data/hiderowsandcolumns.qml b/tests/auto/quick/qquicktableview/data/hiderowsandcolumns.qml
new file mode 100644
index 0000000000..b11cb1476c
--- /dev/null
+++ b/tests/auto/quick/qquicktableview/data/hiderowsandcolumns.qml
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtQuick module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.12
+import QtQuick.Window 2.3
+
+Item {
+ width: 640
+ height: 450
+
+ property alias tableView: tableView
+ property var rowsToHide
+ property var columnsToHide
+
+ TableView {
+ id: tableView
+ width: 600
+ height: 400
+ anchors.margins: 1
+ clip: true
+ delegate: tableViewDelegate
+ columnSpacing: 1
+ rowSpacing: 1
+ columnWidthProvider: function(column) {
+ if (columnsToHide.includes(column))
+ return 0;
+ }
+ rowHeightProvider: function(row) {
+ if (rowsToHide.includes(row))
+ return 0;
+ }
+ }
+
+ Component {
+ id: tableViewDelegate
+ Rectangle {
+ objectName: "tableViewDelegate"
+ color: "lightgray"
+ border.width: 1
+ implicitWidth: 50
+ implicitHeight: 50
+ Text {
+ anchors.centerIn: parent
+ text: column + "," + row
+ }
+ }
+ }
+
+}
diff --git a/tests/auto/quick/qquicktableview/data/usefaultyrowcolumnprovider.qml b/tests/auto/quick/qquicktableview/data/usefaultyrowcolumnprovider.qml
index 32d1fc9d0d..1e35d65bcd 100644
--- a/tests/auto/quick/qquicktableview/data/usefaultyrowcolumnprovider.qml
+++ b/tests/auto/quick/qquicktableview/data/usefaultyrowcolumnprovider.qml
@@ -56,16 +56,14 @@ Item {
delegate: tableViewDelegate
columnSpacing: 1
rowSpacing: 1
- columnWidthProvider: function(column) { }
- rowHeightProvider: function(row) { return 0 }
+ columnWidthProvider: function(column) { return "notAValidValue" }
+ rowHeightProvider: function(row) { return "notAValidValue" }
}
Component {
id: tableViewDelegate
Rectangle {
objectName: "tableViewDelegate"
- implicitWidth: 20
- implicitHeight: 20
color: "lightgray"
border.width: 1
Text {
diff --git a/tests/auto/quick/qquicktableview/data/userowcolumnprovider.qml b/tests/auto/quick/qquicktableview/data/userowcolumnprovider.qml
index 04d12f8d20..e9f01b6abf 100644
--- a/tests/auto/quick/qquicktableview/data/userowcolumnprovider.qml
+++ b/tests/auto/quick/qquicktableview/data/userowcolumnprovider.qml
@@ -46,6 +46,8 @@ Item {
property alias tableView: tableView
property Component delegate: tableViewDelegate
+ property bool returnNegativeColumnWidth: false
+ property bool returnNegativeRowHeight: false
TableView {
id: tableView
@@ -56,8 +58,16 @@ Item {
delegate: tableViewDelegate
columnSpacing: 1
rowSpacing: 1
- columnWidthProvider: function(column) { return column + 10 }
- rowHeightProvider: function(row) { return row + 10 }
+ columnWidthProvider: function(column) {
+ if (returnNegativeColumnWidth)
+ return -1
+ return column + 10
+ }
+ rowHeightProvider: function(row) {
+ if (returnNegativeRowHeight)
+ return -1
+ return row + 10
+ }
}
Component {
diff --git a/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp b/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp
index d2ec9948c9..e263427b59 100644
--- a/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp
+++ b/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp
@@ -111,10 +111,12 @@ private slots:
void checkDelegateWithAnchors();
void checkColumnWidthProvider();
void checkColumnWidthProviderInvalidReturnValues();
+ void checkColumnWidthProviderNegativeReturnValue();
void checkColumnWidthProviderNotCallable();
void checkRowHeightWithoutProvider();
void checkRowHeightProvider();
void checkRowHeightProviderInvalidReturnValues();
+ void checkRowHeightProviderNegativeReturnValue();
void checkRowHeightProviderNotCallable();
void checkForceLayoutFunction();
void checkContentWidthAndHeight();
@@ -157,6 +159,8 @@ private slots:
void checkRebuildViewportOnly();
void useDelegateChooserWithoutDefault();
void checkTableviewInsideAsyncLoader();
+ void hideRowsAndColumns_data();
+ void hideRowsAndColumns();
};
tst_QQuickTableView::tst_QQuickTableView()
@@ -373,7 +377,7 @@ void tst_QQuickTableView::checkColumnWidthProviderInvalidReturnValues()
tableView->setModel(model);
- QTest::ignoreMessage(QtWarningMsg, QRegularExpression(".*Provider.*valid"));
+ QTest::ignoreMessage(QtWarningMsg, QRegularExpression(".*implicitHeight.*zero"));
WAIT_UNTIL_POLISHED;
@@ -381,6 +385,23 @@ void tst_QQuickTableView::checkColumnWidthProviderInvalidReturnValues()
QCOMPARE(fxItem->item->width(), kDefaultColumnWidth);
}
+void tst_QQuickTableView::checkColumnWidthProviderNegativeReturnValue()
+{
+ // Check that we fall back to use the implicit width of the delegate
+ // items if the columnWidthProvider return a negative number.
+ LOAD_TABLEVIEW("userowcolumnprovider.qml");
+
+ auto model = TestModelAsVariant(10, 10);
+ view->rootObject()->setProperty("returnNegativeColumnWidth", true);
+
+ tableView->setModel(model);
+
+ WAIT_UNTIL_POLISHED;
+
+ for (auto fxItem : tableViewPrivate->loadedItems)
+ QCOMPARE(fxItem->item->width(), 20);
+}
+
void tst_QQuickTableView::checkColumnWidthProviderNotCallable()
{
// Check that we fall back to use default columns widths, if you
@@ -453,7 +474,7 @@ void tst_QQuickTableView::checkRowHeightProviderInvalidReturnValues()
tableView->setModel(model);
- QTest::ignoreMessage(QtWarningMsg, QRegularExpression(".*Provider.*valid"));
+ QTest::ignoreMessage(QtWarningMsg, QRegularExpression(".*implicitHeight.*zero"));
WAIT_UNTIL_POLISHED;
@@ -461,6 +482,23 @@ void tst_QQuickTableView::checkRowHeightProviderInvalidReturnValues()
QCOMPARE(fxItem->item->height(), kDefaultRowHeight);
}
+void tst_QQuickTableView::checkRowHeightProviderNegativeReturnValue()
+{
+ // Check that we fall back to use the implicit height of the delegate
+ // items if the rowHeightProvider return a negative number.
+ LOAD_TABLEVIEW("userowcolumnprovider.qml");
+
+ auto model = TestModelAsVariant(10, 10);
+ view->rootObject()->setProperty("returnNegativeRowHeight", true);
+
+ tableView->setModel(model);
+
+ WAIT_UNTIL_POLISHED;
+
+ for (auto fxItem : tableViewPrivate->loadedItems)
+ QCOMPARE(fxItem->item->height(), 20);
+}
+
void tst_QQuickTableView::checkRowHeightProviderNotCallable()
{
// Check that we fall back to use default row heights, if you
@@ -538,6 +576,8 @@ void tst_QQuickTableView::checkContentWidthAndHeight()
const qreal expectedSizeInit = (tableSize * cellSizeSmall) + ((tableSize - 1) * spacing);
QCOMPARE(tableView->contentWidth(), expectedSizeInit);
QCOMPARE(tableView->contentHeight(), expectedSizeInit);
+ QCOMPARE(tableViewPrivate->averageEdgeSize.width(), cellSizeSmall);
+ QCOMPARE(tableViewPrivate->averageEdgeSize.height(), cellSizeSmall);
// Flick in 5 more rows and columns, but not so far that we start loading in
// the ones that are bigger. Loading in more rows and columns of the same
@@ -548,6 +588,8 @@ void tst_QQuickTableView::checkContentWidthAndHeight()
QCOMPARE(tableView->contentWidth(), expectedSizeInit);
QCOMPARE(tableView->contentHeight(), expectedSizeInit);
+ QCOMPARE(tableViewPrivate->averageEdgeSize.width(), cellSizeSmall);
+ QCOMPARE(tableViewPrivate->averageEdgeSize.height(), cellSizeSmall);
// Flick to row and column 20 (smallCellCount), since there the row and
// column sizes increases with 100. Check that TableView then adjusts
@@ -562,6 +604,11 @@ void tst_QQuickTableView::checkContentWidthAndHeight()
QVERIFY(tableViewPrivate->rebuildScheduled);
WAIT_UNTIL_POLISHED;
+ // Check that the average cell size is now matching the
+ // large cells since they fill up the whole view.
+ QCOMPARE(tableViewPrivate->averageEdgeSize.width(), cellSizeLarge);
+ QCOMPARE(tableViewPrivate->averageEdgeSize.height(), cellSizeLarge);
+
const int largeSizeCellCountInView = qCeil(tableView->width() / cellSizeLarge);
const int columnCount = smallCellCount + largeSizeCellCountInView;
QCOMPARE(tableViewPrivate->leftColumn(), smallCellCount);
@@ -571,41 +618,47 @@ void tst_QQuickTableView::checkContentWidthAndHeight()
const qreal secondHalfOneScreenLength = largeSizeCellCountInView * cellSizeLarge;
const qreal lengthAfterFlick = firstHalfLength + secondHalfOneScreenLength;
- const qreal averageCellSize = lengthAfterFlick / columnCount;
- const qreal expectedSizeHalf = (tableSize * averageCellSize) + accumulatedSpacing;
-
- QCOMPARE(tableView->contentWidth(), expectedSizeHalf);
- QCOMPARE(tableView->contentHeight(), expectedSizeHalf);
+ // Check that loadedTableOuterRect has been calculated correct thus far
+ const qreal spacingAfterFlick = (smallCellCount + largeSizeCellCountInView - 1) * spacing;
+ QCOMPARE(tableViewPrivate->loadedTableOuterRect.left(), flickTo + spacing);
+ QCOMPARE(tableViewPrivate->loadedTableOuterRect.right(), lengthAfterFlick + spacingAfterFlick);
+ QCOMPARE(tableViewPrivate->loadedTableOuterRect.top(), flickTo + spacing);
+ QCOMPARE(tableViewPrivate->loadedTableOuterRect.bottom(), lengthAfterFlick + spacingAfterFlick);
+
+ // At this point, we should have the exact content width/height set, because
+ // TableView knows where the large cells start in the viewport, and how many
+ // columns that remain in the model. It will assume that the rest of the the
+ // columns have the same average size as the ones currently inside the viewport.
+ const qreal expectedContentSize = (smallCellCount * cellSizeSmall) + (largeCellCount * cellSizeLarge) + accumulatedSpacing;
+ QCOMPARE(tableView->contentWidth(), expectedContentSize);
+ QCOMPARE(tableView->contentHeight(), expectedContentSize);
// Flick to the end (row/column 100, and overshoot a bit), and
// check that we then end up with the exact content width/height.
const qreal secondHalfLength = largeCellCount * cellSizeLarge;
const qreal expectedFullSize = (firstHalfLength + secondHalfLength) + accumulatedSpacing;
-
- // If we flick more than one page at a time, tableview will jump to the new
- // position and rebuild the table without loading the edges in-between. Which
- // row and column that ends up as new top-left is then based on a prediction, and
- // therefore unreliable. To avoid this to happen (which will also affect the
- // reported size of the table), we flick to the end position in smaller chuncks.
- QVERIFY(!tableViewPrivate->polishScheduled);
- QVERIFY(!tableViewPrivate->rebuildScheduled);
- int pages = qCeil((expectedFullSize - tableView->contentX()) / tableView->width());
- for (int i = 0; i < pages; i++) {
- tableView->setContentX(tableView->contentX() + tableView->width() - 1);
- tableView->setContentY(tableView->contentY() + tableView->height() - 1);
- QVERIFY(!tableViewPrivate->rebuildScheduled);
- }
+ const qreal overshoot = 100;
+ const qreal endPosX = expectedFullSize - tableView->width() + overshoot;
+ const qreal endPosY = expectedFullSize - tableView->height() + overshoot;
+ tableView->setContentX(endPosX);
+ tableView->setContentY(endPosY);
QCOMPARE(tableView->contentWidth(), expectedFullSize);
QCOMPARE(tableView->contentHeight(), expectedFullSize);
- // Flick back to start. Since we know the actual table
- // size, contentWidth/Height shouldn't change.
+ // Flick back to start
tableView->setContentX(0);
tableView->setContentY(0);
- QCOMPARE(tableView->contentWidth(), expectedFullSize);
- QCOMPARE(tableView->contentHeight(), expectedFullSize);
+ // Since we move the viewport more than a page, tableview
+ // will jump to the new position and do a rebuild.
+ QVERIFY(tableViewPrivate->polishScheduled);
+ QVERIFY(tableViewPrivate->rebuildScheduled);
+ WAIT_UNTIL_POLISHED;
+
+ // We should now have the same content width/height as when we started
+ QCOMPARE(tableView->contentWidth(), expectedSizeInit);
+ QCOMPARE(tableView->contentHeight(), expectedSizeInit);
}
void tst_QQuickTableView::checkPageFlicking()
@@ -2001,6 +2054,92 @@ void tst_QQuickTableView::checkTableviewInsideAsyncLoader()
QVERIFY(height > 0);
};
+#define INT_LIST(indices) QVariant::fromValue(QList<int>() << indices)
+
+void tst_QQuickTableView::hideRowsAndColumns_data()
+{
+ QTest::addColumn<QVariant>("rowsToHide");
+ QTest::addColumn<QVariant>("columnsToHide");
+
+ const auto emptyList = QVariant::fromValue(QList<int>());
+
+ // Hide rows
+ QTest::newRow("first") << INT_LIST(0) << emptyList;
+ QTest::newRow("middle 1") << INT_LIST(1) << emptyList;
+ QTest::newRow("middle 3") << INT_LIST(3) << emptyList;
+ QTest::newRow("last") << INT_LIST(4) << emptyList;
+
+ QTest::newRow("subsequent 0,1") << INT_LIST(0 << 1) << emptyList;
+ QTest::newRow("subsequent 1,2") << INT_LIST(1 << 2) << emptyList;
+ QTest::newRow("subsequent 3,4") << INT_LIST(3 << 4) << emptyList;
+
+ QTest::newRow("all but first") << INT_LIST(1 << 2 << 3 << 4) << emptyList;
+ QTest::newRow("all but last") << INT_LIST(0 << 1 << 2 << 3) << emptyList;
+ QTest::newRow("all but middle") << INT_LIST(0 << 1 << 3 << 4) << emptyList;
+
+ // Hide columns
+ QTest::newRow("first") << emptyList << INT_LIST(0);
+ QTest::newRow("middle 1") << emptyList << INT_LIST(1);
+ QTest::newRow("middle 3") << emptyList << INT_LIST(3);
+ QTest::newRow("last") << emptyList << INT_LIST(4);
+
+ QTest::newRow("subsequent 0,1") << emptyList << INT_LIST(0 << 1);
+ QTest::newRow("subsequent 1,2") << emptyList << INT_LIST(1 << 2);
+ QTest::newRow("subsequent 3,4") << emptyList << INT_LIST(3 << 4);
+
+ QTest::newRow("all but first") << emptyList << INT_LIST(1 << 2 << 3 << 4);
+ QTest::newRow("all but last") << emptyList << INT_LIST(0 << 1 << 2 << 3);
+ QTest::newRow("all but middle") << emptyList << INT_LIST(0 << 1 << 3 << 4);
+
+ // Hide both rows and columns at the same time
+ QTest::newRow("first") << INT_LIST(0) << INT_LIST(0);
+ QTest::newRow("middle 1") << INT_LIST(1) << INT_LIST(1);
+ QTest::newRow("middle 3") << INT_LIST(3) << INT_LIST(3);
+ QTest::newRow("last") << INT_LIST(4) << INT_LIST(4);
+
+ QTest::newRow("subsequent 0,1") << INT_LIST(0 << 1) << INT_LIST(0 << 1);
+ QTest::newRow("subsequent 1,2") << INT_LIST(1 << 2) << INT_LIST(1 << 2);
+ QTest::newRow("subsequent 3,4") << INT_LIST(3 << 4) << INT_LIST(3 << 4);
+
+ QTest::newRow("all but first") << INT_LIST(1 << 2 << 3 << 4) << INT_LIST(1 << 2 << 3 << 4);
+ QTest::newRow("all but last") << INT_LIST(0 << 1 << 2 << 3) << INT_LIST(0 << 1 << 2 << 3);
+ QTest::newRow("all but middle") << INT_LIST(0 << 1 << 3 << 4) << INT_LIST(0 << 1 << 3 << 4);
+
+ // Hide all rows and columns
+ QTest::newRow("all") << INT_LIST(0 << 1 << 2 << 3 << 4) << INT_LIST(0 << 1 << 2 << 3 << 4);
+}
+
+void tst_QQuickTableView::hideRowsAndColumns()
+{
+ // Check that you can hide the first row (corner case)
+ // and that we load the other columns as expected.
+ QFETCH(QVariant, rowsToHide);
+ QFETCH(QVariant, columnsToHide);
+ LOAD_TABLEVIEW("hiderowsandcolumns.qml");
+
+ const QList<int> rowsToHideList = qvariant_cast<QList<int>>(rowsToHide);
+ const QList<int> columnsToHideList = qvariant_cast<QList<int>>(columnsToHide);
+ const int modelSize = 5;
+ auto model = TestModelAsVariant(modelSize, modelSize);
+ view->rootObject()->setProperty("rowsToHide", rowsToHide);
+ view->rootObject()->setProperty("columnsToHide", columnsToHide);
+
+ tableView->setModel(model);
+
+ WAIT_UNTIL_POLISHED;
+
+ const int expectedRowCount = modelSize - rowsToHideList.count();
+ const int expectedColumnCount = modelSize - columnsToHideList.count();
+ QCOMPARE(tableViewPrivate->loadedRows.count(), expectedRowCount);
+ QCOMPARE(tableViewPrivate->loadedColumns.count(), expectedColumnCount);
+
+ for (const int row : tableViewPrivate->loadedRows.keys())
+ QVERIFY(!rowsToHideList.contains(row));
+
+ for (const int column : tableViewPrivate->loadedColumns.keys())
+ QVERIFY(!columnsToHideList.contains(column));
+}
+
QTEST_MAIN(tst_QQuickTableView)
#include "tst_qquicktableview.moc"
diff --git a/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp b/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp
index f32da44daa..ce2a8eb257 100644
--- a/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp
+++ b/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp
@@ -1262,6 +1262,34 @@ void tst_qquicktextedit::persistentSelection()
edit->setFocus(true);
QCOMPARE(edit->property("selected").toString(), QLatin1String("ell"));
+ // QTBUG-50587 (persistentSelection with readOnly)
+ edit->setReadOnly(true);
+
+ edit->setPersistentSelection(false);
+ QCOMPARE(edit->persistentSelection(), false);
+ QCOMPARE(spy.count(), 2);
+
+ edit->select(1, 4);
+ QCOMPARE(edit->property("selected").toString(), QLatin1String("ell"));
+
+ edit->setFocus(false);
+ QCOMPARE(edit->property("selected").toString(), QString());
+
+ edit->setFocus(true);
+ QCOMPARE(edit->property("selected").toString(), QString());
+
+ edit->setPersistentSelection(true);
+ QCOMPARE(edit->persistentSelection(), true);
+ QCOMPARE(spy.count(), 3);
+
+ edit->select(1, 4);
+ QCOMPARE(edit->property("selected").toString(), QLatin1String("ell"));
+
+ edit->setFocus(false);
+ QCOMPARE(edit->property("selected").toString(), QLatin1String("ell"));
+
+ edit->setFocus(true);
+ QCOMPARE(edit->property("selected").toString(), QLatin1String("ell"));
}
void tst_qquicktextedit::selectionOnFocusOut()
diff --git a/tests/auto/quick/qquicktextinput/BLACKLIST b/tests/auto/quick/qquicktextinput/BLACKLIST
deleted file mode 100644
index e9f4f11c58..0000000000
--- a/tests/auto/quick/qquicktextinput/BLACKLIST
+++ /dev/null
@@ -1,3 +0,0 @@
-# QTBUG-41895
-[tripleClickSelectsAll]
-windows
diff --git a/tests/auto/quick/qquickvisualdatamodel/data/externalManagedModel.qml b/tests/auto/quick/qquickvisualdatamodel/data/externalManagedModel.qml
new file mode 100644
index 0000000000..44c157b824
--- /dev/null
+++ b/tests/auto/quick/qquickvisualdatamodel/data/externalManagedModel.qml
@@ -0,0 +1,65 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the tests of the QtQuick module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick.Window 2.2
+import QtQuick 2.6
+import QtQml.Models 2.11
+import example 1.0
+
+Window {
+ visible: true
+ property bool running: rebuildTimer.running
+ ListView {
+ anchors.fill: parent
+ model: delegateModel
+ }
+
+ DelegateModel {
+ id: delegateModel
+ model: objectsProvider.objects
+ delegate: Item {}
+ }
+
+ Timer {
+ id: rebuildTimer
+ running: true
+ repeat: true
+ interval: 1
+
+ property int count: 0
+ onTriggered: {
+ objectsProvider.rebuild();
+ if (++count === 10)
+ running = false;
+ }
+ }
+
+ ObjectsProvider {
+ id: objectsProvider
+ }
+}
diff --git a/tests/auto/quick/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp b/tests/auto/quick/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp
index 1b8654ecdd..fac8283e2c 100644
--- a/tests/auto/quick/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp
+++ b/tests/auto/quick/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp
@@ -431,6 +431,7 @@ private slots:
void asynchronousMove_data();
void asynchronousCancel();
void invalidContext();
+ void externalManagedModel();
private:
template <int N> void groups_verify(
@@ -4234,6 +4235,73 @@ void tst_qquickvisualdatamodel::invalidContext()
QVERIFY(!item);
}
+class ObjectsProvider : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(QQmlListProperty<QObject> objects READ objects NOTIFY objectsChanged)
+
+public:
+ explicit ObjectsProvider(QObject *parent = nullptr) : QObject(parent) {}
+
+ Q_INVOKABLE void rebuild()
+ {
+ for (auto old: m_objects)
+ old->deleteLater();
+
+ m_objects.clear();
+ emit objectsChanged();
+
+ const int size = std::rand() & 0xff;
+ for (int i = 0; i < size; ++i) {
+ auto newElement = new QObject(this);
+ QQmlEngine::setObjectOwnership(newElement, QQmlEngine::CppOwnership);
+ m_objects.push_back(newElement);
+ }
+ emit objectsChanged();
+ }
+
+ Q_INVOKABLE QQmlListProperty<QObject> objects()
+ {
+ return QQmlListProperty<QObject>(this, nullptr, &ObjectsProvider::listLength,
+ &ObjectsProvider::listAt);
+ }
+
+ static int listLength(QQmlListProperty<QObject> *property)
+ {
+ auto objectsProvider = qobject_cast<ObjectsProvider*>(property->object);
+ return objectsProvider ? objectsProvider->m_objects.length() : 0;
+ }
+
+ static QObject* listAt(QQmlListProperty<QObject> *property, int index)
+ {
+ auto objectsProvider = qobject_cast<ObjectsProvider*>(property->object);
+ return objectsProvider ? objectsProvider->m_objects.at(index) : nullptr;
+ }
+
+signals:
+ void objectsChanged();
+
+private:
+ QList<QObject *> m_objects;
+};
+
+void tst_qquickvisualdatamodel::externalManagedModel()
+{
+ qmlRegisterType<ObjectsProvider>("example", 1, 0, "ObjectsProvider");
+
+ QQmlEngine engine;
+ QQmlComponent component(&engine, testFileUrl("externalManagedModel.qml"));
+ QVERIFY(component.isReady());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(!object.isNull());
+
+ QVERIFY(object->property("running").toBool());
+
+ // Make sure it runs to completion without crashing.
+ QTRY_VERIFY(!object->property("running").toBool());
+}
+
QTEST_MAIN(tst_qquickvisualdatamodel)
#include "tst_qquickvisualdatamodel.moc"
diff --git a/tests/auto/quick/shared/viewtestutil.cpp b/tests/auto/quick/shared/viewtestutil.cpp
index 3bfa23173e..5631ffe047 100644
--- a/tests/auto/quick/shared/viewtestutil.cpp
+++ b/tests/auto/quick/shared/viewtestutil.cpp
@@ -38,6 +38,7 @@
#include <private/qquickwindow_p.h>
#include <private/qquickitemview_p_p.h>
+QT_BEGIN_NAMESPACE
QQuickView *QQuickViewTestUtil::createView()
{
@@ -451,3 +452,32 @@ namespace QQuickTouchUtils {
}
}
+
+namespace QQuickTest {
+ // Initialize view, set Url, center in available geometry, move mouse away if desired
+ bool initView(QQuickView &v, const QUrl &url, bool moveMouseOut, QByteArray *errorMessage)
+ {
+ v.setBaseSize(QSize(240,320));
+ v.setSource(url);
+ while (v.status() == QQuickView::Loading)
+ QTest::qWait(10);
+ if (v.status() != QQuickView::Ready) {
+ foreach (const QQmlError &e, v.errors())
+ errorMessage->append(e.toString().toLocal8Bit() + '\n');
+ return false;
+ }
+ const QRect screenGeometry = v.screen()->availableGeometry();
+ const QSize size = v.size();
+ const QPoint offset = QPoint(size.width() / 2, size.height() / 2);
+ v.setFramePosition(screenGeometry.center() - offset);
+ #if QT_CONFIG(cursor) // Get the cursor out of the way.
+ if (moveMouseOut)
+ QCursor::setPos(v.geometry().topRight() + QPoint(100, 100));
+ #else
+ Q_UNUSED(moveMouseOut)
+ #endif
+ return true;
+ }
+}
+
+QT_END_NAMESPACE
diff --git a/tests/auto/quick/shared/viewtestutil.h b/tests/auto/quick/shared/viewtestutil.h
index 04e1771ef8..5e725fdf11 100644
--- a/tests/auto/quick/shared/viewtestutil.h
+++ b/tests/auto/quick/shared/viewtestutil.h
@@ -37,6 +37,8 @@ QT_FORWARD_DECLARE_CLASS(QQuickView)
QT_FORWARD_DECLARE_CLASS(QQuickItemViewPrivate)
QT_FORWARD_DECLARE_CLASS(FxViewItem)
+QT_BEGIN_NAMESPACE
+
namespace QQuickViewTestUtil
{
QQuickView *createView();
@@ -185,6 +187,12 @@ namespace QQuickTouchUtils {
void flush(QQuickWindow *window);
}
+namespace QQuickTest {
+ bool initView(QQuickView &v, const QUrl &url, bool moveMouseOut, QByteArray *errorMessage);
+}
+
+QT_END_NAMESPACE
+
Q_DECLARE_METATYPE(QQuickViewTestUtil::QaimModel*)
Q_DECLARE_METATYPE(QQuickViewTestUtil::ListChange)
Q_DECLARE_METATYPE(QList<QQuickViewTestUtil::ListChange>)
diff --git a/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_borders_exceed_height.qml b/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_borders_exceed_height.qml
index c4321d25bb..1e2885baed 100644
--- a/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_borders_exceed_height.qml
+++ b/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_borders_exceed_height.qml
@@ -4,7 +4,7 @@ Rectangle {
width: 320
height: 480
- color: "red"
+ color: "#C0FEFE"
Item {
x: 80
diff --git a/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_borders_exceed_width.qml b/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_borders_exceed_width.qml
index 328ff40008..437f10dd97 100644
--- a/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_borders_exceed_width.qml
+++ b/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_borders_exceed_width.qml
@@ -4,7 +4,7 @@ Rectangle {
width: 320
height: 480
- color: "red"
+ color: "#C0FEFE"
Item {
x: 80
diff --git a/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_smoothed.qml b/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_smoothed.qml
index 804567cf19..12c600c4af 100644
--- a/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_smoothed.qml
+++ b/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_smoothed.qml
@@ -4,7 +4,7 @@ Rectangle {
width: 320
height: 480
- color: "red"
+ color: "#C0FEFE"
Item {
x: 80
diff --git a/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed.qml b/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed.qml
index b10554ad66..c3d4e5b018 100644
--- a/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed.qml
+++ b/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed.qml
@@ -4,7 +4,7 @@ Rectangle {
width: 320
height: 480
- color: "red"
+ color: "#C0FEFE"
Item {
x: 80
diff --git a/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_border_overlap.qml b/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_border_overlap.qml
index 73cc53ed2b..5d645902ec 100644
--- a/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_border_overlap.qml
+++ b/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_border_overlap.qml
@@ -4,7 +4,7 @@ Rectangle {
width: 320
height: 480
- color: "red"
+ color: "#C0FEFE"
Item {
x: 80
diff --git a/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_negative_borders.qml b/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_negative_borders.qml
index 8356f02614..153b77d642 100644
--- a/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_negative_borders.qml
+++ b/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_negative_borders.qml
@@ -4,7 +4,7 @@ Rectangle {
width: 320
height: 480
- color: "red"
+ color: "#C0FEFE"
Item {
x: 80
diff --git a/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_borders.qml b/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_borders.qml
index 9213589648..687a54ee80 100644
--- a/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_borders.qml
+++ b/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_borders.qml
@@ -4,7 +4,7 @@ Rectangle {
width: 320
height: 480
- color: "red"
+ color: "#C0FEFE"
Item {
x: 80
diff --git a/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_bottom.qml b/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_bottom.qml
index 615abdee20..70bd5c0f14 100644
--- a/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_bottom.qml
+++ b/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_bottom.qml
@@ -4,7 +4,7 @@ Rectangle {
width: 320
height: 480
- color: "red"
+ color: "#C0FEFE"
Item {
x: 80
diff --git a/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_center.qml b/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_center.qml
index 58ed4d44dc..98d2b867b8 100644
--- a/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_center.qml
+++ b/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_center.qml
@@ -4,7 +4,7 @@ Rectangle {
width: 320
height: 480
- color: "red"
+ color: "#C0FEFE"
Item {
x: 80
diff --git a/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_left.qml b/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_left.qml
index 7e0045bf24..64cd9d30cc 100644
--- a/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_left.qml
+++ b/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_left.qml
@@ -4,7 +4,7 @@ Rectangle {
width: 320
height: 480
- color: "red"
+ color: "#C0FEFE"
Item {
x: 80
diff --git a/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_right.qml b/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_right.qml
index 04c2d021f0..6d63475cfd 100644
--- a/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_right.qml
+++ b/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_right.qml
@@ -4,7 +4,7 @@ Rectangle {
width: 320
height: 480
- color: "red"
+ color: "#C0FEFE"
Item {
x: 80
diff --git a/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_right_left.qml b/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_right_left.qml
index 5210bab321..6d2193633a 100644
--- a/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_right_left.qml
+++ b/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_right_left.qml
@@ -4,7 +4,7 @@ Rectangle {
width: 320
height: 480
- color: "red"
+ color: "#C0FEFE"
Item {
x: 80
diff --git a/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_top.qml b/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_top.qml
index 2e89496c92..c3c8dfb7f4 100644
--- a/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_top.qml
+++ b/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_top.qml
@@ -4,7 +4,7 @@ Rectangle {
width: 320
height: 480
- color: "red"
+ color: "#C0FEFE"
Item {
x: 80
diff --git a/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_top_bottom.qml b/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_top_bottom.qml
index 4388601f13..a32827cfc3 100644
--- a/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_top_bottom.qml
+++ b/tests/manual/scenegraph_lancelot/data/borderimages/borderimage_rotated_unsmoothed_no_top_bottom.qml
@@ -4,7 +4,7 @@ Rectangle {
width: 320
height: 480
- color: "red"
+ color: "#C0FEFE"
Item {
x: 80