aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/quick/qquickxmllistmodel
diff options
context:
space:
mode:
authorJan Arve Saether <jan-arve.saether@digia.com>2013-07-04 12:14:44 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-07-09 10:25:34 +0200
commitddcf9fc80e074c5a9d1ecbbf3c60ca27f250ce98 (patch)
tree693ce9ea643a8e3db6b4089cc4a8db8bce6a316b /tests/auto/quick/qquickxmllistmodel
parentcc2d34486360a1a65312f72ca4959228b9ab0c75 (diff)
Don't assume that the last step of the XPath is an element name
In order to find the number of items in the model, the model did a second query on the document representing the result set. So, suppose the user queried for //a/b/c, the result set would contain all the 'c' elements from the input document. In order to find the number of items in the result set, it did a second query with the expression "count(/dummy:items/c)", where 'c' was extracted from the last step in the original XPath expression For simple expressions, this worked fine. However, if the last step had a predicate such as "//c/parent::b" it didn't work. The solution is to not filter *again* the last step when we query for the count, since we know that all result items are direct children of "dummy:items", and instead just execute the query "count(dummy::items/*)". This should also potentially improve performance. Task-number: QTBUG-17588 Change-Id: Ib2fdf1ec8b91022df0597e089ad34d34b04428b0 Reviewed-by: Alan Alpert <aalpert@blackberry.com>
Diffstat (limited to 'tests/auto/quick/qquickxmllistmodel')
-rw-r--r--tests/auto/quick/qquickxmllistmodel/data/groups.qml10
-rw-r--r--tests/auto/quick/qquickxmllistmodel/data/groups.xml18
-rw-r--r--tests/auto/quick/qquickxmllistmodel/qquickxmllistmodel.pro3
-rw-r--r--tests/auto/quick/qquickxmllistmodel/tst_qquickxmllistmodel.cpp13
4 files changed, 44 insertions, 0 deletions
diff --git a/tests/auto/quick/qquickxmllistmodel/data/groups.qml b/tests/auto/quick/qquickxmllistmodel/data/groups.qml
new file mode 100644
index 0000000000..c1b574a822
--- /dev/null
+++ b/tests/auto/quick/qquickxmllistmodel/data/groups.qml
@@ -0,0 +1,10 @@
+import QtQuick 2.0
+import QtQuick.XmlListModel 2.0
+
+XmlListModel {
+ source: "groups.xml"
+ query: "//animal[@name='Garfield']/parent::group"
+
+ XmlRole { name: "id"; query: "@id/string()" }
+ XmlRole { name: "name"; query: "@name/string()" }
+}
diff --git a/tests/auto/quick/qquickxmllistmodel/data/groups.xml b/tests/auto/quick/qquickxmllistmodel/data/groups.xml
new file mode 100644
index 0000000000..5de4d2ec71
--- /dev/null
+++ b/tests/auto/quick/qquickxmllistmodel/data/groups.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<groups version="2.0">
+ <group id="1" name="Animals" type="root">
+ <group id="11" name="dogs">
+ <animal id="111" name="Lassie"/>
+ <animal id="112" name="Laika"/>
+ <animal id="113" name="Wile E. Coyote" type="fictional"/>
+ </group>
+ <group id="12" name="cats">
+ <animal id="121" name="Garfield" type="fictional"/>
+ <animal id="122" name="Sylvester" type="fictional"/>
+ </group>
+ <group id="13" name="birds">
+ <animal id="131" name="Donald Duck" type="fictional"/>
+ <animal id="132" name="Phoenix" type="fictional"/>
+ </group>
+ </group>
+</groups>
diff --git a/tests/auto/quick/qquickxmllistmodel/qquickxmllistmodel.pro b/tests/auto/quick/qquickxmllistmodel/qquickxmllistmodel.pro
index 047d8ca560..9172a224f7 100644
--- a/tests/auto/quick/qquickxmllistmodel/qquickxmllistmodel.pro
+++ b/tests/auto/quick/qquickxmllistmodel/qquickxmllistmodel.pro
@@ -12,3 +12,6 @@ CONFIG += parallel_test
QT += core-private gui-private v8-private qml-private network testlib xmlpatterns
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
+
+OTHER_FILES += \
+ data/groups.qml
diff --git a/tests/auto/quick/qquickxmllistmodel/tst_qquickxmllistmodel.cpp b/tests/auto/quick/qquickxmllistmodel/tst_qquickxmllistmodel.cpp
index 847cc5078d..1f7a8029dc 100644
--- a/tests/auto/quick/qquickxmllistmodel/tst_qquickxmllistmodel.cpp
+++ b/tests/auto/quick/qquickxmllistmodel/tst_qquickxmllistmodel.cpp
@@ -101,6 +101,7 @@ private slots:
void threading();
void threading_data();
void propertyChanges();
+ void selectAncestor();
void roleCrash();
@@ -964,6 +965,18 @@ void tst_qquickxmllistmodel::propertyChanges()
delete model;
}
+void tst_qquickxmllistmodel::selectAncestor()
+{
+ QQmlComponent component(&engine, testFileUrl("groups.qml"));
+ QAbstractItemModel *model = qobject_cast<QAbstractItemModel *>(component.create());
+ QVERIFY(model != 0);
+ QTRY_COMPARE(model->rowCount(), 1);
+
+ QModelIndex index = model->index(0, 0);
+ QCOMPARE(model->data(index, Qt::UserRole).toInt(), 12);
+ QCOMPARE(model->data(index, Qt::UserRole+1).toString(), QLatin1String("cats"));
+}
+
void tst_qquickxmllistmodel::roleCrash()
{
// don't crash