diff --git a/lib/include/DOtherSide/DOtherSideTypes.h b/lib/include/DOtherSide/DOtherSideTypes.h index 8058070..03cc444 100644 --- a/lib/include/DOtherSide/DOtherSideTypes.h +++ b/lib/include/DOtherSide/DOtherSideTypes.h @@ -29,10 +29,10 @@ typedef void DosQObject; typedef void (DOS_CALL *Function)(void *); /// Called when a slot should be executed -/// @param self the pointer to the QObject in the binded language -/// @param slotName a reference to QVariant. It should not be deleted. -/// @param argc the number of arguments -/// @param argv an array of QVariant pointers. They should not be deleted +/// @param self The pointer to the QObject in the binded language +/// @param slotName The slotName as DosQVariant. It should not be deleted +/// @param argc The number of arguments +/// @param argv An array of DosQVariant pointers. They should not be deleted typedef void (DOS_CALL *DObjectCallback)(void *self, DosQVariant *slotName, int argc, DosQVariant **argv); typedef void (DOS_CALL *RowCountCallback) (DosQAbstractListModel *model, const DosQModelIndex *index, int *result); diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 279ba4b..177947b 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -12,6 +12,14 @@ find_package(Qt5Test REQUIRED) find_package(Qt5Quick REQUIRED) find_package(Qt5QuickTest REQUIRED) -add_executable(${PROJECT_NAME} Resources.qrc test_dotherside.cpp main.qml testQObject.qml testQAbstractItemModel.qml) +add_executable(${PROJECT_NAME} Resources.qrc + test_dotherside.cpp + MockQObject.cpp + MockQAbstractListModel.cpp + Global.h + main.qml + testQObject.qml + testQAbstractItemModel.qml +) set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 14) target_link_libraries(${PROJECT_NAME} DOtherSideStatic Qt5::Quick Qt5::Widgets Qt5::Test Qt5::Core) diff --git a/test/Global.h b/test/Global.h new file mode 100644 index 0000000..a526007 --- /dev/null +++ b/test/Global.h @@ -0,0 +1,15 @@ +#pragma once + +#include +#include + +#include + +extern "C" { + typedef void DOS_CALL(*VoidDeleter)(void*); + typedef void DOS_CALL(*CharDeleter)(char*); +} + +using VoidPointer = std::unique_ptr; +using CharPointer = std::unique_ptr; + diff --git a/test/MockQAbstractListModel.cpp b/test/MockQAbstractListModel.cpp new file mode 100644 index 0000000..996bdff --- /dev/null +++ b/test/MockQAbstractListModel.cpp @@ -0,0 +1,96 @@ +#include "MockQAbstractListModel.h" + +using namespace std; + +namespace +{ + std::string toStringFromQVariant(DosQVariant* variant) { + CharPointer charArray(dos_qvariant_toString(variant), &dos_chararray_delete); + return std::string(charArray.get()); + } + + VoidPointer initializeMetaObject() + { + void* superClassMetaObject = dos_qabstractlistmodel_qmetaobject(); + + // Signals + ::SignalDefinitions signalDefinitions; + signalDefinitions.count = 0; + signalDefinitions.definitions = nullptr; + + // Slots + ::SlotDefinitions slotDefinitions; + slotDefinitions.count = 0; + slotDefinitions.definitions = nullptr; + + // Properties + ::PropertyDefinition propertyDefinitionArray[1]; + + ::PropertyDefinitions propertyDefinitions; + propertyDefinitions.count = 0; + propertyDefinitions.definitions = nullptr; + + return VoidPointer(dos_qmetaobject_create(superClassMetaObject, "MockQObject", &signalDefinitions, &slotDefinitions, &propertyDefinitions), + &dos_qmetaobject_delete); + } +} + +MockQAbstractListModel::MockQAbstractListModel() + : m_vptr(dos_qabstractlistmodel_create(this, metaObject(), &onSlotCalled, &onRowCountCalled, + &onColumnCountCalled, &onDataCalled, &onSetDataCalled, + &onRoleNamesCalled, &onFlagsCalled, &onHeaderDataCalled), &dos_qobject_delete) +{ + +} + +DosQMetaObject *MockQAbstractListModel::metaObject() +{ + static VoidPointer result = initializeMetaObject(); + return result.get(); +} + +DosQObject *MockQAbstractListModel::data() +{ + return m_vptr.get(); +} + +void MockQAbstractListModel::onSlotCalled(void *selfVPtr, DosQVariant *dosSlotNameVariant, int dosSlotArgc, DosQVariant **dosSlotArgv) +{ + auto self = static_cast(selfVPtr); + string slotName = toStringFromQVariant(dosSlotNameVariant); +} + +void MockQAbstractListModel::onRowCountCalled(DosQAbstractListModel *model, const DosQModelIndex *index, int *result) +{ + +} + +void MockQAbstractListModel::onColumnCountCalled(DosQAbstractListModel *model, const DosQModelIndex *index, int *result) +{ + +} + +void MockQAbstractListModel::onDataCalled(DosQAbstractListModel *model, const DosQModelIndex *index, int role, DosQVariant *result) +{ + +} + +void MockQAbstractListModel::onSetDataCalled(DosQAbstractListModel *model, const DosQModelIndex *index, const DosQVariant *value, int role, bool *result) +{ + +} + +void MockQAbstractListModel::onRoleNamesCalled(DosQAbstractListModel *model, DosQHashIntQByteArray *result) +{ + +} + +void MockQAbstractListModel::onFlagsCalled(DosQAbstractListModel *model, const DosQModelIndex *index, int *result) +{ + +} + +void MockQAbstractListModel::onHeaderDataCalled(DosQAbstractListModel *model, int section, int orientation, int role, DosQVariant *result) +{ + +} diff --git a/test/MockQAbstractListModel.h b/test/MockQAbstractListModel.h new file mode 100644 index 0000000..c7f5045 --- /dev/null +++ b/test/MockQAbstractListModel.h @@ -0,0 +1,24 @@ +#pragma once + +#include + +class MockQAbstractListModel +{ +public: + MockQAbstractListModel(); + + DosQMetaObject *metaObject(); + DosQObject *data(); + +private: + static void onSlotCalled(void *selfVPtr, DosQVariant *dosSlotNameVariant, int dosSlotArgc, DosQVariant **dosSlotArgv); + static void onRowCountCalled(DosQAbstractListModel *model, const DosQModelIndex *index, int *result); + static void onColumnCountCalled(DosQAbstractListModel *model, const DosQModelIndex *index, int *result); + static void onDataCalled(DosQAbstractListModel *model, const DosQModelIndex *index, int role, DosQVariant *result); + static void onSetDataCalled(DosQAbstractListModel *model, const DosQModelIndex *index, const DosQVariant *value, int role, bool *result); + static void onRoleNamesCalled(DosQAbstractListModel *model, DosQHashIntQByteArray *result); + static void onFlagsCalled(DosQAbstractListModel *model, const DosQModelIndex *index, int *result); + static void onHeaderDataCalled(DosQAbstractListModel *model, int section, int orientation, int role, DosQVariant *result); + + VoidPointer m_vptr; +}; diff --git a/test/MockQObject.cpp b/test/MockQObject.cpp new file mode 100644 index 0000000..63cb00f --- /dev/null +++ b/test/MockQObject.cpp @@ -0,0 +1,126 @@ +#include +#include +#include + +using namespace std; + +namespace { + std::string toStringFromQVariant(DosQVariant* variant) { + CharPointer charArray(dos_qvariant_toString(variant), &dos_chararray_delete); + return std::string(charArray.get()); + } + + VoidPointer initializeMetaObject() + { + void* superClassMetaObject = dos_qobject_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 = 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 = 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 = 1; + propertyDefinitions.definitions = propertyDefinitionArray; + + return VoidPointer(dos_qmetaobject_create(superClassMetaObject, "MockQObject", &signalDefinitions, &slotDefinitions, &propertyDefinitions), + &dos_qmetaobject_delete); + } +} + +std::string MockQObject::objectName() const +{ + CharPointer result (dos_qobject_objectName(m_vptr.get()), &dos_chararray_delete); + return string(result.get()); +} + +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(); +} + +std::string MockQObject::name() const +{ + return m_name; +} + +void MockQObject::setName(const string &name) +{ + if (name == m_name) + return; + m_name = name; + nameChanged(name); +} + +void MockQObject::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 MockQObject::onSlotCalled(void *selfVPtr, DosQVariant *dosSlotNameVariant, int dosSlotArgc, DosQVariant **dosSlotArgv) { + MockQObject* 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; + } +} diff --git a/test/MockQObject.h b/test/MockQObject.h new file mode 100644 index 0000000..549232c --- /dev/null +++ b/test/MockQObject.h @@ -0,0 +1,25 @@ +#pragma once + +#include + +class MockQObject +{ +public: + MockQObject(); + + ::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); + + VoidPointer m_vptr; + std::string m_name; +}; diff --git a/test/test_dotherside.cpp b/test/test_dotherside.cpp index 034f90c..a9d64e7 100644 --- a/test/test_dotherside.cpp +++ b/test/test_dotherside.cpp @@ -15,11 +15,13 @@ #include // DOtherSide -#include "DOtherSide/DOtherSide.h" -#include "DOtherSide/DosQObject.h" -#include "DOtherSide/DosQMetaObject.h" -#include "DOtherSide/DosQObject.h" -#include "DOtherSide/DosQAbstractListModel.h" +#include +#include +#include +#include +#include + +#include "MockQObject.h" using namespace std; using namespace DOS; @@ -216,138 +218,6 @@ private: void *m_context; }; -extern "C" { - typedef void DOS_CALL(*VoidDeleter)(void*); - typedef void DOS_CALL(*CharDeleter)(char*); -} -using VoidPointer = unique_ptr; -using CharPointer = unique_ptr; - - -string toStringFromQVariant(DosQVariant* variant) { - CharPointer charArray(dos_qvariant_toString(variant), &dos_chararray_delete); - return string(charArray.get()); -} - -class MockQObject -{ - -public: - MockQObject() - : m_vptr(dos_qobject_create(this, metaObject(), &onSlotCalled), &dos_qobject_delete) - {} - - std::string objectName() const { - CharPointer result (dos_qobject_objectName(m_vptr.get()), &dos_chararray_delete); - return string(result.get()); - } - - void setObjectName(const string& objectName) { - dos_qobject_setObjectName(m_vptr.get(), objectName.c_str()); - } - - ::DosQMetaObject *metaObject() { - static VoidPointer result = initializeMetaObject(); - return result.get(); - } - - ::DosQObject *data() { - return m_vptr.get(); - } - - std::string name() const - { - return m_name; - } - - void setName(const string& name) - { - if (name == m_name) - return; - m_name = name; - - } - - void 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]); - } - -private: - - static void onSlotCalled(void *selfVPtr, DosQVariant *dosSlotNameVariant, int dosSlotArgc, DosQVariant **dosSlotArgv) { - MockQObject* 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; - } - } - - static VoidPointer initializeMetaObject() { - void* superClassMetaObject = dos_qobject_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 = 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 = 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 = 1; - propertyDefinitions.definitions = propertyDefinitionArray; - - return VoidPointer(dos_qmetaobject_create(superClassMetaObject, "MockQObject", &signalDefinitions, &slotDefinitions, &propertyDefinitions), - &dos_qmetaobject_delete); - } - - VoidPointer m_vptr; - std::string m_name; -}; - /* * Test QQmlContext