diff options
author | Qt Continuous Integration System <qt-info@nokia.com> | 2011-06-21 13:30:14 (GMT) |
---|---|---|
committer | Qt Continuous Integration System <qt-info@nokia.com> | 2011-06-21 13:30:14 (GMT) |
commit | 181f86f118f5a53abf43bce37758b331b0aabe9a (patch) | |
tree | 9cf57674f8c70d53ca15e2530af1663c16f60e9d | |
parent | 59de8f1c2aa210dcbbaed49666719bdb3d1d0e86 (diff) | |
parent | d5631f115c2e32f8201e98813613010c9d7cb590 (diff) | |
download | Qt-181f86f118f5a53abf43bce37758b331b0aabe9a.zip Qt-181f86f118f5a53abf43bce37758b331b0aabe9a.tar.gz Qt-181f86f118f5a53abf43bce37758b331b0aabe9a.tar.bz2 |
Merge branch 'master' of git://scm.dev.nokia.troll.no/qt/qt-doc-team
* 'master' of git://scm.dev.nokia.troll.no/qt/qt-doc-team:
QDeclarativeDebug: Fix cases where multiple packets arrive in one go
Fix build break in S60 5.0 environment
Skip softkeys update if application is not on foreground in Symbian
Revert "Opening taskswitcher, pushes application softkeys to top of switcher"
Fix js debugging autotest on Windows + Add license header
Rewrite autotests for js debugging
Rename qdeclarativescriptdebugging autotest directory
Create property cache in case of Component{} root
18 files changed, 1575 insertions, 215 deletions
diff --git a/src/declarative/debugger/qjsdebuggeragent_p.h b/src/declarative/debugger/qjsdebuggeragent_p.h index 309588e..4b27fc8 100644 --- a/src/declarative/debugger/qjsdebuggeragent_p.h +++ b/src/declarative/debugger/qjsdebuggeragent_p.h @@ -94,6 +94,12 @@ inline QDataStream &operator<<(QDataStream &s, const JSAgentWatchData &data) << data.type << data.hasChildren << data.objectId; } +inline QDataStream &operator>>(QDataStream &s, JSAgentWatchData &data) +{ + return s >> data.exp >> data.name >> data.value + >> data.type >> data.hasChildren >> data.objectId; +} + struct JSAgentStackData { QByteArray functionName; @@ -106,6 +112,11 @@ inline QDataStream &operator<<(QDataStream &s, const JSAgentStackData &data) return s << data.functionName << data.fileUrl << data.lineNumber; } +inline QDataStream &operator>>(QDataStream &s, JSAgentStackData &data) +{ + return s >> data.functionName >> data.fileUrl >> data.lineNumber; +} + struct JSAgentBreakpointData { QByteArray functionName; diff --git a/src/declarative/debugger/qpacketprotocol.cpp b/src/declarative/debugger/qpacketprotocol.cpp index 9caaa79..f53d2a3 100644 --- a/src/declarative/debugger/qpacketprotocol.cpp +++ b/src/declarative/debugger/qpacketprotocol.cpp @@ -164,12 +164,16 @@ public Q_SLOTS: void readyToRead() { + bool gotPackets = false; while (true) { - // Need to get trailing data + // Get size header (if not in progress) if (-1 == inProgressSize) { // We need a size header of sizeof(qint32) - if (sizeof(qint32) > (uint)dev->bytesAvailable()) - return; + if (sizeof(qint32) > (uint)dev->bytesAvailable()) { + if (gotPackets) + emit readyRead(); + return; // no more data available + } // Read size header int read = dev->read((char *)&inProgressSize, sizeof(qint32)); @@ -200,9 +204,12 @@ public Q_SLOTS: inProgress.clear(); waitingForPacket = false; - emit readyRead(); - } else - return; + gotPackets = true; + } else { + if (gotPackets) + emit readyRead(); + return; // packet in progress is not yet complete + } } } } diff --git a/src/declarative/qml/qdeclarativecompiler.cpp b/src/declarative/qml/qdeclarativecompiler.cpp index e642a67..abde4ad 100644 --- a/src/declarative/qml/qdeclarativecompiler.cpp +++ b/src/declarative/qml/qdeclarativecompiler.cpp @@ -622,6 +622,7 @@ bool QDeclarativeCompiler::compile(QDeclarativeEngine *engine, out->dumpInstructions(); if (compilerStatDump()) dumpStats(); + Q_ASSERT(out->rootPropertyCache); } else { reset(out); } @@ -1218,6 +1219,11 @@ void QDeclarativeCompiler::genComponent(QDeclarativeParser::Object *obj) id.setId.index = obj->idIndex; output->bytecode << id; } + + if (obj == unitRoot) { + output->rootPropertyCache = output->types[obj->type].createPropertyCache(engine); + output->rootPropertyCache->addref(); + } } bool QDeclarativeCompiler::buildComponent(QDeclarativeParser::Object *obj, diff --git a/src/gui/kernel/qsoftkeymanager.cpp b/src/gui/kernel/qsoftkeymanager.cpp index 57893f9..a866da3 100644 --- a/src/gui/kernel/qsoftkeymanager.cpp +++ b/src/gui/kernel/qsoftkeymanager.cpp @@ -48,9 +48,6 @@ #ifdef Q_WS_S60 #include "private/qsoftkeymanager_s60_p.h" -#endif - -#if defined(Q_WS_S60) && !defined(SYMBIAN_VERSION_9_4) #include "private/qt_s60_p.h" #endif @@ -193,11 +190,14 @@ void QSoftKeyManager::sendKeyEvent() void QSoftKeyManager::updateSoftKeys() { - if (QApplication::activeWindow()) { - QSoftKeyManager::instance()->d_func()->pendingUpdate = true; - QEvent *event = new QEvent(QEvent::UpdateSoftKeys); - QApplication::postEvent(QSoftKeyManager::instance(), event); - } +#ifdef Q_WS_S60 + // Do not adjust softkeys if application is not the topmost one + if (S60->wsSession().GetFocusWindowGroup() != S60->windowGroup().WindowGroupId()) + return; +#endif + QSoftKeyManager::instance()->d_func()->pendingUpdate = true; + QEvent *event = new QEvent(QEvent::UpdateSoftKeys); + QApplication::postEvent(QSoftKeyManager::instance(), event); } bool QSoftKeyManager::appendSoftkeys(const QWidget &source, int level) diff --git a/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.cpp b/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.cpp index abc60e1..283f7d4 100644 --- a/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.cpp +++ b/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.cpp @@ -125,7 +125,13 @@ void QTcpServerConnection::disconnect() bool QTcpServerConnection::waitForMessage() { Q_D(QTcpServerConnection); - return d->protocol->waitForReadyRead(-1); + if (d->protocol->packetsAvailable() > 0) { + QPacket packet = d->protocol->read(); + d->debugServer->receiveMessage(packet.data()); + return true; + } else { + return d->protocol->waitForReadyRead(-1); + } } void QTcpServerConnection::setPort(int port, bool block) @@ -145,10 +151,11 @@ void QTcpServerConnection::listen() d->tcpServer = new QTcpServer(this); QObject::connect(d->tcpServer, SIGNAL(newConnection()), this, SLOT(newConnection())); - if (d->tcpServer->listen(QHostAddress::Any, d->port)) + if (d->tcpServer->listen(QHostAddress::Any, d->port)) { qWarning("QDeclarativeDebugServer: Waiting for connection on port %d...", d->port); - else + } else { qWarning("QDeclarativeDebugServer: Unable to listen on port %d", d->port); + } } @@ -158,10 +165,10 @@ void QTcpServerConnection::readyRead() if (!d->protocol) return; - QPacket packet = d->protocol->read(); - - QByteArray content = packet.data(); - d->debugServer->receiveMessage(content); + while (d->protocol->packetsAvailable() > 0) { + QPacket packet = d->protocol->read(); + d->debugServer->receiveMessage(packet.data()); + } } void QTcpServerConnection::newConnection() diff --git a/tests/auto/declarative/qdeclarativedebugjs/app/app.pro b/tests/auto/declarative/qdeclarativedebugjs/app/app.pro new file mode 100644 index 0000000..800c033 --- /dev/null +++ b/tests/auto/declarative/qdeclarativedebugjs/app/app.pro @@ -0,0 +1,12 @@ +TEMPLATE = app + +QT += declarative + +CONFIG += console +CONFIG -= app_bundle + +DESTDIR = ./ + +INSTALLS = + +SOURCES += main.cpp diff --git a/tests/auto/declarative/qdeclarativedebugjs/app/main.cpp b/tests/auto/declarative/qdeclarativedebugjs/app/main.cpp new file mode 100644 index 0000000..f5b830e --- /dev/null +++ b/tests/auto/declarative/qdeclarativedebugjs/app/main.cpp @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtDeclarative module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QApplication> +#include <QDebug> +#include <QDeclarativeComponent> +#include <QDeclarativeEngine> +#include <QStringList> +#include <QtDeclarative/private/qdeclarativedebughelper_p.h> +#include <QtDeclarative/private/qdeclarativedebugservice_p.h> + +int main(int argc, char *argv[]) +{ + QDeclarativeDebugHelper::enableDebugging(); + + QApplication app(argc, argv); + + const QUrl path = QUrl::fromLocalFile(app.arguments().last()); + + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine, path); + + if (!component.isReady()) { + qWarning() << component.errorString(); + return -1; + } + + QObject *obj = component.create(); + +// printf("%u\n", QDeclarativeDebugService::idForObject(obj)); +// fflush(stdout); + + return app.exec(); +} diff --git a/tests/auto/declarative/qdeclarativedebugjs/data/backtrace1.js b/tests/auto/declarative/qdeclarativedebugjs/data/backtrace1.js new file mode 100644 index 0000000..f96f8e9 --- /dev/null +++ b/tests/auto/declarative/qdeclarativedebugjs/data/backtrace1.js @@ -0,0 +1,28 @@ +function function2InScript(a) +{ + logger("return function2InScript"); + root.result = a; +} + +function functionInScript(a, b) +{ + logger("enter functionInScript"); + var names = ["Clark Kent", "Peter Parker", "Bruce Wayne"]; + var aliases = ["Superman", "Spiderman", "Batman"]; + var details = { + category: "Superheroes", + names: names, + aliases: aliases + }; + function2InScript(a + b); + logger("return functionInScript"); + return details; +} + +function logger(msg) +{ + //console.log(msg); + return true; +} + +//DO NOT CHANGE CODE ABOVE THIS LINE diff --git a/tests/auto/declarative/qdeclarativedebugjs/data/backtrace1.qml b/tests/auto/declarative/qdeclarativedebugjs/data/backtrace1.qml new file mode 100644 index 0000000..f062bb9 --- /dev/null +++ b/tests/auto/declarative/qdeclarativedebugjs/data/backtrace1.qml @@ -0,0 +1,41 @@ +import QtQuick 1.0 +import "backtrace1.js" as Script + +Item { + id: root + + property int result:0 + + Component.onCompleted: + { + root.result = 10; + Script.functionInScript(4,5); + root.name = "nemo"; + Script.logger(root.simpleBinding); + } + + //DO NOT CHANGE CODE ABOVE + //ADD CODE FROM HERE + + property string name + property int simpleBinding: result + + VisualItemModel { + id: itemModel + Rectangle { height: 30; width: 80; color: "red" } + Rectangle { height: 30; width: 80; color: "green" } + Rectangle { height: 30; width: 80; color: "blue" } + } + + ListView { + anchors.fill: parent + model: itemModel + + Component.onCompleted: + { + Script.logger("List Loaded"); + } + } + +} + diff --git a/tests/auto/declarative/qdeclarativedebugjs/qdeclarativedebugjs.pro b/tests/auto/declarative/qdeclarativedebugjs/qdeclarativedebugjs.pro new file mode 100644 index 0000000..720de19 --- /dev/null +++ b/tests/auto/declarative/qdeclarativedebugjs/qdeclarativedebugjs.pro @@ -0,0 +1,4 @@ +TEMPLATE = subdirs + +SUBDIRS = tst_qdeclarativedebugjs.pro \ + app diff --git a/tests/auto/declarative/qdeclarativedebugjs/tst_qdeclarativedebugjs.cpp b/tests/auto/declarative/qdeclarativedebugjs/tst_qdeclarativedebugjs.cpp new file mode 100644 index 0000000..a40bcc0 --- /dev/null +++ b/tests/auto/declarative/qdeclarativedebugjs/tst_qdeclarativedebugjs.cpp @@ -0,0 +1,1341 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <qtest.h> +#include <QtDeclarative/QDeclarativeEngine> +#include <QtDeclarative/private/qdeclarativedebugclient_p.h> +#include <QtDeclarative/private/qdeclarativedebugservice_p.h> +#include <QtDeclarative/private/qdeclarativedebug_p.h> +#include <QtDeclarative/private/qjsdebuggeragent_p.h> +#include <QtCore/QFileInfo> +#include <QtCore/QDir> +#include <QtCore/QProcess> +#include "../../../shared/util.h" +#include "../shared/debugutil_p.h" + +class QJSDebugClient : public QDeclarativeDebugClient +{ + Q_OBJECT +public: + QJSDebugClient(QDeclarativeDebugConnection *connection) : QDeclarativeDebugClient(QLatin1String("JSDebugger"), connection) {} + + void ping(); + void exec(const QByteArray &debuggerId, const QString &expr); + void setBreakpoints(const QSet<JSAgentBreakpointData> &breakpoints); + void setWatchExpressions(const QStringList &watchExpressions); + void stepOver(); + void stepInto(); + void interrupt(); + void stepOut(); + void continueExecution(); + void expandObjectById(const QByteArray& objectName, quint64 objectId); + void setProperty(const QByteArray& id, qint64 objectId, const QString &property, const QString &value); + void activateFrame(int frameId); + + // info from last exec + JSAgentWatchData exec_data; + QByteArray exec_iname; + + QByteArray object_name; + QList<JSAgentWatchData> object_children; + + int frame_id; + + // info from last stop + QList<JSAgentStackData> break_stackFrames; + QList<JSAgentWatchData> break_watches; + QList<JSAgentWatchData> break_locals; + bool break_becauseOfException; + QString break_error; + +signals: + void statusHasChanged(); + + void pong(); + void result(); + void stopped(); + void expanded(); + void watchTriggered(); + +protected: + virtual void statusChanged(Status status); + virtual void messageReceived(const QByteArray &data); + +private: + int m_ping; +}; + +class QJSDebugProcess : public QObject +{ + Q_OBJECT +public: + QJSDebugProcess(); + ~QJSDebugProcess(); + + void start(const QStringList &arguments); + bool waitForStarted(); + +private slots: + void processAppOutput(); + +private: + QProcess m_process; + QTimer m_timer; + QEventLoop m_eventLoop; + bool m_started; +}; + +class tst_QDeclarativeDebugJS : public QObject +{ + Q_OBJECT +private: + QDeclarativeDebugConnection *m_conn; + QDeclarativeEngine *m_engine; + QJSDebugClient *m_client; + +private slots: + void pingPong(); + void exec(); + void setBreakpoint(); + void stepOver(); + void stepInto(); + void interrupt(); + void stepOut(); + void continueExecution(); + void expandObject(); + void setProperty(); + void setProperty2(); + void watchExpression(); + void activateFrame(); + void setBreakpoint2(); + void stepOver2(); + void stepInto2(); + void interrupt2(); + void stepOut2(); + void continueExecution2(); + void expandObject2(); + void setProperty3(); + void setProperty4(); + void activateFrame2(); + void verifyQMLOptimizerDisabled(); +}; + + +void QJSDebugClient::ping() +{ + m_ping++; + QByteArray reply; + QDataStream rs(&reply, QIODevice::WriteOnly); + QByteArray cmd = "PING"; + rs << cmd; + rs << m_ping; + sendMessage(reply); +} + +void QJSDebugClient::exec(const QByteArray &debuggerId, const QString &expr) +{ + QByteArray reply; + QDataStream rs(&reply, QIODevice::WriteOnly); + QByteArray cmd = "EXEC"; + rs << cmd; + rs << debuggerId; + rs << expr; + sendMessage(reply); +} + +void QJSDebugClient::setBreakpoints(const QSet<JSAgentBreakpointData> &breakpoints) +{ + QByteArray reply; + QDataStream rs(&reply, QIODevice::WriteOnly); + QByteArray cmd = "BREAKPOINTS"; + rs << cmd + << breakpoints; + sendMessage(reply); +} + +void QJSDebugClient::setWatchExpressions(const QStringList &watchExpressions) +{ + QByteArray reply; + QDataStream rs(&reply, QIODevice::WriteOnly); + QByteArray cmd = "WATCH_EXPRESSIONS"; + rs << cmd + << watchExpressions; + sendMessage(reply); +} + +void QJSDebugClient::stepOver() +{ + QByteArray reply; + QDataStream rs(&reply, QIODevice::WriteOnly); + QByteArray cmd = "STEPOVER"; + rs << cmd; + sendMessage(reply); +} + +void QJSDebugClient::stepInto() +{ + QByteArray reply; + QDataStream rs(&reply, QIODevice::WriteOnly); + QByteArray cmd = "STEPINTO"; + rs << cmd; + sendMessage(reply); +} + +void QJSDebugClient::interrupt() +{ + QByteArray reply; + QDataStream rs(&reply, QIODevice::WriteOnly); + QByteArray cmd = "INTERRUPT"; + rs << cmd; + sendMessage(reply); +} + +void QJSDebugClient::stepOut() +{ + QByteArray reply; + QDataStream rs(&reply, QIODevice::WriteOnly); + QByteArray cmd = "STEPOUT"; + rs << cmd; + sendMessage(reply); +} + +void QJSDebugClient::continueExecution() +{ + QByteArray reply; + QDataStream rs(&reply, QIODevice::WriteOnly); + QByteArray cmd = "CONTINUE"; + rs << cmd; + sendMessage(reply); +} + +void QJSDebugClient::expandObjectById(const QByteArray& objectName, quint64 objectId) +{ + QByteArray reply; + QDataStream rs(&reply, QIODevice::WriteOnly); + QByteArray cmd = "EXPAND"; + rs << cmd + << objectName + << objectId; + sendMessage(reply); +} + +void QJSDebugClient::setProperty(const QByteArray& id, qint64 objectId, const QString &property, const QString &value) +{ + QByteArray reply; + QDataStream rs(&reply, QIODevice::WriteOnly); + QByteArray cmd = "SET_PROPERTY"; + rs << cmd + << id + << objectId + << property + << value; + sendMessage(reply); +} + +void QJSDebugClient::activateFrame(int frameId) +{ + QByteArray reply; + QDataStream rs(&reply, QIODevice::WriteOnly); + QByteArray cmd = "ACTIVATE_FRAME"; + rs << cmd + << frameId; + sendMessage(reply); +} + +void QJSDebugClient::statusChanged(Status /*status*/) +{ + emit statusHasChanged(); +} + +void QJSDebugClient::messageReceived(const QByteArray &data) +{ + QByteArray rwData = data; + QDataStream stream(&rwData, QIODevice::ReadOnly); + + QByteArray command; + stream >> command; + + if (command == "STOPPED") { + stream >> break_stackFrames >> break_watches >> break_locals >> break_becauseOfException >> break_error; + if (!break_becauseOfException) { + break_error.clear(); + } + emit stopped(); + } else if (command == "RESULT") { + stream >> exec_iname; + stream >> exec_data; + emit result(); + } else if (command == "EXPANDED") { + stream >> object_name >> object_children; + emit expanded(); + } else if (command == "LOCALS") { + stream >> frame_id >> break_locals; + if (!stream.atEnd()) { // compatibility with jsdebuggeragent from 2.1, 2.2 + stream >> break_watches; + } + emit watchTriggered(); + } else if (command == "PONG") { + int ping; + stream >> ping; + QCOMPARE(ping, m_ping); + emit pong(); + } else { + QFAIL("Unknown message :" + command); + } + QVERIFY(stream.atEnd()); +} + +QJSDebugProcess::QJSDebugProcess() + : m_started(false) +{ + m_process.setProcessChannelMode(QProcess::MergedChannels); + connect(&m_process, SIGNAL(readyReadStandardOutput()), this, SLOT(processAppOutput())); + connect(&m_timer, SIGNAL(timeout()), &m_eventLoop, SLOT(quit())); + m_timer.setSingleShot(true); + m_timer.setInterval(5000); + QStringList environment = QProcess::systemEnvironment(); + environment.append("QML_DISABLE_OPTIMIZER=1"); + m_process.setEnvironment(environment); +} + +QJSDebugProcess::~QJSDebugProcess() +{ + if (m_process.state() != QProcess::NotRunning) { + m_process.kill(); + m_process.waitForFinished(5000); + } +} + +void QJSDebugProcess::start(const QStringList &arguments) +{ + QString currentDir = QFileInfo(__FILE__).absoluteDir().absolutePath(); + m_process.start(currentDir + "/app/app", arguments); + m_timer.start(); +} + +bool QJSDebugProcess::waitForStarted() +{ + m_eventLoop.exec(QEventLoop::ExcludeUserInputEvents); + + return m_started; +} + +void QJSDebugProcess::processAppOutput() +{ + const QString appOutput = m_process.readAll(); + static QRegExp newline("[\n\r]{1,2}"); + QStringList lines = appOutput.split(newline); + foreach (const QString &line, lines) { + if (line.isEmpty()) + continue; + if (line.startsWith("Qml debugging is enabled")) // ignore + continue; + if (line.startsWith("QDeclarativeDebugServer:")) { + if (line.contains("Waiting for connection ")) { + m_started = true; + m_eventLoop.quit(); + continue; + } + if (line.contains("Connection established")) { + continue; + } + } + qDebug() << line; + } +} + +inline QString TEST_FILE(const QString &filename) +{ + QFileInfo fileInfo(__FILE__); + return fileInfo.absoluteDir().filePath("data/" + filename); +} + +void tst_QDeclarativeDebugJS::pingPong() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QJSDebugClient client(&connection); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + client.ping(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(pong()))); +} + +void tst_QDeclarativeDebugJS::exec() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QJSDebugClient client(&connection); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + // Evaluate script without context + client.exec("queryid", "1+1"); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(result()))); + QCOMPARE(client.exec_iname, QByteArray("queryid")); + QCOMPARE(client.exec_data.exp, QByteArray("1+1")); + QCOMPARE(client.exec_data.name, QByteArray("1+1")); + QCOMPARE(client.exec_data.hasChildren, false); + QCOMPARE(client.exec_data.type, QByteArray("Number")); + QCOMPARE(client.exec_data.value, QByteArray("2")); + + // TODO: Test access to context after breakpoint is hit +} + + +void tst_QDeclarativeDebugJS::setBreakpoint() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp1.lineNumber = 11; + + //TEST LINE + client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + JSAgentStackData data = client.break_stackFrames.at(0); + QCOMPARE(data.fileUrl, bp1.fileUrl); + QCOMPARE(data.lineNumber, bp1.lineNumber); + +} + +void tst_QDeclarativeDebugJS::stepOver() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp1.lineNumber = 11; + + client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + //TEST LINE + client.stepOver(); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + JSAgentStackData data = client.break_stackFrames.at(0); + QCOMPARE(data.fileUrl, bp1.fileUrl); + QCOMPARE(data.lineNumber, bp1.lineNumber +1); +} + +void tst_QDeclarativeDebugJS::stepInto() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp1.lineNumber = 12; + + client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + //TEST LINE + client.stepInto(); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + QByteArray functionName("functionInScript"); + JSAgentStackData data = client.break_stackFrames.at(0); + QCOMPARE(data.functionName, functionName); + QCOMPARE(data.fileUrl, QByteArray(QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded())); +} + +void tst_QDeclarativeDebugJS::interrupt() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp1.lineNumber = 12; + + client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + //TEST LINE + client.interrupt(); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + QByteArray functionName("functionInScript"); + JSAgentStackData data = client.break_stackFrames.at(0); + QCOMPARE(data.functionName, functionName); + QCOMPARE(data.fileUrl, QByteArray(QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded())); +} + +void tst_QDeclarativeDebugJS::stepOut() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1,bp2; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp1.lineNumber = 12; + + bp2.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp2.lineNumber = 13; + + client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1 << bp2); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + client.stepInto(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + //TEST LINE + client.stepOut(); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + JSAgentStackData data = client.break_stackFrames.at(0); + + QCOMPARE(data.fileUrl, bp2.fileUrl); + QCOMPARE(data.lineNumber, bp2.lineNumber); + +} + +void tst_QDeclarativeDebugJS::continueExecution() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1, bp2; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp1.lineNumber = 11; + + bp2.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp2.lineNumber = 13; + + client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1 << bp2); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + //TEST LINE + client.continueExecution(); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + JSAgentStackData data = client.break_stackFrames.at(0); + QCOMPARE(data.fileUrl, bp2.fileUrl); + QCOMPARE(data.lineNumber, bp2.lineNumber); +} + +void tst_QDeclarativeDebugJS::expandObject() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded(); + bp1.lineNumber = 17; + + client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + foreach ( JSAgentWatchData data, client.break_locals) + { + if( data.name == "details") + { + //TEST LINE + client.expandObjectById(data.name,data.objectId); + } + } + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(expanded()))); + QCOMPARE(client.object_name,QByteArray("details")); + QCOMPARE(client.object_children.at(0).name,QByteArray("category")); + QCOMPARE(client.object_children.at(0).type,QByteArray("String")); + QCOMPARE(client.object_children.at(1).name,QByteArray("names")); + QCOMPARE(client.object_children.at(1).type,QByteArray("Array")); + QCOMPARE(client.object_children.at(2).name,QByteArray("aliases")); + QCOMPARE(client.object_children.at(2).type,QByteArray("Array")); + +} + +void tst_QDeclarativeDebugJS::setProperty() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1, bp2; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded(); + bp1.lineNumber = 17; + bp2.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded(); + bp2.lineNumber = 18; + + client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1 << bp2); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + quint64 objectId; + QByteArray objectName; + + foreach ( JSAgentWatchData data, client.break_locals) + { + if( data.name == "details") + { + objectId = data.objectId; + objectName = data.name; + //TEST LINE + client.setProperty(data.name, data.objectId, "total", "names.length"); + } + } + + client.continueExecution(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + client.expandObjectById(objectName,objectId); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(expanded()))); + + QCOMPARE(client.object_name,QByteArray("details")); + QCOMPARE(client.object_children.at(0).name,QByteArray("category")); + QCOMPARE(client.object_children.at(0).type,QByteArray("String")); + QCOMPARE(client.object_children.at(0).value,QByteArray("Superheroes")); + QCOMPARE(client.object_children.at(1).name,QByteArray("names")); + QCOMPARE(client.object_children.at(1).type,QByteArray("Array")); + QCOMPARE(client.object_children.at(2).name,QByteArray("aliases")); + QCOMPARE(client.object_children.at(2).type,QByteArray("Array")); + QCOMPARE(client.object_children.at(3).name,QByteArray("total")); + QCOMPARE(client.object_children.at(3).type,QByteArray("Number")); + // foreach ( JSAgentWatchData data, client.object_children) + // { + // qDebug() << data.name << data.type << data.value; + // } +} + +void tst_QDeclarativeDebugJS::setProperty2() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1, bp2; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded(); + bp1.lineNumber = 17; + bp2.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded(); + bp2.lineNumber = 18; + + client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1 << bp2); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + quint64 objectId; + QByteArray objectName; + + foreach ( JSAgentWatchData data, client.break_locals) + { + if( data.name == "details") + { + objectId = data.objectId; + objectName = data.name; + //TEST LINE + client.setProperty(data.name, data.objectId, "category", data.name + ".category = 'comic characters'"); + } + } + + client.continueExecution(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + client.expandObjectById(objectName,objectId); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(expanded()))); + + QCOMPARE(client.object_name,QByteArray("details")); + QCOMPARE(client.object_children.at(0).name,QByteArray("category")); + QCOMPARE(client.object_children.at(0).type,QByteArray("String")); + QCOMPARE(client.object_children.at(0).value,QByteArray("comic characters")); + QCOMPARE(client.object_children.at(1).name,QByteArray("names")); + QCOMPARE(client.object_children.at(1).type,QByteArray("Array")); + QCOMPARE(client.object_children.at(2).name,QByteArray("aliases")); + QCOMPARE(client.object_children.at(2).type,QByteArray("Array")); + + // foreach ( JSAgentWatchData data, client.object_children) + // { + // qDebug() << data.name << data.type << data.value; + // } +} + +void tst_QDeclarativeDebugJS::watchExpression() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + QByteArray watchExpression("root.result = 20"); + QStringList watchList; + watchList.append(QString(watchExpression)); + + //TEST LINE + client.setWatchExpressions(watchList); + + JSAgentBreakpointData bp1; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp1.lineNumber = 11; + + client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + JSAgentWatchData data = client.break_watches.at(0); + QCOMPARE(data.exp, watchExpression); + QCOMPARE(data.value.toInt(), 20); + QCOMPARE(data.type, QByteArray("Number")); +} + +void tst_QDeclarativeDebugJS::activateFrame() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1, bp2; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded(); + bp1.lineNumber = 3; + + client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + client.stepInto(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + //TEST LINE + client.activateFrame(2); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(watchTriggered()))); + + QCOMPARE(client.break_locals.at(1).name,QByteArray("names")); + QCOMPARE(client.break_locals.at(1).type,QByteArray("Array")); + QCOMPARE(client.break_locals.at(2).name,QByteArray("a")); + QCOMPARE(client.break_locals.at(2).type,QByteArray("Number")); + QCOMPARE(client.break_locals.at(2).value,QByteArray("4")); + QCOMPARE(client.break_locals.at(3).name,QByteArray("b")); + QCOMPARE(client.break_locals.at(3).type,QByteArray("Number")); + QCOMPARE(client.break_locals.at(3).value,QByteArray("5")); + + // foreach ( JSAgentWatchData data, client.break_locals) + // { + // qDebug() << data.name << data.type << data.value; + // } + +} + +void tst_QDeclarativeDebugJS::setBreakpoint2() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp1.lineNumber = 40; + + //TEST LINE + client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1); + QVERIFY(!QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); +} + +void tst_QDeclarativeDebugJS::stepOver2() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp1.lineNumber = 11; + + client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + //TEST LINE + client.stepOver(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + client.stepOver(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + JSAgentStackData data = client.break_stackFrames.at(0); + QCOMPARE(data.fileUrl, bp1.fileUrl); + QCOMPARE(data.lineNumber, bp1.lineNumber +2); +} + +void tst_QDeclarativeDebugJS::stepInto2() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded(); + bp1.lineNumber = 17; + + client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + //TEST LINE + client.stepInto(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + client.stepInto(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + QByteArray functionName("logger"); + JSAgentStackData data = client.break_stackFrames.at(0); + QCOMPARE(data.functionName, functionName); + QCOMPARE(data.fileUrl, QByteArray(QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded())); +} + +void tst_QDeclarativeDebugJS::interrupt2() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded(); + bp1.lineNumber = 17; + + client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + //TEST LINE + client.interrupt(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + client.interrupt(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + QByteArray functionName("logger"); + JSAgentStackData data = client.break_stackFrames.at(0); + QCOMPARE(data.functionName, functionName); + QCOMPARE(data.fileUrl, QByteArray(QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded())); +} + +void tst_QDeclarativeDebugJS::stepOut2() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1,bp2; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp1.lineNumber = 12; + + bp2.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp2.lineNumber = 13; + + client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1 << bp2); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + client.stepInto(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + client.stepInto(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + //TEST LINE + client.stepOut(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + client.stepOut(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + JSAgentStackData data = client.break_stackFrames.at(0); + + QCOMPARE(data.fileUrl, bp2.fileUrl); + QCOMPARE(data.lineNumber, bp2.lineNumber); + +} + +void tst_QDeclarativeDebugJS::continueExecution2() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1, bp2, bp3; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp1.lineNumber = 11; + + bp2.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp2.lineNumber = 12; + + bp3.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp3.lineNumber = 13; + + client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1 << bp2 << bp3); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + //TEST LINE + client.continueExecution(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + client.continueExecution(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + JSAgentStackData data = client.break_stackFrames.at(0); + QCOMPARE(data.fileUrl, bp3.fileUrl); + QCOMPARE(data.lineNumber, bp3.lineNumber); +} + +void tst_QDeclarativeDebugJS::expandObject2() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded(); + bp1.lineNumber = 17; + + client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + //TEST LINE + client.expandObjectById(QByteArray("details"),123); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(expanded()))); + QCOMPARE(client.object_name,QByteArray("details")); + + QEXPECT_FAIL("", "", Continue); + QCOMPARE(client.object_children.length(),0); + +} + +void tst_QDeclarativeDebugJS::setProperty3() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1, bp2; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded(); + bp1.lineNumber = 17; + bp2.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded(); + bp2.lineNumber = 18; + + client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1 << bp2); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + quint64 objectId; + QByteArray objectName; + + foreach ( JSAgentWatchData data, client.break_locals) + { + if( data.name == "details") + { + objectId = data.objectId; + objectName = data.name; + //TEST LINE + client.setProperty(data.name, 123, "total", "names.length"); + } + } + + client.continueExecution(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + client.expandObjectById(objectName,objectId); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(expanded()))); + + QCOMPARE(client.object_name,QByteArray("details")); + QCOMPARE(client.object_children.length(),3); + + // foreach ( JSAgentWatchData data, client.object_children) + // { + // qDebug() << data.name << data.type << data.value; + // } +} + +void tst_QDeclarativeDebugJS::setProperty4() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1, bp2; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded(); + bp1.lineNumber = 17; + bp2.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded(); + bp2.lineNumber = 18; + + client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1 << bp2); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + quint64 objectId; + QByteArray objectName; + + foreach ( JSAgentWatchData data, client.break_locals) + { + if( data.name == "details") + { + objectId = data.objectId; + objectName = data.name; + //TEST LINE + client.setProperty(data.name, 123, "category", data.name + ".category = 'comic characters'"); + } + } + + client.continueExecution(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + client.expandObjectById(objectName,objectId); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(expanded()))); + + QCOMPARE(client.object_name,QByteArray("details")); + QCOMPARE(client.object_children.at(0).name,QByteArray("category")); + QCOMPARE(client.object_children.at(0).type,QByteArray("String")); + QCOMPARE(client.object_children.at(0).value,QByteArray("Superheroes")); + QCOMPARE(client.object_children.at(1).name,QByteArray("names")); + QCOMPARE(client.object_children.at(1).type,QByteArray("Array")); + QCOMPARE(client.object_children.at(2).name,QByteArray("aliases")); + QCOMPARE(client.object_children.at(2).type,QByteArray("Array")); + + // foreach ( JSAgentWatchData data, client.object_children) + // { + // qDebug() << data.name << data.type << data.value; + // } +} + +void tst_QDeclarativeDebugJS::activateFrame2() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1, bp2; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.js")).toEncoded(); + bp1.lineNumber = 4; + + client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + client.stepInto(); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + + //TEST LINE + client.activateFrame(5); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(watchTriggered()))); + + QCOMPARE(client.break_locals.length(),0); + + // foreach ( JSAgentWatchData data, client.break_locals) + // { + // qDebug() << data.name << data.type << data.value; + // } + +} + +void tst_QDeclarativeDebugJS::verifyQMLOptimizerDisabled() +{ + QJSDebugProcess process; + process.start(QStringList() << "-qmljsdebugger=port:3771,block" << TEST_FILE("backtrace1.qml")); + QVERIFY(process.waitForStarted()); + + QDeclarativeDebugConnection connection; + QJSDebugClient client(&connection); + + connection.connectToHost("127.0.0.1", 3771); + QVERIFY(connection.waitForConnected()); + + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + if (client.status() == QJSDebugClient::Unavailable) + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(statusHasChanged()))); + QCOMPARE(client.status(), QJSDebugClient::Enabled); + + JSAgentBreakpointData bp1; + bp1.fileUrl = QUrl::fromLocalFile(TEST_FILE("backtrace1.qml")).toEncoded(); + bp1.lineNumber = 21; + + client.setBreakpoints(QSet<JSAgentBreakpointData>() << bp1); + QVERIFY(QDeclarativeDebugTest::waitForSignal(&client, SIGNAL(stopped()))); + +} +QTEST_MAIN(tst_QDeclarativeDebugJS) + +#include "tst_qdeclarativedebugjs.moc" diff --git a/tests/auto/declarative/qdeclarativescriptdebugging/qdeclarativescriptdebugging.pro b/tests/auto/declarative/qdeclarativedebugjs/tst_qdeclarativedebugjs.pro index 171f308..8aea1b5 100644 --- a/tests/auto/declarative/qdeclarativescriptdebugging/qdeclarativescriptdebugging.pro +++ b/tests/auto/declarative/qdeclarativedebugjs/tst_qdeclarativedebugjs.pro @@ -1,8 +1,12 @@ load(qttest_p4) -contains(QT_CONFIG,declarative): QT += declarative script +contains(QT_CONFIG,declarative): QT += declarative network script macx:CONFIG -= app_bundle -SOURCES += tst_qdeclarativescriptdebugging.cpp +HEADERS += ../shared/debugutil_p.h + +SOURCES += tst_qdeclarativedebugjs.cpp \ + ../shared/debugutil.cpp + INCLUDEPATH += ../shared # QMAKE_CXXFLAGS = -fprofile-arcs -ftest-coverage @@ -16,5 +20,7 @@ symbian: { DEFINES += SRCDIR=\\\"$$PWD\\\" } +OTHER_FILES = data/backtrace1.js data/backtrace1.qml + CONFIG += parallel_test diff --git a/tests/auto/declarative/qdeclarativelanguage/data/NestedComponentRoot.qml b/tests/auto/declarative/qdeclarativelanguage/data/NestedComponentRoot.qml new file mode 100644 index 0000000..785a27d --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/NestedComponentRoot.qml @@ -0,0 +1,6 @@ +import QtQuick 1.0 + +Component { + Item { + } +} diff --git a/tests/auto/declarative/qdeclarativelanguage/data/nestedComponentRoots.qml b/tests/auto/declarative/qdeclarativelanguage/data/nestedComponentRoots.qml new file mode 100644 index 0000000..361bcbc --- /dev/null +++ b/tests/auto/declarative/qdeclarativelanguage/data/nestedComponentRoots.qml @@ -0,0 +1,4 @@ +import QtQuick 1.0 + +NestedComponentRoot { +} diff --git a/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp b/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp index d6e6a4a..7f186b3 100644 --- a/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp +++ b/tests/auto/declarative/qdeclarativelanguage/tst_qdeclarativelanguage.cpp @@ -135,6 +135,7 @@ private slots: void reservedWords_data(); void reservedWords(); void inlineAssignmentsOverrideBindings(); + void nestedComponentRoots(); void basicRemote_data(); void basicRemote(); @@ -1425,6 +1426,12 @@ void tst_qdeclarativelanguage::inlineAssignmentsOverrideBindings() delete o; } +// QTBUG-19354 +void tst_qdeclarativelanguage::nestedComponentRoots() +{ + QDeclarativeComponent component(&engine, TEST_FILE("nestedComponentRoots.qml")); +} + // Import tests (QT-558) void tst_qdeclarativelanguage::importsBuiltin_data() { diff --git a/tests/auto/declarative/qdeclarativescriptdebugging/data/backtrace1.js b/tests/auto/declarative/qdeclarativescriptdebugging/data/backtrace1.js deleted file mode 100644 index 8decbf0..0000000 --- a/tests/auto/declarative/qdeclarativescriptdebugging/data/backtrace1.js +++ /dev/null @@ -1,11 +0,0 @@ - -function function2InScript(a) -{ - mainRectangle.foo = a; -} - - -function functionInScript(a , b) -{ - function2InScript(a + b); -} diff --git a/tests/auto/declarative/qdeclarativescriptdebugging/data/backtrace1.qml b/tests/auto/declarative/qdeclarativescriptdebugging/data/backtrace1.qml deleted file mode 100644 index 9096c32..0000000 --- a/tests/auto/declarative/qdeclarativescriptdebugging/data/backtrace1.qml +++ /dev/null @@ -1,27 +0,0 @@ -import QtQuick 1.0 -import Qt.test 1.0 -import "backtrace1.js" as Script - -Rectangle { - id: mainRectangle - - property string foo: "Default"; - width: 200 - height: 200 - - - MyTestObject { - - function append(a, b) { - return a + " " + b; - } - - - id: testObject; - someProperty: append("Hello", mainRectangle.foo) - - onSignaled: { - Script.functionInScript(value , "b"); - } - } -} diff --git a/tests/auto/declarative/qdeclarativescriptdebugging/tst_qdeclarativescriptdebugging.cpp b/tests/auto/declarative/qdeclarativescriptdebugging/tst_qdeclarativescriptdebugging.cpp deleted file mode 100644 index 4301174..0000000 --- a/tests/auto/declarative/qdeclarativescriptdebugging/tst_qdeclarativescriptdebugging.cpp +++ /dev/null @@ -1,154 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include <qtest.h> -#include <QtDeclarative/qdeclarativecomponent.h> -#include <QtDeclarative/qdeclarativeengine.h> -#include <QtDeclarative/qdeclarativeitem.h> -#include <QtDeclarative/qdeclarativecontext.h> -#include <QtCore/QDir> -#include <QtScript/QScriptEngineAgent> -#include <private/qdeclarativeengine_p.h> - -class MyTestObject : public QObject { - Q_OBJECT - Q_PROPERTY(QString someProperty READ someProperty WRITE setSomeProperty NOTIFY somePropertyChanged) - -public: - QString someProperty() { return _someProperty; } - void setSomeProperty(const QString &p) { _someProperty = p; } - QString _someProperty; - - void emitSignal(const QString &value) { emit signaled(value); } - -signals: - void signaled(const QString &value); - void somePropertyChanged(); -}; - - -class BtAgent : public QScriptEngineAgent { -public: - BtAgent(QScriptEngine *engine) : QScriptEngineAgent(engine) - { count = 0; engine->setAgent(this); } - - QStringList bt; - int count; - int breakpoint; - void positionChange(qint64 , int lineNumber, int ) - { - if(lineNumber == breakpoint) { - count++; - bt = engine()->currentContext()->backtrace(); - } - } -}; - - - -/* -This test covers evaluation of ECMAScript expressions and bindings from within -QML. This does not include static QML language issues. - -Static QML language issues are covered in qmllanguage -*/ -inline QUrl TEST_FILE(const QString &filename) -{ - QFileInfo fileInfo(__FILE__); - return QUrl::fromLocalFile(fileInfo.absoluteDir().filePath("data/" + filename)); -} - -inline QUrl TEST_FILE(const char *filename) -{ - return TEST_FILE(QLatin1String(filename)); -} - -class tst_qdeclarativescriptdebugging : public QObject -{ - Q_OBJECT -public: - tst_qdeclarativescriptdebugging() {} - -private slots: - void initTestCase(); - void backtrace1(); -}; - -void tst_qdeclarativescriptdebugging::initTestCase() -{ - qmlRegisterType<MyTestObject>("Qt.test", 1,0, "MyTestObject"); -} - -void tst_qdeclarativescriptdebugging::backtrace1() -{ - { - QDeclarativeEngine engine; - QUrl file = TEST_FILE("backtrace1.qml"); - QDeclarativeComponent component(&engine, file); - QDeclarativeItem *item = qobject_cast<QDeclarativeItem *>(component.create()); - QVERIFY(item); - MyTestObject *obj = item->findChild<MyTestObject *>(); - QVERIFY(obj); - QCOMPARE(obj->someProperty(), QString("Hello Default")); - - QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(&engine); - BtAgent agent(&ep->scriptEngine); - agent.breakpoint = 16; - - obj->emitSignal("blah"); - QCOMPARE(obj->someProperty(), QString("Hello blahb")); - QCOMPARE(agent.count, 1); - - QStringList expected; - expected << "append(a = 'Hello', b = 'blahb') at @PREFIX@/backtrace1.qml:16" - << "$someProperty() at @PREFIX@/backtrace1.qml:21" - << "function2InScript(a = 'blahb') at @PREFIX@/backtrace1.js:4" - << "functionInScript(a = 'blah', b = 'b') at @PREFIX@/backtrace1.js:10" - << "onSignaled() at @PREFIX@/backtrace1.qml:24" - << "<global>() at -1"; - expected.replaceInStrings("@PREFIX@", file.toString().section('/', 0, -2)); - QCOMPARE(agent.bt, expected); - } -} - - -QTEST_MAIN(tst_qdeclarativescriptdebugging) - -#include "tst_qdeclarativescriptdebugging.moc" |