2015-11-23 21:33:17 +01:00
|
|
|
// std
|
2015-09-20 11:39:25 +02:00
|
|
|
#include <tuple>
|
|
|
|
#include <iostream>
|
2016-01-13 19:07:13 +01:00
|
|
|
#include <memory>
|
2015-11-23 21:33:17 +01:00
|
|
|
// Qt
|
2015-09-20 11:39:25 +02:00
|
|
|
#include <QDebug>
|
2015-11-23 21:33:17 +01:00
|
|
|
#include <QTest>
|
|
|
|
#include <QSignalSpy>
|
2015-12-28 13:21:02 +01:00
|
|
|
#include <QTimer>
|
|
|
|
#include <QApplication>
|
|
|
|
#include <QQuickWindow>
|
2015-12-29 12:12:45 +01:00
|
|
|
#include <QQmlApplicationEngine>
|
|
|
|
#include <QQuickItem>
|
2016-01-16 11:29:35 +01:00
|
|
|
#include <QQmlContext>
|
2016-06-18 20:16:26 +02:00
|
|
|
#include <QtQuickTest/QtQuickTest>
|
|
|
|
|
2015-11-23 21:33:17 +01:00
|
|
|
// DOtherSide
|
2016-06-19 11:46:47 +02:00
|
|
|
#include <DOtherSide/DOtherSide.h>
|
|
|
|
#include <DOtherSide/DosQObject.h>
|
|
|
|
#include <DOtherSide/DosQMetaObject.h>
|
|
|
|
#include <DOtherSide/DosQObject.h>
|
|
|
|
#include <DOtherSide/DosQAbstractListModel.h>
|
|
|
|
|
|
|
|
#include "MockQObject.h"
|
2016-06-19 17:13:06 +02:00
|
|
|
#include "MockQAbstractListModel.h"
|
2015-09-19 19:13:08 +02:00
|
|
|
|
2016-06-18 21:17:28 +02:00
|
|
|
using namespace std;
|
2016-01-23 19:32:55 +01:00
|
|
|
using namespace DOS;
|
|
|
|
|
2015-12-28 13:21:02 +01:00
|
|
|
template<typename Test>
|
2016-01-23 19:08:58 +01:00
|
|
|
bool ExecuteTest(int argc, char *argv[])
|
|
|
|
{
|
2015-12-28 13:21:02 +01:00
|
|
|
Test test;
|
|
|
|
return QTest::qExec(&test, argc, argv) == 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
template<typename Test>
|
2016-01-23 19:08:58 +01:00
|
|
|
bool ExecuteGuiTest(int argc, char *argv[])
|
|
|
|
{
|
2015-12-28 13:21:02 +01:00
|
|
|
QApplication app(argc, argv);
|
|
|
|
Test test;
|
|
|
|
return QTest::qExec(&test, argc, argv) == 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Test QGuiApplication
|
|
|
|
*/
|
|
|
|
class TestQGuiApplication : public QObject
|
2015-09-20 11:39:25 +02:00
|
|
|
{
|
2015-12-28 13:21:02 +01:00
|
|
|
Q_OBJECT
|
2015-12-28 13:46:32 +01:00
|
|
|
|
2015-12-28 13:21:02 +01:00
|
|
|
private slots:
|
2016-01-23 19:08:58 +01:00
|
|
|
void testExecution()
|
|
|
|
{
|
2015-12-28 13:21:02 +01:00
|
|
|
bool quit = false;
|
|
|
|
dos_qguiapplication_create();
|
2016-01-29 22:27:55 +01:00
|
|
|
QTimer timer;
|
|
|
|
QObject::connect(&timer, &QTimer::timeout, [&quit]() {
|
2016-06-18 20:16:26 +02:00
|
|
|
quit = true;
|
|
|
|
dos_qguiapplication_quit();
|
|
|
|
});
|
2016-01-29 22:27:55 +01:00
|
|
|
timer.start(100);
|
2015-12-28 13:21:02 +01:00
|
|
|
dos_qguiapplication_exec();
|
|
|
|
QVERIFY(quit);
|
|
|
|
dos_qguiapplication_delete();
|
|
|
|
}
|
2015-09-20 11:39:25 +02:00
|
|
|
};
|
|
|
|
|
2015-12-28 13:21:02 +01:00
|
|
|
/*
|
|
|
|
* Test QApplication
|
|
|
|
*/
|
|
|
|
class TestQApplication : public QObject
|
2015-09-19 19:13:08 +02:00
|
|
|
{
|
|
|
|
Q_OBJECT
|
2015-12-28 13:46:32 +01:00
|
|
|
|
2015-12-28 13:21:02 +01:00
|
|
|
private slots:
|
2016-01-23 19:08:58 +01:00
|
|
|
void testExecution()
|
|
|
|
{
|
2015-12-28 13:21:02 +01:00
|
|
|
bool quit = false;
|
|
|
|
dos_qapplication_create();
|
2016-01-29 22:27:55 +01:00
|
|
|
QTimer timer;
|
|
|
|
QObject::connect(&timer, &QTimer::timeout, [&quit]() {
|
2016-06-18 20:16:26 +02:00
|
|
|
quit = true;
|
|
|
|
dos_qapplication_quit();
|
|
|
|
});
|
2016-01-29 22:27:55 +01:00
|
|
|
timer.start(100);
|
2015-12-28 13:21:02 +01:00
|
|
|
dos_qapplication_exec();
|
|
|
|
QVERIFY(quit);
|
|
|
|
dos_qapplication_delete();
|
|
|
|
}
|
|
|
|
};
|
2015-09-19 19:13:08 +02:00
|
|
|
|
2015-12-28 13:21:02 +01:00
|
|
|
/*
|
|
|
|
* Test QQmlApplicationEngine
|
|
|
|
*/
|
|
|
|
class TestQQmlApplicationEngine : public QObject
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
2015-12-28 13:46:32 +01:00
|
|
|
|
2015-09-19 19:13:08 +02:00
|
|
|
private slots:
|
2016-01-23 19:08:58 +01:00
|
|
|
void initTestCase()
|
|
|
|
{
|
2015-12-28 13:21:02 +01:00
|
|
|
m_engine = nullptr;
|
2015-09-19 19:13:08 +02:00
|
|
|
}
|
|
|
|
|
2016-01-23 19:08:58 +01:00
|
|
|
void cleanupTestCase()
|
|
|
|
{
|
2015-12-28 13:46:32 +01:00
|
|
|
QVERIFY(m_engine == nullptr);
|
|
|
|
}
|
|
|
|
|
2016-01-23 19:08:58 +01:00
|
|
|
void init()
|
|
|
|
{
|
2015-12-28 13:21:02 +01:00
|
|
|
QVERIFY(m_engine == nullptr);
|
2016-02-27 16:05:23 +01:00
|
|
|
m_engine = dos_qqmlapplicationengine_create();
|
2015-12-28 13:21:02 +01:00
|
|
|
QVERIFY(m_engine != nullptr);
|
|
|
|
}
|
2015-09-19 19:13:08 +02:00
|
|
|
|
2016-01-23 19:08:58 +01:00
|
|
|
void cleanup()
|
|
|
|
{
|
2015-12-28 13:21:02 +01:00
|
|
|
dos_qqmlapplicationengine_delete(m_engine);
|
|
|
|
m_engine = nullptr;
|
2015-09-19 19:13:08 +02:00
|
|
|
}
|
|
|
|
|
2016-01-23 19:08:58 +01:00
|
|
|
void testCreateAndDelete()
|
|
|
|
{
|
2015-12-29 12:12:45 +01:00
|
|
|
// Implicit by invoking init and cleanup
|
2015-09-19 19:13:08 +02:00
|
|
|
}
|
|
|
|
|
2016-01-23 19:08:58 +01:00
|
|
|
void testLoadUrl()
|
|
|
|
{
|
2016-02-27 16:05:23 +01:00
|
|
|
void *url = dos_qurl_create("qrc:///main.qml", QUrl::TolerantMode);
|
2015-12-28 13:21:02 +01:00
|
|
|
QVERIFY(url != nullptr);
|
|
|
|
dos_qqmlapplicationengine_load_url(m_engine, url);
|
2015-12-29 12:12:45 +01:00
|
|
|
QCOMPARE(engine()->rootObjects().size(), 1);
|
|
|
|
QCOMPARE(engine()->rootObjects().front()->objectName(), QString::fromLocal8Bit("testWindow"));
|
|
|
|
QVERIFY(engine()->rootObjects().front()->isWindowType());
|
2015-12-28 13:21:02 +01:00
|
|
|
dos_qurl_delete(url);
|
2015-09-19 19:13:08 +02:00
|
|
|
}
|
2015-09-20 11:39:25 +02:00
|
|
|
|
2016-01-23 19:08:58 +01:00
|
|
|
void testLoadData()
|
|
|
|
{
|
2016-01-30 15:03:59 +01:00
|
|
|
dos_qqmlapplicationengine_load_data(m_engine, "import QtQuick 2.3; import QtQuick.Controls 1.2; ApplicationWindow { objectName: \"testWindow\"}");
|
2015-12-29 12:12:45 +01:00
|
|
|
QCOMPARE(engine()->rootObjects().size(), 1);
|
|
|
|
QCOMPARE(engine()->rootObjects().front()->objectName(), QString::fromLocal8Bit("testWindow"));
|
|
|
|
QVERIFY(engine()->rootObjects().front()->isWindowType());
|
|
|
|
}
|
|
|
|
|
2015-12-28 13:21:02 +01:00
|
|
|
private:
|
2016-01-23 19:08:58 +01:00
|
|
|
QQmlApplicationEngine *engine()
|
|
|
|
{
|
|
|
|
return static_cast<QQmlApplicationEngine *>(m_engine);
|
|
|
|
}
|
2015-12-29 12:12:45 +01:00
|
|
|
|
2016-01-23 19:08:58 +01:00
|
|
|
void *m_engine;
|
2015-12-28 13:21:02 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Test QQmlContext
|
|
|
|
*/
|
2015-12-28 13:46:32 +01:00
|
|
|
class TestQQmlContext : public QObject
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
2015-12-28 13:21:02 +01:00
|
|
|
|
2015-12-28 13:46:32 +01:00
|
|
|
private slots:
|
2016-01-23 19:08:58 +01:00
|
|
|
void initTestCase()
|
|
|
|
{
|
2015-12-28 13:46:32 +01:00
|
|
|
m_engine = nullptr;
|
|
|
|
m_context = nullptr;
|
|
|
|
}
|
|
|
|
|
2016-01-23 19:08:58 +01:00
|
|
|
void cleanupTestCase()
|
|
|
|
{
|
2015-12-28 13:46:32 +01:00
|
|
|
QVERIFY(m_engine == nullptr);
|
|
|
|
QVERIFY(m_context == nullptr);
|
|
|
|
}
|
|
|
|
|
2016-01-23 19:08:58 +01:00
|
|
|
void init()
|
|
|
|
{
|
2016-02-27 16:05:23 +01:00
|
|
|
m_engine = dos_qqmlapplicationengine_create();
|
|
|
|
m_context = dos_qqmlapplicationengine_context(m_engine);
|
2015-12-28 13:46:32 +01:00
|
|
|
QVERIFY(m_engine != nullptr);
|
|
|
|
QVERIFY(m_context != nullptr);
|
|
|
|
}
|
|
|
|
|
2016-01-23 19:08:58 +01:00
|
|
|
void cleanup()
|
|
|
|
{
|
2015-12-28 13:46:32 +01:00
|
|
|
m_context = nullptr;
|
|
|
|
dos_qqmlapplicationengine_delete(m_engine);
|
|
|
|
m_engine = nullptr;
|
|
|
|
}
|
|
|
|
|
2016-01-23 19:08:58 +01:00
|
|
|
void testCreateAndDelete()
|
|
|
|
{
|
2015-12-29 12:12:45 +01:00
|
|
|
// Implicit by invoking init and cleanup
|
|
|
|
}
|
|
|
|
|
2016-01-23 19:08:58 +01:00
|
|
|
void testSetContextProperty()
|
|
|
|
{
|
2015-12-29 12:12:45 +01:00
|
|
|
QVariant testData("Test Message");
|
|
|
|
dos_qqmlcontext_setcontextproperty(m_context, "testData", &testData);
|
2016-01-30 15:03:59 +01:00
|
|
|
engine()->loadData("import QtQuick 2.3; Text { objectName: \"label\"; text: testData } ");
|
2016-01-23 19:08:58 +01:00
|
|
|
QObject *label = engine()->rootObjects().first();
|
2015-12-29 12:12:45 +01:00
|
|
|
QVERIFY(label != nullptr);
|
|
|
|
QCOMPARE(label->objectName(), QString::fromLocal8Bit("label"));
|
|
|
|
QCOMPARE(label->property("text").toString(), testData.toString());
|
|
|
|
}
|
|
|
|
|
2015-12-28 13:46:32 +01:00
|
|
|
private:
|
2016-01-23 19:08:58 +01:00
|
|
|
QQmlApplicationEngine *engine()
|
|
|
|
{
|
|
|
|
return static_cast<QQmlApplicationEngine *>(m_engine);
|
|
|
|
}
|
|
|
|
QQmlContext *context()
|
|
|
|
{
|
|
|
|
return static_cast<QQmlContext *>(m_context);
|
|
|
|
}
|
2015-12-29 12:12:45 +01:00
|
|
|
|
2016-01-23 19:08:58 +01:00
|
|
|
void *m_engine;
|
|
|
|
void *m_context;
|
2015-12-28 13:21:02 +01:00
|
|
|
};
|
|
|
|
|
2016-06-18 21:17:28 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Test QQmlContext
|
|
|
|
*/
|
|
|
|
class TestQObject : public QObject
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
private slots:
|
|
|
|
void init()
|
|
|
|
{
|
|
|
|
testObject.reset(new MockQObject());
|
|
|
|
testObject->setObjectName("testObject");
|
|
|
|
testObject->setName("foo");
|
|
|
|
|
|
|
|
engine.reset(new QQmlApplicationEngine());
|
|
|
|
engine->rootContext()->setContextProperty("testObject", QVariant::fromValue<QObject*>(static_cast<QObject*>(testObject->data())));
|
|
|
|
engine->load(QUrl("qrc:///testQObject.qml"));
|
2016-06-07 22:52:29 +02:00
|
|
|
}
|
|
|
|
|
2016-06-18 21:17:28 +02:00
|
|
|
void cleanup()
|
2016-06-07 22:52:29 +02:00
|
|
|
{
|
2016-06-18 21:17:28 +02:00
|
|
|
engine.reset();
|
|
|
|
testObject.reset();
|
|
|
|
}
|
|
|
|
|
|
|
|
void testObjectName() {
|
|
|
|
QObject* testCase = engine->rootObjects().first();
|
|
|
|
QVERIFY(testCase);
|
|
|
|
QVariant result;
|
|
|
|
QVERIFY(QMetaObject::invokeMethod(testCase, "testObjectName", Q_RETURN_ARG(QVariant, result)));
|
|
|
|
QVERIFY(result.type() == QVariant::Bool);
|
|
|
|
QVERIFY(result.toBool());
|
2016-06-07 22:52:29 +02:00
|
|
|
}
|
|
|
|
|
2016-06-18 21:17:28 +02:00
|
|
|
void testPropertyReadAndWrite()
|
2016-06-18 20:16:26 +02:00
|
|
|
{
|
2016-06-18 21:17:28 +02:00
|
|
|
QObject* testCase = engine->rootObjects().first();
|
2016-06-18 20:16:26 +02:00
|
|
|
QVERIFY(testCase);
|
|
|
|
QVariant result;
|
|
|
|
QVERIFY(QMetaObject::invokeMethod(testCase, "testPropertyReadAndWrite", Q_RETURN_ARG(QVariant, result)));
|
|
|
|
QVERIFY(result.type() == QVariant::Bool);
|
|
|
|
QVERIFY(result.toBool());
|
|
|
|
}
|
|
|
|
|
2016-06-18 21:17:28 +02:00
|
|
|
void testSignalEmittion()
|
2016-06-18 20:16:26 +02:00
|
|
|
{
|
2016-06-18 21:17:28 +02:00
|
|
|
QObject* testCase = engine->rootObjects().first();
|
2016-06-18 20:16:26 +02:00
|
|
|
QVERIFY(testCase);
|
|
|
|
QVariant result;
|
|
|
|
QVERIFY(QMetaObject::invokeMethod(testCase, "testSignalEmittion", Q_RETURN_ARG(QVariant, result)));
|
|
|
|
QVERIFY(result.type() == QVariant::Bool);
|
|
|
|
QVERIFY(result.toBool());
|
|
|
|
}
|
|
|
|
|
2016-06-07 22:52:29 +02:00
|
|
|
private:
|
|
|
|
QString value;
|
2016-06-18 21:17:28 +02:00
|
|
|
unique_ptr<MockQObject> testObject;
|
|
|
|
unique_ptr<QQmlApplicationEngine> engine;
|
2016-01-23 19:32:55 +01:00
|
|
|
};
|
2016-01-13 22:01:11 +01:00
|
|
|
|
2016-01-23 19:32:55 +01:00
|
|
|
/*
|
|
|
|
* Test QQmlContext
|
|
|
|
*/
|
|
|
|
class TestQAbstractListModel : public QObject
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
2016-01-13 19:07:13 +01:00
|
|
|
|
2016-01-23 19:32:55 +01:00
|
|
|
private slots:
|
2016-06-10 22:13:51 +02:00
|
|
|
void init()
|
2016-01-23 19:32:55 +01:00
|
|
|
{
|
2016-06-19 17:13:06 +02:00
|
|
|
testObject.reset(new MockQAbstractListModel());
|
2016-06-19 17:53:31 +02:00
|
|
|
testObject->setObjectName("testObject");
|
|
|
|
testObject->setName("foo");
|
|
|
|
|
2016-06-19 17:13:06 +02:00
|
|
|
engine.reset(new QQmlApplicationEngine());
|
|
|
|
engine->rootContext()->setContextProperty("testObject", QVariant::fromValue<QObject*>(static_cast<QObject*>(testObject->data())));
|
|
|
|
engine->load(QUrl("qrc:///testQAbstractItemModel.qml"));
|
2016-06-10 22:13:51 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void cleanup()
|
|
|
|
{
|
2016-06-19 17:13:06 +02:00
|
|
|
engine.reset();
|
2016-06-10 22:13:51 +02:00
|
|
|
testObject.reset();
|
|
|
|
}
|
2016-01-23 19:32:55 +01:00
|
|
|
|
2016-06-19 17:53:31 +02:00
|
|
|
void testObjectName() {
|
|
|
|
QObject* testCase = engine->rootObjects().first();
|
|
|
|
QVERIFY(testCase);
|
|
|
|
QVariant result;
|
|
|
|
QVERIFY(QMetaObject::invokeMethod(testCase, "testObjectName", Q_RETURN_ARG(QVariant, result)));
|
|
|
|
QVERIFY(result.type() == QVariant::Bool);
|
|
|
|
QVERIFY(result.toBool());
|
|
|
|
}
|
|
|
|
|
|
|
|
void testPropertyReadAndWrite()
|
|
|
|
{
|
|
|
|
QObject* testCase = engine->rootObjects().first();
|
|
|
|
QVERIFY(testCase);
|
|
|
|
QVariant result;
|
|
|
|
QVERIFY(QMetaObject::invokeMethod(testCase, "testPropertyReadAndWrite", Q_RETURN_ARG(QVariant, result)));
|
|
|
|
QVERIFY(result.type() == QVariant::Bool);
|
|
|
|
QVERIFY(result.toBool());
|
|
|
|
}
|
|
|
|
|
|
|
|
void testSignalEmittion()
|
|
|
|
{
|
|
|
|
QObject* testCase = engine->rootObjects().first();
|
|
|
|
QVERIFY(testCase);
|
|
|
|
QVariant result;
|
|
|
|
QVERIFY(QMetaObject::invokeMethod(testCase, "testSignalEmittion", Q_RETURN_ARG(QVariant, result)));
|
|
|
|
QVERIFY(result.type() == QVariant::Bool);
|
|
|
|
QVERIFY(result.toBool());
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-06-19 17:13:06 +02:00
|
|
|
void testRowCount() {
|
|
|
|
QObject* testCase = engine->rootObjects().first();
|
|
|
|
QVERIFY(testCase);
|
|
|
|
QVariant result;
|
|
|
|
QVERIFY(QMetaObject::invokeMethod(testCase, "testRowCount", Q_RETURN_ARG(QVariant, result)));
|
|
|
|
QVERIFY(result.type() == QVariant::Bool);
|
|
|
|
QVERIFY(result.toBool());
|
2016-06-10 22:13:51 +02:00
|
|
|
}
|
2016-01-23 19:32:55 +01:00
|
|
|
|
2016-06-19 17:13:06 +02:00
|
|
|
void testColumnCount() {
|
|
|
|
QObject* testCase = engine->rootObjects().first();
|
|
|
|
QVERIFY(testCase);
|
|
|
|
QVariant result;
|
|
|
|
QVERIFY(QMetaObject::invokeMethod(testCase, "testColumnCount", Q_RETURN_ARG(QVariant, result)));
|
|
|
|
QVERIFY(result.type() == QVariant::Bool);
|
|
|
|
QVERIFY(result.toBool());
|
2016-06-10 22:13:51 +02:00
|
|
|
}
|
|
|
|
|
2016-06-19 17:13:06 +02:00
|
|
|
void testData() {
|
|
|
|
QObject* testCase = engine->rootObjects().first();
|
|
|
|
QVERIFY(testCase);
|
|
|
|
QVariant result;
|
|
|
|
QVERIFY(QMetaObject::invokeMethod(testCase, "testData", Q_RETURN_ARG(QVariant, result)));
|
|
|
|
QVERIFY(result.type() == QVariant::Bool);
|
|
|
|
QVERIFY(result.toBool());
|
2016-01-23 19:32:55 +01:00
|
|
|
}
|
2016-06-10 22:13:51 +02:00
|
|
|
|
2016-06-19 18:17:48 +02:00
|
|
|
void testSetData() {
|
|
|
|
QObject* testCase = engine->rootObjects().first();
|
|
|
|
QVERIFY(testCase);
|
|
|
|
QVariant result;
|
|
|
|
QVERIFY(QMetaObject::invokeMethod(testCase, "testSetData", Q_RETURN_ARG(QVariant, result)));
|
|
|
|
QVERIFY(result.type() == QVariant::Bool);
|
|
|
|
QVERIFY(result.toBool());
|
|
|
|
}
|
|
|
|
|
2016-06-10 22:13:51 +02:00
|
|
|
|
|
|
|
private:
|
|
|
|
QString value;
|
2016-06-19 17:13:06 +02:00
|
|
|
unique_ptr<MockQAbstractListModel> testObject;
|
|
|
|
unique_ptr<QQmlApplicationEngine> engine;
|
2016-01-23 19:32:55 +01:00
|
|
|
};
|
2016-01-16 11:29:35 +01:00
|
|
|
|
2016-01-23 19:32:55 +01:00
|
|
|
int main(int argc, char *argv[])
|
|
|
|
{
|
|
|
|
using namespace DOS;
|
2016-01-16 11:29:35 +01:00
|
|
|
|
2016-01-23 19:32:55 +01:00
|
|
|
bool success = true;
|
|
|
|
success &= ExecuteTest<TestQGuiApplication>(argc, argv);
|
|
|
|
success &= ExecuteTest<TestQApplication>(argc, argv);
|
|
|
|
success &= ExecuteGuiTest<TestQQmlApplicationEngine>(argc, argv);
|
|
|
|
success &= ExecuteGuiTest<TestQQmlContext>(argc, argv);
|
|
|
|
success &= ExecuteGuiTest<TestQObject>(argc, argv);
|
|
|
|
success &= ExecuteGuiTest<TestQAbstractListModel>(argc, argv);
|
|
|
|
|
|
|
|
return success ? 0 : 1;
|
2015-12-28 13:21:02 +01:00
|
|
|
}
|
2015-09-19 19:13:08 +02:00
|
|
|
|
2015-12-28 13:46:32 +01:00
|
|
|
#include "test_dotherside.moc"
|