aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/quick/qquickvisualdatamodel
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/quick/qquickvisualdatamodel')
-rw-r--r--tests/auto/quick/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp282
1 files changed, 282 insertions, 0 deletions
diff --git a/tests/auto/quick/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp b/tests/auto/quick/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp
index 82c8d44068..2d6cfa02d7 100644
--- a/tests/auto/quick/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp
+++ b/tests/auto/quick/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp
@@ -40,6 +40,7 @@
****************************************************************************/
#include "../../shared/util.h"
#include "../shared/visualtestutil.h"
+#include "../shared/viewtestutil.h"
#include <qtest.h>
#include <QtTest/QSignalSpy>
@@ -47,6 +48,7 @@
#include <QtQml/qqmlcomponent.h>
#include <QtQml/qqmlcontext.h>
#include <QtQml/qqmlexpression.h>
+#include <QtQml/qqmlincubator.h>
#include <QtQuick/qquickview.h>
#include <private/qquicklistview_p.h>
#include <QtQuick/private/qquicktext_p.h>
@@ -57,6 +59,7 @@
#include <math.h>
using namespace QQuickVisualTestUtil;
+using namespace QQuickViewTestUtil;
template <typename T, int N> int lengthOf(const T (&)[N]) { return N; }
@@ -186,6 +189,45 @@ private:
QString m_color;
};
+class ItemRequester : public QObject
+{
+ Q_OBJECT
+public:
+ ItemRequester(QObject *parent = 0)
+ : QObject(parent)
+ , itemInitialized(0)
+ , itemCreated(0)
+ , itemDestroyed(0)
+ , indexInitialized(-1)
+ , indexCreated(-1)
+ {
+ }
+
+ QQuickItem *itemInitialized;
+ QQuickItem *itemCreated;
+ QQuickItem *itemDestroyed;
+ int indexInitialized;
+ int indexCreated;
+
+public Q_SLOTS:
+ void initItem(int index, QQuickItem *item)
+ {
+ itemInitialized = item;
+ indexInitialized = index;
+ }
+
+ void createdItem(int index, QQuickItem *item)
+ {
+ itemCreated = item;
+ indexCreated = index;
+ }
+
+ void destroyingItem(QQuickItem *item)
+ {
+ itemDestroyed = item;
+ }
+};
+
QML_DECLARE_TYPE(SingleRoleModel)
QML_DECLARE_TYPE(DataObject)
#ifndef QT_NO_WIDGETS
@@ -238,6 +280,13 @@ private slots:
void warnings_data();
void warnings();
void invalidAttachment();
+ void asynchronousInsert_data();
+ void asynchronousInsert();
+ void asynchronousRemove_data();
+ void asynchronousRemove();
+ void asynchronousMove();
+ void asynchronousMove_data();
+ void asynchronousCancel();
private:
template <int N> void groups_verify(
@@ -263,6 +312,7 @@ private:
const bool (&sMember)[N]);
bool failed;
+ QQmlIncubationController controller;
QQmlEngine engine;
};
@@ -296,6 +346,8 @@ void tst_qquickvisualdatamodel::initTestCase()
qmlRegisterType<StandardItem>("tst_qquickvisualdatamodel", 1, 0, "StandardItem");
qmlRegisterType<StandardItemModel>("tst_qquickvisualdatamodel", 1, 0, "StandardItemModel");
#endif
+
+ engine.setIncubationController(&controller);
}
void tst_qquickvisualdatamodel::cleanupTestCase()
@@ -3480,6 +3532,236 @@ void tst_qquickvisualdatamodel::invalidAttachment()
QVERIFY(!property.value<QQuickVisualDataModel *>());
}
+void tst_qquickvisualdatamodel::asynchronousInsert_data()
+{
+ QTest::addColumn<int>("requestIndex");
+ QTest::addColumn<int>("insertIndex");
+ QTest::addColumn<int>("insertCount");
+ QTest::addColumn<int>("completeIndex");
+
+ QTest::newRow("insert before") << 4 << 1 << 3 << 7;
+ QTest::newRow("insert after") << 4 << 6 << 3 << 4;
+ QTest::newRow("insert at") << 4 << 4 << 3 << 7;
+}
+
+void tst_qquickvisualdatamodel::asynchronousInsert()
+{
+ QFETCH(int, requestIndex);
+ QFETCH(int, insertIndex);
+ QFETCH(int, insertCount);
+ QFETCH(int, completeIndex);
+
+ QCOMPARE(controller.incubatingObjectCount(), 0);
+
+ QQmlComponent c(&engine, testFileUrl("visualdatamodel.qml"));
+
+ QmlListModel model;
+ for (int i = 0; i < 8; i++)
+ model.addItem("Original item" + QString::number(i), "");
+
+ engine.rootContext()->setContextProperty("myModel", &model);
+
+ QQuickVisualDataModel *visualModel = qobject_cast<QQuickVisualDataModel*>(c.create());
+ QVERIFY(visualModel);
+
+ ItemRequester requester;
+ connect(visualModel, SIGNAL(initItem(int,QQuickItem*)), &requester, SLOT(initItem(int,QQuickItem*)));
+ connect(visualModel, SIGNAL(createdItem(int,QQuickItem*)), &requester, SLOT(createdItem(int,QQuickItem*)));
+ connect(visualModel, SIGNAL(destroyingItem(QQuickItem*)), &requester, SLOT(destroyingItem(QQuickItem*)));
+
+ QQuickItem *item = visualModel->item(requestIndex, true);
+ QVERIFY(!item);
+
+ QVERIFY(!requester.itemInitialized);
+ QVERIFY(!requester.itemCreated);
+ QVERIFY(!requester.itemDestroyed);
+
+ QList<QPair<QString, QString> > newItems;
+ for (int i = 0; i < insertCount; i++)
+ newItems.append(qMakePair(QLatin1String("New item") + QString::number(i), QString(QLatin1String(""))));
+ model.insertItems(insertIndex, newItems);
+
+ item = visualModel->item(completeIndex, false);
+ QVERIFY(item);
+
+ QCOMPARE(requester.itemInitialized, item);
+ QCOMPARE(requester.indexInitialized, completeIndex);
+ QCOMPARE(requester.itemCreated, item);
+ QCOMPARE(requester.indexCreated, completeIndex);
+ QVERIFY(!requester.itemDestroyed);
+
+ QCOMPARE(controller.incubatingObjectCount(), 0);
+
+ visualModel->release(item);
+
+ QCOMPARE(requester.itemDestroyed, item);
+}
+
+void tst_qquickvisualdatamodel::asynchronousRemove_data()
+{
+ QTest::addColumn<int>("requestIndex");
+ QTest::addColumn<int>("removeIndex");
+ QTest::addColumn<int>("removeCount");
+ QTest::addColumn<int>("completeIndex");
+
+ QTest::newRow("remove before") << 4 << 1 << 3 << 1;
+ QTest::newRow("remove after") << 4 << 6 << 2 << 4;
+ QTest::newRow("remove requested") << 4 << 4 << 3 << -1;
+}
+
+void tst_qquickvisualdatamodel::asynchronousRemove()
+{
+ QFETCH(int, requestIndex);
+ QFETCH(int, removeIndex);
+ QFETCH(int, removeCount);
+ QFETCH(int, completeIndex);
+
+ QCOMPARE(controller.incubatingObjectCount(), 0);
+
+ QQmlComponent c(&engine, testFileUrl("visualdatamodel.qml"));
+
+ QmlListModel model;
+ for (int i = 0; i < 8; i++)
+ model.addItem("Original item" + QString::number(i), "");
+
+ engine.rootContext()->setContextProperty("myModel", &model);
+
+ QQuickVisualDataModel *visualModel = qobject_cast<QQuickVisualDataModel*>(c.create());
+ QVERIFY(visualModel);
+
+ ItemRequester requester;
+ connect(visualModel, SIGNAL(initItem(int,QQuickItem*)), &requester, SLOT(initItem(int,QQuickItem*)));
+ connect(visualModel, SIGNAL(createdItem(int,QQuickItem*)), &requester, SLOT(createdItem(int,QQuickItem*)));
+ connect(visualModel, SIGNAL(destroyingItem(QQuickItem*)), &requester, SLOT(destroyingItem(QQuickItem*)));
+
+ QQuickItem *item = visualModel->item(requestIndex, true);
+ QVERIFY(!item);
+
+ QVERIFY(!requester.itemInitialized);
+ QVERIFY(!requester.itemCreated);
+ QVERIFY(!requester.itemDestroyed);
+
+ model.removeItems(removeIndex, removeCount);
+
+ if (completeIndex == -1) {
+ QElapsedTimer timer;
+ timer.start();
+ do {
+ controller.incubateFor(50);
+ } while (timer.elapsed() < 1000 && controller.incubatingObjectCount() > 0);
+
+ QVERIFY(requester.itemInitialized);
+ QCOMPARE(requester.itemCreated, requester.itemInitialized);
+ QCOMPARE(requester.itemDestroyed, requester.itemInitialized);
+ } else {
+ item = visualModel->item(completeIndex, false);
+ QVERIFY(item);
+
+ QCOMPARE(requester.itemInitialized, item);
+ QCOMPARE(requester.indexInitialized, completeIndex);
+ QCOMPARE(requester.itemCreated, item);
+ QCOMPARE(requester.indexCreated, completeIndex);
+ QVERIFY(!requester.itemDestroyed);
+
+ QCOMPARE(controller.incubatingObjectCount(), 0);
+
+ visualModel->release(item);
+
+ QCOMPARE(requester.itemDestroyed, item);
+ }
+}
+
+void tst_qquickvisualdatamodel::asynchronousMove_data()
+{
+ QTest::addColumn<int>("requestIndex");
+ QTest::addColumn<int>("from");
+ QTest::addColumn<int>("to");
+ QTest::addColumn<int>("count");
+ QTest::addColumn<int>("completeIndex");
+
+ QTest::newRow("move before") << 4 << 1 << 0 << 3 << 4;
+ QTest::newRow("move after") << 4 << 6 << 5 << 2 << 4;
+ QTest::newRow("move requested") << 4 << 4 << 3 << 2 << 3;
+ QTest::newRow("move before to after") << 4 << 1 << 4 << 3 << 1;
+ QTest::newRow("move after to before") << 4 << 6 << 2 << 2 << 6;
+}
+
+void tst_qquickvisualdatamodel::asynchronousMove()
+{
+ QFETCH(int, requestIndex);
+ QFETCH(int, from);
+ QFETCH(int, to);
+ QFETCH(int, count);
+ QFETCH(int, completeIndex);
+
+ QCOMPARE(controller.incubatingObjectCount(), 0);
+
+ QQmlComponent c(&engine, testFileUrl("visualdatamodel.qml"));
+
+ QmlListModel model;
+ for (int i = 0; i < 8; i++)
+ model.addItem("Original item" + QString::number(i), "");
+
+ engine.rootContext()->setContextProperty("myModel", &model);
+
+ QQuickVisualDataModel *visualModel = qobject_cast<QQuickVisualDataModel*>(c.create());
+ QVERIFY(visualModel);
+
+ ItemRequester requester;
+ connect(visualModel, SIGNAL(initItem(int,QQuickItem*)), &requester, SLOT(initItem(int,QQuickItem*)));
+ connect(visualModel, SIGNAL(createdItem(int,QQuickItem*)), &requester, SLOT(createdItem(int,QQuickItem*)));
+ connect(visualModel, SIGNAL(destroyingItem(QQuickItem*)), &requester, SLOT(destroyingItem(QQuickItem*)));
+
+ QQuickItem *item = visualModel->item(requestIndex, true);
+ QVERIFY(!item);
+
+ QVERIFY(!requester.itemInitialized);
+ QVERIFY(!requester.itemCreated);
+ QVERIFY(!requester.itemDestroyed);
+
+ model.moveItems(from, to, count);
+
+ item = visualModel->item(completeIndex, false);
+ QVERIFY(item);
+
+
+ QCOMPARE(requester.itemInitialized, item);
+ QCOMPARE(requester.indexInitialized, completeIndex);
+ QCOMPARE(requester.itemCreated, item);
+ QCOMPARE(requester.indexCreated, completeIndex);
+ QVERIFY(!requester.itemDestroyed);
+
+ QCOMPARE(controller.incubatingObjectCount(), 0);
+
+ visualModel->release(item);
+
+ QCOMPARE(requester.itemDestroyed, item);
+}
+
+void tst_qquickvisualdatamodel::asynchronousCancel()
+{
+ const int requestIndex = 4;
+
+ QCOMPARE(controller.incubatingObjectCount(), 0);
+
+ QQmlComponent c(&engine, testFileUrl("visualdatamodel.qml"));
+
+ QmlListModel model;
+ for (int i = 0; i < 8; i++)
+ model.addItem("Original item" + QString::number(i), "");
+
+ engine.rootContext()->setContextProperty("myModel", &model);
+
+ QQuickVisualDataModel *visualModel = qobject_cast<QQuickVisualDataModel*>(c.create());
+ QVERIFY(visualModel);
+
+ QQuickItem *item = visualModel->item(requestIndex, true);
+ QVERIFY(!item);
+ QCOMPARE(controller.incubatingObjectCount(), 1);
+
+ visualModel->cancel(requestIndex);
+ QCOMPARE(controller.incubatingObjectCount(), 0);
+}
QTEST_MAIN(tst_qquickvisualdatamodel)