From 2b5432bd63483998da39aa4eadfb10d0e43ba0b6 Mon Sep 17 00:00:00 2001 From: Andrew den Exter Date: Tue, 8 Nov 2011 13:00:02 +1000 Subject: [PATCH] Extend VisualDataModel tests to cover Package delegates. Verify the existing tests also pass if a package delegate is used. Fixes incorrect changes being emitted when the group a part model is filtered on changes and package items not being un-parented when destroyed. Change-Id: Ib4be42274b0a0460ae9b763a9737f4a6d3b94603 Reviewed-by: Martin Jones --- src/declarative/items/qquickvisualdatamodel.cpp | 6 +- .../data/datalist-package.qml | 20 +++ .../qquickvisualdatamodel/data/groups-package.qml | 52 +++++++++ .../qquickvisualdatamodel/data/groups.qml | 8 +- .../tst_qquickvisualdatamodel.cpp | 122 ++++++++++++++++---- 5 files changed, 184 insertions(+), 24 deletions(-) create mode 100644 tests/auto/declarative/qquickvisualdatamodel/data/datalist-package.qml create mode 100644 tests/auto/declarative/qquickvisualdatamodel/data/groups-package.qml diff --git a/src/declarative/items/qquickvisualdatamodel.cpp b/src/declarative/items/qquickvisualdatamodel.cpp index b9d97e7..8852dce 100644 --- a/src/declarative/items/qquickvisualdatamodel.cpp +++ b/src/declarative/items/qquickvisualdatamodel.cpp @@ -2375,7 +2375,7 @@ void QQuickVisualPartsModel::updateFilterGroup() if (m_inheritGroup) return; - QDeclarativeListCompositor::Group previousGroup = model->m_compositorGroup; + QDeclarativeListCompositor::Group previousGroup = m_compositorGroup; m_compositorGroup = Compositor::Default; QQuickVisualDataGroupPrivate::get(model->m_groups[Compositor::Default])->emitters.insert(this); for (int i = 1; i < model->m_groupCount; ++i) { @@ -2477,8 +2477,10 @@ QQuickVisualModel::ReleaseFlags QQuickVisualPartsModel::release(QQuickItem *item m_packaged.erase(it); if (!m_packaged.contains(item)) flags &= ~Referenced; - if (flags & Destroyed) + if (flags & Destroyed) { QQuickVisualDataModelPrivate::get(m_model)->emitDestroyingPackage(package); + item->setParentItem(0); + } } return flags; } diff --git a/tests/auto/declarative/qquickvisualdatamodel/data/datalist-package.qml b/tests/auto/declarative/qquickvisualdatamodel/data/datalist-package.qml new file mode 100644 index 0000000..ae3bd81 --- /dev/null +++ b/tests/auto/declarative/qquickvisualdatamodel/data/datalist-package.qml @@ -0,0 +1,20 @@ +import QtQuick 2.0 + +ListView { + width: 100 + height: 100 + model: visualModel.parts.package + VisualDataModel { + id: visualModel + objectName: "visualModel" + model: myModel + delegate: Package { + Rectangle { + height: 25 + width: 100 + Package.name: "package" + Text { objectName: "display"; text: display } + } + } + } +} diff --git a/tests/auto/declarative/qquickvisualdatamodel/data/groups-package.qml b/tests/auto/declarative/qquickvisualdatamodel/data/groups-package.qml new file mode 100644 index 0000000..ea5ad5d --- /dev/null +++ b/tests/auto/declarative/qquickvisualdatamodel/data/groups-package.qml @@ -0,0 +1,52 @@ +import QtQuick 2.0 + +ListView { + width: 100 + height: 100 + + function contains(array, value) { + for (var i = 0; i < array.length; ++i) + if (array[i] == value) + return true + return false + } + model: visualModel.parts.package + + VisualDataModel { + id: visualModel + + objectName: "visualModel" + + groups: [ + VisualDataGroup { id: visibleItems; objectName: "visibleItems"; name: "visible"; includeByDefault: true }, + VisualDataGroup { id: selectedItems; objectName: "selectedItems"; name: "selected" } + ] + + model: myModel + delegate: Package { + id: delegate + + property variant test1: name + property variant test2: index + property variant test3: VisualDataModel.itemsIndex + property variant test4: VisualDataModel.inItems + property variant test5: VisualDataModel.visibleIndex + property variant test6: VisualDataModel.inVisible + property variant test7: VisualDataModel.selectedIndex + property variant test8: VisualDataModel.inSelected + property variant test9: VisualDataModel.groups + + function hide() { VisualDataModel.inVisible = false } + function select() { VisualDataModel.inSelected = true } + + Item { + Package.name: "package" + + objectName: "delegate" + width: 100 + height: 2 + } + } + } + +} diff --git a/tests/auto/declarative/qquickvisualdatamodel/data/groups.qml b/tests/auto/declarative/qquickvisualdatamodel/data/groups.qml index a24e223..7502dd2 100644 --- a/tests/auto/declarative/qquickvisualdatamodel/data/groups.qml +++ b/tests/auto/declarative/qquickvisualdatamodel/data/groups.qml @@ -11,7 +11,12 @@ ListView { return false } - model: VisualDataModel { + model: visualModel + VisualDataModel { + id: visualModel + + objectName: "visualModel" + groups: [ VisualDataGroup { id: visibleItems; objectName: "visibleItems"; name: "visible"; includeByDefault: true }, VisualDataGroup { id: selectedItems; objectName: "selectedItems"; name: "selected" } @@ -20,6 +25,7 @@ ListView { model: myModel delegate: Item { id: delegate + objectName: "delegate" width: 100 height: 2 diff --git a/tests/auto/declarative/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp b/tests/auto/declarative/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp index aba760d..c997ec8 100644 --- a/tests/auto/declarative/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp +++ b/tests/auto/declarative/qquickvisualdatamodel/tst_qquickvisualdatamodel.cpp @@ -122,16 +122,22 @@ private slots: void initTestCase(); void cleanupTestCase(); void rootIndex(); + void updateLayout_data(); void updateLayout(); + void childChanged_data(); void childChanged(); void objectListModel(); void singleRole(); void modelProperties(); + void noDelegate_data(); void noDelegate(); void qaimRowsMoved(); void qaimRowsMoved_data(); + void remove_data(); void remove(); + void move_data(); void move(); + void groups_data(); void groups(); void get(); void create(); @@ -262,8 +268,18 @@ void tst_qquickvisualdatamodel::rootIndex() delete obj; } +void tst_qquickvisualdatamodel::updateLayout_data() +{ + QTest::addColumn("source"); + + QTest::newRow("item delegate") << QUrl::fromLocalFile(TESTDATA("datalist.qml")); + QTest::newRow("package delegate") << QUrl::fromLocalFile(TESTDATA("datalist-package.qml")); +} + void tst_qquickvisualdatamodel::updateLayout() { + QFETCH(QUrl, source); + QQuickView view; QStandardItemModel model; @@ -271,7 +287,7 @@ void tst_qquickvisualdatamodel::updateLayout() view.rootContext()->setContextProperty("myModel", &model); - view.setSource(QUrl::fromLocalFile(TESTDATA("datalist.qml"))); + view.setSource(source); QQuickListView *listview = qobject_cast(view.rootObject()); QVERIFY(listview != 0); @@ -302,8 +318,18 @@ void tst_qquickvisualdatamodel::updateLayout() QCOMPARE(name->text(), QString("Row 1 Item")); } +void tst_qquickvisualdatamodel::childChanged_data() +{ + QTest::addColumn("source"); + + QTest::newRow("item delegate") << QUrl::fromLocalFile(TESTDATA("datalist.qml")); + QTest::newRow("package delegate") << QUrl::fromLocalFile(TESTDATA("datalist-package.qml")); +} + void tst_qquickvisualdatamodel::childChanged() { + QFETCH(QUrl, source); + QQuickView view; QStandardItemModel model; @@ -311,7 +337,7 @@ void tst_qquickvisualdatamodel::childChanged() view.rootContext()->setContextProperty("myModel", &model); - view.setSource(QUrl::fromLocalFile(TESTDATA("datalist.qml"))); + view.setSource(source); QQuickListView *listview = qobject_cast(view.rootObject()); QVERIFY(listview != 0); @@ -567,8 +593,18 @@ void tst_qquickvisualdatamodel::modelProperties() //### should also test QStringList and QVariantList } +void tst_qquickvisualdatamodel::noDelegate_data() +{ + QTest::addColumn("source"); + + QTest::newRow("item delegate") << QUrl::fromLocalFile(TESTDATA("datalist.qml")); + QTest::newRow("package delegate") << QUrl::fromLocalFile(TESTDATA("datalist-package.qml")); +} + void tst_qquickvisualdatamodel::noDelegate() { + QFETCH(QUrl, source); + QQuickView view; QStandardItemModel model; @@ -576,7 +612,7 @@ void tst_qquickvisualdatamodel::noDelegate() view.rootContext()->setContextProperty("myModel", &model); - view.setSource(QUrl::fromLocalFile(TESTDATA("datalist.qml"))); + view.setSource(source); QQuickListView *listview = qobject_cast(view.rootObject()); QVERIFY(listview != 0); @@ -669,6 +705,19 @@ void tst_qquickvisualdatamodel::qaimRowsMoved_data() << 10 << 1 << 5; } +void tst_qquickvisualdatamodel::remove_data() +{ + QTest::addColumn("source"); + QTest::addColumn("package delegate"); + + QTest::newRow("item delegate") + << QUrl::fromLocalFile(TESTDATA("groups.qml")) + << QString(); + QTest::newRow("package") + << QUrl::fromLocalFile(TESTDATA("groups-package.qml")) + << QString("package."); +} + void tst_qquickvisualdatamodel::remove() { QQuickView view; @@ -766,6 +815,19 @@ void tst_qquickvisualdatamodel::remove() } } +void tst_qquickvisualdatamodel::move_data() +{ + QTest::addColumn("source"); + QTest::addColumn("package delegate"); + + QTest::newRow("item delegate") + << QUrl::fromLocalFile(TESTDATA("groups.qml")) + << QString(); + QTest::newRow("package") + << QUrl::fromLocalFile(TESTDATA("groups-package.qml")) + << QString("package."); +} + void tst_qquickvisualdatamodel::move() { QQuickView view; @@ -906,6 +968,18 @@ void tst_qquickvisualdatamodel::move() } } +void tst_qquickvisualdatamodel::groups_data() +{ + QTest::addColumn("source"); + QTest::addColumn("part"); + + QTest::newRow("item delegate") + << QUrl::fromLocalFile(TESTDATA("groups.qml")) + << QString(); + QTest::newRow("package") + << QUrl::fromLocalFile(TESTDATA("groups-package.qml")) + << QString("visualModel.parts.package."); +} template void tst_qquickvisualdatamodel::groups_verify( const SingleRoleModel &model, @@ -921,17 +995,17 @@ template void tst_qquickvisualdatamodel::groups_verify( for (int i = 0; i < N; ++i) { QQuickItem *delegate = findItem(contentItem, "delegate", mIndex[i]); QVERIFY(delegate); - QCOMPARE(delegate->property("test1").toString(), model.list.at(mIndex[i])); - QCOMPARE(delegate->property("test2").toInt() , mIndex[i]); - QCOMPARE(delegate->property("test3").toInt() , iIndex[i]); - QCOMPARE(delegate->property("test4").toBool(), true); - QCOMPARE(delegate->property("test5").toInt() , vIndex[i]); - QCOMPARE(delegate->property("test6").toBool(), vMember[i]); - QCOMPARE(delegate->property("test7").toInt() , sIndex[i]); - QCOMPARE(delegate->property("test8").toBool(), sMember[i]); - QCOMPARE(delegate->property("test9").toStringList().contains("items") , QBool(true)); - QCOMPARE(delegate->property("test9").toStringList().contains("visible") , QBool(vMember[i])); - QCOMPARE(delegate->property("test9").toStringList().contains("selected"), QBool(sMember[i])); + QCOMPARE(evaluate(delegate, "test1"), model.list.at(mIndex[i])); + QCOMPARE(evaluate(delegate, "test2") , mIndex[i]); + QCOMPARE(evaluate(delegate, "test3") , iIndex[i]); + QCOMPARE(evaluate(delegate, "test4"), true); + QCOMPARE(evaluate(delegate, "test5") , vIndex[i]); + QCOMPARE(evaluate(delegate, "test6"), vMember[i]); + QCOMPARE(evaluate(delegate, "test7") , sIndex[i]); + QCOMPARE(evaluate(delegate, "test8"), sMember[i]); + QCOMPARE(evaluate(delegate, "test9").contains("items") , QBool(true)); + QCOMPARE(evaluate(delegate, "test9").contains("visible") , QBool(vMember[i])); + QCOMPARE(evaluate(delegate, "test9").contains("selected"), QBool(sMember[i])); } failed = false; } @@ -943,6 +1017,9 @@ template void tst_qquickvisualdatamodel::groups_verify( void tst_qquickvisualdatamodel::groups() { + QFETCH(QUrl, source); + QFETCH(QString, part); + QQuickView view; SingleRoleModel model; @@ -963,7 +1040,7 @@ void tst_qquickvisualdatamodel::groups() QDeclarativeContext *ctxt = view.rootContext(); ctxt->setContextProperty("myModel", &model); - view.setSource(QUrl::fromLocalFile(TESTDATA("groups.qml"))); + view.setSource(source); QQuickListView *listview = qobject_cast(view.rootObject()); QVERIFY(listview != 0); @@ -971,13 +1048,13 @@ void tst_qquickvisualdatamodel::groups() QQuickItem *contentItem = listview->contentItem(); QVERIFY(contentItem != 0); - QQuickVisualDataModel *visualModel = qobject_cast(qvariant_cast(listview->model())); + QQuickVisualDataModel *visualModel = listview->findChild("visualModel"); QVERIFY(visualModel); - QQuickVisualDataGroup *visibleItems = visualModel->findChild("visibleItems"); + QQuickVisualDataGroup *visibleItems = listview->findChild("visibleItems"); QVERIFY(visibleItems); - QQuickVisualDataGroup *selectedItems = visualModel->findChild("selectedItems"); + QQuickVisualDataGroup *selectedItems = listview->findChild("selectedItems"); QVERIFY(selectedItems); const bool f = false; @@ -1130,19 +1207,22 @@ void tst_qquickvisualdatamodel::groups() QCOMPARE(visibleItems->count(), 9); QCOMPARE(selectedItems->count(), 2); } { - evaluate(visualModel, "filterOnGroup = \"visible\""); + evaluate(visualModel, part + "filterOnGroup = \"visible\""); + qDebug() << "listview->count()" << listview->count(); QCOMPARE(listview->count(), 9); QCOMPARE(visualModel->items()->count(), 12); QCOMPARE(visibleItems->count(), 9); QCOMPARE(selectedItems->count(), 2); } { - evaluate(visualModel, "filterOnGroup = \"selected\""); + evaluate(visualModel, part + "filterOnGroup = \"selected\""); + qDebug() << "listview->count()" << listview->count(); QCOMPARE(listview->count(), 2); QCOMPARE(visualModel->items()->count(), 12); QCOMPARE(visibleItems->count(), 9); QCOMPARE(selectedItems->count(), 2); } { - evaluate(visualModel, "filterOnGroup = \"items\""); + evaluate(visualModel, part + "filterOnGroup = \"items\""); + qDebug() << "listview->count()" << listview->count(); QCOMPARE(listview->count(), 12); QCOMPARE(visualModel->items()->count(), 12); QCOMPARE(visibleItems->count(), 9); -- 1.7.2.5