dotherside/test/test_dotherside.cpp

397 lines
10 KiB
C++
Raw Normal View History

// std
#include <tuple>
#include <iostream>
2016-01-13 19:07:13 +01:00
#include <memory>
// Qt
#include <QDebug>
#include <QTest>
#include <QSignalSpy>
#include <QTimer>
#include <QApplication>
#include <QQuickWindow>
#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>
// 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"
using namespace std;
2016-01-23 19:32:55 +01:00
using namespace DOS;
template<typename Test>
2016-01-23 19:08:58 +01:00
bool ExecuteTest(int argc, char *argv[])
{
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[])
{
QApplication app(argc, argv);
Test test;
return QTest::qExec(&test, argc, argv) == 0;
}
/*
* Test QGuiApplication
*/
class TestQGuiApplication : public QObject
{
Q_OBJECT
private slots:
2016-01-23 19:08:58 +01:00
void testExecution()
{
bool quit = false;
dos_qguiapplication_create();
QTimer timer;
QObject::connect(&timer, &QTimer::timeout, [&quit]() {
2016-06-18 20:16:26 +02:00
quit = true;
dos_qguiapplication_quit();
});
timer.start(100);
dos_qguiapplication_exec();
QVERIFY(quit);
dos_qguiapplication_delete();
}
};
/*
* Test QApplication
*/
class TestQApplication : public QObject
{
Q_OBJECT
private slots:
2016-01-23 19:08:58 +01:00
void testExecution()
{
bool quit = false;
dos_qapplication_create();
QTimer timer;
QObject::connect(&timer, &QTimer::timeout, [&quit]() {
2016-06-18 20:16:26 +02:00
quit = true;
dos_qapplication_quit();
});
timer.start(100);
dos_qapplication_exec();
QVERIFY(quit);
dos_qapplication_delete();
}
};
/*
* Test QQmlApplicationEngine
*/
class TestQQmlApplicationEngine : public QObject
{
Q_OBJECT
private slots:
2016-01-23 19:08:58 +01:00
void initTestCase()
{
m_engine = nullptr;
}
2016-01-23 19:08:58 +01:00
void cleanupTestCase()
{
QVERIFY(m_engine == nullptr);
}
2016-01-23 19:08:58 +01:00
void init()
{
QVERIFY(m_engine == nullptr);
2016-02-27 16:05:23 +01:00
m_engine = dos_qqmlapplicationengine_create();
QVERIFY(m_engine != nullptr);
}
2016-01-23 19:08:58 +01:00
void cleanup()
{
dos_qqmlapplicationengine_delete(m_engine);
m_engine = nullptr;
}
2016-01-23 19:08:58 +01:00
void testCreateAndDelete()
{
// Implicit by invoking init and cleanup
}
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);
QVERIFY(url != nullptr);
dos_qqmlapplicationengine_load_url(m_engine, url);
QCOMPARE(engine()->rootObjects().size(), 1);
QCOMPARE(engine()->rootObjects().front()->objectName(), QString::fromLocal8Bit("testWindow"));
QVERIFY(engine()->rootObjects().front()->isWindowType());
dos_qurl_delete(url);
}
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\"}");
QCOMPARE(engine()->rootObjects().size(), 1);
QCOMPARE(engine()->rootObjects().front()->objectName(), QString::fromLocal8Bit("testWindow"));
QVERIFY(engine()->rootObjects().front()->isWindowType());
}
private:
2016-01-23 19:08:58 +01:00
QQmlApplicationEngine *engine()
{
return static_cast<QQmlApplicationEngine *>(m_engine);
}
2016-01-23 19:08:58 +01:00
void *m_engine;
};
/*
* Test QQmlContext
*/
class TestQQmlContext : public QObject
{
Q_OBJECT
private slots:
2016-01-23 19:08:58 +01:00
void initTestCase()
{
m_engine = nullptr;
m_context = nullptr;
}
2016-01-23 19:08:58 +01:00
void cleanupTestCase()
{
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);
QVERIFY(m_engine != nullptr);
QVERIFY(m_context != nullptr);
}
2016-01-23 19:08:58 +01:00
void cleanup()
{
m_context = nullptr;
dos_qqmlapplicationengine_delete(m_engine);
m_engine = nullptr;
}
2016-01-23 19:08:58 +01:00
void testCreateAndDelete()
{
// Implicit by invoking init and cleanup
}
2016-01-23 19:08:58 +01:00
void testSetContextProperty()
{
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();
QVERIFY(label != nullptr);
QCOMPARE(label->objectName(), QString::fromLocal8Bit("label"));
QCOMPARE(label->property("text").toString(), testData.toString());
}
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);
}
2016-01-23 19:08:58 +01:00
void *m_engine;
void *m_context;
};
/*
* 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
}
void cleanup()
2016-06-07 22:52:29 +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
}
void testPropertyReadAndWrite()
2016-06-18 20:16:26 +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());
}
void testSignalEmittion()
2016-06-18 20:16:26 +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;
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;
}
#include "test_dotherside.moc"