diff options
Diffstat (limited to 'tests/auto/qtquick2/qquickrepeater/tst_qquickrepeater.cpp')
-rw-r--r-- | tests/auto/qtquick2/qquickrepeater/tst_qquickrepeater.cpp | 644 |
1 files changed, 0 insertions, 644 deletions
diff --git a/tests/auto/qtquick2/qquickrepeater/tst_qquickrepeater.cpp b/tests/auto/qtquick2/qquickrepeater/tst_qquickrepeater.cpp deleted file mode 100644 index 59322704f5..0000000000 --- a/tests/auto/qtquick2/qquickrepeater/tst_qquickrepeater.cpp +++ /dev/null @@ -1,644 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtTest/QtTest> -#include <QtTest/QSignalSpy> -#include <private/qlistmodelinterface_p.h> -#include <QtDeclarative/qdeclarativeengine.h> -#include <QtQuick/qquickview.h> -#include <QtDeclarative/qdeclarativecontext.h> -#include <QtDeclarative/qdeclarativeexpression.h> -#include <QtDeclarative/qdeclarativeincubator.h> -#include <private/qquickrepeater_p.h> -#include <QtQuick/private/qquicktext_p.h> - -#include "../../shared/util.h" -#include "../shared/viewtestutil.h" -#include "../shared/visualtestutil.h" - -using namespace QQuickViewTestUtil; -using namespace QQuickVisualTestUtil; - - -class tst_QQuickRepeater : public QDeclarativeDataTest -{ - Q_OBJECT -public: - tst_QQuickRepeater(); - -private slots: - void numberModel(); - void objectList(); - void stringList(); - void dataModel_adding(); - void dataModel_removing(); - void dataModel_changes(); - void itemModel(); - void resetModel(); - void modelChanged(); - void properties(); - void asynchronous(); - void initParent(); -}; - -class TestObject : public QObject -{ - Q_OBJECT - - Q_PROPERTY(bool error READ error WRITE setError) - Q_PROPERTY(bool useModel READ useModel NOTIFY useModelChanged) - -public: - TestObject() : QObject(), mError(true), mUseModel(false) {} - - bool error() const { return mError; } - void setError(bool err) { mError = err; } - - bool useModel() const { return mUseModel; } - void setUseModel(bool use) { mUseModel = use; emit useModelChanged(); } - -signals: - void useModelChanged(); - -private: - bool mError; - bool mUseModel; -}; - -tst_QQuickRepeater::tst_QQuickRepeater() -{ -} - -void tst_QQuickRepeater::numberModel() -{ - QQuickView *canvas = createView(); - - QDeclarativeContext *ctxt = canvas->rootContext(); - ctxt->setContextProperty("testData", 5); - TestObject *testObject = new TestObject; - ctxt->setContextProperty("testObject", testObject); - - canvas->setSource(testFileUrl("intmodel.qml")); - qApp->processEvents(); - - QQuickRepeater *repeater = findItem<QQuickRepeater>(canvas->rootObject(), "repeater"); - QVERIFY(repeater != 0); - QCOMPARE(repeater->parentItem()->childItems().count(), 5+1); - - QVERIFY(!repeater->itemAt(-1)); - for (int i=0; i<repeater->count(); i++) - QCOMPARE(repeater->itemAt(i), repeater->parentItem()->childItems().at(i)); - QVERIFY(!repeater->itemAt(repeater->count())); - - QMetaObject::invokeMethod(canvas->rootObject(), "checkProperties"); - QVERIFY(testObject->error() == false); - - delete testObject; - delete canvas; -} - -class MyObject : public QObject -{ - Q_OBJECT - Q_PROPERTY(int idx READ idx CONSTANT) -public: - MyObject(int i) : QObject(), m_idx(i) {} - - int idx() const { return m_idx; } - - int m_idx; -}; - -void tst_QQuickRepeater::objectList() -{ - QQuickView *canvas = createView(); - QObjectList data; - for (int i=0; i<100; i++) - data << new MyObject(i); - - QDeclarativeContext *ctxt = canvas->rootContext(); - ctxt->setContextProperty("testData", QVariant::fromValue(data)); - - canvas->setSource(testFileUrl("objlist.qml")); - qApp->processEvents(); - - QQuickRepeater *repeater = findItem<QQuickRepeater>(canvas->rootObject(), "repeater"); - QVERIFY(repeater != 0); - QCOMPARE(repeater->property("errors").toInt(), 0);//If this fails either they are out of order or can't find the object's data - QCOMPARE(repeater->property("instantiated").toInt(), 100); - - QVERIFY(!repeater->itemAt(-1)); - for (int i=0; i<data.count(); i++) - QCOMPARE(repeater->itemAt(i), repeater->parentItem()->childItems().at(i)); - QVERIFY(!repeater->itemAt(data.count())); - - QSignalSpy addedSpy(repeater, SIGNAL(itemAdded(int,QQuickItem*))); - QSignalSpy removedSpy(repeater, SIGNAL(itemRemoved(int,QQuickItem*))); - ctxt->setContextProperty("testData", QVariant::fromValue(data)); - QCOMPARE(addedSpy.count(), data.count()); - QCOMPARE(removedSpy.count(), data.count()); - - qDeleteAll(data); - delete canvas; -} - -/* -The Repeater element creates children at its own position in its parent's -stacking order. In this test we insert a repeater between two other Text -elements to test this. -*/ -void tst_QQuickRepeater::stringList() -{ - QQuickView *canvas = createView(); - - QStringList data; - data << "One"; - data << "Two"; - data << "Three"; - data << "Four"; - - QDeclarativeContext *ctxt = canvas->rootContext(); - ctxt->setContextProperty("testData", data); - - canvas->setSource(testFileUrl("repeater1.qml")); - qApp->processEvents(); - - QQuickRepeater *repeater = findItem<QQuickRepeater>(canvas->rootObject(), "repeater"); - QVERIFY(repeater != 0); - - QQuickItem *container = findItem<QQuickItem>(canvas->rootObject(), "container"); - QVERIFY(container != 0); - - QCOMPARE(container->childItems().count(), data.count() + 3); - - bool saw_repeater = false; - for (int i = 0; i < container->childItems().count(); ++i) { - - if (i == 0) { - QQuickText *name = qobject_cast<QQuickText*>(container->childItems().at(i)); - QVERIFY(name != 0); - QCOMPARE(name->text(), QLatin1String("Zero")); - } else if (i == container->childItems().count() - 2) { - // The repeater itself - QQuickRepeater *rep = qobject_cast<QQuickRepeater*>(container->childItems().at(i)); - QCOMPARE(rep, repeater); - saw_repeater = true; - continue; - } else if (i == container->childItems().count() - 1) { - QQuickText *name = qobject_cast<QQuickText*>(container->childItems().at(i)); - QVERIFY(name != 0); - QCOMPARE(name->text(), QLatin1String("Last")); - } else { - QQuickText *name = qobject_cast<QQuickText*>(container->childItems().at(i)); - QVERIFY(name != 0); - QCOMPARE(name->text(), data.at(i-1)); - } - } - QVERIFY(saw_repeater); - - delete canvas; -} - -void tst_QQuickRepeater::dataModel_adding() -{ - QQuickView *canvas = createView(); - QDeclarativeContext *ctxt = canvas->rootContext(); - TestObject *testObject = new TestObject; - ctxt->setContextProperty("testObject", testObject); - - QaimModel testModel; - ctxt->setContextProperty("testData", &testModel); - canvas->setSource(testFileUrl("repeater2.qml")); - qApp->processEvents(); - - QQuickRepeater *repeater = findItem<QQuickRepeater>(canvas->rootObject(), "repeater"); - QVERIFY(repeater != 0); - QQuickItem *container = findItem<QQuickItem>(canvas->rootObject(), "container"); - QVERIFY(container != 0); - - QVERIFY(!repeater->itemAt(0)); - - QSignalSpy countSpy(repeater, SIGNAL(countChanged())); - QSignalSpy addedSpy(repeater, SIGNAL(itemAdded(int,QQuickItem*))); - - // add to empty model - testModel.addItem("two", "2"); - QCOMPARE(repeater->itemAt(0), container->childItems().at(0)); - QCOMPARE(countSpy.count(), 1); countSpy.clear(); - QCOMPARE(addedSpy.count(), 1); - QCOMPARE(addedSpy.at(0).at(0).toInt(), 0); - QCOMPARE(addedSpy.at(0).at(1).value<QQuickItem*>(), container->childItems().at(0)); - addedSpy.clear(); - - // insert at start - testModel.insertItem(0, "one", "1"); - QCOMPARE(repeater->itemAt(0), container->childItems().at(0)); - QCOMPARE(countSpy.count(), 1); countSpy.clear(); - QCOMPARE(addedSpy.count(), 1); - QCOMPARE(addedSpy.at(0).at(0).toInt(), 0); - QCOMPARE(addedSpy.at(0).at(1).value<QQuickItem*>(), container->childItems().at(0)); - addedSpy.clear(); - - // insert at end - testModel.insertItem(2, "four", "4"); - QCOMPARE(repeater->itemAt(2), container->childItems().at(2)); - QCOMPARE(countSpy.count(), 1); countSpy.clear(); - QCOMPARE(addedSpy.count(), 1); - QCOMPARE(addedSpy.at(0).at(0).toInt(), 2); - QCOMPARE(addedSpy.at(0).at(1).value<QQuickItem*>(), container->childItems().at(2)); - addedSpy.clear(); - - // insert in middle - testModel.insertItem(2, "three", "3"); - QCOMPARE(repeater->itemAt(2), container->childItems().at(2)); - QCOMPARE(countSpy.count(), 1); countSpy.clear(); - QCOMPARE(addedSpy.count(), 1); - QCOMPARE(addedSpy.at(0).at(0).toInt(), 2); - QCOMPARE(addedSpy.at(0).at(1).value<QQuickItem*>(), container->childItems().at(2)); - addedSpy.clear(); - - delete testObject; - addedSpy.clear(); - countSpy.clear(); - delete canvas; -} - -void tst_QQuickRepeater::dataModel_removing() -{ - QQuickView *canvas = createView(); - QDeclarativeContext *ctxt = canvas->rootContext(); - TestObject *testObject = new TestObject; - ctxt->setContextProperty("testObject", testObject); - - QaimModel testModel; - testModel.addItem("one", "1"); - testModel.addItem("two", "2"); - testModel.addItem("three", "3"); - testModel.addItem("four", "4"); - testModel.addItem("five", "5"); - - ctxt->setContextProperty("testData", &testModel); - canvas->setSource(testFileUrl("repeater2.qml")); - qApp->processEvents(); - - QQuickRepeater *repeater = findItem<QQuickRepeater>(canvas->rootObject(), "repeater"); - QVERIFY(repeater != 0); - QQuickItem *container = findItem<QQuickItem>(canvas->rootObject(), "container"); - QVERIFY(container != 0); - QCOMPARE(container->childItems().count(), repeater->count()+1); - - QSignalSpy countSpy(repeater, SIGNAL(countChanged())); - QSignalSpy removedSpy(repeater, SIGNAL(itemRemoved(int,QQuickItem*))); - - // remove at start - QQuickItem *item = repeater->itemAt(0); - QCOMPARE(item, container->childItems().at(0)); - - testModel.removeItem(0); - QVERIFY(repeater->itemAt(0) != item); - QCOMPARE(countSpy.count(), 1); countSpy.clear(); - QCOMPARE(removedSpy.count(), 1); - QCOMPARE(removedSpy.at(0).at(0).toInt(), 0); - QCOMPARE(removedSpy.at(0).at(1).value<QQuickItem*>(), item); - removedSpy.clear(); - - // remove at end - int lastIndex = testModel.count()-1; - item = repeater->itemAt(lastIndex); - QCOMPARE(item, container->childItems().at(lastIndex)); - - testModel.removeItem(lastIndex); - QVERIFY(repeater->itemAt(lastIndex) != item); - QCOMPARE(countSpy.count(), 1); countSpy.clear(); - QCOMPARE(removedSpy.count(), 1); - QCOMPARE(removedSpy.at(0).at(0).toInt(), lastIndex); - QCOMPARE(removedSpy.at(0).at(1).value<QQuickItem*>(), item); - removedSpy.clear(); - - // remove from middle - item = repeater->itemAt(1); - QCOMPARE(item, container->childItems().at(1)); - - testModel.removeItem(1); - QVERIFY(repeater->itemAt(lastIndex) != item); - QCOMPARE(countSpy.count(), 1); countSpy.clear(); - QCOMPARE(removedSpy.count(), 1); - QCOMPARE(removedSpy.at(0).at(0).toInt(), 1); - QCOMPARE(removedSpy.at(0).at(1).value<QQuickItem*>(), item); - removedSpy.clear(); - - delete testObject; - delete canvas; -} - -void tst_QQuickRepeater::dataModel_changes() -{ - QQuickView *canvas = createView(); - QDeclarativeContext *ctxt = canvas->rootContext(); - TestObject *testObject = new TestObject; - ctxt->setContextProperty("testObject", testObject); - - QaimModel testModel; - testModel.addItem("one", "1"); - testModel.addItem("two", "2"); - testModel.addItem("three", "3"); - - ctxt->setContextProperty("testData", &testModel); - canvas->setSource(testFileUrl("repeater2.qml")); - qApp->processEvents(); - - QQuickRepeater *repeater = findItem<QQuickRepeater>(canvas->rootObject(), "repeater"); - QVERIFY(repeater != 0); - QQuickItem *container = findItem<QQuickItem>(canvas->rootObject(), "container"); - QVERIFY(container != 0); - QCOMPARE(container->childItems().count(), repeater->count()+1); - - // Check that model changes are propagated - QQuickText *text = findItem<QQuickText>(canvas->rootObject(), "myName", 1); - QVERIFY(text); - QCOMPARE(text->text(), QString("two")); - - testModel.modifyItem(1, "Item two", "_2"); - text = findItem<QQuickText>(canvas->rootObject(), "myName", 1); - QVERIFY(text); - QCOMPARE(text->text(), QString("Item two")); - - text = findItem<QQuickText>(canvas->rootObject(), "myNumber", 1); - QVERIFY(text); - QCOMPARE(text->text(), QString("_2")); - - delete testObject; - delete canvas; -} - -void tst_QQuickRepeater::itemModel() -{ - QQuickView *canvas = createView(); - QDeclarativeContext *ctxt = canvas->rootContext(); - TestObject *testObject = new TestObject; - ctxt->setContextProperty("testObject", testObject); - - canvas->setSource(testFileUrl("itemlist.qml")); - qApp->processEvents(); - - QQuickRepeater *repeater = findItem<QQuickRepeater>(canvas->rootObject(), "repeater"); - QVERIFY(repeater != 0); - - QQuickItem *container = findItem<QQuickItem>(canvas->rootObject(), "container"); - QVERIFY(container != 0); - - QCOMPARE(container->childItems().count(), 1); - - testObject->setUseModel(true); - QMetaObject::invokeMethod(canvas->rootObject(), "checkProperties"); - QVERIFY(testObject->error() == false); - - QCOMPARE(container->childItems().count(), 4); - QVERIFY(qobject_cast<QObject*>(container->childItems().at(0))->objectName() == "item1"); - QVERIFY(qobject_cast<QObject*>(container->childItems().at(1))->objectName() == "item2"); - QVERIFY(qobject_cast<QObject*>(container->childItems().at(2))->objectName() == "item3"); - QVERIFY(container->childItems().at(3) == repeater); - - QMetaObject::invokeMethod(canvas->rootObject(), "switchModel"); - QCOMPARE(container->childItems().count(), 3); - QVERIFY(qobject_cast<QObject*>(container->childItems().at(0))->objectName() == "item4"); - QVERIFY(qobject_cast<QObject*>(container->childItems().at(1))->objectName() == "item5"); - QVERIFY(container->childItems().at(2) == repeater); - - testObject->setUseModel(false); - QCOMPARE(container->childItems().count(), 1); - - delete testObject; - delete canvas; -} - -void tst_QQuickRepeater::resetModel() -{ - QQuickView *canvas = createView(); - - QStringList dataA; - for (int i=0; i<10; i++) - dataA << QString::number(i); - - QDeclarativeContext *ctxt = canvas->rootContext(); - ctxt->setContextProperty("testData", dataA); - canvas->setSource(testFileUrl("repeater1.qml")); - qApp->processEvents(); - QQuickRepeater *repeater = findItem<QQuickRepeater>(canvas->rootObject(), "repeater"); - QVERIFY(repeater != 0); - QQuickItem *container = findItem<QQuickItem>(canvas->rootObject(), "container"); - QVERIFY(container != 0); - - QCOMPARE(repeater->count(), dataA.count()); - for (int i=0; i<repeater->count(); i++) - QCOMPARE(repeater->itemAt(i), container->childItems().at(i+1)); // +1 to skip first Text object - - QSignalSpy modelChangedSpy(repeater, SIGNAL(modelChanged())); - QSignalSpy countSpy(repeater, SIGNAL(countChanged())); - QSignalSpy addedSpy(repeater, SIGNAL(itemAdded(int,QQuickItem*))); - QSignalSpy removedSpy(repeater, SIGNAL(itemRemoved(int,QQuickItem*))); - - QStringList dataB; - for (int i=0; i<20; i++) - dataB << QString::number(i); - - // reset context property - ctxt->setContextProperty("testData", dataB); - QCOMPARE(repeater->count(), dataB.count()); - - QCOMPARE(modelChangedSpy.count(), 1); - QCOMPARE(countSpy.count(), 1); - QCOMPARE(removedSpy.count(), dataA.count()); - QCOMPARE(addedSpy.count(), dataB.count()); - for (int i=0; i<dataB.count(); i++) { - QCOMPARE(addedSpy.at(i).at(0).toInt(), i); - QCOMPARE(addedSpy.at(i).at(1).value<QQuickItem*>(), repeater->itemAt(i)); - } - modelChangedSpy.clear(); - countSpy.clear(); - removedSpy.clear(); - addedSpy.clear(); - - // reset via setModel() - repeater->setModel(dataA); - QCOMPARE(repeater->count(), dataA.count()); - - QCOMPARE(modelChangedSpy.count(), 1); - QCOMPARE(countSpy.count(), 1); - QCOMPARE(removedSpy.count(), dataB.count()); - QCOMPARE(addedSpy.count(), dataA.count()); - for (int i=0; i<dataA.count(); i++) { - QCOMPARE(addedSpy.at(i).at(0).toInt(), i); - QCOMPARE(addedSpy.at(i).at(1).value<QQuickItem*>(), repeater->itemAt(i)); - } - - modelChangedSpy.clear(); - countSpy.clear(); - removedSpy.clear(); - addedSpy.clear(); - - delete canvas; -} - -// QTBUG-17156 -void tst_QQuickRepeater::modelChanged() -{ - QDeclarativeEngine engine; - QDeclarativeComponent component(&engine, testFileUrl("modelChanged.qml")); - - QQuickItem *rootObject = qobject_cast<QQuickItem*>(component.create()); - QVERIFY(rootObject); - QQuickRepeater *repeater = findItem<QQuickRepeater>(rootObject, "repeater"); - QVERIFY(repeater); - - repeater->setModel(4); - QCOMPARE(repeater->count(), 4); - QCOMPARE(repeater->property("itemsCount").toInt(), 4); - QCOMPARE(repeater->property("itemsFound").toList().count(), 4); - - repeater->setModel(10); - QCOMPARE(repeater->count(), 10); - QCOMPARE(repeater->property("itemsCount").toInt(), 10); - QCOMPARE(repeater->property("itemsFound").toList().count(), 10); - - delete rootObject; -} - -void tst_QQuickRepeater::properties() -{ - QDeclarativeEngine engine; - QDeclarativeComponent component(&engine, testFileUrl("properties.qml")); - - QQuickItem *rootObject = qobject_cast<QQuickItem*>(component.create()); - QVERIFY(rootObject); - - QQuickRepeater *repeater = findItem<QQuickRepeater>(rootObject, "repeater"); - QVERIFY(repeater); - - QSignalSpy modelSpy(repeater, SIGNAL(modelChanged())); - repeater->setModel(3); - QCOMPARE(modelSpy.count(),1); - repeater->setModel(3); - QCOMPARE(modelSpy.count(),1); - - QSignalSpy delegateSpy(repeater, SIGNAL(delegateChanged())); - - QDeclarativeComponent rectComponent(&engine); - rectComponent.setData("import QtQuick 2.0; Rectangle {}", QUrl::fromLocalFile("")); - - repeater->setDelegate(&rectComponent); - QCOMPARE(delegateSpy.count(),1); - repeater->setDelegate(&rectComponent); - QCOMPARE(delegateSpy.count(),1); - - delete rootObject; -} - -void tst_QQuickRepeater::asynchronous() -{ - QQuickView *canvas = createView(); - canvas->show(); - QDeclarativeIncubationController controller; - canvas->engine()->setIncubationController(&controller); - - canvas->setSource(testFileUrl("asyncloader.qml")); - - QQuickItem *rootObject = qobject_cast<QQuickItem*>(canvas->rootObject()); - QVERIFY(rootObject); - - QQuickItem *container = findItem<QQuickItem>(rootObject, "container"); - QVERIFY(!container); - while (!container) { - bool b = false; - controller.incubateWhile(&b); - container = findItem<QQuickItem>(rootObject, "container"); - } - - QQuickRepeater *repeater = 0; - while (!repeater) { - bool b = false; - controller.incubateWhile(&b); - repeater = findItem<QQuickRepeater>(rootObject, "repeater"); - } - - // items will be created one at a time - for (int i = 0; i < 10; ++i) { - QString name("delegate"); - name += QString::number(i); - QVERIFY(findItem<QQuickItem>(container, name) == 0); - QQuickItem *item = 0; - while (!item) { - bool b = false; - controller.incubateWhile(&b); - item = findItem<QQuickItem>(container, name); - } - } - - { - bool b = true; - controller.incubateWhile(&b); - } - - // verify positioning - for (int i = 0; i < 10; ++i) { - QString name("delegate"); - name += QString::number(i); - QQuickItem *item = findItem<QQuickItem>(container, name); - QTRY_COMPARE(item->y(), i * 50.0); - } - - delete canvas; -} - -void tst_QQuickRepeater::initParent() -{ - QDeclarativeEngine engine; - QDeclarativeComponent component(&engine, testFileUrl("initparent.qml")); - - QQuickItem *rootObject = qobject_cast<QQuickItem*>(component.create()); - QVERIFY(rootObject); - - QCOMPARE(qvariant_cast<QQuickItem*>(rootObject->property("parentItem")), rootObject); -} - -QTEST_MAIN(tst_QQuickRepeater) - -#include "tst_qquickrepeater.moc" |