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 void checkChildren(
const QModelIndex &parent,
int currentDepth = 0);
76 bool verify(
bool statement,
const char *statementStr,
const char *description,
const char *file,
int line);
77 void testDataGuiRoles(QAbstractItemModelTester *tester);
79 template<
typename T1,
typename T2>
80 bool compare(
const T1 &t1,
const T2 &t2,
81 const char *actual,
const char *expected,
82 const char *file,
int line);
84 QPointer<QAbstractItemModel> model;
85 QAbstractItemModelTester::FailureReportingMode failureReportingMode;
93 QStack<Changing> insert;
94 QStack<Changing> remove;
96 bool useFetchMore =
true;
99 enum class ChangeInFlight {
110 ChangeInFlight changeInFlight = ChangeInFlight::None;
112 QList<QPersistentModelIndex> changing;
213QAbstractItemModelTester::QAbstractItemModelTester(QAbstractItemModel *model, FailureReportingMode mode, QObject *parent)
214 : QObject(*
new QAbstractItemModelTesterPrivate(model, mode), parent)
217 qFatal(
"%s: model must not be null", Q_FUNC_INFO);
219 Q_D(QAbstractItemModelTester);
221 auto runAllTests = [d] { d->runAllTests(); };
223 connect(model, &QAbstractItemModel::columnsAboutToBeInserted,
225 connect(model, &QAbstractItemModel::columnsAboutToBeRemoved,
227 connect(model, &QAbstractItemModel::columnsInserted,
229 connect(model, &QAbstractItemModel::columnsRemoved,
231 connect(model, &QAbstractItemModel::dataChanged,
233 connect(model, &QAbstractItemModel::headerDataChanged,
235 connect(model, &QAbstractItemModel::layoutAboutToBeChanged,
237 connect(model, &QAbstractItemModel::layoutChanged,
239 connect(model, &QAbstractItemModel::modelReset,
241 connect(model, &QAbstractItemModel::rowsAboutToBeInserted,
243 connect(model, &QAbstractItemModel::rowsAboutToBeRemoved,
245 connect(model, &QAbstractItemModel::rowsInserted,
247 connect(model, &QAbstractItemModel::rowsRemoved,
251 connect(model, &QAbstractItemModel::layoutAboutToBeChanged,
252 this, [d]{ d->layoutAboutToBeChanged(); });
253 connect(model, &QAbstractItemModel::layoutChanged,
254 this, [d]{ d->layoutChanged(); });
257 connect(model, &QAbstractItemModel::columnsAboutToBeInserted,
258 this, [d](
const QModelIndex &parent,
int start,
int end) { d->columnsAboutToBeInserted(parent, start, end); });
259 connect(model, &QAbstractItemModel::columnsAboutToBeMoved,
260 this, [d](
const QModelIndex &sourceParent,
int sourceStart,
int sourceEnd,
const QModelIndex &destinationParent,
int destinationColumn) {
261 d->columnsAboutToBeMoved(sourceParent, sourceStart, sourceEnd, destinationParent, destinationColumn); });
262 connect(model, &QAbstractItemModel::columnsAboutToBeRemoved,
263 this, [d](
const QModelIndex &parent,
int start,
int end) { d->columnsAboutToBeRemoved(parent, start, end); });
264 connect(model, &QAbstractItemModel::columnsInserted,
265 this, [d](
const QModelIndex &parent,
int start,
int end) { d->columnsInserted(parent, start, end); });
266 connect(model, &QAbstractItemModel::columnsMoved,
267 this, [d](
const QModelIndex &parent,
int start,
int end,
const QModelIndex &destination,
int col) {
268 d->columnsMoved(parent, start, end, destination, col); });
269 connect(model, &QAbstractItemModel::columnsRemoved,
270 this, [d](
const QModelIndex &parent,
int start,
int end) { d->columnsRemoved(parent, start, end); });
273 connect(model, &QAbstractItemModel::rowsAboutToBeInserted,
274 this, [d](
const QModelIndex &parent,
int start,
int end) { d->rowsAboutToBeInserted(parent, start, end); });
275 connect(model, &QAbstractItemModel::rowsAboutToBeMoved,
276 this, [d](
const QModelIndex &sourceParent,
int sourceStart,
int sourceEnd,
const QModelIndex &destinationParent,
int destinationRow) {
277 d->rowsAboutToBeMoved(sourceParent, sourceStart, sourceEnd, destinationParent, destinationRow); });
278 connect(model, &QAbstractItemModel::rowsAboutToBeRemoved,
279 this, [d](
const QModelIndex &parent,
int start,
int end) { d->rowsAboutToBeRemoved(parent, start, end); });
280 connect(model, &QAbstractItemModel::rowsInserted,
281 this, [d](
const QModelIndex &parent,
int start,
int end) { d->rowsInserted(parent, start, end); });
282 connect(model, &QAbstractItemModel::rowsMoved,
283 this, [d](
const QModelIndex &parent,
int start,
int end,
const QModelIndex &destination,
int row) {
284 d->rowsMoved(parent, start, end, destination, row); });
285 connect(model, &QAbstractItemModel::rowsRemoved,
286 this, [d](
const QModelIndex &parent,
int start,
int end) { d->rowsRemoved(parent, start, end); });
289 connect(model, &QAbstractItemModel::modelAboutToBeReset,
290 this, [d]() { d->modelAboutToBeReset(); });
291 connect(model, &QAbstractItemModel::modelReset,
292 this, [d]() { d->modelReset(); });
295 connect(model, &QAbstractItemModel::dataChanged,
296 this, [d](
const QModelIndex &topLeft,
const QModelIndex &bottomRight) { d->dataChanged(topLeft, bottomRight); });
297 connect(model, &QAbstractItemModel::headerDataChanged,
298 this, [d](Qt::Orientation orientation,
int start,
int end) { d->headerDataChanged(orientation, start, end); });
675void QAbstractItemModelTesterPrivate::data()
677 if (model->rowCount() == 0 || model->columnCount() == 0)
684 variant = model->data(model->index(0, 0), Qt::DisplayRole);
685 if (variant.isValid())
687 variant = model->data(model->index(0, 0), Qt::ToolTipRole);
688 if (variant.isValid())
690 variant = model->data(model->index(0, 0), Qt::StatusTipRole);
691 if (variant.isValid())
693 variant = model->data(model->index(0, 0), Qt::WhatsThisRole);
694 if (variant.isValid())
698 variant = model->data(model->index(0, 0), Qt::SizeHintRole);
699 if (variant.isValid())
703 QVariant textAlignmentVariant = model->data(model->index(0, 0), Qt::TextAlignmentRole);
704 if (textAlignmentVariant.isValid()) {
705 Qt::Alignment alignment = QtPrivate::legacyFlagValueFromModelData<Qt::Alignment>(textAlignmentVariant);
706 MODELTESTER_COMPARE(alignment, (alignment & (Qt::AlignHorizontal_Mask | Qt::AlignVertical_Mask)));
710 QVariant checkStateVariant = model->data(model->index(0, 0), Qt::CheckStateRole);
711 if (checkStateVariant.isValid()) {
712 Qt::CheckState state = QtPrivate::legacyEnumValueFromModelData<Qt::CheckState>(checkStateVariant);
714 || state == Qt::PartiallyChecked
715 || state == Qt::Checked);
718 QVariant sizeHintVariant = model->data(model->index(0, 0), Qt::SizeHintRole);
719 if (sizeHintVariant.isValid())
722 Q_Q(QAbstractItemModelTester);
838void QAbstractItemModelTesterPrivate::rowsInserted(
const QModelIndex &parent,
int start,
int end)
841 changeInFlight = ChangeInFlight::None;
843 qCDebug(lcModelTest) <<
"rowsInserted"
844 <<
"start=" << start <<
"end=" << end <<
"parent=" << parent
845 <<
"parent data=" << model->data(parent).toString()
846 <<
"current count of parent=" << model->rowCount(parent);
848 for (
int i = start; i <= end; ++i) {
849 qCDebug(lcModelTest) <<
" itemWasInserted:" << i
850 << model->index(i, 0, parent).data();
854 Changing c = insert.pop();
861 if (end + 1 < model->rowCount(c.parent)) {
862 if (c.next != model->data(model->index(end + 1, 0, c.parent))) {
863 qDebug() << start << end;
864 for (
int i = 0; i < model->rowCount(); ++i)
865 qDebug() << model->index(i, 0).data().toString();
866 qDebug() << c.next << model->data(model->index(end + 1, 0, c.parent));