Added qmlRegisterType test

This commit is contained in:
Filippo Cucchetto 2016-06-21 23:15:58 +02:00
parent 4660a36e8d
commit 81cc90cf3a
6 changed files with 116 additions and 12 deletions

View File

@ -20,6 +20,7 @@ add_executable(${PROJECT_NAME} Resources.qrc
main.qml
testQObject.qml
testQAbstractItemModel.qml
testQDeclarative.qml
)
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 14)
target_link_libraries(${PROJECT_NAME} DOtherSideStatic Qt5::Quick Qt5::Widgets Qt5::Test Qt5::Core)

View File

@ -61,6 +61,24 @@ namespace {
}
}
MockQObject::MockQObject()
: m_vptr(dos_qobject_create(this, metaObject(), &onSlotCalled), &dos_qobject_delete)
{}
MockQObject::~MockQObject() = default;
DosQMetaObject *MockQObject::staticMetaObject()
{
static VoidPointer result = initializeMetaObject();
return result.get();
}
::DosQMetaObject *MockQObject::metaObject()
{
return staticMetaObject();
}
std::string MockQObject::objectName() const
{
CharPointer result (dos_qobject_objectName(m_vptr.get()), &dos_chararray_delete);
@ -72,21 +90,16 @@ void MockQObject::setObjectName(const string &objectName)
dos_qobject_setObjectName(m_vptr.get(), objectName.c_str());
}
MockQObject::MockQObject()
: m_vptr(dos_qobject_create(this, metaObject(), &onSlotCalled), &dos_qobject_delete)
{}
::DosQMetaObject *MockQObject::metaObject()
{
static VoidPointer result = initializeMetaObject();
return result.get();
}
::DosQObject *MockQObject::data()
{
return m_vptr.get();
}
void MockQObject::swapData(VoidPointer &data)
{
std::swap(m_vptr, data);
}
std::string MockQObject::name() const
{
return m_name;

View File

@ -6,9 +6,13 @@ class MockQObject
{
public:
MockQObject();
virtual ~MockQObject();
static ::DosQMetaObject *staticMetaObject();
virtual ::DosQMetaObject *metaObject();
::DosQMetaObject *metaObject();
::DosQObject *data();
void swapData(VoidPointer &data);
std::string objectName() const;
void setObjectName(const std::string& objectName);

View File

@ -3,5 +3,6 @@
<file>main.qml</file>
<file>testQAbstractItemModel.qml</file>
<file>testQObject.qml</file>
<file>testQDeclarative.qml</file>
</qresource>
</RCC>

36
test/testQDeclarative.qml Normal file
View File

@ -0,0 +1,36 @@
import QtQuick 2.3
import MockModule 1.0
Item {
id: testCase
objectName: "testCase"
Component {
id: mockQObjectComponent
MockQObject {}
}
function testQmlRegisterType() {
var testObject = mockQObjectComponent.createObject(testCase, {"name":"foo"})
if (!testObject)
return false
if (testObject.name !== "foo") {
testObject.destroy()
return false
}
var nameChangedEmitted = false
testObject.nameChanged.connect(function(name){nameChangedEmitted = name === "bar"});
testObject.name = "bar"
if (!nameChangedEmitted || !testObject.name !== "bar") {
testObject.destroy()
return false
}
testObject.destroy()
return true
}
}

View File

@ -334,7 +334,6 @@ private slots:
QVERIFY(result.toBool());
}
void testRowCount() {
QObject* testCase = engine->rootObjects().first();
QVERIFY(testCase);
@ -378,6 +377,55 @@ private:
unique_ptr<QQmlApplicationEngine> engine;
};
/*
* Test QQmlContext
*/
class TestQDeclarativeIntegration : public QObject
{
Q_OBJECT
private slots:
void testQmlRegisterType() {
::QmlRegisterType registerType;
registerType.major = 1;
registerType.minor = 0;
registerType.uri = "MockModule";
registerType.qml = "MockQObject";
registerType.staticMetaObject = MockQObject::staticMetaObject();
registerType.createDObject = &mockQObjectCreator;
registerType.deleteDObject = &mockQObjectDeleter;
dos_qdeclarative_qmlregistertype(&registerType);
auto engine = std::make_unique<QQmlApplicationEngine>();
engine->load(QUrl("qrc:///testQDeclarative.qml"));
QObject* testCase = engine->rootObjects().first();
QVERIFY(testCase);
QVariant result;
QVERIFY(QMetaObject::invokeMethod(testCase, "testQmlRegisterType", Q_RETURN_ARG(QVariant, result)));
QVERIFY(result.type() == QVariant::Bool);
QVERIFY(result.toBool());
}
private:
static void mockQObjectCreator(int typeId, void *wrapper, void **mockQObjectPtr, void **dosQObject)
{
VoidPointer data(wrapper, &emptyVoidDeleter);
auto mockQObject = new MockQObject();
mockQObject->swapData(data);
*dosQObject = data.release();
*mockQObjectPtr = mockQObject;
}
static void mockQObjectDeleter(int typeId, void *mockQObject)
{
auto temp = static_cast<MockQObject*>(mockQObject);
delete temp;
}
static void emptyVoidDeleter(void*) {}
};
int main(int argc, char *argv[])
{
using namespace DOS;
@ -389,6 +437,7 @@ int main(int argc, char *argv[])
success &= ExecuteGuiTest<TestQQmlContext>(argc, argv);
success &= ExecuteGuiTest<TestQObject>(argc, argv);
success &= ExecuteGuiTest<TestQAbstractListModel>(argc, argv);
success &= ExecuteGuiTest<TestQDeclarativeIntegration>(argc, argv);
return success ? 0 : 1;
}