From 4660a36e8d58be0ad283bed2b0fb906ee8c9a731 Mon Sep 17 00:00:00 2001 From: Filippo Cucchetto Date: Sun, 19 Jun 2016 18:17:48 +0200 Subject: [PATCH] Work on MockQAbstractListModel --- lib/include/DOtherSide/DOtherSide.h | 28 +++++++++++++------- lib/src/DOtherSide.cpp | 40 ++++++++++++++--------------- test/MockQAbstractListModel.cpp | 17 +++++++++++- test/testQAbstractItemModel.qml | 17 ++++++++++++ test/test_dotherside.cpp | 9 +++++++ 5 files changed, 81 insertions(+), 30 deletions(-) diff --git a/lib/include/DOtherSide/DOtherSide.h b/lib/include/DOtherSide/DOtherSide.h index 7f31a24..2dabc07 100644 --- a/lib/include/DOtherSide/DOtherSide.h +++ b/lib/include/DOtherSide/DOtherSide.h @@ -79,15 +79,15 @@ DOS_API void DOS_CALL dos_qvariant_setFloat (DosQVariant *vptr, float value); DOS_API void DOS_CALL dos_qvariant_setDouble (DosQVariant *vptr, double value); DOS_API void DOS_CALL dos_qvariant_setString (DosQVariant *vptr, const char *value); DOS_API void DOS_CALL dos_qvariant_setQObject(DosQVariant *vptr, DosQObject *value); -DOS_API bool DOS_CALL dos_qvariant_isnull (DosQVariant *vptr); +DOS_API bool DOS_CALL dos_qvariant_isnull (const DosQVariant *vptr); DOS_API void DOS_CALL dos_qvariant_delete (DosQVariant *vptr); -DOS_API void DOS_CALL dos_qvariant_assign (DosQVariant *vptr, DosQVariant *other); -DOS_API int DOS_CALL dos_qvariant_toInt (DosQVariant *vptr); -DOS_API bool DOS_CALL dos_qvariant_toBool (DosQVariant *vptr); -DOS_API char *DOS_CALL dos_qvariant_toString (DosQVariant *vptr); -DOS_API float DOS_CALL dos_qvariant_toFloat (DosQVariant *vptr); -DOS_API double DOS_CALL dos_qvariant_toDouble (DosQVariant *vptr); -DOS_API DosQObject *DOS_CALL dos_qvariant_toQObject(DosQVariant *vptr); +DOS_API void DOS_CALL dos_qvariant_assign (DosQVariant *vptr, const DosQVariant *other); +DOS_API int DOS_CALL dos_qvariant_toInt (const DosQVariant *vptr); +DOS_API bool DOS_CALL dos_qvariant_toBool (const DosQVariant *vptr); +DOS_API char *DOS_CALL dos_qvariant_toString (const DosQVariant *vptr); +DOS_API float DOS_CALL dos_qvariant_toFloat (const DosQVariant *vptr); +DOS_API double DOS_CALL dos_qvariant_toDouble (const DosQVariant *vptr); +DOS_API DosQObject *DOS_CALL dos_qvariant_toQObject(const DosQVariant *vptr); // QMetaObject DOS_API DosQMetaObject *DOS_CALL dos_qmetaobject_create(DosQMetaObject *superClassMetaObject, @@ -115,7 +115,17 @@ DOS_API void DOS_CALL dos_qabstractlistmodel_beginRemoveRows(DosQAbstractListMod DOS_API void DOS_CALL dos_qabstractlistmodel_endRemoveRows (DosQAbstractListModel *vptr); DOS_API void DOS_CALL dos_qabstractlistmodel_beginResetModel(DosQAbstractListModel *vptr); DOS_API void DOS_CALL dos_qabstractlistmodel_endResetModel (DosQAbstractListModel *vptr); -DOS_API void DOS_CALL dos_qabstractlistmodel_dataChanged (DosQAbstractListModel *vptr, DosQModelIndex *topLeft, DosQModelIndex *bottomRight, int *rolesPtr, int rolesLength); + +/// Emit the dataChanged signal +/// @param vptr The DosQAbstractListModel pointer +/// @param topLeft The topLeft DosQModelIndex. The index is owned by the caller thus it will not be deleted +/// @param bottomRight The bottomright DosQModelIndex. The index is owned by the caller thus it will not be deleted +/// @param rolesPtr The roles array. The pointer is owned by the caller and thus it will not be deleted +/// @param rolesLength The roles array length +DOS_API void DOS_CALL dos_qabstractlistmodel_dataChanged(DosQAbstractListModel *vptr, + const DosQModelIndex *topLeft, + const DosQModelIndex *bottomRight, + int *rolesPtr, int rolesLength); // QObject DOS_API DosQMetaObject *DOS_CALL dos_qobject_qmetaobject(); diff --git a/lib/src/DOtherSide.cpp b/lib/src/DOtherSide.cpp index a38a944..2d0a318 100644 --- a/lib/src/DOtherSide.cpp +++ b/lib/src/DOtherSide.cpp @@ -239,9 +239,9 @@ void dos_qqmlcontext_setcontextproperty(::DosQQmlContext *vptr, const char *name return new QVariant(value); } -bool dos_qvariant_isnull(::DosQVariant *vptr) +bool dos_qvariant_isnull(const DosQVariant *vptr) { - auto variant = static_cast(vptr); + auto variant = static_cast(vptr); return variant->isNull(); } @@ -251,46 +251,46 @@ void dos_qvariant_delete(::DosQVariant *vptr) delete variant; } -void dos_qvariant_assign(::DosQVariant *vptr, ::DosQVariant *other) +void dos_qvariant_assign(::DosQVariant *vptr, const DosQVariant *other) { auto leftQVariant = static_cast(vptr); - auto rightQVariant = static_cast(other); + auto rightQVariant = static_cast(other); *leftQVariant = *rightQVariant; } -int dos_qvariant_toInt(::DosQVariant *vptr) +int dos_qvariant_toInt(const ::DosQVariant *vptr) { - auto variant = static_cast(vptr); + auto variant = static_cast(vptr); return variant->toInt(); } -bool dos_qvariant_toBool(::DosQVariant *vptr) +bool dos_qvariant_toBool(const ::DosQVariant *vptr) { - auto variant = static_cast(vptr); + auto variant = static_cast(vptr); return variant->toBool(); } -float dos_qvariant_toFloat(::DosQVariant *vptr) +float dos_qvariant_toFloat(const DosQVariant *vptr) { - auto variant = static_cast(vptr); + auto variant = static_cast(vptr); return variant->toFloat(); } -double dos_qvariant_toDouble(::DosQVariant *vptr) +double dos_qvariant_toDouble(const DosQVariant *vptr) { - auto variant = static_cast(vptr); + auto variant = static_cast(vptr); return variant->toDouble(); } -char *dos_qvariant_toString(::DosQVariant *vptr) +char *dos_qvariant_toString(const DosQVariant *vptr) { - auto variant = static_cast(vptr); + auto variant = static_cast(vptr); return convert_to_cstring(variant->toString()); } -::DosQObject *dos_qvariant_toQObject(::DosQVariant *vptr) +::DosQObject *dos_qvariant_toQObject(const DosQVariant *vptr) { - auto variant = static_cast(vptr); + auto variant = static_cast(vptr); return variant->value(); } @@ -612,15 +612,15 @@ void dos_qabstractlistmodel_endResetModel(::DosQAbstractListModel *vptr) } void dos_qabstractlistmodel_dataChanged(::DosQAbstractListModel *vptr, - ::DosQModelIndex *topLeftIndex, - ::DosQModelIndex *bottomRightIndex, + const ::DosQModelIndex *topLeftIndex, + const ::DosQModelIndex *bottomRightIndex, int *rolesArrayPtr, int rolesArrayLength) { auto object = static_cast(vptr); auto model = dynamic_cast(object); - auto topLeft = static_cast(topLeftIndex); - auto bottomRight = static_cast(bottomRightIndex); + auto topLeft = static_cast(topLeftIndex); + auto bottomRight = static_cast(bottomRightIndex); auto roles = QVector::fromStdVector(std::vector(rolesArrayPtr, rolesArrayPtr + rolesArrayLength)); model->publicDataChanged(*topLeft, *bottomRight, roles); } diff --git a/test/MockQAbstractListModel.cpp b/test/MockQAbstractListModel.cpp index 9a0134e..11187f2 100644 --- a/test/MockQAbstractListModel.cpp +++ b/test/MockQAbstractListModel.cpp @@ -5,7 +5,7 @@ using namespace std; namespace { - std::string toStringFromQVariant(DosQVariant* variant) { + std::string toStringFromQVariant(const DosQVariant* variant) { CharPointer charArray(dos_qvariant_toString(variant), &dos_chararray_delete); return std::string(charArray.get()); } @@ -163,7 +163,22 @@ void MockQAbstractListModel::onDataCalled(void *selfVPtr, const DosQModelIndex * void MockQAbstractListModel::onSetDataCalled(void *selfVPtr, const DosQModelIndex *index, const DosQVariant *value, int role, bool *result) { + auto self = static_cast(selfVPtr); + *result = false; + if (!dos_qmodelindex_isValid(index)) + return; + + const int row = dos_qmodelindex_row(index); + const int column = dos_qmodelindex_column(index); + + if (row < 0 || row >= self->m_names.size() || column != 0) + return; + + self->m_names[row] = toStringFromQVariant(value); + dos_qabstractlistmodel_dataChanged(self->data(), index, index, 0, 0); + + *result = true; } void MockQAbstractListModel::onRoleNamesCalled(void *selfVPtr, DosQHashIntQByteArray *result) diff --git a/test/testQAbstractItemModel.qml b/test/testQAbstractItemModel.qml index 3578b4f..b91c6d2 100644 --- a/test/testQAbstractItemModel.qml +++ b/test/testQAbstractItemModel.qml @@ -44,4 +44,21 @@ QtObject { && testObject.data(testObject.index(2,0, null)) === "Andy" && testObject.data(testObject.index(3,0, null)) === "Anna" } + + function testSetData() { + if (!testObject) + return false + var index = testObject.index(0,0, null) + if (!index.valid) + return false; + if (testObject.data(index) !== "John") + return false + var dataChanged = false + testObject.dataChanged.connect(function(topLeft, bottomRight, role) { + dataChanged = topLeft === index && bottomRight === index + }) + if (!testObject.setData(index, "Paul")) + return false + return testObject.data(index) === "Paul"; + } } diff --git a/test/test_dotherside.cpp b/test/test_dotherside.cpp index 876eb73..e9a70e1 100644 --- a/test/test_dotherside.cpp +++ b/test/test_dotherside.cpp @@ -362,6 +362,15 @@ private slots: QVERIFY(result.toBool()); } + 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()); + } + private: QString value;