/****************************************************************************
**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
**
** This file is part of the test suite of the Qt Toolkit.
**
**
**
**
+**
** $QT_END_LICENSE$
**
****************************************************************************/
#include <QtDeclarative/qdeclarativeengine.h>
#include <QtDeclarative/qdeclarativecomponent.h>
#include <private/qdeclarativeconnections_p.h>
-#include <private/qdeclarativeitem_p.h>
-#include "../../../shared/util.h"
+#include <private/qquickitem_p.h>
+#include "../../shared/util.h"
#include <QtDeclarative/qdeclarativescriptstring.h>
-#ifdef Q_OS_SYMBIAN
-// In Symbian OS test data is located in applications private dir
-#define SRCDIR "."
-#endif
-
-class tst_qdeclarativeconnection : public QObject
-
+class tst_qdeclarativeconnection : public QDeclarativeDataTest
{
Q_OBJECT
public:
void unknownSignals();
void errors_data();
void errors();
+ void moduleApiTarget();
private:
QDeclarativeEngine engine;
void tst_qdeclarativeconnection::defaultValues()
{
QDeclarativeEngine engine;
- QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/test-connection3.qml"));
+ QDeclarativeComponent c(&engine, testFileUrl("test-connection3.qml"));
QDeclarativeConnections *item = qobject_cast<QDeclarativeConnections*>(c.create());
QVERIFY(item != 0);
void tst_qdeclarativeconnection::properties()
{
QDeclarativeEngine engine;
- QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/test-connection2.qml"));
+ QDeclarativeComponent c(&engine, testFileUrl("test-connection2.qml"));
QDeclarativeConnections *item = qobject_cast<QDeclarativeConnections*>(c.create());
QVERIFY(item != 0);
void tst_qdeclarativeconnection::connection()
{
QDeclarativeEngine engine;
- QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/test-connection.qml"));
- QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(c.create());
+ QDeclarativeComponent c(&engine, testFileUrl("test-connection.qml"));
+ QQuickItem *item = qobject_cast<QQuickItem*>(c.create());
QVERIFY(item != 0);
void tst_qdeclarativeconnection::trimming()
{
QDeclarativeEngine engine;
- QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/trimming.qml"));
- QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(c.create());
+ QDeclarativeComponent c(&engine, testFileUrl("trimming.qml"));
+ QQuickItem *item = qobject_cast<QQuickItem*>(c.create());
QVERIFY(item != 0);
void tst_qdeclarativeconnection::targetChanged()
{
QDeclarativeEngine engine;
- QDeclarativeComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/connection-targetchange.qml"));
- QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(c.create());
+ QDeclarativeComponent c(&engine, testFileUrl("connection-targetchange.qml"));
+ QQuickItem *item = qobject_cast<QQuickItem*>(c.create());
QVERIFY(item != 0);
QDeclarativeConnections *connections = item->findChild<QDeclarativeConnections*>("connections");
QVERIFY(connections);
- QDeclarativeItem *item1 = item->findChild<QDeclarativeItem*>("item1");
+ QQuickItem *item1 = item->findChild<QQuickItem*>("item1");
QVERIFY(item1);
item1->setWidth(200);
- QDeclarativeItem *item2 = item->findChild<QDeclarativeItem*>("item2");
+ QQuickItem *item2 = item->findChild<QQuickItem*>("item2");
QVERIFY(item2);
QVERIFY(connections->target() == item2);
QFETCH(QString, file);
QFETCH(QString, error);
- QUrl url = QUrl::fromLocalFile(SRCDIR "/data/" + file);
+ QUrl url = testFileUrl(file);
if (!error.isEmpty()) {
QTest::ignoreMessage(QtWarningMsg, (url.toString() + error).toLatin1());
} else {
QDeclarativeEngine engine;
QDeclarativeComponent c(&engine, url);
- QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(c.create());
+ QQuickItem *item = qobject_cast<QQuickItem*>(c.create());
QVERIFY(item != 0);
// check that connection is created (they are all runtime errors)
QFETCH(QString, file);
QFETCH(QString, error);
- QUrl url = QUrl::fromLocalFile(SRCDIR "/data/" + file);
+ QUrl url = testFileUrl(file);
QDeclarativeEngine engine;
QDeclarativeComponent c(&engine, url);
QCOMPARE(errors.at(0).description(), error);
}
+
+class MyTestModuleApi : public QObject
+{
+Q_OBJECT
+Q_PROPERTY(int intProp READ intProp WRITE setIntProp NOTIFY intPropChanged)
+
+public:
+ MyTestModuleApi(QObject *parent = 0) : QObject(parent), m_intProp(0), m_changeCount(0) {}
+ ~MyTestModuleApi() {}
+
+ Q_INVOKABLE int otherMethod(int val) { return val + 4; }
+
+ int intProp() const { return m_intProp; }
+ void setIntProp(int val)
+ {
+ if (++m_changeCount % 3 == 0) emit otherSignal();
+ m_intProp = val; emit intPropChanged();
+ }
+
+signals:
+ void intPropChanged();
+ void otherSignal();
+
+private:
+ int m_intProp;
+ int m_changeCount;
+};
+
+static QObject *module_api_factory(QDeclarativeEngine *engine, QJSEngine *scriptEngine)
+{
+ Q_UNUSED(engine)
+ Q_UNUSED(scriptEngine)
+ MyTestModuleApi *api = new MyTestModuleApi();
+ return api;
+}
+
+// QTBUG-20937
+void tst_qdeclarativeconnection::moduleApiTarget()
+{
+ qmlRegisterModuleApi("MyTestModuleApi", 1, 0, module_api_factory);
+ QDeclarativeComponent component(&engine, testFileUrl("moduleapi-target.qml"));
+ QObject *object = component.create();
+ QVERIFY(object != 0);
+
+ QCOMPARE(object->property("moduleIntPropChangedCount").toInt(), 0);
+ QCOMPARE(object->property("moduleOtherSignalCount").toInt(), 0);
+
+ QMetaObject::invokeMethod(object, "setModuleIntProp");
+ QCOMPARE(object->property("moduleIntPropChangedCount").toInt(), 1);
+ QCOMPARE(object->property("moduleOtherSignalCount").toInt(), 0);
+
+ QMetaObject::invokeMethod(object, "setModuleIntProp");
+ QCOMPARE(object->property("moduleIntPropChangedCount").toInt(), 2);
+ QCOMPARE(object->property("moduleOtherSignalCount").toInt(), 0);
+
+ // the module API emits otherSignal every 3 times the int property changes.
+ QMetaObject::invokeMethod(object, "setModuleIntProp");
+ QCOMPARE(object->property("moduleIntPropChangedCount").toInt(), 3);
+ QCOMPARE(object->property("moduleOtherSignalCount").toInt(), 1);
+
+ delete object;
+}
+
QTEST_MAIN(tst_qdeclarativeconnection)
#include "tst_qdeclarativeconnection.moc"