aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/quick/qquickrepeater
diff options
context:
space:
mode:
authorAndrew den Exter <andrew.den-exter@nokia.com>2012-07-17 10:47:45 +1000
committerQt by Nokia <qt-info@nokia.com>2012-07-17 12:49:15 +0200
commit6a79d26b8353c241c3ffa21931efa279eeee1a28 (patch)
tree7be32929c6cc179a25eb16270e5713f23fd037ea /tests/auto/quick/qquickrepeater
parentba94fbedd648b04a28d67b920db2883e73459d1f (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.cpp79
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;