32class QAbstractItemModelTesterPrivate :
public QObjectPrivate
34 Q_DECLARE_PUBLIC(QAbstractItemModelTester)
36 QAbstractItemModelTesterPrivate(QAbstractItemModel *model, QAbstractItemModelTester::FailureReportingMode failureReportingMode);
38 void nonDestructiveBasicTest();
39 void rowAndColumnCount();
47 void layoutAboutToBeChanged();
50 void modelAboutToBeReset();
53 void columnsAboutToBeInserted(
const QModelIndex &parent,
int first,
int last);
54 void columnsInserted(
const QModelIndex &parent,
int first,
int last);
55 void columnsAboutToBeMoved(
const QModelIndex &sourceParent,
int sourceStart,
int sourceEnd,
56 const QModelIndex &destinationParent,
int destinationColumn);
57 void columnsMoved(
const QModelIndex &parent,
int start,
int end,
const QModelIndex &destination,
59 void columnsAboutToBeRemoved(
const QModelIndex &parent,
int first,
int last);
60 void columnsRemoved(
const QModelIndex &parent,
int first,
int last);
62 void rowsAboutToBeInserted(
const QModelIndex &parent,
int start,
int end);
63 void rowsInserted(
const QModelIndex &parent,
int start,
int end);
64 void rowsAboutToBeMoved(
const QModelIndex &sourceParent,
int sourceStart,
int sourceEnd,
65 const QModelIndex &destinationParent,
int destinationRow);
66 void rowsMoved(
const QModelIndex &parent,
int start,
int end,
const QModelIndex &destination,
68 void rowsAboutToBeRemoved(
const QModelIndex &parent,
int start,
int end);
69 void rowsRemoved(
const QModelIndex &parent,
int start,
int end);
70 void dataChanged(
const QModelIndex &topLeft,
const QModelIndex &bottomRight);
71 void headerDataChanged(Qt::Orientation orientation,
int start,
int end);
74 QString safeParentData(
const QModelIndex &parent)
const;
76 void checkChildren(
const QModelIndex &parent,
int currentDepth = 0);
78 bool verify(
bool statement,
const char *statementStr,
const char *description,
const char *file,
int line);
79 void testDataGuiRoles(QAbstractItemModelTester *tester);
81 template<
typename T1,
typename T2>
82 bool compare(
const T1 &t1,
const T2 &t2,
83 const char *actual,
const char *expected,
84 const char *file,
int line);
86 QPointer<QAbstractItemModel> model;
87 QAbstractItemModelTester::FailureReportingMode failureReportingMode;
95 QStack<Changing> insert;
96 QStack<Changing> remove;
98 bool useFetchMore =
true;
101 enum class ChangeInFlight {
112 ChangeInFlight changeInFlight = ChangeInFlight::None;
114 QList<QPersistentModelIndex> changing;
215QAbstractItemModelTester::QAbstractItemModelTester(QAbstractItemModel *model, FailureReportingMode mode, QObject *parent)
216 : QObject(*
new QAbstractItemModelTesterPrivate(model, mode), parent)
219 qFatal(
"%s: model must not be null", Q_FUNC_INFO);
221 Q_D(QAbstractItemModelTester);
223 auto runAllTests = [d] { d->runAllTests(); };
225 connect(model, &QAbstractItemModel::columnsAboutToBeInserted,
227 connect(model, &QAbstractItemModel::columnsAboutToBeRemoved,
229 connect(model, &QAbstractItemModel::columnsInserted,
231 connect(model, &QAbstractItemModel::columnsRemoved,
233 connect(model, &QAbstractItemModel::dataChanged,
235 connect(model, &QAbstractItemModel::headerDataChanged,
237 connect(model, &QAbstractItemModel::layoutAboutToBeChanged,
239 connect(model, &QAbstractItemModel::layoutChanged,
241 connect(model, &QAbstractItemModel::modelReset,
243 connect(model, &QAbstractItemModel::rowsAboutToBeInserted,
245 connect(model, &QAbstractItemModel::rowsAboutToBeRemoved,
247 connect(model, &QAbstractItemModel::rowsInserted,
249 connect(model, &QAbstractItemModel::rowsRemoved,
253 connect(model, &QAbstractItemModel::layoutAboutToBeChanged,
254 this, [d]{ d->layoutAboutToBeChanged(); });
255 connect(model, &QAbstractItemModel::layoutChanged,
256 this, [d]{ d->layoutChanged(); });
259 connect(model, &QAbstractItemModel::columnsAboutToBeInserted,
260 this, [d](
const QModelIndex &parent,
int start,
int end) { d->columnsAboutToBeInserted(parent, start, end); });
261 connect(model, &QAbstractItemModel::columnsAboutToBeMoved,
262 this, [d](
const QModelIndex &sourceParent,
int sourceStart,
int sourceEnd,
const QModelIndex &destinationParent,
int destinationColumn) {
263 d->columnsAboutToBeMoved(sourceParent, sourceStart, sourceEnd, destinationParent, destinationColumn); });
264 connect(model, &QAbstractItemModel::columnsAboutToBeRemoved,
265 this, [d](
const QModelIndex &parent,
int start,
int end) { d->columnsAboutToBeRemoved(parent, start, end); });
266 connect(model, &QAbstractItemModel::columnsInserted,
267 this, [d](
const QModelIndex &parent,
int start,
int end) { d->columnsInserted(parent, start, end); });
268 connect(model, &QAbstractItemModel::columnsMoved,
269 this, [d](
const QModelIndex &parent,
int start,
int end,
const QModelIndex &destination,
int col) {
270 d->columnsMoved(parent, start, end, destination, col); });
271 connect(model, &QAbstractItemModel::columnsRemoved,
272 this, [d](
const QModelIndex &parent,
int start,
int end) { d->columnsRemoved(parent, start, end); });
275 connect(model, &QAbstractItemModel::rowsAboutToBeInserted,
276 this, [d](
const QModelIndex &parent,
int start,
int end) { d->rowsAboutToBeInserted(parent, start, end); });
277 connect(model, &QAbstractItemModel::rowsAboutToBeMoved,
278 this, [d](
const QModelIndex &sourceParent,
int sourceStart,
int sourceEnd,
const QModelIndex &destinationParent,
int destinationRow) {
279 d->rowsAboutToBeMoved(sourceParent, sourceStart, sourceEnd, destinationParent, destinationRow); });
280 connect(model, &QAbstractItemModel::rowsAboutToBeRemoved,
281 this, [d](
const QModelIndex &parent,
int start,
int end) { d->rowsAboutToBeRemoved(parent, start, end); });
282 connect(model, &QAbstractItemModel::rowsInserted,
283 this, [d](
const QModelIndex &parent,
int start,
int end) { d->rowsInserted(parent, start, end); });
284 connect(model, &QAbstractItemModel::rowsMoved,
285 this, [d](
const QModelIndex &parent,
int start,
int end,
const QModelIndex &destination,
int row) {
286 d->rowsMoved(parent, start, end, destination, row); });
287 connect(model, &QAbstractItemModel::rowsRemoved,
288 this, [d](
const QModelIndex &parent,
int start,
int end) { d->rowsRemoved(parent, start, end); });
291 connect(model, &QAbstractItemModel::modelAboutToBeReset,
292 this, [d]() { d->modelAboutToBeReset(); });
293 connect(model, &QAbstractItemModel::modelReset,
294 this, [d]() { d->modelReset(); });
297 connect(model, &QAbstractItemModel::dataChanged,
298 this, [d](
const QModelIndex &topLeft,
const QModelIndex &bottomRight) { d->dataChanged(topLeft, bottomRight); });
299 connect(model, &QAbstractItemModel::headerDataChanged,
300 this, [d](Qt::Orientation orientation,
int start,
int end) { d->headerDataChanged(orientation, start, end); });
684void QAbstractItemModelTesterPrivate::data()
686 if (model->rowCount() == 0 || model->columnCount() == 0)
693 variant = model->data(model->index(0, 0), Qt::DisplayRole);
694 if (variant.isValid())
696 variant = model->data(model->index(0, 0), Qt::ToolTipRole);
697 if (variant.isValid())
699 variant = model->data(model->index(0, 0), Qt::StatusTipRole);
700 if (variant.isValid())
702 variant = model->data(model->index(0, 0), Qt::WhatsThisRole);
703 if (variant.isValid())
707 variant = model->data(model->index(0, 0), Qt::SizeHintRole);
708 if (variant.isValid())
712 QVariant textAlignmentVariant = model->data(model->index(0, 0), Qt::TextAlignmentRole);
713 if (textAlignmentVariant.isValid()) {
714 Qt::Alignment alignment = QtPrivate::legacyFlagValueFromModelData<Qt::Alignment>(textAlignmentVariant);
715 MODELTESTER_COMPARE(alignment, (alignment & (Qt::AlignHorizontal_Mask | Qt::AlignVertical_Mask)));
719 QVariant checkStateVariant = model->data(model->index(0, 0), Qt::CheckStateRole);
720 if (checkStateVariant.isValid()) {
721 Qt::CheckState state = QtPrivate::legacyEnumValueFromModelData<Qt::CheckState>(checkStateVariant);
723 || state == Qt::PartiallyChecked
724 || state == Qt::Checked);
727 QVariant sizeHintVariant = model->data(model->index(0, 0), Qt::SizeHintRole);
728 if (sizeHintVariant.isValid())
731 Q_Q(QAbstractItemModelTester);
847void QAbstractItemModelTesterPrivate::rowsInserted(
const QModelIndex &parent,
int start,
int end)
850 changeInFlight = ChangeInFlight::None;
852 qCDebug(lcModelTest) <<
"rowsInserted"
853 <<
"start=" << start <<
"end=" << end <<
"parent=" << parent
854 <<
"parent data=" << safeParentData(parent)
855 <<
"current count of parent=" << model->rowCount(parent);
857 for (
int i = start; i <= end; ++i) {
858 qCDebug(lcModelTest) <<
" itemWasInserted:" << i
859 << model->index(i, 0, parent).data();
863 Changing c = insert.pop();
870 if (end + 1 < model->rowCount(c.parent)) {
871 if (c.next != model->data(model->index(end + 1, 0, c.parent))) {
872 qDebug() << start << end;
873 for (
int i = 0; i < model->rowCount(); ++i)
874 qDebug() << model->index(i, 0).data().toString();
875 qDebug() << c.next << model->data(model->index(end + 1, 0, c.parent));