diff options
Diffstat (limited to 'tests')
80 files changed, 2229 insertions, 2246 deletions
diff --git a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs.pro b/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs.pro index 8fef435d98..acd5546a02 100644 --- a/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs.pro +++ b/tests/auto/qml/debugger/qqmldebugjs/qqmldebugjs.pro @@ -1,13 +1,12 @@ CONFIG += testcase TARGET = tst_qqmldebugjs -QT += qml testlib gui-private core-private +QT += testlib gui-private core-private macos:CONFIG -= app_bundle SOURCES += tst_qqmldebugjs.cpp INCLUDEPATH += ../shared include(../shared/debugutil.pri) -include(../shared/qqmlenginedebugclient.pri) TESTDATA = data/* diff --git a/tests/auto/qml/debugger/qqmldebugjs/tst_qqmldebugjs.cpp b/tests/auto/qml/debugger/qqmldebugjs/tst_qqmldebugjs.cpp index 1202cddc05..1ac28c473b 100644 --- a/tests/auto/qml/debugger/qqmldebugjs/tst_qqmldebugjs.cpp +++ b/tests/auto/qml/debugger/qqmldebugjs/tst_qqmldebugjs.cpp @@ -28,10 +28,10 @@ #include "debugutil_p.h" #include "qqmldebugprocess_p.h" -#include "../shared/qqmlenginedebugclient.h" #include "../../../shared/util.h" -#include <private/qqmldebugclient_p.h> +#include <private/qqmlenginedebugclient_p.h> +#include <private/qv4debugclient_p.h> #include <private/qqmldebugconnection_p.h> #include <private/qpacket_p.h> @@ -43,72 +43,8 @@ #include <QtCore/qdir.h> #include <QtCore/qmutex.h> #include <QtCore/qlibraryinfo.h> -#include <QtQml/qjsengine.h> - -const char *V8REQUEST = "v8request"; -const char *V8MESSAGE = "v8message"; -const char *SEQ = "seq"; -const char *TYPE = "type"; -const char *COMMAND = "command"; -const char *ARGUMENTS = "arguments"; -const char *STEPACTION = "stepaction"; -const char *STEPCOUNT = "stepcount"; -const char *EXPRESSION = "expression"; -const char *FRAME = "frame"; -const char *CONTEXT = "context"; -const char *GLOBAL = "global"; -const char *DISABLEBREAK = "disable_break"; -const char *HANDLES = "handles"; -const char *INCLUDESOURCE = "includeSource"; -const char *FROMFRAME = "fromFrame"; -const char *TOFRAME = "toFrame"; -const char *BOTTOM = "bottom"; -const char *NUMBER = "number"; -const char *FRAMENUMBER = "frameNumber"; -const char *TYPES = "types"; -const char *IDS = "ids"; -const char *FILTER = "filter"; -const char *FROMLINE = "fromLine"; -const char *TOLINE = "toLine"; -const char *TARGET = "target"; -const char *LINE = "line"; -const char *COLUMN = "column"; -const char *ENABLED = "enabled"; -const char *CONDITION = "condition"; -const char *IGNORECOUNT = "ignoreCount"; -const char *BREAKPOINT = "breakpoint"; -const char *FLAGS = "flags"; - -const char *CONTINEDEBUGGING = "continue"; -const char *EVALUATE = "evaluate"; -const char *LOOKUP = "lookup"; -const char *BACKTRACE = "backtrace"; -const char *SCOPE = "scope"; -const char *SCOPES = "scopes"; -const char *SCRIPTS = "scripts"; -const char *SOURCE = "source"; -const char *SETBREAKPOINT = "setbreakpoint"; -const char *CLEARBREAKPOINT = "clearbreakpoint"; -const char *CHANGEBREAKPOINT = "changebreakpoint"; -const char *SETEXCEPTIONBREAK = "setexceptionbreak"; -const char *VERSION = "version"; -const char *DISCONNECT = "disconnect"; -const char *GARBAGECOLLECTOR = "gc"; - -const char *CONNECT = "connect"; -const char *INTERRUPT = "interrupt"; - -const char *REQUEST = "request"; -const char *IN = "in"; -const char *NEXT = "next"; -const char *OUT = "out"; - -const char *SCRIPT = "script"; -const char *SCRIPTREGEXP = "scriptRegExp"; -const char *EVENT = "event"; - -const char *ALL = "all"; -const char *UNCAUGHT = "uncaught"; +#include <QtCore/qjsonobject.h> +#include <QtCore/qjsonarray.h> const char *BLOCKMODE = "-qmljsdebugger=port:3771,3800,block"; const char *NORMALMODE = "-qmljsdebugger=port:3771,3800"; @@ -129,13 +65,6 @@ const char *BREAKPOINTRELOCATION_QMLFILE = "breakpointRelocation.qml"; const char *ENCODEQMLSCOPE_QMLFILE = "encodeQmlScope.qml"; const char *BREAKONANCHOR_QMLFILE = "breakOnAnchor.qml"; -#define VARIANTMAPINIT \ - QString obj("{}"); \ - QJSValue jsonVal = parser.call(QJSValueList() << obj); \ - jsonVal.setProperty(SEQ,QJSValue(seq++)); \ - jsonVal.setProperty(TYPE,REQUEST); - - #undef QVERIFY #define QVERIFY(statement) \ do {\ @@ -146,9 +75,6 @@ do {\ }\ } while (0) - -class QJSDebugClient; - class tst_QQmlDebugJS : public QQmlDebugTest { Q_OBJECT @@ -231,7 +157,7 @@ private: ConnectResult init(bool qmlscene, const QString &qmlFile = QString(TEST_QMLFILE), bool blockMode = true, bool restrictServices = false); QList<QQmlDebugClient *> createClients() override; - QPointer<QJSDebugClient> m_client; + QPointer<QV4DebugClient> m_client; void targetData(); bool waitForClientSignal(const char *signal, int timeout = 30000); @@ -240,555 +166,7 @@ private: QTime t; }; -class QJSDebugClient : public QQmlDebugClient -{ - Q_OBJECT -public: - enum StepAction - { - Continue, - In, - Out, - Next - }; - - enum Exception - { - All, - Uncaught - }; - - QJSDebugClient(QQmlDebugConnection *connection) - : QQmlDebugClient(QLatin1String("V8Debugger"), connection), - seq(0) - { - parser = jsEngine.evaluate(QLatin1String("JSON.parse")); - stringify = jsEngine.evaluate(QLatin1String("JSON.stringify")); - QObject::connect(this, &QQmlDebugClient::stateChanged, - this, &QJSDebugClient::onStateChanged); - } - - void connect(); - void interrupt(); - - void continueDebugging(StepAction stepAction); - void evaluate(QString expr, int frame = -1, int context = -1); - void lookup(QList<int> handles, bool includeSource = false); - void backtrace(int fromFrame = -1, int toFrame = -1, bool bottom = false); - void frame(int number = -1); - void scope(int number = -1, int frameNumber = -1); - void scripts(int types = 4, QList<int> ids = QList<int>(), bool includeSource = false, QVariant filter = QVariant()); - void setBreakpoint(QString target, int line = -1, int column = -1, bool enabled = true, - QString condition = QString(), int ignoreCount = -1); - void clearBreakpoint(int breakpoint); - void changeBreakpoint(int breakpoint, bool enabled); - void setExceptionBreak(Exception type, bool enabled = false); - void version(); - void disconnect(); - -protected: - //inherited from QQmlDebugClient - void onStateChanged(State state); - void messageReceived(const QByteArray &data); - -signals: - void connected(); - void interruptRequested(); - void result(); - void failure(); - void stopped(); - -private: - void sendMessage(const QByteArray &); - void flushSendBuffer(); - QByteArray packMessage(const QByteArray &type, const QByteArray &message = QByteArray()); - -private: - QJSEngine jsEngine; - int seq; - - QList<QByteArray> sendBuffer; -public: - QJSValue parser; - QJSValue stringify; - QByteArray response; - -}; - -void QJSDebugClient::connect() -{ - const QJSValue jsonVal = parser.call(QJSValueList() << QLatin1String("{}")); - sendMessage(packMessage(CONNECT, - stringify.call(QJSValueList() << jsonVal).toString().toUtf8())); -} - -void QJSDebugClient::interrupt() -{ - sendMessage(packMessage(INTERRUPT)); -} - -void QJSDebugClient::continueDebugging(StepAction action) -{ - // { "seq" : <number>, - // "type" : "request", - // "command" : "continue", - // "arguments" : { "stepaction" : <"in", "next" or "out">, - // "stepcount" : <number of steps (default 1)> - // } - // } - VARIANTMAPINIT; - jsonVal.setProperty(QLatin1String(COMMAND),QJSValue(QLatin1String(CONTINEDEBUGGING))); - - if (action != Continue) { - QJSValue args = parser.call(QJSValueList() << obj); - switch (action) { - case In: args.setProperty(QLatin1String(STEPACTION),QJSValue(QLatin1String(IN))); - break; - case Out: args.setProperty(QLatin1String(STEPACTION),QJSValue(QLatin1String(OUT))); - break; - case Next: args.setProperty(QLatin1String(STEPACTION),QJSValue(QLatin1String(NEXT))); - break; - default:break; - } - if (!args.isUndefined()) { - jsonVal.setProperty(QLatin1String(ARGUMENTS),args); - } - } - QJSValue json = stringify.call(QJSValueList() << jsonVal); - sendMessage(packMessage(V8REQUEST, json.toString().toUtf8())); -} - -void QJSDebugClient::evaluate(QString expr, int frame, int context) -{ - // { "seq" : <number>, - // "type" : "request", - // "command" : "evaluate", - // "arguments" : { "expression" : <expression to evaluate>, - // "frame" : <number>, - // "context" : <object ID> - // } - // } - VARIANTMAPINIT; - jsonVal.setProperty(QLatin1String(COMMAND),QJSValue(QLatin1String(EVALUATE))); - - QJSValue args = parser.call(QJSValueList() << obj); - args.setProperty(QLatin1String(EXPRESSION),QJSValue(expr)); - - if (frame != -1) - args.setProperty(QLatin1String(FRAME),QJSValue(frame)); - - if (context != -1) - args.setProperty(QLatin1String(CONTEXT), QJSValue(context)); - - if (!args.isUndefined()) { - jsonVal.setProperty(QLatin1String(ARGUMENTS),args); - } - - QJSValue json = stringify.call(QJSValueList() << jsonVal); - sendMessage(packMessage(V8REQUEST, json.toString().toUtf8())); -} - -void QJSDebugClient::lookup(QList<int> handles, bool includeSource) -{ - // { "seq" : <number>, - // "type" : "request", - // "command" : "lookup", - // "arguments" : { "handles" : <array of handles>, - // "includeSource" : <boolean indicating whether the source will be included when script objects are returned>, - // } - // } - VARIANTMAPINIT; - jsonVal.setProperty(QLatin1String(COMMAND),QJSValue(QLatin1String(LOOKUP))); - - QJSValue args = parser.call(QJSValueList() << obj); - - QString arr("[]"); - QJSValue array = parser.call(QJSValueList() << arr); - int index = 0; - foreach (int handle, handles) { - array.setProperty(index++,QJSValue(handle)); - } - args.setProperty(QLatin1String(HANDLES),array); - - if (includeSource) - args.setProperty(QLatin1String(INCLUDESOURCE),QJSValue(includeSource)); - - if (!args.isUndefined()) { - jsonVal.setProperty(QLatin1String(ARGUMENTS),args); - } - - QJSValue json = stringify.call(QJSValueList() << jsonVal); - sendMessage(packMessage(V8REQUEST, json.toString().toUtf8())); -} - -void QJSDebugClient::backtrace(int fromFrame, int toFrame, bool bottom) -{ - // { "seq" : <number>, - // "type" : "request", - // "command" : "backtrace", - // "arguments" : { "fromFrame" : <number> - // "toFrame" : <number> - // "bottom" : <boolean, set to true if the bottom of the stack is requested> - // } - // } - VARIANTMAPINIT; - jsonVal.setProperty(QLatin1String(COMMAND),QJSValue(QLatin1String(BACKTRACE))); - - QJSValue args = parser.call(QJSValueList() << obj); - - if (fromFrame != -1) - args.setProperty(QLatin1String(FROMFRAME),QJSValue(fromFrame)); - - if (toFrame != -1) - args.setProperty(QLatin1String(TOFRAME),QJSValue(toFrame)); - - if (bottom) - args.setProperty(QLatin1String(BOTTOM),QJSValue(bottom)); - - if (!args.isUndefined()) { - jsonVal.setProperty(QLatin1String(ARGUMENTS),args); - } - - QJSValue json = stringify.call(QJSValueList() << jsonVal); - sendMessage(packMessage(V8REQUEST, json.toString().toUtf8())); -} - -void QJSDebugClient::frame(int number) -{ - // { "seq" : <number>, - // "type" : "request", - // "command" : "frame", - // "arguments" : { "number" : <frame number> - // } - // } - VARIANTMAPINIT; - jsonVal.setProperty(QLatin1String(COMMAND),QJSValue(QLatin1String(FRAME))); - - if (number != -1) { - QJSValue args = parser.call(QJSValueList() << obj); - args.setProperty(QLatin1String(NUMBER),QJSValue(number)); - - if (!args.isUndefined()) { - jsonVal.setProperty(QLatin1String(ARGUMENTS),args); - } - } - - QJSValue json = stringify.call(QJSValueList() << jsonVal); - sendMessage(packMessage(V8REQUEST, json.toString().toUtf8())); -} - -void QJSDebugClient::scope(int number, int frameNumber) -{ - // { "seq" : <number>, - // "type" : "request", - // "command" : "scope", - // "arguments" : { "number" : <scope number> - // "frameNumber" : <frame number, optional uses selected frame if missing> - // } - // } - VARIANTMAPINIT; - jsonVal.setProperty(QLatin1String(COMMAND),QJSValue(QLatin1String(SCOPE))); - - if (number != -1) { - QJSValue args = parser.call(QJSValueList() << obj); - args.setProperty(QLatin1String(NUMBER),QJSValue(number)); - - if (frameNumber != -1) - args.setProperty(QLatin1String(FRAMENUMBER),QJSValue(frameNumber)); - - if (!args.isUndefined()) { - jsonVal.setProperty(QLatin1String(ARGUMENTS),args); - } - } - - QJSValue json = stringify.call(QJSValueList() << jsonVal); - sendMessage(packMessage(V8REQUEST, json.toString().toUtf8())); -} - -void QJSDebugClient::scripts(int types, QList<int> ids, bool includeSource, QVariant /*filter*/) -{ - // { "seq" : <number>, - // "type" : "request", - // "command" : "scripts", - // "arguments" : { "types" : <types of scripts to retrieve - // set bit 0 for native scripts - // set bit 1 for extension scripts - // set bit 2 for normal scripts - // (default is 4 for normal scripts)> - // "ids" : <array of id's of scripts to return. If this is not specified all scripts are requrned> - // "includeSource" : <boolean indicating whether the source code should be included for the scripts returned> - // "filter" : <string or number: filter string or script id. - // If a number is specified, then only the script with the same number as its script id will be retrieved. - // If a string is specified, then only scripts whose names contain the filter string will be retrieved.> - // } - // } - VARIANTMAPINIT; - jsonVal.setProperty(QLatin1String(COMMAND),QJSValue(QLatin1String(SCRIPTS))); - - QJSValue args = parser.call(QJSValueList() << obj); - args.setProperty(QLatin1String(TYPES),QJSValue(types)); - - if (ids.count()) { - QString arr("[]"); - QJSValue array = parser.call(QJSValueList() << arr); - int index = 0; - foreach (int id, ids) { - array.setProperty(index++,QJSValue(id)); - } - args.setProperty(QLatin1String(IDS),array); - } - - if (includeSource) - args.setProperty(QLatin1String(INCLUDESOURCE),QJSValue(includeSource)); - - if (!args.isUndefined()) { - jsonVal.setProperty(QLatin1String(ARGUMENTS),args); - } - - QJSValue json = stringify.call(QJSValueList() << jsonVal); - sendMessage(packMessage(V8REQUEST, json.toString().toUtf8())); -} - -void QJSDebugClient::setBreakpoint(QString target, int line, int column, bool enabled, - QString condition, int ignoreCount) -{ - // { "seq" : <number>, - // "type" : "request", - // "command" : "setbreakpoint", - // "arguments" : { "type" : "scriptRegExp" - // "target" : <function expression or script identification> - // "line" : <line in script or function> - // "column" : <character position within the line> - // "enabled" : <initial enabled state. True or false, default is true> - // "condition" : <string with break point condition> - // "ignoreCount" : <number specifying the number of break point hits to ignore, default value is 0> - // } - // } - - VARIANTMAPINIT; - jsonVal.setProperty(QLatin1String(COMMAND),QJSValue(QLatin1String(SETBREAKPOINT))); - - QJSValue args = parser.call(QJSValueList() << obj); - args.setProperty(QLatin1String(TYPE),QJSValue(QLatin1String(SCRIPTREGEXP))); - args.setProperty(QLatin1String(TARGET),QJSValue(target)); - - if (line != -1) - args.setProperty(QLatin1String(LINE),QJSValue(line)); - - if (column != -1) - args.setProperty(QLatin1String(COLUMN),QJSValue(column)); - - args.setProperty(QLatin1String(ENABLED),QJSValue(enabled)); - - if (!condition.isEmpty()) - args.setProperty(QLatin1String(CONDITION),QJSValue(condition)); - - if (ignoreCount != -1) - args.setProperty(QLatin1String(IGNORECOUNT),QJSValue(ignoreCount)); - - if (!args.isUndefined()) { - jsonVal.setProperty(QLatin1String(ARGUMENTS),args); - } - - QJSValue json = stringify.call(QJSValueList() << jsonVal); - sendMessage(packMessage(V8REQUEST, json.toString().toUtf8())); -} - -void QJSDebugClient::clearBreakpoint(int breakpoint) -{ - // { "seq" : <number>, - // "type" : "request", - // "command" : "clearbreakpoint", - // "arguments" : { "breakpoint" : <number of the break point to clear> - // } - // } - VARIANTMAPINIT; - jsonVal.setProperty(QLatin1String(COMMAND),QJSValue(QLatin1String(CLEARBREAKPOINT))); - - QJSValue args = parser.call(QJSValueList() << obj); - - args.setProperty(QLatin1String(BREAKPOINT),QJSValue(breakpoint)); - - if (!args.isUndefined()) { - jsonVal.setProperty(QLatin1String(ARGUMENTS),args); - } - - QJSValue json = stringify.call(QJSValueList() << jsonVal); - sendMessage(packMessage(V8REQUEST, json.toString().toUtf8())); -} - -void QJSDebugClient::changeBreakpoint(int breakpoint, bool enabled) -{ - // { "seq" : <number>, - // "type" : "request", - // "command" : "changebreakpoint", - // "arguments" : { "breakpoint" : <number of the break point to change> - // "enabled" : <bool: enables the break type if true, disables if false> - // } - // } - VARIANTMAPINIT; - jsonVal.setProperty(QLatin1String(COMMAND), QLatin1String(CHANGEBREAKPOINT)); - - QJSValue args = parser.call(QJSValueList() << obj); - - args.setProperty(QLatin1String(BREAKPOINT), breakpoint); - args.setProperty(QLatin1String(ENABLED), enabled); - jsonVal.setProperty(QLatin1String(ARGUMENTS), args); - - const QJSValue json = stringify.call(QJSValueList() << jsonVal); - sendMessage(packMessage(V8REQUEST, json.toString().toUtf8())); -} - -void QJSDebugClient::setExceptionBreak(Exception type, bool enabled) -{ - // { "seq" : <number>, - // "type" : "request", - // "command" : "setexceptionbreak", - // "arguments" : { "type" : <string: "all", or "uncaught">, - // "enabled" : <optional bool: enables the break type if true> - // } - // } - VARIANTMAPINIT; - jsonVal.setProperty(QLatin1String(COMMAND),QJSValue(QLatin1String(SETEXCEPTIONBREAK))); - - QJSValue args = parser.call(QJSValueList() << obj); - - if (type == All) - args.setProperty(QLatin1String(TYPE),QJSValue(QLatin1String(ALL))); - else if (type == Uncaught) - args.setProperty(QLatin1String(TYPE),QJSValue(QLatin1String(UNCAUGHT))); - - if (enabled) - args.setProperty(QLatin1String(ENABLED),QJSValue(enabled)); - - if (!args.isUndefined()) { - jsonVal.setProperty(QLatin1String(ARGUMENTS),args); - } - - QJSValue json = stringify.call(QJSValueList() << jsonVal); - sendMessage(packMessage(V8REQUEST, json.toString().toUtf8())); -} - -void QJSDebugClient::version() -{ - // { "seq" : <number>, - // "type" : "request", - // "command" : "version", - // } - VARIANTMAPINIT; - jsonVal.setProperty(QLatin1String(COMMAND),QJSValue(QLatin1String(VERSION))); - - QJSValue json = stringify.call(QJSValueList() << jsonVal); - sendMessage(packMessage(V8REQUEST, json.toString().toUtf8())); -} - -void QJSDebugClient::disconnect() -{ - // { "seq" : <number>, - // "type" : "request", - // "command" : "disconnect", - // } - VARIANTMAPINIT; - jsonVal.setProperty(QLatin1String(COMMAND),QJSValue(QLatin1String(DISCONNECT))); - - QJSValue json = stringify.call(QJSValueList() << jsonVal); - sendMessage(packMessage(DISCONNECT, json.toString().toUtf8())); -} - -void QJSDebugClient::onStateChanged(State state) -{ - if (state == Enabled) - flushSendBuffer(); -} - -void QJSDebugClient::messageReceived(const QByteArray &data) -{ - QPacket ds(connection()->currentDataStreamVersion(), data); - QByteArray command; - ds >> command; - - if (command == "V8DEBUG") { - QByteArray type; - ds >> type >> response; - - if (type == CONNECT) { - emit connected(); - - } else if (type == INTERRUPT) { - emit interruptRequested(); - - } else if (type == V8MESSAGE) { - QString jsonString(response); - QVariantMap value = parser.call(QJSValueList() << QJSValue(jsonString)).toVariant().toMap(); - QString type = value.value("type").toString(); - - if (type == "response") { - - if (!value.value("success").toBool()) { - emit failure(); - qDebug() << "Received success == false response from application:" - << value.value("message").toString(); - return; - } - - QString debugCommand(value.value("command").toString()); - if (debugCommand == "backtrace" || - debugCommand == "lookup" || - debugCommand == "setbreakpoint" || - debugCommand == "evaluate" || - debugCommand == "version" || - debugCommand == "disconnect" || - debugCommand == "gc" || - debugCommand == "changebreakpoint" || - debugCommand == "clearbreakpoint" || - debugCommand == "frame" || - debugCommand == "scope" || - debugCommand == "scopes" || - debugCommand == "scripts" || - debugCommand == "source" || - debugCommand == "setexceptionbreak" /*|| - debugCommand == "profile"*/) { - emit result(); - } else { - // DO NOTHING - } - - } else if (type == QLatin1String(EVENT)) { - QString event(value.value(QLatin1String(EVENT)).toString()); - - if (event == "break" || - event == "exception") - emit stopped(); - } - - } - } -} - -void QJSDebugClient::sendMessage(const QByteArray &msg) -{ - if (state() == Enabled) { - QQmlDebugClient::sendMessage(msg); - } else { - sendBuffer.append(msg); - } -} - -void QJSDebugClient::flushSendBuffer() -{ - foreach (const QByteArray &msg, sendBuffer) - QQmlDebugClient::sendMessage(msg); - sendBuffer.clear(); -} - -QByteArray QJSDebugClient::packMessage(const QByteArray &type, const QByteArray &message) -{ - QPacket rs(connection()->currentDataStreamVersion()); - QByteArray cmd = "V8DEBUG"; - rs << cmd << type << message; - return rs.data(); -} void tst_QQmlDebugJS::initTestCase() { @@ -842,7 +220,7 @@ void tst_QQmlDebugJS::interrupt() m_client->connect(); m_client->interrupt(); - QVERIFY(waitForClientSignal(SIGNAL(interruptRequested()))); + QVERIFY(waitForClientSignal(SIGNAL(interrupted()))); } void tst_QQmlDebugJS::getVersion() @@ -896,13 +274,11 @@ void tst_QQmlDebugJS::setBreakpointInScriptOnCompleted() m_client->connect(); QVERIFY(waitForClientSignal(SIGNAL(stopped()))); - QString jsonString(m_client->response); - QVariantMap value = m_client->parser.call(QJSValueList() << QJSValue(jsonString)).toVariant().toMap(); - - QVariantMap body = value.value("body").toMap(); + const QJsonObject body = m_client->response().body.toObject(); QCOMPARE(body.value("sourceLine").toInt(), sourceLine); - QCOMPARE(QFileInfo(body.value("script").toMap().value("name").toString()).fileName(), QLatin1String(ONCOMPLETED_QMLFILE)); + QCOMPARE(QFileInfo(body.value("script").toObject().value("name").toString()).fileName(), + QLatin1String(ONCOMPLETED_QMLFILE)); } void tst_QQmlDebugJS::setBreakpointInScriptOnComponentCreated() @@ -917,13 +293,11 @@ void tst_QQmlDebugJS::setBreakpointInScriptOnComponentCreated() m_client->connect(); QVERIFY(waitForClientSignal(SIGNAL(stopped()))); - QString jsonString(m_client->response); - QVariantMap value = m_client->parser.call(QJSValueList() << QJSValue(jsonString)).toVariant().toMap(); - - QVariantMap body = value.value("body").toMap(); + const QJsonObject body = m_client->response().body.toObject(); QCOMPARE(body.value("sourceLine").toInt(), sourceLine); - QCOMPARE(QFileInfo(body.value("script").toMap().value("name").toString()).fileName(), QLatin1String(ONCOMPLETED_QMLFILE)); + QCOMPARE(QFileInfo(body.value("script").toObject().value("name").toString()).fileName(), + QLatin1String(ONCOMPLETED_QMLFILE)); } void tst_QQmlDebugJS::setBreakpointInScriptOnTimerCallback() @@ -939,13 +313,11 @@ void tst_QQmlDebugJS::setBreakpointInScriptOnTimerCallback() m_client->setBreakpoint(QLatin1String(TIMER_QMLFILE), sourceLine, -1, true); QVERIFY(waitForClientSignal(SIGNAL(stopped()))); - QString jsonString(m_client->response); - QVariantMap value = m_client->parser.call(QJSValueList() << QJSValue(jsonString)).toVariant().toMap(); - - QVariantMap body = value.value("body").toMap(); + const QJsonObject body = m_client->response().body.toObject(); QCOMPARE(body.value("sourceLine").toInt(), sourceLine); - QCOMPARE(QFileInfo(body.value("script").toMap().value("name").toString()).fileName(), QLatin1String(TIMER_QMLFILE)); + QCOMPARE(QFileInfo(body.value("script").toObject().value("name").toString()).fileName(), + QLatin1String(TIMER_QMLFILE)); } void tst_QQmlDebugJS::setBreakpointInScriptInDifferentFile() @@ -960,13 +332,11 @@ void tst_QQmlDebugJS::setBreakpointInScriptInDifferentFile() m_client->connect(); QVERIFY(waitForClientSignal(SIGNAL(stopped()))); - QString jsonString(m_client->response); - QVariantMap value = m_client->parser.call(QJSValueList() << QJSValue(jsonString)).toVariant().toMap(); - - QVariantMap body = value.value("body").toMap(); + const QJsonObject body = m_client->response().body.toObject(); QCOMPARE(body.value("sourceLine").toInt(), sourceLine); - QCOMPARE(QFileInfo(body.value("script").toMap().value("name").toString()).fileName(), QLatin1String(TEST_JSFILE)); + QCOMPARE(QFileInfo(body.value("script").toObject().value("name").toString()).fileName(), + QLatin1String(TEST_JSFILE)); } void tst_QQmlDebugJS::setBreakpointInScriptOnComment() @@ -983,13 +353,11 @@ void tst_QQmlDebugJS::setBreakpointInScriptOnComment() QEXPECT_FAIL("", "Relocation of breakpoints is disabled right now", Abort); QVERIFY(waitForClientSignal(SIGNAL(stopped()), 1)); - QString jsonString(m_client->response); - QVariantMap value = m_client->parser.call(QJSValueList() << QJSValue(jsonString)).toVariant().toMap(); - - QVariantMap body = value.value("body").toMap(); + const QJsonObject body = m_client->response().body.toObject(); QCOMPARE(body.value("sourceLine").toInt(), actualLine); - QCOMPARE(QFileInfo(body.value("script").toMap().value("name").toString()).fileName(), QLatin1String(BREAKPOINTRELOCATION_QMLFILE)); + QCOMPARE(QFileInfo(body.value("script").toObject().value("name").toString()).fileName(), + QLatin1String(BREAKPOINTRELOCATION_QMLFILE)); } void tst_QQmlDebugJS::setBreakpointInScriptOnEmptyLine() @@ -1006,13 +374,11 @@ void tst_QQmlDebugJS::setBreakpointInScriptOnEmptyLine() QEXPECT_FAIL("", "Relocation of breakpoints is disabled right now", Abort); QVERIFY(waitForClientSignal(SIGNAL(stopped()), 1)); - QString jsonString(m_client->response); - QVariantMap value = m_client->parser.call(QJSValueList() << QJSValue(jsonString)).toVariant().toMap(); - - QVariantMap body = value.value("body").toMap(); + const QJsonObject body = m_client->response().body.toObject(); QCOMPARE(body.value("sourceLine").toInt(), actualLine); - QCOMPARE(QFileInfo(body.value("script").toMap().value("name").toString()).fileName(), QLatin1String(BREAKPOINTRELOCATION_QMLFILE)); + QCOMPARE(QFileInfo(body.value("script").toObject().value("name").toString()).fileName(), + QLatin1String(BREAKPOINTRELOCATION_QMLFILE)); } void tst_QQmlDebugJS::setBreakpointInScriptOnOptimizedBinding() @@ -1027,13 +393,11 @@ void tst_QQmlDebugJS::setBreakpointInScriptOnOptimizedBinding() m_client->connect(); QVERIFY(waitForClientSignal(SIGNAL(stopped()))); - QString jsonString(m_client->response); - QVariantMap value = m_client->parser.call(QJSValueList() << QJSValue(jsonString)).toVariant().toMap(); - - QVariantMap body = value.value("body").toMap(); + const QJsonObject body = m_client->response().body.toObject(); QCOMPARE(body.value("sourceLine").toInt(), sourceLine); - QCOMPARE(QFileInfo(body.value("script").toMap().value("name").toString()).fileName(), QLatin1String(BREAKPOINTRELOCATION_QMLFILE)); + QCOMPARE(QFileInfo(body.value("script").toObject().value("name").toString()).fileName(), + QLatin1String(BREAKPOINTRELOCATION_QMLFILE)); } void tst_QQmlDebugJS::setBreakpointInScriptWithCondition() @@ -1050,11 +414,8 @@ void tst_QQmlDebugJS::setBreakpointInScriptWithCondition() QVERIFY(waitForClientSignal(SIGNAL(stopped()))); //Get the frame index - QString jsonString = m_client->response; - QVariantMap value = m_client->parser.call(QJSValueList() << QJSValue(jsonString)).toVariant().toMap(); - { - QVariantMap body = value.value("body").toMap(); + const QJsonObject body = m_client->response().body.toObject(); int frameIndex = body.value("index").toInt(); //Verify the value of 'result' @@ -1062,13 +423,10 @@ void tst_QQmlDebugJS::setBreakpointInScriptWithCondition() QVERIFY(waitForClientSignal(SIGNAL(result()))); } - jsonString = m_client->response; - QJSValue val = m_client->parser.call(QJSValueList() << QJSValue(jsonString)); - QVERIFY(val.isObject()); - QJSValue body = val.property(QStringLiteral("body")); - QVERIFY(body.isObject()); - val = body.property("value"); - QVERIFY(val.isNumber()); + const QJsonObject body = m_client->response().body.toObject(); + QVERIFY(!body.isEmpty()); + QJsonValue val = body.value("value"); + QVERIFY(val.isDouble()); const int a = val.toInt(); QVERIFY(a > out); @@ -1086,15 +444,12 @@ void tst_QQmlDebugJS::setBreakpointInScriptThatQuits() m_client->connect(); QVERIFY(waitForClientSignal(SIGNAL(stopped()))); - QString jsonString(m_client->response); - QVariantMap value = m_client->parser.call(QJSValueList() << QJSValue(jsonString)).toVariant().toMap(); - - QVariantMap body = value.value("body").toMap(); + const QJsonObject body = m_client->response().body.toObject(); QCOMPARE(body.value("sourceLine").toInt(), sourceLine); - QCOMPARE(QFileInfo(body.value("script").toMap().value("name").toString()).fileName(), QLatin1String(QUIT_QMLFILE)); + QCOMPARE(QFileInfo(body.value("script").toObject().value("name").toString()).fileName(), QLatin1String(QUIT_QMLFILE)); - m_client->continueDebugging(QJSDebugClient::Continue); + m_client->continueDebugging(QV4DebugClient::Continue); QVERIFY(m_process->waitForFinished()); QCOMPARE(m_process->exitStatus(), QProcess::NormalExit); } @@ -1134,34 +489,32 @@ void tst_QQmlDebugJS::clearBreakpoint() QVERIFY(waitForClientSignal(SIGNAL(stopped()))); - //Will hit 1st brakpoint, change this breakpoint enable = false - QString jsonString(m_client->response); - QVariantMap value = m_client->parser.call(QJSValueList() << QJSValue(jsonString)).toVariant().toMap(); + { + //Will hit 1st brakpoint, change this breakpoint enable = false + const QJsonObject body = m_client->response().body.toObject(); + const QJsonArray breakpointsHit = body.value("breakpoints").toArray(); - QVariantMap body = value.value("body").toMap(); - QList<QVariant> breakpointsHit = body.value("breakpoints").toList(); + int breakpoint = breakpointsHit.at(0).toInt(); + m_client->clearBreakpoint(breakpoint); - int breakpoint = breakpointsHit.at(0).toInt(); - m_client->clearBreakpoint(breakpoint); + QVERIFY(waitForClientSignal(SIGNAL(result()))); - QVERIFY(waitForClientSignal(SIGNAL(result()))); + //Continue with debugging + m_client->continueDebugging(QV4DebugClient::Continue); + //Hit 2nd breakpoint + QVERIFY(waitForClientSignal(SIGNAL(stopped()))); - //Continue with debugging - m_client->continueDebugging(QJSDebugClient::Continue); - //Hit 2nd breakpoint - QVERIFY(waitForClientSignal(SIGNAL(stopped()))); + //Continue with debugging + m_client->continueDebugging(QV4DebugClient::Continue); + } - //Continue with debugging - m_client->continueDebugging(QJSDebugClient::Continue); //Should stop at 2nd breakpoint QVERIFY(waitForClientSignal(SIGNAL(stopped()))); - jsonString = m_client->response; - value = m_client->parser.call(QJSValueList() << QJSValue(jsonString)).toVariant().toMap(); - - body = value.value("body").toMap(); - - QCOMPARE(body.value("sourceLine").toInt(), sourceLine2); + { + const QJsonObject body = m_client->response().body.toObject(); + QCOMPARE(body.value("sourceLine").toInt(), sourceLine2); + } } void tst_QQmlDebugJS::changeBreakpoint() @@ -1174,23 +527,21 @@ void tst_QQmlDebugJS::changeBreakpoint() QCOMPARE(init(qmlscene, CHANGEBREAKPOINT_QMLFILE), ConnectSuccess); bool isStopped = false; - QObject::connect(m_client.data(), &QJSDebugClient::stopped, this, [&]() { isStopped = true; }); + QObject::connect(m_client.data(), &QV4DebugClient::stopped, this, [&]() { isStopped = true; }); auto continueDebugging = [&]() { - m_client->continueDebugging(QJSDebugClient::Continue); + m_client->continueDebugging(QV4DebugClient::Continue); isStopped = false; }; m_client->connect(); auto extractBody = [&]() { - const QVariantMap value = m_client->parser.call( - QJSValueList() << QJSValue(QString(m_client->response))).toVariant().toMap(); - return value.value("body").toMap(); + return m_client->response().body.toObject(); }; - auto extractBreakPointId = [&](const QVariantMap &body) { - const QList<QVariant> breakpointsHit = body.value("breakpoints").toList(); + auto extractBreakPointId = [&](const QJsonObject &body) { + const QJsonArray breakpointsHit = body.value("breakpoints").toArray(); if (breakpointsHit.size() != 1) return -1; return breakpointsHit[0].toInt(); @@ -1198,7 +549,7 @@ void tst_QQmlDebugJS::changeBreakpoint() auto setBreakPoint = [&](int sourceLine, bool enabled) { int id = -1; - auto connection = QObject::connect(m_client.data(), &QJSDebugClient::result, [&]() { + auto connection = QObject::connect(m_client.data(), &QV4DebugClient::result, [&]() { id = extractBody().value("breakpoint").toInt(); }); @@ -1221,7 +572,7 @@ void tst_QQmlDebugJS::changeBreakpoint() auto verifyBreakpoint = [&](int sourceLine, int breakpointId) { QTRY_VERIFY_WITH_TIMEOUT(isStopped, 30000); - const QVariantMap body = extractBody(); + const QJsonObject body = extractBody(); QCOMPARE(body.value("sourceLine").toInt(), sourceLine); QCOMPARE(extractBreakPointId(body), breakpointId); }; @@ -1261,7 +612,7 @@ void tst_QQmlDebugJS::setExceptionBreak() QFETCH(bool, qmlscene); QCOMPARE(init(qmlscene, EXCEPTION_QMLFILE), ConnectSuccess); - m_client->setExceptionBreak(QJSDebugClient::All,true); + m_client->setExceptionBreak(QV4DebugClient::All,true); m_client->connect(); QVERIFY(waitForClientSignal(SIGNAL(stopped()))); } @@ -1278,24 +629,19 @@ void tst_QQmlDebugJS::stepNext() m_client->connect(); QVERIFY(waitForClientSignal(SIGNAL(stopped()))); - m_client->continueDebugging(QJSDebugClient::Next); + m_client->continueDebugging(QV4DebugClient::Next); QVERIFY(waitForClientSignal(SIGNAL(stopped()))); - QString jsonString(m_client->response); - QVariantMap value = m_client->parser.call(QJSValueList() << QJSValue(jsonString)).toVariant().toMap(); - - QVariantMap body = value.value("body").toMap(); + const QJsonObject body = m_client->response().body.toObject(); QCOMPARE(body.value("sourceLine").toInt(), sourceLine + 1); - QCOMPARE(QFileInfo(body.value("script").toMap().value("name").toString()).fileName(), QLatin1String(STEPACTION_QMLFILE)); + QCOMPARE(QFileInfo(body.value("script").toObject().value("name").toString()).fileName(), + QLatin1String(STEPACTION_QMLFILE)); } -static QVariantMap responseBody(QJSDebugClient *client) +static QJsonObject responseBody(QV4DebugClient *client) { - const QString jsonString(client->response); - const QVariantMap value = client->parser.call(QJSValueList() << QJSValue(jsonString)) - .toVariant().toMap(); - return value.value("body").toMap(); + return client->response().body.toObject(); } void tst_QQmlDebugJS::stepIn() @@ -1312,12 +658,12 @@ void tst_QQmlDebugJS::stepIn() QVERIFY(waitForClientSignal(SIGNAL(stopped()))); QCOMPARE(responseBody(m_client).value("sourceLine").toInt(), sourceLine); - m_client->continueDebugging(QJSDebugClient::In); + m_client->continueDebugging(QV4DebugClient::In); QVERIFY(waitForClientSignal(SIGNAL(stopped()))); - const QVariantMap body = responseBody(m_client); + const QJsonObject body = responseBody(m_client); QCOMPARE(body.value("sourceLine").toInt(), actualLine); - QCOMPARE(QFileInfo(body.value("script").toMap().value("name").toString()).fileName(), QLatin1String(STEPACTION_QMLFILE)); + QCOMPARE(QFileInfo(body.value("script").toObject().value("name").toString()).fileName(), QLatin1String(STEPACTION_QMLFILE)); } void tst_QQmlDebugJS::stepOut() @@ -1334,12 +680,12 @@ void tst_QQmlDebugJS::stepOut() QVERIFY(waitForClientSignal(SIGNAL(stopped()))); QCOMPARE(responseBody(m_client).value("sourceLine").toInt(), sourceLine); - m_client->continueDebugging(QJSDebugClient::Out); + m_client->continueDebugging(QV4DebugClient::Out); QVERIFY(waitForClientSignal(SIGNAL(stopped()))); - const QVariantMap body = responseBody(m_client); + const QJsonObject body = responseBody(m_client); QCOMPARE(body.value("sourceLine").toInt(), actualLine); - QCOMPARE(QFileInfo(body.value("script").toMap().value("name").toString()).fileName(), QLatin1String(STEPACTION_QMLFILE)); + QCOMPARE(QFileInfo(body.value("script").toObject().value("name").toString()).fileName(), QLatin1String(STEPACTION_QMLFILE)); } void tst_QQmlDebugJS::continueDebugging() @@ -1356,16 +702,14 @@ void tst_QQmlDebugJS::continueDebugging() m_client->connect(); QVERIFY(waitForClientSignal(SIGNAL(stopped()))); - m_client->continueDebugging(QJSDebugClient::Continue); + m_client->continueDebugging(QV4DebugClient::Continue); QVERIFY(waitForClientSignal(SIGNAL(stopped()))); - QString jsonString(m_client->response); - QVariantMap value = m_client->parser.call(QJSValueList() << QJSValue(jsonString)).toVariant().toMap(); - - QVariantMap body = value.value("body").toMap(); + const QJsonObject body = responseBody(m_client); QCOMPARE(body.value("sourceLine").toInt(), sourceLine2); - QCOMPARE(QFileInfo(body.value("script").toMap().value("name").toString()).fileName(), QLatin1String(STEPACTION_QMLFILE)); + QCOMPARE(QFileInfo(body.value("script").toObject().value("name").toString()).fileName(), + QLatin1String(STEPACTION_QMLFILE)); } void tst_QQmlDebugJS::backtrace() @@ -1449,32 +793,27 @@ void tst_QQmlDebugJS::evaluateInLocalScope() m_client->frame(); QVERIFY(waitForClientSignal(SIGNAL(result()))); - //Get the frame index - QString jsonString(m_client->response); - QVariantMap value = m_client->parser.call(QJSValueList() << QJSValue(jsonString)).toVariant().toMap(); - - QVariantMap body = value.value("body").toMap(); - - int frameIndex = body.value("index").toInt(); - - m_client->evaluate(QLatin1String("root.a"), frameIndex); - QVERIFY(waitForClientSignal(SIGNAL(result()))); - - //Verify the value of 'timer.interval' - jsonString = m_client->response; - value = m_client->parser.call(QJSValueList() << QJSValue(jsonString)).toVariant().toMap(); - - body = value.value("body").toMap(); + { + //Get the frame index + const QJsonObject body = responseBody(m_client); + int frameIndex = body.value("index").toInt(); + m_client->evaluate(QLatin1String("root.a"), frameIndex); + QVERIFY(waitForClientSignal(SIGNAL(result()))); + } - QCOMPARE(body.value("value").toInt(),10); + { + //Verify the value of 'timer.interval' + const QJsonObject body = responseBody(m_client); + QCOMPARE(body.value("value").toInt(),10); + } } void tst_QQmlDebugJS::evaluateInContext() { m_connection = new QQmlDebugConnection(); - m_process = new QQmlDebugProcess(QLibraryInfo::location(QLibraryInfo::BinariesPath) - + "/qmlscene", this); - m_client = new QJSDebugClient(m_connection); + m_process = new QQmlDebugProcess( + QLibraryInfo::location(QLibraryInfo::BinariesPath) + "/qmlscene", this); + m_client = new QV4DebugClient(m_connection); QScopedPointer<QQmlEngineDebugClient> engineClient(new QQmlEngineDebugClient(m_connection)); m_process->start(QStringList() << QLatin1String(BLOCKMODE) << testFile(ONCOMPLETED_QMLFILE)); @@ -1497,7 +836,7 @@ void tst_QQmlDebugJS::evaluateInContext() QVERIFY(QQmlDebugTest::waitForSignal(engineClient.data(), SIGNAL(result()))); QVERIFY(engineClient->engines().count()); - engineClient->queryRootContexts(engineClient->engines()[0].debugId, &success); + engineClient->queryRootContexts(engineClient->engines()[0], &success); QVERIFY(success); QVERIFY(QQmlDebugTest::waitForSignal(engineClient.data(), SIGNAL(result()))); @@ -1530,14 +869,12 @@ void tst_QQmlDebugJS::getScripts() m_client->scripts(); QVERIFY(waitForClientSignal(SIGNAL(result()))); - QString jsonString(m_client->response); - QVariantMap value = m_client->parser.call(QJSValueList() - << QJSValue(jsonString)).toVariant().toMap(); - QList<QVariant> scripts = value.value("body").toList(); + const QJsonArray scripts = m_client->response().body.toArray(); QCOMPARE(scripts.count(), 1); - QVERIFY(scripts.first().toMap()[QStringLiteral("name")].toString().endsWith(QStringLiteral("data/test.qml"))); + QVERIFY(scripts.first().toObject()[QStringLiteral("name")].toString() + .endsWith(QStringLiteral("data/test.qml"))); } void tst_QQmlDebugJS::encodeQmlScope() @@ -1551,42 +888,38 @@ void tst_QQmlDebugJS::encodeQmlScope() bool isStopped = false; bool scopesFailed = false; - QObject::connect(m_client.data(), &QJSDebugClient::failure, this, [&]() { - qWarning() << "received failure" << m_client->response; + QObject::connect(m_client.data(), &QV4DebugClient::failure, this, [&]() { + qWarning() << "received failure" << m_client->response().body; scopesFailed = true; m_process->stop(); numFrames = 2; isStopped = false; }); - QObject::connect(m_client.data(), &QJSDebugClient::stopped, this, [&]() { + QObject::connect(m_client.data(), &QV4DebugClient::stopped, this, [&]() { m_client->frame(); isStopped = true; }); - QObject::connect(m_client.data(), &QJSDebugClient::result, this, [&]() { - const QVariantMap value = m_client->parser.call( - QJSValueList() << QJSValue(QString(m_client->response))).toVariant().toMap(); - - const QMap<QString, QVariant> body = value.value("body").toMap(); - const QString command = value.value("command").toString(); + QObject::connect(m_client.data(), &QV4DebugClient::result, this, [&]() { + const QV4DebugClient::Response value = m_client->response(); - if (command == QString("scope")) { + if (value.command == QString("scope")) { // If the scope commands fail we get a failure() signal above. if (++numReceivedScopes == numExpectedScopes) { - m_client->continueDebugging(QJSDebugClient::Continue); + m_client->continueDebugging(QV4DebugClient::Continue); isStopped = false; } - } else if (command == QString("frame")) { + } else if (value.command == QString("frame")) { // We want at least a global scope and some kind of local scope here. - const QList<QVariant> scopes = body.value("scopes").toList(); - if (scopes.length() < 2) + const QJsonArray scopes = value.body.toObject().value("scopes").toArray(); + if (scopes.count() < 2) scopesFailed = true; - for (const QVariant &scope : scopes) { + for (const QJsonValue &scope : scopes) { ++numExpectedScopes; - m_client->scope(scope.toMap().value("index").toInt()); + m_client->scope(scope.toObject().value("index").toInt()); } ++numFrames; @@ -1611,21 +944,21 @@ void tst_QQmlDebugJS::breakOnAnchor() int breaks = 0; bool stopped = false; - QObject::connect(m_client.data(), &QJSDebugClient::stopped, this, [&]() { + QObject::connect(m_client.data(), &QV4DebugClient::stopped, this, [&]() { stopped = true; ++breaks; m_client->evaluate("this", 0, -1); }); - QObject::connect(m_client.data(), &QJSDebugClient::result, this, [&]() { + QObject::connect(m_client.data(), &QV4DebugClient::result, this, [&]() { if (stopped) { - m_client->continueDebugging(QJSDebugClient::Continue); + m_client->continueDebugging(QV4DebugClient::Continue); stopped = false; } }); - QObject::connect(m_client.data(), &QJSDebugClient::failure, this, [&]() { - qWarning() << "received failure" << m_client->response; + QObject::connect(m_client.data(), &QV4DebugClient::failure, this, [&]() { + qWarning() << "received failure" << m_client->response().body; }); m_client->setBreakpoint(file, 34); @@ -1643,7 +976,7 @@ void tst_QQmlDebugJS::breakOnAnchor() QList<QQmlDebugClient *> tst_QQmlDebugJS::createClients() { - m_client = new QJSDebugClient(m_connection); + m_client = new QV4DebugClient(m_connection); return QList<QQmlDebugClient *>({m_client}); } @@ -1661,10 +994,9 @@ bool tst_QQmlDebugJS::waitForClientSignal(const char *signal, int timeout) void tst_QQmlDebugJS::checkVersionParameters() { - const QVariantMap value = m_client->parser.call( - QJSValueList() << QJSValue(QString(m_client->response))).toVariant().toMap(); - QCOMPARE(value.value("command").toString(), QString("version")); - const QVariantMap body = value.value("body").toMap(); + const QV4DebugClient::Response value = m_client->response(); + QCOMPARE(value.command, QString("version")); + const QJsonObject body = value.body.toObject(); QCOMPARE(body.value("UnpausedEvaluate").toBool(), true); QCOMPARE(body.value("ContextEvaluate").toBool(), true); QCOMPARE(body.value("ChangeBreakpoint").toBool(), true); diff --git a/tests/auto/qml/debugger/qqmlenginedebuginspectorintegrationtest/qqmlenginedebuginspectorintegrationtest.pro b/tests/auto/qml/debugger/qqmlenginedebuginspectorintegrationtest/qqmlenginedebuginspectorintegrationtest.pro index 54244c6d16..454a1e3ab0 100644 --- a/tests/auto/qml/debugger/qqmlenginedebuginspectorintegrationtest/qqmlenginedebuginspectorintegrationtest.pro +++ b/tests/auto/qml/debugger/qqmlenginedebuginspectorintegrationtest/qqmlenginedebuginspectorintegrationtest.pro @@ -6,8 +6,6 @@ osx:CONFIG -= app_bundle SOURCES += tst_qqmlenginedebuginspectorintegration.cpp -include(../shared/qqmlinspectorclient.pri) -include(../shared/qqmlenginedebugclient.pri) include(../shared/debugutil.pri) TESTDATA = data/* diff --git a/tests/auto/qml/debugger/qqmlenginedebuginspectorintegrationtest/tst_qqmlenginedebuginspectorintegration.cpp b/tests/auto/qml/debugger/qqmlenginedebuginspectorintegrationtest/tst_qqmlenginedebuginspectorintegration.cpp index 249416a3b9..980e2be1f1 100644 --- a/tests/auto/qml/debugger/qqmlenginedebuginspectorintegrationtest/tst_qqmlenginedebuginspectorintegration.cpp +++ b/tests/auto/qml/debugger/qqmlenginedebuginspectorintegrationtest/tst_qqmlenginedebuginspectorintegration.cpp @@ -26,12 +26,12 @@ ** ****************************************************************************/ -#include "qqmlinspectorclient.h" -#include "qqmlenginedebugclient.h" #include "../shared/debugutil_p.h" #include "../../../shared/util.h" #include <private/qqmldebugconnection_p.h> +#include <private/qqmlenginedebugclient_p.h> +#include <private/qqmlinspectorclient_p.h> #include <QtTest/qtest.h> #include <QtTest/qsignalspy.h> @@ -49,7 +49,7 @@ private: ConnectResult init(bool restrictServices); QList<QQmlDebugClient *> createClients() override; - QmlDebugObjectReference findRootObject(); + QQmlEngineDebugObjectReference findRootObject(); QPointer<QQmlInspectorClient> m_inspectorClient; QPointer<QQmlEngineDebugClient> m_engineDebugClient; @@ -65,23 +65,23 @@ private slots: void destroyObject(); }; -QmlDebugObjectReference tst_QQmlEngineDebugInspectorIntegration::findRootObject() +QQmlEngineDebugObjectReference tst_QQmlEngineDebugInspectorIntegration::findRootObject() { bool success = false; m_engineDebugClient->queryAvailableEngines(&success); if (!QQmlDebugTest::waitForSignal(m_engineDebugClient, SIGNAL(result()))) - return QmlDebugObjectReference(); + return QQmlEngineDebugObjectReference(); - m_engineDebugClient->queryRootContexts(m_engineDebugClient->engines()[0].debugId, &success); + m_engineDebugClient->queryRootContexts(m_engineDebugClient->engines()[0], &success); if (!QQmlDebugTest::waitForSignal(m_engineDebugClient, SIGNAL(result()))) - return QmlDebugObjectReference(); + return QQmlEngineDebugObjectReference(); int count = m_engineDebugClient->rootContext().contexts.count(); m_engineDebugClient->queryObject( m_engineDebugClient->rootContext().contexts[count - 1].objects[0], &success); if (!QQmlDebugTest::waitForSignal(m_engineDebugClient, SIGNAL(result()))) - return QmlDebugObjectReference(); + return QQmlEngineDebugObjectReference(); return m_engineDebugClient->object(); } @@ -121,7 +121,7 @@ void tst_QQmlEngineDebugInspectorIntegration::objectLocationLookup() QCOMPARE(init(true), ConnectSuccess); bool success = false; - QmlDebugObjectReference rootObject = findRootObject(); + QQmlEngineDebugObjectReference rootObject = findRootObject(); QVERIFY(rootObject.debugId != -1); const QString fileName = QFileInfo(rootObject.source.url.toString()).fileName(); int lineNumber = rootObject.source.lineNumber; @@ -131,7 +131,7 @@ void tst_QQmlEngineDebugInspectorIntegration::objectLocationLookup() QVERIFY(success); QVERIFY(QQmlDebugTest::waitForSignal(m_engineDebugClient, SIGNAL(result()))); - foreach (QmlDebugObjectReference child, rootObject.children) { + foreach (QQmlEngineDebugObjectReference child, rootObject.children) { success = false; lineNumber = child.source.lineNumber; columnNumber = child.source.columnNumber; @@ -146,10 +146,10 @@ void tst_QQmlEngineDebugInspectorIntegration::select() { QCOMPARE(init(true), ConnectSuccess); - QmlDebugObjectReference rootObject = findRootObject(); + QQmlEngineDebugObjectReference rootObject = findRootObject(); QList<int> childIds; int requestId = 0; - foreach (const QmlDebugObjectReference &child, rootObject.children) { + foreach (const QQmlEngineDebugObjectReference &child, rootObject.children) { requestId = m_inspectorClient->select(QList<int>() << child.debugId); QTRY_COMPARE(m_recipient->lastResponseId, requestId); QVERIFY(m_recipient->lastResult); @@ -171,7 +171,7 @@ void tst_QQmlEngineDebugInspectorIntegration::createObject() " color: \"blue\"\n" "}"); - QmlDebugObjectReference rootObject = findRootObject(); + QQmlEngineDebugObjectReference rootObject = findRootObject(); QVERIFY(rootObject.debugId != -1); QCOMPARE(rootObject.children.length(), 2); @@ -192,7 +192,7 @@ void tst_QQmlEngineDebugInspectorIntegration::moveObject() QCOMPARE(init(true), ConnectSuccess); QCOMPARE(m_inspectorClient->state(), QQmlDebugClient::Enabled); - QmlDebugObjectReference rootObject = findRootObject(); + QQmlEngineDebugObjectReference rootObject = findRootObject(); QVERIFY(rootObject.debugId != -1); QCOMPARE(rootObject.children.length(), 2); @@ -217,7 +217,7 @@ void tst_QQmlEngineDebugInspectorIntegration::destroyObject() QCOMPARE(init(true), ConnectSuccess); QCOMPARE(m_inspectorClient->state(), QQmlDebugClient::Enabled); - QmlDebugObjectReference rootObject = findRootObject(); + QQmlEngineDebugObjectReference rootObject = findRootObject(); QVERIFY(rootObject.debugId != -1); QCOMPARE(rootObject.children.length(), 2); diff --git a/tests/auto/qml/debugger/qqmlenginedebugservice/qqmlenginedebugservice.pro b/tests/auto/qml/debugger/qqmlenginedebugservice/qqmlenginedebugservice.pro index ed4224446e..5ff65ba276 100644 --- a/tests/auto/qml/debugger/qqmlenginedebugservice/qqmlenginedebugservice.pro +++ b/tests/auto/qml/debugger/qqmlenginedebugservice/qqmlenginedebugservice.pro @@ -5,7 +5,6 @@ osx:CONFIG -= app_bundle SOURCES += \ tst_qqmlenginedebugservice.cpp -include(../shared/qqmlenginedebugclient.pri) include(../shared/debugutil.pri) DEFINES += QT_QML_DEBUG_NO_WARNING diff --git a/tests/auto/qml/debugger/qqmlenginedebugservice/tst_qqmlenginedebugservice.cpp b/tests/auto/qml/debugger/qqmlenginedebugservice/tst_qqmlenginedebugservice.cpp index c613d88b2b..99c90c142f 100644 --- a/tests/auto/qml/debugger/qqmlenginedebugservice/tst_qqmlenginedebugservice.cpp +++ b/tests/auto/qml/debugger/qqmlenginedebugservice/tst_qqmlenginedebugservice.cpp @@ -26,7 +26,6 @@ ** ****************************************************************************/ -#include "qqmlenginedebugclient.h" #include "debugutil_p.h" #include "../../../shared/util.h" @@ -36,6 +35,7 @@ #include <private/qqmlmetatype_p.h> #include <private/qqmlproperty_p.h> #include <private/qqmldebugconnection_p.h> +#include <private/qqmlenginedebugclient_p.h> #include <QtTest/qtest.h> #include <QtTest/qsignalspy.h> @@ -60,7 +60,7 @@ #define QVERIFYOBJECT(statement) \ do {\ if (!QTest::qVerify((statement), #statement, "", __FILE__, __LINE__)) {\ - return QmlDebugObjectReference();\ + return QQmlEngineDebugObjectReference();\ }\ } while (0) @@ -126,14 +126,14 @@ public: tst_QQmlEngineDebugService() : m_conn(nullptr), m_dbg(nullptr), m_engine(nullptr), m_rootItem(nullptr) {} private: - QmlDebugObjectReference findRootObject(int context = 0, + QQmlEngineDebugObjectReference findRootObject(int context = 0, bool recursive = false); - QmlDebugPropertyReference findProperty( - const QList<QmlDebugPropertyReference> &props, + QQmlEngineDebugPropertyReference findProperty( + const QList<QQmlEngineDebugPropertyReference> &props, const QString &name) const; void recursiveObjectTest(QObject *o, - const QmlDebugObjectReference &oref, + const QQmlEngineDebugObjectReference &oref, bool recursive) const; void getContexts(); @@ -182,7 +182,7 @@ private slots: void createObjectOnDestruction(); }; -QmlDebugObjectReference tst_QQmlEngineDebugService::findRootObject( +QQmlEngineDebugObjectReference tst_QQmlEngineDebugService::findRootObject( int context, bool recursive) { bool success = false; @@ -191,7 +191,7 @@ QmlDebugObjectReference tst_QQmlEngineDebugService::findRootObject( QVERIFYOBJECT(QQmlDebugTest::waitForSignal(m_dbg, SIGNAL(result()))); QVERIFYOBJECT(m_dbg->engines().count()); - m_dbg->queryRootContexts(m_dbg->engines()[0].debugId, &success); + m_dbg->queryRootContexts(m_dbg->engines()[0], &success); QVERIFYOBJECT(success); QVERIFYOBJECT(QQmlDebugTest::waitForSignal(m_dbg, SIGNAL(result()))); @@ -207,18 +207,18 @@ QmlDebugObjectReference tst_QQmlEngineDebugService::findRootObject( return m_dbg->object(); } -QmlDebugPropertyReference tst_QQmlEngineDebugService::findProperty( - const QList<QmlDebugPropertyReference> &props, const QString &name) const +QQmlEngineDebugPropertyReference tst_QQmlEngineDebugService::findProperty( + const QList<QQmlEngineDebugPropertyReference> &props, const QString &name) const { - foreach (const QmlDebugPropertyReference &p, props) { + foreach (const QQmlEngineDebugPropertyReference &p, props) { if (p.name == name) return p; } - return QmlDebugPropertyReference(); + return QQmlEngineDebugPropertyReference(); } void tst_QQmlEngineDebugService::recursiveObjectTest( - QObject *o, const QmlDebugObjectReference &oref, bool recursive) const + QObject *o, const QQmlEngineDebugObjectReference &oref, bool recursive) const { const QMetaObject *meta = o->metaObject(); @@ -236,8 +236,8 @@ void tst_QQmlEngineDebugService::recursiveObjectTest( int debugId = QQmlDebugService::idForObject(child); QVERIFY(debugId >= 0); - QmlDebugObjectReference cref; - foreach (const QmlDebugObjectReference &ref, oref.children) { + QQmlEngineDebugObjectReference cref; + foreach (const QQmlEngineDebugObjectReference &ref, oref.children) { QVERIFY(!ref.className.isEmpty()); if (ref.debugId == debugId) { cref = ref; @@ -250,7 +250,7 @@ void tst_QQmlEngineDebugService::recursiveObjectTest( recursiveObjectTest(child, cref, true); } - foreach (const QmlDebugPropertyReference &p, oref.properties) { + foreach (const QQmlEngineDebugPropertyReference &p, oref.properties) { QCOMPARE(p.objectDebugId, QQmlDebugService::idForObject(o)); // signal properties are fake - they are generated from QQmlAbstractBoundSignal children @@ -269,7 +269,8 @@ void tst_QQmlEngineDebugService::recursiveObjectTest( QCOMPARE(p.name, QString::fromUtf8(pmeta.name())); if (pmeta.userType() == QMetaType::QObjectStar) { - const QmlDebugObjectReference ref = qvariant_cast<QmlDebugObjectReference>(p.value); + const QQmlEngineDebugObjectReference ref + = qvariant_cast<QQmlEngineDebugObjectReference>(p.value); QObject *pobj = qvariant_cast<QObject *>(pmeta.read(o)); if (pobj) { if (pobj->objectName().isEmpty()) @@ -312,9 +313,9 @@ void tst_QQmlEngineDebugService::getContexts() QVERIFY(success); QVERIFY(QQmlDebugTest::waitForSignal(m_dbg, SIGNAL(result()))); - QList<QmlDebugEngineReference> engines = m_dbg->engines(); + QList<QQmlEngineDebugEngineReference> engines = m_dbg->engines(); QCOMPARE(engines.count(), 1); - m_dbg->queryRootContexts(engines.first().debugId, &success); + m_dbg->queryRootContexts(engines.first(), &success); QVERIFY(success); QVERIFY(QQmlDebugTest::waitForSignal(m_dbg, SIGNAL(result()))); @@ -441,7 +442,7 @@ void tst_QQmlEngineDebugService::cleanupTestCase() void tst_QQmlEngineDebugService::setMethodBody() { bool success; - QmlDebugObjectReference obj = findRootObject(2); + QQmlEngineDebugObjectReference obj = findRootObject(2); QVERIFY(!obj.className.isEmpty()); QObject *root = m_components.at(2); @@ -483,9 +484,9 @@ void tst_QQmlEngineDebugService::setMethodBody() void tst_QQmlEngineDebugService::watch_property() { - QmlDebugObjectReference obj = findRootObject(); + QQmlEngineDebugObjectReference obj = findRootObject(); QVERIFY(!obj.className.isEmpty()); - QmlDebugPropertyReference prop = findProperty(obj.properties, "width"); + QQmlEngineDebugPropertyReference prop = findProperty(obj.properties, "width"); bool success; @@ -494,7 +495,7 @@ void tst_QQmlEngineDebugService::watch_property() QVERIFY(!success); delete unconnected; - m_dbg->addWatch(QmlDebugPropertyReference(), &success); + m_dbg->addWatch(QQmlEngineDebugPropertyReference(), &success); QVERIFY(success); QVERIFY(QQmlDebugTest::waitForSignal(m_dbg, SIGNAL(result()))); QCOMPARE(m_dbg->valid(), false); @@ -528,7 +529,7 @@ void tst_QQmlEngineDebugService::watch_property() void tst_QQmlEngineDebugService::watch_object() { - QmlDebugObjectReference obj = findRootObject(); + QQmlEngineDebugObjectReference obj = findRootObject(); QVERIFY(!obj.className.isEmpty()); bool success; @@ -538,7 +539,7 @@ void tst_QQmlEngineDebugService::watch_object() QVERIFY(!success); delete unconnected; - m_dbg->addWatch(QmlDebugObjectReference(), &success); + m_dbg->addWatch(QQmlEngineDebugObjectReference(), &success); QVERIFY(success); QVERIFY(QQmlDebugTest::waitForSignal(m_dbg, SIGNAL(result()))); QCOMPARE(m_dbg->valid(), false); @@ -594,7 +595,7 @@ void tst_QQmlEngineDebugService::watch_expression() int origWidth = m_rootItem->property("width").toInt(); - QmlDebugObjectReference obj = findRootObject(); + QQmlEngineDebugObjectReference obj = findRootObject(); QVERIFY(!obj.className.isEmpty()); bool success; @@ -604,7 +605,7 @@ void tst_QQmlEngineDebugService::watch_expression() QVERIFY(!success); delete unconnected; - m_dbg->addWatch(QmlDebugObjectReference(), expr, &success); + m_dbg->addWatch(QQmlEngineDebugObjectReference(), expr, &success); QVERIFY(success); QVERIFY(QQmlDebugTest::waitForSignal(m_dbg, SIGNAL(result()))); QCOMPARE(m_dbg->valid(), false); @@ -654,7 +655,7 @@ void tst_QQmlEngineDebugService::watch_expression_data() void tst_QQmlEngineDebugService::watch_context() { - QmlDebugContextReference c; + QQmlEngineDebugContextReference c; QTest::ignoreMessage(QtWarningMsg, "QQmlEngineDebugClient::addWatch(): Not implemented"); bool success; m_dbg->addWatch(c, QString(), &success); @@ -663,7 +664,7 @@ void tst_QQmlEngineDebugService::watch_context() void tst_QQmlEngineDebugService::watch_file() { - QmlDebugFileReference f; + QQmlEngineDebugFileReference f; QTest::ignoreMessage(QtWarningMsg, "QQmlEngineDebugClient::addWatch(): Not implemented"); bool success; m_dbg->addWatch(f, &success); @@ -684,10 +685,10 @@ void tst_QQmlEngineDebugService::queryAvailableEngines() QVERIFY(QQmlDebugTest::waitForSignal(m_dbg, SIGNAL(result()))); // TODO test multiple engines - QList<QmlDebugEngineReference> engines = m_dbg->engines(); + QList<QQmlEngineDebugEngineReference> engines = m_dbg->engines(); QCOMPARE(engines.count(), 1); - foreach (const QmlDebugEngineReference &e, engines) { + foreach (const QQmlEngineDebugEngineReference &e, engines) { QCOMPARE(e.debugId, QQmlDebugService::idForObject(m_engine)); QCOMPARE(e.name, m_engine->objectName()); } @@ -700,19 +701,19 @@ void tst_QQmlEngineDebugService::queryRootContexts() QVERIFY(success); QVERIFY(QQmlDebugTest::waitForSignal(m_dbg, SIGNAL(result()))); QVERIFY(m_dbg->engines().count()); - int engineId = m_dbg->engines()[0].debugId; + const QQmlEngineDebugEngineReference engine = m_dbg->engines()[0]; QQmlEngineDebugClient *unconnected = new QQmlEngineDebugClient(nullptr); - unconnected->queryRootContexts(engineId, &success); + unconnected->queryRootContexts(engine, &success); QVERIFY(!success); delete unconnected; - m_dbg->queryRootContexts(engineId, &success); + m_dbg->queryRootContexts(engine, &success); QVERIFY(success); QVERIFY(QQmlDebugTest::waitForSignal(m_dbg, SIGNAL(result()))); QQmlContext *actualContext = m_engine->rootContext(); - QmlDebugContextReference context = m_dbg->rootContext(); + QQmlEngineDebugContextReference context = m_dbg->rootContext(); QCOMPARE(context.debugId, QQmlDebugService::idForObject(actualContext)); QCOMPARE(context.name, actualContext->objectName()); @@ -730,7 +731,7 @@ void tst_QQmlEngineDebugService::queryObject() bool success; - QmlDebugObjectReference rootObject = findRootObject(); + QQmlEngineDebugObjectReference rootObject = findRootObject(); QVERIFY(!rootObject.className.isEmpty()); QQmlEngineDebugClient *unconnected = new QQmlEngineDebugClient(nullptr); @@ -742,11 +743,11 @@ void tst_QQmlEngineDebugService::queryObject() QVERIFY(success); QVERIFY(QQmlDebugTest::waitForSignal(m_dbg, SIGNAL(result()))); - QmlDebugObjectReference obj = m_dbg->object(); + QQmlEngineDebugObjectReference obj = m_dbg->object(); QVERIFY(!obj.className.isEmpty()); // check source as defined in main() - QmlDebugFileReference source = obj.source; + QQmlEngineDebugFileReference source = obj.source; QCOMPARE(source.url, QUrl::fromLocalFile("")); QCOMPARE(source.lineNumber, 3); QCOMPARE(source.columnNumber, 1); @@ -755,14 +756,14 @@ void tst_QQmlEngineDebugService::queryObject() recursiveObjectTest(m_rootItem, obj, recursive); if (recursive) { - foreach (const QmlDebugObjectReference &child, obj.children) { + foreach (const QQmlEngineDebugObjectReference &child, obj.children) { QVERIFY(!child.className.isEmpty()); QVERIFY(child.properties.count() > 0); } - QmlDebugObjectReference rect; - QmlDebugObjectReference text; - foreach (const QmlDebugObjectReference &child, obj.children) { + QQmlEngineDebugObjectReference rect; + QQmlEngineDebugObjectReference text; + foreach (const QQmlEngineDebugObjectReference &child, obj.children) { QVERIFY(!child.className.isEmpty()); if (child.className == "Rectangle") rect = child; @@ -777,7 +778,7 @@ void tst_QQmlEngineDebugService::queryObject() QCOMPARE(findProperty(text.properties, "color").value, qVariantFromValue(QColor("blue"))); } else { - foreach (const QmlDebugObjectReference &child, obj.children) { + foreach (const QQmlEngineDebugObjectReference &child, obj.children) { QVERIFY(!child.className.isEmpty()); QCOMPARE(child.properties.count(), 0); } @@ -798,7 +799,7 @@ void tst_QQmlEngineDebugService::queryObjectsForLocation() bool success; - QmlDebugObjectReference rootObject = findRootObject(); + QQmlEngineDebugObjectReference rootObject = findRootObject(); QVERIFY(!rootObject.className.isEmpty()); const QString fileName = QFileInfo(rootObject.source.url.toString()).fileName(); @@ -821,11 +822,11 @@ void tst_QQmlEngineDebugService::queryObjectsForLocation() QVERIFY(QQmlDebugTest::waitForSignal(m_dbg, SIGNAL(result()))); QCOMPARE(m_dbg->objects().count(), 1); - QmlDebugObjectReference obj = m_dbg->objects().first(); + QQmlEngineDebugObjectReference obj = m_dbg->objects().first(); QVERIFY(!obj.className.isEmpty()); // check source as defined in main() - QmlDebugFileReference source = obj.source; + QQmlEngineDebugFileReference source = obj.source; QCOMPARE(source.url, QUrl(fileName)); QCOMPARE(source.lineNumber, lineNumber); QCOMPARE(source.columnNumber, columnNumber); @@ -834,14 +835,14 @@ void tst_QQmlEngineDebugService::queryObjectsForLocation() recursiveObjectTest(m_rootItem, obj, recursive); if (recursive) { - foreach (const QmlDebugObjectReference &child, obj.children) { + foreach (const QQmlEngineDebugObjectReference &child, obj.children) { QVERIFY(!child.className.isEmpty()); QVERIFY(child.properties.count() > 0); } - QmlDebugObjectReference rect; - QmlDebugObjectReference text; - foreach (const QmlDebugObjectReference &child, obj.children) { + QQmlEngineDebugObjectReference rect; + QQmlEngineDebugObjectReference text; + foreach (const QQmlEngineDebugObjectReference &child, obj.children) { QVERIFY(!child.className.isEmpty()); if (child.className == "Rectangle") rect = child; @@ -856,7 +857,7 @@ void tst_QQmlEngineDebugService::queryObjectsForLocation() QCOMPARE(findProperty(text.properties, "color").value, qVariantFromValue(QColor("blue"))); } else { - foreach (const QmlDebugObjectReference &child, obj.children) { + foreach (const QQmlEngineDebugObjectReference &child, obj.children) { QVERIFY(!child.className.isEmpty()); QCOMPARE(child.properties.count(), 0); } @@ -873,7 +874,7 @@ void tst_QQmlEngineDebugService::queryObjectsForLocation_data() void tst_QQmlEngineDebugService::regression_QTCREATORBUG_7451() { - QmlDebugObjectReference rootObject = findRootObject(); + QQmlEngineDebugObjectReference rootObject = findRootObject(); QVERIFY(!rootObject.className.isEmpty()); int contextId = rootObject.contextDebugId; QQmlContext *context = qobject_cast<QQmlContext *>(QQmlDebugService::objectForId(contextId)); @@ -900,7 +901,7 @@ void tst_QQmlEngineDebugService::regression_QTCREATORBUG_7451() QVERIFY(success); QVERIFY(QQmlDebugTest::waitForSignal(m_dbg, SIGNAL(result()))); - foreach (QmlDebugObjectReference child, rootObject.children) { + foreach (QQmlEngineDebugObjectReference child, rootObject.children) { QVERIFY(!child.className.isEmpty()); success = false; lineNumber = child.source.lineNumber; @@ -923,7 +924,7 @@ void tst_QQmlEngineDebugService::regression_QTCREATORBUG_7451() QVERIFY(success); QVERIFY(QQmlDebugTest::waitForSignal(m_dbg, SIGNAL(result()))); - foreach (QmlDebugObjectReference child, rootObject.children) { + foreach (QQmlEngineDebugObjectReference child, rootObject.children) { QVERIFY(!child.className.isEmpty()); success = false; lineNumber = child.source.lineNumber; @@ -939,7 +940,7 @@ void tst_QQmlEngineDebugService::queryObjectWithNonStreamableTypes() { bool success; - QmlDebugObjectReference rootObject = findRootObject(4, true); + QQmlEngineDebugObjectReference rootObject = findRootObject(4, true); QVERIFY(!rootObject.className.isEmpty()); QQmlEngineDebugClient *unconnected = new QQmlEngineDebugClient(nullptr); @@ -951,7 +952,7 @@ void tst_QQmlEngineDebugService::queryObjectWithNonStreamableTypes() QVERIFY(success); QVERIFY(QQmlDebugTest::waitForSignal(m_dbg, SIGNAL(result()))); - QmlDebugObjectReference obj = m_dbg->object(); + QQmlEngineDebugObjectReference obj = m_dbg->object(); QVERIFY(!obj.className.isEmpty()); QCOMPARE(findProperty(obj.properties, "modelIndex").value, @@ -962,14 +963,14 @@ void tst_QQmlEngineDebugService::jsonData() { bool success; - QmlDebugObjectReference rootObject = findRootObject(5, true); + QQmlEngineDebugObjectReference rootObject = findRootObject(5, true); QVERIFY(!rootObject.className.isEmpty()); m_dbg->queryObject(rootObject, &success); QVERIFY(success); QVERIFY(QQmlDebugTest::waitForSignal(m_dbg, SIGNAL(result()))); - QmlDebugObjectReference obj = m_dbg->object(); + QQmlEngineDebugObjectReference obj = m_dbg->object(); QVERIFY(!obj.className.isEmpty()); QCOMPARE(findProperty(obj.properties, "data").value, @@ -1064,10 +1065,10 @@ void tst_QQmlEngineDebugService::queryExpressionResultBC_data() void tst_QQmlEngineDebugService::setBindingForObject() { - QmlDebugObjectReference rootObject = findRootObject(); + QQmlEngineDebugObjectReference rootObject = findRootObject(); QVERIFY(!rootObject.className.isEmpty()); QVERIFY(rootObject.debugId != -1); - QmlDebugPropertyReference widthPropertyRef = findProperty(rootObject.properties, "width"); + QQmlEngineDebugPropertyReference widthPropertyRef = findProperty(rootObject.properties, "width"); QCOMPARE(widthPropertyRef.value, QVariant(10)); QCOMPARE(widthPropertyRef.binding, QString()); @@ -1112,7 +1113,7 @@ void tst_QQmlEngineDebugService::setBindingForObject() rootObject = findRootObject(); QVERIFY(!rootObject.className.isEmpty()); QCOMPARE(rootObject.children.size(), 5); // Rectangle, Text, MouseArea, Component.onCompleted, NonScriptPropertyElement - QmlDebugObjectReference mouseAreaObject = rootObject.children.at(2); + QQmlEngineDebugObjectReference mouseAreaObject = rootObject.children.at(2); QVERIFY(!mouseAreaObject.className.isEmpty()); m_dbg->queryObjectRecursive(mouseAreaObject, &success); QVERIFY(success); @@ -1120,7 +1121,7 @@ void tst_QQmlEngineDebugService::setBindingForObject() mouseAreaObject = m_dbg->object(); QCOMPARE(mouseAreaObject.className, QString("MouseArea")); - QmlDebugPropertyReference onEnteredRef = findProperty(mouseAreaObject.properties, "onEntered"); + QQmlEngineDebugPropertyReference onEnteredRef = findProperty(mouseAreaObject.properties, "onEntered"); QCOMPARE(onEnteredRef.name, QString("onEntered")); // Sorry, can't do that anymore: QCOMPARE(onEnteredRef.value, QVariant("{ console.log('hello') }")); @@ -1149,10 +1150,10 @@ void tst_QQmlEngineDebugService::setBindingForObject() void tst_QQmlEngineDebugService::resetBindingForObject() { - QmlDebugObjectReference rootObject = findRootObject(); + QQmlEngineDebugObjectReference rootObject = findRootObject(); QVERIFY(!rootObject.className.isEmpty()); QVERIFY(rootObject.debugId != -1); - QmlDebugPropertyReference widthPropertyRef = findProperty(rootObject.properties, "width"); + QQmlEngineDebugPropertyReference widthPropertyRef = findProperty(rootObject.properties, "width"); bool success = false; @@ -1188,7 +1189,7 @@ void tst_QQmlEngineDebugService::resetBindingForObject() rootObject = findRootObject(); QVERIFY(!rootObject.className.isEmpty()); - QmlDebugPropertyReference boldPropertyRef = findProperty(rootObject.properties, "font.bold"); + QQmlEngineDebugPropertyReference boldPropertyRef = findProperty(rootObject.properties, "font.bold"); QCOMPARE(boldPropertyRef.value.toBool(), false); QCOMPARE(boldPropertyRef.binding, QString()); @@ -1200,7 +1201,7 @@ void tst_QQmlEngineDebugService::setBindingInStates() const int sourceIndex = 3; - QmlDebugObjectReference obj = findRootObject(sourceIndex); + QQmlEngineDebugObjectReference obj = findRootObject(sourceIndex); QVERIFY(!obj.className.isEmpty()); QVERIFY(obj.debugId != -1); QVERIFY(obj.children.count() >= 2); @@ -1233,11 +1234,11 @@ void tst_QQmlEngineDebugService::setBindingInStates() // change the binding - QmlDebugObjectReference state = obj.children[1]; + QQmlEngineDebugObjectReference state = obj.children[1]; QCOMPARE(state.className, QString("State")); QVERIFY(state.children.count() > 0); - QmlDebugObjectReference propertyChange = state.children[0]; + QQmlEngineDebugObjectReference propertyChange = state.children[0]; QVERIFY(!propertyChange.className.isEmpty()); QVERIFY(propertyChange.debugId != -1); @@ -1316,43 +1317,43 @@ void tst_QQmlEngineDebugService::queryObjectTree() { const int sourceIndex = 3; - QmlDebugObjectReference obj = findRootObject(sourceIndex, true); + QQmlEngineDebugObjectReference obj = findRootObject(sourceIndex, true); QVERIFY(!obj.className.isEmpty()); QVERIFY(obj.debugId != -1); QVERIFY(obj.children.count() >= 2); // check state - QmlDebugObjectReference state = obj.children[1]; + QQmlEngineDebugObjectReference state = obj.children[1]; QCOMPARE(state.className, QString("State")); QVERIFY(state.children.count() > 0); - QmlDebugObjectReference propertyChange = state.children[0]; + QQmlEngineDebugObjectReference propertyChange = state.children[0]; QVERIFY(!propertyChange.className.isEmpty()); QVERIFY(propertyChange.debugId != -1); - QmlDebugPropertyReference propertyChangeTarget = findProperty(propertyChange.properties,"target"); + QQmlEngineDebugPropertyReference propertyChangeTarget = findProperty(propertyChange.properties,"target"); QCOMPARE(propertyChangeTarget.objectDebugId, propertyChange.debugId); - QmlDebugObjectReference targetReference = qvariant_cast<QmlDebugObjectReference>(propertyChangeTarget.value); + QQmlEngineDebugObjectReference targetReference = qvariant_cast<QQmlEngineDebugObjectReference>(propertyChangeTarget.value); QVERIFY(!targetReference.className.isEmpty()); QCOMPARE(targetReference.debugId, -1); QCOMPARE(targetReference.name, QString("<unnamed object>")); // check transition - QmlDebugObjectReference transition = obj.children[0]; + QQmlEngineDebugObjectReference transition = obj.children[0]; QCOMPARE(transition.className, QString("Transition")); QCOMPARE(findProperty(transition.properties,"from").value.toString(), QString("*")); QCOMPARE(findProperty(transition.properties,"to").value, findProperty(state.properties,"name").value); QVERIFY(transition.children.count() > 0); - QmlDebugObjectReference animation = transition.children[0]; + QQmlEngineDebugObjectReference animation = transition.children[0]; QVERIFY(!animation.className.isEmpty()); QVERIFY(animation.debugId != -1); - QmlDebugPropertyReference animationTarget = findProperty(animation.properties,"target"); + QQmlEngineDebugPropertyReference animationTarget = findProperty(animation.properties,"target"); QCOMPARE(animationTarget.objectDebugId, animation.debugId); - targetReference = qvariant_cast<QmlDebugObjectReference>(animationTarget.value); + targetReference = qvariant_cast<QQmlEngineDebugObjectReference>(animationTarget.value); QVERIFY(!targetReference.className.isEmpty()); QCOMPARE(targetReference.debugId, -1); QCOMPARE(targetReference.name, QString("<unnamed object>")); @@ -1362,7 +1363,7 @@ void tst_QQmlEngineDebugService::queryObjectTree() } void tst_QQmlEngineDebugService::asynchronousCreate() { - QmlDebugObjectReference object; + QQmlEngineDebugObjectReference object; auto connection = connect(m_dbg, &QQmlEngineDebugClient::newObject, this, [&](int objectId) { object.debugId = objectId; }); diff --git a/tests/auto/qml/debugger/qqmlinspector/qqmlinspector.pro b/tests/auto/qml/debugger/qqmlinspector/qqmlinspector.pro index 3d4473c693..0d42030b52 100644 --- a/tests/auto/qml/debugger/qqmlinspector/qqmlinspector.pro +++ b/tests/auto/qml/debugger/qqmlinspector/qqmlinspector.pro @@ -6,7 +6,6 @@ osx:CONFIG -= app_bundle SOURCES += tst_qqmlinspector.cpp -include(../shared/qqmlinspectorclient.pri) include(../shared/debugutil.pri) TESTDATA = data/* diff --git a/tests/auto/qml/debugger/qqmlinspector/tst_qqmlinspector.cpp b/tests/auto/qml/debugger/qqmlinspector/tst_qqmlinspector.cpp index 5c9506eb21..6685558bb5 100644 --- a/tests/auto/qml/debugger/qqmlinspector/tst_qqmlinspector.cpp +++ b/tests/auto/qml/debugger/qqmlinspector/tst_qqmlinspector.cpp @@ -26,12 +26,12 @@ ** ****************************************************************************/ -#include "qqmlinspectorclient.h" #include "../shared/debugutil_p.h" #include "../shared/qqmldebugprocess_p.h" #include "../../../shared/util.h" #include <private/qqmldebugconnection_p.h> +#include <private/qqmlinspectorclient_p.h> #include <QtTest/qtest.h> #include <QtTest/qsignalspy.h> diff --git a/tests/auto/qml/debugger/qqmlprofilerservice/tst_qqmlprofilerservice.cpp b/tests/auto/qml/debugger/qqmlprofilerservice/tst_qqmlprofilerservice.cpp index e0bd5413fe..085eb7b87a 100644 --- a/tests/auto/qml/debugger/qqmlprofilerservice/tst_qqmlprofilerservice.cpp +++ b/tests/auto/qml/debugger/qqmlprofilerservice/tst_qqmlprofilerservice.cpp @@ -201,7 +201,7 @@ private: CheckType = CheckMessageType | CheckDetailType | CheckLine | CheckColumn | CheckFileEndsWith }; - ConnectResult connect(bool block, const QString &testFile, bool recordFromStart = true, + ConnectResult connect(bool block, const QString &file, bool recordFromStart = true, uint flushInterval = 0, bool restrictServices = true, const QString &executable = QLibraryInfo::location(QLibraryInfo::BinariesPath) + "/qmlscene"); @@ -209,8 +209,8 @@ private: void checkTraceReceived(); void checkJsHeap(); bool verify(MessageListType type, int expectedPosition, - const QQmlProfilerEventType &expectedType, quint32 checks, - const QVector<qint64> &numbers); + const QQmlProfilerEventType &expected, quint32 checks, + const QVector<qint64> &expectedNumbers); QList<QQmlDebugClient *> createClients() override; QScopedPointer<QQmlProfilerTestClient> m_client; @@ -235,7 +235,7 @@ private slots: private: bool m_recordFromStart = true; - bool m_flushInterval = 0; + bool m_flushInterval = false; bool m_isComplete = false; // Don't use ({...}) here as MSVC will interpret that as the "QVector(int size)" ctor. @@ -305,7 +305,7 @@ void tst_QQmlProfilerService::checkJsHeap() qint64 used = 0; qint64 lastTimestamp = -1; foreach (const QQmlProfilerEvent &message, m_client->jsHeapMessages) { - const qint64 amount = message.number<qint64>(0); + const auto amount = message.number<qint64>(0); const QQmlProfilerEventType &type = m_client->types.at(message.typeIndex()); switch (type.detailType()) { case HeapPage: @@ -328,10 +328,11 @@ void tst_QQmlProfilerService::checkJsHeap() if (lastTimestamp == -1) { lastTimestamp = message.timestamp(); continue; - } else if (message.timestamp() == lastTimestamp) { - continue; } + if (message.timestamp() == lastTimestamp) + continue; + lastTimestamp = message.timestamp(); QVERIFY2(used >= 0, QString::fromLatin1("Negative memory usage seen: %1") @@ -759,7 +760,7 @@ void tst_QQmlProfilerService::memory() QVERIFY(m_client); int smallItems = 0; - for (auto message : m_client->jsHeapMessages) { + for (const auto& message : m_client->jsHeapMessages) { const QQmlProfilerEventType &type = m_client->types[message.typeIndex()]; if (type.detailType() == SmallItem) ++smallItems; @@ -793,7 +794,7 @@ void tst_QQmlProfilerService::compile() checkJsHeap(); Message rangeStage = MaximumMessage; - for (auto message : m_client->qmlMessages) { + for (const auto& message : m_client->qmlMessages) { const QQmlProfilerEventType &type = m_client->types[message.typeIndex()]; if (type.rangeType() == Compiling) { switch (rangeStage) { diff --git a/tests/auto/qml/debugger/shared/qqmldebugprocess.cpp b/tests/auto/qml/debugger/shared/qqmldebugprocess.cpp index 6f74edf863..956e97e7ba 100644 --- a/tests/auto/qml/debugger/shared/qqmldebugprocess.cpp +++ b/tests/auto/qml/debugger/shared/qqmldebugprocess.cpp @@ -46,7 +46,7 @@ QQmlDebugProcess::QQmlDebugProcess(const QString &executable, QObject *parent) this, &QQmlDebugProcess::processAppOutput); connect(&m_process, &QProcess::errorOccurred, this, &QQmlDebugProcess::processError); - connect(&m_process, QOverload<int>::of(&QProcess::finished), + connect(&m_process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, [this]() { m_timer.stop(); m_eventLoop.quit(); diff --git a/tests/auto/qml/debugger/shared/qqmlenginedebugclient.cpp b/tests/auto/qml/debugger/shared/qqmlenginedebugclient.cpp deleted file mode 100644 index 7e736ec400..0000000000 --- a/tests/auto/qml/debugger/shared/qqmlenginedebugclient.cpp +++ /dev/null @@ -1,508 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtQml 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$ -** -****************************************************************************/ - -#include "qqmlenginedebugclient.h" -#include <private/qqmldebugconnection_p.h> - -struct QmlObjectData { - QUrl url; - int lineNumber; - int columnNumber; - QString idString; - QString objectName; - QString objectType; - int objectId; - int contextId; - int parentId; -}; - -QPacket &operator>>(QPacket &ds, QmlObjectData &data) -{ - ds >> data.url >> data.lineNumber >> data.columnNumber >> data.idString - >> data.objectName >> data.objectType >> data.objectId >> data.contextId - >> data.parentId; - return ds; -} - -struct QmlObjectProperty { - enum Type { Unknown, Basic, Object, List, SignalProperty }; - Type type; - QString name; - QVariant value; - QString valueTypeName; - QString binding; - bool hasNotifySignal; -}; - -QPacket &operator>>(QPacket &ds, QmlObjectProperty &data) -{ - int type; - ds >> type >> data.name >> data.value >> data.valueTypeName - >> data.binding >> data.hasNotifySignal; - data.type = (QmlObjectProperty::Type)type; - return ds; -} - -QQmlEngineDebugClient::QQmlEngineDebugClient( - QQmlDebugConnection *connection) - : QQmlDebugClient(QLatin1String("QmlDebugger"), connection), - m_nextId(0), - m_valid(false) -{ -} - -quint32 QQmlEngineDebugClient::addWatch( - const QmlDebugPropertyReference &property, bool *success) -{ - quint32 id = -1; - *success = false; - if (state() == QQmlDebugClient::Enabled) { - id = getId(); - QPacket ds(connection()->currentDataStreamVersion()); - ds << QByteArray("WATCH_PROPERTY") << id << property.objectDebugId - << property.name.toUtf8(); - sendMessage(ds.data()); - *success = true; - } - return id; -} - -quint32 QQmlEngineDebugClient::addWatch( - const QmlDebugContextReference &, const QString &, bool *success) -{ - *success = false; - qWarning("QQmlEngineDebugClient::addWatch(): Not implemented"); - return 0; -} - -quint32 QQmlEngineDebugClient::addWatch( - const QmlDebugObjectReference &object, const QString &expr, - bool *success) -{ - quint32 id = -1; - *success = false; - if (state() == QQmlDebugClient::Enabled) { - id = getId(); - QPacket ds(connection()->currentDataStreamVersion()); - ds << QByteArray("WATCH_EXPR_OBJECT") << id << object.debugId << expr; - sendMessage(ds.data()); - *success = true; - } - return id; -} - -quint32 QQmlEngineDebugClient::addWatch( - const QmlDebugObjectReference &object, bool *success) -{ - quint32 id = -1; - *success = false; - if (state() == QQmlDebugClient::Enabled) { - id = getId(); - QPacket ds(connection()->currentDataStreamVersion()); - ds << QByteArray("WATCH_OBJECT") << id << object.debugId; - sendMessage(ds.data()); - *success = true; - } - return id; -} - -quint32 QQmlEngineDebugClient::addWatch( - const QmlDebugFileReference &, bool *success) -{ - *success = false; - qWarning("QQmlEngineDebugClient::addWatch(): Not implemented"); - return 0; -} - -void QQmlEngineDebugClient::removeWatch(quint32 id, bool *success) -{ - *success = false; - if (state() == QQmlDebugClient::Enabled) { - QPacket ds(connection()->currentDataStreamVersion()); - ds << QByteArray("NO_WATCH") << id; - sendMessage(ds.data()); - *success = true; - } -} - -quint32 QQmlEngineDebugClient::queryAvailableEngines(bool *success) -{ - m_engines.clear(); - quint32 id = -1; - *success = false; - if (state() == QQmlDebugClient::Enabled) { - id = getId(); - QPacket ds(connection()->currentDataStreamVersion()); - ds << QByteArray("LIST_ENGINES") << id; - sendMessage(ds.data()); - *success = true; - } - return id; -} - -quint32 QQmlEngineDebugClient::queryRootContexts( - const QmlDebugEngineReference &engine, bool *success) -{ - m_rootContext = QmlDebugContextReference(); - quint32 id = -1; - *success = false; - if (state() == QQmlDebugClient::Enabled && engine.debugId != -1) { - id = getId(); - QPacket ds(connection()->currentDataStreamVersion()); - ds << QByteArray("LIST_OBJECTS") << id << engine.debugId; - sendMessage(ds.data()); - *success = true; - } - return id; -} - -quint32 QQmlEngineDebugClient::queryObject( - const QmlDebugObjectReference &object, bool *success) -{ - m_object = QmlDebugObjectReference(); - quint32 id = -1; - *success = false; - if (state() == QQmlDebugClient::Enabled && object.debugId != -1) { - id = getId(); - QPacket ds(connection()->currentDataStreamVersion()); - ds << QByteArray("FETCH_OBJECT") << id << object.debugId << false << true; - sendMessage(ds.data()); - *success = true; - } - return id; -} - -quint32 QQmlEngineDebugClient::queryObjectsForLocation( - const QString &file, int lineNumber, int columnNumber, bool *success) -{ - m_objects.clear(); - quint32 id = -1; - *success = false; - if (state() == QQmlDebugClient::Enabled) { - id = getId(); - QPacket ds(connection()->currentDataStreamVersion()); - ds << QByteArray("FETCH_OBJECTS_FOR_LOCATION") << id << file << lineNumber - << columnNumber << false << true; - sendMessage(ds.data()); - *success = true; - } - return id; -} - -quint32 QQmlEngineDebugClient::queryObjectRecursive( - const QmlDebugObjectReference &object, bool *success) -{ - m_object = QmlDebugObjectReference(); - quint32 id = -1; - *success = false; - if (state() == QQmlDebugClient::Enabled && object.debugId != -1) { - id = getId(); - QPacket ds(connection()->currentDataStreamVersion()); - ds << QByteArray("FETCH_OBJECT") << id << object.debugId << true << true; - sendMessage(ds.data()); - *success = true; - } - return id; -} - -quint32 QQmlEngineDebugClient::queryObjectsForLocationRecursive(const QString &file, - int lineNumber, int columnNumber, bool *success) -{ - m_objects.clear(); - quint32 id = -1; - *success = false; - if (state() == QQmlDebugClient::Enabled) { - id = getId(); - QPacket ds(connection()->currentDataStreamVersion()); - ds << QByteArray("FETCH_OBJECTS_FOR_LOCATION") << id << file << lineNumber - << columnNumber << true << true; - sendMessage(ds.data()); - *success = true; - } - return id; -} - -quint32 QQmlEngineDebugClient::queryExpressionResult( - int objectDebugId, const QString &expr, bool *success) -{ - m_exprResult = QVariant(); - quint32 id = -1; - *success = false; - if (state() == QQmlDebugClient::Enabled) { - id = getId(); - QPacket ds(connection()->currentDataStreamVersion()); - ds << QByteArray("EVAL_EXPRESSION") << id << objectDebugId << expr - << engines()[0].debugId; - sendMessage(ds.data()); - *success = true; - } - return id; -} - -quint32 QQmlEngineDebugClient::queryExpressionResultBC( - int objectDebugId, const QString &expr, bool *success) -{ - m_exprResult = QVariant(); - quint32 id = -1; - *success = false; - if (state() == QQmlDebugClient::Enabled) { - id = getId(); - QPacket ds(connection()->currentDataStreamVersion()); - ds << QByteArray("EVAL_EXPRESSION") << id << objectDebugId << expr; - sendMessage(ds.data()); - *success = true; - } - return id; -} - -quint32 QQmlEngineDebugClient::setBindingForObject( - int objectDebugId, - const QString &propertyName, - const QVariant &bindingExpression, - bool isLiteralValue, - QString source, int line, - bool *success) -{ - quint32 id = -1; - *success = false; - if (state() == QQmlDebugClient::Enabled && objectDebugId != -1) { - id = getId(); - QPacket ds(connection()->currentDataStreamVersion()); - ds << QByteArray("SET_BINDING") << id << objectDebugId << propertyName - << bindingExpression << isLiteralValue << source << line; - sendMessage(ds.data()); - *success = true; - } - return id; -} - -quint32 QQmlEngineDebugClient::resetBindingForObject( - int objectDebugId, - const QString &propertyName, - bool *success) -{ - quint32 id = -1; - *success = false; - if (state() == QQmlDebugClient::Enabled && objectDebugId != -1) { - id = getId(); - QPacket ds(connection()->currentDataStreamVersion()); - ds << QByteArray("RESET_BINDING") << id << objectDebugId << propertyName; - sendMessage(ds.data()); - *success = true; - } - return id; -} - -quint32 QQmlEngineDebugClient::setMethodBody( - int objectDebugId, const QString &methodName, - const QString &methodBody, bool *success) -{ - quint32 id = -1; - *success = false; - if (state() == QQmlDebugClient::Enabled && objectDebugId != -1) { - id = getId(); - QPacket ds(connection()->currentDataStreamVersion()); - ds << QByteArray("SET_METHOD_BODY") << id << objectDebugId - << methodName << methodBody; - sendMessage(ds.data()); - *success = true; - } - return id; -} - -void QQmlEngineDebugClient::decode(QPacket &ds, - QmlDebugObjectReference &o, - bool simple) -{ - QmlObjectData data; - ds >> data; - o.debugId = data.objectId; - o.className = data.objectType; - o.idString = data.idString; - o.name = data.objectName; - o.source.url = data.url; - o.source.lineNumber = data.lineNumber; - o.source.columnNumber = data.columnNumber; - o.contextDebugId = data.contextId; - - if (simple) - return; - - int childCount; - bool recur; - ds >> childCount >> recur; - - for (int ii = 0; ii < childCount; ++ii) { - o.children.append(QmlDebugObjectReference()); - decode(ds, o.children.last(), !recur); - } - - int propCount; - ds >> propCount; - - for (int ii = 0; ii < propCount; ++ii) { - QmlObjectProperty data; - ds >> data; - QmlDebugPropertyReference prop; - prop.objectDebugId = o.debugId; - prop.name = data.name; - prop.binding = data.binding; - prop.hasNotifySignal = data.hasNotifySignal; - prop.valueTypeName = data.valueTypeName; - switch (data.type) { - case QmlObjectProperty::Basic: - case QmlObjectProperty::List: - case QmlObjectProperty::SignalProperty: - { - prop.value = data.value; - break; - } - case QmlObjectProperty::Object: - { - QmlDebugObjectReference obj; - obj.name = data.value.toString(); - obj.className = prop.valueTypeName; - prop.value = qVariantFromValue(obj); - break; - } - case QmlObjectProperty::Unknown: - break; - } - o.properties << prop; - } -} - -void QQmlEngineDebugClient::decode(QPacket &ds, - QList<QmlDebugObjectReference> &o, - bool simple) -{ - int count; - ds >> count; - for (int i = 0; i < count; i++) { - QmlDebugObjectReference obj; - decode(ds, obj, simple); - o << obj; - } -} - -void QQmlEngineDebugClient::decode(QPacket &ds, - QmlDebugContextReference &c) -{ - ds >> c.name >> c.debugId; - - int contextCount; - ds >> contextCount; - - for (int ii = 0; ii < contextCount; ++ii) { - c.contexts.append(QmlDebugContextReference()); - decode(ds, c.contexts.last()); - } - - int objectCount; - ds >> objectCount; - - for (int ii = 0; ii < objectCount; ++ii) { - QmlDebugObjectReference obj; - decode(ds, obj, true); - - obj.contextDebugId = c.debugId; - c.objects << obj; - } -} - -void QQmlEngineDebugClient::messageReceived(const QByteArray &data) -{ - m_valid = false; - QPacket ds(connection()->currentDataStreamVersion(), data); - - int queryId; - QByteArray type; - ds >> type >> queryId; - - //qDebug() << "QQmlEngineDebugPrivate::message()" << type; - - if (type == "LIST_ENGINES_R") { - int count; - ds >> count; - - m_engines.clear(); - for (int ii = 0; ii < count; ++ii) { - QmlDebugEngineReference eng; - ds >> eng.name; - ds >> eng.debugId; - m_engines << eng; - } - } else if (type == "LIST_OBJECTS_R") { - if (!ds.atEnd()) - decode(ds, m_rootContext); - - } else if (type == "FETCH_OBJECT_R") { - if (!ds.atEnd()) - decode(ds, m_object, false); - - } else if (type == "FETCH_OBJECTS_FOR_LOCATION_R") { - if (!ds.atEnd()) - decode(ds, m_objects, false); - - } else if (type == "EVAL_EXPRESSION_R") {; - ds >> m_exprResult; - - } else if (type == "WATCH_PROPERTY_R") { - ds >> m_valid; - - } else if (type == "WATCH_OBJECT_R") { - ds >> m_valid; - - } else if (type == "WATCH_EXPR_OBJECT_R") { - ds >> m_valid; - - } else if (type == "UPDATE_WATCH") { - int debugId; - QByteArray name; - QVariant value; - ds >> debugId >> name >> value; - emit valueChanged(name, value); - return; - - } else if (type == "OBJECT_CREATED") { - int engineId, objectId, parentId; - ds >> engineId >> objectId >> parentId; - emit newObject(objectId); - return; - } else if (type == "SET_BINDING_R") { - ds >> m_valid; - } else if (type == "RESET_BINDING_R") { - ds >> m_valid; - } else if (type == "SET_METHOD_BODY_R") { - ds >> m_valid; - } else if (type == "NO_WATCH_R") { - ds >> m_valid; - } - emit result(); -} - diff --git a/tests/auto/qml/debugger/shared/qqmlenginedebugclient.h b/tests/auto/qml/debugger/shared/qqmlenginedebugclient.h deleted file mode 100644 index 5d74f2d43c..0000000000 --- a/tests/auto/qml/debugger/shared/qqmlenginedebugclient.h +++ /dev/null @@ -1,233 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtQml 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$ -** -****************************************************************************/ - -#ifndef QQMLENGINEDEBUGCLIENT_H -#define QQMLENGINEDEBUGCLIENT_H - -#include <private/qqmldebugclient_p.h> -#include <private/qpacket_p.h> - -#include <QtCore/qurl.h> -#include <QtCore/qvariant.h> - -struct QmlDebugPropertyReference -{ - QmlDebugPropertyReference() - : objectDebugId(-1), hasNotifySignal(false) - { - } - - QmlDebugPropertyReference &operator=( - const QmlDebugPropertyReference &o) - { - objectDebugId = o.objectDebugId; name = o.name; value = o.value; - valueTypeName = o.valueTypeName; binding = o.binding; - hasNotifySignal = o.hasNotifySignal; - return *this; - } - - int objectDebugId; - QString name; - QVariant value; - QString valueTypeName; - QString binding; - bool hasNotifySignal; -}; - -struct QmlDebugFileReference -{ - QmlDebugFileReference() - : lineNumber(-1), columnNumber(-1) - { - } - - QmlDebugFileReference &operator=( - const QmlDebugFileReference &o) - { - url = o.url; lineNumber = o.lineNumber; columnNumber = o.columnNumber; - return *this; - } - - QUrl url; - int lineNumber; - int columnNumber; -}; - -struct QmlDebugObjectReference -{ - QmlDebugObjectReference() - : debugId(-1), contextDebugId(-1) - { - } - - QmlDebugObjectReference(int id) - : debugId(id), contextDebugId(-1) - { - } - - QmlDebugObjectReference &operator=( - const QmlDebugObjectReference &o) - { - debugId = o.debugId; className = o.className; idString = o.idString; - name = o.name; source = o.source; contextDebugId = o.contextDebugId; - properties = o.properties; children = o.children; - return *this; - } - int debugId; - QString className; - QString idString; - QString name; - QmlDebugFileReference source; - int contextDebugId; - QList<QmlDebugPropertyReference> properties; - QList<QmlDebugObjectReference> children; -}; - -Q_DECLARE_METATYPE(QmlDebugObjectReference) - -struct QmlDebugContextReference -{ - QmlDebugContextReference() - : debugId(-1) - { - } - - QmlDebugContextReference &operator=( - const QmlDebugContextReference &o) - { - debugId = o.debugId; name = o.name; objects = o.objects; - contexts = o.contexts; - return *this; - } - - int debugId; - QString name; - QList<QmlDebugObjectReference> objects; - QList<QmlDebugContextReference> contexts; -}; - -struct QmlDebugEngineReference -{ - QmlDebugEngineReference() - : debugId(-1) - { - } - - QmlDebugEngineReference(int id) - : debugId(id) - { - } - - QmlDebugEngineReference &operator=( - const QmlDebugEngineReference &o) - { - debugId = o.debugId; name = o.name; - return *this; - } - - int debugId; - QString name; -}; - -class QQmlEngineDebugClient : public QQmlDebugClient -{ - Q_OBJECT -public: - explicit QQmlEngineDebugClient(QQmlDebugConnection *conn); - - quint32 addWatch(const QmlDebugPropertyReference &, - bool *success); - quint32 addWatch(const QmlDebugContextReference &, const QString &, - bool *success); - quint32 addWatch(const QmlDebugObjectReference &, const QString &, - bool *success); - quint32 addWatch(const QmlDebugObjectReference &, - bool *success); - quint32 addWatch(const QmlDebugFileReference &, - bool *success); - - void removeWatch(quint32 watch, bool *success); - - quint32 queryAvailableEngines(bool *success); - quint32 queryRootContexts(const QmlDebugEngineReference &, - bool *success); - quint32 queryObject(const QmlDebugObjectReference &, - bool *success); - quint32 queryObjectsForLocation(const QString &file, - int lineNumber, int columnNumber, bool *success); - quint32 queryObjectRecursive(const QmlDebugObjectReference &, - bool *success); - quint32 queryObjectsForLocationRecursive(const QString &file, - int lineNumber, int columnNumber, bool *success); - quint32 queryExpressionResult(int objectDebugId, - const QString &expr, - bool *success); - quint32 queryExpressionResultBC(int objectDebugId, - const QString &expr, - bool *success); - quint32 setBindingForObject(int objectDebugId, const QString &propertyName, - const QVariant &bindingExpression, - bool isLiteralValue, - QString source, int line, bool *success); - quint32 resetBindingForObject(int objectDebugId, - const QString &propertyName, bool *success); - quint32 setMethodBody(int objectDebugId, const QString &methodName, - const QString &methodBody, bool *success); - - quint32 getId() { return m_nextId++; } - - void decode(QPacket &ds, QmlDebugContextReference &); - void decode(QPacket &ds, QmlDebugObjectReference &, bool simple); - void decode(QPacket &ds, QList<QmlDebugObjectReference> &o, bool simple); - - QList<QmlDebugEngineReference> engines() { return m_engines; } - QmlDebugContextReference rootContext() { return m_rootContext; } - QmlDebugObjectReference object() { return m_object; } - QList<QmlDebugObjectReference> objects() { return m_objects; } - QVariant resultExpr() { return m_exprResult; } - bool valid() { return m_valid; } - -signals: - void newObject(int objectId); - void valueChanged(QByteArray,QVariant); - void result(); - -protected: - void messageReceived(const QByteArray &); - -private: - quint32 m_nextId; - bool m_valid; - QList<QmlDebugEngineReference> m_engines; - QmlDebugContextReference m_rootContext; - QmlDebugObjectReference m_object; - QList<QmlDebugObjectReference> m_objects; - QVariant m_exprResult; -}; - -#endif // QQMLENGINEDEBUGCLIENT_H diff --git a/tests/auto/qml/debugger/shared/qqmlenginedebugclient.pri b/tests/auto/qml/debugger/shared/qqmlenginedebugclient.pri deleted file mode 100644 index a969b4f153..0000000000 --- a/tests/auto/qml/debugger/shared/qqmlenginedebugclient.pri +++ /dev/null @@ -1,3 +0,0 @@ -HEADERS += $$PWD/qqmlenginedebugclient.h - -SOURCES += $$PWD/qqmlenginedebugclient.cpp diff --git a/tests/auto/qml/debugger/shared/qqmlinspectorclient.cpp b/tests/auto/qml/debugger/shared/qqmlinspectorclient.cpp deleted file mode 100644 index 20faef177e..0000000000 --- a/tests/auto/qml/debugger/shared/qqmlinspectorclient.cpp +++ /dev/null @@ -1,124 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite 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$ -** -****************************************************************************/ - -#include "qqmlinspectorclient.h" - -#include <private/qpacket_p.h> -#include <private/qqmldebugconnection_p.h> -#include <QtCore/qdebug.h> - -QQmlInspectorClient::QQmlInspectorClient(QQmlDebugConnection *connection) : - QQmlDebugClient(QLatin1String("QmlInspector"), connection), - m_lastRequestId(-1) -{ -} - -int QQmlInspectorClient::setInspectToolEnabled(bool enabled) -{ - QPacket ds(connection()->currentDataStreamVersion()); - ds << QByteArray("request") << ++m_lastRequestId - << QByteArray(enabled ? "enable" : "disable"); - - sendMessage(ds.data()); - return m_lastRequestId; -} - -int QQmlInspectorClient::setShowAppOnTop(bool showOnTop) -{ - QPacket ds(connection()->currentDataStreamVersion()); - ds << QByteArray("request") << ++m_lastRequestId - << QByteArray("showAppOnTop") << showOnTop; - - sendMessage(ds.data()); - return m_lastRequestId; -} - -int QQmlInspectorClient::setAnimationSpeed(qreal speed) -{ - QPacket ds(connection()->currentDataStreamVersion()); - ds << QByteArray("request") << ++m_lastRequestId - << QByteArray("setAnimationSpeed") << speed; - - sendMessage(ds.data()); - return m_lastRequestId; -} - -int QQmlInspectorClient::select(const QList<int> &objectIds) -{ - QPacket ds(connection()->currentDataStreamVersion()); - ds << QByteArray("request") << ++m_lastRequestId - << QByteArray("select") << objectIds; - - sendMessage(ds.data()); - return m_lastRequestId; -} - -int QQmlInspectorClient::createObject(const QString &qml, int parentId, const QStringList &imports, - const QString &filename) -{ - QPacket ds(connection()->currentDataStreamVersion()); - ds << QByteArray("request") << ++m_lastRequestId - << QByteArray("createObject") << qml << parentId << imports << filename; - sendMessage(ds.data()); - return m_lastRequestId; -} - -int QQmlInspectorClient::moveObject(int childId, int newParentId) -{ - QPacket ds(connection()->currentDataStreamVersion()); - ds << QByteArray("request") << ++m_lastRequestId - << QByteArray("moveObject") << childId << newParentId; - sendMessage(ds.data()); - return m_lastRequestId; -} - -int QQmlInspectorClient::destroyObject(int objectId) -{ - QPacket ds(connection()->currentDataStreamVersion()); - ds << QByteArray("request") << ++m_lastRequestId - << QByteArray("destroyObject") << objectId; - sendMessage(ds.data()); - return m_lastRequestId; -} - -void QQmlInspectorClient::messageReceived(const QByteArray &message) -{ - QPacket ds(connection()->currentDataStreamVersion(), message); - QByteArray type; - ds >> type; - - if (type != QByteArray("response")) { - qDebug() << "Unhandled message of type" << type; - return; - } - - int responseId; - bool result; - ds >> responseId >> result; - emit responseReceived(responseId, result); -} diff --git a/tests/auto/qml/debugger/shared/qqmlinspectorclient.pri b/tests/auto/qml/debugger/shared/qqmlinspectorclient.pri deleted file mode 100644 index c136e1313a..0000000000 --- a/tests/auto/qml/debugger/shared/qqmlinspectorclient.pri +++ /dev/null @@ -1,3 +0,0 @@ -HEADERS += $$PWD/qqmlinspectorclient.h - -SOURCES += $$PWD/qqmlinspectorclient.cpp diff --git a/tests/auto/qml/qjsengine/tst_qjsengine.cpp b/tests/auto/qml/qjsengine/tst_qjsengine.cpp index 0491ccd473..3e871108bc 100644 --- a/tests/auto/qml/qjsengine/tst_qjsengine.cpp +++ b/tests/auto/qml/qjsengine/tst_qjsengine.cpp @@ -504,7 +504,7 @@ void tst_QJSEngine::newVariant_valueOfToString() QJSValue value = object.property("valueOf").callWithInstance(object); QVERIFY(value.isObject()); QVERIFY(value.strictlyEquals(object)); - QCOMPARE(object.toString(), QString::fromLatin1("QVariant(QPoint)")); + QCOMPARE(object.toString(), QString::fromLatin1("QVariant(QPoint, QPoint(10,20))")); } } @@ -3156,7 +3156,7 @@ void tst_QJSEngine::dateRoundtripJSQtJS() #ifdef Q_OS_WIN QSKIP("This test fails on Windows due to a bug in QDateTime."); #endif - uint secs = QDateTime(QDate(2009, 1, 1)).toUTC().toTime_t(); + qint64 secs = QDateTime(QDate(2009, 1, 1)).toUTC().toSecsSinceEpoch(); QJSEngine eng; for (int i = 0; i < 8000; ++i) { QJSValue jsDate = eng.evaluate(QString::fromLatin1("new Date(%0)").arg(secs * 1000.0)); @@ -3189,7 +3189,7 @@ void tst_QJSEngine::dateConversionJSQt() #ifdef Q_OS_WIN QSKIP("This test fails on Windows due to a bug in QDateTime."); #endif - uint secs = QDateTime(QDate(2009, 1, 1)).toUTC().toTime_t(); + qint64 secs = QDateTime(QDate(2009, 1, 1)).toUTC().toSecsSinceEpoch(); QJSEngine eng; for (int i = 0; i < 8000; ++i) { QJSValue jsDate = eng.evaluate(QString::fromLatin1("new Date(%0)").arg(secs * 1000.0)); @@ -3680,7 +3680,7 @@ void tst_QJSEngine::translateScript() QJSEngine engine; TranslationScope tranScope(":/translations/translatable_la"); - engine.installTranslatorFunctions(); + engine.installExtensions(QJSEngine::TranslationExtension); QCOMPARE(engine.evaluate(expression, fileName).toString(), expectedTranslation); } @@ -3689,7 +3689,7 @@ void tst_QJSEngine::translateScript_crossScript() { QJSEngine engine; TranslationScope tranScope(":/translations/translatable_la"); - engine.installTranslatorFunctions(); + engine.installExtensions(QJSEngine::TranslationExtension); QString fileName = QString::fromLatin1("translatable.js"); QString fileName2 = QString::fromLatin1("translatable2.js"); @@ -3711,7 +3711,7 @@ void tst_QJSEngine::translateScript_trNoOp() { QJSEngine engine; TranslationScope tranScope(":/translations/translatable_la"); - engine.installTranslatorFunctions(); + engine.installExtensions(QJSEngine::TranslationExtension); QVERIFY(engine.evaluate("QT_TR_NOOP()").isUndefined()); QCOMPARE(engine.evaluate("QT_TR_NOOP('One')").toString(), QString::fromLatin1("One")); @@ -3725,7 +3725,7 @@ void tst_QJSEngine::translateScript_callQsTrFromCpp() { QJSEngine engine; TranslationScope tranScope(":/translations/translatable_la"); - engine.installTranslatorFunctions(); + engine.installExtensions(QJSEngine::TranslationExtension); // There is no context, but it shouldn't crash QCOMPARE(engine.globalObject().property("qsTr").call(QJSValueList() << "One").toString(), QString::fromLatin1("One")); @@ -3758,7 +3758,7 @@ void tst_QJSEngine::translateWithInvalidArgs() QFETCH(QString, expression); QFETCH(QString, expectedError); QJSEngine engine; - engine.installTranslatorFunctions(); + engine.installExtensions(QJSEngine::TranslationExtension); QJSValue result = engine.evaluate(expression); QVERIFY(result.isError()); QCOMPARE(result.toString(), expectedError); @@ -3794,7 +3794,7 @@ void tst_QJSEngine::translationContext() TranslationScope tranScope(":/translations/translatable_la"); QJSEngine engine; - engine.installTranslatorFunctions(); + engine.installExtensions(QJSEngine::TranslationExtension); QFETCH(QString, path); QFETCH(QString, text); @@ -3809,7 +3809,7 @@ void tst_QJSEngine::translateScriptIdBased() QJSEngine engine; TranslationScope tranScope(":/translations/idtranslatable_la"); - engine.installTranslatorFunctions(); + engine.installExtensions(QJSEngine::TranslationExtension); QString fileName = QString::fromLatin1("idtranslatable.js"); @@ -3891,7 +3891,7 @@ void tst_QJSEngine::translateScriptUnicode() QJSEngine engine; TranslationScope tranScope(":/translations/translatable-unicode"); - engine.installTranslatorFunctions(); + engine.installExtensions(QJSEngine::TranslationExtension); QCOMPARE(engine.evaluate(expression, fileName).toString(), expectedTranslation); } @@ -3921,7 +3921,7 @@ void tst_QJSEngine::translateScriptUnicodeIdBased() QJSEngine engine; TranslationScope tranScope(":/translations/idtranslatable-unicode"); - engine.installTranslatorFunctions(); + engine.installExtensions(QJSEngine::TranslationExtension); QCOMPARE(engine.evaluate(expression).toString(), expectedTranslation); } @@ -3929,7 +3929,7 @@ void tst_QJSEngine::translateScriptUnicodeIdBased() void tst_QJSEngine::translateFromBuiltinCallback() { QJSEngine eng; - eng.installTranslatorFunctions(); + eng.installExtensions(QJSEngine::TranslationExtension); // Callback has no translation context. eng.evaluate("function foo() { qsTr('foo'); }"); diff --git a/tests/auto/qml/qjsvalue/tst_qjsvalue.cpp b/tests/auto/qml/qjsvalue/tst_qjsvalue.cpp index f9718e3699..b58cd98d1e 100644 --- a/tests/auto/qml/qjsvalue/tst_qjsvalue.cpp +++ b/tests/auto/qml/qjsvalue/tst_qjsvalue.cpp @@ -405,7 +405,7 @@ void tst_QJSValue::toString() // then fall back to "QVariant(typename)" QJSValue variant = eng.toScriptValue(QPoint(10, 20)); QVERIFY(variant.isVariant()); - QCOMPARE(variant.toString(), QString::fromLatin1("QVariant(QPoint)")); + QCOMPARE(variant.toString(), QString::fromLatin1("QVariant(QPoint, QPoint(10,20))")); variant = eng.toScriptValue(QUrl()); QVERIFY(variant.isVariant()); QVERIFY(variant.toString().isEmpty()); diff --git a/tests/auto/qml/qml.pro b/tests/auto/qml/qml.pro index 7cfddf0eaf..5448088ee5 100644 --- a/tests/auto/qml/qml.pro +++ b/tests/auto/qml/qml.pro @@ -104,3 +104,7 @@ qtConfig(private_tests): \ qtNomakeTools( \ qmlplugindump \ ) + +QtConfig(qml_tracing) { + PRIVATETESTS += v4traced +} diff --git a/tests/auto/qml/qmlcachegen/data/Retain.qml b/tests/auto/qml/qmlcachegen/data/Retain.qml new file mode 100644 index 0000000000..0e69012662 --- /dev/null +++ b/tests/auto/qml/qmlcachegen/data/Retain.qml @@ -0,0 +1,2 @@ +import QtQml 2.0 +QtObject {} diff --git a/tests/auto/qml/qmlcachegen/qmlcachegen.pro b/tests/auto/qml/qmlcachegen/qmlcachegen.pro index 7f8e93d101..7bd4414302 100644 --- a/tests/auto/qml/qmlcachegen/qmlcachegen.pro +++ b/tests/auto/qml/qmlcachegen/qmlcachegen.pro @@ -24,9 +24,12 @@ workerscripts_test.prefix = /workerscripts RESOURCES += \ workerscripts_test \ - trickypaths.qrc + trickypaths.qrc \ + retain.qrc # QTBUG-46375 !win32: RESOURCES += trickypaths_umlaut.qrc +QTQUICK_COMPILER_RETAINED_RESOURCES += retain.qrc + QT += core-private qml-private testlib diff --git a/tests/auto/qml/qmlcachegen/retain.qrc b/tests/auto/qml/qmlcachegen/retain.qrc new file mode 100644 index 0000000000..e5eed9b12f --- /dev/null +++ b/tests/auto/qml/qmlcachegen/retain.qrc @@ -0,0 +1,5 @@ +<RCC> + <qresource prefix="/"> + <file alias="Retain.qml">data/Retain.qml</file> + </qresource> +</RCC> diff --git a/tests/auto/qml/qmlcachegen/tst_qmlcachegen.cpp b/tests/auto/qml/qmlcachegen/tst_qmlcachegen.cpp index e290f21986..5462e6c8ae 100644 --- a/tests/auto/qml/qmlcachegen/tst_qmlcachegen.cpp +++ b/tests/auto/qml/qmlcachegen/tst_qmlcachegen.cpp @@ -54,6 +54,7 @@ private slots: void aheadOfTimeCompilation(); void functionExpressions(); void versionChecksForAheadOfTimeUnits(); + void retainedResources(); void workerScripts(); @@ -401,6 +402,13 @@ void tst_qmlcachegen::versionChecksForAheadOfTimeUnits() QQmlMetaType::removeCachedUnitLookupFunction(testHandler); } +void tst_qmlcachegen::retainedResources() +{ + QFile file(":/Retain.qml"); + QVERIFY(file.open(QIODevice::ReadOnly)); + QVERIFY(file.readAll().startsWith("import QtQml 2.0")); +} + void tst_qmlcachegen::workerScripts() { QVERIFY(QFile::exists(":/workerscripts/data/worker.js")); diff --git a/tests/auto/qml/qqmlconsole/data/logging.qml b/tests/auto/qml/qqmlconsole/data/logging.qml index 0764ad7545..1f929d311b 100644 --- a/tests/auto/qml/qqmlconsole/data/logging.qml +++ b/tests/auto/qml/qqmlconsole/data/logging.qml @@ -68,6 +68,8 @@ QtObject { console.log(1, ["ping","pong"], new Object, 2); console.log(contextStringListProperty); + console.log(customObject); + console.log([[1,2,3,[2,2,2,2],4],[5,6,7,8]]); try { console.log(exception); diff --git a/tests/auto/qml/qqmlconsole/tst_qqmlconsole.cpp b/tests/auto/qml/qqmlconsole/tst_qqmlconsole.cpp index 817ca0a257..b157314071 100644 --- a/tests/auto/qml/qqmlconsole/tst_qqmlconsole.cpp +++ b/tests/auto/qml/qqmlconsole/tst_qqmlconsole.cpp @@ -51,6 +51,15 @@ private: QQmlEngine engine; }; +struct CustomObject {}; + +QDebug operator<<(QDebug dbg, const CustomObject &) +{ + return dbg << "MY OBJECT"; +} + +Q_DECLARE_METATYPE(CustomObject) + void tst_qqmlconsole::logging() { QUrl testUrl = testFileUrl("logging.qml"); @@ -83,11 +92,17 @@ void tst_qqmlconsole::logging() QTest::ignoreMessage(QtDebugMsg, "1 pong! [object Object]"); QTest::ignoreMessage(QtDebugMsg, "1 [ping,pong] [object Object] 2"); QTest::ignoreMessage(QtDebugMsg, "[Hello,World]"); + QTest::ignoreMessage(QtDebugMsg, "QVariant(CustomObject, MY OBJECT)"); + QTest::ignoreMessage(QtDebugMsg, "[[1,2,3,[2,2,2,2],4],[5,6,7,8]]"); QScopedPointer<QQmlContext> loggingContext(new QQmlContext(engine.rootContext())); QStringList stringList; stringList << QStringLiteral("Hello") << QStringLiteral("World"); loggingContext->setContextProperty("contextStringListProperty", stringList); + CustomObject customObject; + QVERIFY(QMetaType::registerDebugStreamOperator<CustomObject>()); + loggingContext->setContextProperty("customObject", QVariant::fromValue(customObject)); + QQmlComponent component(&engine, testUrl); QScopedPointer<QObject> object(component.create(loggingContext.data())); QVERIFY(object != nullptr); diff --git a/tests/auto/qml/qqmlecmascript/data/qmlVarNullBinding.qml b/tests/auto/qml/qqmlecmascript/data/qmlVarNullBinding.qml new file mode 100644 index 0000000000..6666b85ffd --- /dev/null +++ b/tests/auto/qml/qqmlecmascript/data/qmlVarNullBinding.qml @@ -0,0 +1,7 @@ +import QtQml 2.2 + +QtObject { + property var foo: null + property bool signalSeen: false + onFooChanged: signalSeen = true +} diff --git a/tests/auto/qml/qqmlecmascript/testtypes.h b/tests/auto/qml/qqmlecmascript/testtypes.h index 8d89df31db..4547a74470 100644 --- a/tests/auto/qml/qqmlecmascript/testtypes.h +++ b/tests/auto/qml/qqmlecmascript/testtypes.h @@ -1502,7 +1502,7 @@ public: } break; case Qt::OffsetFromUTC: - m_offset = m_datetime.utcOffset() / 60; + m_offset = m_datetime.offsetFromUtc() / 60; m_timespec = QString("%1%2:%3").arg(m_offset < 0 ? '-' : '+') .arg(abs(m_offset) / 60) .arg(abs(m_offset) % 60); diff --git a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp index d8784f4855..3cd70a0d1b 100644 --- a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp +++ b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp @@ -522,22 +522,22 @@ void tst_qqmlecmascript::exportDate_data() QTest::newRow("UTC late") << testFileUrl("exportDate.4.qml") << QDateTime(date, late, Qt::UTC); { QDateTime dt(date, early, Qt::OffsetFromUTC); - dt.setUtcOffset(offset); + dt.setOffsetFromUtc(offset); QTest::newRow("+11:30 early") << testFileUrl("exportDate.5.qml") << dt; } { QDateTime dt(date, late, Qt::OffsetFromUTC); - dt.setUtcOffset(offset); + dt.setOffsetFromUtc(offset); QTest::newRow("+11:30 late") << testFileUrl("exportDate.6.qml") << dt; } { QDateTime dt(date, early, Qt::OffsetFromUTC); - dt.setUtcOffset(-offset); + dt.setOffsetFromUtc(-offset); QTest::newRow("-11:30 early") << testFileUrl("exportDate.7.qml") << dt; } { QDateTime dt(date, late, Qt::OffsetFromUTC); - dt.setUtcOffset(-offset); + dt.setOffsetFromUtc(-offset); QTest::newRow("-11:30 late") << testFileUrl("exportDate.8.qml") << dt; } } @@ -5996,6 +5996,13 @@ void tst_qqmlecmascript::nullObjectInitializer() QVERIFY(value.userType() == qMetaTypeId<QObject*>()); QVERIFY(!value.value<QObject*>()); } + + { + QQmlComponent component(&engine, testFileUrl("qmlVarNullBinding.qml")); + QScopedPointer<QObject> obj(component.create()); + QVERIFY(!obj.isNull()); + QVERIFY(!obj->property("signalSeen").toBool()); + } } // Test that bindings don't evaluate once the engine has been destroyed diff --git a/tests/auto/qml/qqmllanguage/data/assignComponentToWrongType.errors.txt b/tests/auto/qml/qqmllanguage/data/assignComponentToWrongType.errors.txt new file mode 100644 index 0000000000..af103cf8bf --- /dev/null +++ b/tests/auto/qml/qqmllanguage/data/assignComponentToWrongType.errors.txt @@ -0,0 +1 @@ +4:27:Cannot assign object of type "Component" to property of type "QQmlTimer*" as the former is neither the same as the latter nor a sub-class of it. diff --git a/tests/auto/qml/qqmllanguage/data/assignComponentToWrongType.qml b/tests/auto/qml/qqmllanguage/data/assignComponentToWrongType.qml new file mode 100644 index 0000000000..2159bf8116 --- /dev/null +++ b/tests/auto/qml/qqmllanguage/data/assignComponentToWrongType.qml @@ -0,0 +1,9 @@ +import QtQml 2.9 + +QtObject { + property Timer stuff: Component { + QtObject { + objectName: "wrong" + } + } +} diff --git a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp index dea7c6c7ee..22ea3a89c3 100644 --- a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp +++ b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp @@ -612,6 +612,8 @@ void tst_qqmllanguage::errors_data() QTest::newRow("badCompositeRegistration.1") << "badCompositeRegistration.1.qml" << "badCompositeRegistration.1.errors.txt" << false; QTest::newRow("badCompositeRegistration.2") << "badCompositeRegistration.2.qml" << "badCompositeRegistration.2.errors.txt" << false; + + QTest::newRow("assignComponentToWrongType") << "assignComponentToWrongType.qml" << "assignComponentToWrongType.errors.txt" << false; } diff --git a/tests/auto/qml/qqmlpropertycache/data/foreignEnums.qml b/tests/auto/qml/qqmlpropertycache/data/foreignEnums.qml index 7ceb231c8d..b7492e507e 100644 --- a/tests/auto/qml/qqmlpropertycache/data/foreignEnums.qml +++ b/tests/auto/qml/qqmlpropertycache/data/foreignEnums.qml @@ -7,5 +7,11 @@ QtObject { mydata.opt1 = opt1; mydata.setOpt1(opt1); mydata.setOption1(opt1); + + var opt2 = mydata.opt2; + opt2 = (opt2 === MyEnum.Short8 ? MyEnum.Short16 : MyEnum.Short0); + mydata.opt2 = opt2; + mydata.setOpt2(opt2); + mydata.setOption2(opt2); } } diff --git a/tests/auto/qml/qqmlpropertycache/tst_qqmlpropertycache.cpp b/tests/auto/qml/qqmlpropertycache/tst_qqmlpropertycache.cpp index 69c6ce2d35..02b5302a45 100644 --- a/tests/auto/qml/qqmlpropertycache/tst_qqmlpropertycache.cpp +++ b/tests/auto/qml/qqmlpropertycache/tst_qqmlpropertycache.cpp @@ -312,17 +312,27 @@ class MyEnum : public QObject }; Q_DECLARE_FLAGS(Option1, Option1Flag) Q_FLAG(Option1) + + enum ShortEnum: quint16 { + Short0 = 0, + Short8 = 0xff, + Short16 = 0xffff + }; + Q_ENUM(ShortEnum); }; class MyData : public QObject { Q_OBJECT Q_PROPERTY(MyEnum::Option1 opt1 READ opt1 WRITE setOpt1 NOTIFY opt1Changed) + Q_PROPERTY(MyEnum::ShortEnum opt2 READ opt2 WRITE setOpt2 NOTIFY opt2Changed) public: MyEnum::Option1 opt1() const { return m_opt1; } + MyEnum::ShortEnum opt2() const { return m_opt2; } signals: void opt1Changed(MyEnum::Option1 opt1); + void opt2Changed(MyEnum::ShortEnum opt2); public slots: void setOpt1(MyEnum::Option1 opt1) @@ -334,10 +344,21 @@ public slots: } } + void setOpt2(MyEnum::ShortEnum opt2) + { + QCOMPARE(opt2, MyEnum::Short16); + if (opt2 != m_opt2) { + m_opt2 = opt2; + emit opt2Changed(opt2); + } + } + void setOption1(MyEnum::Option1 opt1) { setOpt1(opt1); } + void setOption2(MyEnum::ShortEnum opt2) { setOpt2(opt2); } private: MyEnum::Option1 m_opt1 = MyEnum::Option10; + MyEnum::ShortEnum m_opt2 = MyEnum::Short8; }; void tst_qqmlpropertycache::passForeignEnums() @@ -354,11 +375,14 @@ void tst_qqmlpropertycache::passForeignEnums() QQmlComponent component(&engine, testFile("foreignEnums.qml")); QVERIFY(component.isReady()); - QObject *obj = component.create(engine.rootContext()); + QScopedPointer<QObject> obj(component.create(engine.rootContext())); + QVERIFY(!obj.isNull()); QCOMPARE(data.opt1(), MyEnum::Option1AD); + QCOMPARE(data.opt2(), MyEnum::Short16); } Q_DECLARE_METATYPE(MyEnum::Option1) +Q_DECLARE_METATYPE(MyEnum::ShortEnum) QT_BEGIN_NAMESPACE class SimpleGadget diff --git a/tests/auto/qml/qqmlsqldatabase/data/changeVersion.qml b/tests/auto/qml/qqmlsqldatabase/data/changeVersion.qml new file mode 100644 index 0000000000..7d2683d869 --- /dev/null +++ b/tests/auto/qml/qqmlsqldatabase/data/changeVersion.qml @@ -0,0 +1,67 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** 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. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQml 2.2 +import QtQuick.LocalStorage 2.0 + +QtObject { + property var db; + property string version; + + function create() { + db = LocalStorage.openDatabaseSync("testdb", "2", "stuff for testing", 100000); + version = db.version; + } + + function upgrade() { + db = db.changeVersion(db.version, "22", function(y) {}); + version = db.version; + } +} diff --git a/tests/auto/qml/qqmlsqldatabase/tst_qqmlsqldatabase.cpp b/tests/auto/qml/qqmlsqldatabase/tst_qqmlsqldatabase.cpp index f1dcefdab6..28f9c9a0c2 100644 --- a/tests/auto/qml/qqmlsqldatabase/tst_qqmlsqldatabase.cpp +++ b/tests/auto/qml/qqmlsqldatabase/tst_qqmlsqldatabase.cpp @@ -63,6 +63,7 @@ private slots: void testQml_cleanopen_data(); void testQml_cleanopen(); void totalDatabases(); + void upgradeDatabase(); void cleanupTestCase(); @@ -200,6 +201,22 @@ void tst_qqmlsqldatabase::totalDatabases() QCOMPARE(QDir(dbDir()+"/Databases").entryInfoList(QDir::Files|QDir::NoDotAndDotDot).count(), total_databases_created_by_tests*2); } +void tst_qqmlsqldatabase::upgradeDatabase() +{ + QQmlComponent component(engine, testFile("changeVersion.qml")); + QVERIFY(component.isReady()); + + QObject *object = component.create(); + QVERIFY(object); + QVERIFY(object->property("version").toString().isEmpty()); + + QVERIFY(QMetaObject::invokeMethod(object, "create")); + QCOMPARE(object->property("version").toString(), QLatin1String("2")); + + QVERIFY(QMetaObject::invokeMethod(object, "upgrade")); + QCOMPARE(object->property("version").toString(), QLatin1String("22")); +} + QTEST_MAIN(tst_qqmlsqldatabase) #include "tst_qqmlsqldatabase.moc" diff --git a/tests/auto/qml/qqmlvaluetypes/tst_qqmlvaluetypes.cpp b/tests/auto/qml/qqmlvaluetypes/tst_qqmlvaluetypes.cpp index 1ee4510e30..6ccfc77c25 100644 --- a/tests/auto/qml/qqmlvaluetypes/tst_qqmlvaluetypes.cpp +++ b/tests/auto/qml/qqmlvaluetypes/tst_qqmlvaluetypes.cpp @@ -90,6 +90,7 @@ private slots: void customValueTypeInQml(); void gadgetInheritance(); void gadgetTemplateInheritance(); + void sequences(); void toStringConversion(); void enumerableProperties(); void enumProperties(); @@ -1590,6 +1591,7 @@ struct BaseGadget Q_PROPERTY(int baseProperty READ baseProperty WRITE setBaseProperty) public: BaseGadget() : m_baseProperty(0) {} + BaseGadget(int initValue) : m_baseProperty(initValue) {} int baseProperty() const { return m_baseProperty; } void setBaseProperty(int value) { m_baseProperty = value; } @@ -1686,6 +1688,47 @@ void tst_qqmlvaluetypes::gadgetTemplateInheritance() QCOMPARE(value.property("baseProperty").toInt(), 42); } +void tst_qqmlvaluetypes::sequences() +{ + QJSEngine engine; + { + QList<BaseGadget> gadgetList{1, 4, 7, 8, 15}; + QJSValue value = engine.toScriptValue(gadgetList); + QCOMPARE(value.property("length").toInt(), gadgetList.length()); + for (int i = 0; i < gadgetList.length(); ++i) + QCOMPARE(value.property(i).property("baseProperty").toInt(), gadgetList.at(i).baseProperty()); + } + { + std::vector<BaseGadget> container{1, 4, 7, 8, 15}; + QJSValue value = engine.toScriptValue(container); + QCOMPARE(value.property("length").toInt(), int(container.size())); + for (size_t i = 0; i < container.size(); ++i) + QCOMPARE(value.property(i).property("baseProperty").toInt(), container.at(i).baseProperty()); + } + { + QVector<QChar> qcharVector{1, 4, 42, 8, 15}; + QJSValue value = engine.toScriptValue(qcharVector); + QCOMPARE(value.property("length").toInt(), qcharVector.length()); + for (int i = 0; i < qcharVector.length(); ++i) + QCOMPARE(value.property(i).toInt(), qcharVector.at(i)); + } + { + MyTypeObject a, b, c; + QSet<QObject*> objSet{&a, &b, &c}; + QJSValue value = engine.toScriptValue(objSet); + QCOMPARE(value.property("length").toInt(), objSet.size()); + for (int i = 0; i < objSet.size(); ++i) + QCOMPARE(value.property(i).property("point").property("x").toInt(), a.point().x()); + } + { + MyTypeObject a, b, c; + QSet<MyTypeObject*> container{&a, &b, &c}; + QJSValue value = engine.toScriptValue(container); + QCOMPARE(value.property("length").toInt(), container.size()); + for (int i = 0; i < container.size(); ++i) + QCOMPARE(value.property(i).property("point").property("x").toInt(), a.point().x()); + } +} struct StringLessGadget { Q_GADGET }; diff --git a/tests/auto/qml/qv4assembler/data/crash.qml b/tests/auto/qml/qv4assembler/data/crash.qml new file mode 100644 index 0000000000..dfdb9ceba5 --- /dev/null +++ b/tests/auto/qml/qv4assembler/data/crash.qml @@ -0,0 +1,53 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite 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 QtQml 2.2 +import Crash 1.0 + +QtObject { + property Crash crash: Crash { + id: crash + } + + // Recursion makes the crash more reliable + // With a single frame the unwinder might guess + // the next frame by chance. + function recurse(x) { + if (x > 32) + crash.crash(); + else + recurse(x + 1); + } + + property Timer timer: Timer { + interval: 10 + running: true + onTriggered: recurse(0) + } +} + diff --git a/tests/auto/qml/qv4assembler/qv4assembler.pro b/tests/auto/qml/qv4assembler/qv4assembler.pro index afd7586ac7..895e241cc9 100644 --- a/tests/auto/qml/qv4assembler/qv4assembler.pro +++ b/tests/auto/qml/qv4assembler/qv4assembler.pro @@ -1,7 +1,12 @@ CONFIG += testcase TARGET = tst_qv4assembler + +include (../../shared/util.pri) + macos:CONFIG -= app_bundle +TESTDATA = data/* + SOURCES += tst_qv4assembler.cpp QT += qml-private testlib diff --git a/tests/auto/qml/qv4assembler/tst_qv4assembler.cpp b/tests/auto/qml/qv4assembler/tst_qv4assembler.cpp index 9bd1afa256..4916cb4cc0 100644 --- a/tests/auto/qml/qv4assembler/tst_qv4assembler.cpp +++ b/tests/auto/qml/qv4assembler/tst_qv4assembler.cpp @@ -26,18 +26,34 @@ ** ****************************************************************************/ +#include <util.h> + #include <QtTest/QtTest> #include <QtCore/qprocess.h> #include <QtCore/qtemporaryfile.h> +#include <QtQml/qqml.h> +#include <QtQml/qqmlapplicationengine.h> + +#ifdef Q_OS_WIN +#include <windows.h> +#endif -class tst_QV4Assembler : public QObject +class tst_QV4Assembler : public QQmlDataTest { Q_OBJECT private slots: + void initTestCase() override; void perfMapFile(); + void functionTable(); }; +void tst_QV4Assembler::initTestCase() +{ + qputenv("QV4_JIT_CALL_THRESHOLD", "0"); + QQmlDataTest::initTestCase(); +} + void tst_QV4Assembler::perfMapFile() { #if !defined(Q_OS_LINUX) @@ -85,6 +101,42 @@ void tst_QV4Assembler::perfMapFile() #endif } +#ifdef Q_OS_WIN +class Crash : public QObject +{ + Q_OBJECT +public: + explicit Crash(QObject *parent = nullptr) : QObject(parent) { } + Q_INVOKABLE static void crash(); +}; + +static bool crashHandlerHit = false; + +static LONG WINAPI crashHandler(EXCEPTION_POINTERS*) +{ + crashHandlerHit = true; + return EXCEPTION_CONTINUE_EXECUTION; +} + +void Crash::crash() +{ + SetUnhandledExceptionFilter(crashHandler); + RaiseException(EXCEPTION_ACCESS_VIOLATION, 0, 0, nullptr); +} +#endif + +void tst_QV4Assembler::functionTable() +{ +#ifndef Q_OS_WIN + QSKIP("Function tables only exist on windows."); +#else + QQmlApplicationEngine engine; + qmlRegisterType<Crash>("Crash", 1, 0, "Crash"); + engine.load(testFileUrl("crash.qml")); + QTRY_VERIFY(crashHandlerHit); +#endif +} + QTEST_MAIN(tst_QV4Assembler) #include "tst_qv4assembler.moc" diff --git a/tests/auto/qml/v4traced/tst_v4traced.cpp b/tests/auto/qml/v4traced/tst_v4traced.cpp new file mode 100644 index 0000000000..f82cc0ed5e --- /dev/null +++ b/tests/auto/qml/v4traced/tst_v4traced.cpp @@ -0,0 +1,325 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite 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$ +** +****************************************************************************/ + +#include <QtTest/QtTest> +#include <QJSEngine> +#include <private/qjsvalue_p.h> +#include <private/qv4scopedvalue_p.h> +#include <private/qv4script_p.h> + +class EnvVarSaver +{ +public: + EnvVarSaver(const char *name, const QByteArray &newValue) + : _name(name) + { + _wasSet = qEnvironmentVariableIsSet(name); + if (_wasSet) + _oldValue = qgetenv(name); + qputenv(name, newValue); + } + + ~EnvVarSaver() + { + if (_wasSet) + qputenv(_name, _oldValue); + else + qunsetenv(_name); + } + +private: + const char *_name; + bool _wasSet; + QByteArray _oldValue; +}; + +class tst_v4traced : public QObject +{ + Q_OBJECT + +private slots: + void collectTraces_data(); + void collectTraces(); + + void binopI32deopt_data(); + void binopI32deopt(); + + void calls_data(); + void calls(); + + void setLookup(); + void construct(); +}; + +void tst_v4traced::collectTraces_data() +{ + QTest::addColumn<QString>("code"); + QTest::addColumn<int>("tracePointCount"); + QTest::addColumn<int>("interestingTracePoint"); + QTest::addColumn<quint8>("expectedBits"); + + QTest::newRow("int+") << "var a = 4; a + 2" << 2 << 1 << quint8(QV4::ObservedTraceValues::Integer); + QTest::newRow("double+") << "var a = 4.1; a + 1.9" << 2 << 1 << quint8(QV4::ObservedTraceValues::Double); + QTest::newRow("object+") << "var a = '4'; a + '2'" << 2 << 1 << quint8(QV4::ObservedTraceValues::Other); +} + +void tst_v4traced::collectTraces() +{ + QFETCH(QString, code); + QFETCH(int, tracePointCount); + QFETCH(int, interestingTracePoint); + QFETCH(quint8, expectedBits); + + EnvVarSaver forceInterpreter("QV4_FORCE_INTERPRETER", "1"); + EnvVarSaver forceTracing("QV4_FORCE_TRACING", "1"); + + QV4::ExecutionEngine vm; + QV4::Scope scope(&vm); + QV4::ScopedContext ctx(scope, vm.rootContext()); + QV4::ScopedValue result(scope); + QScopedPointer<QV4::Script> script; + script.reset(new QV4::Script(ctx, QV4::Compiler::ContextType::Global, code, "collectTraces")); + script->parseAsBinding = false; + + QVERIFY(!scope.engine->hasException); + script->parse(); + QVERIFY(!scope.engine->hasException); + + QVERIFY(script->function()->tracingEnabled()); + result = script->run(); + QVERIFY(!scope.engine->hasException); + + QCOMPARE(int(script->function()->compiledFunction->nTraceInfos), tracePointCount); + QCOMPARE(*script->function()->traceInfo(interestingTracePoint), expectedBits); +} + +void tst_v4traced::binopI32deopt_data() +{ + QTest::addColumn<QString>("operand"); + QTest::addColumn<int>("int_arg1"); + QTest::addColumn<int>("int_arg2"); + QTest::addColumn<int>("int_result"); + QTest::addColumn<QString>("other_arg1"); + QTest::addColumn<QString>("other_arg2"); + QTest::addColumn<double>("other_result"); + + QTest::newRow("+") << "+" << 1 << 2 << 3 << "1.1" << "1.9" << 3.0; + QTest::newRow("-") << "-" << 3 << 2 << 1 << "3.1" << "2.1" << 1.0; + QTest::newRow("*") << "*" << 2 << 3 << 6 << "2.1" << "1.9" << 3.99; + QTest::newRow("/") << "/" << 6 << 3 << 2 << "6.6" << "3.3" << 2.0; + + QTest::newRow("&") << "&" << 6 << 3 << 2 << "'6'" << "'3'" << 2.0; + QTest::newRow("|") << "|" << 6 << 3 << 7 << "'6'" << "'3'" << 7.0; + QTest::newRow("^") << "^" << 6 << 3 << 5 << "'6'" << "'3'" << 5.0; + + QTest::newRow("<<") << "<<" << 5 << 1 << 10 << "'5'" << "'1'" << 10.0; + QTest::newRow(">>") << ">>" << -1 << 1 << -1 << "'-1'" << "'1'" << -1.0; + QTest::newRow(">>>") << ">>>" << -1 << 1 << 0x7FFFFFFF << "'-1'" << "'1'" << 2147483647.0; + + QTest::newRow("==") << "==" << 2 << 1 << 0 << "'2'" << "'1'" << 0.0; + QTest::newRow("!=") << "!=" << 2 << 1 << 1 << "'2'" << "'1'" << 1.0; + QTest::newRow("<" ) << "<" << 2 << 1 << 0 << "'2'" << "'1'" << 0.0; + QTest::newRow("<=") << "<=" << 2 << 1 << 0 << "'2'" << "'1'" << 0.0; + QTest::newRow(">" ) << ">" << 2 << 1 << 1 << "'2'" << "'1'" << 1.0; + QTest::newRow(">=") << ">=" << 2 << 1 << 1 << "'2'" << "'1'" << 1.0; +} + +void tst_v4traced::binopI32deopt() +{ + QFETCH(QString, operand); + QFETCH(int, int_arg1); + QFETCH(int, int_arg2); + QFETCH(int, int_result); + QFETCH(QString, other_arg1); + QFETCH(QString, other_arg2); + QFETCH(double, other_result); + + QString func = QStringLiteral("function binopI32(a, b) { return a %1 b }").arg(operand); + QString intCall = QStringLiteral("binopI32(%1, %2)").arg(int_arg1).arg(int_arg2); + QString otherCall = QStringLiteral("binopI32(%1, %2)").arg(other_arg1).arg(other_arg2); + + QJSEngine engine; + engine.evaluate(func); + + QCOMPARE(engine.evaluate(intCall).toInt(), int_result); // interpret + trace + QCOMPARE(engine.evaluate(intCall).toInt(), int_result); // jit + QCOMPARE(engine.evaluate(otherCall).toNumber(), other_result); // deopt + QCOMPARE(engine.evaluate(otherCall).toNumber(), other_result); // retrace + QCOMPARE(engine.evaluate(otherCall).toNumber(), other_result); // rejit +} + +void tst_v4traced::calls_data() +{ + QTest::addColumn<QString>("call"); + + QTest::newRow("callGlobalLookup") << "globalLookup"; + QTest::newRow("callPropertyLookup") << "obj.propertyLookup"; +} + +class Calls +{ +public: + static int callCount; + + static QV4::ReturnedValue doSomething(const QV4::FunctionObject */*o*/, + const QV4::Value */*thiz*/, + const QV4::Value *argv, int argc) + { + ++callCount; + + if (argc == 0) + return QV4::Encode(42); + + int prod = 1; + for (int i = 0; i < argc; ++i) { + Q_ASSERT(argv[i].isInteger()); + prod *= argv[i].int_32(); + } + return QV4::Encode(prod); + } +}; + +int Calls::callCount = 0; + +void tst_v4traced::calls() +{ + QFETCH(QString, call); + + EnvVarSaver forceTracing("QV4_FORCE_TRACING", "1"); + EnvVarSaver jitCallThreshold("QV4_JIT_CALL_THRESHOLD", "1"); + + QV4::ExecutionEngine vm; + QV4::Scope scope(&vm); + QV4::ScopedContext ctx(scope, vm.rootContext()); + vm.globalObject->defineDefaultProperty(QLatin1String("globalLookup"), + Calls::doSomething); + QV4::ScopedObject obj(scope, vm.newObject()); + vm.globalObject->defineDefaultProperty(QLatin1String("obj"), obj); + obj->defineDefaultProperty("propertyLookup", Calls::doSomething); + + QString code = QStringLiteral( + "function doCalls() {\n" + " if (%1() != 42) return false\n" + " if (%1(21, 2) != 42) return false\n" + " if (%1(2, 3, 7) != 42) return false\n" + " return true\n" + "}\n" + "var result = true\n" + "for (var i = 0; i < 10; ++i) {\n" + " if (!doCalls()) { result = false; break }" + "}\n" + "result\n").arg(call); + QScopedPointer<QV4::Script> script; + script.reset(new QV4::Script(ctx, QV4::Compiler::ContextType::Global, code, "call")); + script->parseAsBinding = false; + + QVERIFY(!scope.engine->hasException); + script->parse(); + QVERIFY(!scope.engine->hasException); + + Calls::callCount = 0; + QV4::ScopedValue result(scope, script->run()); + QVERIFY(!scope.engine->hasException); + + QVERIFY(result->isBoolean()); + QVERIFY(result->booleanValue()); + QCOMPARE(Calls::callCount, 30); +} + +void tst_v4traced::setLookup() +{ + EnvVarSaver forceTracing("QV4_FORCE_TRACING", "1"); + EnvVarSaver jitCallThreshold("QV4_JIT_CALL_THRESHOLD", "1"); + + QV4::ExecutionEngine vm; + QV4::Scope scope(&vm); + QV4::ScopedContext ctx(scope, vm.rootContext()); + QV4::ScopedObject obj(scope, vm.newObject()); + vm.globalObject->defineDefaultProperty(QLatin1String("oracle"), obj); + obj->defineDefaultProperty("answer", QV4::Primitive::fromInt32(32)); + + QString code = QStringLiteral( + "function doit() {\n" + " ++oracle.answer\n" + "}\n" + "for (var i = 0; i < 10; ++i) doit()\n" + "oracle.answer\n"); + QScopedPointer<QV4::Script> script; + script.reset(new QV4::Script(ctx, QV4::Compiler::ContextType::Global, code, "setLookup")); + script->parseAsBinding = false; + + QVERIFY(!scope.engine->hasException); + script->parse(); + QVERIFY(!scope.engine->hasException); + + QV4::ScopedValue result(scope, script->run()); + QVERIFY(!scope.engine->hasException); + + QVERIFY(result->isInteger()); + QCOMPARE(result->int_32(), 42); +} + +void tst_v4traced::construct() +{ + EnvVarSaver forceTracing("QV4_FORCE_TRACING", "1"); + EnvVarSaver jitCallThreshold("QV4_JIT_CALL_THRESHOLD", "1"); + + QV4::ExecutionEngine vm; + QV4::Scope scope(&vm); + QV4::ScopedContext ctx(scope, vm.rootContext()); + QV4::ScopedObject obj(scope, vm.newObject()); + vm.globalObject->defineDefaultProperty(QLatin1String("oracle"), obj); + obj->defineDefaultProperty("answer", QV4::Primitive::fromInt32(32)); + + QString code = QStringLiteral( + "function doit() {\n" + " this.arr = new Array()\n" + " this.arr[0] = 0\n" + " this.arr[1] = 1\n" + " this.arr[2] = 2\n" + "}\n" + "var o\n" + "for (var i = 0; i < 10; ++i) o = new doit()\n" + "o.arr\n"); + QScopedPointer<QV4::Script> script; + script.reset(new QV4::Script(ctx, QV4::Compiler::ContextType::Global, code, "setLookup")); + script->parseAsBinding = false; + + QVERIFY(!scope.engine->hasException); + script->parse(); + QVERIFY(!scope.engine->hasException); + + QV4::ScopedValue result(scope, script->run()); + QVERIFY(!scope.engine->hasException); + + QVERIFY(result->as<QV4::ArrayObject>()); +} + +QTEST_MAIN(tst_v4traced) + +#include "tst_v4traced.moc" diff --git a/tests/auto/qml/v4traced/v4traced.pro b/tests/auto/qml/v4traced/v4traced.pro new file mode 100644 index 0000000000..cbc8f38046 --- /dev/null +++ b/tests/auto/qml/v4traced/v4traced.pro @@ -0,0 +1,5 @@ +CONFIG += testcase +TARGET = tst_v4traced +macos:CONFIG -= app_bundle +QT += core-private qml-private testlib +SOURCES += tst_v4traced.cpp diff --git a/tests/auto/quick/qquickanimatedsprite/qquickanimatedsprite.pro b/tests/auto/quick/qquickanimatedsprite/qquickanimatedsprite.pro index 85f71bb605..a337473d99 100644 --- a/tests/auto/quick/qquickanimatedsprite/qquickanimatedsprite.pro +++ b/tests/auto/quick/qquickanimatedsprite/qquickanimatedsprite.pro @@ -8,7 +8,7 @@ macx:CONFIG -= app_bundle TESTDATA = data/* -QT += core-private gui-private qml-private quick-private network testlib +QT += core-private gui-private qml-private quick-private network testlib qmltest OTHER_FILES += \ $$files(data/*.qml) diff --git a/tests/auto/quick/qquickanimatedsprite/tst_qquickanimatedsprite.cpp b/tests/auto/quick/qquickanimatedsprite/tst_qquickanimatedsprite.cpp index 4ca31fd957..d2bbf9e6b1 100644 --- a/tests/auto/quick/qquickanimatedsprite/tst_qquickanimatedsprite.cpp +++ b/tests/auto/quick/qquickanimatedsprite/tst_qquickanimatedsprite.cpp @@ -28,6 +28,7 @@ #include <QtTest/QtTest> #include "../../shared/util.h" #include <QtQuick/qquickview.h> +#include <QtQuickTest/QtQuickTest> #include <private/qabstractanimation_p.h> #include <private/qquickanimatedsprite_p.h> #include <private/qquickitem_p.h> @@ -290,8 +291,8 @@ void tst_qquickanimatedsprite::test_reparenting() sprite->setParentItem(window.rootObject()); // don't crash (QTBUG-51162) sprite->polish(); - QTRY_COMPARE(QQuickItemPrivate::get(sprite)->polishScheduled, true); - QTRY_COMPARE(QQuickItemPrivate::get(sprite)->polishScheduled, false); + QVERIFY(QQuickTest::qIsPolishScheduled(sprite)); + QVERIFY(QQuickTest::qWaitForItemPolished(sprite)); } class KillerThread : public QThread diff --git a/tests/auto/quick/qquickanimations/tst_qquickanimations.cpp b/tests/auto/quick/qquickanimations/tst_qquickanimations.cpp index 0f095774e8..961506372a 100644 --- a/tests/auto/quick/qquickanimations/tst_qquickanimations.cpp +++ b/tests/auto/quick/qquickanimations/tst_qquickanimations.cpp @@ -1207,7 +1207,7 @@ void tst_qquickanimations::easingProperties() QVERIFY(animObject != nullptr); QCOMPARE(animObject->easing().type(), QEasingCurve::BezierSpline); - QList<QPointF> points = animObject->easing().cubicBezierSpline(); + QVector<QPointF> points = animObject->easing().toCubicSpline(); QCOMPARE(points.count(), 3); QCOMPARE(points.at(0), QPointF(0.5, 0.2)); QCOMPARE(points.at(1), QPointF(0.13, 0.65)); diff --git a/tests/auto/quick/qquickbehaviors/data/ItemWithInnerBehavior.qml b/tests/auto/quick/qquickbehaviors/data/ItemWithInnerBehavior.qml index 09983645ef..0ac7f87c42 100644 --- a/tests/auto/quick/qquickbehaviors/data/ItemWithInnerBehavior.qml +++ b/tests/auto/quick/qquickbehaviors/data/ItemWithInnerBehavior.qml @@ -5,6 +5,7 @@ Item { property bool someValue Behavior on someValue { + objectName: "behavior" ScriptAction { script: { parent.behaviorTriggered = true }} } } diff --git a/tests/auto/quick/qquickbehaviors/data/aliased.qml b/tests/auto/quick/qquickbehaviors/data/aliased.qml index e65e035d83..1840cdd22e 100644 --- a/tests/auto/quick/qquickbehaviors/data/aliased.qml +++ b/tests/auto/quick/qquickbehaviors/data/aliased.qml @@ -17,6 +17,7 @@ Rectangle { anchors.fill: parent value: accelerating ? 400 : 0 Behavior on value { + objectName: "behavior" NumberAnimation { duration: 500 } diff --git a/tests/auto/quick/qquickbehaviors/data/oneway.qml b/tests/auto/quick/qquickbehaviors/data/oneway.qml new file mode 100644 index 0000000000..0b438b80f6 --- /dev/null +++ b/tests/auto/quick/qquickbehaviors/data/oneway.qml @@ -0,0 +1,20 @@ +import QtQuick 2.0 +Rectangle { + width: 400 + height: 400 + Rectangle { + id: rect + objectName: "MyRectOneWay" + width: 100; height: 100; color: "green" + Behavior on x { + id: behavior + objectName: "MyBehaviorOneWay"; + enabled: (behavior.targetValue === 0) + NumberAnimation { + id: ani + objectName: "MyAnimationOneWay"; + duration: 200; + } + } + } +} diff --git a/tests/auto/quick/qquickbehaviors/qquickbehaviors.pro b/tests/auto/quick/qquickbehaviors/qquickbehaviors.pro index 51bc42c390..fd64eb1d40 100644 --- a/tests/auto/quick/qquickbehaviors/qquickbehaviors.pro +++ b/tests/auto/quick/qquickbehaviors/qquickbehaviors.pro @@ -7,5 +7,5 @@ include (../../shared/util.pri) macx:CONFIG -= app_bundle TESTDATA = data/* - +DISTFILES = $$files(data/*) QT += core-private gui-private qml-private quick-private testlib diff --git a/tests/auto/quick/qquickbehaviors/tst_qquickbehaviors.cpp b/tests/auto/quick/qquickbehaviors/tst_qquickbehaviors.cpp index fa9eba095d..6367f327da 100644 --- a/tests/auto/quick/qquickbehaviors/tst_qquickbehaviors.cpp +++ b/tests/auto/quick/qquickbehaviors/tst_qquickbehaviors.cpp @@ -73,6 +73,7 @@ private slots: void disabledWriteWhileRunning(); void aliasedProperty(); void innerBehaviorOverwritten(); + void oneWay(); }; void tst_qquickbehaviors::simpleBehavior() @@ -516,6 +517,7 @@ void tst_qquickbehaviors::disabledWriteWhileRunning() myRect->setProperty("x", 200); QCOMPARE(myAnimation->isRunning(), true); QTRY_VERIFY(myRect->x() != qreal(0) && myRect->x() != qreal(200)); + QCOMPARE(myBehavior->targetValue(), 200); // grabbed before starting the animation // set disabled while animation is in progress myBehavior->setProperty("enabled", false); @@ -526,6 +528,7 @@ void tst_qquickbehaviors::disabledWriteWhileRunning() myRect->setProperty("x", 100); QCOMPARE(myAnimation->isRunning(), false); QCOMPARE(myRect->x(), qreal(100)); + QCOMPARE(myBehavior->targetValue(), 100); QTest::qWait(200); QCOMPARE(myRect->x(), qreal(100)); } @@ -546,17 +549,20 @@ void tst_qquickbehaviors::disabledWriteWhileRunning() // initial values QCOMPARE(myBehavior->enabled(), true); + QCOMPARE(myBehavior->targetValue(), QVariant()); QCOMPARE(myAnimation->isRunning(), false); QCOMPARE(myRect->x(), qreal(0)); // start animation myRect->setProperty("x", 200); QCOMPARE(myAnimation->isRunning(), true); + QCOMPARE(myBehavior->targetValue(), 200); QTRY_VERIFY(myRect->x() != qreal(0) && myRect->x() != qreal(200)); //set second value myRect->setProperty("x", 300); QCOMPARE(myAnimation->isRunning(), true); + QCOMPARE(myBehavior->targetValue(), 300); QTRY_VERIFY(myRect->x() != qreal(0) && myRect->x() != qreal(200)); // set disabled while animation is in progress @@ -568,6 +574,7 @@ void tst_qquickbehaviors::disabledWriteWhileRunning() myRect->setProperty("x", 100); QCOMPARE(myAnimation->isRunning(), false); QCOMPARE(myRect->x(), qreal(100)); + QCOMPARE(myBehavior->targetValue(), 100); QTest::qWait(200); QCOMPARE(myRect->x(), qreal(100)); } @@ -580,7 +587,12 @@ void tst_qquickbehaviors::aliasedProperty() QScopedPointer<QQuickRectangle> rect(qobject_cast<QQuickRectangle*>(c.create())); QVERIFY2(!rect.isNull(), qPrintable(c.errorString())); + QQuickBehavior* behavior = + qobject_cast<QQuickBehavior*>(rect->findChild<QQuickBehavior*>("behavior")); + QSignalSpy targetValueSpy(behavior, SIGNAL(targetValueChanged())); QQuickItemPrivate::get(rect.data())->setState("moved"); + QCOMPARE(behavior->targetValue(), 400); + QCOMPARE(targetValueSpy.count(), 1); QScopedPointer<QQuickRectangle> acc(qobject_cast<QQuickRectangle*>(rect->findChild<QQuickRectangle*>("acc"))); QScopedPointer<QQuickRectangle> range(qobject_cast<QQuickRectangle*>(acc->findChild<QQuickRectangle*>("range"))); QTRY_VERIFY(acc->property("value").toDouble() > 0); @@ -595,7 +607,44 @@ void tst_qquickbehaviors::innerBehaviorOverwritten() QQmlEngine engine; QQmlComponent c(&engine, testFileUrl("overwrittenbehavior.qml")); QScopedPointer<QQuickItem> item(qobject_cast<QQuickItem*>(c.create())); + QQuickBehavior* behavior = + qobject_cast<QQuickBehavior*>(item->findChild<QQuickBehavior*>("behavior")); QVERIFY(item->property("behaviorTriggered").toBool()); + QCOMPARE(behavior->targetValue(), true); +} + +void tst_qquickbehaviors::oneWay() +{ + QQmlEngine engine; + QQmlComponent c(&engine, testFileUrl("oneway.qml")); + QScopedPointer<QQuickRectangle> rect(qobject_cast<QQuickRectangle*>(c.create()));; + QVERIFY2(!rect.isNull(), qPrintable(c.errorString())); + QQuickBehavior* behavior = + qobject_cast<QQuickBehavior*>(rect->findChild<QQuickBehavior*>("MyBehaviorOneWay")); + QCOMPARE(behavior->enabled(), false); + QCOMPARE(behavior->targetValue(), QVariant()); + + QSignalSpy targetValueSpy(behavior, SIGNAL(targetValueChanged())); + QQuickRectangle *myRect = qobject_cast<QQuickRectangle*>(rect->findChild<QQuickRectangle*>("MyRectOneWay")); + myRect->setProperty("x", 100); + QCOMPARE(behavior->targetValue(), 100); + QCOMPARE(targetValueSpy.count(), 1); + QCOMPARE(behavior->enabled(), false); + qreal x = myRect->x(); + QCOMPARE(x, qreal(100)); //should change immediately + QQuickNumberAnimation *myAnimation = + qobject_cast<QQuickNumberAnimation*>(behavior->findChild<QQuickNumberAnimation*>("MyAnimationOneWay")); + QCOMPARE(myAnimation->isRunning(), false); + + myRect->setProperty("x", 0); + QCOMPARE(behavior->targetValue(), 0); + QCOMPARE(targetValueSpy.count(), 2); + QCOMPARE(behavior->enabled(), true); + QCOMPARE(myAnimation->isRunning(), true); + QVERIFY(myRect->x() > 0.0); + QTRY_VERIFY(myRect->x() < 100.0); + QTRY_COMPARE(myRect->x(), qreal(0)); + QCOMPARE(myAnimation->isRunning(), false); } QTEST_MAIN(tst_qquickbehaviors) diff --git a/tests/auto/quick/qquickdroparea/tst_qquickdroparea.cpp b/tests/auto/quick/qquickdroparea/tst_qquickdroparea.cpp index 3c7159782c..cf01cc927b 100644 --- a/tests/auto/quick/qquickdroparea/tst_qquickdroparea.cpp +++ b/tests/auto/quick/qquickdroparea/tst_qquickdroparea.cpp @@ -188,14 +188,16 @@ void tst_QQuickDropArea::containsDrag_external() const qreal dpr = window.devicePixelRatio(); const QPoint nativePos1 = QPoint(50, 50) * dpr; const QPoint nativePos2 = QPoint(150, 50) * dpr; - QWindowSystemInterface::handleDrag(&window, &data, nativePos1, Qt::CopyAction); + QWindowSystemInterface::handleDrag(&window, &data, nativePos1, Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); QCOMPARE(evaluate<bool>(dropArea, "containsDrag"), true); QCOMPARE(evaluate<bool>(dropArea, "hasDrag"), true); QCOMPARE(evaluate<int>(dropArea, "enterEvents"), 1); QCOMPARE(evaluate<int>(dropArea, "exitEvents"), 0); evaluate<void>(dropArea, "{ enterEvents = 0; exitEvents = 0 }"); - QWindowSystemInterface::handleDrag(&alternateWindow, &data, nativePos1, Qt::CopyAction); + QWindowSystemInterface::handleDrag(&alternateWindow, &data, nativePos1, Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); QCOMPARE(evaluate<bool>(dropArea, "containsDrag"), false); QCOMPARE(evaluate<bool>(dropArea, "hasDrag"), false); QCOMPARE(evaluate<int>(dropArea, "enterEvents"), 0); @@ -203,13 +205,15 @@ void tst_QQuickDropArea::containsDrag_external() evaluate<void>(dropArea, "{ enterEvents = 0; exitEvents = 0 }"); - QWindowSystemInterface::handleDrag(&window, &data, nativePos2, Qt::CopyAction); + QWindowSystemInterface::handleDrag(&window, &data, nativePos2, Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); QCOMPARE(evaluate<bool>(dropArea, "containsDrag"), false); QCOMPARE(evaluate<bool>(dropArea, "hasDrag"), false); QCOMPARE(evaluate<int>(dropArea, "enterEvents"), 0); QCOMPARE(evaluate<int>(dropArea, "exitEvents"), 0); - QWindowSystemInterface::handleDrag(&window, &data, nativePos1, Qt::CopyAction); + QWindowSystemInterface::handleDrag(&window, &data, nativePos1, Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); QCOMPARE(evaluate<bool>(dropArea, "containsDrag"), true); QCOMPARE(evaluate<bool>(dropArea, "hasDrag"), true); QCOMPARE(evaluate<int>(dropArea, "enterEvents"), 1); @@ -217,13 +221,15 @@ void tst_QQuickDropArea::containsDrag_external() evaluate<void>(dropArea, "{ enterEvents = 0; exitEvents = 0 }"); - QWindowSystemInterface::handleDrag(&window, &data, nativePos2, Qt::CopyAction); + QWindowSystemInterface::handleDrag(&window, &data, nativePos2, Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); QCOMPARE(evaluate<bool>(dropArea, "containsDrag"), false); QCOMPARE(evaluate<bool>(dropArea, "hasDrag"), false); QCOMPARE(evaluate<int>(dropArea, "enterEvents"), 0); QCOMPARE(evaluate<int>(dropArea, "exitEvents"), 1); - QWindowSystemInterface::handleDrop(&window, &data, nativePos2, Qt::CopyAction); + QWindowSystemInterface::handleDrop(&window, &data, nativePos2, Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); } void tst_QQuickDropArea::keys_internal() @@ -358,80 +364,96 @@ void tst_QQuickDropArea::keys_external() QCOMPARE(evaluate<bool>(dropArea, "containsDrag"), false); - QWindowSystemInterface::handleDrag(&window, &data, QPoint(50, 50), Qt::CopyAction); + QWindowSystemInterface::handleDrag(&window, &data, QPoint(50, 50), Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); QCOMPARE(evaluate<bool>(dropArea, "containsDrag"), true); QCOMPARE(evaluate<int>(dropArea, "enterEvents"), 1); QCOMPARE(dropArea->property("dragKeys").toStringList(), QStringList() << "text/x-red" << "text/x-blue"); - QWindowSystemInterface::handleDrag(&alternateWindow, &data, QPoint(50, 50), Qt::CopyAction); + QWindowSystemInterface::handleDrag(&alternateWindow, &data, QPoint(50, 50), Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); evaluate<void>(dropArea, "keys = \"text/x-blue\""); QCOMPARE(dropArea->property("keys").toStringList(), QStringList() << "text/x-blue"); QCOMPARE(dropArea->property("dropKeys").toStringList(), QStringList() << "text/x-blue"); evaluate<void>(dropArea, "{ enterEvents = 0; dragKeys = undefined }"); - QWindowSystemInterface::handleDrag(&window, &data, QPoint(50, 50), Qt::CopyAction); + QWindowSystemInterface::handleDrag(&window, &data, QPoint(50, 50), Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); QCOMPARE(evaluate<bool>(dropArea, "containsDrag"), true); QCOMPARE(evaluate<int>(dropArea, "enterEvents"), 1); QCOMPARE(dropArea->property("dragKeys").toStringList(), QStringList() << "text/x-red" << "text/x-blue"); - QWindowSystemInterface::handleDrag(&alternateWindow, &data, QPoint(50, 50), Qt::CopyAction); + QWindowSystemInterface::handleDrag(&alternateWindow, &data, QPoint(50, 50), Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); evaluate<void>(dropArea, "keys = \"text/x-red\""); QCOMPARE(dropArea->property("keys").toStringList(), QStringList() << "text/x-red"); QCOMPARE(dropArea->property("dropKeys").toStringList(), QStringList() << "text/x-red"); evaluate<void>(dropArea, "{ enterEvents = 0; dragKeys = undefined }"); - QWindowSystemInterface::handleDrag(&window, &data, QPoint(50, 50), Qt::CopyAction); + QWindowSystemInterface::handleDrag(&window, &data, QPoint(50, 50), Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); QCOMPARE(evaluate<bool>(dropArea, "containsDrag"), true); QCOMPARE(evaluate<int>(dropArea, "enterEvents"), 1); QCOMPARE(dropArea->property("dragKeys").toStringList(), QStringList() << "text/x-red" << "text/x-blue"); - QWindowSystemInterface::handleDrag(&alternateWindow, &data, QPoint(50, 50), Qt::CopyAction); + QWindowSystemInterface::handleDrag(&alternateWindow, &data, QPoint(50, 50), Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); evaluate<void>(dropArea, "keys = \"text/x-green\""); QCOMPARE(dropArea->property("keys").toStringList(), QStringList() << "text/x-green"); QCOMPARE(dropArea->property("dropKeys").toStringList(), QStringList() << "text/x-green"); evaluate<void>(dropArea, "{ enterEvents = 0; dragKeys = undefined }"); - QWindowSystemInterface::handleDrag(&window, &data, QPoint(50, 50), Qt::CopyAction); + QWindowSystemInterface::handleDrag(&window, &data, QPoint(50, 50), Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); QCOMPARE(evaluate<bool>(dropArea, "containsDrag"), false); QCOMPARE(evaluate<int>(dropArea, "enterEvents"), 0); - QWindowSystemInterface::handleDrag(&alternateWindow, &data, QPoint(50, 50), Qt::CopyAction); + QWindowSystemInterface::handleDrag(&alternateWindow, &data, QPoint(50, 50), Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); evaluate<void>(dropArea, "keys = [\"text/x-red\", \"text/x-green\"]"); QCOMPARE(dropArea->property("keys").toStringList(), QStringList() << "text/x-red" << "text/x-green"); QCOMPARE(dropArea->property("dropKeys").toStringList(), QStringList() << "text/x-red" << "text/x-green"); evaluate<void>(dropArea, "{ enterEvents = 0; dragKeys = undefined }"); - QWindowSystemInterface::handleDrag(&window, &data, QPoint(50, 50), Qt::CopyAction); + QWindowSystemInterface::handleDrag(&window, &data, QPoint(50, 50), Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); QCOMPARE(evaluate<bool>(dropArea, "containsDrag"), true); QCOMPARE(evaluate<int>(dropArea, "enterEvents"), 1); QCOMPARE(dropArea->property("dragKeys").toStringList(), QStringList() << "text/x-red" << "text/x-blue"); - QWindowSystemInterface::handleDrag(&alternateWindow, &data, QPoint(50, 50), Qt::CopyAction); + QWindowSystemInterface::handleDrag(&alternateWindow, &data, QPoint(50, 50), Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); data.removeFormat("text/x-red"); data.removeFormat("text/x-blue"); evaluate<void>(dropArea, "{ enterEvents = 0; dragKeys = undefined }"); - QWindowSystemInterface::handleDrag(&window, &data, QPoint(50, 50), Qt::CopyAction); + QWindowSystemInterface::handleDrag(&window, &data, QPoint(50, 50), Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); QCOMPARE(evaluate<bool>(dropArea, "containsDrag"), false); QCOMPARE(evaluate<int>(dropArea, "enterEvents"), 0); - QWindowSystemInterface::handleDrag(&alternateWindow, &data, QPoint(50, 50), Qt::CopyAction); + QWindowSystemInterface::handleDrag(&alternateWindow, &data, QPoint(50, 50), Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); evaluate<void>(dropArea, "keys = []"); QCOMPARE(dropArea->property("keys").toStringList(), QStringList()); QCOMPARE(dropArea->property("dropKeys").toStringList(), QStringList()); evaluate<void>(dropArea, "{ enterEvents = 0; dragKeys = undefined }"); - QWindowSystemInterface::handleDrag(&window, &data, QPoint(50, 50), Qt::CopyAction); + QWindowSystemInterface::handleDrag(&window, &data, QPoint(50, 50), Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); QCOMPARE(evaluate<bool>(dropArea, "containsDrag"), true); QCOMPARE(evaluate<int>(dropArea, "enterEvents"), 1); QCOMPARE(dropArea->property("dragKeys").toStringList(), QStringList()); - QWindowSystemInterface::handleDrag(&alternateWindow, &data, QPoint(50, 50), Qt::CopyAction); + QWindowSystemInterface::handleDrag(&alternateWindow, &data, QPoint(50, 50), Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); data.setData("text/x-red", "red"); data.setData("text/x-blue", "blue"); QCOMPARE(dropArea->property("keys").toStringList(), QStringList()); QCOMPARE(dropArea->property("dropKeys").toStringList(), QStringList()); evaluate<void>(dropArea, "{ enterEvents = 0; dragKeys = undefined }"); - QWindowSystemInterface::handleDrag(&window, &data, QPoint(50, 50), Qt::CopyAction); + QWindowSystemInterface::handleDrag(&window, &data, QPoint(50, 50), Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); QCOMPARE(evaluate<bool>(dropArea, "containsDrag"), true); QCOMPARE(evaluate<int>(dropArea, "enterEvents"), 1); QCOMPARE(dropArea->property("dragKeys").toStringList(), QStringList() << "text/x-red" << "text/x-blue"); - QWindowSystemInterface::handleDrop(&window, &data, QPoint(50, 50), Qt::CopyAction); + QWindowSystemInterface::handleDrop(&window, &data, QPoint(50, 50), Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); } void tst_QQuickDropArea::source_internal() @@ -587,7 +609,8 @@ void tst_QQuickDropArea::position_external() QMimeData data; const qreal dpr = window.devicePixelRatio(); - QWindowSystemInterface::handleDrag(&window, &data, QPoint(50, 50) * dpr, Qt::CopyAction); + QWindowSystemInterface::handleDrag(&window, &data, QPoint(50, 50) * dpr, Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); QCOMPARE(evaluate<int>(dropArea, "enterEvents"), 1); QCOMPARE(evaluate<int>(dropArea, "moveEvents"), 1); QCOMPARE(evaluate<qreal>(dropArea, "drag.x"), qreal(50)); @@ -598,7 +621,8 @@ void tst_QQuickDropArea::position_external() QCOMPARE(evaluate<qreal>(dropArea, "eventY"), qreal(50)); evaluate<void>(dropArea, "{ enterEvents = 0; moveEvents = 0; eventX = -1; eventY = -1 }"); - QWindowSystemInterface::handleDrag(&window, &data, QPoint(40, 50) * dpr, Qt::CopyAction); + QWindowSystemInterface::handleDrag(&window, &data, QPoint(40, 50) * dpr, Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); QCOMPARE(evaluate<int>(dropArea, "enterEvents"), 0); QCOMPARE(evaluate<int>(dropArea, "moveEvents"), 1); QCOMPARE(evaluate<qreal>(dropArea, "drag.x"), qreal(40)); @@ -609,7 +633,8 @@ void tst_QQuickDropArea::position_external() QCOMPARE(evaluate<qreal>(dropArea, "eventY"), qreal(50)); evaluate<void>(dropArea, "{ enterEvents = 0; moveEvents = 0; eventX = -1; eventY = -1 }"); - QWindowSystemInterface::handleDrag(&window, &data, QPoint(75, 25) * dpr, Qt::CopyAction); + QWindowSystemInterface::handleDrag(&window, &data, QPoint(75, 25) * dpr, Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); QCOMPARE(evaluate<int>(dropArea, "enterEvents"), 0); QCOMPARE(evaluate<int>(dropArea, "moveEvents"), 1); QCOMPARE(evaluate<qreal>(dropArea, "drag.x"), qreal(75)); @@ -619,7 +644,8 @@ void tst_QQuickDropArea::position_external() QCOMPARE(evaluate<qreal>(dropArea, "eventX"), qreal(75)); QCOMPARE(evaluate<qreal>(dropArea, "eventY"), qreal(25)); - QWindowSystemInterface::handleDrop(&window, &data, QPoint(75, 25) * dpr, Qt::CopyAction); + QWindowSystemInterface::handleDrop(&window, &data, QPoint(75, 25) * dpr, Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); } void tst_QQuickDropArea::drop_internal() @@ -930,7 +956,8 @@ void tst_QQuickDropArea::simultaneousDrags() evaluate<void>(dropArea1, "{ enterEvents = 0; exitEvents = 0 }"); evaluate<void>(dropArea2, "{ enterEvents = 0; exitEvents = 0 }"); - QWindowSystemInterface::handleDrag(&window, &data, QPoint(50, 50), Qt::CopyAction); + QWindowSystemInterface::handleDrag(&window, &data, QPoint(50, 50), Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); //Same as in the first case, dropArea2 already contains a drag, dropArea1 will get the event QCOMPARE(evaluate<bool>(dropArea1, "containsDrag"), true); QCOMPARE(evaluate<int>(dropArea1, "enterEvents"), 1); @@ -939,7 +966,8 @@ void tst_QQuickDropArea::simultaneousDrags() QCOMPARE(evaluate<int>(dropArea2, "enterEvents"), 0); QCOMPARE(evaluate<int>(dropArea2, "exitEvents"), 0); - QWindowSystemInterface::handleDrag(&alternateWindow, &data, QPoint(50, 50), Qt::CopyAction); + QWindowSystemInterface::handleDrag(&alternateWindow, &data, QPoint(50, 50), Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); QCOMPARE(evaluate<bool>(dropArea1, "containsDrag"), false); QCOMPARE(evaluate<int>(dropArea1, "enterEvents"), 1); QCOMPARE(evaluate<int>(dropArea1, "exitEvents"), 1); @@ -947,7 +975,8 @@ void tst_QQuickDropArea::simultaneousDrags() QCOMPARE(evaluate<int>(dropArea2, "enterEvents"), 0); QCOMPARE(evaluate<int>(dropArea2, "exitEvents"), 0); - QWindowSystemInterface::handleDrag(&window, &data, QPoint(50, 50), Qt::CopyAction); + QWindowSystemInterface::handleDrag(&window, &data, QPoint(50, 50), Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); QCOMPARE(evaluate<bool>(dropArea1, "containsDrag"), true); QCOMPARE(evaluate<int>(dropArea1, "enterEvents"), 2); QCOMPARE(evaluate<int>(dropArea1, "exitEvents"), 1); @@ -965,7 +994,8 @@ void tst_QQuickDropArea::simultaneousDrags() evaluate<void>(dropArea1, "{ enterEvents = 0; exitEvents = 0 }"); evaluate<void>(dropArea2, "{ enterEvents = 0; exitEvents = 0 }"); - QWindowSystemInterface::handleDrag(&alternateWindow, &data, QPoint(50, 50), Qt::CopyAction); + QWindowSystemInterface::handleDrag(&alternateWindow, &data, QPoint(50, 50), Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); QCOMPARE(evaluate<bool>(dropArea1, "containsDrag"), false); QCOMPARE(evaluate<int>(dropArea1, "enterEvents"), 0); QCOMPARE(evaluate<int>(dropArea1, "exitEvents"), 1); @@ -976,7 +1006,8 @@ void tst_QQuickDropArea::simultaneousDrags() // external then internal. evaluate<void>(dropArea1, "{ enterEvents = 0; exitEvents = 0 }"); evaluate<void>(dropArea2, "{ enterEvents = 0; exitEvents = 0 }"); - QWindowSystemInterface::handleDrag(&window, &data, QPoint(50, 50), Qt::CopyAction); + QWindowSystemInterface::handleDrag(&window, &data, QPoint(50, 50), Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); QCOMPARE(evaluate<bool>(dropArea1, "containsDrag"), false); QCOMPARE(evaluate<int>(dropArea1, "enterEvents"), 0); QCOMPARE(evaluate<int>(dropArea1, "exitEvents"), 0); @@ -1010,7 +1041,8 @@ void tst_QQuickDropArea::simultaneousDrags() QCOMPARE(evaluate<int>(dropArea2, "enterEvents"), 0); QCOMPARE(evaluate<int>(dropArea2, "exitEvents"), 0); - QWindowSystemInterface::handleDrag(&alternateWindow, &data, QPoint(50, 50), Qt::CopyAction); + QWindowSystemInterface::handleDrag(&alternateWindow, &data, QPoint(50, 50), Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); QCOMPARE(evaluate<bool>(dropArea1, "containsDrag"), true); QCOMPARE(evaluate<int>(dropArea1, "enterEvents"), 2); QCOMPARE(evaluate<int>(dropArea1, "exitEvents"), 1); @@ -1106,7 +1138,8 @@ void tst_QQuickDropArea::simultaneousDrags() evaluate<void>(dropArea1, "{ enterEvents = 0; exitEvents = 0 }"); evaluate<void>(dropArea2, "{ enterEvents = 0; exitEvents = 0 }"); - QWindowSystemInterface::handleDrag(&window, &data, QPoint(50, 50), Qt::CopyAction); + QWindowSystemInterface::handleDrag(&window, &data, QPoint(50, 50), Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); QCOMPARE(evaluate<bool>(dropArea1, "containsDrag"), true); QCOMPARE(evaluate<int>(dropArea1, "enterEvents"), 0); QCOMPARE(evaluate<int>(dropArea1, "exitEvents"), 0); @@ -1116,7 +1149,8 @@ void tst_QQuickDropArea::simultaneousDrags() evaluate<void>(dropArea1, "{ enterEvents = 0; exitEvents = 0 }"); evaluate<void>(dropArea2, "{ enterEvents = 0; exitEvents = 0 }"); - QWindowSystemInterface::handleDrag(&alternateWindow, &data, QPoint(50, 50), Qt::CopyAction); + QWindowSystemInterface::handleDrag(&alternateWindow, &data, QPoint(50, 50), Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); QCOMPARE(evaluate<bool>(dropArea1, "containsDrag"), true); QCOMPARE(evaluate<int>(dropArea1, "enterEvents"), 0); QCOMPARE(evaluate<int>(dropArea1, "exitEvents"), 0); @@ -1126,7 +1160,8 @@ void tst_QQuickDropArea::simultaneousDrags() evaluate<void>(dropArea1, "{ enterEvents = 0; exitEvents = 0 }"); evaluate<void>(dropArea2, "{ enterEvents = 0; exitEvents = 0 }"); - QWindowSystemInterface::handleDrag(&window, &data, QPoint(50, 50), Qt::CopyAction); + QWindowSystemInterface::handleDrag(&window, &data, QPoint(50, 50), Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); QCOMPARE(evaluate<bool>(dropArea1, "containsDrag"), true); QCOMPARE(evaluate<int>(dropArea1, "enterEvents"), 0); QCOMPARE(evaluate<int>(dropArea1, "exitEvents"), 0); @@ -1146,7 +1181,8 @@ void tst_QQuickDropArea::simultaneousDrags() evaluate<void>(dropArea1, "{ enterEvents = 0; exitEvents = 0 }"); evaluate<void>(dropArea2, "{ enterEvents = 0; exitEvents = 0 }"); - QWindowSystemInterface::handleDrag(&alternateWindow, &data, QPoint(50, 50), Qt::CopyAction); + QWindowSystemInterface::handleDrag(&alternateWindow, &data, QPoint(50, 50), Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); QCOMPARE(evaluate<bool>(dropArea1, "containsDrag"), false); QCOMPARE(evaluate<int>(dropArea1, "enterEvents"), 0); QCOMPARE(evaluate<int>(dropArea1, "exitEvents"), 0); @@ -1154,7 +1190,8 @@ void tst_QQuickDropArea::simultaneousDrags() QCOMPARE(evaluate<int>(dropArea2, "enterEvents"), 0); QCOMPARE(evaluate<int>(dropArea2, "exitEvents"), 1); - QWindowSystemInterface::handleDrop(&alternateWindow, &data, QPoint(50, 50), Qt::CopyAction); + QWindowSystemInterface::handleDrop(&alternateWindow, &data, QPoint(50, 50), Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); } void tst_QQuickDropArea::dropStuff() @@ -1179,8 +1216,10 @@ void tst_QQuickDropArea::dropStuff() QCOMPARE(evaluate<QVariant>(dropArea, "array"), QVariant()); - QWindowSystemInterface::handleDrag(&window, &data, QPoint(50, 50), Qt::CopyAction); - QWindowSystemInterface::handleDrop(&window, &data, QPoint(50, 50), Qt::CopyAction); + QWindowSystemInterface::handleDrag(&window, &data, QPoint(50, 50), Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); + QWindowSystemInterface::handleDrop(&window, &data, QPoint(50, 50), Qt::CopyAction, + Qt::MouseButtons(), Qt::KeyboardModifiers()); QCOMPARE(evaluate<int>(dropArea, "array.byteLength"), 3); QCOMPARE(evaluate<QByteArray>(dropArea, "array"), QByteArray("red")); } 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/qquickgridview.pro b/tests/auto/quick/qquickgridview/qquickgridview.pro index 3c33cc78fb..5051f8bc62 100644 --- a/tests/auto/quick/qquickgridview/qquickgridview.pro +++ b/tests/auto/quick/qquickgridview/qquickgridview.pro @@ -10,5 +10,5 @@ include (../shared/util.pri) TESTDATA = data/* -QT += core-private gui-private qml-private quick-private testlib +QT += core-private gui-private qml-private quick-private testlib qmltest diff --git a/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp b/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp index e346e25aaf..448096720c 100644 --- a/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp +++ b/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp @@ -29,6 +29,7 @@ #include <QtTest/QtTest> #include <QtCore/qstringlistmodel.h> #include <QtQuick/qquickview.h> +#include <QtQuickTest/QtQuickTest> #include <QtQml/qqmlengine.h> #include <QtQml/qqmlcomponent.h> #include <QtQml/qqmlcontext.h> @@ -535,7 +536,7 @@ void tst_QQuickGridView::inserted_defaultLayout(QQuickGridView::Flow flow, insertCount = insertCount_ttb; } if (setContentPos(gridview, contentYRowOffset)) - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); QList<QPair<QString, QString> > newData; for (int i=0; i<insertCount; i++) @@ -721,13 +722,13 @@ void tst_QQuickGridView::insertBeforeVisible() QTRY_VERIFY(contentItem != nullptr); gridview->setCacheBuffer(cacheBuffer); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); // trigger a refill (not just setting contentY) so that the visibleItems grid is updated int firstVisibleIndex = 12; // move to an index where the top item is not visible gridview->setContentY(firstVisibleIndex/3 * 60.0); gridview->setCurrentIndex(firstVisibleIndex); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); QTRY_COMPARE(gridview->currentIndex(), firstVisibleIndex); QQuickItem *item = findItem<QQuickItem>(contentItem, "wrapper", firstVisibleIndex); @@ -744,7 +745,7 @@ void tst_QQuickGridView::insertBeforeVisible() // now, moving to the top of the view should position the inserted items correctly int itemsOffsetAfterMove = (insertCount / 3) * -60.0; gridview->setCurrentIndex(0); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); QTRY_COMPARE(gridview->currentIndex(), 0); QTRY_COMPARE(gridview->contentY(), 0.0 + itemsOffsetAfterMove); @@ -803,7 +804,7 @@ void tst_QQuickGridView::removed_basic() QTRY_VERIFY(gridview != nullptr); QQuickItem *contentItem = gridview->contentItem(); QTRY_VERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); model.removeItem(1); QTRY_COMPARE(window->rootObject()->property("count").toInt(), model.count()); @@ -890,7 +891,7 @@ void tst_QQuickGridView::removed_basic() QTRY_VERIFY(gridview->currentItem() != oldCurrent); gridview->setContentY(0); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); // Confirm items positioned correctly itemCount = findItems<QQuickItem>(contentItem, "wrapper").count(); @@ -966,7 +967,7 @@ void tst_QQuickGridView::removed_defaultLayout(QQuickGridView::Flow flow, firstVisible = firstVisible_ttb; } if (setContentPos(gridview, contentYRowOffset)) - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); model.removeItems(removeIndex, removeCount); gridview->forceLayout(); @@ -1182,7 +1183,7 @@ void tst_QQuickGridView::addOrRemoveBeforeVisible() gridview->setCurrentIndex(0); qApp->processEvents(); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); // scroll down until item 0 is no longer drawn // (bug not triggered if we just move using content y, since that doesn't @@ -1193,7 +1194,7 @@ void tst_QQuickGridView::addOrRemoveBeforeVisible() QTRY_COMPARE(gridview->currentIndex(), 24); QTRY_COMPARE(gridview->contentY(), 220.0); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); QTRY_VERIFY(!findItem<QQuickItem>(contentItem, "wrapper", 0)); // 0 shouldn't be visible if (doAdd) { @@ -1254,7 +1255,7 @@ void tst_QQuickGridView::clear() QVERIFY(gridview != nullptr); QQuickItem *contentItem = gridview->contentItem(); QVERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); model.clear(); gridview->forceLayout(); @@ -1307,7 +1308,7 @@ void tst_QQuickGridView::moved_defaultLayout(QQuickGridView::Flow flow, QTRY_VERIFY(gridview != nullptr); QQuickItem *contentItem = gridview->contentItem(); QTRY_VERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); QQuickItem *currentItem = gridview->currentItem(); QTRY_VERIFY(currentItem != nullptr); @@ -1318,10 +1319,10 @@ void tst_QQuickGridView::moved_defaultLayout(QQuickGridView::Flow flow, count = count_ttb; } if (setContentPos(gridview, contentYRowOffset)) - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); model.moveItems(from, to, count); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); // Confirm items positioned correctly and indexes correct QList<QQuickItem*> items = findItems<QQuickItem>(contentItem, "wrapper"); @@ -1560,7 +1561,7 @@ void tst_QQuickGridView::multipleChanges(bool condensed) QQuickGridView *gridview = findItem<QQuickGridView>(window->rootObject(), "grid"); QTRY_VERIFY(gridview != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); for (int i=0; i<changes.count(); i++) { switch (changes[i].type) { @@ -1588,10 +1589,10 @@ void tst_QQuickGridView::multipleChanges(bool condensed) break; } if (condensed) { - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); } } - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); QCOMPARE(gridview->count(), newCount); QCOMPARE(gridview->count(), model.count()); @@ -1834,7 +1835,7 @@ void tst_QQuickGridView::currentIndex() QQuickGridView *gridview = findItem<QQuickGridView>(window->rootObject(), "grid"); QVERIFY(gridview != nullptr); - QTRY_VERIFY(!QQuickItemPrivate::get(gridview)->polishScheduled); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); QQuickItem *contentItem = gridview->contentItem(); QVERIFY(contentItem != nullptr); @@ -1936,7 +1937,7 @@ void tst_QQuickGridView::noCurrentIndex() QVERIFY(gridview != nullptr); QQuickItem *contentItem = gridview->contentItem(); QVERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); // current index should be -1 QCOMPARE(gridview->currentIndex(), -1); @@ -1981,7 +1982,7 @@ void tst_QQuickGridView::keyNavigation() gridview->setFlow(flow); gridview->setLayoutDirection(layoutDirection); gridview->setVerticalLayoutDirection(verticalLayoutDirection); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); window->requestActivate(); QVERIFY(QTest::qWaitForWindowActive(window)); @@ -2491,7 +2492,7 @@ void tst_QQuickGridView::positionViewAtBeginningEnd() QTRY_VERIFY(gridview != nullptr); QQuickItem *contentItem = gridview->contentItem(); QTRY_VERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); // positionViewAtBeginning gridview->setContentY(150); @@ -2578,10 +2579,10 @@ void tst_QQuickGridView::positionViewAtIndex() QTRY_VERIFY(gridview != nullptr); QQuickItem *contentItem = gridview->contentItem(); QTRY_VERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); window->rootObject()->setProperty("enforceRange", enforceRange); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); if (topToBottom) gridview->setContentX(initContentPos); @@ -2791,7 +2792,7 @@ void tst_QQuickGridView::resetModel() QTRY_VERIFY(gridview != nullptr); QQuickItem *contentItem = gridview->contentItem(); QTRY_VERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); QTRY_COMPARE(gridview->count(), model.rowCount()); @@ -2840,7 +2841,7 @@ void tst_QQuickGridView::enforceRange() QTRY_COMPARE(gridview->preferredHighlightBegin(), 100.0); QTRY_COMPARE(gridview->preferredHighlightEnd(), 100.0); QTRY_COMPARE(gridview->highlightRangeMode(), QQuickGridView::StrictlyEnforceRange); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); QQuickItem *contentItem = gridview->contentItem(); QTRY_VERIFY(contentItem != nullptr); @@ -3023,7 +3024,7 @@ void tst_QQuickGridView::footer() gridview->setFlow(flow); gridview->setLayoutDirection(layoutDirection); gridview->setVerticalLayoutDirection(verticalLayoutDirection); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); QQuickItem *contentItem = gridview->contentItem(); QTRY_VERIFY(contentItem != nullptr); @@ -3272,7 +3273,7 @@ void tst_QQuickGridView::header() gridview->setFlow(flow); gridview->setLayoutDirection(layoutDirection); gridview->setVerticalLayoutDirection(verticalLayoutDirection); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); QQuickItem *contentItem = gridview->contentItem(); QTRY_VERIFY(contentItem != nullptr); @@ -3296,7 +3297,7 @@ void tst_QQuickGridView::header() QCOMPARE(item->position(), firstDelegatePos); model.clear(); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); QCOMPARE(header->position(), initialHeaderPos); // header should stay where it is if (flow == QQuickGridView::FlowLeftToRight) QCOMPARE(gridview->contentHeight(), header->height()); @@ -3349,7 +3350,7 @@ void tst_QQuickGridView::header() gridview->setFlow(flow); gridview->setLayoutDirection(layoutDirection); gridview->setVerticalLayoutDirection(verticalLayoutDirection); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); gridview->setWidth(240); gridview->setHeight(320); @@ -3494,7 +3495,7 @@ void tst_QQuickGridView::extents() gridview->setFlow(flow); gridview->setLayoutDirection(layoutDirection); gridview->setVerticalLayoutDirection(verticalLayoutDirection); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); QQuickItem *contentItem = gridview->contentItem(); QTRY_VERIFY(contentItem != nullptr); @@ -3655,7 +3656,7 @@ void tst_QQuickGridView::resizeViewAndRepaint() QTRY_VERIFY(gridview != nullptr); QQuickItem *contentItem = gridview->contentItem(); QTRY_VERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); // item at index 10 should not be currently visible QVERIFY(!findItem<QQuickItem>(contentItem, "wrapper", 10)); @@ -3736,7 +3737,7 @@ void tst_QQuickGridView::resizeGrid() // items are aligned correctly in right-to-left window->rootObject()->setWidth(260); window->rootObject()->setHeight(320); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); QCOMPARE(gridview->contentX(), initialContentPos.x()); QCOMPARE(gridview->contentY(), initialContentPos.y()); @@ -3760,7 +3761,7 @@ void tst_QQuickGridView::resizeGrid() // change from 3x5 grid to 4x7 window->rootObject()->setWidth(window->rootObject()->width() + 80); window->rootObject()->setHeight(window->rootObject()->height() + 60*2); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); // other than in LeftToRight+RightToLeft layout, the first item should not move // if view is resized @@ -3865,7 +3866,7 @@ void tst_QQuickGridView::changeColumnCount() QTRY_VERIFY(gridview != nullptr); QQuickItem *contentItem = gridview->contentItem(); QTRY_VERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); // a single column of 6 items are visible int itemCount = findItems<QQuickItem>(contentItem, "wrapper").count(); @@ -3879,7 +3880,7 @@ void tst_QQuickGridView::changeColumnCount() // now 6x3 grid is visible, plus 1 extra below for refill gridview->setWidth(240); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); itemCount = findItems<QQuickItem>(contentItem, "wrapper").count(); QCOMPARE(itemCount, 6*3 + 1); for (int i = 0; i < model.count() && i < itemCount; ++i) { @@ -3891,7 +3892,7 @@ void tst_QQuickGridView::changeColumnCount() // back to single column gridview->setWidth(100); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); itemCount = findItems<QQuickItem>(contentItem, "wrapper").count(); QCOMPARE(itemCount, 6); for (int i = 0; i < model.count() && i < itemCount; ++i) { @@ -4139,7 +4140,7 @@ void tst_QQuickGridView::margins() QTRY_VERIFY(gridview != nullptr); QQuickItem *contentItem = gridview->contentItem(); QTRY_VERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); QCOMPARE(gridview->contentX(), -30.); QCOMPARE(gridview->originX(), 0.); @@ -4217,7 +4218,7 @@ void tst_QQuickGridView::margins() // remove item before visible and check that left margin is maintained // and originX is updated gridview->setContentX(-400); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); model.removeItems(0, 4); gridview->forceLayout(); QTRY_COMPARE(model.count(), gridview->count()); @@ -4259,7 +4260,7 @@ void tst_QQuickGridView::margins() QVERIFY(gridview != nullptr); QQuickItem *contentItem = gridview->contentItem(); QVERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); QCOMPARE(contentItem->x(), 200); QCOMPARE(contentItem->y(), 20); @@ -4341,7 +4342,7 @@ void tst_QQuickGridView::snapToRow() gridview->setFlow(flow); gridview->setLayoutDirection(layoutDirection); gridview->setHighlightRangeMode(QQuickItemView::HighlightRangeMode(highlightRangeMode)); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); QQuickItem *contentItem = gridview->contentItem(); QTRY_VERIFY(contentItem != nullptr); @@ -4461,7 +4462,7 @@ void tst_QQuickGridView::snapOneRow() gridview->setFlow(flow); gridview->setLayoutDirection(layoutDirection); gridview->setHighlightRangeMode(QQuickItemView::HighlightRangeMode(highlightRangeMode)); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); QQuickItem *contentItem = gridview->contentItem(); QTRY_VERIFY(contentItem != nullptr); @@ -4623,7 +4624,7 @@ void tst_QQuickGridView::populateTransitions() QTRY_COMPARE(gridview->property("countPopulateTransitions").toInt(), 0); QTRY_COMPARE(gridview->property("countAddTransitions").toInt(), 18); } else { - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); QCOMPARE(gridview->property("countPopulateTransitions").toInt(), 0); QCOMPARE(gridview->property("countAddTransitions").toInt(), 0); } @@ -4659,7 +4660,7 @@ void tst_QQuickGridView::populateTransitions() for (int i = 0; i < 30; i++) model.addItem("item" + QString::number(i), ""); window->rootContext()->setContextProperty("testModel", &model); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); QTRY_COMPARE(gridview->property("countPopulateTransitions").toInt(), usePopulateTransition ? 18 : 0); QTRY_COMPARE(gridview->property("countAddTransitions").toInt(), 0); @@ -4747,11 +4748,11 @@ void tst_QQuickGridView::addTransitions() QTRY_VERIFY(gridview != nullptr); QQuickItem *contentItem = gridview->contentItem(); QVERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); if (contentYRowOffset != 0) { gridview->setContentY(contentYRowOffset * 60.0); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); } QList<QPair<QString,QString> > expectedDisplacedValues = expectedDisplacedIndexes.getModelDataValues(model); @@ -4956,7 +4957,7 @@ void tst_QQuickGridView::moveTransitions() if (contentYRowOffset != 0) { gridview->setContentY(contentYRowOffset * 60.0); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); } QList<QPair<QString,QString> > expectedDisplacedValues = expectedDisplacedIndexes.getModelDataValues(model); @@ -5197,11 +5198,11 @@ void tst_QQuickGridView::removeTransitions() QTRY_VERIFY(gridview != nullptr); QQuickItem *contentItem = gridview->contentItem(); QVERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); if (contentYRowOffset != 0) { gridview->setContentY(contentYRowOffset * 60.0); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); } QList<QPair<QString,QString> > expectedDisplacedValues = expectedDisplacedIndexes.getModelDataValues(model); @@ -5415,7 +5416,7 @@ void tst_QQuickGridView::displacedTransitions() QTRY_VERIFY(gridview != nullptr); QQuickItem *contentItem = gridview->contentItem(); QVERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); QList<QPair<QString,QString> > expectedDisplacedValues = expectedDisplacedIndexes.getModelDataValues(model); gridview->setProperty("displaceTransitionsDone", false); @@ -5436,7 +5437,7 @@ void tst_QQuickGridView::displacedTransitions() break; case ListChange::Moved: model.moveItems(change.index, change.to, change.count); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); break; case ListChange::SetCurrent: case ListChange::SetContentY: @@ -5634,11 +5635,11 @@ void tst_QQuickGridView::multipleTransitions() QTRY_VERIFY(gridview != nullptr); QQuickItem *contentItem = gridview->contentItem(); QVERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); if (contentY != 0) { gridview->setContentY(contentY); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); } int timeBetweenActions = window->rootObject()->property("timeBetweenActions").toInt(); @@ -5675,7 +5676,7 @@ void tst_QQuickGridView::multipleTransitions() case ListChange::Moved: model.moveItems(changes[i].index, changes[i].to, changes[i].count); gridview->forceLayout(); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); if (i == changes.count() - 1) { QTRY_VERIFY(!gridview->property("runningMoveTargets").toBool()); QTRY_VERIFY(!gridview->property("runningMoveDisplaced").toBool()); @@ -5685,12 +5686,12 @@ void tst_QQuickGridView::multipleTransitions() break; case ListChange::SetCurrent: gridview->setCurrentIndex(changes[i].index); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); gridview->forceLayout(); break; case ListChange::SetContentY: gridview->setContentY(changes[i].pos); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); gridview->forceLayout(); break; case ListChange::Polish: @@ -5804,7 +5805,7 @@ void tst_QQuickGridView::multipleDisplaced() QTRY_VERIFY(gridview != nullptr); QQuickItem *contentItem = gridview->contentItem(); QVERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); model.moveItems(12, 8, 1); QTest::qWait(window->rootObject()->property("duration").toInt() / 2); @@ -5854,7 +5855,7 @@ void tst_QQuickGridView::regression_QTBUG_57225() QQuickGridView *gridview = findItem<QQuickGridView>(window->rootObject(), "grid"); QVERIFY(gridview != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(gridview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(gridview)); model.removeItems(removeIndex, removeCount); QTRY_VERIFY(gridview->property("animationDone").toBool()); @@ -6127,7 +6128,7 @@ void tst_QQuickGridView::unrequestedVisibility() // move a non-visible item into view model.moveItems(10, 9, 1); - QTRY_COMPARE(QQuickItemPrivate::get(leftview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(leftview)); QTRY_VERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 1)); QCOMPARE(delegateVisible(item), false); @@ -6150,7 +6151,7 @@ void tst_QQuickGridView::unrequestedVisibility() // move a visible item out of view model.moveItems(5, 3, 1); - QTRY_COMPARE(QQuickItemPrivate::get(leftview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(leftview)); QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 3)); QCOMPARE(delegateVisible(item), false); @@ -6163,7 +6164,7 @@ void tst_QQuickGridView::unrequestedVisibility() // move a non-visible item into view model.moveItems(3, 5, 1); - QTRY_COMPARE(QQuickItemPrivate::get(leftview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(leftview)); QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 3)); QCOMPARE(delegateVisible(item), false); @@ -6176,7 +6177,7 @@ void tst_QQuickGridView::unrequestedVisibility() // move a visible item out of view model.moveItems(9, 10, 1); - QTRY_COMPARE(QQuickItemPrivate::get(leftview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(leftview)); QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 3)); QCOMPARE(delegateVisible(item), false); @@ -6189,7 +6190,7 @@ void tst_QQuickGridView::unrequestedVisibility() // move a non-visible item into view model.moveItems(10, 9, 1); - QTRY_COMPARE(QQuickItemPrivate::get(leftview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(leftview)); QVERIFY(item = findItem<QQuickItem>(leftContent, "wrapper", 3)); QCOMPARE(delegateVisible(item), false); diff --git a/tests/auto/quick/qquicklistview/data/listview-itematindex.qml b/tests/auto/quick/qquicklistview/data/listview-itematindex.qml new file mode 100644 index 0000000000..fba8b11933 --- /dev/null +++ b/tests/auto/quick/qquicklistview/data/listview-itematindex.qml @@ -0,0 +1,15 @@ +import QtQuick 2.0 + +ListView { + width: 400 + height: 400 + focus: true + model: 3 + + delegate: Text { + width: parent.width + height: 10 + property int idx: index + text: index + } +} diff --git a/tests/auto/quick/qquicklistview/qquicklistview.pro b/tests/auto/quick/qquicklistview/qquicklistview.pro index a95b6fdf33..fd96c269a2 100644 --- a/tests/auto/quick/qquicklistview/qquicklistview.pro +++ b/tests/auto/quick/qquicklistview/qquicklistview.pro @@ -16,6 +16,7 @@ include (../../shared/util.pri) include (../shared/util.pri) TESTDATA = data/* +DISTFILES += data/* -QT += core-private gui-private qml-private quick-private testlib +QT += core-private gui-private qml-private quick-private testlib qmltest diff --git a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp index ff796a5bd8..d96590bdae 100644 --- a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp +++ b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp @@ -31,6 +31,7 @@ #include <QtCore/QSortFilterProxyModel> #include <QtGui/QStandardItemModel> #include <QtQuick/qquickview.h> +#include <QtQuickTest/QtQuickTest> #include <QtQml/qqmlengine.h> #include <QtQml/qqmlcontext.h> #include <QtQml/qqmlexpression.h> @@ -165,6 +166,7 @@ private slots: void QTBUG_16037(); void indexAt_itemAt_data(); void indexAt_itemAt(); + void itemAtIndex(); void incrementalModel(); void onAdd(); void onAdd_data(); @@ -470,8 +472,7 @@ void tst_QQuickListView::items(const QUrl &source) // Force a layout, necessary if ListView is completed before DelegateModel. listview->forceLayout(); - int itemCount = findItems<QQuickItem>(contentItem, "wrapper").count(); - QTRY_COMPARE(itemCount, 0); + QTRY_VERIFY(findItems<QQuickItem>(contentItem, "wrapper").isEmpty()); QTRY_COMPARE(listview->highlightResizeVelocity(), 1000.0); QTRY_COMPARE(listview->highlightMoveVelocity(), 100000.0); @@ -647,7 +648,7 @@ void tst_QQuickListView::inserted_more(QQuickItemView::VerticalLayoutDirection v if (verticalLayoutDirection == QQuickItemView::BottomToTop) { listview->setVerticalLayoutDirection(verticalLayoutDirection); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); contentY = -listview->height() - contentY; } listview->setContentY(contentY); @@ -660,7 +661,7 @@ void tst_QQuickListView::inserted_more(QQuickItemView::VerticalLayoutDirection v model.insertItems(insertIndex, newData); //Wait for polish (updates list to the model changes) - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QTRY_COMPARE(listview->property("count").toInt(), model.count()); @@ -841,7 +842,7 @@ void tst_QQuickListView::insertBeforeVisible() QTRY_VERIFY(contentItem != nullptr); listview->setCacheBuffer(cacheBuffer); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); // trigger a refill (not just setting contentY) so that the visibleItems grid is updated int firstVisibleIndex = 20; // move to an index where the top item is not visible @@ -849,7 +850,7 @@ void tst_QQuickListView::insertBeforeVisible() listview->setCurrentIndex(firstVisibleIndex); qApp->processEvents(); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QTRY_COMPARE(listview->currentIndex(), firstVisibleIndex); QQuickItem *item = findItem<QQuickItem>(contentItem, "wrapper", firstVisibleIndex); QVERIFY(item); @@ -869,7 +870,7 @@ void tst_QQuickListView::insertBeforeVisible() // now, moving to the top of the view should position the inserted items correctly int itemsOffsetAfterMove = (removeCount - insertCount) * 20; listview->setCurrentIndex(0); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QTRY_COMPARE(listview->currentIndex(), 0); QTRY_COMPARE(listview->contentY(), 0.0 + itemsOffsetAfterMove); @@ -952,7 +953,7 @@ void tst_QQuickListView::removed(const QUrl &source, bool /* animated */) QTRY_VERIFY(listview != nullptr); QQuickItem *contentItem = listview->contentItem(); QTRY_VERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); model.removeItem(1); QTRY_COMPARE(window->rootObject()->property("count").toInt(), model.count()); @@ -1031,7 +1032,7 @@ void tst_QQuickListView::removed(const QUrl &source, bool /* animated */) listview->setContentY(20); // That's the top now // let transitions settle. - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); // Confirm items positioned correctly itemCount = findItems<QQuickItem>(contentItem, "wrapper").count(); @@ -1045,7 +1046,7 @@ void tst_QQuickListView::removed(const QUrl &source, bool /* animated */) // remove current item beyond visible items. listview->setCurrentIndex(20); listview->setContentY(40); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); model.removeItem(20); QTRY_COMPARE(listview->currentIndex(), 20); @@ -1053,7 +1054,7 @@ void tst_QQuickListView::removed(const QUrl &source, bool /* animated */) // remove item before current, but visible listview->setCurrentIndex(8); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); oldCurrent = listview->currentItem(); model.removeItem(6); @@ -1061,7 +1062,7 @@ void tst_QQuickListView::removed(const QUrl &source, bool /* animated */) QTRY_COMPARE(listview->currentItem(), oldCurrent); listview->setContentY(80); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); // remove all visible items model.removeItems(1, 18); @@ -1139,14 +1140,14 @@ void tst_QQuickListView::removed_more(const QUrl &source, QQuickItemView::Vertic if (verticalLayoutDirection == QQuickItemView::BottomToTop) { listview->setVerticalLayoutDirection(verticalLayoutDirection); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); contentY = -listview->height() - contentY; } listview->setContentY(contentY); model.removeItems(removeIndex, removeCount); //Wait for polish (updates list to the model changes) - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QTRY_COMPARE(listview->property("count").toInt(), model.count()); @@ -1320,7 +1321,7 @@ void tst_QQuickListView::clear(const QUrl &source, QQuickItemView::VerticalLayou QTRY_VERIFY(contentItem != nullptr); listview->setVerticalLayoutDirection(verticalLayoutDirection); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); model.clear(); @@ -1378,20 +1379,20 @@ void tst_QQuickListView::moved(const QUrl &source, QQuickItemView::VerticalLayou QTRY_VERIFY(contentItem != nullptr); // always need to wait for view to be painted before the first move() - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); bool waitForPolish = (contentY != 0); if (verticalLayoutDirection == QQuickItemView::BottomToTop) { listview->setVerticalLayoutDirection(verticalLayoutDirection); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); contentY = -listview->height() - contentY; } listview->setContentY(contentY); if (waitForPolish) - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); model.moveItems(from, to, count); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QList<QQuickItem*> items = findItems<QQuickItem>(contentItem, "wrapper"); int firstVisibleIndex = -1; @@ -1604,7 +1605,7 @@ void tst_QQuickListView::multipleChanges(bool condensed) QQuickListView *listview = findItem<QQuickListView>(window->rootObject(), "list"); QTRY_VERIFY(listview != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); for (int i=0; i<changes.count(); i++) { switch (changes[i].type) { @@ -1632,10 +1633,10 @@ void tst_QQuickListView::multipleChanges(bool condensed) continue; } if (!condensed) { - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); } } - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QCOMPARE(listview->count(), newCount); QCOMPARE(listview->count(), model.count()); @@ -1852,7 +1853,7 @@ void tst_QQuickListView::swapWithFirstItem() QQuickListView *listview = findItem<QQuickListView>(window->rootObject(), "list"); QTRY_VERIFY(listview != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); // ensure content position is stable listview->setContentY(0); @@ -1915,7 +1916,7 @@ void tst_QQuickListView::enforceRange() QTRY_COMPARE(listview->preferredHighlightBegin(), 100.0); QTRY_COMPARE(listview->preferredHighlightEnd(), 100.0); QTRY_COMPARE(listview->highlightRangeMode(), QQuickListView::StrictlyEnforceRange); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QQuickItem *contentItem = listview->contentItem(); QTRY_VERIFY(contentItem != nullptr); @@ -1970,7 +1971,7 @@ void tst_QQuickListView::enforceRange_withoutHighlight() QQuickListView *listview = findItem<QQuickListView>(window->rootObject(), "list"); QTRY_VERIFY(listview != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); qreal expectedPos = -100.0; @@ -2014,7 +2015,7 @@ void tst_QQuickListView::spacing() QQuickItem *contentItem = listview->contentItem(); QTRY_VERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); // Confirm items positioned correctly int itemCount = findItems<QQuickItem>(contentItem, "wrapper").count(); @@ -2073,7 +2074,7 @@ void tst_QQuickListView::sections(const QUrl &source) QQuickItem *contentItem = listview->contentItem(); QTRY_VERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); // Confirm items positioned correctly int itemCount = findItems<QQuickItem>(contentItem, "wrapper").count(); @@ -2143,9 +2144,9 @@ void tst_QQuickListView::sections(const QUrl &source) // check that headers change when item changes listview->setContentY(0); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); model.modifyItem(0, "changed", "2"); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); item = findItem<QQuickItem>(contentItem, "wrapper", 1); QTRY_VERIFY(item); @@ -2173,7 +2174,7 @@ void tst_QQuickListView::sectionsDelegate() QQuickItem *contentItem = listview->contentItem(); QTRY_VERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); // Confirm items positioned correctly int itemCount = findItems<QQuickItem>(contentItem, "wrapper").count(); @@ -2197,7 +2198,7 @@ void tst_QQuickListView::sectionsDelegate() model.modifyItem(2, "Three", "aaa"); model.modifyItem(3, "Four", "aaa"); model.modifyItem(4, "Five", "aaa"); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); for (int i = 0; i < 3; ++i) { QQuickItem *item = findItem<QQuickItem>(contentItem, @@ -2233,7 +2234,7 @@ void tst_QQuickListView::sectionsDelegate() model.modifyItem(9, "Two", "aaa"); model.modifyItem(10, "Two", "aaa"); model.modifyItem(11, "Two", "aaa"); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QTRY_COMPARE(findItems<QQuickItem>(contentItem, "sect_aaa").count(), 1); window->rootObject()->setProperty("sectionProperty", "name"); // ensure view has settled. @@ -2283,7 +2284,7 @@ void tst_QQuickListView::sectionsDragOutsideBounds() QQuickItem *contentItem = listview->contentItem(); QTRY_VERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); // QTBUG-17769 // Drag view up beyond bounds @@ -2329,11 +2330,11 @@ void tst_QQuickListView::sectionsDelegate_headerVisibility() QQuickItem *contentItem = listview->contentItem(); QTRY_VERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); // ensure section header is maintained in view listview->setCurrentIndex(20); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QTRY_VERIFY(qFuzzyCompare(listview->contentY(), 200.0)); QTRY_VERIFY(!listview->isMoving()); listview->setCurrentIndex(0); @@ -2360,7 +2361,7 @@ void tst_QQuickListView::sectionsPositioning() QTRY_VERIFY(listview != nullptr); QQuickItem *contentItem = listview->contentItem(); QTRY_VERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); for (int i = 0; i < 3; ++i) { QQuickItem *item = findItem<QQuickItem>(contentItem, "sect_" + QString::number(i)); @@ -2378,12 +2379,12 @@ void tst_QQuickListView::sectionsPositioning() // move down a little and check that section header is at top listview->setContentY(10); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QCOMPARE(topItem->y(), 0.); // push the top header up listview->setContentY(110); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); topItem = findVisibleChild(contentItem, "sect_0"); // section header QVERIFY(topItem); QCOMPARE(topItem->y(), 100.); @@ -2398,13 +2399,13 @@ void tst_QQuickListView::sectionsPositioning() // Move past section 0 listview->setContentY(120); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); topItem = findVisibleChild(contentItem, "sect_0"); // section header QVERIFY(!topItem); // Push section footer down listview->setContentY(70); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); bottomItem = findVisibleChild(contentItem, "sect_4"); // section footer QVERIFY(bottomItem); QCOMPARE(bottomItem->y(), 380.); @@ -2416,7 +2417,7 @@ void tst_QQuickListView::sectionsPositioning() model.modifyItem(2, "Three", "aAa"); model.modifyItem(3, "Four", "aaA"); model.modifyItem(4, "Five", "Aaa"); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QTRY_COMPARE(listview->currentSection(), QString("aaa")); @@ -2432,7 +2433,7 @@ void tst_QQuickListView::sectionsPositioning() // remove section boundary listview->setContentY(120); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); model.removeItem(5); listview->forceLayout(); QTRY_COMPARE(listview->count(), model.count()); @@ -2449,27 +2450,27 @@ void tst_QQuickListView::sectionsPositioning() // Change the next section listview->setContentY(0); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); bottomItem = findVisibleChild(contentItem, "sect_3"); // section footer QVERIFY(bottomItem); QTRY_COMPARE(bottomItem->y(), 300.); model.modifyItem(14, "New", "new"); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QTRY_VERIFY(bottomItem = findVisibleChild(contentItem, "sect_new")); // section footer QTRY_COMPARE(bottomItem->y(), 300.); // delegate size increase should push section footer down listview->setContentY(70); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QTRY_VERIFY(bottomItem = findVisibleChild(contentItem, "sect_3")); // section footer QTRY_COMPARE(bottomItem->y(), 370.); QQuickItem *inlineSection = findVisibleChild(contentItem, "sect_new"); item = findItem<QQuickItem>(contentItem, "wrapper", 13); QVERIFY(item); item->setHeight(40.); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QTRY_COMPARE(bottomItem->y(), 380.); QCOMPARE(inlineSection->y(), 360.); item->setHeight(20.); @@ -2477,14 +2478,14 @@ void tst_QQuickListView::sectionsPositioning() // Turn sticky footer off listview->setContentY(20); window->rootObject()->setProperty("sectionPositioning", QVariant(int(QQuickViewSection::InlineLabels | QQuickViewSection::CurrentLabelAtStart))); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QTRY_VERIFY(item = findVisibleChild(contentItem, "sect_new")); // inline label restored QCOMPARE(item->y(), 340.); // Turn sticky header off listview->setContentY(30); window->rootObject()->setProperty("sectionPositioning", QVariant(int(QQuickViewSection::InlineLabels))); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QTRY_VERIFY(item = findVisibleChild(contentItem, "sect_aaa")); // inline label restored QCOMPARE(item->y(), 0.); @@ -2520,7 +2521,7 @@ void tst_QQuickListView::sectionPropertyChange() QQuickItem *contentItem = listview->contentItem(); QTRY_VERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); // Confirm items positioned correctly for (int i = 0; i < 2; ++i) { @@ -2530,7 +2531,7 @@ void tst_QQuickListView::sectionPropertyChange() } QMetaObject::invokeMethod(window->rootObject(), "switchGroups"); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); // Confirm items positioned correctly for (int i = 0; i < 2; ++i) { @@ -2540,7 +2541,7 @@ void tst_QQuickListView::sectionPropertyChange() } QMetaObject::invokeMethod(window->rootObject(), "switchGroups"); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); // Confirm items positioned correctly for (int i = 0; i < 2; ++i) { @@ -2550,7 +2551,7 @@ void tst_QQuickListView::sectionPropertyChange() } QMetaObject::invokeMethod(window->rootObject(), "switchGrouped"); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); // Confirm items positioned correctly for (int i = 0; i < 2; ++i) { @@ -2560,7 +2561,7 @@ void tst_QQuickListView::sectionPropertyChange() } QMetaObject::invokeMethod(window->rootObject(), "switchGrouped"); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); // Confirm items positioned correctly for (int i = 0; i < 2; ++i) { @@ -2584,7 +2585,7 @@ void tst_QQuickListView::sectionDelegateChange() QQuickItem *contentItem = listview->contentItem(); QVERIFY(contentItem != nullptr); - QQUICK_VERIFY_POLISH(listview); + QQuickTest::qWaitForItemPolished(listview); QVERIFY(findItems<QQuickItem>(contentItem, "section1").count() > 0); QCOMPARE(findItems<QQuickItem>(contentItem, "section2").count(), 0); @@ -2596,7 +2597,7 @@ void tst_QQuickListView::sectionDelegateChange() } QMetaObject::invokeMethod(window->rootObject(), "switchDelegates"); - QQUICK_VERIFY_POLISH(listview); + QQuickTest::qWaitForItemPolished(listview); QCOMPARE(findItems<QQuickItem>(contentItem, "section1").count(), 0); QVERIFY(findItems<QQuickItem>(contentItem, "section2").count() > 0); @@ -2628,7 +2629,7 @@ void tst_QQuickListView::sectionsItemInsertion() QTRY_VERIFY(listview != nullptr); QQuickItem *contentItem = listview->contentItem(); QTRY_VERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); for (int i = 0; i < 3; ++i) { QQuickItem *item = findItem<QQuickItem>(contentItem, "sect_" + QString::number(i)); @@ -2644,7 +2645,7 @@ void tst_QQuickListView::sectionsItemInsertion() for (int i = 0; i < 10; i++) model.insertItem(i, "Item" + QString::number(i), QLatin1String("A")); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); int itemCount = findItems<QQuickItem>(contentItem, "wrapper").count(); QVERIFY(itemCount > 10); @@ -2782,7 +2783,7 @@ void tst_QQuickListView::currentIndex() QTRY_VERIFY(listview != nullptr); QQuickItem *contentItem = listview->contentItem(); QTRY_VERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); // currentIndex is initialized to 20 // currentItem should be in view @@ -2885,7 +2886,7 @@ void tst_QQuickListView::noCurrentIndex() QTRY_VERIFY(listview != nullptr); QQuickItem *contentItem = listview->contentItem(); QTRY_VERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); // current index should be -1 at startup // and we should not have a currentItem or highlightItem @@ -2930,7 +2931,7 @@ void tst_QQuickListView::keyNavigation() listview->setOrientation(orientation); listview->setLayoutDirection(layoutDirection); listview->setVerticalLayoutDirection(verticalLayoutDirection); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); window->requestActivate(); QVERIFY(QTest::qWaitForWindowActive(window)); @@ -3245,7 +3246,7 @@ void tst_QQuickListView::positionViewAtBeginningEnd() QTRY_VERIFY(listview != nullptr); QQuickItem *contentItem = listview->contentItem(); QTRY_VERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); listview->setContentY(100); @@ -3305,10 +3306,10 @@ void tst_QQuickListView::positionViewAtIndex() QTRY_VERIFY(listview != nullptr); QQuickItem *contentItem = listview->contentItem(); QTRY_VERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); window->rootObject()->setProperty("enforceRange", enforceRange); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); listview->setContentY(initContentY); @@ -3385,7 +3386,7 @@ void tst_QQuickListView::resetModel() QTRY_VERIFY(listview != nullptr); QQuickItem *contentItem = listview->contentItem(); QTRY_VERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QTRY_COMPARE(listview->count(), model.rowCount()); @@ -3656,7 +3657,7 @@ void tst_QQuickListView::QTBUG_11105() QTRY_VERIFY(listview != nullptr); QQuickItem *contentItem = listview->contentItem(); QTRY_VERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); // Confirm items positioned correctly int itemCount = findItems<QQuickItem>(contentItem, "wrapper").count(); @@ -3748,7 +3749,7 @@ void tst_QQuickListView::header() listview->setOrientation(orientation); listview->setLayoutDirection(layoutDirection); listview->setVerticalLayoutDirection(verticalLayoutDirection); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QQuickItem *contentItem = listview->contentItem(); QTRY_VERIFY(contentItem != nullptr); @@ -3827,7 +3828,7 @@ void tst_QQuickListView::header() listview->setOrientation(orientation); listview->setLayoutDirection(layoutDirection); listview->setVerticalLayoutDirection(verticalLayoutDirection); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); listview->setWidth(240); listview->setHeight(320); @@ -3934,7 +3935,7 @@ void tst_QQuickListView::headerChangesViewport() QQuickListView *listview = findItem<QQuickListView>(window->rootObject(), "list"); QTRY_VERIFY(listview != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QQuickItem *contentItem = listview->contentItem(); QTRY_VERIFY(contentItem != nullptr); @@ -3984,7 +3985,7 @@ void tst_QQuickListView::footer() listview->setOrientation(orientation); listview->setLayoutDirection(layoutDirection); listview->setVerticalLayoutDirection(verticalLayoutDirection); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QQuickItem *contentItem = listview->contentItem(); QTRY_VERIFY(contentItem != nullptr); @@ -4173,7 +4174,7 @@ void tst_QQuickListView::extents() listview->setOrientation(orientation); listview->setLayoutDirection(layoutDirection); listview->setVerticalLayoutDirection(verticalLayoutDirection); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QQuickItem *contentItem = listview->contentItem(); QTRY_VERIFY(contentItem != nullptr); @@ -4313,7 +4314,7 @@ void tst_QQuickListView::resizeView() QTRY_VERIFY(listview != nullptr); QQuickItem *contentItem = listview->contentItem(); QTRY_VERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); // Confirm items positioned correctly int itemCount = findItems<QQuickItem>(contentItem, "wrapper").count(); @@ -4329,7 +4330,7 @@ void tst_QQuickListView::resizeView() QCOMPARE(heightRatio.toReal(), 0.4); listview->setHeight(200); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QMetaObject::invokeMethod(window->rootObject(), "heightRatio", Q_RETURN_ARG(QVariant, heightRatio)); QCOMPARE(heightRatio.toReal(), 0.25); @@ -4390,7 +4391,7 @@ void tst_QQuickListView::resizeViewAndRepaint() QTRY_VERIFY(listview != nullptr); QQuickItem *contentItem = listview->contentItem(); QTRY_VERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); // item at index 10 should not be currently visible QVERIFY(!findItem<QQuickItem>(contentItem, "wrapper", 10)); @@ -4425,7 +4426,7 @@ void tst_QQuickListView::sizeLessThan1() QTRY_VERIFY(listview != nullptr); QQuickItem *contentItem = listview->contentItem(); QTRY_VERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); // Confirm items positioned correctly int itemCount = findItems<QQuickItem>(contentItem, "wrapper").count(); @@ -4477,13 +4478,13 @@ void tst_QQuickListView::resizeDelegate() QVERIFY(listview != nullptr); QQuickItem *contentItem = listview->contentItem(); QVERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QCOMPARE(listview->count(), model.rowCount()); listview->setCurrentIndex(25); listview->setContentY(0); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); for (int i = 0; i < 16; ++i) { QQuickItem *item = findItem<QQuickItem>(contentItem, "wrapper", i); @@ -4495,7 +4496,7 @@ void tst_QQuickListView::resizeDelegate() QTRY_COMPARE(listview->highlightItem()->y(), 500.0); window->rootObject()->setProperty("delegateHeight", 30); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); for (int i = 0; i < 11; ++i) { QQuickItem *item = findItem<QQuickItem>(contentItem, "wrapper", i); @@ -4509,7 +4510,7 @@ void tst_QQuickListView::resizeDelegate() listview->setCurrentIndex(1); listview->positionViewAtIndex(25, QQuickListView::Beginning); listview->positionViewAtIndex(5, QQuickListView::Beginning); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); for (int i = 5; i < 16; ++i) { QQuickItem *item = findItem<QQuickItem>(contentItem, "wrapper", i); @@ -4521,7 +4522,7 @@ void tst_QQuickListView::resizeDelegate() QTRY_COMPARE(listview->highlightItem()->y(), 30.0); window->rootObject()->setProperty("delegateHeight", 20); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); for (int i = 5; i < 11; ++i) { QQuickItem *item = findItem<QQuickItem>(contentItem, "wrapper", i); @@ -4558,7 +4559,7 @@ void tst_QQuickListView::resizeFirstDelegate() QVERIFY(listview != nullptr); QQuickItem *contentItem = listview->contentItem(); QVERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QQuickItem *item = nullptr; for (int i = 0; i < model.count(); ++i) { @@ -4597,7 +4598,7 @@ void tst_QQuickListView::resizeFirstDelegate() listview->setCurrentIndex(19); qApp->processEvents(); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); // items 0-2 should have been deleted for (int i=0; i<3; i++) { @@ -4628,7 +4629,7 @@ void tst_QQuickListView::repositionResizedDelegate() QQuickListView *listview = qobject_cast<QQuickListView*>(window->rootObject()); QTRY_VERIFY(listview != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QQuickItem *positioner = findItem<QQuickItem>(window->rootObject(), "positioner"); QVERIFY(positioner); @@ -4643,7 +4644,7 @@ void tst_QQuickListView::repositionResizedDelegate() listview->setContentX(contentPos_itemFirstHalfVisible.x()); listview->setContentY(contentPos_itemFirstHalfVisible.y()); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); prevSpyCount = spy.count(); QVERIFY(QMetaObject::invokeMethod(window->rootObject(), "incrementRepeater")); QTRY_COMPARE(positioner->boundingRect().size(), resizedPositionerRect.size()); @@ -4660,7 +4661,7 @@ void tst_QQuickListView::repositionResizedDelegate() listview->setContentX(contentPos_itemSecondHalfVisible.x()); listview->setContentY(contentPos_itemSecondHalfVisible.y()); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); prevSpyCount = spy.count(); QVERIFY(QMetaObject::invokeMethod(window->rootObject(), "incrementRepeater")); @@ -4768,7 +4769,7 @@ void tst_QQuickListView::indexAt_itemAt() QQuickItem *contentItem = listview->contentItem(); QTRY_VERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QQuickItem *item = nullptr; if (index >= 0) { @@ -4782,6 +4783,29 @@ void tst_QQuickListView::indexAt_itemAt() delete testObject; } +void tst_QQuickListView::itemAtIndex() +{ + QScopedPointer<QQuickView> window(createView()); + window->setSource(testFileUrl("listview-itematindex.qml")); + window->show(); + QVERIFY(QTest::qWaitForWindowExposed(window.data())); + + QQuickListView *listview = qobject_cast<QQuickListView*>(window->rootObject()); + QVERIFY(listview != nullptr); + + QCOMPARE(listview->itemAtIndex(-1), nullptr); + QCOMPARE(listview->itemAtIndex(3), nullptr); + QQuickItem *item = listview->itemAtIndex(0); + QVERIFY(item); + QCOMPARE(item->property("idx"), 0); + item = listview->itemAtIndex(1); + QVERIFY(item); + QCOMPARE(item->property("idx"), 1); + item = listview->itemAtIndex(2); + QVERIFY(item); + QCOMPARE(item->property("idx"), 2); +} + void tst_QQuickListView::incrementalModel() { QScopedPointer<QQuickView> window(createView()); @@ -4926,7 +4950,7 @@ void tst_QQuickListView::rightToLeft() QQuickItem *contentItem = listview->contentItem(); QTRY_VERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QQmlObjectModel *model = window->rootObject()->findChild<QQmlObjectModel*>("itemModel"); QTRY_VERIFY(model != nullptr); @@ -5039,7 +5063,7 @@ void tst_QQuickListView::margins() QTRY_VERIFY(listview != nullptr); QQuickItem *contentItem = listview->contentItem(); QTRY_VERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QCOMPARE(listview->contentY(), -30.); QCOMPARE(listview->originY(), 0.); @@ -5048,7 +5072,7 @@ void tst_QQuickListView::margins() listview->positionViewAtEnd(); qreal pos = listview->contentY(); listview->setContentY(pos + 80); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); listview->returnToBounds(); QTRY_COMPARE(listview->contentY(), pos + 50); @@ -5059,7 +5083,7 @@ void tst_QQuickListView::margins() listview->forceLayout(); QTRY_COMPARE(listview->count(), model.count()); listview->setContentY(-50); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); listview->returnToBounds(); QCOMPARE(listview->originY(), 20.); QTRY_COMPARE(listview->contentY(), -10.); @@ -5112,7 +5136,7 @@ void tst_QQuickListView::marginsResize() listview->setOrientation(orientation); listview->setLayoutDirection(layoutDirection); listview->setVerticalLayoutDirection(verticalLayoutDirection); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); // view is resized after componentCompleted - top margin should still be visible if (orientation == QQuickListView::Vertical) @@ -5252,7 +5276,7 @@ void tst_QQuickListView::snapToItem() listview->setLayoutDirection(layoutDirection); listview->setVerticalLayoutDirection(verticalLayoutDirection); listview->setHighlightRangeMode(QQuickItemView::HighlightRangeMode(highlightRangeMode)); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QQuickItem *contentItem = listview->contentItem(); QTRY_VERIFY(contentItem != nullptr); @@ -5304,7 +5328,7 @@ void tst_QQuickListView::snapToItemWithSpacing_QTBUG_59852() auto *listView = qobject_cast<QQuickListView*>(window->rootObject()); QVERIFY(listView); - QTRY_COMPARE(QQuickItemPrivate::get(listView)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listView)); // each item in the list is 100 pixels tall, and the spacing is 100 @@ -5335,14 +5359,14 @@ void tst_QQuickListView::snapOneItemResize_QTBUG_43555() QSignalSpy currentIndexSpy(listview, SIGNAL(currentIndexChanged())); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QTRY_COMPARE(listview->currentIndex(), 5); currentIndexSpy.clear(); window->resize(QSize(400, 320)); QTRY_COMPARE(int(listview->width()), 400); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QTRY_COMPARE(listview->currentIndex(), 5); QCOMPARE(currentIndexSpy.count(), 0); @@ -5652,7 +5676,7 @@ void tst_QQuickListView::snapOneItem() listview->setLayoutDirection(layoutDirection); listview->setVerticalLayoutDirection(verticalLayoutDirection); listview->setHighlightRangeMode(QQuickItemView::HighlightRangeMode(highlightRangeMode)); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QQuickItem *contentItem = listview->contentItem(); QTRY_VERIFY(contentItem != nullptr); @@ -5721,14 +5745,14 @@ void tst_QQuickListView::snapOneItemCurrentIndexRemoveAnimation() QQuickListView *listview = qobject_cast<QQuickListView*>(window->rootObject()); QTRY_VERIFY(listview != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QTRY_COMPARE(listview->currentIndex(), 0); QSignalSpy currentIndexSpy(listview, SIGNAL(currentIndexChanged())); QMetaObject::invokeMethod(window->rootObject(), "removeItemZero"); QTRY_COMPARE(listview->property("transitionsRun").toInt(), 1); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QCOMPARE(listview->currentIndex(), 0); QCOMPARE(currentIndexSpy.count(), 0); @@ -5744,7 +5768,7 @@ void tst_QQuickListView::snapOneItemWrongDirection() QQuickListView *listview = qobject_cast<QQuickListView*>(window->rootObject()); QTRY_VERIFY(listview != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QTRY_COMPARE(listview->currentIndex(), 0); listview->flick(0,500); @@ -5894,7 +5918,7 @@ void tst_QQuickListView::unrequestedVisibility() QCOMPARE(delegateVisible(item), false); model.moveItems(19, 1, 1); - QTRY_COMPARE(QQuickItemPrivate::get(leftview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(leftview)); QTRY_VERIFY((item = findItem<QQuickItem>(leftContent, wrapperObjectName, 1))); QCOMPARE(delegateVisible(item), false); @@ -5923,7 +5947,7 @@ void tst_QQuickListView::unrequestedVisibility() QCOMPARE(delegateVisible(item), false); model.moveItems(3, 4, 1); - QTRY_COMPARE(QQuickItemPrivate::get(leftview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(leftview)); item = findItem<QQuickItem>(leftContent, wrapperObjectName, 4); QVERIFY(item); @@ -5939,7 +5963,7 @@ void tst_QQuickListView::unrequestedVisibility() QCOMPARE(delegateVisible(item), false); model.moveItems(4, 3, 1); - QTRY_COMPARE(QQuickItemPrivate::get(leftview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(leftview)); item = findItem<QQuickItem>(leftContent, wrapperObjectName, 4); QVERIFY(item); @@ -5955,7 +5979,7 @@ void tst_QQuickListView::unrequestedVisibility() QCOMPARE(delegateVisible(item), false); model.moveItems(16, 17, 1); - QTRY_COMPARE(QQuickItemPrivate::get(leftview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(leftview)); item = findItem<QQuickItem>(leftContent, wrapperObjectName, 4); QVERIFY(item); @@ -5971,7 +5995,7 @@ void tst_QQuickListView::unrequestedVisibility() QCOMPARE(delegateVisible(item), false); model.moveItems(17, 16, 1); - QTRY_COMPARE(QQuickItemPrivate::get(leftview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(leftview)); item = findItem<QQuickItem>(leftContent, wrapperObjectName, 4); QVERIFY(item); @@ -6031,7 +6055,7 @@ void tst_QQuickListView::populateTransitions() QTRY_COMPARE(listview->property("countPopulateTransitions").toInt(), 0); QTRY_COMPARE(listview->property("countAddTransitions").toInt(), 16); } else { - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QCOMPARE(listview->property("countPopulateTransitions").toInt(), 0); QCOMPARE(listview->property("countAddTransitions").toInt(), 0); } @@ -6142,7 +6166,7 @@ void tst_QQuickListView::sizeTransitions() QQuickListView *listview = findItem<QQuickListView>(window->rootObject(), "list"); QTRY_VERIFY(listview != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); // the following will start the transition model.addItem(QLatin1String("Test"), ""); @@ -6207,11 +6231,11 @@ void tst_QQuickListView::addTransitions() QTRY_VERIFY(listview != nullptr); QQuickItem *contentItem = listview->contentItem(); QVERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); if (contentY != 0) { listview->setContentY(contentY); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); } QList<QPair<QString,QString> > expectedDisplacedValues = expectedDisplacedIndexes.getModelDataValues(model); @@ -6407,7 +6431,7 @@ void tst_QQuickListView::moveTransitions() if (contentY != 0) { listview->setContentY(contentY); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); } QList<QPair<QString,QString> > expectedDisplacedValues = expectedDisplacedIndexes.getModelDataValues(model); @@ -6606,11 +6630,11 @@ void tst_QQuickListView::removeTransitions() QTRY_VERIFY(listview != nullptr); QQuickItem *contentItem = listview->contentItem(); QVERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); if (contentY != 0) { listview->setContentY(contentY); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); } QList<QPair<QString,QString> > expectedDisplacedValues = expectedDisplacedIndexes.getModelDataValues(model); @@ -6818,7 +6842,7 @@ void tst_QQuickListView::displacedTransitions() QTRY_VERIFY(listview != nullptr); QQuickItem *contentItem = listview->contentItem(); QVERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QList<QPair<QString,QString> > expectedDisplacedValues = expectedDisplacedIndexes.getModelDataValues(model); listview->setProperty("displaceTransitionsDone", false); @@ -6839,7 +6863,7 @@ void tst_QQuickListView::displacedTransitions() break; case ListChange::Moved: model.moveItems(change.index, change.to, change.count); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); break; case ListChange::SetCurrent: case ListChange::SetContentY: @@ -7038,11 +7062,11 @@ void tst_QQuickListView::multipleTransitions() QTRY_VERIFY(listview != nullptr); QQuickItem *contentItem = listview->contentItem(); QVERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); if (contentY != 0) { listview->setContentY(contentY); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); } int timeBetweenActions = window->rootObject()->property("timeBetweenActions").toInt(); @@ -7076,7 +7100,7 @@ void tst_QQuickListView::multipleTransitions() break; case ListChange::Moved: model.moveItems(changes[i].index, changes[i].to, changes[i].count); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); if (i == changes.count() - 1) { QTRY_VERIFY(!listview->property("runningMoveTargets").toBool()); QTRY_VERIFY(!listview->property("runningMoveDisplaced").toBool()); @@ -7089,7 +7113,7 @@ void tst_QQuickListView::multipleTransitions() break; case ListChange::SetContentY: listview->setContentY(changes[i].pos); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); break; case ListChange::Polish: break; @@ -7195,7 +7219,7 @@ void tst_QQuickListView::multipleDisplaced() QTRY_VERIFY(listview != nullptr); QQuickItem *contentItem = listview->contentItem(); QVERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); model.moveItems(12, 8, 1); QTest::qWait(window->rootObject()->property("duration").toInt() / 2); @@ -7289,7 +7313,7 @@ void tst_QQuickListView::flickBeyondBounds() QQuickItem *contentItem = listview->contentItem(); QTRY_VERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); // Flick view up beyond bounds flick(window.data(), QPoint(10, 10), QPoint(10, -2000), 180); @@ -7401,7 +7425,7 @@ void tst_QQuickListView::destroyItemOnCreation() QQuickItem *contentItem = listview->contentItem(); QVERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QCOMPARE(window->rootObject()->property("createdIndex").toInt(), -1); model.addItem("new item", ""); @@ -7425,7 +7449,7 @@ void tst_QQuickListView::parentBinding() QQuickItem *contentItem = listview->contentItem(); QVERIFY(contentItem != nullptr); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QQuickItem *item = findItem<QQuickItem>(contentItem, "wrapper", 0); QVERIFY(item); @@ -8829,7 +8853,7 @@ void tst_QQuickListView::QTBUG_34576_velocityZero() QVERIFY(listview); QQuickItem *contentItem = listview->contentItem(); QVERIFY(contentItem); - QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(listview)); QSignalSpy horizontalVelocitySpy(listview, SIGNAL(horizontalVelocityChanged())); diff --git a/tests/auto/quick/qquickpathview/qquickpathview.pro b/tests/auto/quick/qquickpathview/qquickpathview.pro index 90c1eb0c67..f21fb64fa4 100644 --- a/tests/auto/quick/qquickpathview/qquickpathview.pro +++ b/tests/auto/quick/qquickpathview/qquickpathview.pro @@ -9,5 +9,5 @@ include (../shared/util.pri) TESTDATA = data/* -QT += core-private gui-private qml-private quick-private testlib +QT += core-private gui-private qml-private quick-private testlib qmltest qtHaveModule(widgets): QT += widgets diff --git a/tests/auto/quick/qquickpathview/tst_qquickpathview.cpp b/tests/auto/quick/qquickpathview/tst_qquickpathview.cpp index 6267a3771e..bf38d2d926 100644 --- a/tests/auto/quick/qquickpathview/tst_qquickpathview.cpp +++ b/tests/auto/quick/qquickpathview/tst_qquickpathview.cpp @@ -38,6 +38,7 @@ #include <QtQuick/private/qquickpath_p.h> #include <QtQuick/private/qquicktext_p.h> #include <QtQuick/private/qquickrectangle_p.h> +#include <QtQuickTest/QtQuickTest> #include <QtQml/private/qqmllistmodel_p.h> #include <QtQml/private/qqmlvaluetype_p.h> #include <QtGui/qstandarditemmodel.h> @@ -714,13 +715,13 @@ void tst_QQuickPathView::consecutiveModelChanges() pathview->setCurrentIndex(changes[i].index); break; case ListChange::Polish: - QQUICK_VERIFY_POLISH(pathview); + QQuickTest::qWaitForItemPolished(pathview); break; default: continue; } } - QQUICK_VERIFY_POLISH(pathview); + QQuickTest::qWaitForItemPolished(pathview); QCOMPARE(findItems<QQuickItem>(pathview, "wrapper").count(), count); QCOMPARE(pathview->count(), count); @@ -1371,7 +1372,7 @@ void tst_QQuickPathView::package() QSKIP("QTBUG-27170 view does not reliably receive polish without a running animation"); #endif - QQUICK_VERIFY_POLISH(pathView); + QQuickTest::qWaitForItemPolished(pathView); QQuickItem *item = findItem<QQuickItem>(pathView, "pathItem"); QVERIFY(item); QVERIFY(item->scale() != 1.0); diff --git a/tests/auto/quick/qquickpositioners/qquickpositioners.pro b/tests/auto/quick/qquickpositioners/qquickpositioners.pro index 6e85ba9db8..d1547df189 100644 --- a/tests/auto/quick/qquickpositioners/qquickpositioners.pro +++ b/tests/auto/quick/qquickpositioners/qquickpositioners.pro @@ -9,4 +9,4 @@ macx:CONFIG -= app_bundle TESTDATA = data/* -QT += testlib +QT += testlib qmltest diff --git a/tests/auto/quick/qquickpositioners/tst_qquickpositioners.cpp b/tests/auto/quick/qquickpositioners/tst_qquickpositioners.cpp index 9881af690c..80be25d1b0 100644 --- a/tests/auto/quick/qquickpositioners/tst_qquickpositioners.cpp +++ b/tests/auto/quick/qquickpositioners/tst_qquickpositioners.cpp @@ -31,6 +31,7 @@ #include <QtQuick/private/qquickrectangle_p.h> #include <QtQuick/private/qquickpositioners_p.h> #include <QtQuick/private/qquicktransition_p.h> +#include <QtQuickTest/QtQuickTest> #include <private/qquickitem_p.h> #include <qqmlexpression.h> #include "../shared/viewtestutil.h" @@ -1062,7 +1063,7 @@ void tst_qquickpositioners::populateTransitions(const QString &positionerObjectN QTRY_COMPARE(window->rootObject()->property("populateTransitionsDone").toInt(), 0); QTRY_COMPARE(window->rootObject()->property("addTransitionsDone").toInt(), model.count()); } else { - QTRY_COMPARE(QQuickItemPrivate::get(positioner)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(positioner)); QTRY_COMPARE(window->rootObject()->property("populateTransitionsDone").toInt(), 0); QTRY_COMPARE(window->rootObject()->property("addTransitionsDone").toInt(), 0); } @@ -1128,7 +1129,7 @@ void tst_qquickpositioners::addTransitions(const QString &positionerObjectName) QQuickItem *positioner = window->rootObject()->findChild<QQuickItem*>(positionerObjectName); QVERIFY(positioner); positioner->findChild<QQuickItem*>("repeater")->setProperty("model", QVariant::fromValue(&model)); - QTRY_COMPARE(QQuickItemPrivate::get(positioner)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(positioner)); for (int i = 0; i < initialItemCount; i++) model.addItem("Original item" + QString::number(i), ""); @@ -1253,7 +1254,7 @@ void tst_qquickpositioners::moveTransitions(const QString &positionerObjectName) QQuickItem *positioner = window->rootObject()->findChild<QQuickItem*>(positionerObjectName); QVERIFY(positioner); positioner->findChild<QQuickItem*>("repeater")->setProperty("model", QVariant::fromValue(&model)); - QTRY_COMPARE(QQuickItemPrivate::get(positioner)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(positioner)); switch (change.type) { case ListChange::Removed: @@ -1262,7 +1263,7 @@ void tst_qquickpositioners::moveTransitions(const QString &positionerObjectName) break; case ListChange::Moved: model.moveItems(change.index, change.to, change.count); - QTRY_COMPARE(QQuickItemPrivate::get(positioner)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(positioner)); break; case ListChange::Inserted: case ListChange::SetCurrent: @@ -3815,7 +3816,7 @@ void tst_qquickpositioners::test_mirroring() QQuickItem *positionerB = itemB->parentItem(); positionerA->setWidth(positionerA->width() * 2); positionerB->setWidth(positionerB->width() * 2); - QTRY_VERIFY(!QQuickItemPrivate::get(positionerA)->polishScheduled && !QQuickItemPrivate::get(positionerB)->polishScheduled); + QVERIFY(QQuickTest::qWaitForItemPolished(positionerA) && QQuickTest::qWaitForItemPolished(positionerB)); QTRY_COMPARE(itemA->x(), itemB->x()); } diff --git a/tests/auto/quick/qquickshadereffect/tst_qquickshadereffect.cpp b/tests/auto/quick/qquickshadereffect/tst_qquickshadereffect.cpp index f601f520bb..a57b7d4c1f 100644 --- a/tests/auto/quick/qquickshadereffect/tst_qquickshadereffect.cpp +++ b/tests/auto/quick/qquickshadereffect/tst_qquickshadereffect.cpp @@ -46,6 +46,10 @@ class TestShaderEffect : public QQuickShaderEffect Q_PROPERTY(QMatrix4x4 mat4x4 READ mat4x4Read NOTIFY dummyChanged) public: + TestShaderEffect(QQuickItem* parent = nullptr) : QQuickShaderEffect(parent) + { + } + QMatrix4x4 mat4x4Read() const { return QMatrix4x4(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1); } QVariant dummyRead() const { return QVariant(); } @@ -79,6 +83,8 @@ private slots: void deleteShaderEffectSource(); void twoImagesOneShaderEffect(); + void withoutQmlEngine(); + private: enum PresenceFlags { VertexPresent = 0x01, @@ -320,6 +326,16 @@ void tst_qquickshadereffect::twoImagesOneShaderEffect() delete view; } +void tst_qquickshadereffect::withoutQmlEngine() +{ + // using a shader without QML engine used to crash + auto window = new QQuickWindow; + auto shaderEffect = new TestShaderEffect(window->contentItem()); + shaderEffect->setVertexShader(""); + QVERIFY(shaderEffect->isComponentComplete()); + delete window; +} + QTEST_MAIN(tst_qquickshadereffect) #include "tst_qquickshadereffect.moc" 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/qquicktableview.pro b/tests/auto/quick/qquicktableview/qquicktableview.pro index f4d0265dd3..cf831ed5b5 100644 --- a/tests/auto/quick/qquicktableview/qquicktableview.pro +++ b/tests/auto/quick/qquicktableview/qquicktableview.pro @@ -1,4 +1,5 @@ CONFIG += testcase +QT += qmltest TARGET = tst_qquicktableview macos:CONFIG -= app_bundle diff --git a/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp b/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp index 22f6e5d654..60d48bb59f 100644 --- a/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp +++ b/tests/auto/quick/qquicktableview/tst_qquicktableview.cpp @@ -27,6 +27,7 @@ ****************************************************************************/ #include <QtTest/QtTest> +#include <QtQuickTest/quicktest.h> #include <QtQuick/qquickview.h> #include <QtQuick/private/qquicktableview_p.h> @@ -79,8 +80,8 @@ Q_DECLARE_METATYPE(QMarginsF); DECLARE_TABLEVIEW_VARIABLES #define WAIT_UNTIL_POLISHED \ - QVERIFY(tableViewPrivate->polishScheduled); \ - QTRY_VERIFY(!tableViewPrivate->polishScheduled) + QVERIFY(QQuickTest::qIsPolishScheduled(tableView)); \ + QVERIFY(QQuickTest::qWaitForItemPolished(tableView)) class tst_QQuickTableView : public QQmlDataTest { @@ -110,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(); @@ -156,6 +159,8 @@ private slots: void checkRebuildViewportOnly(); void useDelegateChooserWithoutDefault(); void checkTableviewInsideAsyncLoader(); + void hideRowsAndColumns_data(); + void hideRowsAndColumns(); void checkThatRevisionedPropertiesCannotBeUsedInOldImports(); }; @@ -251,8 +256,9 @@ void tst_QQuickTableView::checkPreload() WAIT_UNTIL_POLISHED; if (reuseItems) { - QSize visibleTableSize = tableViewPrivate->loadedTable.size(); - int expectedPoolSize = visibleTableSize.height() + visibleTableSize.width() + 1; + const int rowCount = tableViewPrivate->loadedRows.count(); + const int columnCount = tableViewPrivate->loadedColumns.count(); + const int expectedPoolSize = rowCount + columnCount + 1; QCOMPARE(tableViewPrivate->tableModel->poolSize(), expectedPoolSize); } else { QCOMPARE(tableViewPrivate->tableModel->poolSize(), 0); @@ -321,10 +327,9 @@ void tst_QQuickTableView::checkColumnWidthWithoutProvider() WAIT_UNTIL_POLISHED; - QRect table = tableViewPrivate->loadedTable; - for (int column = table.left(); column <= table.right(); ++column) { + for (const int column : tableViewPrivate->loadedColumns.keys()) { const qreal expectedColumnWidth = tableViewPrivate->sizeHintForColumn(column); - for (int row = table.top(); row <= table.bottom(); ++row) { + for (const int row : tableViewPrivate->loadedRows.keys()) { const auto item = tableViewPrivate->loadedTableItem(QPoint(column, row))->item; QCOMPARE(item->width(), expectedColumnWidth); } @@ -373,7 +378,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 +386,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 @@ -414,10 +436,9 @@ void tst_QQuickTableView::checkRowHeightWithoutProvider() WAIT_UNTIL_POLISHED; - QRect table = tableViewPrivate->loadedTable; - for (int row = table.top(); row <= table.bottom(); ++row) { + for (const int row : tableViewPrivate->loadedRows.keys()) { const qreal expectedRowHeight = tableViewPrivate->sizeHintForRow(row); - for (int column = table.left(); column <= table.right(); ++column) { + for (const int column : tableViewPrivate->loadedColumns.keys()) { const auto item = tableViewPrivate->loadedTableItem(QPoint(column, row))->item; QCOMPARE(item->height(), expectedRowHeight); } @@ -454,7 +475,7 @@ void tst_QQuickTableView::checkRowHeightProviderInvalidReturnValues() tableView->setModel(model); - QTest::ignoreMessage(QtWarningMsg, QRegularExpression(".*Provider.*valid")); + QTest::ignoreMessage(QtWarningMsg, QRegularExpression(".*implicitHeight.*zero")); WAIT_UNTIL_POLISHED; @@ -462,6 +483,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 @@ -539,6 +577,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 @@ -549,6 +589,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 @@ -563,50 +605,61 @@ 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->loadedTable.left(), smallCellCount); - QCOMPARE(tableViewPrivate->loadedTable.right(), columnCount - 1); + QCOMPARE(tableViewPrivate->leftColumn(), smallCellCount); + QCOMPARE(tableViewPrivate->rightColumn(), columnCount - 1); const qreal firstHalfLength = smallCellCount * cellSizeSmall; 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() @@ -618,17 +671,18 @@ void tst_QQuickTableView::checkPageFlicking() const int cellWidth = 100; const int cellHeight = 50; auto model = TestModelAsVariant(10000, 10000); + const auto &loadedRows = tableViewPrivate->loadedRows; + const auto &loadedColumns = tableViewPrivate->loadedColumns; tableView->setModel(model); WAIT_UNTIL_POLISHED; // Sanity check startup table - QRect tableRect = tableViewPrivate->loadedTable; - QCOMPARE(tableRect.x(), 0); - QCOMPARE(tableRect.y(), 0); - QCOMPARE(tableRect.width(), tableView->width() / cellWidth); - QCOMPARE(tableRect.height(), tableView->height() / cellHeight); + QCOMPARE(tableViewPrivate->topRow(), 0); + QCOMPARE(tableViewPrivate->leftColumn(), 0); + QCOMPARE(loadedRows.count(), tableView->height() / cellHeight); + QCOMPARE(loadedColumns.count(), tableView->width() / cellWidth); // Since all cells have the same size, the average row/column // size found by TableView should be exactly equal to this. @@ -652,11 +706,10 @@ void tst_QQuickTableView::checkPageFlicking() WAIT_UNTIL_POLISHED; - tableRect = tableViewPrivate->loadedTable; - QCOMPARE(tableRect.x(), flickToColumn); - QCOMPARE(tableRect.y(), 0); - QCOMPARE(tableRect.width(), tableView->width() / cellWidth); - QCOMPARE(tableRect.height(), tableView->height() / cellHeight); + QCOMPARE(tableViewPrivate->topRow(), 0); + QCOMPARE(tableViewPrivate->leftColumn(), flickToColumn); + QCOMPARE(loadedColumns.count(), tableView->width() / cellWidth); + QCOMPARE(loadedRows.count(), tableView->height() / cellHeight); // Flick 5000 rows down as well. Since flicking down should only calculate a new row (but // keep the current column), we deliberatly change the average width to check that it's @@ -675,11 +728,10 @@ void tst_QQuickTableView::checkPageFlicking() WAIT_UNTIL_POLISHED; - tableRect = tableViewPrivate->loadedTable; - QCOMPARE(tableRect.x(), flickToRow); - QCOMPARE(tableRect.y(), flickToColumn); - QCOMPARE(tableRect.width(), tableView->width() / cellWidth); - QCOMPARE(tableRect.height(), tableView->height() / cellHeight); + QCOMPARE(tableViewPrivate->topRow(), flickToColumn); + QCOMPARE(tableViewPrivate->leftColumn(), flickToRow); + QCOMPARE(loadedRows.count(), tableView->height() / cellHeight); + QCOMPARE(loadedColumns.count(), tableView->width() / cellWidth); } void tst_QQuickTableView::checkExplicitContentWidthAndHeight() @@ -729,8 +781,8 @@ void tst_QQuickTableView::checkContentXY() // Check that we end up at the correct top-left cell: const qreal delegateWidth = tableViewPrivate->loadedItems.values().first()->item->width(); const int expectedCellXY = qCeil(expectedXY / delegateWidth); - QCOMPARE(tableViewPrivate->loadedTable.left(), expectedCellXY); - QCOMPARE(tableViewPrivate->loadedTable.top(), expectedCellXY); + QCOMPARE(tableViewPrivate->leftColumn(), expectedCellXY); + QCOMPARE(tableViewPrivate->topRow(), expectedCellXY); } void tst_QQuickTableView::noDelegate() @@ -1004,7 +1056,8 @@ void tst_QQuickTableView::fillTableViewButNothingMore() auto const topLeftFxItem = tableViewPrivate->loadedTableItem(QPoint(0, 0)); auto const topLeftItem = topLeftFxItem->item; - auto const bottomRightFxItem = tableViewPrivate->loadedTableItem(tableViewPrivate->loadedTable.bottomRight()); + auto const bottomRightLoadedCell = QPoint(tableViewPrivate->rightColumn(), tableViewPrivate->bottomRow()); + auto const bottomRightFxItem = tableViewPrivate->loadedTableItem(bottomRightLoadedCell); auto const bottomRightItem = bottomRightFxItem->item; const QPoint bottomRightCell = getContextRowAndColumn(bottomRightItem.data()); @@ -1182,15 +1235,13 @@ void tst_QQuickTableView::flick() WAIT_UNTIL_POLISHED; - const QRect loadedTable = tableViewPrivate->loadedTable; - - const int expectedTableLeft = cellsToFlick - int((margins.left() + spacing.width()) / cellWidth); - const int expectedTableTop = cellsToFlick - int((margins.top() + spacing.height()) / cellHeight); + const int expectedTableLeft = int(cellsToFlick - int((margins.left() + spacing.width()) / cellWidth)); + const int expectedTableTop = int(cellsToFlick - int((margins.top() + spacing.height()) / cellHeight)); - QCOMPARE(loadedTable.left(), expectedTableLeft); - QCOMPARE(loadedTable.right(), expectedTableLeft + visualColumnCount); - QCOMPARE(loadedTable.top(), expectedTableTop); - QCOMPARE(loadedTable.bottom(), expectedTableTop + visualRowCount); + QCOMPARE(tableViewPrivate->leftColumn(), expectedTableLeft); + QCOMPARE(tableViewPrivate->rightColumn(), expectedTableLeft + visualColumnCount); + QCOMPARE(tableViewPrivate->topRow(), expectedTableTop); + QCOMPARE(tableViewPrivate->bottomRow(), expectedTableTop + visualRowCount); } } @@ -1252,10 +1303,10 @@ void tst_QQuickTableView::flickOvershoot() WAIT_UNTIL_POLISHED; - QCOMPARE(tableViewPrivate->loadedTable.left(), 0); - QCOMPARE(tableViewPrivate->loadedTable.right(), 0); - QCOMPARE(tableViewPrivate->loadedTable.top(), 0); - QCOMPARE(tableViewPrivate->loadedTable.bottom(), rowCount - 1); + QCOMPARE(tableViewPrivate->leftColumn(), 0); + QCOMPARE(tableViewPrivate->rightColumn(), 0); + QCOMPARE(tableViewPrivate->topRow(), 0); + QCOMPARE(tableViewPrivate->bottomRow(), rowCount - 1); // Flick table out of view right tableView->setContentX(tableWidth + outsideMargin); @@ -1264,10 +1315,10 @@ void tst_QQuickTableView::flickOvershoot() WAIT_UNTIL_POLISHED; - QCOMPARE(tableViewPrivate->loadedTable.left(), columnCount - 1); - QCOMPARE(tableViewPrivate->loadedTable.right(), columnCount - 1); - QCOMPARE(tableViewPrivate->loadedTable.top(), 0); - QCOMPARE(tableViewPrivate->loadedTable.bottom(), rowCount - 1); + QCOMPARE(tableViewPrivate->leftColumn(), columnCount - 1); + QCOMPARE(tableViewPrivate->rightColumn(), columnCount - 1); + QCOMPARE(tableViewPrivate->topRow(), 0); + QCOMPARE(tableViewPrivate->bottomRow(), rowCount - 1); // Flick table out of view on top tableView->setContentX(0); @@ -1276,10 +1327,10 @@ void tst_QQuickTableView::flickOvershoot() WAIT_UNTIL_POLISHED; - QCOMPARE(tableViewPrivate->loadedTable.left(), 0); - QCOMPARE(tableViewPrivate->loadedTable.right(), columnCount - 1); - QCOMPARE(tableViewPrivate->loadedTable.top(), 0); - QCOMPARE(tableViewPrivate->loadedTable.bottom(), 0); + QCOMPARE(tableViewPrivate->leftColumn(), 0); + QCOMPARE(tableViewPrivate->rightColumn(), columnCount - 1); + QCOMPARE(tableViewPrivate->topRow(), 0); + QCOMPARE(tableViewPrivate->bottomRow(), 0); // Flick table out of view at the bottom tableView->setContentX(0); @@ -1288,10 +1339,10 @@ void tst_QQuickTableView::flickOvershoot() WAIT_UNTIL_POLISHED; - QCOMPARE(tableViewPrivate->loadedTable.left(), 0); - QCOMPARE(tableViewPrivate->loadedTable.right(), columnCount - 1); - QCOMPARE(tableViewPrivate->loadedTable.top(), rowCount - 1); - QCOMPARE(tableViewPrivate->loadedTable.bottom(), rowCount - 1); + QCOMPARE(tableViewPrivate->leftColumn(), 0); + QCOMPARE(tableViewPrivate->rightColumn(), columnCount - 1); + QCOMPARE(tableViewPrivate->topRow(), rowCount - 1); + QCOMPARE(tableViewPrivate->bottomRow(), rowCount - 1); // Flick table out of view left and top at the same time tableView->setContentX(-tableView->width() - outsideMargin); @@ -1300,10 +1351,10 @@ void tst_QQuickTableView::flickOvershoot() WAIT_UNTIL_POLISHED; - QCOMPARE(tableViewPrivate->loadedTable.left(), 0); - QCOMPARE(tableViewPrivate->loadedTable.right(), 0); - QCOMPARE(tableViewPrivate->loadedTable.top(), 0); - QCOMPARE(tableViewPrivate->loadedTable.bottom(), 0); + QCOMPARE(tableViewPrivate->leftColumn(), 0); + QCOMPARE(tableViewPrivate->rightColumn(), 0); + QCOMPARE(tableViewPrivate->topRow(), 0); + QCOMPARE(tableViewPrivate->bottomRow(), 0); // Flick table back to origo tableView->setContentX(0); @@ -1312,10 +1363,10 @@ void tst_QQuickTableView::flickOvershoot() WAIT_UNTIL_POLISHED; - QCOMPARE(tableViewPrivate->loadedTable.left(), 0); - QCOMPARE(tableViewPrivate->loadedTable.right(), columnCount - 1); - QCOMPARE(tableViewPrivate->loadedTable.top(), 0); - QCOMPARE(tableViewPrivate->loadedTable.bottom(), rowCount - 1); + QCOMPARE(tableViewPrivate->leftColumn(), 0); + QCOMPARE(tableViewPrivate->rightColumn(), columnCount - 1); + QCOMPARE(tableViewPrivate->topRow(), 0); + QCOMPARE(tableViewPrivate->bottomRow(), rowCount - 1); // Flick table out of view right and bottom at the same time tableView->setContentX(tableWidth + outsideMargin); @@ -1324,10 +1375,10 @@ void tst_QQuickTableView::flickOvershoot() WAIT_UNTIL_POLISHED; - QCOMPARE(tableViewPrivate->loadedTable.left(), columnCount - 1); - QCOMPARE(tableViewPrivate->loadedTable.right(), columnCount - 1); - QCOMPARE(tableViewPrivate->loadedTable.top(), rowCount - 1); - QCOMPARE(tableViewPrivate->loadedTable.bottom(), rowCount - 1); + QCOMPARE(tableViewPrivate->leftColumn(), columnCount - 1); + QCOMPARE(tableViewPrivate->rightColumn(), columnCount - 1); + QCOMPARE(tableViewPrivate->topRow(), rowCount - 1); + QCOMPARE(tableViewPrivate->bottomRow(), rowCount - 1); // Flick table back to origo tableView->setContentX(0); @@ -1336,10 +1387,10 @@ void tst_QQuickTableView::flickOvershoot() WAIT_UNTIL_POLISHED; - QCOMPARE(tableViewPrivate->loadedTable.left(), 0); - QCOMPARE(tableViewPrivate->loadedTable.right(), columnCount - 1); - QCOMPARE(tableViewPrivate->loadedTable.top(), 0); - QCOMPARE(tableViewPrivate->loadedTable.bottom(), rowCount - 1); + QCOMPARE(tableViewPrivate->leftColumn(), 0); + QCOMPARE(tableViewPrivate->rightColumn(), columnCount - 1); + QCOMPARE(tableViewPrivate->topRow(), 0); + QCOMPARE(tableViewPrivate->bottomRow(), rowCount - 1); } void tst_QQuickTableView::checkRowColumnCount() @@ -1353,6 +1404,8 @@ void tst_QQuickTableView::checkRowColumnCount() const qreal delegateWidth = 100; const qreal delegateHeight = 50; auto model = TestModelAsVariant(100, 100); + const auto &loadedRows = tableViewPrivate->loadedRows; + const auto &loadedColumns = tableViewPrivate->loadedColumns; tableView->setModel(model); @@ -1360,17 +1413,15 @@ void tst_QQuickTableView::checkRowColumnCount() // We expect that the number of created items after start-up should match //the size of the visible table, pluss one extra preloaded row and column. - const QSize visibleTableSize = tableViewPrivate->loadedTable.size(); const int qmlCountAfterInit = view->rootObject()->property(maxDelegateCountProp).toInt(); - const int expectedCount = (visibleTableSize.width() + 1) * (visibleTableSize.height() + 1); + const int expectedCount = (loadedColumns.count() + 1) * (loadedRows.count() + 1); QCOMPARE(qmlCountAfterInit, expectedCount); // This test will keep track of the maximum number of delegate items TableView // had to show at any point while flicking (in countingtableview.qml). Because // of the geometries chosen for TableView and the delegate, only complete columns // will be shown at start-up. - const QRect loadedTable = tableViewPrivate->loadedTable; - QVERIFY(loadedTable.height() > loadedTable.width()); + QVERIFY(loadedRows.count() > loadedColumns.count()); QCOMPARE(tableViewPrivate->loadedTableOuterRect.width(), tableView->width()); QCOMPARE(tableViewPrivate->loadedTableOuterRect.height(), tableView->height()); @@ -1619,8 +1670,8 @@ void tst_QQuickTableView::checkIfDelegatesAreReused() fxItem->item->setProperty("reusedCount", 0); } - const int visibleColumnCount = tableViewPrivate->loadedTable.width(); - const int visibleRowCount = tableViewPrivate->loadedTable.height(); + const int visibleColumnCount = tableViewPrivate->loadedColumns.count(); + const int visibleRowCount = tableViewPrivate->loadedRows.count(); const int delegateCountAfterInit = view->rootObject()->property(kDelegatesCreatedCountProp).toInt(); for (int column = 1; column <= (visibleColumnCount * pageFlickCount); ++column) { @@ -1687,7 +1738,7 @@ void tst_QQuickTableView::checkIfDelegatesAreReusedAsymmetricTableSize() // Since we have flicked half a delegate to the left, the number of visible // columns is now one more than the column count were when we started the test. - const int visibleColumnCount = tableViewPrivate->loadedTable.width(); + const int visibleColumnCount = tableViewPrivate->loadedColumns.count(); QCOMPARE(visibleColumnCount, columnCount + 1); // We expect no items to have been pooled so far @@ -1887,7 +1938,7 @@ void tst_QQuickTableView::checkChangingModelFromDelegate() // We now expect two rows in the table, one more than initially QCOMPARE(tableViewPrivate->tableSize.height(), 2); - QCOMPARE(tableViewPrivate->loadedTable.height(), 2); + QCOMPARE(tableViewPrivate->loadedRows.count(), 2); // And since the QML code tried to add another row as well, we // expect rebuildScheduled to be true, and a polish event to be pending. @@ -1897,7 +1948,7 @@ void tst_QQuickTableView::checkChangingModelFromDelegate() // After handling the polish event, we expect also the third row to now be added QCOMPARE(tableViewPrivate->tableSize.height(), 3); - QCOMPARE(tableViewPrivate->loadedTable.height(), 3); + QCOMPARE(tableViewPrivate->loadedRows.count(), 3); } void tst_QQuickTableView::checkRebuildViewportOnly() @@ -1982,8 +2033,8 @@ void tst_QQuickTableView::checkTableviewInsideAsyncLoader() const qreal delegateHeight = 50; int expectedColumns = qCeil(tableView->width() / delegateWidth); int expectedRows = qCeil(tableView->height() / delegateHeight); - QCOMPARE(tableViewPrivate->loadedTable.width(), expectedColumns); - QCOMPARE(tableViewPrivate->loadedTable.height(), expectedRows); + QCOMPARE(tableViewPrivate->loadedColumns.count(), expectedColumns); + QCOMPARE(tableViewPrivate->loadedRows.count(), expectedRows); // Check that the loader was still in a loading state while TableView was creating // delegate items. If we delayed creating delegate items until we got the first @@ -2004,6 +2055,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)); +} + void tst_QQuickTableView::checkThatRevisionedPropertiesCannotBeUsedInOldImports() { // Check that if you use a QQmlAdaptorModel together with a Repeater, the diff --git a/tests/auto/quick/qquicktext/qquicktext.pro b/tests/auto/quick/qquicktext/qquicktext.pro index f76e8c95b2..fdea9dcddd 100644 --- a/tests/auto/quick/qquicktext/qquicktext.pro +++ b/tests/auto/quick/qquicktext/qquicktext.pro @@ -11,4 +11,4 @@ include (../../shared/util.pri) TESTDATA = data/* -QT += core-private gui-private qml-private quick-private network testlib +QT += core-private gui-private qml-private quick-private network testlib qmltest diff --git a/tests/auto/quick/qquicktext/tst_qquicktext.cpp b/tests/auto/quick/qquicktext/tst_qquicktext.cpp index a9c35e0cc4..fd0ba0f49b 100644 --- a/tests/auto/quick/qquicktext/tst_qquicktext.cpp +++ b/tests/auto/quick/qquicktext/tst_qquicktext.cpp @@ -32,6 +32,7 @@ #include <QtQml/qqmlcomponent.h> #include <QtQuick/private/qquicktext_p.h> #include <QtQuick/private/qquickmousearea_p.h> +#include <QtQuickTest/QtQuickTest> #include <private/qquicktext_p_p.h> #include <private/qquicktextdocument_p.h> #include <private/qquickvaluetypes_p.h> @@ -3142,7 +3143,7 @@ void tst_qquicktext::fontSizeMode() QVERIFY(myText != nullptr); myText->setText(text); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); qreal originalWidth = myText->contentWidth(); qreal originalHeight = myText->contentHeight(); @@ -3156,7 +3157,7 @@ void tst_qquicktext::fontSizeMode() myText->setFont(font); myText->setFontSizeMode(QQuickText::HorizontalFit); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); // Font size reduced to fit within the width of the item. qreal horizontalFitWidth = myText->contentWidth(); qreal horizontalFitHeight = myText->contentHeight(); @@ -3165,28 +3166,28 @@ void tst_qquicktext::fontSizeMode() // Elide won't affect the size with HorizontalFit. myText->setElideMode(QQuickText::ElideRight); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QVERIFY(!myText->truncated()); QCOMPARE(myText->contentWidth(), horizontalFitWidth); QCOMPARE(myText->contentHeight(), horizontalFitHeight); myText->setElideMode(QQuickText::ElideLeft); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QVERIFY(!myText->truncated()); QCOMPARE(myText->contentWidth(), horizontalFitWidth); QCOMPARE(myText->contentHeight(), horizontalFitHeight); myText->setElideMode(QQuickText::ElideMiddle); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QVERIFY(!myText->truncated()); QCOMPARE(myText->contentWidth(), horizontalFitWidth); QCOMPARE(myText->contentHeight(), horizontalFitHeight); myText->setElideMode(QQuickText::ElideNone); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); myText->setFontSizeMode(QQuickText::VerticalFit); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); // Font size increased to fill the height of the item. qreal verticalFitHeight = myText->contentHeight(); QVERIFY(myText->contentWidth() > myText->width()); @@ -3195,57 +3196,57 @@ void tst_qquicktext::fontSizeMode() // Elide won't affect the height of a single line with VerticalFit but will crop the width. myText->setElideMode(QQuickText::ElideRight); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QVERIFY(myText->truncated()); QVERIFY(myText->contentWidth() <= myText->width() + 2); QCOMPARE(myText->contentHeight(), verticalFitHeight); myText->setElideMode(QQuickText::ElideLeft); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QVERIFY(myText->truncated()); QVERIFY(myText->contentWidth() <= myText->width() + 2); QCOMPARE(myText->contentHeight(), verticalFitHeight); myText->setElideMode(QQuickText::ElideMiddle); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QVERIFY(myText->truncated()); QVERIFY(myText->contentWidth() <= myText->width() + 2); QCOMPARE(myText->contentHeight(), verticalFitHeight); myText->setElideMode(QQuickText::ElideNone); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); myText->setFontSizeMode(QQuickText::Fit); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); // Should be the same as HorizontalFit with no wrapping. QCOMPARE(myText->contentWidth(), horizontalFitWidth); QCOMPARE(myText->contentHeight(), horizontalFitHeight); // Elide won't affect the size with Fit. myText->setElideMode(QQuickText::ElideRight); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QVERIFY(!myText->truncated()); QCOMPARE(myText->contentWidth(), horizontalFitWidth); QCOMPARE(myText->contentHeight(), horizontalFitHeight); myText->setElideMode(QQuickText::ElideLeft); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QVERIFY(!myText->truncated()); QCOMPARE(myText->contentWidth(), horizontalFitWidth); QCOMPARE(myText->contentHeight(), horizontalFitHeight); myText->setElideMode(QQuickText::ElideMiddle); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QVERIFY(!myText->truncated()); QCOMPARE(myText->contentWidth(), horizontalFitWidth); QCOMPARE(myText->contentHeight(), horizontalFitHeight); myText->setElideMode(QQuickText::ElideNone); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); myText->setFontSizeMode(QQuickText::FixedSize); myText->setWrapMode(QQuickText::Wrap); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); originalWidth = myText->contentWidth(); originalHeight = myText->contentHeight(); @@ -3255,7 +3256,7 @@ void tst_qquicktext::fontSizeMode() QVERIFY(originalHeight > myText->height()); myText->setFontSizeMode(QQuickText::HorizontalFit); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); // HorizontalFit should reduce the font size to minimize wrapping, which brings it back to the // same size as without text wrapping. QCOMPARE(myText->contentWidth(), horizontalFitWidth); @@ -3263,16 +3264,16 @@ void tst_qquicktext::fontSizeMode() // Elide won't affect the size with HorizontalFit. myText->setElideMode(QQuickText::ElideRight); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QVERIFY(!myText->truncated()); QCOMPARE(myText->contentWidth(), horizontalFitWidth); QCOMPARE(myText->contentHeight(), horizontalFitHeight); myText->setElideMode(QQuickText::ElideNone); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); myText->setFontSizeMode(QQuickText::VerticalFit); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); // VerticalFit should reduce the size to the wrapped text within the vertical height. verticalFitHeight = myText->contentHeight(); qreal verticalFitWidth = myText->contentWidth(); @@ -3282,40 +3283,40 @@ void tst_qquicktext::fontSizeMode() // Elide won't affect the height or width of a wrapped text with VerticalFit. myText->setElideMode(QQuickText::ElideRight); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QVERIFY(!myText->truncated()); QCOMPARE(myText->contentWidth(), verticalFitWidth); QCOMPARE(myText->contentHeight(), verticalFitHeight); myText->setElideMode(QQuickText::ElideNone); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); myText->setFontSizeMode(QQuickText::Fit); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); // Should be the same as VerticalFit with wrapping. QCOMPARE(myText->contentWidth(), verticalFitWidth); QCOMPARE(myText->contentHeight(), verticalFitHeight); // Elide won't affect the size with Fit. myText->setElideMode(QQuickText::ElideRight); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QVERIFY(!myText->truncated()); QCOMPARE(myText->contentWidth(), verticalFitWidth); QCOMPARE(myText->contentHeight(), verticalFitHeight); myText->setElideMode(QQuickText::ElideNone); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); myText->setFontSizeMode(QQuickText::FixedSize); myText->setMaximumLineCount(2); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); // The original text wrapped should exceed the height of the item. QVERIFY(originalWidth <= myText->width() + 2); QVERIFY(originalHeight > myText->height()); myText->setFontSizeMode(QQuickText::HorizontalFit); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); // HorizontalFit should reduce the font size to minimize wrapping, which brings it back to the // same size as without text wrapping. QCOMPARE(myText->contentWidth(), horizontalFitWidth); @@ -3323,16 +3324,16 @@ void tst_qquicktext::fontSizeMode() // Elide won't affect the size with HorizontalFit. myText->setElideMode(QQuickText::ElideRight); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QVERIFY(!myText->truncated()); QCOMPARE(myText->contentWidth(), horizontalFitWidth); QCOMPARE(myText->contentHeight(), horizontalFitHeight); myText->setElideMode(QQuickText::ElideNone); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); myText->setFontSizeMode(QQuickText::VerticalFit); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); // VerticalFit should reduce the size to the wrapped text within the vertical height. verticalFitHeight = myText->contentHeight(); verticalFitWidth = myText->contentWidth(); @@ -3342,29 +3343,29 @@ void tst_qquicktext::fontSizeMode() // Elide won't affect the height or width of a wrapped text with VerticalFit. myText->setElideMode(QQuickText::ElideRight); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QVERIFY(!myText->truncated()); QCOMPARE(myText->contentWidth(), verticalFitWidth); QCOMPARE(myText->contentHeight(), verticalFitHeight); myText->setElideMode(QQuickText::ElideNone); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); myText->setFontSizeMode(QQuickText::Fit); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); // Should be the same as VerticalFit with wrapping. QCOMPARE(myText->contentWidth(), verticalFitWidth); QCOMPARE(myText->contentHeight(), verticalFitHeight); // Elide won't affect the size with Fit. myText->setElideMode(QQuickText::ElideRight); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QVERIFY(!myText->truncated()); QCOMPARE(myText->contentWidth(), verticalFitWidth); QCOMPARE(myText->contentHeight(), verticalFitHeight); myText->setElideMode(QQuickText::ElideNone); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); } void tst_qquicktext::fontSizeModeMultiline_data() @@ -3385,7 +3386,7 @@ void tst_qquicktext::fontSizeModeMultiline() QVERIFY(myText != nullptr); myText->setText(text); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); qreal originalWidth = myText->contentWidth(); qreal originalHeight = myText->contentHeight(); @@ -3400,7 +3401,7 @@ void tst_qquicktext::fontSizeModeMultiline() myText->setFont(font); myText->setFontSizeMode(QQuickText::HorizontalFit); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); // Font size reduced to fit within the width of the item. QCOMPARE(myText->lineCount(), 2); qreal horizontalFitWidth = myText->contentWidth(); @@ -3410,7 +3411,7 @@ void tst_qquicktext::fontSizeModeMultiline() // Right eliding will remove the last line myText->setElideMode(QQuickText::ElideRight); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QVERIFY(myText->truncated()); QCOMPARE(myText->lineCount(), 1); QVERIFY(myText->contentWidth() <= myText->width() + 2); @@ -3418,22 +3419,22 @@ void tst_qquicktext::fontSizeModeMultiline() // Left or middle eliding wont have any effect. myText->setElideMode(QQuickText::ElideLeft); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QVERIFY(!myText->truncated()); QCOMPARE(myText->contentWidth(), horizontalFitWidth); QCOMPARE(myText->contentHeight(), horizontalFitHeight); myText->setElideMode(QQuickText::ElideMiddle); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QVERIFY(!myText->truncated()); QCOMPARE(myText->contentWidth(), horizontalFitWidth); QCOMPARE(myText->contentHeight(), horizontalFitHeight); myText->setElideMode(QQuickText::ElideNone); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); myText->setFontSizeMode(QQuickText::VerticalFit); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); // Font size reduced to fit within the height of the item. qreal verticalFitWidth = myText->contentWidth(); qreal verticalFitHeight = myText->contentHeight(); @@ -3442,58 +3443,58 @@ void tst_qquicktext::fontSizeModeMultiline() // Elide will have no effect. myText->setElideMode(QQuickText::ElideRight); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QVERIFY(!myText->truncated()); QVERIFY(myText->contentWidth() <= myText->width() + 2); QCOMPARE(myText->contentWidth(), verticalFitWidth); QCOMPARE(myText->contentHeight(), verticalFitHeight); myText->setElideMode(QQuickText::ElideLeft); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QVERIFY(!myText->truncated()); QCOMPARE(myText->contentWidth(), verticalFitWidth); QCOMPARE(myText->contentHeight(), verticalFitHeight); myText->setElideMode(QQuickText::ElideMiddle); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QVERIFY(!myText->truncated()); QCOMPARE(myText->contentWidth(), verticalFitWidth); QCOMPARE(myText->contentHeight(), verticalFitHeight); myText->setElideMode(QQuickText::ElideNone); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); myText->setFontSizeMode(QQuickText::Fit); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); // Should be the same as VerticalFit with no wrapping. QCOMPARE(myText->contentWidth(), verticalFitWidth); QCOMPARE(myText->contentHeight(), verticalFitHeight); // Elide won't affect the size with Fit. myText->setElideMode(QQuickText::ElideRight); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QVERIFY(!myText->truncated()); QCOMPARE(myText->contentWidth(), verticalFitWidth); QCOMPARE(myText->contentHeight(), verticalFitHeight); myText->setElideMode(QQuickText::ElideLeft); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QVERIFY(!myText->truncated()); QCOMPARE(myText->contentWidth(), verticalFitWidth); QCOMPARE(myText->contentHeight(), verticalFitHeight); myText->setElideMode(QQuickText::ElideMiddle); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QVERIFY(!myText->truncated()); QCOMPARE(myText->contentWidth(), verticalFitWidth); QCOMPARE(myText->contentHeight(), verticalFitHeight); myText->setElideMode(QQuickText::ElideNone); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); myText->setFontSizeMode(QQuickText::FixedSize); myText->setWrapMode(QQuickText::Wrap); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); originalWidth = myText->contentWidth(); originalHeight = myText->contentHeight(); @@ -3503,7 +3504,7 @@ void tst_qquicktext::fontSizeModeMultiline() QVERIFY(originalHeight > myText->height()); myText->setFontSizeMode(QQuickText::HorizontalFit); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); // HorizontalFit should reduce the font size to minimize wrapping, which brings it back to the // same size as without text wrapping. QCOMPARE(myText->contentWidth(), horizontalFitWidth); @@ -3511,16 +3512,16 @@ void tst_qquicktext::fontSizeModeMultiline() // Text will be elided vertically with HorizontalFit myText->setElideMode(QQuickText::ElideRight); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QVERIFY(myText->truncated()); QVERIFY(myText->contentWidth() <= myText->width() + 2); QVERIFY(myText->contentHeight() <= myText->height() + 2); myText->setElideMode(QQuickText::ElideNone); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); myText->setFontSizeMode(QQuickText::VerticalFit); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); // VerticalFit should reduce the size to the wrapped text within the vertical height. verticalFitHeight = myText->contentHeight(); verticalFitWidth = myText->contentWidth(); @@ -3530,40 +3531,40 @@ void tst_qquicktext::fontSizeModeMultiline() // Elide won't affect the height or width of a wrapped text with VerticalFit. myText->setElideMode(QQuickText::ElideRight); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QVERIFY(!myText->truncated()); QCOMPARE(myText->contentWidth(), verticalFitWidth); QCOMPARE(myText->contentHeight(), verticalFitHeight); myText->setElideMode(QQuickText::ElideNone); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); myText->setFontSizeMode(QQuickText::Fit); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); // Should be the same as VerticalFit with wrapping. QCOMPARE(myText->contentWidth(), verticalFitWidth); QCOMPARE(myText->contentHeight(), verticalFitHeight); // Elide won't affect the size with Fit. myText->setElideMode(QQuickText::ElideRight); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QVERIFY(!myText->truncated()); QCOMPARE(myText->contentWidth(), verticalFitWidth); QCOMPARE(myText->contentHeight(), verticalFitHeight); myText->setElideMode(QQuickText::ElideNone); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); myText->setFontSizeMode(QQuickText::FixedSize); myText->setMaximumLineCount(2); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); // The original text wrapped should exceed the height of the item. QVERIFY(originalWidth <= myText->width() + 2); QVERIFY(originalHeight > myText->height()); myText->setFontSizeMode(QQuickText::HorizontalFit); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); // HorizontalFit should reduce the font size to minimize wrapping, which brings it back to the // same size as without text wrapping. QCOMPARE(myText->contentWidth(), horizontalFitWidth); @@ -3571,16 +3572,16 @@ void tst_qquicktext::fontSizeModeMultiline() // Elide won't affect the size with HorizontalFit. myText->setElideMode(QQuickText::ElideRight); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QVERIFY(myText->truncated()); QVERIFY(myText->contentWidth() <= myText->width() + 2); QVERIFY(myText->contentHeight() <= myText->height() + 2); myText->setElideMode(QQuickText::ElideNone); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); myText->setFontSizeMode(QQuickText::VerticalFit); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); // VerticalFit should reduce the size to the wrapped text within the vertical height. verticalFitHeight = myText->contentHeight(); verticalFitWidth = myText->contentWidth(); @@ -3590,29 +3591,29 @@ void tst_qquicktext::fontSizeModeMultiline() // Elide won't affect the height or width of a wrapped text with VerticalFit. myText->setElideMode(QQuickText::ElideRight); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QVERIFY(!myText->truncated()); QCOMPARE(myText->contentWidth(), verticalFitWidth); QCOMPARE(myText->contentHeight(), verticalFitHeight); myText->setElideMode(QQuickText::ElideNone); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); myText->setFontSizeMode(QQuickText::Fit); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); // Should be the same as VerticalFit with wrapping. QCOMPARE(myText->contentWidth(), verticalFitWidth); QCOMPARE(myText->contentHeight(), verticalFitHeight); // Elide won't affect the size with Fit. myText->setElideMode(QQuickText::ElideRight); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QVERIFY(!myText->truncated()); QCOMPARE(myText->contentWidth(), verticalFitWidth); QCOMPARE(myText->contentHeight(), verticalFitHeight); myText->setElideMode(QQuickText::ElideNone); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); } void tst_qquicktext::multilengthStrings_data() @@ -3637,17 +3638,17 @@ void tst_qquicktext::multilengthStrings() const QString shortText = "fox jumped dog"; myText->setText(longText); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); const qreal longWidth = myText->contentWidth(); const qreal longHeight = myText->contentHeight(); myText->setText(mediumText); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); const qreal mediumWidth = myText->contentWidth(); const qreal mediumHeight = myText->contentHeight(); myText->setText(shortText); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); const qreal shortWidth = myText->contentWidth(); const qreal shortHeight = myText->contentHeight(); @@ -3655,21 +3656,21 @@ void tst_qquicktext::multilengthStrings() myText->setText(longText + QLatin1Char('\x9c') + mediumText + QLatin1Char('\x9c') + shortText); myText->setSize(QSizeF(longWidth, longHeight)); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QCOMPARE(myText->contentWidth(), longWidth); QCOMPARE(myText->contentHeight(), longHeight); QCOMPARE(myText->truncated(), false); myText->setSize(QSizeF(mediumWidth, mediumHeight)); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QCOMPARE(myText->contentWidth(), mediumWidth); QCOMPARE(myText->contentHeight(), mediumHeight); QCOMPARE(myText->truncated(), true); myText->setSize(QSizeF(shortWidth, shortHeight)); - QTRY_COMPARE(QQuickItemPrivate::get(myText)->polishScheduled, false); + QVERIFY(QQuickTest::qWaitForItemPolished(myText)); QCOMPARE(myText->contentWidth(), shortWidth); QCOMPARE(myText->contentHeight(), shortHeight); diff --git a/tests/auto/quick/qquicktextedit/data/keys_shortcutoverride.qml b/tests/auto/quick/qquicktextedit/data/keys_shortcutoverride.qml new file mode 100644 index 0000000000..24bd434830 --- /dev/null +++ b/tests/auto/quick/qquicktextedit/data/keys_shortcutoverride.qml @@ -0,0 +1,34 @@ +import QtQuick 2.10 + +Item { + width: 320 + height: 200 + property string who : "nobody" + + Shortcut { + sequence: "Esc" + onActivated: who = "Shortcut" + } + + TextEdit { + id: txt + x: 100 + text: "enter text" + Keys.onShortcutOverride: { + who = "TextEdit" + event.accepted = (event.key === Qt.Key_Escape) + } + } + + Rectangle { + objectName: "rectangle" + width: 90 + height: width + focus: true + color: focus ? "red" : "gray" + Keys.onShortcutOverride: { + who = "Rectangle" + event.accepted = (event.key === Qt.Key_Escape) + } + } +} diff --git a/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp b/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp index da15ca6b48..ce2a8eb257 100644 --- a/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp +++ b/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp @@ -36,6 +36,7 @@ #include <QtQml/qqmlexpression.h> #include <QtQml/qqmlcomponent.h> #include <QtGui/qguiapplication.h> +#include <private/qquickrectangle_p.h> #include <private/qquicktextedit_p.h> #include <private/qquicktextedit_p_p.h> #include <private/qquicktext_p.h> @@ -205,6 +206,7 @@ private slots: void padding(); void QTBUG_51115_readOnlyResetsSelection(); + void keys_shortcutoverride(); private: void simulateKeys(QWindow *window, const QList<Key> &keys); @@ -1260,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() @@ -5671,6 +5701,36 @@ void tst_qquicktextedit::QTBUG_51115_readOnlyResetsSelection() QCOMPARE(obj->selectedText(), QString()); } +void tst_qquicktextedit::keys_shortcutoverride() +{ + // Tests that QML TextEdit receives Keys.onShortcutOverride (QTBUG-68711) + QQuickView view; + view.setSource(testFileUrl("keys_shortcutoverride.qml")); + view.show(); + view.requestActivate(); + QVERIFY(QTest::qWaitForWindowActive(&view)); + QObject *root = view.rootObject(); + QVERIFY(root); + + QQuickTextEdit *textEdit = root->findChild<QQuickTextEdit*>(); + QVERIFY(textEdit); + QQuickRectangle *rectangle = root->findChild<QQuickRectangle*>(QLatin1String("rectangle")); + QVERIFY(rectangle); + + // Precondition: check if its not already changed + QCOMPARE(root->property("who").value<QString>(), QLatin1String("nobody")); + + // send Key_Escape to the Rectangle + QVERIFY(rectangle->hasActiveFocus()); + QTest::keyPress(&view, Qt::Key_Escape); + QCOMPARE(root->property("who").value<QString>(), QLatin1String("Rectangle")); + + // send Key_Escape to TextEdit + textEdit->setFocus(true); + QTest::keyPress(&view, Qt::Key_Escape); + QCOMPARE(root->property("who").value<QString>(), QLatin1String("TextEdit")); +} + QTEST_MAIN(tst_qquicktextedit) #include "tst_qquicktextedit.moc" diff --git a/tests/auto/quick/shared/viewtestutil.cpp b/tests/auto/quick/shared/viewtestutil.cpp index 12d54c4bbe..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() { @@ -478,3 +479,5 @@ namespace QQuickTest { return true; } } + +QT_END_NAMESPACE diff --git a/tests/auto/quick/shared/viewtestutil.h b/tests/auto/quick/shared/viewtestutil.h index 3b57a29777..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(); @@ -189,6 +191,8 @@ 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/auto/quick/shared/visualtestutil.h b/tests/auto/quick/shared/visualtestutil.h index 1cdbaf838b..e623e3e225 100644 --- a/tests/auto/quick/shared/visualtestutil.h +++ b/tests/auto/quick/shared/visualtestutil.h @@ -100,7 +100,4 @@ namespace QQuickVisualTestUtil bool compareImages(const QImage &ia, const QImage &ib, QString *errorMessage); } -#define QQUICK_VERIFY_POLISH(item) \ - QTRY_COMPARE(QQuickItemPrivate::get(item)->polishScheduled, false) - #endif // QQUICKVISUALTESTUTIL_H diff --git a/tests/auto/qml/debugger/shared/qqmlinspectorclient.h b/tests/auto/quicktest/polish-qml/data/tst_polish.qml index bfb489c8f7..d2d5972d43 100644 --- a/tests/auto/qml/debugger/shared/qqmlinspectorclient.h +++ b/tests/auto/quicktest/polish-qml/data/tst_polish.qml @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2018 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -25,35 +25,36 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ -#ifndef QQMLINSPECTORCLIENT_H -#define QQMLINSPECTORCLIENT_H -#include <private/qqmldebugclient_p.h> +import QtQuick 2.13 +import QtTest 1.13 -class QQmlInspectorClient : public QQmlDebugClient -{ - Q_OBJECT +import Test 1.0 -public: - QQmlInspectorClient(QQmlDebugConnection *connection); +TestCase { + id: testCase + name: "polish-qml" + when: windowShown - int setInspectToolEnabled(bool enabled); - int setShowAppOnTop(bool showOnTop); - int setAnimationSpeed(qreal speed); - int select(const QList<int> &objectIds); - int createObject(const QString &qml, int parentId, const QStringList &imports, - const QString &filename); - int moveObject(int childId, int newParentId); - int destroyObject(int objectId); + Component { + id: customItemComponent + CustomItem {} + } -signals: - void responseReceived(int requestId, bool result); + function test_polish() + { + var item = createTemporaryObject(customItemComponent, testCase) + verify(item) -protected: - void messageReceived(const QByteArray &message); + item.polishMe() + verify(isPolishScheduled(item)) + verify(item.isPolishScheduled()) -private: - int m_lastRequestId; -}; + verify(waitForItemPolished(item)) + verify(item.wasUpdatePolishCalled()) -#endif // QQMLINSPECTORCLIENT_H + // TODO: test failure conditions when https://bugreports.qt.io/browse/QTBUG-72351 is fixed +// expectFail("", "Not a valid item") +// isPolishScheduled(null) + } +} diff --git a/tests/auto/quicktest/polish-qml/polish-qml.pro b/tests/auto/quicktest/polish-qml/polish-qml.pro new file mode 100644 index 0000000000..15b913ffe1 --- /dev/null +++ b/tests/auto/quicktest/polish-qml/polish-qml.pro @@ -0,0 +1,12 @@ +CONFIG += qmltestcase +macos:CONFIG -= app_bundle +TARGET = tst_polish-qml + +QT += testlib quick quick-private + +include (../../shared/util.pri) + +SOURCES += tst_polish-qml.cpp + +TESTDATA += \ + $$PWD/data/*.qml diff --git a/tests/auto/quicktest/polish-qml/tst_polish-qml.cpp b/tests/auto/quicktest/polish-qml/tst_polish-qml.cpp new file mode 100644 index 0000000000..e525a8a5af --- /dev/null +++ b/tests/auto/quicktest/polish-qml/tst_polish-qml.cpp @@ -0,0 +1,84 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite 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$ +** +****************************************************************************/ + +#include <QtTest/qtest.h> +#include <QtQml/qqmlengine.h> +#include <QtQuick/qquickitem.h> +#include <QtQuick/private/qquickitem_p.h> +#include <QtQuick/qquickview.h> +#include <QtQuickTest/quicktest.h> + +#include "../../shared/util.h" + +class CustomItem : public QQuickItem +{ + Q_OBJECT + +public: + CustomItem() {} + + Q_INVOKABLE void polishMe() { + polish(); + } + + Q_INVOKABLE bool isPolishScheduled() const + { + return QQuickItemPrivate::get(this)->polishScheduled; + } + + Q_INVOKABLE bool wasUpdatePolishCalled() const + { + return updatePolishCalled; + } + + void updatePolish() override + { + updatePolishCalled = true; + } + +private: + bool updatePolishCalled = false; +}; + +class TestSetup : public QObject +{ + Q_OBJECT + +public: + TestSetup() {} + +public slots: + void applicationAvailable() + { + qmlRegisterType<CustomItem>("Test", 1, 0, "CustomItem"); + } +}; + +QUICK_TEST_MAIN_WITH_SETUP(polish-qml, TestSetup) + +#include "tst_polish-qml.moc" diff --git a/tests/auto/quicktest/polish/data/polish.qml b/tests/auto/quicktest/polish/data/polish.qml new file mode 100644 index 0000000000..0ab3afda2e --- /dev/null +++ b/tests/auto/quicktest/polish/data/polish.qml @@ -0,0 +1,32 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite 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 2.0 +import Test 1.0 + +CustomItem {} diff --git a/tests/auto/quicktest/polish/polish.pro b/tests/auto/quicktest/polish/polish.pro new file mode 100644 index 0000000000..0dfb4bdf5e --- /dev/null +++ b/tests/auto/quicktest/polish/polish.pro @@ -0,0 +1,12 @@ +CONFIG += qmltestcase +macos:CONFIG -= app_bundle +TARGET = tst_polish + +QT += testlib quick quick-private + +include (../../shared/util.pri) + +SOURCES += tst_polish.cpp + +TESTDATA += \ + $$PWD/data/*.qml diff --git a/tests/auto/quicktest/polish/tst_polish.cpp b/tests/auto/quicktest/polish/tst_polish.cpp new file mode 100644 index 0000000000..3b96002cd2 --- /dev/null +++ b/tests/auto/quicktest/polish/tst_polish.cpp @@ -0,0 +1,88 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite 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$ +** +****************************************************************************/ + +#include <QtTest/qtest.h> +#include <QtQml/qqmlengine.h> +#include <QtQml/qqmlcontext.h> +#include <QtQuick/qquickitem.h> +#include <QQuickView> +#include <QtQuickTest/quicktest.h> + +#include "../../shared/util.h" + +class CustomItem : public QQuickItem +{ + Q_OBJECT + +public: + CustomItem() {} + + void updatePolish() override + { + updatePolishCalled = true; + } + + bool updatePolishCalled = false; +}; + +class tst_Polish : public QQmlDataTest +{ + Q_OBJECT + +public: + tst_Polish(); + +private slots: + void testPolish(); +}; + +tst_Polish::tst_Polish() +{ + qmlRegisterType<CustomItem>("Test", 1, 0, "CustomItem"); +} + +void tst_Polish::testPolish() +{ + QQuickView view; + view.setSource(testFileUrl("polish.qml")); + view.show(); + QVERIFY(QTest::qWaitForWindowExposed(&view)); + + CustomItem *item = qobject_cast<CustomItem*>(view.rootObject()); + QVERIFY(item); + + item->polish(); + QVERIFY(QQuickTest::qIsPolishScheduled(item)); + QVERIFY(!item->updatePolishCalled); + QVERIFY(QQuickTest::qWaitForItemPolished(item)); + QVERIFY(item->updatePolishCalled); +} + +QTEST_MAIN(tst_Polish) + +#include "tst_polish.moc" diff --git a/tests/auto/quicktest/quicktest.pro b/tests/auto/quicktest/quicktest.pro index 0e3f257e33..6d09f76c1d 100644 --- a/tests/auto/quicktest/quicktest.pro +++ b/tests/auto/quicktest/quicktest.pro @@ -1,5 +1,6 @@ TEMPLATE = subdirs SUBDIRS = \ + polish \ signalspy \ quicktestmainwithsetup \ testfiltering diff --git a/tests/manual/scenegraph_lancelot/data/text/text_wrap_elide_maxlines.qml b/tests/manual/scenegraph_lancelot/data/text/text_wrap_elide_maxlines.qml new file mode 100644 index 0000000000..927f2b3148 --- /dev/null +++ b/tests/manual/scenegraph_lancelot/data/text/text_wrap_elide_maxlines.qml @@ -0,0 +1,133 @@ +import QtQuick 2.0 + +//test wrapping and elision when maximumLineCount is set + +Item { + width: 320 + height: 480 + Rectangle { + id: text_area + color: "light yellow" + x: 50 + y: 0 + height: parent.height + width: 150 + } + Text { + id: text_0000 + wrapMode: Text.WrapAnywhere + text: "The quick brown fox jumps over the lazy dog." + x: text_area.x + y: text_area.y + width: text_area.width + maximumLineCount: 2 + elide: Text.ElideRight + color: "red" + font.family: "Arial" + font.pixelSize: 22 + } + Text { + id: text_0001 + wrapMode: Text.Wrap + text: text_0000.text + anchors.top: text_0000.bottom + anchors.left: text_0000.left + width: text_0000.width + maximumLineCount: text_0000.maximumLineCount + elide: Text.ElideRight + color: "blue" + font.family: text_0000.font.family + font.pixelSize: text_0000.font.pixelSize + } + Text { + id: text_0002 + wrapMode: Text.WordWrap + text: text_0000.text + anchors.top: text_0001.bottom + anchors.left: text_0000.left + width: text_0000.width + maximumLineCount: text_0000.maximumLineCount + elide: Text.ElideRight + color: "green" + font.family: text_0000.font.family + font.pixelSize: text_0000.font.pixelSize + } + Text { + id: text_0003 + wrapMode: Text.WrapAnywhere + text: "ABCDEFGHIJKL 1234567890123" + anchors.top: text_0002.bottom + anchors.left: text_0000.left + width: 150 + maximumLineCount: 2 + elide: Text.ElideRight + color: "red" + font.family: text_0000.font.family + font.pixelSize: text_0000.font.pixelSize + } + Text { + id: text_0004 + wrapMode: Text.Wrap + text: text_0003.text + anchors.top: text_0003.bottom + anchors.left: text_0000.left + width: text_0000.width + maximumLineCount: text_0000.maximumLineCount + elide: Text.ElideRight + color: "blue" + font.family: text_0000.font.family + font.pixelSize: text_0000.font.pixelSize + } + Text { + id: text_0005 + wrapMode: Text.WordWrap + text: text_0003.text + anchors.top: text_0004.bottom + anchors.left: text_0000.left + width: text_0000.width + maximumLineCount: text_0000.maximumLineCount + elide: Text.ElideRight + color: "green" + font.family: text_0000.font.family + font.pixelSize: text_0000.font.pixelSize + } + Text { + id: text_0006 + wrapMode: Text.WrapAnywhere + text: "The quick brown 1234567890123" + anchors.top: text_0005.bottom + anchors.left: text_0000.left + width: 150 + maximumLineCount: 2 + elide: Text.ElideRight + color: "red" + font.family: text_0000.font.family + font.pixelSize: text_0000.font.pixelSize + } + Text { + id: text_0007 + wrapMode: Text.Wrap + text: text_0006.text + anchors.top: text_0006.bottom + anchors.left: text_0000.left + width: text_0000.width + maximumLineCount: text_0000.maximumLineCount + elide: Text.ElideRight + color: "blue" + font.family: text_0000.font.family + font.pixelSize: text_0000.font.pixelSize + } + Text { + id: text_0008 + wrapMode: Text.WordWrap + text: text_0006.text + anchors.top: text_0007.bottom + anchors.left: text_0000.left + width: text_0000.width + maximumLineCount: text_0000.maximumLineCount + elide: Text.ElideRight + color: "green" + font.family: text_0000.font.family + font.pixelSize: text_0000.font.pixelSize + } +} |