diff options
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" |