From 2f6faca901442631299af0c0d15b3edf257f225b Mon Sep 17 00:00:00 2001 From: Andreas Buhr Date: Wed, 16 Feb 2022 11:34:27 +0100 Subject: Add tests to QAbstractItemModelTester checking only one change in flight This patch adds checks to QAbstractItemModelTester checking that only one change is in flight at a time. Change-Id: I15fe1ad1274649aa652ed6489a889df72c8a8292 Reviewed-by: David Faure Reviewed-by: Qt CI Bot --- src/testlib/qabstractitemmodeltester.cpp | 206 +++++++++++++++++++++++++++++++ 1 file changed, 206 insertions(+) (limited to 'src/testlib/qabstractitemmodeltester.cpp') diff --git a/src/testlib/qabstractitemmodeltester.cpp b/src/testlib/qabstractitemmodeltester.cpp index 9582361b4f..fd211b3fc5 100644 --- a/src/testlib/qabstractitemmodeltester.cpp +++ b/src/testlib/qabstractitemmodeltester.cpp @@ -77,10 +77,28 @@ public: void data(); void runAllTests(); + void layoutAboutToBeChanged(); void layoutChanged(); + + void modelAboutToBeReset(); + void modelReset(); + + void columnsAboutToBeInserted(const QModelIndex &parent, int first, int last); + void columnsInserted(const QModelIndex &parent, int first, int last); + void columnsAboutToBeMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, + const QModelIndex &destinationParent, int destinationColumn); + void columnsMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destination, + int column); + void columnsAboutToBeRemoved(const QModelIndex &parent, int first, int last); + void columnsRemoved(const QModelIndex &parent, int first, int last); + void rowsAboutToBeInserted(const QModelIndex &parent, int start, int end); void rowsInserted(const QModelIndex &parent, int start, int end); + void rowsAboutToBeMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, + const QModelIndex &destinationParent, int destinationRow); + void rowsMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destination, + int row); void rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end); void rowsRemoved(const QModelIndex &parent, int start, int end); void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight); @@ -110,6 +128,19 @@ private: bool fetchingMore; + enum class ChangeInFlight { + None, + ColumnsInserted, + ColumnsMoved, + ColumnsRemoved, + LayoutChanged, + ModelReset, + RowsInserted, + RowsMoved, + RowsRemoved + }; + ChangeInFlight changeInFlight = ChangeInFlight::None; + QList changing; }; @@ -252,14 +283,45 @@ QAbstractItemModelTester::QAbstractItemModelTester(QAbstractItemModel *model, Fa connect(model, &QAbstractItemModel::layoutChanged, this, [d]{ d->layoutChanged(); }); + // column operations + connect(model, &QAbstractItemModel::columnsAboutToBeInserted, + this, [d](const QModelIndex &parent, int start, int end) { d->columnsAboutToBeInserted(parent, start, end); }); + connect(model, &QAbstractItemModel::columnsAboutToBeMoved, + this, [d](const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationColumn) { + d->columnsAboutToBeMoved(sourceParent, sourceStart, sourceEnd, destinationParent, destinationColumn); }); + connect(model, &QAbstractItemModel::columnsAboutToBeRemoved, + this, [d](const QModelIndex &parent, int start, int end) { d->columnsAboutToBeRemoved(parent, start, end); }); + connect(model, &QAbstractItemModel::columnsInserted, + this, [d](const QModelIndex &parent, int start, int end) { d->columnsInserted(parent, start, end); }); + connect(model, &QAbstractItemModel::columnsMoved, + this, [d](const QModelIndex &parent, int start, int end, const QModelIndex &destination, int col) { + d->columnsMoved(parent, start, end, destination, col); }); + connect(model, &QAbstractItemModel::columnsRemoved, + this, [d](const QModelIndex &parent, int start, int end) { d->columnsRemoved(parent, start, end); }); + + // row operations connect(model, &QAbstractItemModel::rowsAboutToBeInserted, this, [d](const QModelIndex &parent, int start, int end) { d->rowsAboutToBeInserted(parent, start, end); }); + connect(model, &QAbstractItemModel::rowsAboutToBeMoved, + this, [d](const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationRow) { + d->rowsAboutToBeMoved(sourceParent, sourceStart, sourceEnd, destinationParent, destinationRow); }); connect(model, &QAbstractItemModel::rowsAboutToBeRemoved, this, [d](const QModelIndex &parent, int start, int end) { d->rowsAboutToBeRemoved(parent, start, end); }); connect(model, &QAbstractItemModel::rowsInserted, this, [d](const QModelIndex &parent, int start, int end) { d->rowsInserted(parent, start, end); }); + connect(model, &QAbstractItemModel::rowsMoved, + this, [d](const QModelIndex &parent, int start, int end, const QModelIndex &destination, int row) { + d->rowsMoved(parent, start, end, destination, row); }); connect(model, &QAbstractItemModel::rowsRemoved, this, [d](const QModelIndex &parent, int start, int end) { d->rowsRemoved(parent, start, end); }); + + // reset + connect(model, &QAbstractItemModel::modelAboutToBeReset, + this, [d]() { d->modelAboutToBeReset(); }); + connect(model, &QAbstractItemModel::modelReset, + this, [d]() { d->modelReset(); }); + + // data connect(model, &QAbstractItemModel::dataChanged, this, [d](const QModelIndex &topLeft, const QModelIndex &bottomRight) { d->dataChanged(topLeft, bottomRight); }); connect(model, &QAbstractItemModel::headerDataChanged, @@ -631,6 +693,89 @@ void QAbstractItemModelTesterPrivate::data() return; } +void QAbstractItemModelTesterPrivate::columnsAboutToBeInserted(const QModelIndex &parent, int start, + int end) +{ + MODELTESTER_COMPARE(changeInFlight, ChangeInFlight::None); + changeInFlight = ChangeInFlight::ColumnsInserted; + + qCDebug(lcModelTest) << "columnsAboutToBeInserted" + << "start=" << start << "end=" << end << "parent=" << parent + << "parent data=" << model->data(parent).toString() + << "current count of parent=" << model->rowCount(parent) + << "last before insertion=" << model->index(start - 1, 0, parent) + << model->data(model->index(start - 1, 0, parent)); +} + +void QAbstractItemModelTesterPrivate::columnsInserted(const QModelIndex &parent, int first, + int last) +{ + MODELTESTER_COMPARE(changeInFlight, ChangeInFlight::ColumnsInserted); + changeInFlight = ChangeInFlight::None; + + qCDebug(lcModelTest) << "columnsInserted" + << "start=" << first << "end=" << last << "parent=" << parent + << "parent data=" << model->data(parent).toString() + << "current count of parent=" << model->rowCount(parent); +} + +void QAbstractItemModelTesterPrivate::columnsAboutToBeMoved(const QModelIndex &sourceParent, + int sourceStart, int sourceEnd, + const QModelIndex &destinationParent, + int destinationColumn) +{ + MODELTESTER_COMPARE(changeInFlight, ChangeInFlight::None); + changeInFlight = ChangeInFlight::ColumnsMoved; + + qCDebug(lcModelTest) << "columnsAboutToBeMoved" + << "sourceStart=" << sourceStart << "sourceEnd=" << sourceEnd + << "sourceParent=" << sourceParent + << "sourceParent data=" << model->data(sourceParent).toString() + << "destinationParent=" << destinationParent + << "destinationColumn=" << destinationColumn; +} + +void QAbstractItemModelTesterPrivate::columnsMoved(const QModelIndex &sourceParent, int sourceStart, + int sourceEnd, + const QModelIndex &destinationParent, + int destinationColumn) +{ + MODELTESTER_COMPARE(changeInFlight, ChangeInFlight::ColumnsMoved); + changeInFlight = ChangeInFlight::None; + + qCDebug(lcModelTest) << "columnsAboutToBeMoved" + << "sourceStart=" << sourceStart << "sourceEnd=" << sourceEnd + << "sourceParent=" << sourceParent + << "sourceParent data=" << model->data(sourceParent).toString() + << "destinationParent=" << destinationParent + << "destinationColumn=" << destinationColumn; +} + +void QAbstractItemModelTesterPrivate::columnsAboutToBeRemoved(const QModelIndex &parent, int first, + int last) +{ + MODELTESTER_COMPARE(changeInFlight, ChangeInFlight::None); + changeInFlight = ChangeInFlight::ColumnsRemoved; + + qCDebug(lcModelTest) << "columnsAboutToBeRemoved" + << "start=" << first << "end=" << last << "parent=" << parent + << "parent data=" << model->data(parent).toString() + << "current count of parent=" << model->rowCount(parent) + << "last before removal=" << model->index(first - 1, 0, parent) + << model->data(model->index(first - 1, 0, parent)); +} + +void QAbstractItemModelTesterPrivate::columnsRemoved(const QModelIndex &parent, int first, int last) +{ + MODELTESTER_COMPARE(changeInFlight, ChangeInFlight::ColumnsRemoved); + changeInFlight = ChangeInFlight::None; + + qCDebug(lcModelTest) << "columnsRemoved" + << "start=" << first << "end=" << last << "parent=" << parent + << "parent data=" << model->data(parent).toString() + << "current count of parent=" << model->rowCount(parent); +} + /* Store what is about to be inserted to make sure it actually happens @@ -638,6 +783,9 @@ void QAbstractItemModelTesterPrivate::data() */ void QAbstractItemModelTesterPrivate::rowsAboutToBeInserted(const QModelIndex &parent, int start, int end) { + MODELTESTER_COMPARE(changeInFlight, ChangeInFlight::None); + changeInFlight = ChangeInFlight::RowsInserted; + qCDebug(lcModelTest) << "rowsAboutToBeInserted" << "start=" << start << "end=" << end << "parent=" << parent << "parent data=" << model->data(parent).toString() @@ -659,6 +807,9 @@ void QAbstractItemModelTesterPrivate::rowsAboutToBeInserted(const QModelIndex &p */ void QAbstractItemModelTesterPrivate::rowsInserted(const QModelIndex &parent, int start, int end) { + MODELTESTER_COMPARE(changeInFlight, ChangeInFlight::RowsInserted); + changeInFlight = ChangeInFlight::None; + qCDebug(lcModelTest) << "rowsInserted" << "start=" << start << "end=" << end << "parent=" << parent << "parent data=" << model->data(parent).toString() @@ -689,14 +840,51 @@ void QAbstractItemModelTesterPrivate::rowsInserted(const QModelIndex &parent, in } } +void QAbstractItemModelTesterPrivate::rowsAboutToBeMoved(const QModelIndex &sourceParent, + int sourceStart, int sourceEnd, + const QModelIndex &destinationParent, + int destinationRow) +{ + MODELTESTER_COMPARE(changeInFlight, ChangeInFlight::None); + changeInFlight = ChangeInFlight::RowsMoved; + + qCDebug(lcModelTest) << "rowsAboutToBeMoved" + << "sourceStart=" << sourceStart << "sourceEnd=" << sourceEnd + << "sourceParent=" << sourceParent + << "sourceParent data=" << model->data(sourceParent).toString() + << "destinationParent=" << destinationParent + << "destinationColumn=" << destinationRow; +} + +void QAbstractItemModelTesterPrivate::rowsMoved(const QModelIndex &sourceParent, int sourceStart, + int sourceEnd, const QModelIndex &destinationParent, + int destinationRow) +{ + MODELTESTER_COMPARE(changeInFlight, ChangeInFlight::RowsMoved); + changeInFlight = ChangeInFlight::None; + + qCDebug(lcModelTest) << "rowsMoved" + << "sourceStart=" << sourceStart << "sourceEnd=" << sourceEnd + << "sourceParent=" << sourceParent + << "sourceParent data=" << model->data(sourceParent).toString() + << "destinationParent=" << destinationParent + << "destinationColumn=" << destinationRow; +} + void QAbstractItemModelTesterPrivate::layoutAboutToBeChanged() { + MODELTESTER_COMPARE(changeInFlight, ChangeInFlight::None); + changeInFlight = ChangeInFlight::LayoutChanged; + for (int i = 0; i < qBound(0, model->rowCount(), 100); ++i) changing.append(QPersistentModelIndex(model->index(i, 0))); } void QAbstractItemModelTesterPrivate::layoutChanged() { + MODELTESTER_COMPARE(changeInFlight, ChangeInFlight::LayoutChanged); + changeInFlight = ChangeInFlight::None; + for (int i = 0; i < changing.count(); ++i) { QPersistentModelIndex p = changing[i]; MODELTESTER_COMPARE(model->index(p.row(), p.column(), p.parent()), QModelIndex(p)); @@ -704,6 +892,18 @@ void QAbstractItemModelTesterPrivate::layoutChanged() changing.clear(); } +void QAbstractItemModelTesterPrivate::modelAboutToBeReset() +{ + MODELTESTER_COMPARE(changeInFlight, ChangeInFlight::None); + changeInFlight = ChangeInFlight::ModelReset; +} + +void QAbstractItemModelTesterPrivate::modelReset() +{ + MODELTESTER_COMPARE(changeInFlight, ChangeInFlight::ModelReset); + changeInFlight = ChangeInFlight::None; +} + /* Store what is about to be inserted to make sure it actually happens @@ -711,6 +911,9 @@ void QAbstractItemModelTesterPrivate::layoutChanged() */ void QAbstractItemModelTesterPrivate::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) { + MODELTESTER_COMPARE(changeInFlight, ChangeInFlight::None); + changeInFlight = ChangeInFlight::RowsRemoved; + qCDebug(lcModelTest) << "rowsAboutToBeRemoved" << "start=" << start << "end=" << end << "parent=" << parent << "parent data=" << model->data(parent).toString() @@ -741,6 +944,9 @@ void QAbstractItemModelTesterPrivate::rowsAboutToBeRemoved(const QModelIndex &pa */ void QAbstractItemModelTesterPrivate::rowsRemoved(const QModelIndex &parent, int start, int end) { + MODELTESTER_COMPARE(changeInFlight, ChangeInFlight::RowsRemoved); + changeInFlight = ChangeInFlight::None; + qCDebug(lcModelTest) << "rowsRemoved" << "start=" << start << "end=" << end << "parent=" << parent << "parent data=" << model->data(parent).toString() -- cgit v1.2.3