diff --git a/test/MockQAbstractListModel.cpp b/test/MockQAbstractListModel.cpp index ec2b922..9a0134e 100644 --- a/test/MockQAbstractListModel.cpp +++ b/test/MockQAbstractListModel.cpp @@ -1,4 +1,5 @@ #include "MockQAbstractListModel.h" +#include using namespace std; @@ -14,19 +15,48 @@ namespace void* superClassMetaObject = dos_qabstractlistmodel_qmetaobject(); // Signals + ::SignalDefinition signalDefinitionArray[1]; + + signalDefinitionArray[0].name = "nameChanged"; + signalDefinitionArray[0].parametersCount = 1; + int nameChanged[1]; + nameChanged[0] = QMetaType::QString; + signalDefinitionArray[0].parametersMetaTypes = nameChanged; + ::SignalDefinitions signalDefinitions; - signalDefinitions.count = 0; - signalDefinitions.definitions = nullptr; + signalDefinitions.count = 1; + signalDefinitions.definitions = signalDefinitionArray; // Slots + ::SlotDefinition slotDefinitionArray[2]; + + slotDefinitionArray[0].name = "name"; + slotDefinitionArray[0].returnMetaType = QMetaType::QString; + slotDefinitionArray[0].parametersCount = 0; + slotDefinitionArray[0].parametersMetaTypes = nullptr; + + slotDefinitionArray[1].name = "setName"; + slotDefinitionArray[1].returnMetaType = QMetaType::Void; + int setNameParameters[1]; + setNameParameters[0] = QMetaType::QString; + slotDefinitionArray[1].parametersCount = 1; + slotDefinitionArray[1].parametersMetaTypes = setNameParameters; + ::SlotDefinitions slotDefinitions; - slotDefinitions.count = 0; - slotDefinitions.definitions = nullptr; + slotDefinitions.count = 2; + slotDefinitions.definitions = slotDefinitionArray; // Properties + ::PropertyDefinition propertyDefinitionArray[1]; + propertyDefinitionArray[0].name = "name"; + propertyDefinitionArray[0].notifySignal = "nameChanged"; + propertyDefinitionArray[0].propertyMetaType = QMetaType::QString; + propertyDefinitionArray[0].readSlot = "name"; + propertyDefinitionArray[0].writeSlot = "setName"; + ::PropertyDefinitions propertyDefinitions; - propertyDefinitions.count = 0; - propertyDefinitions.definitions = nullptr; + propertyDefinitions.count = 1; + propertyDefinitions.definitions = propertyDefinitionArray; return VoidPointer(dos_qmetaobject_create(superClassMetaObject, "MockQAbstractListModel", &signalDefinitions, &slotDefinitions, &propertyDefinitions), &dos_qmetaobject_delete); @@ -53,10 +83,54 @@ DosQObject *MockQAbstractListModel::data() return m_vptr.get(); } +string MockQAbstractListModel::objectName() const +{ + CharPointer result (dos_qobject_objectName(m_vptr.get()), &dos_chararray_delete); + return string(result.get()); +} + +void MockQAbstractListModel::setObjectName(const string &objectName) +{ + dos_qobject_setObjectName(m_vptr.get(), objectName.c_str()); +} + +string MockQAbstractListModel::name() const +{ + return m_name; +} + +void MockQAbstractListModel::setName(const string &name) +{ + if (m_name == name) + return; + m_name = name; + nameChanged(name); +} + +void MockQAbstractListModel::nameChanged(const string &name) +{ + int argc = 1; + DosQVariant* argv[1]; + argv[0] = dos_qvariant_create_string(name.c_str()); + dos_qobject_signal_emit(m_vptr.get(), "nameChanged", argc, argv); + dos_qvariant_delete(argv[0]); +} + void MockQAbstractListModel::onSlotCalled(void *selfVPtr, DosQVariant *dosSlotNameVariant, int dosSlotArgc, DosQVariant **dosSlotArgv) { auto self = static_cast(selfVPtr); string slotName = toStringFromQVariant(dosSlotNameVariant); + + if (slotName == "name") { + VoidPointer name(dos_qvariant_create_string(self->name().c_str()), &dos_qvariant_delete); + dos_qvariant_assign(dosSlotArgv[0], name.get()); + return; + } + + if (slotName == "setName") { + self->setName(toStringFromQVariant(dosSlotArgv[1])); + return; + } } void MockQAbstractListModel::onRowCountCalled(void *selfVPtr, const DosQModelIndex *index, int *result) diff --git a/test/MockQAbstractListModel.h b/test/MockQAbstractListModel.h index e646961..a4f54b1 100644 --- a/test/MockQAbstractListModel.h +++ b/test/MockQAbstractListModel.h @@ -12,6 +12,13 @@ public: DosQMetaObject *metaObject(); DosQObject *data(); + std::string objectName() const; + void setObjectName(const std::string& objectName); + + std::string name() const; + void setName(const std::string& name); + void nameChanged(const std::string& name); + private: static void onSlotCalled(void *selfVPtr, DosQVariant *dosSlotNameVariant, int dosSlotArgc, DosQVariant **dosSlotArgv); static void onRowCountCalled(void *selfVPtr, const DosQModelIndex *index, int *result); @@ -23,5 +30,6 @@ private: static void onHeaderDataCalled(void *selfVPtr, int section, int orientation, int role, DosQVariant *result); VoidPointer m_vptr; + std::string m_name; std::vector m_names; }; diff --git a/test/testQAbstractItemModel.qml b/test/testQAbstractItemModel.qml index fdd01b6..3578b4f 100644 --- a/test/testQAbstractItemModel.qml +++ b/test/testQAbstractItemModel.qml @@ -4,6 +4,32 @@ QtObject { id: testCase objectName: "testCase" + function testObjectName() { + return testObject && testObject.objectName === "testObject" + } + + function testPropertyReadAndWrite() { + if (!testObject) + return false + if (testObject.name !== "foo") + return false + testObject.name = "bar" + if (testObject.name !== "bar") + return false + return true + } + + function testSignalEmittion() { + if (!testObject) + return false + if (testObject.name !== "foo") + return false + var result = false + testObject.nameChanged.connect(function(name){ result = name === "bar" }) + testObject.name = "bar" + return result + } + function testRowCount() { return testObject && testObject.rowCount() === 4 } diff --git a/test/testQObject.qml b/test/testQObject.qml index 7bb5eda..46fc33d 100644 --- a/test/testQObject.qml +++ b/test/testQObject.qml @@ -5,9 +5,7 @@ QtObject { objectName: "testCase" function testObjectName() { - if (!testObject) - return false; - return testObject.objectName === "testObject" + return testObject && testObject.objectName === "testObject" } function testPropertyReadAndWrite() { diff --git a/test/test_dotherside.cpp b/test/test_dotherside.cpp index b20af36..876eb73 100644 --- a/test/test_dotherside.cpp +++ b/test/test_dotherside.cpp @@ -291,6 +291,9 @@ private slots: void init() { testObject.reset(new MockQAbstractListModel()); + testObject->setObjectName("testObject"); + testObject->setName("foo"); + engine.reset(new QQmlApplicationEngine()); engine->rootContext()->setContextProperty("testObject", QVariant::fromValue(static_cast(testObject->data()))); engine->load(QUrl("qrc:///testQAbstractItemModel.qml")); @@ -302,6 +305,36 @@ private slots: 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()); + } + + 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()); + } + + void testRowCount() { QObject* testCase = engine->rootObjects().first(); QVERIFY(testCase);