diff options
author | Andrew den Exter <andrew.den-exter@nokia.com> | 2012-07-17 10:47:45 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-07-17 12:49:15 +0200 |
commit | 6a79d26b8353c241c3ffa21931efa279eeee1a28 (patch) | |
tree | 7be32929c6cc179a25eb16270e5713f23fd037ea /tests/auto/quick/qquickrepeater | |
parent | ba94fbedd648b04a28d67b920db2883e73459d1f (diff) |
Don't double reference items created following a model reset.
If the model was reset then regenerate and exit immediately rather
than processing the change set.
Task-number: QTBUG-26536
Change-Id: I9d4f20d450a5116957c9468ba6088caad026a497
Reviewed-by: Martin Jones <martin.jones@nokia.com>
Diffstat (limited to 'tests/auto/quick/qquickrepeater')
-rw-r--r-- | tests/auto/quick/qquickrepeater/tst_qquickrepeater.cpp | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/tests/auto/quick/qquickrepeater/tst_qquickrepeater.cpp b/tests/auto/quick/qquickrepeater/tst_qquickrepeater.cpp index 171e3301d9..0fb2416808 100644 --- a/tests/auto/quick/qquickrepeater/tst_qquickrepeater.cpp +++ b/tests/auto/quick/qquickrepeater/tst_qquickrepeater.cpp @@ -74,6 +74,7 @@ private slots: void itemModel(); void resetModel(); void modelChanged(); + void modelReset(); void properties(); void asynchronous(); void initParent(); @@ -543,6 +544,84 @@ void tst_QQuickRepeater::modelChanged() delete rootObject; } +void tst_QQuickRepeater::modelReset() +{ + QaimModel model; + + QQmlEngine engine; + QQmlContext *ctxt = engine.rootContext(); + ctxt->setContextProperty("testData", &model); + + QQmlComponent component(&engine, testFileUrl("repeater2.qml")); + QScopedPointer<QObject> object(component.create()); + QQuickItem *rootItem = qobject_cast<QQuickItem *>(object.data()); + QVERIFY(rootItem); + + QQuickRepeater *repeater = findItem<QQuickRepeater>(rootItem, "repeater"); + QVERIFY(repeater != 0); + QQuickItem *container = findItem<QQuickItem>(rootItem, "container"); + QVERIFY(container != 0); + + QCOMPARE(repeater->count(), 0); + + QSignalSpy countSpy(repeater, SIGNAL(countChanged())); + QSignalSpy addedSpy(repeater, SIGNAL(itemAdded(int,QQuickItem*))); + QSignalSpy removedSpy(repeater, SIGNAL(itemRemoved(int,QQuickItem*))); + + + QList<QPair<QString, QString> > items = QList<QPair<QString, QString> >() + << qMakePair(QString::fromLatin1("one"), QString::fromLatin1("1")) + << qMakePair(QString::fromLatin1("two"), QString::fromLatin1("2")) + << qMakePair(QString::fromLatin1("three"), QString::fromLatin1("3")); + + model.resetItems(items); + + QCOMPARE(countSpy.count(), 1); + QCOMPARE(removedSpy.count(), 0); + QCOMPARE(addedSpy.count(), items.count()); + for (int i = 0; i< items.count(); i++) { + QCOMPARE(addedSpy.at(i).at(0).toInt(), i); + QCOMPARE(addedSpy.at(i).at(1).value<QQuickItem*>(), repeater->itemAt(i)); + } + + countSpy.clear(); + addedSpy.clear(); + + model.reset(); + QCOMPARE(countSpy.count(), 0); + QCOMPARE(removedSpy.count(), 3); + QCOMPARE(addedSpy.count(), 3); + for (int i = 0; i< items.count(); i++) { + QCOMPARE(addedSpy.at(i).at(0).toInt(), i); + QCOMPARE(addedSpy.at(i).at(1).value<QQuickItem*>(), repeater->itemAt(i)); + } + + addedSpy.clear(); + removedSpy.clear(); + + items.append(qMakePair(QString::fromLatin1("four"), QString::fromLatin1("4"))); + items.append(qMakePair(QString::fromLatin1("five"), QString::fromLatin1("5"))); + + model.resetItems(items); + QCOMPARE(countSpy.count(), 1); + QCOMPARE(removedSpy.count(), 3); + QCOMPARE(addedSpy.count(), 5); + for (int i = 0; i< items.count(); i++) { + QCOMPARE(addedSpy.at(i).at(0).toInt(), i); + QCOMPARE(addedSpy.at(i).at(1).value<QQuickItem*>(), repeater->itemAt(i)); + } + + countSpy.clear(); + addedSpy.clear(); + removedSpy.clear(); + + items.clear(); + model.resetItems(items); + QCOMPARE(countSpy.count(), 1); + QCOMPARE(removedSpy.count(), 5); + QCOMPARE(addedSpy.count(), 0); +} + void tst_QQuickRepeater::properties() { QQmlEngine engine; |