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;
216QAbstractItemModelTester::QAbstractItemModelTester(QAbstractItemModel *model, FailureReportingMode mode, QObject *parent)
217 : QObject(*
new QAbstractItemModelTesterPrivate(model, mode), parent)
220 qFatal(
"%s: model must not be null", Q_FUNC_INFO);
222 Q_D(QAbstractItemModelTester);
224 auto runAllTests = [d] { d->runAllTests(); };
226 connect(model, &QAbstractItemModel::columnsAboutToBeInserted,
228 connect(model, &QAbstractItemModel::columnsAboutToBeRemoved,
230 connect(model, &QAbstractItemModel::columnsInserted,
232 connect(model, &QAbstractItemModel::columnsRemoved,
234 connect(model, &QAbstractItemModel::dataChanged,
236 connect(model, &QAbstractItemModel::headerDataChanged,
238 connect(model, &QAbstractItemModel::layoutAboutToBeChanged,
240 connect(model, &QAbstractItemModel::layoutChanged,
242 connect(model, &QAbstractItemModel::modelReset,
244 connect(model, &QAbstractItemModel::rowsAboutToBeInserted,
246 connect(model, &QAbstractItemModel::rowsAboutToBeRemoved,
248 connect(model, &QAbstractItemModel::rowsInserted,
250 connect(model, &QAbstractItemModel::rowsRemoved,
254 connect(model, &QAbstractItemModel::layoutAboutToBeChanged,
255 this, [d]{ d->layoutAboutToBeChanged(); });
256 connect(model, &QAbstractItemModel::layoutChanged,
257 this, [d]{ d->layoutChanged(); });
260 connect(model, &QAbstractItemModel::columnsAboutToBeInserted,
261 this, [d](
const QModelIndex &parent,
int start,
int end) { d->columnsAboutToBeInserted(parent, start, end); });
262 connect(model, &QAbstractItemModel::columnsAboutToBeMoved,
263 this, [d](
const QModelIndex &sourceParent,
int sourceStart,
int sourceEnd,
const QModelIndex &destinationParent,
int destinationColumn) {
264 d->columnsAboutToBeMoved(sourceParent, sourceStart, sourceEnd, destinationParent, destinationColumn); });
265 connect(model, &QAbstractItemModel::columnsAboutToBeRemoved,
266 this, [d](
const QModelIndex &parent,
int start,
int end) { d->columnsAboutToBeRemoved(parent, start, end); });
267 connect(model, &QAbstractItemModel::columnsInserted,
268 this, [d](
const QModelIndex &parent,
int start,
int end) { d->columnsInserted(parent, start, end); });
269 connect(model, &QAbstractItemModel::columnsMoved,
270 this, [d](
const QModelIndex &parent,
int start,
int end,
const QModelIndex &destination,
int col) {
271 d->columnsMoved(parent, start, end, destination, col); });
272 connect(model, &QAbstractItemModel::columnsRemoved,
273 this, [d](
const QModelIndex &parent,
int start,
int end) { d->columnsRemoved(parent, start, end); });
276 connect(model, &QAbstractItemModel::rowsAboutToBeInserted,
277 this, [d](
const QModelIndex &parent,
int start,
int end) { d->rowsAboutToBeInserted(parent, start, end); });
278 connect(model, &QAbstractItemModel::rowsAboutToBeMoved,
279 this, [d](
const QModelIndex &sourceParent,
int sourceStart,
int sourceEnd,
const QModelIndex &destinationParent,
int destinationRow) {
280 d->rowsAboutToBeMoved(sourceParent, sourceStart, sourceEnd, destinationParent, destinationRow); });
281 connect(model, &QAbstractItemModel::rowsAboutToBeRemoved,
282 this, [d](
const QModelIndex &parent,
int start,
int end) { d->rowsAboutToBeRemoved(parent, start, end); });
283 connect(model, &QAbstractItemModel::rowsInserted,
284 this, [d](
const QModelIndex &parent,
int start,
int end) { d->rowsInserted(parent, start, end); });
285 connect(model, &QAbstractItemModel::rowsMoved,
286 this, [d](
const QModelIndex &parent,
int start,
int end,
const QModelIndex &destination,
int row) {
287 d->rowsMoved(parent, start, end, destination, row); });
288 connect(model, &QAbstractItemModel::rowsRemoved,
289 this, [d](
const QModelIndex &parent,
int start,
int end) { d->rowsRemoved(parent, start, end); });
292 connect(model, &QAbstractItemModel::modelAboutToBeReset,
293 this, [d]() { d->modelAboutToBeReset(); });
294 connect(model, &QAbstractItemModel::modelReset,
295 this, [d]() { d->modelReset(); });
298 connect(model, &QAbstractItemModel::dataChanged,
299 this, [d](
const QModelIndex &topLeft,
const QModelIndex &bottomRight) { d->dataChanged(topLeft, bottomRight); });
300 connect(model, &QAbstractItemModel::headerDataChanged,
301 this, [d](Qt::Orientation orientation,
int start,
int end) { d->headerDataChanged(orientation, start, end); });
685void QAbstractItemModelTesterPrivate::data()
687 if (model->rowCount() == 0 || model->columnCount() == 0)
694 variant = model->data(model->index(0, 0), Qt::DisplayRole);
695 if (variant.isValid())
697 variant = model->data(model->index(0, 0), Qt::ToolTipRole);
698 if (variant.isValid())
700 variant = model->data(model->index(0, 0), Qt::StatusTipRole);
701 if (variant.isValid())
703 variant = model->data(model->index(0, 0), Qt::WhatsThisRole);
704 if (variant.isValid())
708 variant = model->data(model->index(0, 0), Qt::SizeHintRole);
709 if (variant.isValid())
713 QVariant textAlignmentVariant = model->data(model->index(0, 0), Qt::TextAlignmentRole);
714 if (textAlignmentVariant.isValid()) {
715 Qt::Alignment alignment = QtPrivate::legacyFlagValueFromModelData<Qt::Alignment>(textAlignmentVariant);
716 MODELTESTER_COMPARE(alignment, (alignment & (Qt::AlignHorizontal_Mask | Qt::AlignVertical_Mask)));
720 QVariant checkStateVariant = model->data(model->index(0, 0), Qt::CheckStateRole);
721 if (checkStateVariant.isValid()) {
722 Qt::CheckState state = QtPrivate::legacyEnumValueFromModelData<Qt::CheckState>(checkStateVariant);
724 || state == Qt::PartiallyChecked
725 || state == Qt::Checked);
728 QVariant sizeHintVariant = model->data(model->index(0, 0), Qt::SizeHintRole);
729 if (sizeHintVariant.isValid())
732 Q_Q(QAbstractItemModelTester);
848void QAbstractItemModelTesterPrivate::rowsInserted(
const QModelIndex &parent,
int start,
int end)
851 changeInFlight = ChangeInFlight::None;
853 qCDebug(lcModelTest) <<
"rowsInserted"
854 <<
"start=" << start <<
"end=" << end <<
"parent=" << parent
855 <<
"parent data=" << safeParentData(parent)
856 <<
"current count of parent=" << model->rowCount(parent);
858 for (
int i = start; i <= end; ++i) {
859 qCDebug(lcModelTest) <<
" itemWasInserted:" << i
860 << model->index(i, 0, parent).data();
864 Changing c = insert.pop();
871 if (end + 1 < model->rowCount(c.parent)) {
872 if (c.next != model->data(model->index(end + 1, 0, c.parent))) {
873 qDebug() << start << end;
874 for (
int i = 0; i < model->rowCount(); ++i)
875 qDebug() << model->index(i, 0).data().toString();
876 qDebug() << c.next << model->data(model->index(end + 1, 0, c.parent));