summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorXizhi Zhu <xizhi.zhu@nokia.com>2011-07-20 10:43:13 +0300
committerXizhi Zhu <xizhi.zhu@nokia.com>2011-07-20 10:43:13 +0300
commit2b022a650548214d57150a17e274aa1cee44a9b7 (patch)
treee1e28f6820da6250468ec47b44b6f7d64e179f89 /tests
parent8c1d094539abf7521e514044a3b0b70c6637e26a (diff)
Add unit tests.
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/auto.pri8
-rw-r--r--tests/auto/auto.pro20
-rw-r--r--tests/auto/qdeclarativedocumentgalleryitem/qdeclarativedocumentgalleryitem.pro7
-rw-r--r--tests/auto/qdeclarativedocumentgalleryitem/tst_qdeclarativedocumentgalleryitem.cpp1032
-rw-r--r--tests/auto/qdeclarativedocumentgallerymodel/qdeclarativedocumentgallerymodel.pro7
-rw-r--r--tests/auto/qdeclarativedocumentgallerymodel/tst_qdeclarativedocumentgallerymodel.cpp3214
-rw-r--r--tests/auto/qdeclarativedocumentgallerytype/qdeclarativedocumentgallerytype.pro7
-rw-r--r--tests/auto/qdeclarativedocumentgallerytype/tst_qdeclarativedocumentgallerytype.cpp1003
-rw-r--r--tests/auto/qdocumentgallery/qdocumentgallery.pro5
-rw-r--r--tests/auto/qdocumentgallery/tst_qdocumentgallery.cpp332
-rw-r--r--tests/auto/qgalleryabstractrequest/qgalleryabstractrequest.pro4
-rw-r--r--tests/auto/qgalleryabstractrequest/tst_qgalleryabstractrequest.cpp1384
-rw-r--r--tests/auto/qgalleryabstractresponse/qgalleryabstractresponse.pro3
-rw-r--r--tests/auto/qgalleryabstractresponse/tst_qgalleryabstractresponse.cpp525
-rw-r--r--tests/auto/qgalleryfilter/qgalleryfilter.pro3
-rw-r--r--tests/auto/qgalleryfilter/tst_qgalleryfilter.cpp1345
-rw-r--r--tests/auto/qgalleryitemrequest/qgalleryitemrequest.pro3
-rw-r--r--tests/auto/qgalleryitemrequest/tst_qgalleryitemrequest.cpp555
-rw-r--r--tests/auto/qgalleryquerymodel/qgalleryquerymodel.pro3
-rw-r--r--tests/auto/qgalleryquerymodel/tst_qgalleryquerymodel.cpp1853
-rw-r--r--tests/auto/qgalleryqueryrequest/qgalleryqueryrequest.pro3
-rw-r--r--tests/auto/qgalleryqueryrequest/tst_qgalleryqueryrequest.cpp627
-rw-r--r--tests/auto/qgalleryresource/qgalleryresource.pro3
-rw-r--r--tests/auto/qgalleryresource/tst_qgalleryresource.cpp259
-rw-r--r--tests/auto/qgallerytrackerresultset_tracker/qgallerytrackerresultset_tracker.pro5
-rw-r--r--tests/auto/qgallerytrackerresultset_tracker/tst_qgallerytrackerresultset.cpp855
-rw-r--r--tests/auto/qgallerytrackerschema_tracker/qgallerytrackerschema_tracker.pro5
-rw-r--r--tests/auto/qgallerytrackerschema_tracker/tst_qgallerytrackerschema.cpp2890
-rw-r--r--tests/auto/qgallerytyperequest/qgallerytyperequest.pro3
-rw-r--r--tests/auto/qgallerytyperequest/tst_qgallerytyperequest.cpp517
-rw-r--r--tests/tests.pro2
31 files changed, 16482 insertions, 0 deletions
diff --git a/tests/auto/auto.pri b/tests/auto/auto.pri
new file mode 100644
index 0000000..e9d6ef4
--- /dev/null
+++ b/tests/auto/auto.pri
@@ -0,0 +1,8 @@
+TEMPLATE = app
+CONFIG += qt debug warn_on console depend_includepath testcase
+
+qtAddLibrary(QtTest)
+
+QMAKE_LIBS += -Wl,-rpath,$${QT.gallery.libs}
+
+QT += gallery
diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro
new file mode 100644
index 0000000..00f3003
--- /dev/null
+++ b/tests/auto/auto.pro
@@ -0,0 +1,20 @@
+TEMPLATE = subdirs
+SUBDIRS += \
+ qdocumentgallery \
+ qgalleryabstractrequest \
+ qgalleryabstractresponse \
+ qgalleryfilter \
+ qgalleryitemrequest \
+ qgalleryquerymodel \
+ qgalleryqueryrequest \
+ qgalleryresource \
+ qgallerytyperequest \
+ qdeclarativedocumentgalleryitem \
+ qdeclarativedocumentgallerymodel \
+ qdeclarativedocumentgallerytype
+
+linux-*: contains(QT_CONFIG, dbus): contains(tracker_enabled, yes) {
+ SUBDIRS += \
+ qgallerytrackerresultset_tracker \
+ qgallerytrackerschema_tracker
+}
diff --git a/tests/auto/qdeclarativedocumentgalleryitem/qdeclarativedocumentgalleryitem.pro b/tests/auto/qdeclarativedocumentgalleryitem/qdeclarativedocumentgalleryitem.pro
new file mode 100644
index 0000000..d558591
--- /dev/null
+++ b/tests/auto/qdeclarativedocumentgalleryitem/qdeclarativedocumentgalleryitem.pro
@@ -0,0 +1,7 @@
+include(../auto.pri)
+
+QT += declarative
+
+INCLUDEPATH += ../../../src/imports/gallery/
+
+SOURCES += tst_qdeclarativedocumentgalleryitem.cpp
diff --git a/tests/auto/qdeclarativedocumentgalleryitem/tst_qdeclarativedocumentgalleryitem.cpp b/tests/auto/qdeclarativedocumentgalleryitem/tst_qdeclarativedocumentgalleryitem.cpp
new file mode 100644
index 0000000..c6f5ffe
--- /dev/null
+++ b/tests/auto/qdeclarativedocumentgalleryitem/tst_qdeclarativedocumentgalleryitem.cpp
@@ -0,0 +1,1032 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDocGallery module 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$
+**
+****************************************************************************/
+
+//TESTED_COMPONENT=src/gallery
+
+
+#include <qabstractgallery.h>
+#include <qgalleryitemrequest.h>
+#include <qgalleryresultset.h>
+
+#include <QtDeclarative/qdeclarativecomponent.h>
+#include <QtDeclarative/qdeclarativecontext.h>
+#include <QtDeclarative/qdeclarativeengine.h>
+
+#include <qdeclarativedocumentgallery.h>
+#include <qdeclarativegalleryitem.h>
+
+#include <QtTest/QtTest>
+
+
+class QtGalleryTestResponse : public QGalleryResultSet
+{
+ Q_OBJECT
+public:
+ QtGalleryTestResponse(
+ const QStringList &propertyNames,
+ const QHash<QString, QVariant> &metaData,
+ int count,
+ QGalleryAbstractRequest::State state,
+ int error,
+ const QString &errorString)
+ : m_count(count)
+ , m_currentIndex(-1)
+ , m_propertyNames(propertyNames)
+ {
+ typedef QHash<QString, QVariant>::const_iterator iterator;
+ for (iterator it = metaData.begin(), end = metaData.end(); it != end; ++it) {
+ int propertyKey = m_propertyNames.indexOf(it.key());
+
+ if (propertyKey >= 0)
+ m_metaData.insert(propertyKey, it.value());
+ }
+
+ if (error != QGalleryAbstractRequest::NoError)
+ QGalleryAbstractResponse::error(error, errorString);
+ else if (state == QGalleryAbstractRequest::Finished)
+ finish();
+ else if (state == QGalleryAbstractRequest::Idle)
+ finish(true);
+ }
+
+ int propertyKey(const QString &propertyName) const {
+ return m_propertyNames.indexOf(propertyName); }
+ QGalleryProperty::Attributes propertyAttributes(int) const {
+ return QGalleryProperty::CanRead | QGalleryProperty::CanWrite; }
+ QVariant::Type propertyType(int) const { return QVariant::String; }
+
+ int itemCount() const { return m_count; }
+
+ int currentIndex() const { return m_currentIndex; }
+
+ bool fetch(int index)
+ {
+ emit currentIndexChanged(m_currentIndex = index);
+ emit currentItemChanged();
+
+ return isValid();
+ }
+
+ QVariant itemId() const { return isValid() ? QVariant(1) : QVariant(); }
+ QUrl itemUrl() const { return isValid() ? QUrl("file:///path/to/song.mp3") : QUrl(); }
+ QString itemType() const { return isValid() ? QLatin1String("Audio") : QString(); }
+
+ QVariant metaData(int key) const { return isValid() ? m_metaData.value(key) : QVariant(); }
+ bool setMetaData(int key, const QVariant &value)
+ {
+ if (isValid()) {
+ m_metaData.insert(key, value);
+ emit metaDataChanged(m_currentIndex, 1, QList<int>() << key);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ void setCount(int count)
+ {
+ qSwap(m_count, count);
+
+ if (m_count == 0) {
+ m_currentIndex = -1;
+
+ emit itemsRemoved(0, count);
+ } else if (count == 0) {
+ emit itemsInserted(0, count);
+ }
+ }
+
+ using QGalleryResultSet::finish;
+ using QGalleryResultSet::resume;
+ using QGalleryResultSet::cancel;
+ using QGalleryResultSet::error;
+ using QGalleryResultSet::itemsInserted;
+ using QGalleryResultSet::itemsRemoved;
+ using QGalleryResultSet::itemsMoved;
+ using QGalleryResultSet::metaDataChanged;
+ using QGalleryResultSet::progressChanged;
+
+private:
+ int m_count;
+ int m_currentIndex;
+ QStringList m_propertyNames;
+ QHash<int, QVariant> m_metaData;
+};
+
+
+class QtTestGallery : public QAbstractGallery
+{
+public:
+ QtTestGallery()
+ : m_count(0)
+ , m_state(QGalleryAbstractRequest::Finished)
+ , m_error(QGalleryAbstractRequest::NoError)
+ {}
+
+ bool isRequestSupported(QGalleryAbstractRequest::RequestType type) const {
+ return type == QGalleryAbstractRequest::TypeRequest; }
+
+ void setState(QGalleryAbstractRequest::State state) { m_state = state; }
+ void setError(int error, const QString &errorString) {
+ m_error = error; m_errorString = errorString; }
+
+ void setCount(int count) { m_count = count; }
+
+ void setBlackList(const QStringList &propertyNames) { m_blacklist = propertyNames; }
+ void setMetaData(const QHash<QString, QVariant> &metaData) { m_metaData = metaData; }
+
+ QGalleryItemRequest *request() const { return m_request.data(); }
+ QtGalleryTestResponse *response() const { return m_response.data(); }
+
+ void reset()
+ {
+ m_count = 0;
+ m_state = QGalleryAbstractRequest::Finished;
+ m_error = QGalleryItemRequest::NoError;
+ m_metaData.clear();
+ m_blacklist.clear();
+ }
+
+protected:
+ QGalleryAbstractResponse *createResponse(QGalleryAbstractRequest *request)
+ {
+ if ((m_request = qobject_cast<QGalleryItemRequest *>(request))) {
+ QStringList propertyNames = m_request.data()->propertyNames();
+ foreach (QString propertyName, m_blacklist)
+ propertyNames.removeAll(propertyName);
+
+ m_response = new QtGalleryTestResponse(
+ propertyNames,
+ m_metaData,
+ m_count,
+ m_state,
+ m_error,
+ m_errorString);
+ } else {
+ m_response.clear();
+ }
+ return m_response.data();
+ }
+
+private:
+ int m_count;
+ QGalleryAbstractRequest::State m_state;
+ int m_error;
+ QString m_errorString;
+ QHash<QString, QVariant> m_metaData;
+ QStringList m_blacklist;
+ QWeakPointer<QGalleryItemRequest> m_request;
+ QWeakPointer<QtGalleryTestResponse> m_response;
+};
+
+class tst_QDeclarativeDocumentGalleryItem : public QObject
+{
+ Q_OBJECT
+public Q_SLOTS:
+ void initTestCase();
+ void cleanup();
+
+private Q_SLOTS:
+ void itemId_data();
+ void itemId();
+ void properties_data();
+ void properties();
+ void autoUpdate_data();
+ void autoUpdate();
+ void disableAutoUpdateFinished();
+ void disableAutoUpdateIdle();
+ void disableAutoUpdateActive();
+ void asyncResponse();
+ void cancelAsyncResponse();
+ void cancelIdleResponse();
+ void cancelPendingResponse();
+ void deferExecuteCanceledResponse();
+ void clear();
+ void clearPendingResponse();
+ void error_data();
+ void error();
+ void progress_data();
+ void progress();
+ void available();
+ void itemUrl();
+ void itemType();
+ void metaData();
+
+private:
+ QtTestGallery gallery;
+ QDeclarativeEngine engine;
+};
+
+void tst_QDeclarativeDocumentGalleryItem::initTestCase()
+{
+ engine.rootContext()->setContextProperty(QLatin1String("qt_testGallery"), &gallery);
+}
+
+void tst_QDeclarativeDocumentGalleryItem::cleanup()
+{
+ gallery.reset();
+}
+
+void tst_QDeclarativeDocumentGalleryItem::itemId_data()
+{
+ QTest::addColumn<QByteArray>("qml");
+ QTest::addColumn<QVariant>("qmlItemId");
+ QTest::addColumn<QVariant>("itemId");
+
+ QTest::newRow("Null -> 45")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryItem {}\n")
+ << QVariant()
+ << QVariant(45);
+
+ QTest::newRow("45 -> 45")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryItem { item: 45 }\n")
+ << QVariant(45)
+ << QVariant(45);
+
+ QTest::newRow("45 -> file:///path/to/file.ext")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryItem { item: 45 }\n")
+ << QVariant(45)
+ << QVariant(QLatin1String("file:///path/to/file.ext"));
+
+ QTest::newRow("file:///path/to/file.ext -> Null")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryItem { item: \"file:///path/to/file.ext\" }\n")
+ << QVariant(QLatin1String("file:///path/to/file.ext"))
+ << QVariant();
+}
+
+void tst_QDeclarativeDocumentGalleryItem::itemId()
+{
+ QFETCH(QByteArray, qml);
+ QFETCH(QVariant, qmlItemId);
+ QFETCH(QVariant, itemId);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+
+ QSignalSpy spy(object.data(), SIGNAL(itemIdChanged()));
+
+ if (qmlItemId.isValid()) {
+ QVERIFY(gallery.request());
+ QCOMPARE(gallery.request()->itemId(), qmlItemId);
+ } else {
+ QVERIFY(!gallery.request());
+ }
+
+ QCOMPARE(object->property("item"), qmlItemId);
+
+ QCOMPARE(object->setProperty("item", itemId), true);
+ QCOMPARE(object->property("item"), itemId);
+ QCOMPARE(spy.count(), itemId != qmlItemId ? 1 : 0);
+
+ QMetaObject::invokeMethod(object.data(), "reload");
+
+ if (itemId.isValid()) {
+ QVERIFY(gallery.request());
+ QCOMPARE(gallery.request()->itemId(), itemId);
+ }
+}
+
+void tst_QDeclarativeDocumentGalleryItem::properties_data()
+{
+ QTest::addColumn<QByteArray>("qml");
+ QTest::addColumn<QStringList>("qmlPropertyNames");
+ QTest::addColumn<QStringList>("propertyNames");
+
+ QTest::newRow("[] -> [ title, fileName ]")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryItem {\n"
+ "item: 0\n"
+ "}\n")
+ << QStringList()
+ << (QStringList() << QLatin1String("title") << QLatin1String("fileName"));
+
+ QTest::newRow("[ title, fileName ] -> [ title, fileName ]")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryItem {\n"
+ "item: 0\n"
+ "properties: [ \"title\", \"fileName\" ]"
+ "}\n")
+ << (QStringList() << QLatin1String("title") << QLatin1String("fileName"))
+ << (QStringList() << QLatin1String("title") << QLatin1String("fileName"));
+
+ QTest::newRow("[ title, fileName ] -> [ count ]")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryItem {\n"
+ "item: 0\n"
+ "properties: [ \"title\", \"fileName\" ]"
+ "}\n")
+ << (QStringList() << QLatin1String("title") << QLatin1String("fileName"))
+ << (QStringList() << QLatin1String("count"));
+}
+
+void tst_QDeclarativeDocumentGalleryItem::properties()
+{
+ QFETCH(QByteArray, qml);
+ QFETCH(QStringList, qmlPropertyNames);
+ QFETCH(QStringList, propertyNames);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+
+ QSignalSpy spy(object.data(), SIGNAL(itemIdChanged()));
+
+ QCOMPARE(gallery.request()->propertyNames(), qmlPropertyNames);
+ QCOMPARE(object->property("properties"), QVariant(qmlPropertyNames));
+
+ QCOMPARE(object->setProperty("properties", propertyNames), true);
+ QCOMPARE(object->property("properties"), QVariant(qmlPropertyNames));
+ QCOMPARE(spy.count(), 0);
+
+ QMetaObject::invokeMethod(object.data(), "reload");
+ QVERIFY(gallery.request());
+ QCOMPARE(gallery.request()->propertyNames(), qmlPropertyNames);
+
+}
+
+void tst_QDeclarativeDocumentGalleryItem::autoUpdate_data()
+{
+ QTest::addColumn<QByteArray>("qml");
+ QTest::addColumn<bool>("qmlAutoUpdate");
+ QTest::addColumn<bool>("autoUpdate");
+
+ QTest::newRow("Default -> true")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryItem {\n"
+ "item: 0\n"
+ "}\n")
+ << false
+ << true;
+
+ QTest::newRow("true -> false")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryItem {\n"
+ "item: 0\n"
+ "autoUpdate: true\n"
+ "}\n")
+ << true
+ << false;
+
+ QTest::newRow("false -> true")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryItem {\n"
+ "item: 0\n"
+ "autoUpdate: false\n"
+ "}\n")
+ << false
+ << true;
+
+ QTest::newRow("true -> true")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryItem {\n"
+ "item: 0\n"
+ "autoUpdate: true\n"
+ "}\n")
+ << true
+ << true;
+
+ QTest::newRow("false -> false")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryItem {\n"
+ "item: 0\n"
+ "autoUpdate: false\n"
+ "}\n")
+ << false
+ << false;
+}
+
+void tst_QDeclarativeDocumentGalleryItem::autoUpdate()
+{
+ QFETCH(QByteArray, qml);
+ QFETCH(bool, qmlAutoUpdate);
+ QFETCH(bool, autoUpdate);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(autoUpdateChanged()));
+
+ QCOMPARE(object->property("autoUpdate"), QVariant(qmlAutoUpdate));
+ QCOMPARE(gallery.request()->autoUpdate(), qmlAutoUpdate);
+
+ object->setProperty("autoUpdate", autoUpdate);
+ QCOMPARE(object->property("autoUpdate"), QVariant(autoUpdate));
+ QCOMPARE(spy.count(), qmlAutoUpdate != autoUpdate ? 1 : 0);
+
+ QMetaObject::invokeMethod(object.data(), "reload");
+ QCOMPARE(gallery.request()->autoUpdate(), autoUpdate);
+}
+
+void tst_QDeclarativeDocumentGalleryItem::disableAutoUpdateFinished()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryItem {\n"
+ "item: 12\n"
+ "autoUpdate: true\n"
+ "}\n");
+
+ gallery.setState(QGalleryAbstractRequest::Finished);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+
+ QSignalSpy spy(object.data(), SIGNAL(statusChanged()));
+
+ QCOMPARE(object->property("autoUpdate"), QVariant(true));
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryItem::Finished));
+
+ object->setProperty("autoUpdate", false);
+ QCOMPARE(object->property("autoUpdate"), QVariant(false));
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryItem::Finished));
+ QCOMPARE(spy.count(), 0);
+}
+
+void tst_QDeclarativeDocumentGalleryItem::disableAutoUpdateIdle()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryItem {\n"
+ "item: 12\n"
+ "autoUpdate: true\n"
+ "}\n");
+
+ gallery.setState(QGalleryAbstractRequest::Idle);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+
+ QSignalSpy spy(object.data(), SIGNAL(statusChanged()));
+
+ QCOMPARE(object->property("autoUpdate"), QVariant(true));
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryItem::Idle));
+
+ object->setProperty("autoUpdate", false);
+ QCOMPARE(object->property("autoUpdate"), QVariant(false));
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryItem::Finished));
+ QCOMPARE(spy.count(), 1);
+}
+
+void tst_QDeclarativeDocumentGalleryItem::disableAutoUpdateActive()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryItem {\n"
+ "item: 12\n"
+ "autoUpdate: true\n"
+ "}\n");
+
+ gallery.setState(QGalleryAbstractRequest::Active);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+
+ QSignalSpy spy(object.data(), SIGNAL(statusChanged()));
+
+ QCOMPARE(object->property("autoUpdate"), QVariant(true));
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryItem::Active));
+
+ object->setProperty("autoUpdate", false);
+ QCOMPARE(object->property("autoUpdate"), QVariant(false));
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryItem::Active));
+ QCOMPARE(spy.count(), 0);
+
+ QVERIFY(gallery.response());
+ gallery.response()->finish(true);
+ QCOMPARE(object->property("autoUpdate"), QVariant(false));
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryItem::Finished));
+ QCOMPARE(spy.count(), 1);
+}
+void tst_QDeclarativeDocumentGalleryItem::asyncResponse()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryItem { item: 12 }\n");
+
+ gallery.setState(QGalleryAbstractRequest::Active);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(statusChanged()));
+
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryItem::Active));
+
+ gallery.response()->finish();
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryItem::Finished));
+ QCOMPARE(spy.count(), 1);
+}
+
+void tst_QDeclarativeDocumentGalleryItem::cancelAsyncResponse()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryItem { item: 12 }\n");
+
+ gallery.setState(QGalleryAbstractRequest::Active);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(statusChanged()));
+
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryItem::Active));
+
+ QMetaObject::invokeMethod(object.data(), "cancel");
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryItem::Canceled));
+ QCOMPARE(spy.count(), 1);
+}
+
+void tst_QDeclarativeDocumentGalleryItem::cancelIdleResponse()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryItem { item: 12; autoUpdate: true }\n");
+
+ gallery.setState(QGalleryAbstractRequest::Idle);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(statusChanged()));
+
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryItem::Idle));
+
+ QMetaObject::invokeMethod(object.data(), "cancel");
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryItem::Finished));
+ QCOMPARE(spy.count(), 1);
+}
+
+void tst_QDeclarativeDocumentGalleryItem::cancelPendingResponse()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryItem { item: 12 }\n");
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(statusChanged()));
+
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryItem::Finished));
+
+ object->setProperty("autoUpdate", true);
+
+ QMetaObject::invokeMethod(object.data(), "cancel");
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryItem::Finished));
+ QCOMPARE(spy.count(), 0);
+
+ QCoreApplication::processEvents();
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryItem::Finished));
+ QCOMPARE(spy.count(), 0);
+}
+
+void tst_QDeclarativeDocumentGalleryItem::deferExecuteCanceledResponse()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryItem { item: 12 }\n");
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(statusChanged()));
+
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryItem::Finished));
+
+ object->setProperty("autoUpdate", true);
+
+ QMetaObject::invokeMethod(object.data(), "cancel");
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryItem::Finished));
+ QCOMPARE(spy.count(), 0);
+
+ object->setProperty("autoUpdate", false);
+ object->setProperty("autoUpdate", true);
+
+ QCoreApplication::processEvents();
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryItem::Finished));
+ QCOMPARE(spy.count(), 1);
+}
+
+void tst_QDeclarativeDocumentGalleryItem::clear()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryItem { item: 12 }\n");
+
+ gallery.setCount(1);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy statusSpy(object.data(), SIGNAL(statusChanged()));
+ QSignalSpy availableSpy(object.data(), SIGNAL(availableChanged()));
+
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryItem::Finished));
+
+ QMetaObject::invokeMethod(object.data(), "clear");
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryItem::Null));
+ QCOMPARE(object->property("available"), QVariant(false));
+ QCOMPARE(statusSpy.count(), 1);
+ QCOMPARE(availableSpy.count(), 1);
+}
+
+void tst_QDeclarativeDocumentGalleryItem::clearPendingResponse()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryItem { item: 12 }\n");
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(statusChanged()));
+
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryItem::Finished));
+
+ object->setProperty("autoUpdate", true);
+
+ QMetaObject::invokeMethod(object.data(), "clear");
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryItem::Null));
+ QCOMPARE(spy.count(), 1);
+
+ QCoreApplication::processEvents();
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryItem::Null));
+ QCOMPARE(spy.count(), 1);
+}
+
+void tst_QDeclarativeDocumentGalleryItem::error_data()
+{
+ QTest::addColumn<QByteArray>("qml");
+ QTest::addColumn<int>("errorCode");
+ QTest::addColumn<QString>("errorMessage");
+ QTest::addColumn<QByteArray>("expectedErrorMessage");
+
+ QTest::newRow("Specific error message")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryItem { item: 0 }\n")
+ << int(QDocumentGallery::ConnectionError)
+ << "Connection to server failed"
+ << QByteArray(
+ "<Unknown File>: QML DocumentGalleryItem: "
+ "Connection to server failed");
+
+ QTest::newRow("Generic connection Error")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryItem { item: 0 }\n")
+ << int(QDocumentGallery::ConnectionError)
+ << QString()
+ << QByteArray(
+ "<Unknown File>: QML DocumentGalleryItem: "
+ "An error was encountered connecting to the document gallery");
+
+ QTest::newRow("Generic rootItem error")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryItem { item: 0 }\n")
+ << int(QDocumentGallery::ItemIdError)
+ << QString()
+ << QByteArray(
+ "<Unknown File>: QML DocumentGalleryItem: "
+ "The value of item is not a valid item ID");
+
+ QTest::newRow("Unhandled error code")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryItem { item: 0 }\n")
+ << int(QDocumentGallery::NoGallery)
+ << QString()
+ << QByteArray();
+}
+
+void tst_QDeclarativeDocumentGalleryItem::error()
+{
+ QFETCH(QByteArray, qml);
+ QFETCH(int, errorCode);
+ QFETCH(QString, errorMessage);
+ QFETCH(QByteArray, expectedErrorMessage);
+
+ gallery.setError(errorCode, errorMessage);
+
+ if (!expectedErrorMessage.isEmpty())
+ QTest::ignoreMessage(QtWarningMsg, expectedErrorMessage.constData());
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryItem::Error));
+}
+
+void tst_QDeclarativeDocumentGalleryItem::progress_data()
+{
+ QTest::addColumn<int>("currentProgress");
+ QTest::addColumn<int>("maximumProgress");
+ QTest::addColumn<qreal>("normalizedProgress");
+
+ QTest::newRow("25%")
+ << 25
+ << 100
+ << qreal(0.25);
+
+ QTest::newRow("50%")
+ << 3
+ << 6
+ << qreal(0.5);
+
+ QTest::newRow("75%")
+ << 60
+ << 80
+ << qreal(0.75);
+
+ QTest::newRow("100%")
+ << 32
+ << 32
+ << qreal(1.0);
+}
+
+void tst_QDeclarativeDocumentGalleryItem::progress()
+{
+ QFETCH(int, currentProgress);
+ QFETCH(int, maximumProgress);
+ QFETCH(qreal, normalizedProgress);
+
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryItem { item: 12 }\n");
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(progressChanged()));
+
+ QCOMPARE(object->property("progress"), QVariant(qreal(0.0)));
+
+ gallery.response()->progressChanged(currentProgress, maximumProgress);
+ QCOMPARE(object->property("progress"), QVariant(normalizedProgress));
+ QCOMPARE(spy.count(), 1);
+}
+
+void tst_QDeclarativeDocumentGalleryItem::available()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryItem { item: 12 }\n");
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+ QCOMPARE(object->property("available"), QVariant(false));
+
+ QSignalSpy spy(object.data(), SIGNAL(availableChanged()));
+
+ gallery.response()->setCount(1);
+ QCOMPARE(spy.count(), 1);
+ QCOMPARE(object->property("available"), QVariant(true));
+
+ gallery.response()->setCount(0);
+ QCOMPARE(spy.count(), 2);
+ QCOMPARE(object->property("available"), QVariant(false));
+}
+
+void tst_QDeclarativeDocumentGalleryItem::itemUrl()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryItem { item: 12 }\n");
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+ QCOMPARE(object->property("itemUrl"), QVariant(QUrl()));
+
+ QSignalSpy spy(object.data(), SIGNAL(availableChanged()));
+
+ gallery.response()->setCount(1);
+ QCOMPARE(spy.count(), 1);
+ QCOMPARE(object->property("itemUrl"), QVariant(QUrl(QLatin1String("file:///path/to/song.mp3"))));
+
+ gallery.response()->setCount(0);
+ QCOMPARE(spy.count(), 2);
+ QCOMPARE(object->property("itemUrl"), QVariant(QUrl()));
+}
+
+void tst_QDeclarativeDocumentGalleryItem::itemType()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryItem { item: 12 }\n");
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+ QCOMPARE(object->property("itemType"), QVariant(QDeclarativeDocumentGallery::InvalidType));
+
+ QSignalSpy spy(object.data(), SIGNAL(availableChanged()));
+
+ gallery.response()->setCount(1);
+ QCOMPARE(spy.count(), 1);
+ QCOMPARE(object->property("itemType"), QVariant(QDeclarativeDocumentGallery::Audio));
+
+ gallery.response()->setCount(0);
+ QCOMPARE(spy.count(), 2);
+ QCOMPARE(object->property("itemType"), QVariant(QDeclarativeDocumentGallery::InvalidType));
+}
+
+void tst_QDeclarativeDocumentGalleryItem::metaData()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryItem {\n"
+ "item: 12\n"
+ "properties: [ \"fileName\", \"title\", \"turtle\" ]\n"
+ "}\n");
+
+ {
+ QHash<QString, QVariant> metaData;
+ metaData.insert(QLatin1String("fileName"), QLatin1String("interlude.mp3"));
+ gallery.setMetaData(metaData);
+ gallery.setBlackList(QStringList() << QLatin1String("turtle"));
+ }
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.response());
+
+ QObject *metaData = object->property("metaData").value<QObject *>();
+ QVERIFY(metaData);
+ QCOMPARE(metaData->property("fileName"), QVariant());
+ QCOMPARE(metaData->property("title"), QVariant());
+ QCOMPARE(metaData->property("turtle"), QVariant());
+
+ gallery.response()->setCount(1);
+ QCOMPARE(metaData->property("fileName"), QVariant(QLatin1String("interlude.mp3")));
+ QCOMPARE(metaData->property("title"), QVariant(QVariant::String));
+ QCOMPARE(metaData->property("turtle"), QVariant());
+
+ {
+ QHash<QString, QVariant> metaData;
+ metaData.insert(QLatin1String("title"), QLatin1String("Interlude"));
+ gallery.setMetaData(metaData);
+ gallery.setCount(1);
+ }
+
+ gallery.setBlackList(QStringList() << QLatin1String("turtle") << QLatin1String("fileName"));
+ QMetaObject::invokeMethod(object.data(), "reload");
+
+ QCOMPARE(metaData->property("fileName"), QVariant());
+ QCOMPARE(metaData->property("title"), QVariant(QLatin1String("Interlude")));
+ QCOMPARE(metaData->property("turtle"), QVariant());
+
+ QVERIFY(gallery.response());
+ const int titleKey = gallery.response()->propertyKey(QLatin1String("title"));
+ QVERIFY(titleKey >= 0);
+
+ metaData->setProperty("title", QLatin1String("An Interlude"));
+ QCOMPARE(gallery.response()->metaData(titleKey), QVariant(QLatin1String("An Interlude")));
+
+ gallery.response()->setMetaData(titleKey, QLatin1String("Interlude"));
+ QCOMPARE(metaData->property("title"), QVariant(QLatin1String("Interlude")));
+
+ gallery.response()->setCount(0);
+ QCOMPARE(metaData->property("fileName"), QVariant());
+ QCOMPARE(metaData->property("title"), QVariant());
+ QCOMPARE(metaData->property("turtle"), QVariant());
+}
+
+QTEST_MAIN(tst_QDeclarativeDocumentGalleryItem)
+
+#include "tst_qdeclarativedocumentgalleryitem.moc"
diff --git a/tests/auto/qdeclarativedocumentgallerymodel/qdeclarativedocumentgallerymodel.pro b/tests/auto/qdeclarativedocumentgallerymodel/qdeclarativedocumentgallerymodel.pro
new file mode 100644
index 0000000..9096251
--- /dev/null
+++ b/tests/auto/qdeclarativedocumentgallerymodel/qdeclarativedocumentgallerymodel.pro
@@ -0,0 +1,7 @@
+include(../auto.pri)
+
+QT += declarative
+
+INCLUDEPATH += ../../../src/imports/gallery/
+
+SOURCES += tst_qdeclarativedocumentgallerymodel.cpp
diff --git a/tests/auto/qdeclarativedocumentgallerymodel/tst_qdeclarativedocumentgallerymodel.cpp b/tests/auto/qdeclarativedocumentgallerymodel/tst_qdeclarativedocumentgallerymodel.cpp
new file mode 100644
index 0000000..553e815
--- /dev/null
+++ b/tests/auto/qdeclarativedocumentgallerymodel/tst_qdeclarativedocumentgallerymodel.cpp
@@ -0,0 +1,3214 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDocGallery module 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$
+**
+****************************************************************************/
+
+//TESTED_COMPONENT=src/gallery
+
+#include <qdocumentgallery.h>
+#include <qgalleryqueryrequest.h>
+#include <qgalleryresultset.h>
+
+#include <QtDeclarative/qdeclarativecomponent.h>
+#include <QtDeclarative/qdeclarativecontext.h>
+#include <QtDeclarative/qdeclarativeengine.h>
+
+#include <qdeclarativedocumentgallery.h>
+#include <qdeclarativegalleryfilter.h>
+#include <qdeclarativegalleryquerymodel.h>
+
+#include <QtTest/QtTest>
+
+Q_DECLARE_METATYPE(QGalleryFilter)
+Q_DECLARE_METATYPE(QGalleryFilter::Type)
+Q_DECLARE_METATYPE(QGalleryQueryRequest::Scope)
+Q_DECLARE_METATYPE(QModelIndex)
+
+class QtTestResultSet : public QGalleryResultSet
+{
+ Q_OBJECT
+public:
+ struct Row
+ {
+ Row() {}
+ Row(const QVariant &itemId,
+ const QUrl &itemUrl,
+ const QString &itemType,
+ const QHash<QString, QVariant> &metaData)
+ : itemId(itemId)
+ , itemUrl(itemUrl)
+ , itemType(itemType)
+ , metaData(metaData) {}
+ QVariant itemId;
+ QUrl itemUrl;
+ QString itemType;
+ QHash<QString, QVariant> metaData;
+ };
+
+ QtTestResultSet(
+ QGalleryAbstractRequest::State state,
+ int error,
+ const QString &errorString,
+ const QHash<QString, QGalleryProperty::Attributes> &propertyAttributes,
+ const QVector<Row> &rows)
+ : m_propertyNames(propertyAttributes.keys())
+ , m_propertyAttributes(propertyAttributes)
+ , m_rows(rows)
+ , m_currentIndex(-1)
+ , m_insertIndex(0)
+ , m_insertCount(0)
+ {
+ if (error != QGalleryAbstractRequest::NoError)
+ QGalleryAbstractResponse::error(error, errorString);
+ else if (state == QGalleryAbstractRequest::Finished)
+ finish();
+ else if (state == QGalleryAbstractRequest::Idle)
+ finish(true);
+ }
+
+ QStringList propertyNames() const { return m_propertyNames; }
+
+ int propertyKey(const QString &propertyName) const {
+ return m_propertyNames.indexOf(propertyName); }
+
+ QGalleryProperty::Attributes propertyAttributes(int key) const {
+ return m_propertyAttributes.value(m_propertyNames.value(key)); }
+
+ QVariant::Type propertyType(int key) const {
+ return key >= 0 && key < m_propertyNames.count() ? QVariant::String : QVariant::Invalid; }
+
+ int itemCount() const { return m_rows.count(); }
+
+ int currentIndex() const { return m_currentIndex; }
+ bool fetch(int index)
+ {
+ emit currentIndexChanged(m_currentIndex = index);
+ emit currentItemChanged();
+
+ return isValid();
+ }
+
+ QVariant itemId() const { return m_rows.value(m_currentIndex).itemId; }
+ QUrl itemUrl() const { return m_rows.value(m_currentIndex).itemUrl; }
+ QString itemType() const { return m_rows.value(m_currentIndex).itemType; }
+
+ QVariant metaData(int key) const {
+ return m_rows.value(m_currentIndex).metaData.value(m_propertyNames.value(key)); }
+
+ bool setMetaData(int key, const QVariant &value)
+ {
+ if (isValid() && key >= 0 && key < m_propertyNames.count()) {
+ const QString propertyName = m_propertyNames.at(key);
+
+ if (m_propertyAttributes.value(propertyName) & QGalleryProperty::CanWrite) {
+ m_rows[m_currentIndex].metaData[propertyName] = value;
+
+ emit metaDataChanged(m_currentIndex, 1, QList<int>() << key);
+
+ return true;
+ }
+ }
+ return false;
+ }
+
+ void beginInsertRows(int index) { m_insertIndex = index; m_insertCount = 0; }
+ void addRow()
+ {
+ m_rows.insert(m_insertIndex + m_insertCount++, Row());
+ }
+ void addRow(
+ const QString &itemId,
+ const QUrl &itemUrl,
+ const QString &rootType,
+ const QHash<QString, QVariant> &metaData)
+ {
+ m_rows.insert(m_insertIndex + m_insertCount++, Row(itemId, itemUrl, rootType, metaData));
+ }
+ void endInsertRows() { emit itemsInserted(m_insertIndex, m_insertCount); }
+
+ void removeRows(int index, int count) {
+ m_rows.remove(index, count); emit itemsRemoved(index, count); }
+
+ using QGalleryResultSet::finish;
+ using QGalleryResultSet::metaDataChanged;
+ using QGalleryResultSet::itemsMoved;
+ using QGalleryResultSet::progressChanged;
+
+private:
+ const QStringList m_propertyNames;
+ const QHash<QString, QGalleryProperty::Attributes> m_propertyAttributes;
+ QVector<Row> m_rows;
+ int m_currentIndex;
+ int m_insertIndex;
+ int m_insertCount;
+};
+
+class QtTestGallery : public QAbstractGallery
+{
+public:
+ QtTestGallery()
+ : m_state(QGalleryAbstractRequest::Finished)
+ , m_error(QGalleryAbstractRequest::NoError)
+ {
+ }
+
+ bool isRequestSupported(QGalleryAbstractRequest::RequestType) const { return true; }
+
+ void setPropertyAttributes(const QHash<QString, QGalleryProperty::Attributes> &attributes)
+ {
+ m_propertyAttributes = attributes;
+ }
+
+ void setState(QGalleryAbstractRequest::State state) { m_state = state; }
+ void setError(int error, const QString &errorString) {
+ m_error = error; m_errorString = errorString; }
+
+ void addRow()
+ {
+ m_rows.append(QtTestResultSet::Row());
+ }
+
+ void addRow(
+ const QVariant &itemId,
+ const QUrl &itemUrl,
+ const QString &rootType,
+ const QHash<QString, QVariant> &metaData)
+ {
+ m_rows.append(QtTestResultSet::Row(itemId, itemUrl, rootType, metaData));
+ }
+
+ void reset()
+ {
+ m_rows.clear();
+ m_state = QGalleryAbstractRequest::Finished;
+ m_error = QGalleryAbstractRequest::NoError;
+ }
+
+ QGalleryQueryRequest *request() const { return m_request.data(); }
+ QtTestResultSet *response() const { return m_response.data(); }
+
+protected:
+ QGalleryAbstractResponse *createResponse(QGalleryAbstractRequest *request)
+ {
+ if ((m_request = qobject_cast<QGalleryQueryRequest *>(request))) {
+ m_response = new QtTestResultSet(
+ m_state, m_error, m_errorString, m_propertyAttributes, m_rows);
+ } else {
+ m_response.clear();
+ }
+ return m_response.data();
+ }
+
+
+private:
+ QHash<QString, QGalleryProperty::Attributes> m_propertyAttributes;
+ QVector<QtTestResultSet::Row> m_rows;
+ QGalleryAbstractRequest::State m_state;
+ int m_error;
+ QString m_errorString;
+ QWeakPointer<QGalleryQueryRequest> m_request;
+ QWeakPointer<QtTestResultSet> m_response;
+};
+
+class tst_QDeclarativeDocumentGalleryModel : public QObject
+{
+ Q_OBJECT
+public Q_SLOTS:
+ void initTestCase();
+ void cleanup();
+
+private Q_SLOTS:
+ void rootType_data();
+ void rootType();
+ void rootTypeAuto_data() { rootType_data(); }
+ void rootTypeAuto();
+ void properties_data();
+ void properties();
+ void propertiesAuto_data() { properties_data(); }
+ void propertiesAuto();
+ void sortProperties_data();
+ void sortProperties();
+ void sortPropertiesAuto_data() { sortProperties_data(); }
+ void sortPropertiesAuto();
+ void autoUpdate_data();
+ void autoUpdate();
+ void autoUpdateAuto_data() { autoUpdate_data(); }
+ void autoUpdateAuto();
+ void disableAutoUpdateFinished();
+ void disableAutoUpdateIdle();
+ void disableAutoUpdateActive();
+ void rootItem_data();
+ void rootItem();
+ void rootItemAuto_data() { rootItem_data(); }
+ void rootItemAuto();
+ void scope_data();
+ void scope();
+ void scopeAuto_data() { scope_data(); }
+ void scopeAuto();
+ void offset_data();
+ void offset();
+ void offsetAuto_data() { offset_data(); }
+ void offsetAuto();
+ void limit_data();
+ void limit();
+ void limitAuto_data() { limit_data(); }
+ void limitAuto();
+ void filter_data();
+ void filter();
+ void changeFilter_data();
+ void changeFilter();
+ void changeFilterAuto_data() { changeFilter_data(); }
+ void changeFilterAuto();
+ void filterProperties_data();
+ void filterProperties();
+ void groupFilter_data();
+ void groupFilter();
+ void progress_data();
+ void progress();
+ void roleNames();
+ void indexes();
+ void data_data();
+ void data();
+ void setData_data();
+ void setData();
+ void property_data() { data_data(); }
+ void property();
+ void setProperty_data() { setData_data(); }
+ void setProperty();
+ void get_data() { data_data(); }
+ void get();
+ void set_data() { setData_data(); }
+ void set();
+ void itemsInserted();
+ void itemsRemoved();
+ void itemsMoved();
+ void metaDataChanged();
+ void asyncResponse();
+ void cancelAsyncResponse();
+ void cancelIdleResponse();
+ void cancelPendingResponse();
+ void deferExecuteCanceledResponse();
+ void clear();
+ void clearPendingResponse();
+ void error_data();
+ void error();
+
+private:
+ void populateGallery();
+
+ QtTestGallery gallery;
+ QDeclarativeEngine engine;
+};
+
+void tst_QDeclarativeDocumentGalleryModel::initTestCase()
+{
+ qRegisterMetaType<QGalleryFilter>();
+ qRegisterMetaType<QGalleryFilter::Type>();
+ qRegisterMetaType<QGalleryQueryRequest::Scope>();
+ qRegisterMetaType<QModelIndex>();
+ QHash<QString, QGalleryProperty::Attributes> propertyAttributes;
+ propertyAttributes.insert(QLatin1String("title"), QGalleryProperty::CanRead
+ | QGalleryProperty::CanWrite
+ | QGalleryProperty::CanFilter
+ | QGalleryProperty::CanSort);
+ propertyAttributes.insert(QLatin1String("fileName"), QGalleryProperty::CanRead
+ | QGalleryProperty::CanFilter
+ | QGalleryProperty::CanSort);
+ propertyAttributes.insert(QLatin1String("keywords"), QGalleryProperty::CanRead
+ | QGalleryProperty::CanWrite
+ | QGalleryProperty::CanFilter);
+ gallery.setPropertyAttributes(propertyAttributes);
+
+ engine.rootContext()->setContextProperty(QLatin1String("qt_testGallery"), &gallery);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::cleanup()
+{
+ gallery.reset();
+}
+
+void tst_QDeclarativeDocumentGalleryModel::populateGallery()
+{
+ QHash<QString, QVariant> metaData;
+
+ metaData.insert(QLatin1String("fileName"), QLatin1String("interlude.mp3"));
+ metaData.insert(QLatin1String("title"), QLatin1String("Interlude"));
+ gallery.addRow(
+ 3,
+ QUrl(QLatin1String("file:///music/interlude.mp3")),
+ QLatin1String("Audio"),
+ metaData);
+
+ metaData.insert(QLatin1String("fileName"), QLatin1String("beep.wav"));
+ metaData.remove(QLatin1String("title"));
+ gallery.addRow(
+ 45,
+ QUrl(QLatin1String("file:///sounds/beep.wav")),
+ QLatin1String("Audio"),
+ metaData);
+}
+
+
+void tst_QDeclarativeDocumentGalleryModel::rootType_data()
+{
+ QTest::addColumn<QByteArray>("qml");
+ QTest::addColumn<QString>("qmlRootTypeString");
+ QTest::addColumn<int>("qmlRootType");
+ QTest::addColumn<int>("rootType");
+
+ QTest::newRow("Default -> Audio")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {}\n")
+ << "File"
+ << int(QDeclarativeDocumentGallery::File)
+ << int(QDeclarativeDocumentGallery::Audio);
+
+ QTest::newRow("File -> Image")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "rootType: DocumentGallery.File\n"
+ "}\n")
+ << "File"
+ << int(QDeclarativeDocumentGallery::File)
+ << int(QDeclarativeDocumentGallery::Image);
+
+ QTest::newRow("Video -> Artist")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "rootType: DocumentGallery.Video\n"
+ "}\n")
+ << "Video"
+ << int(QDeclarativeDocumentGallery::Video)
+ << int(QDeclarativeDocumentGallery::Artist);
+
+ QTest::newRow("Playlist -> Playlist")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "rootType: DocumentGallery.Playlist\n"
+ "}\n")
+ << "Playlist"
+ << int(QDeclarativeDocumentGallery::Playlist)
+ << int(QDeclarativeDocumentGallery::Playlist);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::rootType()
+{
+ QFETCH(QByteArray, qml);
+ QFETCH(QString, qmlRootTypeString);
+ QFETCH(int, qmlRootType);
+ QFETCH(int, rootType);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(rootTypeChanged()));
+
+ QCOMPARE(object->property("rootType"), QVariant(qmlRootType));
+ QCOMPARE(gallery.request()->rootType(), qmlRootTypeString);
+
+ object->setProperty("rootType", rootType);
+ QCOMPARE(object->property("rootType"), QVariant(qmlRootType));
+ QCOMPARE(spy.count(), 0);
+
+ QMetaObject::invokeMethod(object.data(), "reload");
+ QCOMPARE(gallery.request()->rootType(), qmlRootTypeString);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::rootTypeAuto()
+{
+ QFETCH(QByteArray, qml);
+ QFETCH(QString, qmlRootTypeString);
+ QFETCH(int, qmlRootType);
+ QFETCH(int, rootType);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(rootTypeChanged()));
+
+ QCOMPARE(object->property("rootType"), QVariant(qmlRootType));
+ QCOMPARE(gallery.request()->rootType(), qmlRootTypeString);
+
+ object->setProperty("rootType", rootType);
+ QCOMPARE(object->property("rootType"), QVariant(qmlRootType));
+ QCOMPARE(spy.count(), 0);
+
+ QCoreApplication::processEvents();
+ QCOMPARE(gallery.request()->rootType(), qmlRootTypeString);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::properties_data()
+{
+ QTest::addColumn<QByteArray>("qml");
+ QTest::addColumn<QStringList>("qmlPropertyNames");
+ QTest::addColumn<QStringList>("propertyNames");
+
+ QTest::newRow("Default -> [ title ]")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {}\n")
+ << QStringList()
+ << (QStringList() << QLatin1String("title"));
+
+ QTest::newRow("[ title, duration ] -> [ fileName ]")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "properties: [ \"title\", \"duration\" ]\n"
+ "sortProperties: [ \"+rating\" ]\n"
+ "}\n")
+ << (QStringList() << QLatin1String("title") << QLatin1String("duration"))
+ << (QStringList() << QLatin1String("fileName"));
+}
+
+void tst_QDeclarativeDocumentGalleryModel::properties()
+{
+ QFETCH(QByteArray, qml);
+ QFETCH(QStringList, qmlPropertyNames);
+ QFETCH(QStringList, propertyNames);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(propertyNamesChanged()));
+
+ QCOMPARE(object->property("properties"), QVariant(qmlPropertyNames));
+ QCOMPARE(gallery.request()->propertyNames(), qmlPropertyNames);
+
+ object->setProperty("properties", propertyNames);
+ QCOMPARE(object->property("properties"), QVariant(qmlPropertyNames));
+ QCOMPARE(spy.count(), 0);
+
+ QMetaObject::invokeMethod(object.data(), "reload");
+ QCOMPARE(gallery.request()->propertyNames(), qmlPropertyNames);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::propertiesAuto()
+{
+ QFETCH(QByteArray, qml);
+ QFETCH(QStringList, qmlPropertyNames);
+ QFETCH(QStringList, propertyNames);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(propertyNamesChanged()));
+
+ QCOMPARE(object->property("properties"), QVariant(qmlPropertyNames));
+ QCOMPARE(gallery.request()->propertyNames(), qmlPropertyNames);
+
+ object->setProperty("properties", propertyNames);
+ QCOMPARE(object->property("properties"), QVariant(qmlPropertyNames));
+ QCOMPARE(spy.count(), 0);
+
+ QCoreApplication::processEvents();
+ QCOMPARE(gallery.request()->propertyNames(), qmlPropertyNames);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::sortProperties_data()
+{
+ QTest::addColumn<QByteArray>("qml");
+ QTest::addColumn<QStringList>("qmlSortPropertyNames");
+ QTest::addColumn<QStringList>("sortPropertyNames");
+
+ QTest::newRow("Default -> [ +rating ]")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {}\n")
+ << QStringList()
+ << (QStringList() << "+rating");
+
+ QTest::newRow("[ +rating ] -> [ albumArtist, albumTitle, trackNumber ]")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "sortProperties: [ \"+rating\" ]\n"
+ "}\n")
+ << (QStringList() << QLatin1String("+rating"))
+ << (QStringList()
+ << QLatin1String("albumArtist")
+ << QLatin1String("albumTitle")
+ << QLatin1String("trackNumber"));
+
+ QTest::newRow("[ albumArtist, albumTitle, trackNumber ] -> [ albumArtist, albumTitle, trackNumber ]")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "sortProperties: [ \"albumArtist\", \"albumTitle\", \"trackNumber\" ]\n"
+ "}\n")
+ << (QStringList()
+ << QLatin1String("albumArtist")
+ << QLatin1String("albumTitle")
+ << QLatin1String("trackNumber"))
+ << (QStringList()
+ << QLatin1String("albumArtist")
+ << QLatin1String("albumTitle")
+ << QLatin1String("trackNumber"));
+}
+
+void tst_QDeclarativeDocumentGalleryModel::sortProperties()
+{
+ QFETCH(QByteArray, qml);
+ QFETCH(QStringList, qmlSortPropertyNames);
+ QFETCH(QStringList, sortPropertyNames);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(sortPropertyNamesChanged()));
+
+ QCOMPARE(object->property("sortProperties"), QVariant(qmlSortPropertyNames));
+ QCOMPARE(gallery.request()->sortPropertyNames(), qmlSortPropertyNames);
+
+ object->setProperty("sortProperties", sortPropertyNames);
+ QCOMPARE(object->property("sortProperties"), QVariant(sortPropertyNames));
+ QCOMPARE(spy.count(), qmlSortPropertyNames != sortPropertyNames ? 1 : 0);
+
+ QMetaObject::invokeMethod(object.data(), "reload");
+ QCOMPARE(gallery.request()->sortPropertyNames(), sortPropertyNames);
+
+ object->setProperty("sortProperties", qmlSortPropertyNames);
+ QCOMPARE(object->property("sortProperties"), QVariant(qmlSortPropertyNames));
+ QCOMPARE(spy.count(), qmlSortPropertyNames != sortPropertyNames ? 2 : 0);
+
+ QCoreApplication::processEvents();
+ QCOMPARE(gallery.request()->sortPropertyNames(), qmlSortPropertyNames);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::sortPropertiesAuto()
+{
+ QFETCH(QByteArray, qml);
+ QFETCH(QStringList, qmlSortPropertyNames);
+ QFETCH(QStringList, sortPropertyNames);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(sortPropertyNamesChanged()));
+
+ QCOMPARE(object->property("sortProperties"), QVariant(qmlSortPropertyNames));
+ QCOMPARE(gallery.request()->sortPropertyNames(), qmlSortPropertyNames);
+
+ object->setProperty("sortProperties", sortPropertyNames);
+ QCOMPARE(object->property("sortProperties"), QVariant(sortPropertyNames));
+ QCOMPARE(spy.count(), qmlSortPropertyNames != sortPropertyNames ? 1 : 0);
+
+ QCoreApplication::processEvents();
+ QCOMPARE(gallery.request()->sortPropertyNames(), sortPropertyNames);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::autoUpdate_data()
+{
+ QTest::addColumn<QByteArray>("qml");
+ QTest::addColumn<bool>("qmlAutoUpdate");
+ QTest::addColumn<bool>("autoUpdate");
+
+ QTest::newRow("Default -> true")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {}\n")
+ << false
+ << true;
+
+ QTest::newRow("true -> false")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "autoUpdate: true\n"
+ "}\n")
+ << true
+ << false;
+
+ QTest::newRow("false -> true")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "autoUpdate: false\n"
+ "}\n")
+ << false
+ << true;
+
+ QTest::newRow("true -> true")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "autoUpdate: true\n"
+ "}\n")
+ << true
+ << true;
+
+ QTest::newRow("false -> false")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "autoUpdate: false\n"
+ "}\n")
+ << false
+ << false;
+}
+
+void tst_QDeclarativeDocumentGalleryModel::autoUpdate()
+{
+ QFETCH(QByteArray, qml);
+ QFETCH(bool, qmlAutoUpdate);
+ QFETCH(bool, autoUpdate);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(autoUpdateChanged()));
+
+ QCOMPARE(object->property("autoUpdate"), QVariant(qmlAutoUpdate));
+ QCOMPARE(gallery.request()->autoUpdate(), qmlAutoUpdate);
+
+ object->setProperty("autoUpdate", autoUpdate);
+ QCOMPARE(object->property("autoUpdate"), QVariant(autoUpdate));
+ QCOMPARE(spy.count(), qmlAutoUpdate != autoUpdate ? 1 : 0);
+
+ QMetaObject::invokeMethod(object.data(), "reload");
+ QCOMPARE(gallery.request()->autoUpdate(), autoUpdate);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::autoUpdateAuto()
+{
+ QFETCH(QByteArray, qml);
+ QFETCH(bool, qmlAutoUpdate);
+ QFETCH(bool, autoUpdate);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(autoUpdateChanged()));
+
+ QCOMPARE(object->property("autoUpdate"), QVariant(qmlAutoUpdate));
+ QCOMPARE(gallery.request()->autoUpdate(), qmlAutoUpdate);
+
+ object->setProperty("autoUpdate", autoUpdate);
+ QCOMPARE(object->property("autoUpdate"), QVariant(autoUpdate));
+ QCOMPARE(spy.count(), qmlAutoUpdate != autoUpdate ? 1 : 0);
+
+ QCoreApplication::processEvents();
+ QCOMPARE(gallery.request()->autoUpdate(), autoUpdate);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::disableAutoUpdateFinished()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "autoUpdate: true\n"
+ "}\n");
+
+ gallery.setState(QGalleryAbstractRequest::Finished);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+
+ QSignalSpy spy(object.data(), SIGNAL(statusChanged()));
+
+ QCOMPARE(object->property("autoUpdate"), QVariant(true));
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryQueryModel::Finished));
+
+ object->setProperty("autoUpdate", false);
+ QCOMPARE(object->property("autoUpdate"), QVariant(false));
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryQueryModel::Finished));
+ QCOMPARE(spy.count(), 0);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::disableAutoUpdateIdle()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "autoUpdate: true\n"
+ "}\n");
+
+ gallery.setState(QGalleryAbstractRequest::Idle);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+
+ QSignalSpy spy(object.data(), SIGNAL(statusChanged()));
+
+ QCOMPARE(object->property("autoUpdate"), QVariant(true));
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryQueryModel::Idle));
+
+ object->setProperty("autoUpdate", false);
+ QCOMPARE(object->property("autoUpdate"), QVariant(false));
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryQueryModel::Finished));
+ QCOMPARE(spy.count(), 1);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::disableAutoUpdateActive()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "autoUpdate: true\n"
+ "}\n");
+
+ gallery.setState(QGalleryAbstractRequest::Active);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+
+ QSignalSpy spy(object.data(), SIGNAL(statusChanged()));
+
+ QCOMPARE(object->property("autoUpdate"), QVariant(true));
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryQueryModel::Active));
+
+ object->setProperty("autoUpdate", false);
+ QCOMPARE(object->property("autoUpdate"), QVariant(false));
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryQueryModel::Active));
+ QCOMPARE(spy.count(), 0);
+
+ QVERIFY(gallery.response());
+ gallery.response()->finish(true);
+ QCOMPARE(object->property("autoUpdate"), QVariant(false));
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryQueryModel::Finished));
+ QCOMPARE(spy.count(), 1);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::rootItem_data()
+{
+ QTest::addColumn<QByteArray>("qml");
+ QTest::addColumn<QVariant>("qmlRootItem");
+ QTest::addColumn<QVariant>("rootItem");
+
+ QTest::newRow("Default -> 34")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {}\n")
+ << QVariant()
+ << QVariant(34);
+
+ QTest::newRow("folder:///path/to/music -> folder:///path/to/images")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "rootItem: \"folder:///path/to/music\"\n"
+ "}\n")
+ << QVariant(QLatin1String("folder:///path/to/music"))
+ << QVariant(QLatin1String("folder:///path/to/images"));
+
+ QTest::newRow("26 -> folder:///path/to/images")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "rootItem: 26\n"
+ "}\n")
+ << QVariant(26)
+ << QVariant(QLatin1String("folder:///path/to/images"));
+
+
+ QTest::newRow("26 -> 26")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "rootItem: 26\n"
+ "}\n")
+ << QVariant(26)
+ << QVariant(26);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::rootItem()
+{
+ QFETCH(QByteArray, qml);
+ QFETCH(QVariant, qmlRootItem);
+ QFETCH(QVariant, rootItem);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(rootItemChanged()));
+
+ QCOMPARE(object->property("rootItem"), qmlRootItem);
+ QCOMPARE(gallery.request()->rootItem(), qmlRootItem);
+
+ object->setProperty("rootItem", rootItem);
+ QCOMPARE(object->property("rootItem"), rootItem);
+ QCOMPARE(spy.count(), qmlRootItem != rootItem ? 1 : 0);
+
+ QMetaObject::invokeMethod(object.data(), "reload");
+ QCOMPARE(gallery.request()->rootItem(), rootItem);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::rootItemAuto()
+{
+ QFETCH(QByteArray, qml);
+ QFETCH(QVariant, qmlRootItem);
+ QFETCH(QVariant, rootItem);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(rootItemChanged()));
+
+ QCOMPARE(object->property("rootItem"), qmlRootItem);
+ QCOMPARE(gallery.request()->rootItem(), qmlRootItem);
+
+ object->setProperty("rootItem", rootItem);
+ QCOMPARE(object->property("rootItem"), rootItem);
+ QCOMPARE(spy.count(), qmlRootItem != rootItem ? 1 : 0);
+
+ QCoreApplication::processEvents();
+ QCOMPARE(gallery.request()->rootItem(), rootItem);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::scope_data()
+{
+ QTest::addColumn<QByteArray>("qml");
+ QTest::addColumn<QGalleryQueryRequest::Scope>("qmlScope");
+ QTest::addColumn<QGalleryQueryRequest::Scope>("scope");
+
+ QTest::newRow("Default -> DirectDescendants")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {}\n")
+ << QGalleryQueryRequest::AllDescendants
+ << QGalleryQueryRequest::DirectDescendants;
+
+ QTest::newRow("DirectDescendants -> AllDescendants")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "scope: DocumentGalleryModel.DirectDescendants\n"
+ "}\n")
+ << QGalleryQueryRequest::DirectDescendants
+ << QGalleryQueryRequest::AllDescendants;
+
+ QTest::newRow("AllDescendants -> DirectDescendants")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "scope: DocumentGalleryModel.AllDescendants\n"
+ "}\n")
+ << QGalleryQueryRequest::AllDescendants
+ << QGalleryQueryRequest::DirectDescendants;
+
+
+ QTest::newRow("AllDescendants -> AllDescendants")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "scope: DocumentGalleryModel.AllDescendants\n"
+ "}\n")
+ << QGalleryQueryRequest::AllDescendants
+ << QGalleryQueryRequest::AllDescendants;
+
+ QTest::newRow("DirectDescendants -> DirectDescendants")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "scope: DocumentGalleryModel.DirectDescendants\n"
+ "}\n")
+ << QGalleryQueryRequest::DirectDescendants
+ << QGalleryQueryRequest::DirectDescendants;
+}
+
+void tst_QDeclarativeDocumentGalleryModel::scope()
+{
+ QFETCH(QByteArray, qml);
+ QFETCH(QGalleryQueryRequest::Scope, qmlScope);
+ QFETCH(QGalleryQueryRequest::Scope, scope);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(scopeChanged()));
+
+ QCOMPARE(object->property("scope"), QVariant(int(qmlScope)));
+ QCOMPARE(gallery.request()->scope(), qmlScope);
+
+ object->setProperty("scope", scope);
+ QCOMPARE(object->property("scope"), QVariant(int(scope)));
+ QCOMPARE(spy.count(), qmlScope != scope ? 1 : 0);
+
+ QMetaObject::invokeMethod(object.data(), "reload");
+ QCOMPARE(gallery.request()->scope(), scope);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::scopeAuto()
+{
+ QFETCH(QByteArray, qml);
+ QFETCH(QGalleryQueryRequest::Scope, qmlScope);
+ QFETCH(QGalleryQueryRequest::Scope, scope);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(scopeChanged()));
+
+ QCOMPARE(object->property("scope"), QVariant(int(qmlScope)));
+ QCOMPARE(gallery.request()->scope(), qmlScope);
+
+ object->setProperty("scope", scope);
+ QCOMPARE(object->property("scope"), QVariant(int(scope)));
+ QCOMPARE(spy.count(), qmlScope != scope ? 1 : 0);
+
+ QCoreApplication::processEvents();
+ QCOMPARE(gallery.request()->scope(), scope);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::offset_data()
+{
+ QTest::addColumn<QByteArray>("qml");
+ QTest::addColumn<int>("qmlOffset");
+ QTest::addColumn<int>("offset");
+
+ QTest::newRow("Default -> 125")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {}\n")
+ << 0
+ << 125;
+
+ QTest::newRow("30 -> 15")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "offset: 30\n"
+ "}\n")
+ << 30
+ << 15;
+
+ QTest::newRow("63 -> 63")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "offset: 63\n"
+ "}\n")
+ << 63
+ << 63;
+}
+
+void tst_QDeclarativeDocumentGalleryModel::offset()
+{
+ QFETCH(QByteArray, qml);
+ QFETCH(int, qmlOffset);
+ QFETCH(int, offset);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(offsetChanged()));
+
+ QCOMPARE(object->property("offset"), QVariant(qmlOffset));
+ QCOMPARE(gallery.request()->offset(), qmlOffset);
+
+ object->setProperty("offset", offset);
+ QCOMPARE(object->property("offset"), QVariant(offset));
+ QCOMPARE(spy.count(), qmlOffset != offset ? 1 : 0);
+
+ QMetaObject::invokeMethod(object.data(), "reload");
+ QCOMPARE(gallery.request()->offset(), offset);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::offsetAuto()
+{
+ QFETCH(QByteArray, qml);
+ QFETCH(int, qmlOffset);
+ QFETCH(int, offset);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(offsetChanged()));
+
+ QCOMPARE(object->property("offset"), QVariant(qmlOffset));
+ QCOMPARE(gallery.request()->offset(), qmlOffset);
+
+ object->setProperty("offset", offset);
+ QCOMPARE(object->property("offset"), QVariant(offset));
+ QCOMPARE(spy.count(), qmlOffset != offset ? 1 : 0);
+
+ QCoreApplication::processEvents();
+ QCOMPARE(gallery.request()->offset(), offset);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::limit_data()
+{
+ QTest::addColumn<QByteArray>("qml");
+ QTest::addColumn<int>("qmlLimit");
+ QTest::addColumn<int>("limit");
+
+ QTest::newRow("Default -> 125")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {}\n")
+ << 0
+ << 125;
+
+ QTest::newRow("30 -> 15")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "limit: 30\n"
+ "}\n")
+ << 30
+ << 15;
+
+ QTest::newRow("63 -> 63")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "limit: 63\n"
+ "}\n")
+ << 63
+ << 63;
+}
+
+void tst_QDeclarativeDocumentGalleryModel::limit()
+{
+ QFETCH(QByteArray, qml);
+ QFETCH(int, qmlLimit);
+ QFETCH(int, limit);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(limitChanged()));
+
+ QCOMPARE(object->property("limit"), QVariant(qmlLimit));
+ QCOMPARE(gallery.request()->limit(), qmlLimit);
+
+ object->setProperty("limit", limit);
+ QCOMPARE(object->property("limit"), QVariant(limit));
+ QCOMPARE(spy.count(), qmlLimit != limit ? 1 : 0);
+
+ QMetaObject::invokeMethod(object.data(), "reload");
+ QCOMPARE(gallery.request()->limit(), limit);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::limitAuto()
+{
+ QFETCH(QByteArray, qml);
+ QFETCH(int, qmlLimit);
+ QFETCH(int, limit);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(limitChanged()));
+
+ QCOMPARE(object->property("limit"), QVariant(qmlLimit));
+ QCOMPARE(gallery.request()->limit(), qmlLimit);
+
+ object->setProperty("limit", limit);
+ QCOMPARE(object->property("limit"), QVariant(limit));
+ QCOMPARE(spy.count(), qmlLimit != limit ? 1 : 0);
+
+ QCoreApplication::processEvents();
+ QCOMPARE(gallery.request()->limit(), limit);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::filter_data()
+{
+ QTest::addColumn<QByteArray>("qml");
+ QTest::addColumn<QGalleryFilter>("filter");
+
+ QTest::newRow("Default")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {}\n")
+ << QGalleryFilter();
+
+
+ QTest::newRow("width == 1920")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "filter: GalleryEqualsFilter {\n"
+ "property: \"width\"\n"
+ "value: 1920\n"
+ "negated: false\n"
+ "}\n"
+ "}\n")
+ << QGalleryFilter(QDocumentGallery::width == 1920);
+
+ QTest::newRow("width != 1920")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "filter: GalleryEqualsFilter {\n"
+ "property: \"width\"\n"
+ "value: 1920\n"
+ "negated: true\n"
+ "}\n"
+ "}\n")
+ << QGalleryFilter(!(QDocumentGallery::width == 1920));
+
+ QTest::newRow("width < 1920")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "filter: GalleryLessThanFilter {\n"
+ "property: \"width\"\n"
+ "value: 1920\n"
+ "}\n"
+ "}\n")
+ << QGalleryFilter(QDocumentGallery::width < 1920);
+
+ QTest::newRow("width <= 1920")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "filter: GalleryLessThanEqualsFilter {\n"
+ "property: \"width\"\n"
+ "value: 1920\n"
+ "}\n"
+ "}\n")
+ << QGalleryFilter(QDocumentGallery::width <= 1920);
+
+ QTest::newRow("width > 1920")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "filter: GalleryGreaterThanFilter {\n"
+ "property: \"width\"\n"
+ "value: 1920\n"
+ "}\n"
+ "}\n")
+ << QGalleryFilter(QDocumentGallery::width > 1920);
+
+ QTest::newRow("width >= 1920")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "filter: GalleryGreaterThanEqualsFilter {\n"
+ "property: \"width\"\n"
+ "value: 1920\n"
+ "}\n"
+ "}\n")
+ << QGalleryFilter(QDocumentGallery::width >= 1920);
+
+ QTest::newRow("fileName.startsWith(p)")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "filter: GalleryStartsWithFilter {\n"
+ "property: \"fileName\"\n"
+ "value: \"p\"\n"
+ "negated: false\n"
+ "}\n"
+ "}\n")
+ << QGalleryFilter(QDocumentGallery::fileName.startsWith(QLatin1String("p")));
+
+ QTest::newRow("!fileName.startsWith(p)")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "filter: GalleryStartsWithFilter {\n"
+ "property: \"fileName\"\n"
+ "value: \"p\"\n"
+ "negated: true\n"
+ "}\n"
+ "}\n")
+ << QGalleryFilter(!QDocumentGallery::fileName.startsWith(QLatin1String("p")));
+
+ QTest::newRow("fileName.endsWith(.jpg)")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "filter: GalleryEndsWithFilter {\n"
+ "property: \"fileName\"\n"
+ "value: \".jpg\"\n"
+ "}\n"
+ "}\n")
+ << QGalleryFilter(QDocumentGallery::fileName.endsWith(QLatin1String(".jpg")));
+
+ QTest::newRow("fileName.contains(p)")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "filter: GalleryContainsFilter {\n"
+ "property: \"fileName\"\n"
+ "value: \"p\"\n"
+ "}\n"
+ "}\n")
+ << QGalleryFilter(QDocumentGallery::fileName.contains(QLatin1String("p")));
+
+ QTest::newRow("fileName.wildcard(p*.jpg)")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "filter: GalleryWildcardFilter {\n"
+ "property: \"fileName\"\n"
+ "value: \"p*.jpg\"\n"
+ "}\n"
+ "}\n")
+ << QGalleryFilter(QDocumentGallery::fileName.wildcard(QLatin1String("p*.jpg")));
+
+ QTest::newRow("fileName.regExp(p\\d{6}\\.(jpg|jpeg))")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "filter: GalleryEqualsFilter {\n"
+ "property: \"fileName\"\n"
+ "value: /p\\d{6}\\.(jpg|jpeg)/\n"
+ "}\n"
+ "}\n")
+ << QGalleryFilter(QDocumentGallery::fileName.regExp(QRegExp(
+ QLatin1String("p\\d{6}\\.(jpg|jpeg)"), Qt::CaseSensitive, QRegExp::RegExp2)));
+
+
+ {
+ QGalleryIntersectionFilter filter;
+ filter.append(QDocumentGallery::fileName.startsWith(QLatin1String("p")));
+ filter.append(QDocumentGallery::fileName.endsWith(QLatin1String(".jpg")));
+
+ QTest::newRow("fileName.startsWith(p) && fileName.endsWith(.jpg")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "filter: GalleryFilterIntersection {\n"
+ "GalleryStartsWithFilter {\n"
+ "property: \"fileName\"\n"
+ "value: \"p\"\n"
+ "}\n"
+ "GalleryEndsWithFilter {\n"
+ "property: \"fileName\"\n"
+ "value: \".jpg\"\n"
+ "}\n"
+ "}\n"
+ "}\n")
+ << QGalleryFilter(filter);
+ } {
+ QGalleryUnionFilter filter;
+ filter.append(QGalleryMetaDataFilter(
+ QDocumentGallery::fileName, QLatin1String(".jpg"), QGalleryFilter::EndsWith));
+ filter.append(QGalleryMetaDataFilter(
+ QDocumentGallery::fileName, QLatin1String(".jpeg"), QGalleryFilter::EndsWith));
+
+ QTest::newRow("fileName.endsWith(.jpg) || fileName.endsWith(.jpeg")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "filter: GalleryFilterUnion {\n"
+ "GalleryEndsWithFilter {\n"
+ "property: \"fileName\"\n"
+ "value: \".jpg\"\n"
+ "}\n"
+ "GalleryEndsWithFilter {\n"
+ "property: \"fileName\"\n"
+ "value: \".jpeg\"\n"
+ "}\n"
+ "}\n"
+ "}\n")
+ << QGalleryFilter(filter);
+ } {
+ QGalleryUnionFilter unionFilter;
+ unionFilter.append(QGalleryMetaDataFilter(
+ QDocumentGallery::fileName, QLatin1String(".jpg"), QGalleryFilter::EndsWith));
+ unionFilter.append(QGalleryMetaDataFilter(
+ QDocumentGallery::fileName, QLatin1String(".jpeg"), QGalleryFilter::EndsWith));
+
+ QGalleryIntersectionFilter filter;
+ filter.append(QGalleryMetaDataFilter(
+ QDocumentGallery::fileName, QLatin1String("p"), QGalleryFilter::StartsWith));
+ filter.append(unionFilter);
+
+ QTest::newRow("fileName.startsWith(p) && (fileName.endsWith(.jpg) || fileName.endsWith(.jpeg)")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "filter: GalleryFilterIntersection {\n"
+ "GalleryStartsWithFilter {\n"
+ "property: \"fileName\"\n"
+ "value: \"p\"\n"
+ "}\n"
+ "GalleryFilterUnion {\n"
+ "GalleryEndsWithFilter {\n"
+ "property: \"fileName\"\n"
+ "value: \".jpg\"\n"
+ "}\n"
+ "GalleryEndsWithFilter {\n"
+ "property: \"fileName\"\n"
+ "value: \".jpeg\"\n"
+ "}\n"
+ "}\n"
+ "}\n"
+ "}\n")
+ << QGalleryFilter(filter);
+ } {
+ QGalleryUnionFilter filter;
+ {
+ QGalleryIntersectionFilter intersectionFilter;
+ intersectionFilter.append(QDocumentGallery::fileName.startsWith(QLatin1String("p")));
+ intersectionFilter.append(QDocumentGallery::fileName.endsWith(QLatin1String(".jpg")));
+ filter.append(intersectionFilter);
+ } {
+ QGalleryIntersectionFilter intersectionFilter;
+ intersectionFilter.append(QDocumentGallery::fileName.startsWith(QLatin1String("p")));
+ intersectionFilter.append(QDocumentGallery::fileName.endsWith(QLatin1String(".jpeg")));
+ filter.append(intersectionFilter);
+ }
+
+ QTest::newRow("(fileName.startsWith(p) && fileName.endsWith(.jpg) || (fileName.startsWith(p) && fileName.endsWith(.jpeg)")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "filter: GalleryFilterUnion {\n"
+ "GalleryFilterIntersection {\n"
+ "GalleryStartsWithFilter {\n"
+ "property: \"fileName\"\n"
+ "value: \"p\"\n"
+ "}\n"
+ "GalleryEndsWithFilter {\n"
+ "property: \"fileName\"\n"
+ "value: \".jpg\"\n"
+ "}\n"
+ "}\n"
+ "GalleryFilterIntersection {\n"
+ "GalleryStartsWithFilter {\n"
+ "property: \"fileName\"\n"
+ "value: \"p\"\n"
+ "}\n"
+ "GalleryEndsWithFilter {\n"
+ "property: \"fileName\"\n"
+ "value: \".jpeg\"\n"
+ "}\n"
+ "}\n"
+ "}\n"
+ "}\n")
+ << QGalleryFilter(filter);
+ } {
+ QGalleryIntersectionFilter filter;
+ filter.append(QDocumentGallery::fileName.startsWith(QLatin1String("p")));
+ filter.append(QDocumentGallery::fileName.endsWith(QLatin1String(".jpg")));
+
+ QTest::newRow("fileName.startsWith(p) && (fileName.endsWith(.jpg)")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "filter: GalleryFilterIntersection {\n"
+ "GalleryStartsWithFilter {\n"
+ "property: \"fileName\"\n"
+ "value: \"p\"\n"
+ "}\n"
+ "GalleryFilterIntersection {\n"
+ "GalleryEndsWithFilter {\n"
+ "property: \"fileName\"\n"
+ "value: \".jpg\"\n"
+ "}\n"
+ "}\n"
+ "}\n"
+ "}\n")
+ << QGalleryFilter(filter);
+ } {
+ QGalleryUnionFilter filter;
+ filter.append(QDocumentGallery::fileName.endsWith(QLatin1String(".jpg")));
+ filter.append(QDocumentGallery::fileName.endsWith(QLatin1String(".jpeg")));
+
+ QTest::newRow("fileName.endsWith(.jpg) || (fileName.endsWith(.jpeg)")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "filter: GalleryFilterUnion {\n"
+ "GalleryEndsWithFilter {\n"
+ "property: \"fileName\"\n"
+ "value: \".jpg\"\n"
+ "}\n"
+ "GalleryFilterUnion {\n"
+ "GalleryEndsWithFilter {\n"
+ "property: \"fileName\"\n"
+ "value: \".jpeg\"\n"
+ "}\n"
+ "}\n"
+ "}\n"
+ "}\n")
+ << QGalleryFilter(filter);
+ }
+}
+
+void tst_QDeclarativeDocumentGalleryModel::filter()
+{
+ QFETCH(QByteArray, qml);
+ QFETCH(QGalleryFilter, filter);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QCOMPARE(gallery.request()->filter(), filter);
+
+ if (filter.isValid()) {
+ QVERIFY(object->property("filter").value<QDeclarativeGalleryFilterBase *>());
+ } else {
+ QVERIFY(!object->property("filter").value<QDeclarativeGalleryFilterBase *>());
+ }
+}
+
+void tst_QDeclarativeDocumentGalleryModel::changeFilter_data()
+{
+ QTest::addColumn<QByteArray>("qml");
+ QTest::addColumn<QGalleryFilter>("qmlFilter");
+ QTest::addColumn<QByteArray>("filterQml");
+ QTest::addColumn<QGalleryFilter>("filter");
+
+ QTest::newRow("undefined -> width == 1920")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {}\n")
+ << QGalleryFilter()
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "GalleryEqualsFilter {\n"
+ "property: \"width\"\n"
+ "value: 1920\n"
+ "negated: false\n"
+ "}\n")
+ << QGalleryFilter(QDocumentGallery::width == 1920);
+
+ QTest::newRow("width == 1920 -> width == 1920")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "filter: GalleryEqualsFilter {\n"
+ "property: \"width\"\n"
+ "value: 1920\n"
+ "negated: false\n"
+ "}\n"
+ "}\n")
+ << QGalleryFilter(QDocumentGallery::width == 1920)
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "GalleryEqualsFilter {\n"
+ "property: \"width\"\n"
+ "value: 1920\n"
+ "negated: false\n"
+ "}\n")
+ << QGalleryFilter(QDocumentGallery::width == 1920);
+
+ QTest::newRow("width == 1920 -> width != 1920")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "filter: GalleryEqualsFilter {\n"
+ "property: \"width\"\n"
+ "value: 1920\n"
+ "negated: false\n"
+ "}\n"
+ "}\n")
+ << QGalleryFilter(QDocumentGallery::width == 1920)
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "GalleryEqualsFilter {\n"
+ "property: \"width\"\n"
+ "value: 1920\n"
+ "negated: true\n"
+ "}\n")
+ << QGalleryFilter(!(QDocumentGallery::width == 1920));
+
+ QTest::newRow("width == 1920 -> undefined")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "filter: GalleryEqualsFilter {\n"
+ "property: \"width\"\n"
+ "value: 1920\n"
+ "negated: false\n"
+ "}\n"
+ "}\n")
+ << QGalleryFilter(QDocumentGallery::width == 1920)
+ << QByteArray()
+ << QGalleryFilter();
+}
+
+void tst_QDeclarativeDocumentGalleryModel::changeFilter()
+{
+ QFETCH(QByteArray, qml);
+ QFETCH(QGalleryFilter, qmlFilter);
+ QFETCH(QByteArray, filterQml);
+ QFETCH(QGalleryFilter, filter);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QCOMPARE(gallery.request()->filter(), qmlFilter);
+
+ QSignalSpy spy(object.data(), SIGNAL(filterChanged()));
+
+ if (!filterQml.isEmpty()) {
+ QDeclarativeComponent filterComponent(&engine);
+ filterComponent.setData(filterQml, QUrl());
+
+ QScopedPointer<QObject> filterObject(filterComponent.create());
+ QVERIFY(filterObject);
+
+ QDeclarativeGalleryFilterBase *declarativeFilter
+ = static_cast<QDeclarativeGalleryFilterBase *>(filterObject.data());
+ void *argv[] = { &declarativeFilter };
+
+ int propertyIndex = object->metaObject()->indexOfProperty("filter");
+ QVERIFY(propertyIndex != -1);
+ object->qt_metacall(QMetaObject::WriteProperty, propertyIndex, argv);
+ QCOMPARE(spy.count(), 1);
+
+ QMetaObject::invokeMethod(object.data(), "reload");
+ } else {
+ QDeclarativeGalleryFilterBase *declarativeFilter = 0;
+ void *argv[] = { &declarativeFilter };
+
+ int propertyIndex = object->metaObject()->indexOfProperty("filter");
+ QVERIFY(propertyIndex != -1);
+ object->qt_metacall(QMetaObject::WriteProperty, propertyIndex, argv);
+ QCOMPARE(spy.count(), 1);
+
+ QMetaObject::invokeMethod(object.data(), "reload");
+ }
+ QVERIFY(gallery.request());
+ QCOMPARE(gallery.request()->filter(), filter);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::changeFilterAuto()
+{
+ QFETCH(QByteArray, qml);
+ QFETCH(QGalleryFilter, qmlFilter);
+ QFETCH(QByteArray, filterQml);
+ QFETCH(QGalleryFilter, filter);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QCOMPARE(gallery.request()->filter(), qmlFilter);
+
+ QSignalSpy spy(object.data(), SIGNAL(filterChanged()));
+
+ if (!filterQml.isEmpty()) {
+ QDeclarativeComponent filterComponent(&engine);
+ filterComponent.setData(filterQml, QUrl());
+
+ QScopedPointer<QObject> filterObject(filterComponent.create());
+ QVERIFY(filterObject);
+
+ QDeclarativeGalleryFilterBase *declarativeFilter
+ = static_cast<QDeclarativeGalleryFilterBase *>(filterObject.data());
+ void *argv[] = { &declarativeFilter };
+
+ int propertyIndex = object->metaObject()->indexOfProperty("filter");
+ QVERIFY(propertyIndex != -1);
+ object->qt_metacall(QMetaObject::WriteProperty, propertyIndex, argv);
+ QCOMPARE(spy.count(), 1);
+
+ QCoreApplication::processEvents();
+ } else {
+ QDeclarativeGalleryFilterBase *declarativeFilter = 0;
+ void *argv[] = { &declarativeFilter };
+
+ int propertyIndex = object->metaObject()->indexOfProperty("filter");
+ QVERIFY(propertyIndex != -1);
+ object->qt_metacall(QMetaObject::WriteProperty, propertyIndex, argv);
+ QCOMPARE(spy.count(), 1);
+
+ QCoreApplication::processEvents();
+ }
+ QVERIFY(gallery.request());
+ QCOMPARE(gallery.request()->filter(), filter);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::filterProperties_data()
+{
+ QTest::addColumn<QByteArray>("qml");
+ QTest::addColumn<QByteArray>("property");
+ QTest::addColumn<QByteArray>("changeSignal");
+ QTest::addColumn<QVariant>("qmlValue");
+ QTest::addColumn<QVariant>("value");
+
+ QTest::newRow("Equals.property: Default -> title")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "GalleryEqualsFilter {}\n")
+ << QByteArray("property")
+ << QByteArray(SIGNAL(propertyNameChanged()))
+ << QVariant(QVariant::String)
+ << QVariant(QLatin1String("title"));
+
+ QTest::newRow("Equals.property: title -> title")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "GalleryEqualsFilter { property: \"title\" }\n")
+ << QByteArray("property")
+ << QByteArray(SIGNAL(propertyNameChanged()))
+ << QVariant(QLatin1String("title"))
+ << QVariant(QLatin1String("title"));
+
+ QTest::newRow("Equals.property: title -> duration")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "GalleryEqualsFilter { property: \"title\" }\n")
+ << QByteArray("property")
+ << QByteArray(SIGNAL(propertyNameChanged()))
+ << QVariant(QLatin1String("title"))
+ << QVariant(QLatin1String("duration"));
+
+ QTest::newRow("Equals.value: Default -> Interlude")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "GalleryEqualsFilter {}\n")
+ << QByteArray("value")
+ << QByteArray(SIGNAL(valueChanged()))
+ << QVariant()
+ << QVariant(QLatin1String("Interlude"));
+
+ QTest::newRow("Equals.value: Interlude -> Interlude")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "GalleryEqualsFilter { value: \"Interlude\" }\n")
+ << QByteArray("value")
+ << QByteArray(SIGNAL(valueChanged()))
+ << QVariant(QLatin1String("Interlude"))
+ << QVariant(QLatin1String("Interlude"));
+
+ QTest::newRow("Equals.value: Interlude -> 45000")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "GalleryEqualsFilter { value: \"Interlude\" }\n")
+ << QByteArray("value")
+ << QByteArray(SIGNAL(valueChanged()))
+ << QVariant(QLatin1String("Interlude"))
+ << QVariant(45000);
+
+ QTest::newRow("Equals.negated: Default -> true")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "GalleryEqualsFilter {}\n")
+ << QByteArray("negated")
+ << QByteArray(SIGNAL(negatedChanged()))
+ << QVariant(false)
+ << QVariant(true);
+
+ QTest::newRow("Equals.negated: true -> true")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "GalleryEqualsFilter { negated: true }\n")
+ << QByteArray("negated")
+ << QByteArray(SIGNAL(negatedChanged()))
+ << QVariant(true)
+ << QVariant(true);
+
+ QTest::newRow("Equals.negated: true -> false")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "GalleryEqualsFilter { negated: true }\n")
+ << QByteArray("negated")
+ << QByteArray(SIGNAL(negatedChanged()))
+ << QVariant(true)
+ << QVariant(false);
+
+ QTest::newRow("Wildcard.property: Default -> title")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "GalleryWildcardFilter {}\n")
+ << QByteArray("property")
+ << QByteArray(SIGNAL(propertyNameChanged()))
+ << QVariant(QVariant::String)
+ << QVariant(QLatin1String("title"));
+
+ QTest::newRow("Wildcard.property: title -> title")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "GalleryWildcardFilter { property: \"title\" }\n")
+ << QByteArray("property")
+ << QByteArray(SIGNAL(propertyNameChanged()))
+ << QVariant(QLatin1String("title"))
+ << QVariant(QLatin1String("title"));
+
+ QTest::newRow("Wildcard.property: title -> duration")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "GalleryWildcardFilter { property: \"title\" }\n")
+ << QByteArray("property")
+ << QByteArray(SIGNAL(propertyNameChanged()))
+ << QVariant(QLatin1String("title"))
+ << QVariant(QLatin1String("duration"));
+
+ QTest::newRow("Wildcard.value: Default -> *Interlude")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "GalleryWildcardFilter {}\n")
+ << QByteArray("value")
+ << QByteArray(SIGNAL(valueChanged()))
+ << QVariant(QVariant::String)
+ << QVariant(QLatin1String("*Interlude"));
+
+ QTest::newRow("Wildcard.value: *Interlude -> *Interlude")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "GalleryWildcardFilter { value: \"*Interlude\" }\n")
+ << QByteArray("value")
+ << QByteArray(SIGNAL(valueChanged()))
+ << QVariant(QLatin1String("*Interlude"))
+ << QVariant(QLatin1String("*Interlude"));
+
+ QTest::newRow("Wildcard.value: *Interlude -> interlude.*")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "GalleryWildcardFilter { value: \"*Interlude\" }\n")
+ << QByteArray("value")
+ << QByteArray(SIGNAL(valueChanged()))
+ << QVariant(QLatin1String("*Interlude"))
+ << QVariant(QLatin1String("interlude.*"));
+
+ QTest::newRow("Wildcard.negated: Default -> true")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "GalleryWildcardFilter {}\n")
+ << QByteArray("negated")
+ << QByteArray(SIGNAL(negatedChanged()))
+ << QVariant(false)
+ << QVariant(true);
+
+ QTest::newRow("Wildcard.negated: false -> false")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "GalleryWildcardFilter { negated: true }\n")
+ << QByteArray("negated")
+ << QByteArray(SIGNAL(negatedChanged()))
+ << QVariant(true)
+ << QVariant(true);
+
+ QTest::newRow("Wildcard.negated: false -> true")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "GalleryWildcardFilter { negated: true }\n")
+ << QByteArray("negated")
+ << QByteArray(SIGNAL(negatedChanged()))
+ << QVariant(true)
+ << QVariant(false);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::filterProperties()
+{
+ QFETCH(QByteArray, qml);
+ QFETCH(QByteArray, property);
+ QFETCH(QByteArray, changeSignal);
+ QFETCH(QVariant, qmlValue);
+ QFETCH(QVariant, value);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+
+ QSignalSpy spy(object.data(), changeSignal.constData());
+
+ QCOMPARE(object->property(property.constData()), qmlValue);
+
+ QCOMPARE(object->setProperty(property.constData(), value), true);
+ QCOMPARE(object->property(property.constData()), value);
+ QCOMPARE(spy.count(), qmlValue != value ? 1 : 0);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::groupFilter_data()
+{
+ QTest::addColumn<QByteArray>("qml");
+ QTest::addColumn<QGalleryFilter::Type>("type");
+
+ QTest::newRow("Intersection")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "filter: GalleryFilterIntersection {}\n"
+ "}\n")
+ << QGalleryFilter::Intersection;
+
+ QTest::newRow("Union")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "filter: GalleryFilterUnion {}\n"
+ "}\n")
+ << QGalleryFilter::Union;
+}
+
+void tst_QDeclarativeDocumentGalleryModel::groupFilter()
+{
+ QFETCH(QByteArray, qml);
+ QFETCH(QGalleryFilter::Type, type);
+
+ QGalleryFilter filter;
+ QList<QGalleryFilter> actualFilters;
+ QList<QGalleryFilter> expectedFilters;
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+
+ QObject *declarativeFilter = object->property("filter").value<QDeclarativeGalleryFilterBase *>();
+ QVERIFY(declarativeFilter);
+
+ QSignalSpy spy(declarativeFilter, SIGNAL(filterChanged()));
+
+ QDeclarativeListProperty<QDeclarativeGalleryFilterBase> filterList
+ = declarativeFilter->property("filters")
+ .value<QDeclarativeListProperty<QDeclarativeGalleryFilterBase> >();
+
+ QVERIFY(filterList.append);
+ QVERIFY(filterList.count);
+ QVERIFY(filterList.at);
+ QVERIFY(filterList.clear);
+
+ QCOMPARE(filterList.count(&filterList), 0);
+
+ {
+ const QByteArray filterQml(
+ "import QtMobility.gallery 1.1\n"
+ "GalleryEqualsFilter { property: \"fileName\"; value: \"filename.ext\" }\n");
+
+ QDeclarativeComponent filterComponent(&engine);
+ filterComponent.setData(filterQml, QUrl());
+
+ QScopedPointer<QObject> filterObject(filterComponent.create());
+ QVERIFY(filterObject);
+
+ filterList.append(
+ &filterList, static_cast<QDeclarativeGalleryFilterBase *>(filterObject.take()));
+ }
+ QCOMPARE(filterList.count(&filterList), 1);
+ QVERIFY(filterList.at(&filterList, 0));
+ QCOMPARE(filterList.at(&filterList, 0)->filter(),
+ QGalleryFilter(QDocumentGallery::fileName == QLatin1String("filename.ext")));
+ QCOMPARE(spy.count(), 1);
+
+ QCoreApplication::processEvents();
+ QVERIFY(gallery.request());
+
+ filter = gallery.request()->filter();
+ QCOMPARE(filter.type(), type);
+
+ actualFilters = type == QGalleryFilter::Intersection
+ ? filter.toIntersectionFilter().filters()
+ : filter.toUnionFilter().filters();
+ expectedFilters.append(QDocumentGallery::fileName == QLatin1String("filename.ext"));
+ QCOMPARE(actualFilters, expectedFilters);
+
+ {
+ const QByteArray filterQml(
+ "import QtMobility.gallery 1.1\n"
+ "GalleryLessThanFilter { property: \"trackNumber\"; value: 12 }\n");
+
+ QDeclarativeComponent filterComponent(&engine);
+ filterComponent.setData(filterQml, QUrl());
+
+ QScopedPointer<QObject> filterObject(filterComponent.create());
+ QVERIFY(filterObject);
+
+ filterList.append(
+ &filterList, static_cast<QDeclarativeGalleryFilterBase *>(filterObject.take()));
+ }
+ QCOMPARE(filterList.count(&filterList), 2);
+ QVERIFY(filterList.at(&filterList, 1));
+ QCOMPARE(filterList.at(&filterList, 1)->filter(),
+ QGalleryFilter(QDocumentGallery::trackNumber < 12));
+ QCOMPARE(spy.count(), 2);
+
+ QCoreApplication::processEvents();
+ QVERIFY(gallery.request());
+
+ filter = gallery.request()->filter();
+ QCOMPARE(filter.type(), type);
+
+ actualFilters = type == QGalleryFilter::Intersection
+ ? filter.toIntersectionFilter().filters()
+ : filter.toUnionFilter().filters();
+ expectedFilters.append(QDocumentGallery::trackNumber < 12);
+ QCOMPARE(actualFilters, expectedFilters);
+
+ filterList.clear(&filterList);
+ QCOMPARE(filterList.count(&filterList), 0);
+ QCOMPARE(spy.count(), 3);
+
+ QCoreApplication::processEvents();
+ QVERIFY(gallery.request());
+
+ filter = gallery.request()->filter();
+ QCOMPARE(filter.type(), type);
+
+ actualFilters = type == QGalleryFilter::Intersection
+ ? filter.toIntersectionFilter().filters()
+ : filter.toUnionFilter().filters();
+ expectedFilters.clear();
+ QCOMPARE(actualFilters, expectedFilters);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::progress_data()
+{
+ QTest::addColumn<int>("currentProgress");
+ QTest::addColumn<int>("maximumProgress");
+ QTest::addColumn<qreal>("normalizedProgress");
+
+ QTest::newRow("25%")
+ << 25
+ << 100
+ << qreal(0.25);
+
+ QTest::newRow("50%")
+ << 3
+ << 6
+ << qreal(0.5);
+
+ QTest::newRow("75%")
+ << 60
+ << 80
+ << qreal(0.75);
+
+ QTest::newRow("100%")
+ << 32
+ << 32
+ << qreal(1.0);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::progress()
+{
+ QFETCH(int, currentProgress);
+ QFETCH(int, maximumProgress);
+ QFETCH(qreal, normalizedProgress);
+
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "properties: [ \"fileName\", \"title\", \"turtle\" ]\n"
+ "}\n");
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(progressChanged()));
+
+ QCOMPARE(object->property("progress"), QVariant(qreal(0.0)));
+
+ gallery.response()->progressChanged(currentProgress, maximumProgress);
+ QCOMPARE(object->property("progress"), QVariant(normalizedProgress));
+ QCOMPARE(spy.count(), 1);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::roleNames()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "properties: [ \"fileName\", \"title\", \"turtle\" ]\n"
+ "}\n");
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QAbstractItemModel *model = qobject_cast<QAbstractItemModel *>(object.data());
+ QVERIFY(model);
+
+ QHash<int, QByteArray> roleNames = model->roleNames();
+
+ QCOMPARE(roleNames.value(QDeclarativeGalleryQueryModel::ItemId), QByteArray("itemId"));
+ QCOMPARE(roleNames.value(QDeclarativeGalleryQueryModel::ItemType), QByteArray("itemType"));
+
+ QCOMPARE(roleNames.key("fileName", -1), gallery.response()->propertyKey(QLatin1String("fileName")) + 2);
+ QCOMPARE(roleNames.key("title", -1), gallery.response()->propertyKey(QLatin1String("title")) + 2);
+ QCOMPARE(roleNames.key("turtle", -1), -1);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::indexes()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "properties: [ \"fileName\", \"title\", \"turtle\" ]\n"
+ "}\n");
+
+ gallery.addRow();
+ gallery.addRow();
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QAbstractItemModel *model = qobject_cast<QAbstractItemModel *>(object.data());
+ QVERIFY(model);
+
+ QCOMPARE(model->rowCount(), 2);
+ QCOMPARE(model->columnCount(), 1);
+
+ QCOMPARE(model->index(-1, -1).isValid(), false);
+ QCOMPARE(model->index(-1, 0).isValid(), false);
+ QCOMPARE(model->index(-1, 0).isValid(), false);
+ QCOMPARE(model->index(-1, 1).isValid(), false);
+
+ QCOMPARE(model->index( 0, -1).isValid(), false);
+ QCOMPARE(model->index( 0, 0).isValid(), true);
+ QCOMPARE(model->index( 0, 0).isValid(), true);
+ QCOMPARE(model->index( 0, 1).isValid(), false);
+
+ QCOMPARE(model->index( 1, -1).isValid(), false);
+ QCOMPARE(model->index( 1, 0).isValid(), true);
+ QCOMPARE(model->index( 1, 0).isValid(), true);
+ QCOMPARE(model->index( 1, 1).isValid(), false);
+
+ QCOMPARE(model->index( 2, -1).isValid(), false);
+ QCOMPARE(model->index( 2, 0).isValid(), false);
+ QCOMPARE(model->index( 2, 0).isValid(), false);
+ QCOMPARE(model->index( 2, 1).isValid(), false);
+
+ QModelIndex parent = model->index(0, 0);
+
+ QCOMPARE(model->rowCount(parent), 0);
+ QCOMPARE(model->columnCount(parent), 0);
+
+ QCOMPARE(model->index(-1, -1, parent).isValid(), false);
+ QCOMPARE(model->index(-1, 0, parent).isValid(), false);
+ QCOMPARE(model->index(-1, 0, parent).isValid(), false);
+ QCOMPARE(model->index(-1, 1, parent).isValid(), false);
+
+ QCOMPARE(model->index( 0, -1, parent).isValid(), false);
+ QCOMPARE(model->index( 0, 0, parent).isValid(), false);
+ QCOMPARE(model->index( 0, 0, parent).isValid(), false);
+ QCOMPARE(model->index( 0, 1, parent).isValid(), false);
+
+ QCOMPARE(model->index( 1, -1, parent).isValid(), false);
+ QCOMPARE(model->index( 1, 0, parent).isValid(), false);
+ QCOMPARE(model->index( 1, 0, parent).isValid(), false);
+ QCOMPARE(model->index( 1, 1, parent).isValid(), false);
+
+ QCOMPARE(model->index( 2, -1, parent).isValid(), false);
+ QCOMPARE(model->index( 2, 0, parent).isValid(), false);
+ QCOMPARE(model->index( 2, 0, parent).isValid(), false);
+ QCOMPARE(model->index( 2, 1, parent).isValid(), false);
+
+}
+
+void tst_QDeclarativeDocumentGalleryModel::data_data()
+{
+ QTest::addColumn<int>("index");
+ QTest::addColumn<bool>("isValid");
+ QTest::addColumn<QVariant>("itemId");
+ QTest::addColumn<QVariant>("itemType");
+ QTest::addColumn<QVariant>("fileName");
+ QTest::addColumn<QVariant>("title");
+
+ QTest::newRow("-1")
+ << -1
+ << false
+ << QVariant()
+ << QVariant()
+ << QVariant()
+ << QVariant();
+
+ QTest::newRow("0")
+ << 0
+ << true
+ << QVariant(3)
+ << QVariant::fromValue(QDeclarativeDocumentGallery::Audio)
+ << QVariant(QLatin1String("interlude.mp3"))
+ << QVariant(QLatin1String("Interlude"));
+
+ QTest::newRow("1")
+ << 1
+ << true
+ << QVariant(45)
+ << QVariant::fromValue(QDeclarativeDocumentGallery::Audio)
+ << QVariant(QLatin1String("beep.wav"))
+ << QVariant(QVariant::String);
+
+ QTest::newRow("2")
+ << 2
+ << false
+ << QVariant()
+ << QVariant()
+ << QVariant()
+ << QVariant();
+}
+
+void tst_QDeclarativeDocumentGalleryModel::data()
+{
+ QFETCH(int, index);
+ QFETCH(bool, isValid);
+ QFETCH(QVariant, itemId);
+ QFETCH(QVariant, itemType);
+ QFETCH(QVariant, fileName);
+ QFETCH(QVariant, title);
+
+ populateGallery();
+
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "properties: [ \"fileName\", \"title\", \"turtle\" ]\n"
+ "}\n");
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QAbstractItemModel *model = qobject_cast<QAbstractItemModel *>(object.data());
+ QVERIFY(model);
+
+ const int itemIdRole = QDeclarativeGalleryQueryModel::ItemId;
+ const int itemTypeRole = QDeclarativeGalleryQueryModel::ItemType;
+ const int fileNameRole = model->roleNames().key("fileName");
+ const int titleRole = model->roleNames().key("title");
+
+ QCOMPARE(model->rowCount(), 2);
+ QCOMPARE(model->columnCount(), 1);
+
+ QModelIndex modelIndex = model->index(index, 0);
+ QCOMPARE(modelIndex.isValid(), isValid);
+
+ QCOMPARE(model->data(modelIndex, itemIdRole), itemId);
+ QCOMPARE(model->data(modelIndex, itemTypeRole).toInt(), itemType.toInt());
+ QCOMPARE(model->data(modelIndex, fileNameRole), fileName);
+ QCOMPARE(model->data(modelIndex, titleRole), title);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::setData_data()
+{
+ QTest::addColumn<int>("index");
+ QTest::addColumn<bool>("isValid");
+ QTest::addColumn<QVariant>("itemId");
+ QTest::addColumn<QVariant>("newItemId");
+ QTest::addColumn<QVariant>("itemType");
+ QTest::addColumn<QVariant>("newItemType");
+ QTest::addColumn<QVariant>("fileName");
+ QTest::addColumn<QVariant>("newFileName");
+ QTest::addColumn<QVariant>("title");
+ QTest::addColumn<QVariant>("newTitle");
+
+ QTest::newRow("-1")
+ << -1
+ << false
+ << QVariant()
+ << QVariant(9)
+ << QVariant()
+ << QVariant::fromValue(QDeclarativeDocumentGallery::File)
+ << QVariant()
+ << QVariant(QLatin1String("a.file"))
+ << QVariant()
+ << QVariant(QLatin1String("Something"));
+
+ QTest::newRow("0")
+ << 0
+ << true
+ << QVariant(3)
+ << QVariant(76)
+ << QVariant::fromValue(QDeclarativeDocumentGallery::Audio)
+ << QVariant::fromValue(QDeclarativeDocumentGallery::Video)
+ << QVariant(QLatin1String("interlude.mp3"))
+ << QVariant(QLatin1String("03-interlude.mp3"))
+ << QVariant(QLatin1String("Interlude"))
+ << QVariant(QLatin1String("An Interlude"));
+
+ QTest::newRow("1")
+ << 1
+ << true
+ << QVariant(45)
+ << QVariant(21)
+ << QVariant::fromValue(QDeclarativeDocumentGallery::Audio)
+ << QVariant::fromValue(QDeclarativeDocumentGallery::Image)
+ << QVariant(QLatin1String("beep.wav"))
+ << QVariant(QLatin1String("beep.mp3"))
+ << QVariant(QVariant::String)
+ << QVariant(QLatin1String("Beep Sound"));
+
+ QTest::newRow("2")
+ << 2
+ << false
+ << QVariant()
+ << QVariant(9)
+ << QVariant()
+ << QVariant::fromValue(QDeclarativeDocumentGallery::File)
+ << QVariant()
+ << QVariant(QLatin1String("a.file"))
+ << QVariant()
+ << QVariant(QLatin1String("Something"));
+}
+
+void tst_QDeclarativeDocumentGalleryModel::setData()
+{
+ QFETCH(int, index);
+ QFETCH(bool, isValid);
+ QFETCH(QVariant, itemId);
+ QFETCH(QVariant, newItemId);
+ QFETCH(QVariant, itemType);
+ QFETCH(QVariant, newItemType);
+ QFETCH(QVariant, fileName);
+ QFETCH(QVariant, newFileName);
+ QFETCH(QVariant, title);
+ QFETCH(QVariant, newTitle);
+
+ populateGallery();
+
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "properties: [ \"fileName\", \"title\", \"turtle\" ]\n"
+ "}\n");
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QAbstractItemModel *model = qobject_cast<QAbstractItemModel *>(object.data());
+ QVERIFY(model);
+
+ QSignalSpy spy(model, SIGNAL(dataChanged(QModelIndex,QModelIndex)));
+
+ const int itemIdRole = QDeclarativeGalleryQueryModel::ItemId;
+ const int itemTypeRole = QDeclarativeGalleryQueryModel::ItemType;
+ const int fileNameRole = model->roleNames().key("fileName");
+ const int titleRole = model->roleNames().key("title");
+
+ QCOMPARE(model->rowCount(), 2);
+ QCOMPARE(model->columnCount(), 1);
+
+ QModelIndex modelIndex = model->index(index, 0);
+ QCOMPARE(modelIndex.isValid(), isValid);
+
+ QCOMPARE(model->setData(modelIndex, newTitle, titleRole), isValid);
+ QCOMPARE(model->data(modelIndex, titleRole), isValid ? newTitle : title);
+ QCOMPARE(spy.count(), isValid ? 1 : 0);
+
+ QCOMPARE(model->setData(modelIndex, newItemId, itemIdRole), false);
+ QCOMPARE(model->data(modelIndex, itemIdRole), itemId);
+ QCOMPARE(spy.count(), isValid ? 1 : 0);
+
+ QCOMPARE(model->setData(modelIndex, newItemType, itemTypeRole), false);
+ QCOMPARE(model->data(modelIndex, itemTypeRole).toInt(), itemType.toInt());
+ QCOMPARE(spy.count(), isValid ? 1 : 0);
+
+ QCOMPARE(model->setData(modelIndex, newFileName, fileNameRole), false);
+ QCOMPARE(model->data(modelIndex, fileNameRole), fileName);
+ QCOMPARE(spy.count(), isValid ? 1 : 0);
+
+}
+
+#define QT_GALLERY_MODEL_CALL_PROPERTY(index, property) \
+ QMetaObject::invokeMethod( \
+ object.data(), \
+ "property", \
+ Q_RETURN_ARG(QVariant, value), \
+ Q_ARG(int, index), \
+ Q_ARG(QString, QLatin1String(property)))
+
+void tst_QDeclarativeDocumentGalleryModel::property()
+{
+ QFETCH(int, index);
+ QFETCH(QVariant, itemId);
+ QFETCH(QVariant, itemType);
+ QFETCH(QVariant, fileName);
+ QFETCH(QVariant, title);
+
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "properties: [ \"fileName\", \"title\", \"turtle\" ]\n"
+ "}\n");
+
+ populateGallery();
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QCOMPARE(object->property("count"), QVariant(2));
+
+ QVariant value;
+
+ QCOMPARE(QT_GALLERY_MODEL_CALL_PROPERTY(index, "itemId"), true);
+ QCOMPARE(value, itemId);
+ QCOMPARE(QT_GALLERY_MODEL_CALL_PROPERTY(index, "itemType"), true);
+ QCOMPARE(value.toInt(), itemType.toInt());
+ QCOMPARE(QT_GALLERY_MODEL_CALL_PROPERTY(index, "fileName"), true);
+ QCOMPARE(value, fileName);
+ QCOMPARE(QT_GALLERY_MODEL_CALL_PROPERTY(index, "title"), true);
+ QCOMPARE(value, title);
+ QCOMPARE(QT_GALLERY_MODEL_CALL_PROPERTY(index, "turtle"), true);
+ QCOMPARE(value, QVariant());
+}
+
+#define QT_GALLERY_MODEL_CALL_SET_PROPERTY(index, property, value) \
+ QMetaObject::invokeMethod( \
+ object.data(), \
+ "setProperty", \
+ Q_ARG(int, index), \
+ Q_ARG(QString, QLatin1String(property)), \
+ Q_ARG(QVariant, QVariant(value)))
+
+void tst_QDeclarativeDocumentGalleryModel::setProperty()
+{
+ QFETCH(int, index);
+ QFETCH(bool, isValid);
+ QFETCH(QVariant, itemId);
+ QFETCH(QVariant, newItemId);
+ QFETCH(QVariant, itemType);
+ QFETCH(QVariant, newItemType);
+ QFETCH(QVariant, fileName);
+ QFETCH(QVariant, newFileName);
+ QFETCH(QVariant, title);
+ QFETCH(QVariant, newTitle);
+
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "properties: [ \"fileName\", \"title\", \"turtle\" ]\n"
+ "}\n");
+
+ populateGallery();
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(dataChanged(QModelIndex,QModelIndex)));
+
+ QCOMPARE(object->property("count"), QVariant(2));
+
+ QVariant value;
+
+ QCOMPARE(QT_GALLERY_MODEL_CALL_SET_PROPERTY(index, "itemId", newItemId), true);
+ QCOMPARE(QT_GALLERY_MODEL_CALL_PROPERTY(index, "itemId"), true);
+ QCOMPARE(value, itemId);
+ QCOMPARE(spy.count(), 0);
+
+ QCOMPARE(QT_GALLERY_MODEL_CALL_SET_PROPERTY(index, "itemType", newItemType), true);
+ QCOMPARE(QT_GALLERY_MODEL_CALL_PROPERTY(index, "itemType"), true);
+ QCOMPARE(value.toInt(), itemType.toInt());
+ QCOMPARE(spy.count(), 0);
+
+ QCOMPARE(QT_GALLERY_MODEL_CALL_SET_PROPERTY(index, "fileName", newFileName), true);
+ QCOMPARE(QT_GALLERY_MODEL_CALL_PROPERTY(index, "fileName"), true);
+ QCOMPARE(value, fileName);
+ QCOMPARE(spy.count(), 0);
+
+ QCOMPARE(QT_GALLERY_MODEL_CALL_SET_PROPERTY(index, "title", newTitle), true);
+ QCOMPARE(QT_GALLERY_MODEL_CALL_PROPERTY(index, "title"), true);
+ QCOMPARE(value, isValid ? newTitle : title);
+ QCOMPARE(spy.count(), isValid ? 1 : 0);
+
+ QCOMPARE(QT_GALLERY_MODEL_CALL_SET_PROPERTY(index, "turtle", QLatin1String("It's a turtle")), true);
+ QCOMPARE(QT_GALLERY_MODEL_CALL_PROPERTY(index, "turtle"), true);
+ QCOMPARE(value, QVariant());
+ QCOMPARE(spy.count(), isValid ? 1 : 0);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::get()
+{
+ QFETCH(int, index);
+ QFETCH(QVariant, itemId);
+ QFETCH(QVariant, itemType);
+ QFETCH(QVariant, fileName);
+ QFETCH(QVariant, title);
+
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "properties: [ \"fileName\", \"title\", \"turtle\" ]\n"
+ "}\n");
+
+ populateGallery();
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QCOMPARE(object->property("count"), QVariant(2));
+
+ QScriptEngine scriptEngine;
+ QScriptValue values;
+ QVERIFY(QMetaObject::invokeMethod(
+ object.data(),
+ "get",
+ Q_RETURN_ARG(QScriptValue, values),
+ Q_ARG(QScriptValue, QScriptValue(&scriptEngine, index))));
+
+ QCOMPARE(values.property(QLatin1String("itemId")).toVariant(), itemId);
+ QCOMPARE(values.property(QLatin1String("itemType")).toInt32(), itemType.toInt());
+ QCOMPARE(values.property(QLatin1String("fileName")).toVariant(), fileName);
+ QCOMPARE(values.property(QLatin1String("title")).toVariant(), title);
+ QCOMPARE(values.property(QLatin1String("turtle")).toVariant(), QVariant());
+}
+
+#define QT_GALLERY_MODEL_CALL_SET(index) \
+ QMetaObject::invokeMethod( \
+ object.data(), \
+ "setProperty", \
+ Q_ARG(int, index), \
+ Q_ARG(QString, QLatin1String(property)), \
+ Q_ARG(QVariant, QVariant(value)))
+
+void tst_QDeclarativeDocumentGalleryModel::set()
+{
+ QFETCH(int, index);
+ QFETCH(bool, isValid);
+ QFETCH(QVariant, itemId);
+ QFETCH(QVariant, newItemId);
+ QFETCH(QVariant, itemType);
+ QFETCH(QVariant, newItemType);
+ QFETCH(QVariant, fileName);
+ QFETCH(QVariant, newFileName);
+ QFETCH(QVariant, title);
+ QFETCH(QVariant, newTitle);
+
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "properties: [ \"fileName\", \"title\", \"turtle\" ]\n"
+ "}\n");
+
+ populateGallery();
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(dataChanged(QModelIndex,QModelIndex)));
+
+ QCOMPARE(object->property("count"), QVariant(2));
+
+ QScriptEngine scriptEngine;
+ QScriptValue values = scriptEngine.newObject();
+
+ values.setProperty(QLatin1String("itemId"), qScriptValueFromValue(&scriptEngine, newItemId));
+ values.setProperty(QLatin1String("itemUrl"), qScriptValueFromValue(&scriptEngine, newItemType));
+ values.setProperty(QLatin1String("fileName"), qScriptValueFromValue(&scriptEngine, newFileName));
+ values.setProperty(QLatin1String("title"), qScriptValueFromValue(&scriptEngine, newTitle));
+ values.setProperty(
+ QLatin1String("turtle"), QScriptValue(&scriptEngine, QLatin1String("It's a turtle")));
+
+ QVERIFY(QMetaObject::invokeMethod(
+ object.data(), "set", Q_ARG(int, index), Q_ARG(QScriptValue, values)));
+
+ QVERIFY(QMetaObject::invokeMethod(
+ object.data(),
+ "get",
+ Q_RETURN_ARG(QScriptValue, values),
+ Q_ARG(QScriptValue, QScriptValue(&scriptEngine, index))));
+
+ QCOMPARE(values.property(QLatin1String("itemId")).toVariant(), itemId);
+ QCOMPARE(values.property(QLatin1String("itemType")).toInt32(), itemType.toInt());
+ QCOMPARE(values.property(QLatin1String("fileName")).toVariant(), fileName);
+ QCOMPARE(values.property(QLatin1String("title")).toVariant(), isValid ? newTitle : title);
+ QCOMPARE(values.property(QLatin1String("turtle")).toVariant(), QVariant());
+
+ QCOMPARE(spy.count(), isValid ? 1 : 0);
+
+ values.setProperty(QLatin1String("itemId"), qScriptValueFromValue(&scriptEngine, itemId));
+ values.setProperty(QLatin1String("itemUrl"), qScriptValueFromValue(&scriptEngine, itemType));
+ values.setProperty(QLatin1String("fileName"), qScriptValueFromValue(&scriptEngine, fileName));
+ values.setProperty(QLatin1String("title"), qScriptValueFromValue(&scriptEngine, title));
+ values.setProperty(
+ QLatin1String("turtle"), QScriptValue(&scriptEngine, QLatin1String("It's a turtle")));
+
+ QVERIFY(QMetaObject::invokeMethod(
+ object.data(), "set", Q_ARG(int, index), Q_ARG(QScriptValue, values)));
+
+ QVERIFY(QMetaObject::invokeMethod(
+ object.data(),
+ "get",
+ Q_RETURN_ARG(QScriptValue, values),
+ Q_ARG(QScriptValue, QScriptValue(&scriptEngine, index))));
+
+ QCOMPARE(values.property(QLatin1String("itemId")).toVariant(), itemId);
+ QCOMPARE(values.property(QLatin1String("itemType")).toInt32(), itemType.toInt());
+ QCOMPARE(values.property(QLatin1String("fileName")).toVariant(), fileName);
+ QCOMPARE(values.property(QLatin1String("title")).toVariant(), title);
+ QCOMPARE(values.property(QLatin1String("turtle")).toVariant(), QVariant());
+
+ QCOMPARE(spy.count(), isValid ? 2 : 0);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::itemsInserted()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "properties: [ \"fileName\", \"title\", \"turtle\" ]\n"
+ "}\n");
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QAbstractItemModel *model = qobject_cast<QAbstractItemModel *>(object.data());
+ QVERIFY(model);
+
+ QSignalSpy countSpy(model, SIGNAL(countChanged()));
+ QSignalSpy beforeSpy(model, SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int)));
+ QSignalSpy afterSpy(model, SIGNAL(rowsInserted(QModelIndex,int,int)));
+
+ QCOMPARE(model->rowCount(), 0);
+ QCOMPARE(model->columnCount(), 1);
+
+ gallery.response()->beginInsertRows(0);
+ gallery.response()->addRow();
+ gallery.response()->addRow();
+ gallery.response()->addRow();
+ gallery.response()->endInsertRows();
+
+ QCOMPARE(model->rowCount(), 3);
+ QCOMPARE(model->property("count"), QVariant(3));
+ QCOMPARE(countSpy.count(), 1);
+ QCOMPARE(beforeSpy.count(), 1);
+ QCOMPARE(beforeSpy.last().value(1).toInt(), 0);
+ QCOMPARE(beforeSpy.last().value(2).toInt(), 2);
+ QCOMPARE(afterSpy.count(), 1);
+ QCOMPARE(afterSpy.last().value(1).toInt(), 0);
+ QCOMPARE(afterSpy.last().value(2).toInt(), 2);
+
+ gallery.response()->beginInsertRows(1);
+ gallery.response()->addRow();
+ gallery.response()->addRow();
+ gallery.response()->endInsertRows();
+
+ QCOMPARE(model->rowCount(), 5);
+ QCOMPARE(model->property("count"), QVariant(5));
+ QCOMPARE(countSpy.count(), 2);
+ QCOMPARE(beforeSpy.count(), 2);
+ QCOMPARE(beforeSpy.last().value(1).toInt(), 1);
+ QCOMPARE(beforeSpy.last().value(2).toInt(), 2);
+ QCOMPARE(afterSpy.count(), 2);
+ QCOMPARE(afterSpy.last().value(1).toInt(), 1);
+ QCOMPARE(afterSpy.last().value(2).toInt(), 2);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::itemsRemoved()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "properties: [ \"fileName\", \"title\", \"turtle\" ]\n"
+ "}\n");
+
+ gallery.addRow();
+ gallery.addRow();
+ gallery.addRow();
+ gallery.addRow();
+ gallery.addRow();
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QAbstractItemModel *model = qobject_cast<QAbstractItemModel *>(object.data());
+ QVERIFY(model);
+
+ QSignalSpy countSpy(model, SIGNAL(countChanged()));
+ QSignalSpy beforeSpy(model, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)));
+ QSignalSpy afterSpy(model, SIGNAL(rowsRemoved(QModelIndex,int,int)));
+
+ QCOMPARE(model->rowCount(), 5);
+ QCOMPARE(model->columnCount(), 1);
+ QCOMPARE(model->property("count"), QVariant(5));
+
+ gallery.response()->removeRows(1, 2);
+
+ QCOMPARE(model->rowCount(), 3);
+ QCOMPARE(model->property("count"), QVariant(3));
+ QCOMPARE(countSpy.count(), 1);
+ QCOMPARE(beforeSpy.count(), 1);
+ QCOMPARE(beforeSpy.last().value(1).toInt(), 1);
+ QCOMPARE(beforeSpy.last().value(2).toInt(), 2);
+ QCOMPARE(afterSpy.count(), 1);
+ QCOMPARE(afterSpy.last().value(1).toInt(), 1);
+ QCOMPARE(afterSpy.last().value(2).toInt(), 2);
+
+ gallery.response()->removeRows(0, 3);
+
+ QCOMPARE(model->rowCount(), 0);
+ QCOMPARE(model->property("count"), QVariant(0));
+ QCOMPARE(countSpy.count(), 2);
+ QCOMPARE(beforeSpy.count(), 2);
+ QCOMPARE(beforeSpy.last().value(1).toInt(), 0);
+ QCOMPARE(beforeSpy.last().value(2).toInt(), 2);
+ QCOMPARE(afterSpy.count(), 2);
+ QCOMPARE(afterSpy.last().value(1).toInt(), 0);
+ QCOMPARE(afterSpy.last().value(2).toInt(), 2);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::itemsMoved()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "properties: [ \"fileName\", \"title\", \"turtle\" ]\n"
+ "}\n");
+
+ gallery.addRow();
+ gallery.addRow();
+ gallery.addRow();
+ gallery.addRow();
+ gallery.addRow();
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QAbstractItemModel *model = qobject_cast<QAbstractItemModel *>(object.data());
+ QVERIFY(model);
+
+ QSignalSpy countSpy(model, SIGNAL(countChanged()));
+ QSignalSpy beforeSpy(model, SIGNAL(rowsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)));
+ QSignalSpy afterSpy(model, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)));
+
+ QCOMPARE(model->rowCount(), 5);
+ QCOMPARE(model->columnCount(), 1);
+ QCOMPARE(model->property("count"), QVariant(5));
+
+ gallery.response()->itemsMoved(0, 3, 2);
+
+ QCOMPARE(model->rowCount(), 5);
+ QCOMPARE(model->property("count"), QVariant(5));
+ QCOMPARE(countSpy.count(), 0);
+ QCOMPARE(beforeSpy.count(), 1);
+ QCOMPARE(beforeSpy.last().value(1).toInt(), 0);
+ QCOMPARE(beforeSpy.last().value(2).toInt(), 1);
+ QCOMPARE(beforeSpy.last().value(4).toInt(), 3);
+ QCOMPARE(afterSpy.count(), 1);
+ QCOMPARE(afterSpy.last().value(1).toInt(), 0);
+ QCOMPARE(afterSpy.last().value(2).toInt(), 1);
+ QCOMPARE(afterSpy.last().value(4).toInt(), 3);
+
+ gallery.response()->itemsMoved(2, 0, 3);
+
+ QCOMPARE(model->rowCount(), 5);
+ QCOMPARE(model->property("count"), QVariant(5));
+ QCOMPARE(countSpy.count(), 0);
+ QCOMPARE(beforeSpy.count(), 2);
+ QCOMPARE(beforeSpy.last().value(1).toInt(), 2);
+ QCOMPARE(beforeSpy.last().value(2).toInt(), 4);
+ QCOMPARE(beforeSpy.last().value(4).toInt(), 0);
+ QCOMPARE(afterSpy.count(), 2);
+ QCOMPARE(afterSpy.last().value(1).toInt(), 2);
+ QCOMPARE(afterSpy.last().value(2).toInt(), 4);
+ QCOMPARE(afterSpy.last().value(4).toInt(), 0);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::metaDataChanged()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {\n"
+ "properties: [ \"fileName\", \"title\", \"turtle\" ]\n"
+ "}\n");
+
+ gallery.addRow();
+ gallery.addRow();
+ gallery.addRow();
+ gallery.addRow();
+ gallery.addRow();
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QAbstractItemModel *model = qobject_cast<QAbstractItemModel *>(object.data());
+ QVERIFY(model);
+
+ QSignalSpy spy(model, SIGNAL(dataChanged(QModelIndex,QModelIndex)));
+
+ QCOMPARE(model->rowCount(), 5);
+ QCOMPARE(model->columnCount(), 1);
+
+ QList<int> keys;
+ keys.append(model->roleNames().key("fileName"));
+ keys.append(model->roleNames().key("title"));
+
+ gallery.response()->metaDataChanged(1, 1, keys);
+
+ QCOMPARE(spy.count(), 1);
+ QCOMPARE(spy.last().value(0).value<QModelIndex>(), model->index(1, 0));
+ QCOMPARE(spy.last().value(1).value<QModelIndex>(), model->index(1, 0));
+
+ gallery.response()->metaDataChanged(2, 3, QList<int>());
+
+ QCOMPARE(spy.count(), 2);
+ QCOMPARE(spy.last().value(0).value<QModelIndex>(), model->index(2, 0));
+ QCOMPARE(spy.last().value(1).value<QModelIndex>(), model->index(4, 0));
+}
+
+void tst_QDeclarativeDocumentGalleryModel::asyncResponse()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {}\n");
+
+ gallery.setState(QGalleryAbstractRequest::Active);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(statusChanged()));
+
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryQueryModel::Active));
+
+ gallery.response()->finish();
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryQueryModel::Finished));
+ QCOMPARE(spy.count(), 1);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::cancelAsyncResponse()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {}\n");
+
+ gallery.setState(QGalleryAbstractRequest::Active);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(statusChanged()));
+
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryQueryModel::Active));
+
+ QMetaObject::invokeMethod(object.data(), "cancel");
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryQueryModel::Canceled));
+ QCOMPARE(spy.count(), 1);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::cancelIdleResponse()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel { autoUpdate: true }\n");
+
+ gallery.setState(QGalleryAbstractRequest::Idle);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(statusChanged()));
+
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryQueryModel::Idle));
+
+ QMetaObject::invokeMethod(object.data(), "cancel");
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryQueryModel::Finished));
+ QCOMPARE(spy.count(), 1);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::cancelPendingResponse()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {}\n");
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(statusChanged()));
+
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryQueryModel::Finished));
+
+ object->setProperty("rootItem", 95);
+
+ QMetaObject::invokeMethod(object.data(), "cancel");
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryQueryModel::Finished));
+ QCOMPARE(spy.count(), 0);
+
+ QCoreApplication::processEvents();
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryQueryModel::Finished));
+ QCOMPARE(spy.count(), 0);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::deferExecuteCanceledResponse()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {}\n");
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(statusChanged()));
+
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryQueryModel::Finished));
+
+ object->setProperty("rootItem", 95);
+
+ QMetaObject::invokeMethod(object.data(), "cancel");
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryQueryModel::Finished));
+ QCOMPARE(spy.count(), 0);
+
+ object->setProperty("rootItem", 21);
+
+ QCoreApplication::processEvents();
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryQueryModel::Finished));
+ QCOMPARE(spy.count(), 1);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::clear()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {}\n");
+
+ gallery.addRow();
+ gallery.addRow();
+ gallery.addRow();
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy statusSpy(object.data(), SIGNAL(statusChanged()));
+ QSignalSpy removeSpy(object.data(), SIGNAL(rowsRemoved(QModelIndex,int,int)));
+
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryQueryModel::Finished));
+
+ QMetaObject::invokeMethod(object.data(), "clear");
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryQueryModel::Null));
+ QCOMPARE(statusSpy.count(), 1);
+ QCOMPARE(removeSpy.count(), 1);
+ QCOMPARE(removeSpy.last().value(1).toInt(), 0);
+ QCOMPARE(removeSpy.last().value(2).toInt(), 2);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::clearPendingResponse()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {}\n");
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(statusChanged()));
+
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryQueryModel::Finished));
+
+ object->setProperty("rootItem", 95);
+
+ QMetaObject::invokeMethod(object.data(), "clear");
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryQueryModel::Null));
+ QCOMPARE(spy.count(), 1);
+
+ QCoreApplication::processEvents();
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryQueryModel::Null));
+ QCOMPARE(spy.count(), 1);
+}
+
+void tst_QDeclarativeDocumentGalleryModel::error_data()
+{
+ QTest::addColumn<QByteArray>("qml");
+ QTest::addColumn<int>("errorCode");
+ QTest::addColumn<QString>("errorMessage");
+ QTest::addColumn<QByteArray>("expectedErrorMessage");
+
+ QTest::newRow("Specific error message")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {}\n")
+ << int(QDocumentGallery::ConnectionError)
+ << "Connection to server failed"
+ << QByteArray(
+ "<Unknown File>: QML DocumentGalleryModel: "
+ "Connection to server failed");
+
+ QTest::newRow("Generic connection Error")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {}\n")
+ << int(QDocumentGallery::ConnectionError)
+ << QString()
+ << QByteArray(
+ "<Unknown File>: QML DocumentGalleryModel: "
+ "An error was encountered connecting to the document gallery");
+
+ QTest::newRow("Generic rootType Error")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel { rootType: DocumentGallery.Video }\n")
+ << int(QDocumentGallery::ItemTypeError)
+ << QString()
+ << QByteArray(
+ "<Unknown File>: QML DocumentGalleryModel: "
+ "DocumentGallery.Video is not a supported item type");
+
+ QTest::newRow("Invalid rootType Error")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel { rootType: DocumentGallery.InvalidType }\n")
+ << int(QDocumentGallery::ItemTypeError)
+ << QString()
+ << QByteArray(
+ "<Unknown File>: QML DocumentGalleryModel: "
+ "DocumentGallery.InvalidType is not a supported item type");
+
+ QTest::newRow("Generic rootItem error")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {}\n")
+ << int(QDocumentGallery::ItemIdError)
+ << QString()
+ << QByteArray(
+ "<Unknown File>: QML DocumentGalleryModel: "
+ "The value of rootItem is not a valid item ID");
+
+ QTest::newRow("Generic filter Error")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {}\n")
+ << int(QDocumentGallery::FilterError)
+ << QString()
+ << QByteArray(
+ "<Unknown File>: QML DocumentGalleryModel: "
+ "The value of filter is unsupported");
+
+ QTest::newRow("Unhandled error code")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryModel {}\n")
+ << int(QDocumentGallery::NoGallery)
+ << QString()
+ << QByteArray();
+}
+
+void tst_QDeclarativeDocumentGalleryModel::error()
+{
+ QFETCH(QByteArray, qml);
+ QFETCH(int, errorCode);
+ QFETCH(QString, errorMessage);
+ QFETCH(QByteArray, expectedErrorMessage);
+
+ gallery.setError(errorCode, errorMessage);
+
+ if (!expectedErrorMessage.isEmpty())
+ QTest::ignoreMessage(QtWarningMsg, expectedErrorMessage.constData());
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryQueryModel::Error));
+}
+
+QTEST_MAIN(tst_QDeclarativeDocumentGalleryModel)
+
+#include "tst_qdeclarativedocumentgallerymodel.moc"
diff --git a/tests/auto/qdeclarativedocumentgallerytype/qdeclarativedocumentgallerytype.pro b/tests/auto/qdeclarativedocumentgallerytype/qdeclarativedocumentgallerytype.pro
new file mode 100644
index 0000000..362e817
--- /dev/null
+++ b/tests/auto/qdeclarativedocumentgallerytype/qdeclarativedocumentgallerytype.pro
@@ -0,0 +1,7 @@
+include(../auto.pri)
+
+QT += declarative
+
+INCLUDEPATH += ../../../src/imports/gallery/
+
+SOURCES += tst_qdeclarativedocumentgallerytype.cpp
diff --git a/tests/auto/qdeclarativedocumentgallerytype/tst_qdeclarativedocumentgallerytype.cpp b/tests/auto/qdeclarativedocumentgallerytype/tst_qdeclarativedocumentgallerytype.cpp
new file mode 100644
index 0000000..04e14c5
--- /dev/null
+++ b/tests/auto/qdeclarativedocumentgallerytype/tst_qdeclarativedocumentgallerytype.cpp
@@ -0,0 +1,1003 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDocGallery module 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$
+**
+****************************************************************************/
+
+//TESTED_COMPONENT=src/gallery
+
+#include <qdocumentgallery.h>
+#include <qgalleryresultset.h>
+#include <qgallerytyperequest.h>
+
+#include <QtDeclarative/qdeclarativecomponent.h>
+#include <QtDeclarative/qdeclarativecontext.h>
+#include <QtDeclarative/qdeclarativeengine.h>
+
+#include <qdeclarativedocumentgallery.h>
+#include <qdeclarativegallerytype.h>
+
+#include <QtTest/QtTest>
+
+class QtGalleryTestResponse : public QGalleryResultSet
+{
+ Q_OBJECT
+public:
+ QtGalleryTestResponse(
+ const QStringList &propertyNames,
+ const QHash<QString, QVariant> &metaData,
+ int count,
+ QGalleryAbstractRequest::State state,
+ int error,
+ const QString &errorString)
+ : m_count(count)
+ , m_currentIndex(-1)
+ , m_propertyNames(propertyNames)
+ {
+ typedef QHash<QString, QVariant>::const_iterator iterator;
+ for (iterator it = metaData.begin(), end = metaData.end(); it != end; ++it) {
+ int propertyKey = m_propertyNames.indexOf(it.key());
+
+ if (propertyKey >= 0)
+ m_metaData.insert(propertyKey, it.value());
+ }
+
+ if (error != QGalleryAbstractRequest::NoError)
+ QGalleryAbstractResponse::error(error, errorString);
+ else if (state == QGalleryAbstractRequest::Finished)
+ finish();
+ else if (state == QGalleryAbstractRequest::Idle)
+ finish(true);
+ }
+
+ int propertyKey(const QString &propertyName) const {
+ return m_propertyNames.indexOf(propertyName); }
+ QGalleryProperty::Attributes propertyAttributes(int) const {
+ return QGalleryProperty::CanRead | QGalleryProperty::CanWrite; }
+ QVariant::Type propertyType(int key) const {
+ return key >= 0 ? QVariant::Int : QVariant::Invalid; }
+
+ int itemCount() const { return m_count; }
+
+ int currentIndex() const { return m_currentIndex; }
+
+ bool fetch(int index)
+ {
+ emit currentIndexChanged(m_currentIndex = index);
+ emit currentItemChanged();
+
+ return isValid();
+ }
+
+ QVariant itemId() const { return QVariant(); }
+ QUrl itemUrl() const { return QUrl(); }
+ QString itemType() const { return QString(); }
+
+ QVariant metaData(int key) const { return isValid() ? m_metaData.value(key) : QVariant(); }
+ bool setMetaData(int key, const QVariant &value)
+ {
+ if (isValid()) {
+ m_metaData.insert(key, value);
+ emit metaDataChanged(m_currentIndex, 1, QList<int>() << key);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ void setCount(int count)
+ {
+ qSwap(m_count, count);
+
+ if (m_count == 0) {
+ m_currentIndex = -1;
+
+ emit itemsRemoved(0, count);
+ } else if (count == 0) {
+ emit itemsInserted(0, count);
+ }
+ }
+
+ using QGalleryResultSet::finish;
+ using QGalleryResultSet::resume;
+ using QGalleryResultSet::itemsInserted;
+ using QGalleryResultSet::itemsRemoved;
+ using QGalleryResultSet::itemsMoved;
+ using QGalleryResultSet::metaDataChanged;
+ using QGalleryResultSet::progressChanged;
+
+private:
+ int m_count;
+ int m_currentIndex;
+ QStringList m_propertyNames;
+ QHash<int, QVariant> m_metaData;
+};
+
+class QtTestGallery : public QAbstractGallery
+{
+public:
+ QtTestGallery()
+ : m_count(0)
+ , m_state(QGalleryAbstractRequest::Finished)
+ , m_error(QGalleryAbstractRequest::NoError)
+ {}
+
+ bool isRequestSupported(QGalleryAbstractRequest::RequestType type) const {
+ return type == QGalleryAbstractRequest::TypeRequest; }
+
+ void setState(QGalleryAbstractRequest::State state) { m_state = state; }
+ void setError(int error, const QString &errorString) {
+ m_error = error; m_errorString = errorString; }
+
+ void setCount(int count) { m_count = count; }
+
+ void setBlackList(const QStringList &propertyNames) { m_blacklist = propertyNames; }
+ void setMetaData(const QHash<QString, QVariant> &metaData) { m_metaData = metaData; }
+
+ QGalleryTypeRequest *request() const { return m_request.data(); }
+ QtGalleryTestResponse *response() const { return m_response.data(); }
+
+ void reset()
+ {
+ m_count = 0;
+ m_state = QGalleryAbstractRequest::Finished;
+ m_error = QGalleryTypeRequest::NoError;
+ m_metaData.clear();
+ m_blacklist.clear();
+ }
+
+protected:
+ QGalleryAbstractResponse *createResponse(QGalleryAbstractRequest *request)
+ {
+ if ((m_request = qobject_cast<QGalleryTypeRequest *>(request))) {
+ QStringList propertyNames = m_request.data()->propertyNames();
+ foreach (QString propertyName, m_blacklist)
+ propertyNames.removeAll(propertyName);
+
+ m_response = new QtGalleryTestResponse(
+ propertyNames,
+ m_metaData,
+ m_count,
+ m_state,
+ m_error,
+ m_errorString);
+ } else {
+ m_response.clear();
+ }
+ return m_response.data();
+ }
+
+private:
+ int m_count;
+ QGalleryAbstractRequest::State m_state;
+ int m_error;
+ QString m_errorString;
+ QHash<QString, QVariant> m_metaData;
+ QStringList m_blacklist;
+ QWeakPointer<QGalleryTypeRequest> m_request;
+ QWeakPointer<QtGalleryTestResponse> m_response;
+};
+
+class tst_QDeclarativeDocumentGalleryType : public QObject
+{
+ Q_OBJECT
+public Q_SLOTS:
+ void initTestCase();
+ void cleanup();
+
+private Q_SLOTS:
+ void itemType_data();
+ void itemType();
+ void properties_data();
+ void properties();
+ void autoUpdate_data();
+ void autoUpdate();
+ void disableAutoUpdateFinished();
+ void disableAutoUpdateIdle();
+ void disableAutoUpdateActive();
+ void asyncResponse();
+ void cancelAsyncResponse();
+ void cancelIdleResponse();
+ void cancelPendingResponse();
+ void deferExecuteCanceledResponse();
+ void clear();
+ void clearPendingResponse();
+ void error_data();
+ void error();
+ void progress_data();
+ void progress();
+ void available();
+ void metaData();
+
+private:
+ QtTestGallery gallery;
+ QDeclarativeEngine engine;
+};
+
+void tst_QDeclarativeDocumentGalleryType::initTestCase()
+{
+ engine.rootContext()->setContextProperty(QLatin1String("qt_testGallery"), &gallery);
+}
+
+void tst_QDeclarativeDocumentGalleryType::cleanup()
+{
+ gallery.reset();
+}
+
+void tst_QDeclarativeDocumentGalleryType::itemType_data()
+{
+ QTest::addColumn<QByteArray>("qml");
+ QTest::addColumn<int>("qmlItemType");
+ QTest::addColumn<QString>("qmlItemTypeString");
+ QTest::addColumn<int>("itemType");
+ QTest::addColumn<int>("expectedItemType");
+ QTest::addColumn<QString>("itemTypeString");
+
+ QTest::newRow("Null -> Audio")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryType {}\n")
+ << int(QDeclarativeDocumentGallery::InvalidType)
+ << QString()
+ << int(QDeclarativeDocumentGallery::Audio)
+ << int(QDeclarativeDocumentGallery::Audio)
+ << "Audio";
+
+ QTest::newRow("Audio -> Audio")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryType { itemType: DocumentGallery.Audio }\n")
+ << int(QDeclarativeDocumentGallery::Audio)
+ << "Audio"
+ << int(QDeclarativeDocumentGallery::Audio)
+ << int(QDeclarativeDocumentGallery::Audio)
+ << "Audio";
+
+ QTest::newRow("Audio -> PhotoAlbum")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryType { itemType: DocumentGallery.Audio }\n")
+ << int(QDeclarativeDocumentGallery::Audio)
+ << "Audio"
+ << int(QDeclarativeDocumentGallery::PhotoAlbum)
+ << int(QDeclarativeDocumentGallery::PhotoAlbum)
+ << "PhotoAlbum";
+
+ QTest::newRow("PhotoAlbum -> Null")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryType { itemType: DocumentGallery.PhotoAlbum }\n")
+ << int(QDeclarativeDocumentGallery::PhotoAlbum)
+ << "PhotoAlbum"
+ << int(QDeclarativeDocumentGallery::InvalidType)
+ << int(QDeclarativeDocumentGallery::InvalidType)
+ << QString();
+
+ QTest::newRow("PhotoAlbum -> Undefined Type")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryType { itemType: DocumentGallery.PhotoAlbum }\n")
+ << int(QDeclarativeDocumentGallery::PhotoAlbum)
+ << "PhotoAlbum"
+ << int(300)
+ << int(QDeclarativeDocumentGallery::InvalidType)
+ << QString();
+}
+
+void tst_QDeclarativeDocumentGalleryType::itemType()
+{
+ QFETCH(QByteArray, qml);
+ QFETCH(int, qmlItemType);
+ QFETCH(QString, qmlItemTypeString);
+ QFETCH(int, itemType);
+ QFETCH(int, expectedItemType);
+ QFETCH(QString, itemTypeString);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+
+ QSignalSpy spy(object.data(), SIGNAL(itemTypeChanged()));
+
+ if (qmlItemType != QDeclarativeDocumentGallery::InvalidType) {
+ QVERIFY(gallery.request());
+ QCOMPARE(gallery.request()->itemType(), qmlItemTypeString);
+ } else {
+ QVERIFY(!gallery.request());
+ }
+
+ QCOMPARE(object->property("itemType"), QVariant(qmlItemType));
+
+ QCOMPARE(object->setProperty("itemType", itemType), true);
+ QCOMPARE(object->property("itemType"), QVariant(expectedItemType));
+ QCOMPARE(spy.count(), itemType != qmlItemType ? 1 : 0);
+
+ QMetaObject::invokeMethod(object.data(), "reload");
+
+ if (expectedItemType != QDeclarativeDocumentGallery::InvalidType) {
+ QVERIFY(gallery.request());
+ QCOMPARE(gallery.request()->itemType(), itemTypeString);
+ }
+}
+
+void tst_QDeclarativeDocumentGalleryType::properties_data()
+{
+ QTest::addColumn<QByteArray>("qml");
+ QTest::addColumn<QStringList>("qmlPropertyNames");
+ QTest::addColumn<QStringList>("propertyNames");
+
+ QTest::newRow("[] -> [ title, fileName ]")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryType {\n"
+ "itemType: DocumentGallery.File\n"
+ "}\n")
+ << QStringList()
+ << (QStringList() << QLatin1String("title") << QLatin1String("fileName"));
+
+ QTest::newRow("[ title, fileName ] -> [ title, fileName ]")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryType {\n"
+ "itemType: DocumentGallery.File\n"
+ "properties: [ \"title\", \"fileName\" ]"
+ "}\n")
+ << (QStringList() << QLatin1String("title") << QLatin1String("fileName"))
+ << (QStringList() << QLatin1String("title") << QLatin1String("fileName"));
+
+ QTest::newRow("[ title, fileName ] -> [ count ]")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryType {\n"
+ "itemType: DocumentGallery.File\n"
+ "properties: [ \"title\", \"fileName\" ]"
+ "}\n")
+ << (QStringList() << QLatin1String("title") << QLatin1String("fileName"))
+ << (QStringList() << QLatin1String("count"));
+}
+
+void tst_QDeclarativeDocumentGalleryType::properties()
+{
+ QFETCH(QByteArray, qml);
+ QFETCH(QStringList, qmlPropertyNames);
+ QFETCH(QStringList, propertyNames);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+
+ QSignalSpy spy(object.data(), SIGNAL(itemTypeChanged()));
+
+ QCOMPARE(gallery.request()->propertyNames(), qmlPropertyNames);
+ QCOMPARE(object->property("properties"), QVariant(qmlPropertyNames));
+
+ QCOMPARE(object->setProperty("properties", propertyNames), true);
+ QCOMPARE(object->property("properties"), QVariant(qmlPropertyNames));
+ QCOMPARE(spy.count(), 0);
+
+ QMetaObject::invokeMethod(object.data(), "reload");
+ QVERIFY(gallery.request());
+ QCOMPARE(gallery.request()->propertyNames(), qmlPropertyNames);
+
+}
+
+void tst_QDeclarativeDocumentGalleryType::autoUpdate_data()
+{
+ QTest::addColumn<QByteArray>("qml");
+ QTest::addColumn<bool>("qmlAutoUpdate");
+ QTest::addColumn<bool>("autoUpdate");
+
+ QTest::newRow("Default -> true")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryType {\n"
+ "itemType: DocumentGallery.File\n"
+ "}\n")
+ << false
+ << true;
+
+ QTest::newRow("true -> false")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryType {\n"
+ "itemType: DocumentGallery.File\n"
+ "autoUpdate: true\n"
+ "}\n")
+ << true
+ << false;
+
+ QTest::newRow("false -> true")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryType {\n"
+ "itemType: DocumentGallery.File\n"
+ "autoUpdate: false\n"
+ "}\n")
+ << false
+ << true;
+
+ QTest::newRow("true -> true")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryType {\n"
+ "itemType: DocumentGallery.File\n"
+ "autoUpdate: true\n"
+ "}\n")
+ << true
+ << true;
+
+ QTest::newRow("false -> false")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryType {\n"
+ "itemType: DocumentGallery.File\n"
+ "autoUpdate: false\n"
+ "}\n")
+ << false
+ << false;
+}
+
+void tst_QDeclarativeDocumentGalleryType::autoUpdate()
+{
+ QFETCH(QByteArray, qml);
+ QFETCH(bool, qmlAutoUpdate);
+ QFETCH(bool, autoUpdate);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(autoUpdateChanged()));
+
+ QCOMPARE(object->property("autoUpdate"), QVariant(qmlAutoUpdate));
+ QCOMPARE(gallery.request()->autoUpdate(), qmlAutoUpdate);
+
+ object->setProperty("autoUpdate", autoUpdate);
+ QCOMPARE(object->property("autoUpdate"), QVariant(autoUpdate));
+ QCOMPARE(spy.count(), qmlAutoUpdate != autoUpdate ? 1 : 0);
+
+ QMetaObject::invokeMethod(object.data(), "reload");
+ QCOMPARE(gallery.request()->autoUpdate(), autoUpdate);
+}
+
+void tst_QDeclarativeDocumentGalleryType::disableAutoUpdateFinished()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryType {\n"
+ "itemType: DocumentGallery.File\n"
+ "autoUpdate: true\n"
+ "}\n");
+
+ gallery.setState(QGalleryAbstractRequest::Finished);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+
+ QSignalSpy spy(object.data(), SIGNAL(statusChanged()));
+
+ QCOMPARE(object->property("autoUpdate"), QVariant(true));
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryType::Finished));
+
+ object->setProperty("autoUpdate", false);
+ QCOMPARE(object->property("autoUpdate"), QVariant(false));
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryType::Finished));
+ QCOMPARE(spy.count(), 0);
+}
+
+void tst_QDeclarativeDocumentGalleryType::disableAutoUpdateIdle()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryType {\n"
+ "itemType: DocumentGallery.File\n"
+ "autoUpdate: true\n"
+ "}\n");
+
+ gallery.setState(QGalleryAbstractRequest::Idle);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+
+ QSignalSpy spy(object.data(), SIGNAL(statusChanged()));
+
+ QCOMPARE(object->property("autoUpdate"), QVariant(true));
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryType::Idle));
+
+ object->setProperty("autoUpdate", false);
+ QCOMPARE(object->property("autoUpdate"), QVariant(false));
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryType::Finished));
+ QCOMPARE(spy.count(), 1);
+}
+
+void tst_QDeclarativeDocumentGalleryType::disableAutoUpdateActive()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryType {\n"
+ "itemType: DocumentGallery.File\n"
+ "autoUpdate: true\n"
+ "}\n");
+
+ gallery.setState(QGalleryAbstractRequest::Active);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+
+ QSignalSpy spy(object.data(), SIGNAL(statusChanged()));
+
+ QCOMPARE(object->property("autoUpdate"), QVariant(true));
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryType::Active));
+
+ object->setProperty("autoUpdate", false);
+ QCOMPARE(object->property("autoUpdate"), QVariant(false));
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryType::Active));
+ QCOMPARE(spy.count(), 0);
+
+ QVERIFY(gallery.response());
+ gallery.response()->finish(true);
+ QCOMPARE(object->property("autoUpdate"), QVariant(false));
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryType::Finished));
+ QCOMPARE(spy.count(), 1);
+}
+
+void tst_QDeclarativeDocumentGalleryType::asyncResponse()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryType { itemType: DocumentGallery.File }\n");
+
+ gallery.setState(QGalleryAbstractRequest::Active);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(statusChanged()));
+
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryType::Active));
+
+ gallery.response()->finish();
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryType::Finished));
+ QCOMPARE(spy.count(), 1);
+}
+
+void tst_QDeclarativeDocumentGalleryType::cancelAsyncResponse()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryType { itemType: DocumentGallery.File }\n");
+
+ gallery.setState(QGalleryAbstractRequest::Active);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(statusChanged()));
+
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryType::Active));
+
+ QMetaObject::invokeMethod(object.data(), "cancel");
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryType::Canceled));
+ QCOMPARE(spy.count(), 1);
+}
+
+void tst_QDeclarativeDocumentGalleryType::cancelIdleResponse()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryType { itemType: DocumentGallery.File; autoUpdate: true }\n");
+
+ gallery.setState(QGalleryAbstractRequest::Idle);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(statusChanged()));
+
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryType::Idle));
+
+ QMetaObject::invokeMethod(object.data(), "cancel");
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryType::Finished));
+ QCOMPARE(spy.count(), 1);
+}
+
+void tst_QDeclarativeDocumentGalleryType::cancelPendingResponse()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryType { itemType: DocumentGallery.File }\n");
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(statusChanged()));
+
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryType::Finished));
+
+ object->setProperty("autoUpdate", true);
+
+ QMetaObject::invokeMethod(object.data(), "cancel");
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryType::Finished));
+ QCOMPARE(spy.count(), 0);
+
+ QCoreApplication::processEvents();
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryType::Finished));
+ QCOMPARE(spy.count(), 0);
+}
+
+void tst_QDeclarativeDocumentGalleryType::deferExecuteCanceledResponse()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryType { itemType: DocumentGallery.File }\n");
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(statusChanged()));
+
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryType::Finished));
+
+ object->setProperty("autoUpdate", true);
+
+ QMetaObject::invokeMethod(object.data(), "cancel");
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryType::Finished));
+ QCOMPARE(spy.count(), 0);
+
+ object->setProperty("autoUpdate", false);
+ object->setProperty("autoUpdate", true);
+
+ QCoreApplication::processEvents();
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryType::Finished));
+ QCOMPARE(spy.count(), 1);
+}
+
+void tst_QDeclarativeDocumentGalleryType::clear()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryType { itemType: DocumentGallery.File }\n");
+
+ gallery.setCount(1);
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy statusSpy(object.data(), SIGNAL(statusChanged()));
+ QSignalSpy availableSpy(object.data(), SIGNAL(availableChanged()));
+
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryType::Finished));
+
+ QMetaObject::invokeMethod(object.data(), "clear");
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryType::Null));
+ QCOMPARE(object->property("available"), QVariant(false));
+ QCOMPARE(statusSpy.count(), 1);
+ QCOMPARE(availableSpy.count(), 1);
+}
+
+void tst_QDeclarativeDocumentGalleryType::clearPendingResponse()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryType { itemType: DocumentGallery.File }\n");
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(statusChanged()));
+
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryType::Finished));
+
+ object->setProperty("autoUpdate", true);
+
+ QMetaObject::invokeMethod(object.data(), "clear");
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryType::Null));
+ QCOMPARE(spy.count(), 1);
+
+ QCoreApplication::processEvents();
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryType::Null));
+ QCOMPARE(spy.count(), 1);
+}
+
+void tst_QDeclarativeDocumentGalleryType::error_data()
+{
+ QTest::addColumn<QByteArray>("qml");
+ QTest::addColumn<int>("errorCode");
+ QTest::addColumn<QString>("errorMessage");
+ QTest::addColumn<QByteArray>("expectedErrorMessage");
+
+ QTest::newRow("Specific error message")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryType { itemType: DocumentGallery.File }\n")
+ << int(QDocumentGallery::ConnectionError)
+ << "Connection to server failed"
+ << QByteArray(
+ "<Unknown File>: QML DocumentGalleryType: "
+ "Connection to server failed");
+
+ QTest::newRow("Generic connection Error")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryType { itemType: DocumentGallery.File }\n")
+ << int(QDocumentGallery::ConnectionError)
+ << QString()
+ << QByteArray(
+ "<Unknown File>: QML DocumentGalleryType: "
+ "An error was encountered connecting to the document gallery");
+
+ QTest::newRow("Generic itemType Error")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryType { itemType: DocumentGallery.File }\n")
+ << int(QDocumentGallery::ItemTypeError)
+ << QString()
+ << QByteArray(
+ "<Unknown File>: QML DocumentGalleryType: "
+ "DocumentGallery.File is not a supported item type");
+
+ QTest::newRow("Unhandled error code")
+ << QByteArray(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryType { itemType: DocumentGallery.File }\n")
+ << int(QDocumentGallery::NoGallery)
+ << QString()
+ << QByteArray();
+}
+
+void tst_QDeclarativeDocumentGalleryType::error()
+{
+ QFETCH(QByteArray, qml);
+ QFETCH(int, errorCode);
+ QFETCH(QString, errorMessage);
+ QFETCH(QByteArray, expectedErrorMessage);
+
+ gallery.setError(errorCode, errorMessage);
+
+ if (!expectedErrorMessage.isEmpty())
+ QTest::ignoreMessage(QtWarningMsg, expectedErrorMessage.constData());
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+
+ QCOMPARE(object->property("status"), QVariant(QDeclarativeGalleryType::Error));
+}
+
+void tst_QDeclarativeDocumentGalleryType::progress_data()
+{
+ QTest::addColumn<int>("currentProgress");
+ QTest::addColumn<int>("maximumProgress");
+ QTest::addColumn<qreal>("normalizedProgress");
+
+ QTest::newRow("25%")
+ << 25
+ << 100
+ << qreal(0.25);
+
+ QTest::newRow("50%")
+ << 3
+ << 6
+ << qreal(0.5);
+
+ QTest::newRow("75%")
+ << 60
+ << 80
+ << qreal(0.75);
+
+ QTest::newRow("100%")
+ << 32
+ << 32
+ << qreal(1.0);
+}
+
+void tst_QDeclarativeDocumentGalleryType::progress()
+{
+ QFETCH(int, currentProgress);
+ QFETCH(int, maximumProgress);
+ QFETCH(qreal, normalizedProgress);
+
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryType { itemType: DocumentGallery.File }\n");
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+
+ QSignalSpy spy(object.data(), SIGNAL(progressChanged()));
+
+ QCOMPARE(object->property("progress"), QVariant(qreal(0.0)));
+
+ gallery.response()->progressChanged(currentProgress, maximumProgress);
+ QCOMPARE(object->property("progress"), QVariant(normalizedProgress));
+ QCOMPARE(spy.count(), 1);
+}
+
+void tst_QDeclarativeDocumentGalleryType::available()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryType { itemType: DocumentGallery.File }\n");
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.request());
+ QVERIFY(gallery.response());
+ QCOMPARE(object->property("available"), QVariant(false));
+
+ QSignalSpy spy(object.data(), SIGNAL(availableChanged()));
+
+ gallery.response()->setCount(1);
+ QCOMPARE(spy.count(), 1);
+ QCOMPARE(object->property("available"), QVariant(true));
+
+ gallery.response()->setCount(0);
+ QCOMPARE(spy.count(), 2);
+ QCOMPARE(object->property("available"), QVariant(false));
+}
+
+void tst_QDeclarativeDocumentGalleryType::metaData()
+{
+ const QByteArray qml(
+ "import QtMobility.gallery 1.1\n"
+ "DocumentGalleryType {\n"
+ "itemType: DocumentGallery.Audio\n"
+ "properties: [ \"count\", \"duration\", \"turtle\" ]\n"
+ "}\n");
+
+ {
+ QHash<QString, QVariant> metaData;
+ metaData.insert(QLatin1String("count"), 20);
+ gallery.setMetaData(metaData);
+ gallery.setBlackList(QStringList() << QLatin1String("turtle"));
+ }
+
+ QDeclarativeComponent component(&engine);
+ component.setData(qml, QUrl());
+
+ QScopedPointer<QObject> object(component.create());
+ QVERIFY(object);
+ QVERIFY(gallery.response());
+
+ QObject *metaData = object->property("metaData").value<QObject *>();
+ QVERIFY(metaData);
+ QCOMPARE(metaData->property("count"), QVariant());
+ QCOMPARE(metaData->property("duration"), QVariant());
+ QCOMPARE(metaData->property("turtle"), QVariant());
+
+ gallery.response()->setCount(1);
+ QCOMPARE(metaData->property("count"), QVariant(20));
+ QCOMPARE(metaData->property("duration"), QVariant(QVariant::Int));
+ QCOMPARE(metaData->property("turtle"), QVariant());
+
+ {
+ QHash<QString, QVariant> metaData;
+ metaData.insert(QLatin1String("duration"), 12000);
+ gallery.setMetaData(metaData);
+ gallery.setCount(1);
+ }
+
+ gallery.setBlackList(QStringList() << QLatin1String("turtle") << QLatin1String("count"));
+ QMetaObject::invokeMethod(object.data(), "reload");
+
+ QCOMPARE(metaData->property("count"), QVariant());
+ QCOMPARE(metaData->property("duration"), QVariant(12000));
+ QCOMPARE(metaData->property("turtle"), QVariant());
+
+ QVERIFY(gallery.response());
+ const int durationKey = gallery.response()->propertyKey(QLatin1String("duration"));
+ QVERIFY(durationKey >= 0);
+
+ metaData->setProperty("duration", 30);
+ QCOMPARE(gallery.response()->metaData(durationKey), QVariant(12000));
+
+ gallery.response()->setMetaData(durationKey, 30);
+ QCOMPARE(metaData->property("duration"), QVariant(30));
+
+ gallery.response()->setCount(0);
+ QCOMPARE(metaData->property("count"), QVariant());
+ QCOMPARE(metaData->property("duration"), QVariant());
+ QCOMPARE(metaData->property("turtle"), QVariant());
+}
+
+QTEST_MAIN(tst_QDeclarativeDocumentGalleryType)
+
+#include "tst_qdeclarativedocumentgallerytype.moc"
diff --git a/tests/auto/qdocumentgallery/qdocumentgallery.pro b/tests/auto/qdocumentgallery/qdocumentgallery.pro
new file mode 100644
index 0000000..88ce357
--- /dev/null
+++ b/tests/auto/qdocumentgallery/qdocumentgallery.pro
@@ -0,0 +1,5 @@
+include(../auto.pri)
+
+SOURCES += tst_qdocumentgallery.cpp
+
+symbian: TARGET.CAPABILITY = ReadDeviceData ReadUserData WriteDeviceData
diff --git a/tests/auto/qdocumentgallery/tst_qdocumentgallery.cpp b/tests/auto/qdocumentgallery/tst_qdocumentgallery.cpp
new file mode 100644
index 0000000..08c7b0f
--- /dev/null
+++ b/tests/auto/qdocumentgallery/tst_qdocumentgallery.cpp
@@ -0,0 +1,332 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDocGallery module 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$
+**
+****************************************************************************/
+
+//TESTED_COMPONENT=src/gallery
+
+#include <qdocumentgallery.h>
+
+#include <QtTest/QtTest>
+
+Q_DECLARE_METATYPE(QGalleryProperty::Attributes)
+
+class tst_QDocumentGallery : public QObject
+{
+ Q_OBJECT
+private Q_SLOTS:
+ void isRequestSupported();
+ void itemTypeProperties_data();
+ void itemTypeProperties();
+ void propertyAttributes_data();
+ void propertyAttributes();
+
+private:
+ QDocumentGallery gallery;
+};
+
+void tst_QDocumentGallery::isRequestSupported()
+{
+#if defined(Q_OS_UNIX) && !defined(QT_NO_DBUS) || defined (Q_OS_SYMBIAN)
+ const bool platformSupported = true;
+#else
+ const bool platformSupported = false;
+#endif
+
+ QCOMPARE(gallery.isRequestSupported(QGalleryAbstractRequest::QueryRequest), platformSupported);
+ QCOMPARE(gallery.isRequestSupported(QGalleryAbstractRequest::ItemRequest), platformSupported);
+ QCOMPARE(gallery.isRequestSupported(QGalleryAbstractRequest::TypeRequest), platformSupported);
+ QCOMPARE(gallery.isRequestSupported(QGalleryAbstractRequest::RequestType(1000)), false);
+}
+
+void tst_QDocumentGallery::itemTypeProperties_data()
+{
+ QTest::addColumn<QString>("itemType");
+ QTest::addColumn<QStringList>("propertyNames");
+
+ QTest::newRow("null item type") << QString() << QStringList();
+ QTest::newRow("non-existent item type") << QString::fromLatin1("Hello") << QStringList();
+
+ const QStringList fileProperties = QStringList()
+#if defined(Q_WS_MAEMO_6)
+ << QDocumentGallery::author
+ << QDocumentGallery::comments
+ << QDocumentGallery::copyright
+ << QDocumentGallery::description
+ << QDocumentGallery::fileExtension
+ << QDocumentGallery::fileName
+ << QDocumentGallery::filePath
+ << QDocumentGallery::fileSize
+ << QDocumentGallery::keywords
+ << QDocumentGallery::language
+ << QDocumentGallery::lastAccessed
+ << QDocumentGallery::lastModified
+ << QDocumentGallery::mimeType
+ << QDocumentGallery::path
+ << QDocumentGallery::rating
+ << QDocumentGallery::subject
+ << QDocumentGallery::title
+ << QDocumentGallery::url;
+#elif defined(Q_OS_UNIX) && !defined(QT_NO_DBUS)
+ << QDocumentGallery::copyright
+ << QDocumentGallery::fileName
+ << QDocumentGallery::path
+ << QDocumentGallery::filePath
+ << QDocumentGallery::url
+ << QDocumentGallery::fileSize
+ << QDocumentGallery::language
+ << QDocumentGallery::lastAccessed
+ << QDocumentGallery::lastModified
+ << QDocumentGallery::mimeType;
+#elif defined (Q_OS_SYMBIAN)
+ << QDocumentGallery::url
+ << QDocumentGallery::fileName
+ << QDocumentGallery::filePath
+ << QDocumentGallery::fileSize
+ << QDocumentGallery::lastModified
+ << QDocumentGallery::title
+ << QDocumentGallery::mimeType
+ << QDocumentGallery::author
+ << QDocumentGallery::copyright
+ << QDocumentGallery::description
+ << QDocumentGallery::comments
+ << QDocumentGallery::rating
+#endif
+ ;
+ QTest::newRow("File") << QString(QDocumentGallery::File) << (QStringList(fileProperties)
+#if !defined(Q_WS_MAEMO_6) && defined(Q_OS_UNIX) && !defined(QT_NO_DBUS)
+ << QDocumentGallery::author
+ << QDocumentGallery::description
+ << QDocumentGallery::keywords
+ << QDocumentGallery::rating
+ << QDocumentGallery::subject
+ << QDocumentGallery::title
+#endif
+ );
+
+ QTest::newRow("Audio") << QString(QDocumentGallery::Audio) << (QStringList(fileProperties)
+#if defined(Q_OS_UNIX) && !defined(QT_NO_DBUS)
+ << QDocumentGallery::albumArtist
+ << QDocumentGallery::albumTitle
+ << QDocumentGallery::artist
+ << QDocumentGallery::audioBitRate
+ << QDocumentGallery::audioCodec
+ << QDocumentGallery::channelCount
+ << QDocumentGallery::discNumber
+ << QDocumentGallery::duration
+ << QDocumentGallery::genre
+ << QDocumentGallery::lastPlayed
+ << QDocumentGallery::lyrics
+ << QDocumentGallery::playCount
+ << QDocumentGallery::sampleRate
+ << QDocumentGallery::trackNumber
+ << QDocumentGallery::performer
+#if defined(Q_WS_MAEMO_6)
+ << QDocumentGallery::composer
+#else
+ << QDocumentGallery::description
+ << QDocumentGallery::title
+#endif
+#elif defined (Q_OS_SYMBIAN)
+ << QDocumentGallery::duration
+ << QDocumentGallery::performer
+ << QDocumentGallery::audioCodec
+ << QDocumentGallery::audioBitRate
+ << QDocumentGallery::playCount
+ << QDocumentGallery::sampleRate
+ << QDocumentGallery::albumTitle
+ << QDocumentGallery::trackNumber
+ << QDocumentGallery::albumArtist
+ << QDocumentGallery::artist
+ << QDocumentGallery::composer
+ << QDocumentGallery::genre
+#endif
+ );
+
+ QTest::newRow("Album") << QString(QDocumentGallery::Album) << (QStringList()
+#if defined(Q_OS_UNIX) && !defined(QT_NO_DBUS)
+ << QDocumentGallery::albumArtist
+ << QDocumentGallery::albumTitle
+ << QDocumentGallery::artist
+ << QDocumentGallery::duration
+ << QDocumentGallery::title
+ << QDocumentGallery::trackCount
+#endif
+ );
+ QTest::newRow("PhotoAlbum") << QString(QDocumentGallery::PhotoAlbum) << (QStringList()
+#if defined(Q_OS_UNIX) && !defined(QT_NO_DBUS)
+ << QDocumentGallery::count
+ << QDocumentGallery::title
+#elif defined (Q_OS_SYMBIAN)
+ << QDocumentGallery::url
+ << QDocumentGallery::title
+#endif
+ );
+
+#if defined (Q_OS_SYMBIAN)
+ QTest::newRow("Image") << QString(QDocumentGallery::Image) << (QStringList(fileProperties)
+ << QDocumentGallery::width
+ << QDocumentGallery::height
+ << QDocumentGallery::orientation
+ << QDocumentGallery::dateTaken
+ << QDocumentGallery::cameraManufacturer
+ << QDocumentGallery::cameraModel
+ << QDocumentGallery::exposureProgram
+ << QDocumentGallery::exposureTime
+ << QDocumentGallery::fNumber
+ << QDocumentGallery::flashEnabled
+ << QDocumentGallery::focalLength
+ << QDocumentGallery::meteringMode
+ << QDocumentGallery::whiteBalance
+ );
+ QTest::newRow("Video") << QString(QDocumentGallery::Video) << (QStringList(fileProperties)
+ << QDocumentGallery::duration
+ << QDocumentGallery::performer
+ << QDocumentGallery::videoBitRate
+ << QDocumentGallery::playCount
+ << QDocumentGallery::width
+ << QDocumentGallery::height
+ << QDocumentGallery::language
+ << QDocumentGallery::frameRate
+ << QDocumentGallery::resumePosition
+ );
+#endif
+
+}
+
+void tst_QDocumentGallery::itemTypeProperties()
+{
+ QFETCH(QString, itemType);
+ QFETCH(QStringList, propertyNames);
+
+ QStringList galleryPropertyNames = gallery.itemTypePropertyNames(itemType);
+ propertyNames.sort();
+ galleryPropertyNames.sort();
+
+ QCOMPARE(galleryPropertyNames, propertyNames);
+}
+
+void tst_QDocumentGallery::propertyAttributes_data()
+{
+ QTest::addColumn<QString>("itemType");
+ QTest::addColumn<QString>("propertyName");
+ QTest::addColumn<QGalleryProperty::Attributes>("propertyAttributes");
+
+ QTest::newRow("Null itemType, propertyName")
+ << QString()
+ << QString()
+ << QGalleryProperty::Attributes();
+ QTest::newRow("Null itemType, invalid propertyName")
+ << QString()
+ << QString::fromLatin1("Goodbye")
+ << QGalleryProperty::Attributes();
+ QTest::newRow("Null itemType, valid propertyName")
+ << QString()
+ << QString(QDocumentGallery::fileName)
+ << QGalleryProperty::Attributes();
+ QTest::newRow("Invalid itemType, invalid propertyName")
+ << QString::fromLatin1("Hello")
+ << QString::fromLatin1("Goodbye")
+ << QGalleryProperty::Attributes();
+ QTest::newRow("Invalid itemType, valid propertyName")
+ << QString::fromLatin1("Hello")
+ << QString(QDocumentGallery::fileName)
+ << QGalleryProperty::Attributes();
+ QTest::newRow("Valid itemType, invalid propertyName")
+ << QString(QDocumentGallery::File)
+ << QString::fromLatin1("Goodbye")
+ << QGalleryProperty::Attributes();
+ QTest::newRow("File.fileName")
+ << QString(QDocumentGallery::File)
+ << QString(QDocumentGallery::fileName)
+#if defined(Q_OS_UNIX) && !defined(QT_NO_DBUS) || defined (Q_OS_SYMBIAN)
+ << (QGalleryProperty::CanRead
+ | QGalleryProperty::CanFilter
+ | QGalleryProperty::CanSort);
+#else
+ << QGalleryProperty::Attributes();
+#endif
+ QTest::newRow("File.filePath")
+ << QString(QDocumentGallery::File)
+ << QString(QDocumentGallery::filePath)
+#if defined(Q_OS_UNIX) && !defined(QT_NO_DBUS) || defined (Q_OS_SYMBIAN)
+ << (QGalleryProperty::CanRead | QGalleryProperty::CanFilter);
+#else
+ << QGalleryProperty::Attributes();
+#endif
+
+ QTest::newRow("Audio.albumTitle")
+ << QString(QDocumentGallery::Audio)
+ << QString(QDocumentGallery::albumTitle)
+#if defined(Q_OS_UNIX) && !defined(QT_NO_DBUS) || defined (Q_OS_SYMBIAN)
+ << (QGalleryProperty::CanRead
+#if !defined(Q_WS_MAEMO_6)
+ | QGalleryProperty::CanWrite
+#endif
+ | QGalleryProperty::CanFilter
+ | QGalleryProperty::CanSort);
+#else
+ << QGalleryProperty::Attributes();
+#endif
+ QTest::newRow("Album.duration")
+ << QString(QDocumentGallery::Album)
+ << QString(QDocumentGallery::duration)
+#if defined(Q_WS_MAEMO_6)
+ << (QGalleryProperty::CanRead
+ | QGalleryProperty::CanFilter
+ | QGalleryProperty::CanSort);
+#elif defined(Q_OS_UNIX) && !defined(QT_NO_DBUS)
+ << QGalleryProperty::Attributes(QGalleryProperty::CanRead);
+#else
+ << QGalleryProperty::Attributes();
+#endif
+}
+
+void tst_QDocumentGallery::propertyAttributes()
+{
+ QFETCH(QString, itemType);
+ QFETCH(QString, propertyName);
+ QFETCH(QGalleryProperty::Attributes, propertyAttributes);
+
+ QCOMPARE(int(gallery.propertyAttributes(propertyName, itemType)), int(propertyAttributes));
+}
+
+#include "tst_qdocumentgallery.moc"
+
+QTEST_MAIN(tst_QDocumentGallery)
diff --git a/tests/auto/qgalleryabstractrequest/qgalleryabstractrequest.pro b/tests/auto/qgalleryabstractrequest/qgalleryabstractrequest.pro
new file mode 100644
index 0000000..cad5e57
--- /dev/null
+++ b/tests/auto/qgalleryabstractrequest/qgalleryabstractrequest.pro
@@ -0,0 +1,4 @@
+include(../auto.pri)
+
+SOURCES += tst_qgalleryabstractrequest.cpp
+
diff --git a/tests/auto/qgalleryabstractrequest/tst_qgalleryabstractrequest.cpp b/tests/auto/qgalleryabstractrequest/tst_qgalleryabstractrequest.cpp
new file mode 100644
index 0000000..5f2b51c
--- /dev/null
+++ b/tests/auto/qgalleryabstractrequest/tst_qgalleryabstractrequest.cpp
@@ -0,0 +1,1384 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDocGallery module 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$
+**
+****************************************************************************/
+
+//TESTED_COMPONENT=src/gallery
+
+#include <qgalleryabstractrequest.h>
+
+#include <qabstractgallery.h>
+#include <qgalleryabstractresponse.h>
+
+#include <QtTest/QtTest>
+
+Q_DECLARE_METATYPE(QGalleryAbstractRequest::State)
+
+class tst_QGalleryAbstractRequest : public QObject
+{
+ Q_OBJECT
+
+public Q_SLOTS:
+ void initTestCase();
+
+private Q_SLOTS:
+ void type();
+ void isSupported();
+ void executeNoGallery();
+ void executeUnsupported();
+ void executeSync();
+ void executeAsync();
+ void resume();
+ void cancelActive();
+ void cancelIdle();
+ void clear();
+ void waitForFinished();
+ void progress();
+ void setGallery();
+ void clearGallery();
+ void deleteGallery();
+};
+
+class QtGalleryTestResponse : public QGalleryAbstractResponse
+{
+ Q_OBJECT
+public:
+ QtGalleryTestResponse(
+ QGalleryAbstractRequest::State state, int error, const QString &errorString)
+ : m_ignoreCancel(false)
+ , m_finishInWait(false)
+ {
+ if (error != QGalleryAbstractRequest::NoError)
+ QGalleryAbstractResponse::error(error, errorString);
+ else if (state == QGalleryAbstractRequest::Finished)
+ finish();
+ else if (state == QGalleryAbstractRequest::Idle)
+ finish(true);
+ }
+
+ bool waitForFinished(int)
+ {
+ if (m_finishInWait) {
+ finish(true);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ void cancel() { if (!m_ignoreCancel) QGalleryAbstractResponse::cancel(); }
+
+ using QGalleryAbstractResponse::finished;
+ using QGalleryAbstractResponse::finish;
+ using QGalleryAbstractResponse::error;
+ using QGalleryAbstractResponse::resume;
+ using QGalleryAbstractResponse::resumed;
+ using QGalleryAbstractResponse::canceled;
+ using QGalleryAbstractResponse::progressChanged;
+
+ void setIgnoreCancel(bool ignore) { m_ignoreCancel = ignore; }
+ void setFinishInWait(bool finish) { m_finishInWait = finish; }
+
+private:
+ bool m_ignoreCancel;
+ bool m_finishInWait;
+};
+
+class QtGalleryTestRequest : public QGalleryAbstractRequest
+{
+ Q_OBJECT
+public:
+ QtGalleryTestRequest(QGalleryAbstractRequest::RequestType type)
+ : QGalleryAbstractRequest(type)
+ , m_response(0)
+ {
+ }
+
+ QtGalleryTestRequest(
+ QAbstractGallery *gallery, QGalleryAbstractRequest::RequestType type)
+ : QGalleryAbstractRequest(gallery, type)
+ , m_response(0)
+ {
+ }
+
+ QtGalleryTestResponse *response() const { return m_response; }
+
+protected:
+ void setResponse(QGalleryAbstractResponse *response) {
+ m_response = static_cast<QtGalleryTestResponse *>(response); }
+
+private:
+ QtGalleryTestResponse *m_response;
+};
+
+class QtTestGallery : public QAbstractGallery
+{
+ Q_OBJECT
+public:
+ QtTestGallery()
+ : m_state(QGalleryAbstractRequest::Active)
+ , m_error(QGalleryAbstractRequest::NoError)
+ {}
+
+ bool isRequestSupported(QGalleryAbstractRequest::RequestType type) const {
+ return m_supportedRequests.contains(type); }
+
+ void setState(QGalleryAbstractRequest::State state) { m_state = state; }
+ void setError(int error, const QString &errorString) {
+ m_error = error; m_errorString = errorString; }
+
+ void setSupportedRequests(const QList<QGalleryAbstractRequest::RequestType> &requests) {
+ m_supportedRequests = requests; }
+
+protected:
+ QGalleryAbstractResponse *createResponse(QGalleryAbstractRequest *request)
+ {
+ if (m_supportedRequests.contains(request->type())) {
+ return new QtGalleryTestResponse(m_state, m_error, m_errorString);
+ }
+ return 0;
+ }
+
+private:
+ QList<QGalleryAbstractRequest::RequestType> m_supportedRequests;
+ QGalleryAbstractRequest::State m_state;
+ int m_error;
+ QString m_errorString;
+};
+
+
+void tst_QGalleryAbstractRequest::type()
+{
+ QCOMPARE(QtGalleryTestRequest(QGalleryAbstractRequest::QueryRequest).type(),
+ QGalleryAbstractRequest::QueryRequest);
+
+ QCOMPARE(QtGalleryTestRequest(QGalleryAbstractRequest::ItemRequest).type(),
+ QGalleryAbstractRequest::ItemRequest);
+ QCOMPARE(QtGalleryTestRequest(QGalleryAbstractRequest::QueryRequest).type(),
+ QGalleryAbstractRequest::QueryRequest);
+ //Added Enum
+ QCOMPARE(QtGalleryTestRequest(QGalleryAbstractRequest::TypeRequest).type(),
+ QGalleryAbstractRequest::TypeRequest);
+}
+
+void tst_QGalleryAbstractRequest::initTestCase()
+{
+ qRegisterMetaType<QGalleryAbstractRequest::State>();
+}
+
+void tst_QGalleryAbstractRequest::isSupported()
+{
+ QtTestGallery gallery;
+ gallery.setSupportedRequests(QList<QGalleryAbstractRequest::RequestType>()
+ << QGalleryAbstractRequest::ItemRequest);
+
+ QCOMPARE(QtGalleryTestRequest(&gallery, QGalleryAbstractRequest::QueryRequest).isSupported(), false);
+ QCOMPARE(QtGalleryTestRequest(&gallery, QGalleryAbstractRequest::ItemRequest).isSupported(), true);
+}
+
+void tst_QGalleryAbstractRequest::executeNoGallery()
+{
+ QtGalleryTestRequest request(QGalleryAbstractRequest::ItemRequest);
+
+ QSignalSpy finishedSpy(&request, SIGNAL(finished()));
+ QSignalSpy canceledSpy(&request, SIGNAL(canceled()));
+ QSignalSpy errorSpy(&request, SIGNAL(error(int,QString)));
+ QSignalSpy stateSpy(&request, SIGNAL(stateChanged(QGalleryAbstractRequest::State)));
+
+ request.execute();
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Error);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoGallery));
+ QCOMPARE(request.errorString(), QLatin1String("No gallery has been set on the QtGalleryTestRequest."));
+ QCOMPARE(finishedSpy.count(), 0);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 1);
+ QCOMPARE(stateSpy.count(), 1);
+ QCOMPARE(errorSpy.last().value(0).toInt(), request.error());
+ QCOMPARE(errorSpy.last().value(1).toString(), request.errorString());
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+}
+
+void tst_QGalleryAbstractRequest::executeUnsupported()
+{
+ QtTestGallery gallery;
+ QtGalleryTestRequest request(&gallery, QGalleryAbstractRequest::ItemRequest);
+
+ QSignalSpy finishedSpy(&request, SIGNAL(finished()));
+ QSignalSpy canceledSpy(&request, SIGNAL(canceled()));
+ QSignalSpy errorSpy(&request, SIGNAL(error(int,QString)));
+ QSignalSpy stateSpy(&request, SIGNAL(stateChanged(QGalleryAbstractRequest::State)));
+ QSignalSpy errorchangedspy(&request,SIGNAL(errorChanged()));//Added Signal
+ request.execute();
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Error);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NotSupported));
+ QCOMPARE(request.errorString(), QLatin1String("QtGalleryTestRequest is not supported by QtTestGallery."));
+ QCOMPARE(finishedSpy.count(), 0);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 1);
+ QCOMPARE(stateSpy.count(), 1);
+ QCOMPARE(errorSpy.last().value(0).toInt(), request.error());
+ QCOMPARE(errorSpy.last().value(1).toString(), request.errorString());
+ QCOMPARE(errorchangedspy.count(),1);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+}
+
+void tst_QGalleryAbstractRequest::executeSync()
+{
+ QtTestGallery gallery;
+ gallery.setSupportedRequests(QList<QGalleryAbstractRequest::RequestType>()
+ << QGalleryAbstractRequest::ItemRequest);
+
+ QtGalleryTestRequest request(&gallery, QGalleryAbstractRequest::ItemRequest);
+
+ QSignalSpy finishedSpy(&request, SIGNAL(finished()));
+ QSignalSpy canceledSpy(&request, SIGNAL(canceled()));
+ QSignalSpy errorSpy(&request, SIGNAL(error(int,QString)));
+ QSignalSpy stateSpy(&request, SIGNAL(stateChanged(QGalleryAbstractRequest::State)));
+
+ // Successful execution.
+ gallery.setState(QGalleryAbstractRequest::Finished);
+ request.execute();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Finished);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 1);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ // Unsuccessful execution.
+ gallery.setError(121, QLatin1String("bad input"));
+ request.execute();
+ QVERIFY(request.response() == 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Error);
+ QCOMPARE(request.error(), 121);
+ QCOMPARE(request.errorString(), QLatin1String("bad input"));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 1);
+ QCOMPARE(stateSpy.count(), 2);
+ QCOMPARE(errorSpy.last().value(0).toInt(), request.error());
+ QCOMPARE(errorSpy.last().value(1).toString(), request.errorString());
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ gallery.setError(65, QLatin1String("bad connection"));
+ request.execute();
+ QVERIFY(request.response() == 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Error);
+ QCOMPARE(request.error(), 65);
+ QCOMPARE(request.errorString(), QLatin1String("bad connection"));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 2);
+ QCOMPARE(stateSpy.count(), 3);
+ QCOMPARE(errorSpy.last().value(0).toInt(), request.error());
+ QCOMPARE(errorSpy.last().value(1).toString(), request.errorString());
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ //Added enum gallery error
+ gallery.setError(100, QLatin1String("gallery Corrupted"));
+ request.execute();
+ QVERIFY(request.response() == 0);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::GalleryError));
+ QCOMPARE(request.error(), 100);
+ QCOMPARE(request.errorString(), QLatin1String("gallery Corrupted"));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 3);
+ QCOMPARE(stateSpy.count(), 4);
+ QCOMPARE(errorSpy.last().value(0).toInt(), request.error());
+ QCOMPARE(errorSpy.last().value(1).toString(), request.errorString());
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ // Successful execution, to idle.
+ gallery.setError(QGalleryAbstractRequest::NoError, QString());
+ gallery.setState(QGalleryAbstractRequest::Idle);
+ request.execute();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Idle);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 2);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 3);
+ QCOMPARE(stateSpy.count(), 5);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ // Execute unsupported.
+ gallery.setSupportedRequests(QList<QGalleryAbstractRequest::RequestType>());
+ request.execute();
+ QVERIFY(request.response() == 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Error);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NotSupported));
+ QCOMPARE(finishedSpy.count(), 2);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 4);
+ QCOMPARE(stateSpy.count(), 6);
+ QCOMPARE(errorSpy.last().value(0).toInt(), request.error());
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+}
+void tst_QGalleryAbstractRequest::executeAsync()
+{
+ QtTestGallery gallery;
+ gallery.setSupportedRequests(QList<QGalleryAbstractRequest::RequestType>()
+ << QGalleryAbstractRequest::ItemRequest);
+
+ QtGalleryTestRequest request(&gallery, QGalleryAbstractRequest::ItemRequest);
+
+ QSignalSpy finishedSpy(&request, SIGNAL(finished()));
+ QSignalSpy canceledSpy(&request, SIGNAL(canceled()));
+ QSignalSpy errorSpy(&request, SIGNAL(error(int,QString)));
+ QSignalSpy stateSpy(&request, SIGNAL(stateChanged(QGalleryAbstractRequest::State)));
+
+ // Successful execution.
+ gallery.setState(QGalleryAbstractRequest::Active);
+ request.execute();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Active);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 0);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 1);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ request.response()->finish(false);
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Finished);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 2);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ // Unsuccessful execution.
+ request.execute();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Active);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 3);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ request.response()->error(80, QString());
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Error);
+ QCOMPARE(request.error(), 80);
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 1);
+ QCOMPARE(stateSpy.count(), 4);
+ QCOMPARE(errorSpy.last().value(0).toInt(), request.error());
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ // Successful execution, to active.
+ gallery.setError(QGalleryAbstractRequest::NoError, QString());
+ request.execute();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Active);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 1);
+ QCOMPARE(stateSpy.count(), 5);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ // Response emits finish without changing the error.
+ request.response()->finished();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Active);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 1);
+ QCOMPARE(stateSpy.count(), 5);
+
+ // Response finishes correctly.
+ request.response()->finish(true);
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Idle);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 2);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 1);
+ QCOMPARE(stateSpy.count(), 6);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ // Response emits finish without changing the idle state.
+ request.response()->finished();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Idle);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 2);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 1);
+ QCOMPARE(stateSpy.count(), 6);
+
+ // Response cancels itself.
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Idle);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 2);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 1);
+ QCOMPARE(stateSpy.count(), 6);
+
+ // Response exits idle state correctly.
+ request.response()->finish(false);
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Finished);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 2);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 1);
+ QCOMPARE(stateSpy.count(), 7);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ // Response emits finish from finished state.
+ request.response()->finished();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Finished);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 2);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 1);
+ QCOMPARE(stateSpy.count(), 7);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+}
+
+void tst_QGalleryAbstractRequest::resume()
+{
+ QtTestGallery gallery;
+ gallery.setSupportedRequests(QList<QGalleryAbstractRequest::RequestType>()
+ << QGalleryAbstractRequest::ItemRequest);
+ gallery.setState(QGalleryAbstractRequest::Idle);
+
+ QtGalleryTestRequest request(&gallery, QGalleryAbstractRequest::ItemRequest);
+
+ QSignalSpy finishedSpy(&request, SIGNAL(finished()));
+ QSignalSpy canceledSpy(&request, SIGNAL(canceled()));
+ QSignalSpy errorSpy(&request, SIGNAL(error(int,QString)));
+ QSignalSpy stateSpy(&request, SIGNAL(stateChanged(QGalleryAbstractRequest::State)));
+
+ request.execute();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Idle);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 1);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ // Response emits resumed without changing idle.
+ request.response()->resumed();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Idle);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 1);
+
+ // Response resumes correctly.
+ request.response()->resume();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Active);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 2);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ // Resuming while active does nothing.
+ request.response()->resume();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Active);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 2);
+
+ // Emitting resumed while active does nothing.
+ request.response()->resumed();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Active);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 2);
+
+ // Returning to idle again doesn't emit finished.
+ request.response()->finish(true);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Idle);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 3);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ // Finishing doesn't emit finished.
+ request.response()->resume();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Active);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 4);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ request.response()->finish(false);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Finished);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 5);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ // Emitting resumed when finished does nothing
+ request.response()->resumed();
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Finished);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 5);
+}
+
+void tst_QGalleryAbstractRequest::cancelActive()
+{
+ QtTestGallery gallery;
+ gallery.setSupportedRequests(QList<QGalleryAbstractRequest::RequestType>()
+ << QGalleryAbstractRequest::ItemRequest);
+
+ QtGalleryTestRequest request(&gallery, QGalleryAbstractRequest::ItemRequest);
+
+ QSignalSpy finishedSpy(&request, SIGNAL(finished()));
+ QSignalSpy canceledSpy(&request, SIGNAL(canceled()));
+ QSignalSpy errorSpy(&request, SIGNAL(error(int,QString)));
+ QSignalSpy stateSpy(&request, SIGNAL(stateChanged(QGalleryAbstractRequest::State)));
+
+ // Cancel synchronously.
+ request.execute();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Active);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 0);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 1);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ request.cancel();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Canceled);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 0);
+ QCOMPARE(canceledSpy.count(), 1);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 2);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ // Cancel asynchronously.
+ request.execute();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Active);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 0);
+ QCOMPARE(canceledSpy.count(), 1);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 3);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ // Response emits canceled unprovoked.
+ request.response()->canceled();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Active);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 0);
+ QCOMPARE(canceledSpy.count(), 1);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 3);
+
+ request.response()->setIgnoreCancel(true);
+ request.cancel();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Canceling);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 0);
+ QCOMPARE(canceledSpy.count(), 1);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 4);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ // No state changes while cancel in pending
+ request.cancel();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Canceling);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 0);
+ QCOMPARE(canceledSpy.count(), 1);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 4);
+
+ request.response()->setIgnoreCancel(false);
+ request.response()->cancel();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Canceled);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 0);
+ QCOMPARE(canceledSpy.count(), 2);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 5);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ // No state changes after cancel is finished.
+ request.cancel();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Canceled);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 0);
+ QCOMPARE(canceledSpy.count(), 2);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 5);
+
+ // Finish as normal if response finishes after being canceled.
+ request.execute();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Active);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 0);
+ QCOMPARE(canceledSpy.count(), 2);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 6);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ request.response()->setIgnoreCancel(true);
+ request.cancel();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Canceling);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 0);
+ QCOMPARE(canceledSpy.count(), 2);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 7);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ request.response()->finish(false);
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Finished);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 2);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 8);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+}
+
+void tst_QGalleryAbstractRequest::cancelIdle()
+{
+ QtTestGallery gallery;
+ gallery.setSupportedRequests(QList<QGalleryAbstractRequest::RequestType>()
+ << QGalleryAbstractRequest::ItemRequest);
+ gallery.setState(QGalleryAbstractRequest::Idle);
+
+ QtGalleryTestRequest request(&gallery, QGalleryAbstractRequest::ItemRequest);
+
+ QSignalSpy finishedSpy(&request, SIGNAL(finished()));
+ QSignalSpy canceledSpy(&request, SIGNAL(canceled()));
+ QSignalSpy errorSpy(&request, SIGNAL(error(int,QString)));
+ QSignalSpy stateSpy(&request, SIGNAL(stateChanged(QGalleryAbstractRequest::State)));
+
+ // Cancel synchronously.
+ request.execute();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Idle);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 1);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ request.cancel();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Finished);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 2);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ // Cancel asynchronously.
+ request.execute();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Idle);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 2);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 3);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ request.response()->setIgnoreCancel(true);
+ request.cancel();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Canceling);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 2);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 4);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ request.response()->setIgnoreCancel(false);
+ request.response()->cancel();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Finished);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 2);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 5);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+}
+
+void tst_QGalleryAbstractRequest::clear()
+{
+ QtTestGallery gallery;
+ gallery.setSupportedRequests(QList<QGalleryAbstractRequest::RequestType>()
+ << QGalleryAbstractRequest::ItemRequest);
+
+ QtGalleryTestRequest request(&gallery, QGalleryAbstractRequest::ItemRequest);
+
+ QSignalSpy finishedSpy(&request, SIGNAL(finished()));
+ QSignalSpy canceledSpy(&request, SIGNAL(canceled()));
+ QSignalSpy errorSpy(&request, SIGNAL(error(int,QString)));
+ QSignalSpy stateSpy(&request, SIGNAL(stateChanged(QGalleryAbstractRequest::State)));
+
+ // Clear no response.
+ request.clear();
+ QVERIFY(request.response() == 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Inactive);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 0);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 0);
+
+ // Clear finished response.
+ gallery.setState(QGalleryAbstractRequest::Finished);
+ request.execute();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Finished);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 1);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ request.clear();
+ QVERIFY(request.response() == 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Inactive);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 2);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ // Clear idle response.
+ gallery.setState(QGalleryAbstractRequest::Idle);
+ request.execute();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Idle);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 2);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 3);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ request.clear();
+ QVERIFY(request.response() == 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Inactive);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 2);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 4);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ // Clear active response.
+ gallery.setState(QGalleryAbstractRequest::Active);
+ request.execute();
+ QVERIFY(request.response() != 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Active);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 2);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 5);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ request.clear();
+ QVERIFY(request.response() == 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Inactive);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 2);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 6);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ // Clear error response.
+ gallery.setError(65, QLatin1String("bad connection"));
+ request.execute();
+ QVERIFY(request.response() == 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Error);
+ QCOMPARE(request.error(), 65);
+ QCOMPARE(request.errorString(), QLatin1String("bad connection"));
+ QCOMPARE(finishedSpy.count(), 2);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 1);
+ QCOMPARE(stateSpy.count(), 7);
+ QCOMPARE(errorSpy.last().value(0).toInt(), request.error());
+ QCOMPARE(errorSpy.last().value(1).toString(), request.errorString());
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ request.clear();
+ QVERIFY(request.response() == 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Inactive);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(request.errorString(), QString());
+ QCOMPARE(finishedSpy.count(), 2);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 1);
+ QCOMPARE(stateSpy.count(), 8);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+}
+
+void tst_QGalleryAbstractRequest::waitForFinished()
+{
+ QtTestGallery gallery;
+ gallery.setSupportedRequests(QList<QGalleryAbstractRequest::RequestType>()
+ << QGalleryAbstractRequest::ItemRequest);
+
+ QtGalleryTestRequest request(&gallery, QGalleryAbstractRequest::ItemRequest);
+
+ QSignalSpy finishedSpy(&request, SIGNAL(finished()));
+ QSignalSpy canceledSpy(&request, SIGNAL(canceled()));
+ QSignalSpy errorSpy(&request, SIGNAL(error(int,QString)));
+ QSignalSpy stateSpy(&request, SIGNAL(stateChanged(QGalleryAbstractRequest::State)));
+
+ // Wait while inactive, no error.
+ QCOMPARE(request.waitForFinished(300), true);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Inactive);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 0);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 0);
+
+ request.execute();
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Active);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 0);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 1);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ // Timeout while waiting.
+ QCOMPARE(request.waitForFinished(300), false);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Active);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 0);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 1);
+
+ // Finish while waiting.
+ request.response()->setFinishInWait(true);
+ QCOMPARE(request.waitForFinished(300), true);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Idle);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 2);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ // Wait while idle.
+ request.response()->setFinishInWait(false);
+ QCOMPARE(request.waitForFinished(300), true);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Idle);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 2);
+
+ // Wait while finished.
+ request.response()->finish(false);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Finished);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 3);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ QCOMPARE(request.waitForFinished(300), true);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Finished);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 3);
+
+ // Wait while canceled.
+ gallery.setState(QGalleryAbstractRequest::Active);
+ request.execute();
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Active);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 4);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ request.cancel();
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Canceled);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 1);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 5);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ QCOMPARE(request.waitForFinished(300), true);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Canceled);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 1);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 5);
+}
+
+void tst_QGalleryAbstractRequest::progress()
+{
+ QtTestGallery gallery;
+ gallery.setSupportedRequests(QList<QGalleryAbstractRequest::RequestType>()
+ << QGalleryAbstractRequest::ItemRequest);
+
+ QtGalleryTestRequest request(&gallery, QGalleryAbstractRequest::ItemRequest);
+
+ QSignalSpy spy(&request, SIGNAL(progressChanged(int,int)));
+
+ QCOMPARE(request.currentProgress(), 0);
+ QCOMPARE(request.maximumProgress(), 0);
+
+ request.execute();
+ QCOMPARE(spy.count(), 0);
+ QVERIFY(request.response() != 0);
+
+ request.response()->progressChanged(120, 1000);
+ QCOMPARE(request.currentProgress(), 120);
+ QCOMPARE(request.maximumProgress(), 1000);
+ QCOMPARE(spy.count(), 1);
+ QCOMPARE(spy.last().value(0).toInt(), 120);
+ QCOMPARE(spy.last().value(1).toInt(), 1000);
+
+ request.response()->progressChanged(5600, 95);
+ QCOMPARE(request.currentProgress(), 5600);
+ QCOMPARE(request.maximumProgress(), 95);
+ QCOMPARE(spy.count(), 2);
+ QCOMPARE(spy.last().value(0).toInt(), 5600);
+ QCOMPARE(spy.last().value(1).toInt(), 95);
+
+ request.cancel();
+ QCOMPARE(request.currentProgress(), 5600);
+ QCOMPARE(request.maximumProgress(), 95);
+ QCOMPARE(spy.count(), 2);
+
+ request.execute();
+ QCOMPARE(request.currentProgress(), 0);
+ QCOMPARE(request.currentProgress(), 0);
+ QCOMPARE(spy.count(), 3);
+ QCOMPARE(spy.last().value(0).toInt(), 0);
+ QCOMPARE(spy.last().value(1).toInt(), 0);
+
+ request.response()->progressChanged(-2, 10);
+ QCOMPARE(request.currentProgress(), -2);
+ QCOMPARE(request.maximumProgress(), 10);
+ QCOMPARE(spy.count(), 4);
+ QCOMPARE(spy.last().value(0).toInt(), -2);
+ QCOMPARE(spy.last().value(1).toInt(), 10);
+
+ request.clear();
+ QCOMPARE(request.currentProgress(), 0);
+ QCOMPARE(request.currentProgress(), 0);
+ QCOMPARE(spy.count(), 5);
+ QCOMPARE(spy.last().value(0).toInt(), 0);
+ QCOMPARE(spy.last().value(1).toInt(), 0);
+
+ request.execute();
+ QCOMPARE(request.currentProgress(), 0);
+ QCOMPARE(request.currentProgress(), 0);
+ QCOMPARE(spy.count(), 5);
+
+ request.response()->progressChanged(0, 75);
+ QCOMPARE(request.currentProgress(), 0);
+ QCOMPARE(request.maximumProgress(), 75);
+ QCOMPARE(spy.count(), 6);
+ QCOMPARE(spy.last().value(0).toInt(), 0);
+ QCOMPARE(spy.last().value(1).toInt(), 75);
+
+ request.execute();
+ QCOMPARE(request.currentProgress(), 0);
+ QCOMPARE(request.currentProgress(), 0);
+ QCOMPARE(spy.count(), 7);
+ QCOMPARE(spy.last().value(0).toInt(), 0);
+ QCOMPARE(spy.last().value(1).toInt(), 0);
+
+ request.response()->progressChanged(0, -23);
+ QCOMPARE(request.currentProgress(), 0);
+ QCOMPARE(request.maximumProgress(), -23);
+ QCOMPARE(spy.count(), 8);
+ QCOMPARE(spy.last().value(0).toInt(), 0);
+ QCOMPARE(spy.last().value(1).toInt(), -23);
+
+ request.clear();
+ QCOMPARE(request.currentProgress(), 0);
+ QCOMPARE(request.currentProgress(), 0);
+ QCOMPARE(spy.count(), 9);
+ QCOMPARE(spy.last().value(0).toInt(), 0);
+ QCOMPARE(spy.last().value(1).toInt(), 0);
+}
+
+void tst_QGalleryAbstractRequest::setGallery()
+{
+ QtTestGallery copyGallery;
+ copyGallery.setSupportedRequests(QList<QGalleryAbstractRequest::RequestType>()
+ << QGalleryAbstractRequest::ItemRequest);
+
+ QtTestGallery moveGallery;
+ moveGallery.setSupportedRequests(QList<QGalleryAbstractRequest::RequestType>()
+ << QGalleryAbstractRequest::QueryRequest);
+
+ QtGalleryTestRequest copyRequest(QGalleryAbstractRequest::ItemRequest);
+ QtGalleryTestRequest moveRequest(QGalleryAbstractRequest::QueryRequest);
+
+ QSignalSpy copyGallerySpy(&copyRequest, SIGNAL(galleryChanged()));
+ QSignalSpy moveGallerySpy(&moveRequest, SIGNAL(galleryChanged()));
+ QSignalSpy copySupportedSpy(&copyRequest, SIGNAL(supportedChanged()));
+ QSignalSpy moveSupportedSpy(&moveRequest, SIGNAL(supportedChanged()));
+
+ QVERIFY(copyRequest.gallery() == 0);
+ QVERIFY(moveRequest.gallery() == 0);
+ QCOMPARE(copyRequest.isSupported(), false);
+ QCOMPARE(moveRequest.isSupported(), false);
+
+ copyRequest.setGallery(&copyGallery);
+ moveRequest.setGallery(&moveGallery);
+
+ QVERIFY(copyRequest.gallery() == &copyGallery);
+ QVERIFY(moveRequest.gallery() == &moveGallery);
+ QCOMPARE(copyRequest.isSupported(), true);
+ QCOMPARE(moveRequest.isSupported(), true);
+ QCOMPARE(copyGallerySpy.count(), 1);
+ QCOMPARE(moveGallerySpy.count(), 1);
+ QCOMPARE(copySupportedSpy.count(), 1);
+ QCOMPARE(moveSupportedSpy.count(), 1);
+
+ copyRequest.setGallery(&copyGallery);
+ moveRequest.setGallery(&moveGallery);
+ QVERIFY(copyRequest.gallery() == &copyGallery);
+ QVERIFY(moveRequest.gallery() == &moveGallery);
+ QCOMPARE(copyGallerySpy.count(), 1);
+ QCOMPARE(moveGallerySpy.count(), 1);
+ QCOMPARE(copySupportedSpy.count(), 1);
+ QCOMPARE(moveSupportedSpy.count(), 1);
+
+ copyRequest.setGallery(&moveGallery);
+ moveRequest.setGallery(&copyGallery);
+
+ QVERIFY(copyRequest.gallery() == &moveGallery);
+ QVERIFY(moveRequest.gallery() == &copyGallery);
+ QCOMPARE(copyRequest.isSupported(), false);
+ QCOMPARE(moveRequest.isSupported(), false);
+ QCOMPARE(copyGallerySpy.count(), 2);
+ QCOMPARE(moveGallerySpy.count(), 2);
+ QCOMPARE(copySupportedSpy.count(), 2);
+ QCOMPARE(moveSupportedSpy.count(), 2);
+
+ copyRequest.setGallery(0);
+ moveRequest.setGallery(0);
+
+ QVERIFY(copyRequest.gallery() == 0);
+ QVERIFY(moveRequest.gallery() == 0);
+ QCOMPARE(copyRequest.isSupported(), false);
+ QCOMPARE(moveRequest.isSupported(), false);
+ QCOMPARE(copyGallerySpy.count(), 3);
+ QCOMPARE(moveGallerySpy.count(), 3);
+ QCOMPARE(copySupportedSpy.count(), 3);
+ QCOMPARE(moveSupportedSpy.count(), 3);
+}
+
+void tst_QGalleryAbstractRequest::clearGallery()
+{
+ QtTestGallery gallery;
+ gallery.setSupportedRequests(QList<QGalleryAbstractRequest::RequestType>()
+ << QGalleryAbstractRequest::ItemRequest);
+
+ QtGalleryTestRequest request(&gallery, QGalleryAbstractRequest::ItemRequest);
+
+ QSignalSpy finishedSpy(&request, SIGNAL(finished()));
+ QSignalSpy canceledSpy(&request, SIGNAL(canceled()));
+ QSignalSpy errorSpy(&request, SIGNAL(error(int,QString)));
+ QSignalSpy stateSpy(&request, SIGNAL(stateChanged(QGalleryAbstractRequest::State)));
+
+ // Clear no response.
+ request.setGallery(0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Inactive);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 0);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 0);
+
+ // Clear finished response.
+ gallery.setState(QGalleryAbstractRequest::Finished);
+ request.setGallery(&gallery);
+ request.execute();
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Finished);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 1);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ request.setGallery(0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Finished);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 1);
+
+ // Clear idle response.
+ gallery.setState(QGalleryAbstractRequest::Idle);
+ request.setGallery(&gallery);
+ request.execute();
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Idle);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 2);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 2);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ request.setGallery(0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Idle);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 2);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 2);
+
+ // Clear active response.
+ gallery.setState(QGalleryAbstractRequest::Active);
+ request.setGallery(&gallery);
+ request.execute();
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Active);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 2);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 3);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ request.setGallery(0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Active);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 2);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 3);
+
+ // execute after clearing gallery.
+ request.execute();
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Error);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoGallery));
+ QCOMPARE(finishedSpy.count(), 2);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 1);
+ QCOMPARE(stateSpy.count(), 4);
+ QCOMPARE(errorSpy.last().value(0).toInt(), request.error());
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+}
+
+void tst_QGalleryAbstractRequest::deleteGallery()
+{
+ QtTestGallery *gallery = 0;
+
+ QtGalleryTestRequest request(QGalleryAbstractRequest::ItemRequest);
+
+ QSignalSpy finishedSpy(&request, SIGNAL(finished()));
+ QSignalSpy canceledSpy(&request, SIGNAL(canceled()));
+ QSignalSpy errorSpy(&request, SIGNAL(error(int,QString)));
+ QSignalSpy stateSpy(&request, SIGNAL(stateChanged(QGalleryAbstractRequest::State)));
+
+ // No response.
+ gallery = new QtTestGallery;
+ gallery->setSupportedRequests(QList<QGalleryAbstractRequest::RequestType>()
+ << QGalleryAbstractRequest::ItemRequest);
+
+ request.setGallery(gallery);
+ delete gallery;
+ QVERIFY(request.gallery() == 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Inactive);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 0);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 0);
+
+ // Finished response.
+ gallery = new QtTestGallery;
+ gallery->setSupportedRequests(QList<QGalleryAbstractRequest::RequestType>()
+ << QGalleryAbstractRequest::ItemRequest);
+ gallery->setState(QGalleryAbstractRequest::Finished);
+
+ request.setGallery(gallery);
+ request.execute();
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Finished);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 1);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ delete gallery;
+ QVERIFY(request.gallery() == 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Finished);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 1);
+
+ // Idle response.
+ gallery = new QtTestGallery;
+ gallery->setSupportedRequests(QList<QGalleryAbstractRequest::RequestType>()
+ << QGalleryAbstractRequest::ItemRequest);
+ gallery->setState(QGalleryAbstractRequest::Idle);
+
+ request.setGallery(gallery);
+ request.execute();
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Idle);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 2);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 2);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ delete gallery;
+ QVERIFY(request.gallery() == 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Idle);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 2);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 2);
+
+ // Clear active response.
+ gallery = new QtTestGallery;
+ gallery->setSupportedRequests(QList<QGalleryAbstractRequest::RequestType>()
+ << QGalleryAbstractRequest::ItemRequest);
+
+ request.setGallery(gallery);
+ request.execute();
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Active);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 2);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 3);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+
+ delete gallery;
+ QVERIFY(request.gallery() == 0);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Active);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 2);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 3);
+
+ // execute after deleting gallery.
+ request.execute();
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Error);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoGallery));
+ QCOMPARE(finishedSpy.count(), 2);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 1);
+ QCOMPARE(stateSpy.count(), 4);
+ QCOMPARE(errorSpy.last().value(0).toInt(), request.error());
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), request.state());
+}
+
+QTEST_MAIN(tst_QGalleryAbstractRequest)
+
+#include "tst_qgalleryabstractrequest.moc"
diff --git a/tests/auto/qgalleryabstractresponse/qgalleryabstractresponse.pro b/tests/auto/qgalleryabstractresponse/qgalleryabstractresponse.pro
new file mode 100644
index 0000000..1f424b0
--- /dev/null
+++ b/tests/auto/qgalleryabstractresponse/qgalleryabstractresponse.pro
@@ -0,0 +1,3 @@
+include(../auto.pri)
+
+SOURCES += tst_qgalleryabstractresponse.cpp
diff --git a/tests/auto/qgalleryabstractresponse/tst_qgalleryabstractresponse.cpp b/tests/auto/qgalleryabstractresponse/tst_qgalleryabstractresponse.cpp
new file mode 100644
index 0000000..77f673c
--- /dev/null
+++ b/tests/auto/qgalleryabstractresponse/tst_qgalleryabstractresponse.cpp
@@ -0,0 +1,525 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDocGallery module 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$
+**
+****************************************************************************/
+
+//TESTED_COMPONENT=src/gallery
+
+#include <qgalleryabstractresponse.h>
+
+#include <QtTest/QtTest>
+
+class tst_QGalleryAbstractResponse : public QObject
+{
+ Q_OBJECT
+
+private Q_SLOTS:
+ void finish();
+ void cancel();
+ void cancelIdle();
+ void finishIdle();
+ void errorActive();
+ void errorIdle();
+ void errorFinished();
+ void errorCanceled();
+ void immediateError();
+ void waitForFinishedImmediate();
+ void waitForFinishedTimeout();
+ void waitForFinishedNoTimeout();
+ void waitForCanceledImmediate();
+ void waitForCanceledNoTimeout();
+ void waitForErrorImmediate();
+ void waitForErrorNoTimeout();
+ void progressChangedSignal();
+};
+
+class QtGalleryTestResponse : public QGalleryAbstractResponse
+{
+ Q_OBJECT
+public:
+ using QGalleryAbstractResponse::error;
+ using QGalleryAbstractResponse::finish;
+ using QGalleryAbstractResponse::resume;
+ using QGalleryAbstractResponse::progressChanged;
+
+public Q_SLOTS:
+ void doFinish() { finish(); }
+ void doCancel() { cancel(); }
+ void doError(int error) { QGalleryAbstractResponse::error(error); }
+};
+
+void tst_QGalleryAbstractResponse::finish()
+{
+ QtGalleryTestResponse response;
+
+ QSignalSpy finishedSpy(&response, SIGNAL(finished()));
+ QSignalSpy canceledSpy(&response, SIGNAL(canceled()));
+ QSignalSpy resumedSpy(&response, SIGNAL(resumed()));
+
+ QCOMPARE(response.isActive(), true);
+ QCOMPARE(response.isIdle(), false);
+
+ // The first call to finish with a valid result emits finished.
+ response.finish(false);
+ QCOMPARE(response.isActive(), false);
+ QCOMPARE(response.isIdle(), false);
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(resumedSpy.count(), 0);
+
+ // Subsequent calls to finish do nothing.
+ response.finish(false);
+ QCOMPARE(response.isActive(), false);
+ QCOMPARE(response.isIdle(), false);
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(resumedSpy.count(), 0);
+
+ response.finish(true);
+ QCOMPARE(response.isActive(), false);
+ QCOMPARE(response.isIdle(), false);
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(resumedSpy.count(), 0);
+
+ // Subsequent calls to cancel do nothing.
+ response.cancel();
+ QCOMPARE(response.isActive(), false);
+ QCOMPARE(response.isIdle(), false);
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(resumedSpy.count(), 0);
+
+ // Subsequent calls to resume do nothing.
+ response.resume();
+ QCOMPARE(response.isActive(), false);
+ QCOMPARE(response.isIdle(), false);
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(resumedSpy.count(), 0);
+}
+
+void tst_QGalleryAbstractResponse::cancel()
+{
+ QtGalleryTestResponse response;
+
+ QSignalSpy finishedSpy(&response, SIGNAL(finished()));
+ QSignalSpy canceledSpy(&response, SIGNAL(canceled()));
+ QSignalSpy resumedSpy(&response, SIGNAL(resumed()));
+
+ QCOMPARE(response.isActive(), true);
+ QCOMPARE(response.isIdle(), false);
+
+ // Calling cancel on an unfinished will emit canceled, and set isActive false.
+ response.cancel();
+ QCOMPARE(response.isActive(), false);
+ QCOMPARE(response.isIdle(), false);
+ QCOMPARE(finishedSpy.count(), 0);
+ QCOMPARE(canceledSpy.count(), 1);
+ QCOMPARE(resumedSpy.count(), 0);
+
+ // Subsequent calls to finish do nothing.
+ response.finish(false);
+ QCOMPARE(response.isActive(), false);
+ QCOMPARE(response.isIdle(), false);
+ QCOMPARE(finishedSpy.count(), 0);
+ QCOMPARE(canceledSpy.count(), 1);
+ QCOMPARE(resumedSpy.count(), 0);
+
+ response.finish(true);
+ QCOMPARE(response.isActive(), false);
+ QCOMPARE(response.isIdle(), false);
+ QCOMPARE(finishedSpy.count(), 0);
+ QCOMPARE(canceledSpy.count(), 1);
+ QCOMPARE(resumedSpy.count(), 0);
+
+ // Subsequent call to cancel do nothing.
+ response.cancel();
+ QCOMPARE(response.isActive(), false);
+ QCOMPARE(response.isIdle(), false);
+ QCOMPARE(finishedSpy.count(), 0);
+ QCOMPARE(canceledSpy.count(), 1);
+ QCOMPARE(resumedSpy.count(), 0);
+
+ // Subsequent call to resume do nothing.
+ response.resume();
+ QCOMPARE(response.isActive(), false);
+ QCOMPARE(response.isIdle(), false);
+ QCOMPARE(finishedSpy.count(), 0);
+ QCOMPARE(canceledSpy.count(), 1);
+ QCOMPARE(resumedSpy.count(), 0);
+}
+
+void tst_QGalleryAbstractResponse::cancelIdle()
+{
+ QtGalleryTestResponse response;
+
+ QSignalSpy finishedSpy(&response, SIGNAL(finished()));
+ QSignalSpy canceledSpy(&response, SIGNAL(canceled()));
+ QSignalSpy resumedSpy(&response, SIGNAL(resumed()));
+
+ QCOMPARE(response.isActive(), true);
+ QCOMPARE(response.isIdle(), false);
+
+ // Calling resume while active does nothing.
+ response.resume();
+ QCOMPARE(response.isActive(), true);
+ QCOMPARE(response.isIdle(), false);
+ QCOMPARE(finishedSpy.count(), 0);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(resumedSpy.count(), 0);
+
+ // The first call to finish with a valid result emits finished.
+ response.finish(true);
+ QCOMPARE(response.isActive(), false);
+ QCOMPARE(response.isIdle(), true);
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(resumedSpy.count(), 0);
+
+ // Calling resume set isActive to true and emits resumed.
+ response.resume();
+ QCOMPARE(response.isActive(), true);
+ QCOMPARE(response.isIdle(), false);
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(resumedSpy.count(), 1);
+
+ // Calling resume while active does nothing.
+ response.resume();
+ QCOMPARE(response.isActive(), true);
+ QCOMPARE(response.isIdle(), false);
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(resumedSpy.count(), 1);
+
+ // Finishing again works as before.
+ response.finish(true);
+ QCOMPARE(response.isActive(), false);
+ QCOMPARE(response.isIdle(), true);
+ QCOMPARE(finishedSpy.count(), 2);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(resumedSpy.count(), 1);
+
+
+ // Canceling sets isIdle to false and emits canceled.
+ response.cancel();
+ QCOMPARE(response.isActive(), false);
+ QCOMPARE(response.isIdle(), false);
+ QCOMPARE(finishedSpy.count(), 2);
+ QCOMPARE(canceledSpy.count(), 1);
+ QCOMPARE(resumedSpy.count(), 1);
+}
+
+void tst_QGalleryAbstractResponse::finishIdle()
+{
+ QtGalleryTestResponse response;
+
+ QSignalSpy finishedSpy(&response, SIGNAL(finished()));
+ QSignalSpy canceledSpy(&response, SIGNAL(canceled()));
+ QSignalSpy resumedSpy(&response, SIGNAL(resumed()));
+
+ QCOMPARE(response.isActive(), true);
+ QCOMPARE(response.isIdle(), false);
+
+ // Calling resume while active does nothing.
+ response.resume();
+ QCOMPARE(response.isActive(), true);
+ QCOMPARE(response.isIdle(), false);
+ QCOMPARE(finishedSpy.count(), 0);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(resumedSpy.count(), 0);
+
+ // The first call to finish with a valid result emits finished.
+ response.finish(true);
+ QCOMPARE(response.isActive(), false);
+ QCOMPARE(response.isIdle(), true);
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(resumedSpy.count(), 0);
+
+ // Calling resume set isActive to true and emits resumed.
+ response.resume();
+ QCOMPARE(response.isActive(), true);
+ QCOMPARE(response.isIdle(), false);
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(resumedSpy.count(), 1);
+
+ // Calling resume while active does nothing.
+ response.resume();
+ QCOMPARE(response.isActive(), true);
+ QCOMPARE(response.isIdle(), false);
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(resumedSpy.count(), 1);
+
+ // Finishing again works as before.
+ response.finish(true);
+ QCOMPARE(response.isActive(), false);
+ QCOMPARE(response.isIdle(), true);
+ QCOMPARE(finishedSpy.count(), 2);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(resumedSpy.count(), 1);
+
+ // Finishing with idle = true does nothing while idle.
+ response.finish(true);
+ QCOMPARE(response.isActive(), false);
+ QCOMPARE(response.isIdle(), true);
+ QCOMPARE(finishedSpy.count(), 2);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(resumedSpy.count(), 1);
+
+ // Finishing with idle = false sets isIdle to false and emits finished.
+ response.finish(false);
+ QCOMPARE(response.isActive(), false);
+ QCOMPARE(response.isIdle(), false);
+ QCOMPARE(finishedSpy.count(), 3);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(resumedSpy.count(), 1);
+}
+
+void tst_QGalleryAbstractResponse::errorActive()
+{
+ QtGalleryTestResponse response;
+
+ QSignalSpy finishedSpy(&response, SIGNAL(finished()));
+ QSignalSpy canceledSpy(&response, SIGNAL(canceled()));
+ QSignalSpy resumedSpy(&response, SIGNAL(resumed()));
+
+ QCOMPARE(response.isActive(), true);
+ QCOMPARE(response.isIdle(), false);
+ QCOMPARE(response.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(response.errorString(), QString());
+
+ response.error(300, QLatin1String("error"));
+
+ QCOMPARE(response.error(), 300);
+ QCOMPARE(response.errorString(), QLatin1String("error"));
+ QCOMPARE(response.isActive(), false);
+ QCOMPARE(response.isIdle(), false);
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(resumedSpy.count(), 0);
+}
+
+void tst_QGalleryAbstractResponse::errorIdle()
+{
+ QtGalleryTestResponse response;
+ response.finish(true);
+
+ QSignalSpy finishedSpy(&response, SIGNAL(finished()));
+ QSignalSpy canceledSpy(&response, SIGNAL(canceled()));
+ QSignalSpy resumedSpy(&response, SIGNAL(resumed()));
+
+ QCOMPARE(response.isActive(), false);
+ QCOMPARE(response.isIdle(), true);
+ QCOMPARE(response.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(response.errorString(), QString());
+
+ response.error(300, QLatin1String("error"));
+
+ QCOMPARE(response.isActive(), false);
+ QCOMPARE(response.isIdle(), false);
+ QCOMPARE(response.error(), 300);
+ QCOMPARE(response.errorString(), QLatin1String("error"));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(resumedSpy.count(), 0);
+}
+
+void tst_QGalleryAbstractResponse::errorFinished()
+{
+ QtGalleryTestResponse response;
+ response.finish(false);
+
+ QSignalSpy finishedSpy(&response, SIGNAL(finished()));
+ QSignalSpy canceledSpy(&response, SIGNAL(canceled()));
+ QSignalSpy resumedSpy(&response, SIGNAL(resumed()));
+
+ QCOMPARE(response.isActive(), false);
+ QCOMPARE(response.isIdle(), false);
+ QCOMPARE(response.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(response.errorString(), QString());
+
+ response.error(300, QLatin1String("error"));
+
+ QCOMPARE(response.isActive(), false);
+ QCOMPARE(response.isIdle(), false);
+ QCOMPARE(response.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(response.errorString(), QString());
+ QCOMPARE(finishedSpy.count(), 0);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(resumedSpy.count(), 0);
+}
+
+void tst_QGalleryAbstractResponse::errorCanceled()
+{
+ QtGalleryTestResponse response;
+ response.cancel();
+
+ QSignalSpy finishedSpy(&response, SIGNAL(finished()));
+ QSignalSpy canceledSpy(&response, SIGNAL(canceled()));
+ QSignalSpy resumedSpy(&response, SIGNAL(resumed()));
+
+ QCOMPARE(response.isActive(), false);
+ QCOMPARE(response.isIdle(), false);
+ QCOMPARE(response.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(response.errorString(), QString());
+
+ response.error(300, QLatin1String("error"));
+
+ QCOMPARE(response.isActive(), false);
+ QCOMPARE(response.isIdle(), false);
+ QCOMPARE(response.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(response.errorString(), QString());
+ QCOMPARE(finishedSpy.count(), 0);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(resumedSpy.count(), 0);
+}
+
+void tst_QGalleryAbstractResponse::immediateError()
+{
+ QGalleryAbstractResponse response(300, QLatin1String("error"));
+
+ QCOMPARE(response.isActive(), false);
+ QCOMPARE(response.isIdle(), false);
+ QCOMPARE(response.error(), 300);
+ QCOMPARE(response.errorString(), QLatin1String("error"));
+ QCOMPARE(response.waitForFinished(300), true);
+}
+
+void tst_QGalleryAbstractResponse::waitForFinishedImmediate()
+{
+ QtGalleryTestResponse response;
+
+ QMetaObject::invokeMethod(&response, "doFinish", Qt::QueuedConnection);
+ QCOMPARE(response.isActive(), true);
+ QCOMPARE(response.waitForFinished(0), true);
+ QCOMPARE(response.isActive(), false);
+}
+
+void tst_QGalleryAbstractResponse::waitForFinishedTimeout()
+{
+ QtGalleryTestResponse response;
+
+ QCOMPARE(response.waitForFinished(300), false);
+
+ QTimer::singleShot(250, &response, SLOT(doFinish()));
+ QCOMPARE(response.isActive(), true);
+ QCOMPARE(response.waitForFinished(100), false);
+ QCOMPARE(response.isActive(), true);
+ QCOMPARE(response.waitForFinished(500), true);
+ QCOMPARE(response.isActive(), false);
+
+}
+
+void tst_QGalleryAbstractResponse::waitForFinishedNoTimeout()
+{
+ QtGalleryTestResponse response;
+
+ QTimer::singleShot(250, &response, SLOT(doFinish()));
+ QCOMPARE(response.isActive(), true);
+ QCOMPARE(response.waitForFinished(-1), true);
+ QCOMPARE(response.isActive(), false);
+}
+
+void tst_QGalleryAbstractResponse::waitForCanceledImmediate()
+{
+ QtGalleryTestResponse response;
+
+ QMetaObject::invokeMethod(&response, "doCancel", Qt::QueuedConnection);
+ QCOMPARE(response.isActive(), true);
+ QCOMPARE(response.waitForFinished(0), true);
+ QCOMPARE(response.isActive(), false);
+}
+
+void tst_QGalleryAbstractResponse::waitForCanceledNoTimeout()
+{
+ QtGalleryTestResponse response;
+
+ QMetaObject::invokeMethod(&response, "doCancel", Qt::QueuedConnection);
+ QCOMPARE(response.isActive(), true);
+ QCOMPARE(response.waitForFinished(-1), true);
+ QCOMPARE(response.isActive(), false);
+}
+
+void tst_QGalleryAbstractResponse::waitForErrorImmediate()
+{
+ QtGalleryTestResponse response;
+ QMetaObject::invokeMethod(&response, "doError", Qt::QueuedConnection, Q_ARG(int, 1));
+ QCOMPARE(response.isActive(), true);
+ QCOMPARE(response.waitForFinished(0), true);
+ QCOMPARE(response.isActive(), false);
+}
+
+void tst_QGalleryAbstractResponse::waitForErrorNoTimeout()
+{
+ QtGalleryTestResponse response;
+ QMetaObject::invokeMethod(&response, "doError", Qt::QueuedConnection, Q_ARG(int, 1));
+ QCOMPARE(response.isActive(), true);
+ QCOMPARE(response.waitForFinished(-1), true);
+ QCOMPARE(response.isActive(), false);
+}
+
+void tst_QGalleryAbstractResponse::progressChangedSignal()
+{
+ QtGalleryTestResponse response;
+
+ QSignalSpy progressChangedSpy(&response, SIGNAL(progressChanged(int,int)));
+ QVERIFY(progressChangedSpy.count() == 0);
+ QCOMPARE(response.isActive(), true);
+ QCOMPARE(response.isIdle(), false);
+
+ response.progressChanged(10, 100);
+ QVERIFY(progressChangedSpy.count() == 1);
+
+ response.cancel();
+ QVERIFY(progressChangedSpy.count() == 1);
+
+ response.progressChanged(20, 200);
+ QVERIFY(progressChangedSpy.count() == 2);
+
+ response.progressChanged(20, 200);
+ QVERIFY(progressChangedSpy.count() == 3);
+}
+
+#include "tst_qgalleryabstractresponse.moc"
+
+QTEST_MAIN(tst_QGalleryAbstractResponse)
diff --git a/tests/auto/qgalleryfilter/qgalleryfilter.pro b/tests/auto/qgalleryfilter/qgalleryfilter.pro
new file mode 100644
index 0000000..1c1cadc
--- /dev/null
+++ b/tests/auto/qgalleryfilter/qgalleryfilter.pro
@@ -0,0 +1,3 @@
+include(../auto.pri)
+
+SOURCES += tst_qgalleryfilter.cpp
diff --git a/tests/auto/qgalleryfilter/tst_qgalleryfilter.cpp b/tests/auto/qgalleryfilter/tst_qgalleryfilter.cpp
new file mode 100644
index 0000000..c192e1c
--- /dev/null
+++ b/tests/auto/qgalleryfilter/tst_qgalleryfilter.cpp
@@ -0,0 +1,1345 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDocGallery module 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$
+**
+****************************************************************************/
+
+//TESTED_COMPONENT=src/gallery
+
+#include <qgalleryfilter.h>
+#include <qgalleryproperty.h>
+#include <qgallerytype.h>
+
+#include <QtTest/QtTest>
+
+Q_DECLARE_METATYPE(QVariant)
+Q_DECLARE_METATYPE(QT_PREPEND_NAMESPACE(QGalleryFilter))
+Q_DECLARE_METATYPE(QT_PREPEND_NAMESPACE(QGalleryFilter::Comparator))
+Q_DECLARE_METATYPE(QT_PREPEND_NAMESPACE(QGalleryMetaDataFilter))
+
+class tst_QGalleryFilter : public QObject
+{
+ Q_OBJECT
+private Q_SLOTS:
+ void nullFilter();
+ void metaDataFilter_data();
+ void metaDataFilter();
+ void unionFilter();
+ void intersectionFilter();
+ void assignment();
+ void copy();
+ void copyOnWrite();
+ void cast();
+ void intersectionOperator();
+ void unionOperator();
+ void intersectionStreamOperator();
+ void unionStreamOperator();
+ void propertyOperators_data();
+ void propertyOperators();
+ void equality_data();
+ void equality();
+ void inequality_data();
+ void inequality();
+ void galleryType();
+ void galleryProperty();
+
+#ifndef QT_NO_DEBUG_STREAM
+ void debugMessage_data();
+ void debugMessage();
+#endif
+ // Test case for missing scenarios.
+
+ void intersectionFilterInsert();
+ void intersectionFilterPrepend();
+ void unionFilterInsert();
+ void unionFilterPrepend();
+};
+
+void tst_QGalleryFilter::nullFilter()
+{
+ QGalleryFilter filter;
+
+ QCOMPARE(filter.type(), QGalleryFilter::Invalid);
+ QCOMPARE(filter.isValid(), false);
+}
+
+void tst_QGalleryFilter::metaDataFilter_data()
+{
+ QTest::addColumn<QString>("propertyName");
+ QTest::addColumn<QVariant>("value");
+ QTest::addColumn<QGalleryFilter::Comparator>("comparator");
+ QTest::addColumn<bool>("negated");
+
+ QTest::newRow("album title")
+ << QString::fromLatin1("albumTitle")
+ << QVariant(QString::fromLatin1("Greatest"))
+ << QGalleryFilter::StartsWith
+ << false;
+
+ QTest::newRow("not album title")
+ << QString::fromLatin1("albumTitle")
+ << QVariant(QString::fromLatin1("Greatest"))
+ << QGalleryFilter::StartsWith
+ << false;
+}
+
+void tst_QGalleryFilter::metaDataFilter()
+{
+ QFETCH(QString, propertyName);
+ QFETCH(QVariant, value);
+ QFETCH(QGalleryFilter::Comparator, comparator);
+ QFETCH(bool, negated);
+
+ {
+ QGalleryMetaDataFilter filter;
+
+ QCOMPARE(filter.isValid(), true);
+ QCOMPARE(filter.propertyName(), QString());
+ QCOMPARE(filter.value(), QVariant());
+ QCOMPARE(filter.comparator(), QGalleryFilter::Equals);
+ QCOMPARE(filter.isNegated(), false);
+
+ filter.setPropertyName(propertyName);
+ filter.setValue(value);
+ filter.setComparator(comparator);
+ filter.setNegated(negated);
+
+ QCOMPARE(filter.propertyName(), propertyName);
+ QCOMPARE(filter.value(), value);
+ QCOMPARE(filter.comparator(), comparator);
+ QCOMPARE(filter.isNegated(), negated);
+ }
+
+ {
+ QGalleryMetaDataFilter filter(propertyName, value, comparator);
+
+ if (negated)
+ filter = !filter;
+
+ QCOMPARE(filter.isValid(), true);
+
+ QCOMPARE(filter.propertyName(), propertyName);
+ QCOMPARE(filter.value(), value);
+ QCOMPARE(filter.comparator(), comparator);
+ QCOMPARE(filter.isNegated(), negated);
+ }
+}
+
+void tst_QGalleryFilter::unionFilter()
+{
+ QList<QGalleryFilter> filters;
+
+ QGalleryMetaDataFilter metaDataFilter;
+ QGalleryIntersectionFilter intersectionFilter;
+
+ QGalleryUnionFilter unionFilter;
+
+ QCOMPARE(unionFilter.isValid(), true);
+ QCOMPARE(unionFilter.isEmpty(), true);
+ QCOMPARE(unionFilter.filterCount(), 0);
+
+ unionFilter.append(metaDataFilter);
+ unionFilter.append(metaDataFilter);
+ unionFilter.append(intersectionFilter);
+ unionFilter.append(metaDataFilter);
+ QCOMPARE(unionFilter.isEmpty(), false);
+ QCOMPARE(unionFilter.filterCount(), 4);
+
+ filters = unionFilter.filters();
+ QCOMPARE(filters.count(), 4);
+
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(2).type(), QGalleryFilter::Intersection);
+ QCOMPARE(filters.at(3).type(), QGalleryFilter::MetaData);
+
+ unionFilter.append(unionFilter);
+ QCOMPARE(unionFilter.isEmpty(), false);
+ QCOMPARE(unionFilter.filterCount(), 8);
+
+ filters = unionFilter.filters();
+ QCOMPARE(filters.count(), 8);
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(2).type(), QGalleryFilter::Intersection);
+ QCOMPARE(filters.at(4).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(6).type(), QGalleryFilter::Intersection);
+
+ unionFilter.insert(1, intersectionFilter);
+ unionFilter.insert(2, metaDataFilter);
+
+ QCOMPARE(unionFilter.isEmpty(), false);
+ QCOMPARE(unionFilter.filterCount(), 10);
+
+ filters = unionFilter.filters();
+ QCOMPARE(filters.count(), 10);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::Intersection);
+ QCOMPARE(filters.at(2).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(3).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(4).type(), QGalleryFilter::Intersection);
+
+ unionFilter.insert(0, QGalleryUnionFilter(intersectionFilter));
+ unionFilter.insert(4, QGalleryUnionFilter(metaDataFilter));
+
+ QCOMPARE(unionFilter.isEmpty(), false);
+ QCOMPARE(unionFilter.filterCount(), 12);
+
+ filters = unionFilter.filters();
+ QCOMPARE(filters.count(), 12);
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::Intersection);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(4).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(5).type(), QGalleryFilter::MetaData);
+
+ unionFilter.replace(0, metaDataFilter);
+ unionFilter.replace(4, intersectionFilter);
+ QCOMPARE(unionFilter.isEmpty(), false);
+ QCOMPARE(unionFilter.filterCount(), 12);
+
+ filters = unionFilter.filters();
+ QCOMPARE(filters.count(), 12);
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(4).type(), QGalleryFilter::Intersection);
+ QCOMPARE(filters.at(5).type(), QGalleryFilter::MetaData);
+
+ unionFilter.remove(0);
+ unionFilter.remove(3);
+ QCOMPARE(unionFilter.isEmpty(), false);
+ QCOMPARE(unionFilter.filterCount(), 10);
+
+ filters = unionFilter.filters();
+ QCOMPARE(filters.count(), 10);
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::Intersection);
+ QCOMPARE(filters.at(3).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(4).type(), QGalleryFilter::Intersection);
+
+ unionFilter.clear();
+ QCOMPARE(unionFilter.isEmpty(), true);
+ QCOMPARE(unionFilter.filterCount(), 0);
+
+ filters = unionFilter.filters();
+ QCOMPARE(filters.count(), 0);
+
+ unionFilter.prepend(metaDataFilter);
+ unionFilter.prepend(metaDataFilter);
+ unionFilter.prepend(intersectionFilter);
+ unionFilter.prepend(metaDataFilter);
+ QCOMPARE(unionFilter.isEmpty(), false);
+ QCOMPARE(unionFilter.filterCount(), 4);
+
+ filters = unionFilter.filters();
+ QCOMPARE(filters.count(), 4);
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::Intersection);
+ QCOMPARE(filters.at(2).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(3).type(), QGalleryFilter::MetaData);
+
+ unionFilter.prepend(intersectionFilter || metaDataFilter);
+ QCOMPARE(unionFilter.isEmpty(), false);
+ QCOMPARE(unionFilter.filterCount(), 6);
+
+ filters = unionFilter.filters();
+ QCOMPARE(filters.count(), 6);
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::Intersection);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(2).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(3).type(), QGalleryFilter::Intersection);
+ QCOMPARE(filters.at(4).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(5).type(), QGalleryFilter::MetaData);
+}
+
+void tst_QGalleryFilter::intersectionFilter()
+{
+ QList<QGalleryFilter> filters;
+
+ QGalleryMetaDataFilter metaDataFilter;
+ QGalleryUnionFilter unionFilter;
+
+ QGalleryIntersectionFilter intersectionFilter;
+
+ QCOMPARE(intersectionFilter.isValid(), true);
+ QCOMPARE(intersectionFilter.isEmpty(), true);
+ QCOMPARE(intersectionFilter.filterCount(), 0);
+
+ intersectionFilter.append(metaDataFilter);
+ intersectionFilter.append(metaDataFilter);
+ intersectionFilter.append(unionFilter);
+ intersectionFilter.append(metaDataFilter);
+ QCOMPARE(intersectionFilter.isEmpty(), false);
+ QCOMPARE(intersectionFilter.filterCount(), 4);
+
+ filters = intersectionFilter.filters();
+ QCOMPARE(filters.count(), 4);
+
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(2).type(), QGalleryFilter::Union);
+ QCOMPARE(filters.at(3).type(), QGalleryFilter::MetaData);
+
+ intersectionFilter.append(intersectionFilter);
+ QCOMPARE(intersectionFilter.isEmpty(), false);
+ QCOMPARE(intersectionFilter.filterCount(), 8);
+
+ filters = intersectionFilter.filters();
+ QCOMPARE(filters.count(), 8);
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(2).type(), QGalleryFilter::Union);
+ QCOMPARE(filters.at(4).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(6).type(), QGalleryFilter::Union);
+
+ intersectionFilter.insert(1, unionFilter);
+ intersectionFilter.insert(2, metaDataFilter);
+
+ QCOMPARE(intersectionFilter.isEmpty(), false);
+ QCOMPARE(intersectionFilter.filterCount(), 10);
+
+ filters = intersectionFilter.filters();
+ QCOMPARE(filters.count(), 10);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::Union);
+ QCOMPARE(filters.at(2).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(3).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(4).type(), QGalleryFilter::Union);
+
+ intersectionFilter.insert(0, QGalleryIntersectionFilter(unionFilter));
+ intersectionFilter.insert(4, QGalleryIntersectionFilter(metaDataFilter));
+
+ QCOMPARE(intersectionFilter.isEmpty(), false);
+ QCOMPARE(intersectionFilter.filterCount(), 12);
+
+ filters = intersectionFilter.filters();
+ QCOMPARE(filters.count(), 12);
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::Union);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(4).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(5).type(), QGalleryFilter::MetaData);
+
+ intersectionFilter.replace(0, metaDataFilter);
+ intersectionFilter.replace(4, unionFilter);
+ QCOMPARE(intersectionFilter.isEmpty(), false);
+ QCOMPARE(intersectionFilter.filterCount(), 12);
+
+ filters = intersectionFilter.filters();
+ QCOMPARE(filters.count(), 12);
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(4).type(), QGalleryFilter::Union);
+ QCOMPARE(filters.at(5).type(), QGalleryFilter::MetaData);
+
+ intersectionFilter.remove(0);
+ intersectionFilter.remove(3);
+ QCOMPARE(intersectionFilter.isEmpty(), false);
+ QCOMPARE(intersectionFilter.filterCount(), 10);
+
+ filters = intersectionFilter.filters();
+ QCOMPARE(filters.count(), 10);
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::Union);
+ QCOMPARE(filters.at(3).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(4).type(), QGalleryFilter::Union);
+
+ intersectionFilter.clear();
+ QCOMPARE(intersectionFilter.isEmpty(), true);
+ QCOMPARE(intersectionFilter.filterCount(), 0);
+
+ filters = intersectionFilter.filters();
+ QCOMPARE(filters.count(), 0);
+
+ intersectionFilter.prepend(metaDataFilter);
+ intersectionFilter.prepend(metaDataFilter);
+ intersectionFilter.prepend(unionFilter);
+ intersectionFilter.prepend(metaDataFilter);
+ QCOMPARE(intersectionFilter.isEmpty(), false);
+ QCOMPARE(intersectionFilter.filterCount(), 4);
+
+ filters = intersectionFilter.filters();
+ QCOMPARE(filters.count(), 4);
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::Union);
+ QCOMPARE(filters.at(2).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(3).type(), QGalleryFilter::MetaData);
+
+ intersectionFilter.prepend(unionFilter && metaDataFilter);
+ QCOMPARE(intersectionFilter.isEmpty(), false);
+ QCOMPARE(intersectionFilter.filterCount(), 6);
+
+ filters = intersectionFilter.filters();
+ QCOMPARE(filters.count(), 6);
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::Union);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(2).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(3).type(), QGalleryFilter::Union);
+ QCOMPARE(filters.at(4).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(5).type(), QGalleryFilter::MetaData);
+}
+
+void tst_QGalleryFilter::assignment()
+{
+ QGalleryFilter filter;
+
+ QGalleryMetaDataFilter metaDataFilter;
+ QGalleryUnionFilter unionFilter;
+ QGalleryIntersectionFilter intersectionFilter;
+
+ QCOMPARE(filter.isValid(), false);
+ QCOMPARE(filter.type(), QGalleryFilter::Invalid);
+
+ filter = metaDataFilter;
+ QCOMPARE(filter.isValid(), true);
+ QCOMPARE(filter.type(), QGalleryFilter::MetaData);
+
+ filter = unionFilter;
+ QCOMPARE(filter.isValid(), true);
+ QCOMPARE(filter.type(), QGalleryFilter::Union);
+
+ filter = intersectionFilter;
+ QCOMPARE(filter.isValid(), true);
+ QCOMPARE(filter.type(), QGalleryFilter::Intersection);
+}
+
+void tst_QGalleryFilter::copy()
+{
+ QGalleryMetaDataFilter metaDataFilter;
+ QGalleryUnionFilter unionFilter;
+ QGalleryIntersectionFilter intersectionFilter;
+
+ {
+ QGalleryFilter filter(metaDataFilter);
+ QCOMPARE(filter.isValid(), true);
+ QCOMPARE(filter.type(), QGalleryFilter::MetaData);
+ } {
+ QGalleryFilter filter(unionFilter);
+ QCOMPARE(filter.isValid(), true);
+ QCOMPARE(filter.type(), QGalleryFilter::Union);
+ } {
+ QGalleryFilter filter(intersectionFilter);
+ QCOMPARE(filter.isValid(), true);
+ QCOMPARE(filter.type(), QGalleryFilter::Intersection);
+ }
+}
+
+void tst_QGalleryFilter::copyOnWrite()
+{
+ QList<QGalleryFilter> filters;
+
+ QGalleryMetaDataFilter metaDataFilter;
+ QGalleryUnionFilter unionFilter;
+ QGalleryIntersectionFilter intersectionFilter;
+
+ {
+ QGalleryMetaDataFilter filter;
+ filter.setPropertyName(QLatin1String("albumTitle"));
+ filter.setValue(QLatin1String("Greatest Hits"));
+ filter.setComparator(QGalleryFilter::EndsWith);
+ filter.setNegated(true);
+
+ metaDataFilter = filter;
+
+ QGalleryMetaDataFilter filterCopy(filter);
+ filter.setPropertyName(QLatin1String("artist"));
+ filter.setValue(QLatin1String("Self Titled"));
+ filter.setComparator(QGalleryFilter::StartsWith);
+
+ QCOMPARE(filterCopy.propertyName(), QLatin1String("albumTitle"));
+ QCOMPARE(filterCopy.value(), QVariant(QLatin1String("Greatest Hits")));
+ QCOMPARE(filterCopy.comparator(), QGalleryFilter::EndsWith);
+ QCOMPARE(filterCopy.isNegated(), true);
+
+ QCOMPARE(filter.propertyName(), QLatin1String("artist"));
+ QCOMPARE(filter.value(), QVariant(QLatin1String("Self Titled")));
+ QCOMPARE(filter.comparator(), QGalleryFilter::StartsWith);
+ QCOMPARE(filter.isNegated(), true);
+ } {
+ QGalleryUnionFilter filter;
+ filter.append(QGalleryMetaDataFilter());
+
+ unionFilter = filter;
+
+ QGalleryUnionFilter filterCopy(filter);
+ filter.append(QGalleryIntersectionFilter());
+ filter.append(filterCopy);
+ filter.remove(0);
+
+ filters = filterCopy.filters();
+ QCOMPARE(filters.count(), 1);
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::MetaData);
+
+ filters = filter.filters();
+ QCOMPARE(filters.count(), 2);
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::Intersection);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::MetaData);
+ } {
+ QGalleryIntersectionFilter filter;
+ filter.append(QGalleryMetaDataFilter());
+
+ intersectionFilter = filter;
+
+ QGalleryIntersectionFilter filterCopy(filter);
+ filter.append(QGalleryUnionFilter());
+ filter.append(filterCopy);
+ filter.remove(0);
+
+ filters = filterCopy.filters();
+ QCOMPARE(filters.count(), 1);
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::MetaData);
+
+ filters = filter.filters();
+ QCOMPARE(filters.count(), 2);
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::Union);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::MetaData);
+ }
+
+ QCOMPARE(metaDataFilter.propertyName(), QLatin1String("albumTitle"));
+ QCOMPARE(metaDataFilter.value(), QVariant(QLatin1String("Greatest Hits")));
+ QCOMPARE(metaDataFilter.comparator(), QGalleryFilter::EndsWith);
+ QCOMPARE(metaDataFilter.isNegated(), true);
+
+ filters = unionFilter.filters();
+ QCOMPARE(filters.count(), 1);
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::MetaData);
+
+ filters = intersectionFilter.filters();
+ QCOMPARE(filters.count(), 1);
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::MetaData);
+}
+
+void tst_QGalleryFilter::cast()
+{
+ QGalleryFilter metaDataFilter = QGalleryMetaDataFilter();
+ QGalleryFilter unionFilter = QGalleryUnionFilter();
+ QGalleryFilter intersectionFilter = QGalleryIntersectionFilter();
+
+ QCOMPARE(metaDataFilter.type(), QGalleryFilter::MetaData);
+ QCOMPARE(unionFilter.type(), QGalleryFilter::Union);
+ QCOMPARE(intersectionFilter.type(), QGalleryFilter::Intersection);
+
+ QCOMPARE(metaDataFilter.isValid(), true);
+ QCOMPARE(unionFilter.isValid(), true);
+ QCOMPARE(intersectionFilter.isValid(), true);
+
+ QCOMPARE(metaDataFilter.toMetaDataFilter().isValid(), true);
+ QCOMPARE(metaDataFilter.toUnionFilter().isValid(), false);
+ QCOMPARE(metaDataFilter.toIntersectionFilter().isValid(), false);
+
+ QCOMPARE(unionFilter.toMetaDataFilter().isValid(), false);
+ QCOMPARE(unionFilter.toUnionFilter().isValid(), true);
+ QCOMPARE(unionFilter.toIntersectionFilter().isValid(), false);
+
+ QCOMPARE(intersectionFilter.toMetaDataFilter().isValid(), false);
+ QCOMPARE(intersectionFilter.toUnionFilter().isValid(), false);
+ QCOMPARE(intersectionFilter.toIntersectionFilter().isValid(), true);
+
+ QCOMPARE(QGalleryFilter().toMetaDataFilter().isValid(), false);
+ QCOMPARE(QGalleryFilter().toUnionFilter().isValid(), false);
+ QCOMPARE(QGalleryFilter().toIntersectionFilter().isValid(), false);
+}
+
+void tst_QGalleryFilter::intersectionOperator()
+{
+ QList<QGalleryFilter> filters;
+
+ QGalleryMetaDataFilter metaDataFilter;
+ QGalleryUnionFilter unionFilter;
+ QGalleryIntersectionFilter intersectionFilter;
+
+ intersectionFilter = metaDataFilter && intersectionFilter;
+ QCOMPARE(intersectionFilter.isValid(), true);
+ QCOMPARE(intersectionFilter.isEmpty(), false);
+ QCOMPARE(intersectionFilter.filterCount(), 1);
+
+ filters = intersectionFilter.filters();
+ QCOMPARE(filters.count(), 1);
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::MetaData);
+
+ intersectionFilter = metaDataFilter && unionFilter;
+ QCOMPARE(intersectionFilter.isValid(), true);
+ QCOMPARE(intersectionFilter.isEmpty(), false);
+ QCOMPARE(intersectionFilter.filterCount(), 2);
+
+ filters = intersectionFilter.filters();
+ QCOMPARE(filters.count(), 2);
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::Union);
+
+ intersectionFilter = unionFilter && metaDataFilter;
+ QCOMPARE(intersectionFilter.isValid(), true);
+ QCOMPARE(intersectionFilter.isEmpty(), false);
+ QCOMPARE(intersectionFilter.filterCount(), 2);
+
+ filters = intersectionFilter.filters();
+ QCOMPARE(filters.count(), 2);
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::Union);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::MetaData);
+
+ intersectionFilter = intersectionFilter && metaDataFilter;
+ QCOMPARE(intersectionFilter.isValid(), true);
+ QCOMPARE(intersectionFilter.isEmpty(), false);
+ QCOMPARE(intersectionFilter.filterCount(), 3);
+
+ filters = intersectionFilter.filters();
+ QCOMPARE(filters.count(), 3);
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::Union);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(2).type(), QGalleryFilter::MetaData);
+}
+
+void tst_QGalleryFilter::unionOperator()
+{
+ QList<QGalleryFilter> filters;
+
+ QGalleryMetaDataFilter metaDataFilter;
+ QGalleryIntersectionFilter intersectionFilter;
+ QGalleryUnionFilter unionFilter;
+
+ unionFilter = metaDataFilter || unionFilter;
+ QCOMPARE(unionFilter.isValid(), true);
+ QCOMPARE(unionFilter.isEmpty(), false);
+ QCOMPARE(unionFilter.filterCount(), 1);
+
+ filters = unionFilter.filters();
+ QCOMPARE(filters.count(), 1);
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::MetaData);
+
+ unionFilter = metaDataFilter || intersectionFilter;
+ QCOMPARE(unionFilter.isValid(), true);
+ QCOMPARE(unionFilter.isEmpty(), false);
+ QCOMPARE(unionFilter.filterCount(), 2);
+
+ filters = unionFilter.filters();
+ QCOMPARE(filters.count(), 2);
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::Intersection);
+
+ unionFilter = intersectionFilter || metaDataFilter;
+ QCOMPARE(unionFilter.isValid(), true);
+ QCOMPARE(unionFilter.isEmpty(), false);
+ QCOMPARE(unionFilter.filterCount(), 2);
+
+ filters = unionFilter.filters();
+ QCOMPARE(filters.count(), 2);
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::Intersection);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::MetaData);
+
+ unionFilter = unionFilter || metaDataFilter;
+ QCOMPARE(unionFilter.isValid(), true);
+ QCOMPARE(unionFilter.isEmpty(), false);
+ QCOMPARE(unionFilter.filterCount(), 3);
+
+ filters = unionFilter.filters();
+ QCOMPARE(filters.count(), 3);
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::Intersection);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(2).type(), QGalleryFilter::MetaData);
+}
+
+void tst_QGalleryFilter::intersectionStreamOperator()
+{
+ QGalleryMetaDataFilter metaDataFilter;
+ QGalleryUnionFilter unionFilter;
+
+ QGalleryIntersectionFilter intersectionFilter = QGalleryIntersectionFilter()
+ << metaDataFilter
+ << metaDataFilter
+ << unionFilter
+ << metaDataFilter;
+
+ QCOMPARE(intersectionFilter.isEmpty(), false);
+ QCOMPARE(intersectionFilter.filterCount(), 4);
+
+ QList<QGalleryFilter> filters = intersectionFilter.filters();
+ QCOMPARE(filters.count(), 4);
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(2).type(), QGalleryFilter::Union);
+ QCOMPARE(filters.at(3).type(), QGalleryFilter::MetaData);
+}
+
+void tst_QGalleryFilter::unionStreamOperator()
+{
+ QGalleryMetaDataFilter metaDataFilter;
+ QGalleryIntersectionFilter intersectionFilter;
+
+ QGalleryUnionFilter unionFilter = QGalleryUnionFilter()
+ <<metaDataFilter
+ <<metaDataFilter
+ <<intersectionFilter
+ <<metaDataFilter;
+
+ QCOMPARE(unionFilter.isEmpty(), false);
+ QCOMPARE(unionFilter.filterCount(), 4);
+
+ QList<QGalleryFilter> filters = unionFilter.filters();
+ QCOMPARE(filters.count(), 4);
+
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(2).type(), QGalleryFilter::Intersection);
+ QCOMPARE(filters.at(3).type(), QGalleryFilter::MetaData);
+}
+
+void tst_QGalleryFilter::propertyOperators_data()
+{
+ QTest::addColumn<QGalleryMetaDataFilter>("filter");
+ QTest::addColumn<QString>("propertyName");
+ QTest::addColumn<QVariant>("value");
+ QTest::addColumn<QGalleryFilter::Comparator>("comparator");
+
+ const QGalleryProperty albumTitle = {"albumTitle", sizeof("albumTitle")};
+ const QGalleryProperty trackNumber = {"trackNumber", sizeof("trackNumber")};
+
+ QTest::newRow("albumTitle == Self Titled")
+ << (albumTitle == QLatin1String("Self Titled"))
+ << "albumTitle"
+ << QVariant(QLatin1String("Self Titled"))
+ << QGalleryFilter::Equals;
+
+ QTest::newRow("trackNumber >= 3")
+ << (trackNumber >= 3)
+ << "trackNumber"
+ << QVariant(3)
+ << QGalleryFilter::GreaterThanEquals;
+
+ QTest::newRow("trackNumber > 3")
+ << (trackNumber > 3)
+ << "trackNumber"
+ << QVariant(3)
+ << QGalleryFilter::GreaterThan;
+
+ QTest::newRow("trackNumber <= 3")
+ << (trackNumber <= 3)
+ << "trackNumber"
+ << QVariant(3)
+ << QGalleryFilter::LessThanEquals;
+
+ QTest::newRow("trackNumber < 3")
+ << (trackNumber < 3)
+ << "trackNumber"
+ << QVariant(3)
+ << QGalleryFilter::LessThan;
+
+ QTest::newRow("albumTitle.contains(lf Titl)")
+ << albumTitle.contains(QLatin1String("lf Titl"))
+ << "albumTitle"
+ << QVariant(QLatin1String("lf Titl"))
+ << QGalleryFilter::Contains;
+
+ QTest::newRow("albumTitle.startsWith(Self)")
+ << albumTitle.startsWith(QLatin1String("Self"))
+ << "albumTitle"
+ << QVariant(QLatin1String("Self"))
+ << QGalleryFilter::StartsWith;
+
+ QTest::newRow("albumTitle.endsWith(Self)")
+ << albumTitle.endsWith(QLatin1String("Titled"))
+ << "albumTitle"
+ << QVariant(QLatin1String("Titled"))
+ << QGalleryFilter::EndsWith;
+
+ QTest::newRow("albumTitle.wildcard(S*f T*d)")
+ << albumTitle.wildcard(QLatin1String("S*f T*d"))
+ << "albumTitle"
+ << QVariant(QLatin1String("S*f T*d"))
+ << QGalleryFilter::Wildcard;
+
+ QTest::newRow("albumTitle.regExp((Self Titled|Greatest Hits))")
+ << albumTitle.regExp(QLatin1String("(Self Titled|Greatest Hits)"))
+ << "albumTitle"
+ << QVariant(QLatin1String("(Self Titled|Greatest Hits)"))
+ << QGalleryFilter::RegExp;
+
+ QTest::newRow("albumTitle.regExp(QRegExp((Self Titled|Greatest Hits)))")
+ << albumTitle.regExp(QRegExp(QLatin1String("(Self Titled|Greatest Hits)")))
+ << "albumTitle"
+ << QVariant(QRegExp(QLatin1String("(Self Titled|Greatest Hits)")))
+ << QGalleryFilter::RegExp;
+}
+
+void tst_QGalleryFilter::propertyOperators()
+{
+ QFETCH(QGalleryMetaDataFilter, filter);
+ QFETCH(QString, propertyName);
+ QFETCH(QVariant, value);
+ QFETCH(QGalleryFilter::Comparator, comparator);
+
+ QCOMPARE(filter.isValid(), true);
+ QCOMPARE(filter.propertyName(), propertyName);
+ QCOMPARE(filter.value(), value);
+ QCOMPARE(filter.comparator(), comparator);
+}
+
+void tst_QGalleryFilter::equality_data()
+{
+ const QGalleryProperty albumProperty = {"albumTitle", sizeof("albumTitle")};
+ const QGalleryProperty artistProperty = {"artistTitle", sizeof("artistTitle>")};
+ const QGalleryProperty durationProperty = {"duration", sizeof("duration")};
+ const QGalleryProperty trackProperty = {"trackNumber", sizeof("trackNumber")};
+
+ QGalleryMetaDataFilter metaDataFilter = albumProperty == QLatin1String("Greatest Hits");
+ QGalleryMetaDataFilter metaDataRangeFilter = durationProperty < 12000;
+ QGalleryIntersectionFilter unionFilter
+ = metaDataFilter
+ && artistProperty == QLatin1String("Them")
+ && metaDataRangeFilter;
+ QGalleryUnionFilter intersectionFilter
+ = unionFilter || albumProperty == QLatin1String("Self Titled");
+
+ QTest::addColumn<QGalleryFilter>("filter1");
+ QTest::addColumn<QGalleryFilter>("filter2");
+ QTest::addColumn<bool>("isEqual");
+
+ QTest::newRow("null filters")
+ << QGalleryFilter()
+ << QGalleryFilter()
+ << true;
+ QTest::newRow("null meta-data filters")
+ << QGalleryFilter(QGalleryMetaDataFilter())
+ << QGalleryFilter(QGalleryMetaDataFilter())
+ << true;
+ QTest::newRow("null union filters")
+ << QGalleryFilter(QGalleryUnionFilter())
+ << QGalleryFilter(QGalleryUnionFilter())
+ << true;
+ QTest::newRow("null intersection filters")
+ << QGalleryFilter(QGalleryIntersectionFilter())
+ << QGalleryFilter(QGalleryIntersectionFilter())
+ << true;
+
+ QTest::newRow("same meta-data filter")
+ << QGalleryFilter(metaDataFilter)
+ << QGalleryFilter(metaDataFilter)
+ << true;
+ QTest::newRow("same union filter")
+ << QGalleryFilter(unionFilter)
+ << QGalleryFilter(unionFilter)
+ << true;
+ QTest::newRow("same intersection filter")
+ << QGalleryFilter(intersectionFilter)
+ << QGalleryFilter(intersectionFilter)
+ << true;
+
+ QTest::newRow("equal meta-data filters")
+ << QGalleryFilter(albumProperty == QLatin1String("Self Titled"))
+ << QGalleryFilter(albumProperty == QLatin1String("Self Titled"))
+ << true;
+ QTest::newRow("equal meta-data range filters")
+ << QGalleryFilter(trackProperty < 14)
+ << QGalleryFilter(trackProperty < 14)
+ << true;
+ QTest::newRow("equal union filters")
+ << QGalleryFilter(durationProperty > 10000 && metaDataFilter)
+ << QGalleryFilter(durationProperty > 10000 && metaDataFilter)
+ << true;
+ QTest::newRow("equal intersection filters")
+ << QGalleryFilter(metaDataFilter || albumProperty == QLatin1String("Self Titled"))
+ << QGalleryFilter(metaDataFilter || albumProperty == QLatin1String("Self Titled"))
+ << true;
+
+ QTest::newRow("unequal meta-data filter property names")
+ << QGalleryFilter(albumProperty == QLatin1String("Self Titled"))
+ << QGalleryFilter(artistProperty == QLatin1String("Self Titled"))
+ << false;
+ QTest::newRow("unequal meta-data filter values")
+ << QGalleryFilter(albumProperty == QLatin1String("Self Titled"))
+ << QGalleryFilter(albumProperty == QLatin1String("Greatest Hits"))
+ << false;
+ QTest::newRow("unequal meta-data filter match flags")
+ << QGalleryFilter(albumProperty.contains(QLatin1String("Self Titled")))
+ << QGalleryFilter(albumProperty == QLatin1String("Self Titled"))
+ << false;
+ QTest::newRow("unequal meta-data filters")
+ << QGalleryFilter(albumProperty.contains(QLatin1String("Greatest Hits")))
+ << QGalleryFilter(artistProperty == QLatin1String("Self Titled"))
+ << false;
+
+ QTest::newRow("uneuqal meta-data filter property names (less than)")
+ << QGalleryFilter(trackProperty < 15)
+ << QGalleryFilter(durationProperty < 15)
+ << false;
+ QTest::newRow("uneuqal meta-data filter property names (greater than")
+ << QGalleryFilter(trackProperty > 15)
+ << QGalleryFilter(durationProperty > 15)
+ << false;
+ QTest::newRow("unequal meta-data filter values (less than)")
+ << QGalleryFilter(trackProperty < 16)
+ << QGalleryFilter(trackProperty < 4)
+ << false;
+ QTest::newRow("unequal meta-data filter values (greater than)")
+ << QGalleryFilter(trackProperty > 15)
+ << QGalleryFilter(trackProperty > 3)
+ << false;
+ QTest::newRow("unequal meta-data filter comparison (less than")
+ << QGalleryFilter(trackProperty < 15)
+ << QGalleryFilter(trackProperty <= 15)
+ << false;
+ QTest::newRow("unequal meta-data filter comparison (greater than")
+ << QGalleryFilter(trackProperty > 15)
+ << QGalleryFilter(trackProperty >= 15)
+ << false;
+ QTest::newRow("unequal meta-data filter comparison (mixed")
+ << QGalleryFilter(trackProperty > 15)
+ << QGalleryFilter(trackProperty <= 15)
+ << false;
+ QTest::newRow("unequal meta-data filter")
+ << QGalleryFilter(trackProperty < 3)
+ << QGalleryFilter(durationProperty >= 23004)
+ << false;
+ QTest::newRow("unequal meta-data filter (negated")
+ << QGalleryFilter(metaDataFilter)
+ << QGalleryFilter(!metaDataFilter)
+ << false;
+ QTest::newRow("unequal union filter count")
+ << QGalleryFilter(unionFilter)
+ << QGalleryFilter(unionFilter && metaDataFilter)
+ << false;
+ QTest::newRow("unequal union filter")
+ << QGalleryFilter(albumProperty == QLatin1String("Self Titled")
+ && artistProperty == QLatin1String("Self Titled"))
+ << QGalleryFilter(albumProperty == QLatin1String("Greatest Hits")
+ && artistProperty == QLatin1String("Self Titled"))
+ << false;
+
+ QTest::newRow("unequal intersection filter count")
+ << QGalleryFilter(intersectionFilter)
+ << QGalleryFilter(intersectionFilter || metaDataFilter)
+ << false;
+ QTest::newRow("unequal intersection filter")
+ << QGalleryFilter(albumProperty == QLatin1String("Self Titled")
+ || artistProperty == QLatin1String("Self Titled"))
+ << QGalleryFilter(albumProperty == QLatin1String("Greatest Hits")
+ || artistProperty == QLatin1String("Self Titled"))
+ << false;
+
+ QTest::newRow("null filter != null meta data filter")
+ << QGalleryFilter()
+ << QGalleryFilter(QGalleryMetaDataFilter())
+ << false;
+ QTest::newRow("null filter != null union filter")
+ << QGalleryFilter()
+ << QGalleryFilter(QGalleryUnionFilter())
+ << false;
+ QTest::newRow("null filter != null intersection filter")
+ << QGalleryFilter()
+ << QGalleryFilter(QGalleryIntersectionFilter())
+ << false;
+
+ QTest::newRow("null filter != populated meta data filter")
+ << QGalleryFilter()
+ << QGalleryFilter(metaDataFilter)
+ << false;
+ QTest::newRow("null filter != populated union filter")
+ << QGalleryFilter()
+ << QGalleryFilter(unionFilter)
+ << false;
+ QTest::newRow("null filter != populated intersection filter")
+ << QGalleryFilter()
+ << QGalleryFilter(intersectionFilter)
+ << false;
+
+ QTest::newRow("null meta-data filter != populated meta data filter")
+ << QGalleryFilter(QGalleryMetaDataFilter())
+ << QGalleryFilter(metaDataFilter)
+ << false;
+ QTest::newRow("null union filter != populated union filter")
+ << QGalleryFilter(QGalleryUnionFilter())
+ << QGalleryFilter(unionFilter)
+ << false;
+ QTest::newRow("null intersection filter != populated intersection filter")
+ << QGalleryFilter(QGalleryIntersectionFilter())
+ << QGalleryFilter(intersectionFilter)
+ << false;
+ QTest::newRow("null meta-data filter != null union filter")
+ << QGalleryFilter(QGalleryMetaDataFilter())
+ << QGalleryFilter(QGalleryUnionFilter())
+ << false;
+ QTest::newRow("null meta-data filter != null intersection filter")
+ << QGalleryFilter(QGalleryMetaDataFilter())
+ << QGalleryFilter(QGalleryIntersectionFilter())
+ << false;
+ QTest::newRow("null union filter != null intersection filter")
+ << QGalleryFilter(QGalleryUnionFilter())
+ << QGalleryFilter(QGalleryIntersectionFilter())
+ << false;
+}
+
+void tst_QGalleryFilter::equality()
+{
+ QFETCH(QGalleryFilter, filter1);
+ QFETCH(QGalleryFilter, filter2);
+ QFETCH(bool, isEqual);
+
+ QCOMPARE(filter1 == filter2, isEqual);
+ QCOMPARE(filter2 == filter1, isEqual);
+}
+
+void tst_QGalleryFilter::inequality_data()
+{
+ equality_data();
+}
+
+void tst_QGalleryFilter::inequality()
+{
+ QFETCH(QGalleryFilter, filter1);
+ QFETCH(QGalleryFilter, filter2);
+ QFETCH(bool, isEqual);
+
+ QCOMPARE(filter1 != filter2, !isEqual);
+ QCOMPARE(filter2 != filter1, !isEqual);
+}
+
+#ifndef QT_NO_DEBUG_STREAM
+
+#define TST_QGALLERYMETADATAFILTER_DEBUG_TEXT "QGalleryMetaDataFilter(" \
+ "propertyName: \"title\" " \
+ "comparator: 6 " \
+ "value: QVariant(QString, \"Greatest\") ) "
+
+void tst_QGalleryFilter::debugMessage_data()
+{
+ QTest::addColumn<QGalleryFilter>("filter");
+ QTest::addColumn<QByteArray>("message");
+
+ QTest::newRow("null QGalleryFilter")
+ << QGalleryFilter(QGalleryFilter())
+ << QByteArray("QGalleryFilter()");
+ QTest::newRow("null QGalleryMetaDataFilter")
+ << QGalleryFilter(QGalleryMetaDataFilter())
+ << QByteArray("QGalleryMetaDataFilter(comparator: 0)");
+ QTest::newRow("null QGalleryUnionFilter")
+ << QGalleryFilter(QGalleryUnionFilter())
+ << QByteArray("QGalleryUnionFilter()");
+ QTest::newRow("null QGalleryIntersectionFilter")
+ << QGalleryFilter(QGalleryIntersectionFilter())
+ << QByteArray("QGalleryIntersectionFilter()");
+
+ QGalleryMetaDataFilter metaDataFilter;
+ metaDataFilter.setPropertyName(QLatin1String("title"));
+ metaDataFilter.setValue(QLatin1String("Greatest"));
+ metaDataFilter.setComparator(QGalleryFilter::StartsWith);
+
+ QTest::newRow("Populated QGalleryMetaDataFilter")
+ << QGalleryFilter(metaDataFilter)
+ << QByteArray(TST_QGALLERYMETADATAFILTER_DEBUG_TEXT);
+
+ QTest::newRow("Inverse Populated QGallleryMetaDataFilter")
+ << QGalleryFilter(!metaDataFilter)
+ << QByteArray("!"TST_QGALLERYMETADATAFILTER_DEBUG_TEXT);
+
+ QGalleryUnionFilter unionFilter;
+ unionFilter.append(metaDataFilter);
+
+ QTest::newRow("Single Child QGalleryUnionFilter")
+ << QGalleryFilter(unionFilter)
+ << QByteArray("QGalleryUnionFilter("
+ TST_QGALLERYMETADATAFILTER_DEBUG_TEXT
+ ") ");
+
+ QGalleryIntersectionFilter intersectionFilter;
+ intersectionFilter.append(metaDataFilter);
+
+ QTest::newRow("Single Child QGalleryIntersectionFilter")
+ << QGalleryFilter(intersectionFilter)
+ << QByteArray("QGalleryIntersectionFilter("
+ TST_QGALLERYMETADATAFILTER_DEBUG_TEXT
+ ") ");
+
+ unionFilter.append(!metaDataFilter);
+
+ QTest::newRow("Multiple Child QGalleryUnionFilter")
+ << QGalleryFilter(unionFilter)
+ << QByteArray("QGalleryUnionFilter("
+ TST_QGALLERYMETADATAFILTER_DEBUG_TEXT
+ " && "
+ "!"TST_QGALLERYMETADATAFILTER_DEBUG_TEXT
+ ") ");
+
+ intersectionFilter.append(!metaDataFilter);
+
+ QTest::newRow("Multiple Child QGalleryIntersectionFilter")
+ << QGalleryFilter(intersectionFilter)
+ << QByteArray("QGalleryIntersectionFilter("
+ TST_QGALLERYMETADATAFILTER_DEBUG_TEXT
+ " || "
+ "!"TST_QGALLERYMETADATAFILTER_DEBUG_TEXT
+ ") ");
+}
+
+#undef TST_QGALLERYMETADATAFILTER_DEBUG_TEXT
+
+void tst_QGalleryFilter::debugMessage()
+{
+ QFETCH(QGalleryFilter, filter);
+ QFETCH(QByteArray, message);
+
+ QTest::ignoreMessage(QtDebugMsg, message.constData());
+ qDebug() << filter;
+}
+#endif
+
+void tst_QGalleryFilter::galleryType()
+{
+ {
+ QGalleryType type = { "Audio", sizeof("Audio") - 1 };
+
+ const QString name = QLatin1String("Audio");
+
+ QCOMPARE(type.name(), name);
+ QCOMPARE(QString(type), name);
+ } {
+ QGalleryType type = { "Video", sizeof("Video") - 1 };
+
+ const QString name = QLatin1String("Video");
+
+ QCOMPARE(type.name(), name);
+ QCOMPARE(QString(type), name);
+ }
+}
+
+void tst_QGalleryFilter::galleryProperty()
+{
+ {
+ QGalleryProperty property = { "title", sizeof("title") - 1 };
+
+ const QString name = QLatin1String("title");
+ const QString ascendingName = QLatin1String("+title");
+ const QString descendingName = QLatin1String("-title");
+
+ QCOMPARE(property.name(), name);
+ QCOMPARE(QString(property), name);
+ QCOMPARE(property.ascending(), ascendingName);
+ QCOMPARE(property.descending(), descendingName);
+ } {
+ QGalleryProperty property = { "duration", sizeof("duration") - 1 };
+
+ const QString name = QLatin1String("duration");
+ const QString ascendingName = QLatin1String("+duration");
+ const QString descendingName = QLatin1String("-duration");
+
+ QCOMPARE(property.name(), name);
+ QCOMPARE(QString(property), name);
+ QCOMPARE(property.ascending(), ascendingName);
+ QCOMPARE(property.descending(), descendingName);
+ }
+}
+
+/* Test case for insert QGalleryIntersectionFilter */
+ void tst_QGalleryFilter::intersectionFilterInsert()
+ {
+ QGalleryIntersectionFilter intersectionFilter;
+
+ QGalleryMetaDataFilter metaDataFilter;
+ QGalleryUnionFilter unionFilter;
+
+ QCOMPARE(intersectionFilter.isValid(), true);
+ QCOMPARE(intersectionFilter.isEmpty(), true);
+ QCOMPARE(intersectionFilter.filterCount(), 0);
+
+ intersectionFilter.append(metaDataFilter);
+ intersectionFilter.append(unionFilter);
+ intersectionFilter.append(metaDataFilter);
+
+ QCOMPARE(intersectionFilter.filterCount(), 3);
+
+ QList<QGalleryFilter>filters = intersectionFilter.filters();
+ QCOMPARE(filters.count(), 3);
+
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::Union);
+ QCOMPARE(filters.at(2).type(), QGalleryFilter::MetaData);
+
+ intersectionFilter.insert(1,intersectionFilter);
+ filters = intersectionFilter.filters();
+ QCOMPARE(filters.count(), 6);
+
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(2).type(), QGalleryFilter::Union);
+ QCOMPARE(filters.at(3).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(4).type(), QGalleryFilter::Union);
+ QCOMPARE(filters.at(5).type(), QGalleryFilter::MetaData);
+
+ QGalleryIntersectionFilter intersectionFilter1;
+
+ QCOMPARE(intersectionFilter1.isEmpty(), true);
+ intersectionFilter.insert(1,intersectionFilter1);
+ filters = intersectionFilter.filters();
+ QCOMPARE(filters.count(), 6);
+
+
+ }
+
+/* Test case for insert QGalleryIntersectionFilter */
+ void tst_QGalleryFilter::intersectionFilterPrepend()
+ {
+ QGalleryIntersectionFilter intersectionFilter;
+
+ QGalleryMetaDataFilter metaDataFilter;
+ QGalleryUnionFilter unionFilter;
+
+ QCOMPARE(intersectionFilter.isValid(), true);
+ QCOMPARE(intersectionFilter.isEmpty(), true);
+ QCOMPARE(intersectionFilter.filterCount(), 0);
+
+ intersectionFilter.append(metaDataFilter);
+ intersectionFilter.append(unionFilter);
+ intersectionFilter.append(metaDataFilter);
+
+ QCOMPARE(intersectionFilter.filterCount(), 3);
+
+ QList<QGalleryFilter>filters = intersectionFilter.filters();
+ QCOMPARE(filters.count(), 3);
+
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::Union);
+ QCOMPARE(filters.at(2).type(), QGalleryFilter::MetaData);
+
+ intersectionFilter.prepend(intersectionFilter);
+ filters = intersectionFilter.filters();
+ QCOMPARE(filters.count(), 6);
+
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::Union);
+ QCOMPARE(filters.at(2).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(3).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(4).type(), QGalleryFilter::Union);
+ QCOMPARE(filters.at(5).type(), QGalleryFilter::MetaData);
+
+ QGalleryIntersectionFilter intersectionFilter1;
+
+ QCOMPARE(intersectionFilter1.isEmpty(), true);
+ intersectionFilter.prepend(intersectionFilter1);
+ filters = intersectionFilter.filters();
+ QCOMPARE(filters.count(), 6);
+
+ }
+
+
+ /* Test case for insert QGalleryUnionFilter */
+ void tst_QGalleryFilter::unionFilterInsert()
+ {
+ QGalleryIntersectionFilter intersectionFilter;
+
+ QGalleryMetaDataFilter metaDataFilter;
+ QGalleryUnionFilter unionFilter;
+
+ QCOMPARE(unionFilter.isValid(), true);
+ QCOMPARE(unionFilter.isEmpty(), true);
+ QCOMPARE(unionFilter.filterCount(), 0);
+
+ unionFilter.append(metaDataFilter);
+ unionFilter.append(intersectionFilter);
+ unionFilter.append(metaDataFilter);
+
+ QCOMPARE(unionFilter.filterCount(), 3);
+
+ QList<QGalleryFilter>filters = unionFilter.filters();
+ QCOMPARE(filters.count(), 3);
+
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::Intersection);
+ QCOMPARE(filters.at(2).type(), QGalleryFilter::MetaData);
+
+ unionFilter.insert(1,unionFilter);
+ filters = unionFilter.filters();
+ QCOMPARE(filters.count(), 6);
+
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(2).type(), QGalleryFilter::Intersection);
+ QCOMPARE(filters.at(3).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(4).type(), QGalleryFilter::Intersection);
+ QCOMPARE(filters.at(5).type(), QGalleryFilter::MetaData);
+
+ QGalleryUnionFilter unionFilter1;
+
+ QCOMPARE(unionFilter1.isEmpty(), true);
+ unionFilter.insert(1,unionFilter1);
+ filters = unionFilter.filters();
+ QCOMPARE(filters.count(), 6);
+
+
+ }
+
+ /* Test case for Prepend QGalleryUnionFilter */
+ void tst_QGalleryFilter::unionFilterPrepend()
+ {
+ QGalleryIntersectionFilter intersectionFilter;
+
+ QGalleryMetaDataFilter metaDataFilter;
+ QGalleryUnionFilter unionFilter;
+
+ QCOMPARE(unionFilter.isValid(), true);
+ QCOMPARE(unionFilter.isEmpty(), true);
+ QCOMPARE(unionFilter.filterCount(), 0);
+
+ unionFilter.append(metaDataFilter);
+ unionFilter.append(intersectionFilter);
+ unionFilter.append(metaDataFilter);
+
+ QCOMPARE(unionFilter.filterCount(), 3);
+
+ QList<QGalleryFilter>filters = unionFilter.filters();
+ QCOMPARE(filters.count(), 3);
+
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::Intersection);
+ QCOMPARE(filters.at(2).type(), QGalleryFilter::MetaData);
+
+ unionFilter.prepend(unionFilter);
+ filters = unionFilter.filters();
+ QCOMPARE(filters.count(), 6);
+
+ QCOMPARE(filters.at(0).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(1).type(), QGalleryFilter::Intersection);
+ QCOMPARE(filters.at(2).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(3).type(), QGalleryFilter::MetaData);
+ QCOMPARE(filters.at(4).type(), QGalleryFilter::Intersection);
+ QCOMPARE(filters.at(5).type(), QGalleryFilter::MetaData);
+
+ QGalleryUnionFilter unionFilter1;
+
+ QCOMPARE(unionFilter1.isEmpty(), true);
+ unionFilter.prepend(unionFilter1);
+ filters = unionFilter.filters();
+ QCOMPARE(filters.count(), 6);
+
+ }
+
+
+QTEST_MAIN(tst_QGalleryFilter)
+
+#include "tst_qgalleryfilter.moc"
diff --git a/tests/auto/qgalleryitemrequest/qgalleryitemrequest.pro b/tests/auto/qgalleryitemrequest/qgalleryitemrequest.pro
new file mode 100644
index 0000000..3a7002e
--- /dev/null
+++ b/tests/auto/qgalleryitemrequest/qgalleryitemrequest.pro
@@ -0,0 +1,3 @@
+include(../auto.pri)
+
+SOURCES += tst_qgalleryitemrequest.cpp
diff --git a/tests/auto/qgalleryitemrequest/tst_qgalleryitemrequest.cpp b/tests/auto/qgalleryitemrequest/tst_qgalleryitemrequest.cpp
new file mode 100644
index 0000000..761cbb8
--- /dev/null
+++ b/tests/auto/qgalleryitemrequest/tst_qgalleryitemrequest.cpp
@@ -0,0 +1,555 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDocGallery module 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$
+**
+****************************************************************************/
+
+//TESTED_COMPONENT=src/gallery
+
+#include <qgalleryitemrequest.h>
+
+#include <qabstractgallery.h>
+#include <qgalleryabstractresponse.h>
+#include <qgalleryresultset.h>
+#include <qgalleryresource.h>
+#include <qgallerytype.h>
+
+#include <QtTest/QtTest>
+
+Q_DECLARE_METATYPE(QList<int>)
+Q_DECLARE_METATYPE(QGalleryResultSet*)
+
+class tst_QGalleryItemRequest : public QObject
+{
+ Q_OBJECT
+public Q_SLOTS:
+ void initTestCase();
+
+private Q_SLOTS:
+ void propertyNames();
+ void autoUpdate();
+ void itemId();
+ void executeSynchronous();
+ void executeAsynchronous();
+ void noResponse();
+ void multipleResults();
+};
+
+class QtGalleryTestResponse : public QGalleryResultSet
+{
+ Q_OBJECT
+public:
+ QtGalleryTestResponse(
+ const QStringList &propertyNames,
+ int count,
+ QGalleryAbstractRequest::State state,
+ int error,
+ const QString &errorString)
+ : m_count(count)
+ , m_currentIndex(-1)
+ , m_propertyNames(propertyNames)
+ {
+ m_propertyNames.removeAll(QLatin1String("turtle"));
+
+ if (error != QGalleryAbstractRequest::NoError)
+ QGalleryAbstractResponse::error(error, errorString);
+ else if (state == QGalleryAbstractRequest::Finished)
+ finish();
+ else if (state == QGalleryAbstractRequest::Idle)
+ finish(true);
+ }
+
+ int propertyKey(const QString &propertyName) const {
+ return m_propertyNames.indexOf(propertyName); }
+ QGalleryProperty::Attributes propertyAttributes(int) const {
+ return QGalleryProperty::CanRead | QGalleryProperty::CanWrite; }
+ QVariant::Type propertyType(int) const { return QVariant::String; }
+
+ int itemCount() const { return m_count; }
+
+ int currentIndex() const { return m_currentIndex; }
+
+ bool fetch(int index)
+ {
+ emit currentIndexChanged(m_currentIndex = index);
+ emit currentItemChanged();
+
+ return isValid();
+ }
+
+ QVariant itemId() const { return isValid() ? QVariant(1) : QVariant(); }
+ QUrl itemUrl() const { return isValid() ? QUrl("http://example.com") : QUrl(); }
+ QString itemType() const { return isValid() ? QLatin1String("WebPage") : QString(); }
+
+ QVariant metaData(int key) const { return isValid() ? m_metaData.value(key) : QVariant(); }
+ bool setMetaData(int key, const QVariant &value)
+ {
+ if (isValid()) {
+ m_metaData.insert(key, value);
+ emit metaDataChanged(m_currentIndex, 1, QList<int>() << key);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ void setCount(int count) { m_count = count; }
+
+ using QGalleryResultSet::finish;
+ using QGalleryResultSet::resume;
+ using QGalleryResultSet::cancel;
+ using QGalleryResultSet::error;
+ using QGalleryResultSet::itemsInserted;
+ using QGalleryResultSet::itemsRemoved;
+ using QGalleryResultSet::itemsMoved;
+ using QGalleryResultSet::metaDataChanged;
+
+private:
+ int m_count;
+ int m_currentIndex;
+ QStringList m_propertyNames;
+ QHash<int, QVariant> m_metaData;
+};
+
+class QtTestGallery : public QAbstractGallery
+{
+public:
+ QtTestGallery()
+ : m_count(0)
+ , m_state(QGalleryAbstractRequest::Active)
+ , m_error(QGalleryAbstractRequest::NoError)
+ {}
+
+ bool isRequestSupported(QGalleryAbstractRequest::RequestType type) const {
+ return type == QGalleryAbstractRequest::ItemRequest; }
+
+ void setState(QGalleryAbstractRequest::State state) { m_state = state; }
+ void setError(int error, const QString &errorString) {
+ m_error = error; m_errorString = errorString; }
+
+ void setCount(int count) { m_count = count; }
+
+protected:
+ QGalleryAbstractResponse *createResponse(QGalleryAbstractRequest *request)
+ {
+ if (request->type() == QGalleryAbstractRequest::ItemRequest) {
+ return new QtGalleryTestResponse(
+ static_cast<QGalleryItemRequest *>(request)->propertyNames(),
+ m_count,
+ m_state,
+ m_error,
+ m_errorString);
+ }
+ return 0;
+ }
+
+private:
+ int m_count;
+ QGalleryAbstractRequest::State m_state;
+ int m_error;
+ QString m_errorString;
+};
+
+void tst_QGalleryItemRequest::initTestCase()
+{
+ qRegisterMetaType<QGalleryResultSet*>();
+ qRegisterMetaType<QList<int> >();
+}
+
+void tst_QGalleryItemRequest::propertyNames()
+{
+ const QGalleryProperty titleProperty = {"title", sizeof("title")};
+ const QGalleryProperty artistProperty = {"artist", sizeof("artist")};
+
+ const QStringList propertyNames = QStringList()
+ << titleProperty
+ << artistProperty.name()
+ << QLatin1String("album")
+ << QLatin1String("trackNumber");
+
+ QGalleryItemRequest request;
+
+ QSignalSpy spy(&request, SIGNAL(propertyNamesChanged()));
+
+ QCOMPARE(request.propertyNames(), QStringList());
+
+ request.setPropertyNames(QStringList());
+ QCOMPARE(request.propertyNames(), QStringList());
+ QCOMPARE(spy.count(), 0);
+
+ request.setPropertyNames(propertyNames);
+ QCOMPARE(request.propertyNames(), propertyNames);
+ QCOMPARE(spy.count(), 1);
+
+ request.setPropertyNames(propertyNames);
+ QCOMPARE(request.propertyNames(), propertyNames);
+ QCOMPARE(spy.count(), 1);
+
+ request.setPropertyNames(QStringList());
+ QCOMPARE(request.propertyNames(), QStringList());
+ QCOMPARE(spy.count(), 2);
+}
+
+void tst_QGalleryItemRequest::autoUpdate()
+{
+ QGalleryItemRequest request;
+
+ QSignalSpy spy(&request, SIGNAL(autoUpdateChanged()));
+
+ QCOMPARE(request.autoUpdate(), false);
+
+ request.setAutoUpdate(false);
+ QCOMPARE(request.autoUpdate(), false);
+ QCOMPARE(spy.count(), 0);
+
+ request.setAutoUpdate(true);
+ QCOMPARE(request.autoUpdate(), true);
+ QCOMPARE(spy.count(), 1);
+
+ request.setAutoUpdate(true);
+ QCOMPARE(request.autoUpdate(), true);
+ QCOMPARE(spy.count(), 1);
+
+ request.setAutoUpdate(false);
+ QCOMPARE(request.autoUpdate(), false);
+ QCOMPARE(spy.count(), 2);
+}
+
+void tst_QGalleryItemRequest::itemId()
+{
+ QGalleryItemRequest request;
+
+ QSignalSpy spy(&request, SIGNAL(itemIdChanged()));
+
+ QCOMPARE(request.itemId(), QVariant());
+
+ request.setItemId(QVariant());
+ QCOMPARE(request.itemId(), QVariant());
+ QCOMPARE(spy.count(), 0);
+
+ request.setItemId(76);
+ QCOMPARE(request.itemId(), QVariant(76));
+ QCOMPARE(spy.count(), 1);
+
+ request.setItemId(76);
+ QCOMPARE(request.itemId(), QVariant(76));
+ QCOMPARE(spy.count(), 1);
+
+ request.setItemId(QLatin1String("65"));
+ QCOMPARE(request.itemId(), QVariant(QLatin1String("65")));
+ QCOMPARE(spy.count(), 2);
+
+ request.setItemId(QLatin1String("65"));
+ QCOMPARE(request.itemId(), QVariant(QLatin1String("65")));
+ QCOMPARE(spy.count(), 2);
+
+ request.setItemId(QVariant());
+ QCOMPARE(request.itemId(), QVariant());
+ QCOMPARE(spy.count(), 3);
+}
+
+void tst_QGalleryItemRequest::executeSynchronous()
+{
+ QtTestGallery gallery;
+ gallery.setState(QGalleryAbstractRequest::Finished);
+ gallery.setCount(1);
+ gallery.setError(80, QString());
+
+ QGalleryItemRequest request(&gallery);
+ QVERIFY(request.resultSet() == 0);
+
+ request.setPropertyNames(QStringList()
+ << QLatin1String("album")
+ << QLatin1String("trackNumber")
+ << QLatin1String("turtle"));
+
+ QSignalSpy resultSetSpy(&request, SIGNAL(resultSetChanged(QGalleryResultSet*)));
+ QSignalSpy itemChangedSpy(&request, SIGNAL(itemChanged()));
+ QSignalSpy metaDataSpy(&request, SIGNAL(metaDataChanged(QList<int>)));
+
+ request.execute();
+
+ QCOMPARE(request.error(), 80);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Error);
+ QCOMPARE(resultSetSpy.count(), 0);
+ QVERIFY(qobject_cast<QtGalleryTestResponse *>(request.resultSet()) == 0);
+
+ gallery.setError(QGalleryAbstractRequest::NoError, QString());
+ request.execute();
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Finished);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(resultSetSpy.count(), 1);
+ QVERIFY(qobject_cast<QtGalleryTestResponse *>(request.resultSet()) != 0);
+ QCOMPARE(resultSetSpy.last().at(0).value<QGalleryResultSet*>(), request.resultSet());
+
+ QCOMPARE(request.propertyKey(QLatin1String("title")), -1);
+ QCOMPARE(request.propertyKey(QLatin1String("album")), 0);
+ QCOMPARE(request.propertyKey(QLatin1String("trackNumber")), 1);
+ QCOMPARE(request.propertyKey(QLatin1String("turtle")), -1);
+
+ QCOMPARE(request.propertyAttributes(0), QGalleryProperty::CanRead | QGalleryProperty::CanWrite);
+ QCOMPARE(request.propertyType(0), QVariant::String);
+
+ const QList<int> propertyKeys = QList<int>()
+ << request.propertyKey(QLatin1String("album"))
+ << request.propertyKey(QLatin1String("trackNumber"));
+
+ QCOMPARE(itemChangedSpy.count(), 1);
+ QCOMPARE(metaDataSpy.count(), 1);
+ QCOMPARE(metaDataSpy.last().value(0).value<QList<int> >(), propertyKeys);
+
+ QCOMPARE(request.isValid(), true);
+ QCOMPARE(request.itemUrl(), QUrl(QLatin1String("http://example.com")));
+ QCOMPARE(request.itemType(), QLatin1String("WebPage"));
+ QCOMPARE(request.metaData(1), QVariant());
+ QCOMPARE(request.setMetaData(1, 12), true);
+ QCOMPARE(request.metaData(1), QVariant(12));
+ QCOMPARE(metaDataSpy.count(), 2);
+ QCOMPARE(request.metaData(QLatin1String("trackNumber")), QVariant(12));
+ QCOMPARE(request.setMetaData(QLatin1String("trackNumber"), 5), true);
+ QCOMPARE(metaDataSpy.count(), 3);
+ QCOMPARE(request.metaData(QLatin1String("trackNumber")), QVariant(5));
+ QCOMPARE(request.resources(), QList<QGalleryResource>()
+ << QGalleryResource(QUrl(QLatin1String("http://example.com"))));
+
+ request.clear();
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Inactive);
+ QCOMPARE(resultSetSpy.count(), 2);
+ QVERIFY(request.resultSet() == 0);
+ QCOMPARE(resultSetSpy.last().at(0).value<QGalleryResultSet*>(), request.resultSet());
+ QCOMPARE(itemChangedSpy.count(), 2);
+ QCOMPARE(metaDataSpy.count(), 3);
+}
+
+void tst_QGalleryItemRequest::executeAsynchronous()
+{
+ QtTestGallery gallery;
+ gallery.setState(QGalleryAbstractRequest::Active);
+
+ QGalleryItemRequest request(&gallery);
+ QVERIFY(request.resultSet() == 0);
+
+ request.setPropertyNames(QStringList()
+ << QLatin1String("album")
+ << QLatin1String("trackNumber")
+ << QLatin1String("turtle"));
+
+ QSignalSpy resultSetSpy(&request, SIGNAL(resultSetChanged(QGalleryResultSet*)));
+ QSignalSpy itemChangedSpy(&request, SIGNAL(itemChanged()));
+ QSignalSpy metaDataSpy(&request, SIGNAL(metaDataChanged(QList<int>)));
+
+ request.execute();
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Active);
+ QCOMPARE(resultSetSpy.count(), 1);
+ QVERIFY(qobject_cast<QtGalleryTestResponse *>(request.resultSet()) != 0);
+ QCOMPARE(resultSetSpy.last().at(0).value<QGalleryResultSet*>(), request.resultSet());
+
+ QCOMPARE(request.propertyKey(QLatin1String("title")), -1);
+ QCOMPARE(request.propertyKey(QLatin1String("album")), 0);
+ QCOMPARE(request.propertyKey(QLatin1String("trackNumber")), 1);
+ QCOMPARE(request.propertyKey(QLatin1String("turtle")), -1);
+
+ QCOMPARE(request.propertyAttributes(0), QGalleryProperty::CanRead | QGalleryProperty::CanWrite);
+ QCOMPARE(request.propertyType(0), QVariant::String);
+
+ const QList<int> propertyKeys = QList<int>()
+ << request.propertyKey(QLatin1String("album"))
+ << request.propertyKey(QLatin1String("trackNumber"));
+
+ QCOMPARE(itemChangedSpy.count(), 0);
+ QCOMPARE(metaDataSpy.count(), 0);
+
+ QCOMPARE(request.isValid(), false);
+ QCOMPARE(request.itemUrl(), QUrl());
+ QCOMPARE(request.itemType(), QString());
+ QCOMPARE(request.metaData(1), QVariant());
+ QCOMPARE(request.setMetaData(1, 12), false);
+ QCOMPARE(request.metaData(1), QVariant());
+ QCOMPARE(request.metaData(QLatin1String("trackNumber")), QVariant());
+ QCOMPARE(request.setMetaData(QLatin1String("trackNumber"), 12), false);
+ QCOMPARE(request.metaData(QLatin1String("trackNumber")), QVariant());
+ QCOMPARE(request.resources(), QList<QGalleryResource>());
+
+ QtGalleryTestResponse *resultSet = qobject_cast<QtGalleryTestResponse *>(request.resultSet());
+ QVERIFY(resultSet != 0);
+
+ resultSet->setCount(1);
+ resultSet->itemsInserted(0, 1);
+
+ QCOMPARE(itemChangedSpy.count(), 1);
+ QCOMPARE(metaDataSpy.count(), 1);
+ QCOMPARE(metaDataSpy.last().value(0).value<QList<int> >(), propertyKeys);
+
+ QCOMPARE(request.isValid(), true);
+ QCOMPARE(request.itemUrl(), QUrl(QLatin1String("http://example.com")));
+ QCOMPARE(request.itemType(), QLatin1String("WebPage"));
+ QCOMPARE(request.metaData(1), QVariant());
+ QCOMPARE(request.setMetaData(1, 12), true);
+ QCOMPARE(metaDataSpy.count(), 2);
+ QCOMPARE(request.metaData(1), QVariant(12));
+ QCOMPARE(request.metaData(QLatin1String("trackNumber")), QVariant(12));
+ QCOMPARE(request.setMetaData(QLatin1String("trackNumber"), 5), true);
+ QCOMPARE(metaDataSpy.count(), 3);
+ QCOMPARE(request.metaData(QLatin1String("trackNumber")), QVariant(5));
+ QCOMPARE(request.resources(), QList<QGalleryResource>()
+ << QGalleryResource(QUrl(QLatin1String("http://example.com"))));
+
+ resultSet->finish(false);
+
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Finished);
+ QCOMPARE(resultSetSpy.count(), 1);
+ QVERIFY(qobject_cast<QtGalleryTestResponse *>(request.resultSet()) != 0);
+
+ resultSet->setCount(0);
+ resultSet->itemsRemoved(0, 1);
+
+ QCOMPARE(itemChangedSpy.count(), 2);
+ QCOMPARE(metaDataSpy.count(), 4);
+ QCOMPARE(metaDataSpy.last().value(0).value<QList<int> >(), propertyKeys);
+
+ QCOMPARE(request.isValid(), false);
+ QCOMPARE(request.itemUrl(), QUrl());
+ QCOMPARE(request.itemType(), QString());
+ QCOMPARE(request.metaData(1), QVariant());
+ QCOMPARE(request.setMetaData(1, 12), false);
+ QCOMPARE(request.metaData(1), QVariant());
+ QCOMPARE(request.metaData(QLatin1String("trackNumber")), QVariant());
+ QCOMPARE(request.setMetaData(QLatin1String("trackNumber"), 12), false);
+ QCOMPARE(request.metaData(QLatin1String("trackNumber")), QVariant());
+ QCOMPARE(request.resources(), QList<QGalleryResource>());
+
+ request.clear();
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Inactive);
+ QCOMPARE(resultSetSpy.count(), 2);
+ QVERIFY(request.resultSet() == 0);
+ QCOMPARE(resultSetSpy.last().at(0).value<QGalleryResultSet*>(), request.resultSet());
+
+ QCOMPARE(itemChangedSpy.count(), 2);
+ QCOMPARE(metaDataSpy.count(), 4);
+}
+
+void tst_QGalleryItemRequest::noResponse()
+{
+ QGalleryItemRequest request;
+
+ QCOMPARE(request.propertyKey(QLatin1String("title")), -1);
+ QCOMPARE(request.propertyKey(QLatin1String("album")), -1);
+ QCOMPARE(request.propertyKey(QLatin1String("trackNumber")), -1);
+
+ QCOMPARE(request.propertyAttributes(0), QGalleryProperty::Attributes());
+ QCOMPARE(request.propertyType(0), QVariant::Invalid);
+
+ QCOMPARE(request.isValid(), false);
+ QCOMPARE(request.itemUrl(), QUrl());
+ QCOMPARE(request.itemType(), QString());
+ QCOMPARE(request.metaData(1), QVariant());
+ QCOMPARE(request.setMetaData(1, QLatin1String("hello")), false);
+ QCOMPARE(request.metaData(1), QVariant());
+ QCOMPARE(request.metaData(QLatin1String("title")), QVariant());
+ QCOMPARE(request.setMetaData(QLatin1String("title"), QLatin1String("hello")), false);
+ QCOMPARE(request.metaData(QLatin1String("title")), QVariant());
+ QCOMPARE(request.resources(), QList<QGalleryResource>());
+}
+
+void tst_QGalleryItemRequest::multipleResults()
+{
+ const QList<int> propertyKeys = QList<int>() << 2 << 15;
+
+ QtTestGallery gallery;
+ gallery.setCount(1);
+
+ QGalleryItemRequest request(&gallery);
+
+ QSignalSpy itemChangedSpy(&request, SIGNAL(itemChanged()));
+ QSignalSpy metaDataSpy(&request, SIGNAL(metaDataChanged(QList<int>)));
+
+ gallery.setState(QGalleryAbstractRequest::Active);
+ request.execute();
+
+ QCOMPARE(request.isValid(), true);
+ QCOMPARE(itemChangedSpy.count(), 1);
+ QCOMPARE(metaDataSpy.count(), 0);
+
+ QtGalleryTestResponse *resultSet = qobject_cast<QtGalleryTestResponse *>(
+ request.resultSet());
+ QVERIFY(resultSet != 0);
+
+ resultSet->metaDataChanged(0, 1, propertyKeys);
+ QCOMPARE(metaDataSpy.count(), 1);
+ QCOMPARE(metaDataSpy.last().value(0).value<QList<int> >(), propertyKeys);
+
+ resultSet->setCount(3);
+ resultSet->itemsInserted(1, 2);
+
+ QCOMPARE(itemChangedSpy.count(), 1);
+ QCOMPARE(metaDataSpy.count(), 1);
+
+ resultSet->metaDataChanged(0, 1, propertyKeys);
+ QCOMPARE(metaDataSpy.count(), 2);
+ QCOMPARE(metaDataSpy.last().value(0).value<QList<int> >(), propertyKeys);
+
+ resultSet->metaDataChanged(1, 1, propertyKeys);
+ QCOMPARE(metaDataSpy.count(), 2);
+
+ resultSet->itemsMoved(0, 1, 1);
+ QCOMPARE(request.isValid(), true);
+ QCOMPARE(itemChangedSpy.count(), 2);
+ QCOMPARE(metaDataSpy.count(), 2);
+
+ resultSet->itemsMoved(2, 0, 1);
+ QCOMPARE(request.isValid(), true);
+ QCOMPARE(itemChangedSpy.count(), 3);
+ QCOMPARE(metaDataSpy.count(), 2);
+
+ resultSet->itemsMoved(1, 2, 1);
+ QCOMPARE(request.isValid(), true);
+ QCOMPARE(itemChangedSpy.count(), 3);
+ QCOMPARE(metaDataSpy.count(), 2);
+
+ resultSet->setCount(1);
+ resultSet->itemsRemoved(1, 1);
+
+ QCOMPARE(request.isValid(), true);
+ QCOMPARE(itemChangedSpy.count(), 3);
+ QCOMPARE(metaDataSpy.count(), 2);
+
+}
+
+QTEST_MAIN(tst_QGalleryItemRequest)
+
+#include "tst_qgalleryitemrequest.moc"
diff --git a/tests/auto/qgalleryquerymodel/qgalleryquerymodel.pro b/tests/auto/qgalleryquerymodel/qgalleryquerymodel.pro
new file mode 100644
index 0000000..e19a030
--- /dev/null
+++ b/tests/auto/qgalleryquerymodel/qgalleryquerymodel.pro
@@ -0,0 +1,3 @@
+include(../auto.pri)
+
+SOURCES += tst_qgalleryquerymodel.cpp
diff --git a/tests/auto/qgalleryquerymodel/tst_qgalleryquerymodel.cpp b/tests/auto/qgalleryquerymodel/tst_qgalleryquerymodel.cpp
new file mode 100644
index 0000000..13b5dda
--- /dev/null
+++ b/tests/auto/qgalleryquerymodel/tst_qgalleryquerymodel.cpp
@@ -0,0 +1,1853 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDocGallery module 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$
+**
+****************************************************************************/
+
+//TESTED_COMPONENT=src/gallery
+
+#include <qgalleryquerymodel.h>
+
+#include <qabstractgallery.h>
+#include <qgalleryqueryrequest.h>
+#include <qgalleryresultset.h>
+
+#include <QtCore/qpointer.h>
+
+#include <QtTest/QtTest>
+
+Q_DECLARE_METATYPE(QModelIndex)
+Q_DECLARE_METATYPE(QGalleryAbstractRequest::State)
+
+class QtTestGallery;
+
+class tst_QGalleryQueryModel : public QObject
+{
+ Q_OBJECT
+public Q_SLOTS:
+ void initTestCase();
+
+private Q_SLOTS:
+ void execute();
+ void sortPropertyNames();
+ void autoUpdate();
+ void offset();
+ void limit();
+ void rootType();
+ void rootItem();
+ void scope();
+ void filter();
+ void indexes();
+ void data();
+ void flags();
+ void headerData();
+ void addColumn();
+ void insertColumn();
+ void removeColumn();
+ void setRoleProperties();
+ void itemsInserted();
+ void itemsRemoved();
+ void itemsMoved();
+ void metaDataChanged();
+ void invalidIndex();
+ void hierarchy();
+ void setGallery();
+ void galleryChanged();
+ void errorChanged();
+
+private:
+ void populateGallery(QtTestGallery *gallery) const;
+
+ QHash<int, QString> albumProperties;
+ QHash<int, QString> titleProperties;
+ QHash<int, QString> durationProperties;
+ QHash<int, QString> ratingProperties;
+ QHash<int, QString> turtleProperties;
+};
+
+class QtTestResultSet : public QGalleryResultSet
+{
+ Q_OBJECT
+public:
+ struct Row
+ {
+ Row() {}
+ Row(const QVariant &itemId,
+ const QUrl &itemUrl,
+ const QString &itemType,
+ const QHash<QString, QVariant> &metaData)
+ : itemId(itemId)
+ , itemUrl(itemUrl)
+ , itemType(itemType)
+ , metaData(metaData) {}
+ QVariant itemId;
+ QUrl itemUrl;
+ QString itemType;
+ QHash<QString, QVariant> metaData;
+ };
+
+ QtTestResultSet(
+ QGalleryAbstractRequest::State state,
+ int error,
+ const QString &errorString,
+ const QHash<QString, QGalleryProperty::Attributes> &propertyAttributes,
+ const QVector<Row> &rows)
+ : m_propertyNames(propertyAttributes.keys())
+ , m_propertyAttributes(propertyAttributes)
+ , m_rows(rows)
+ , m_currentIndex(-1)
+ , m_insertIndex(0)
+ , m_insertCount(0)
+ {
+ if (error != QGalleryAbstractRequest::NoError)
+ QGalleryAbstractResponse::error(error, errorString);
+ else if (state == QGalleryAbstractRequest::Finished)
+ finish();
+ else if (state == QGalleryAbstractRequest::Idle)
+ finish(true);
+ }
+
+ QStringList propertyNames() const { return m_propertyNames; }
+
+ int propertyKey(const QString &propertyName) const {
+ return m_propertyNames.indexOf(propertyName); }
+
+ QGalleryProperty::Attributes propertyAttributes(int key) const {
+ return m_propertyAttributes.value(m_propertyNames.value(key)); }
+
+ QVariant::Type propertyType(int) const { return QVariant::Invalid; }
+
+ int itemCount() const { return m_rows.count(); }
+
+ int currentIndex() const { return m_currentIndex; }
+ bool fetch(int index)
+ {
+ emit currentIndexChanged(m_currentIndex = index);
+ emit currentItemChanged();
+
+ return isValid();
+ }
+
+ QVariant itemId() const { return m_rows.value(m_currentIndex).itemId; }
+ QUrl itemUrl() const { return m_rows.value(m_currentIndex).itemUrl; }
+ QString itemType() const { return m_rows.value(m_currentIndex).itemType; }
+
+ QVariant metaData(int key) const {
+ return m_rows.value(m_currentIndex).metaData.value(m_propertyNames.at(key)); }
+
+ bool setMetaData(int key, const QVariant &value)
+ {
+ if (isValid() && key >= 0) {
+ const QString propertyName = m_propertyNames.at(key);
+
+ if (m_propertyAttributes.value(propertyName) & QGalleryProperty::CanWrite) {
+ m_rows[m_currentIndex].metaData[propertyName] = value;
+
+ emit metaDataChanged(m_currentIndex, 1, QList<int>() << key);
+
+ return true;
+ }
+ }
+ return false;
+ }
+
+ void beginInsertRows(int index) { m_insertIndex = index; m_insertCount = 0; }
+ void addRow()
+ {
+ m_rows.insert(m_insertIndex + m_insertCount++, Row());
+ }
+ void addRow(
+ const QString &itemId,
+ const QUrl &itemUrl,
+ const QString &itemType,
+ const QHash<QString, QVariant> &metaData)
+ {
+ m_rows.insert(m_insertIndex + m_insertCount++, Row(itemId, itemUrl, itemType, metaData));
+ }
+ void endInsertRows() { emit itemsInserted(m_insertIndex, m_insertCount); }
+
+ void removeRows(int index, int count) {
+ m_rows.remove(index, count); emit itemsRemoved(index, count); }
+
+ using QGalleryResultSet::metaDataChanged;
+ using QGalleryResultSet::itemsMoved;
+
+private:
+ QStringList m_propertyNames;
+ const QHash<QString, QGalleryProperty::Attributes> m_propertyAttributes;
+ QVector<Row> m_rows;
+ int m_currentIndex;
+ int m_insertIndex;
+ int m_insertCount;
+};
+
+class QtTestGallery : public QAbstractGallery
+{
+public:
+ QtTestGallery()
+ : m_state(QGalleryAbstractRequest::Finished)
+ , m_error(QGalleryAbstractRequest::NoError)
+ {
+ }
+
+ bool isRequestSupported(QGalleryAbstractRequest::RequestType) const { return true; }
+
+ void setPropertyAttributes(const QHash<QString, QGalleryProperty::Attributes> &attributes)
+ {
+ m_propertyAttributes = attributes;
+ }
+
+ void setState(QGalleryAbstractRequest::State state) { m_state = state; }
+ void setError(int error, const QString &errorString) {
+ m_error = error; m_errorString = errorString; }
+
+ void addRow()
+ {
+ m_rows.append(QtTestResultSet::Row());
+ }
+
+ void addRow(
+ const QVariant &itemId,
+ const QUrl &itemUrl,
+ const QString &itemType,
+ const QHash<QString, QVariant> &metaData)
+ {
+ m_rows.append(QtTestResultSet::Row(itemId, itemUrl, itemType, metaData));
+ }
+
+ QGalleryQueryRequest *request() const { return m_request; }
+
+protected:
+ QGalleryAbstractResponse *createResponse(QGalleryAbstractRequest *request)
+ {
+ m_request = qobject_cast<QGalleryQueryRequest *>(request);
+
+ return new QtTestResultSet(m_state, m_error, m_errorString, m_propertyAttributes, m_rows);
+ }
+
+
+private:
+ QHash<QString, QGalleryProperty::Attributes> m_propertyAttributes;
+ QVector<QtTestResultSet::Row> m_rows;
+ QPointer<QGalleryQueryRequest> m_request;
+ QGalleryAbstractRequest::State m_state;
+ int m_error;
+ QString m_errorString;
+};
+
+void tst_QGalleryQueryModel::initTestCase()
+{
+ qRegisterMetaType<QModelIndex>();
+ qRegisterMetaType<QGalleryAbstractRequest::State>();
+
+ albumProperties.insert(Qt::DisplayRole, QLatin1String("albumTitle"));
+ albumProperties.insert(Qt::UserRole, QLatin1String("albumArtist"));
+ albumProperties.insert(Qt::UserRole + 1, QLatin1String("albumId"));
+
+ titleProperties.insert(Qt::DisplayRole, QLatin1String("displayName"));
+ titleProperties.insert(Qt::EditRole, QLatin1String("title"));
+
+ durationProperties.insert(Qt::DisplayRole, QLatin1String("duration"));
+
+ ratingProperties.insert(Qt::DisplayRole, QLatin1String("rating"));
+
+ turtleProperties.insert(Qt::DisplayRole, QLatin1String("turtle"));
+}
+
+void tst_QGalleryQueryModel::populateGallery(QtTestGallery *gallery) const
+{
+ QHash<QString, QGalleryProperty::Attributes> attributes;
+ attributes.insert(QLatin1String("displayName"), QGalleryProperty::CanRead);
+ attributes.insert(QLatin1String("title"), QGalleryProperty::CanRead | QGalleryProperty::CanWrite);
+ attributes.insert(QLatin1String("albumTitle"), QGalleryProperty::CanRead);
+ attributes.insert(QLatin1String("albumArtist"), QGalleryProperty::CanRead);
+ attributes.insert(QLatin1String("albumId"), QGalleryProperty::CanRead | QGalleryProperty::CanWrite);
+ attributes.insert(QLatin1String("duration"), QGalleryProperty::CanRead);
+ attributes.insert(QLatin1String("rating"), QGalleryProperty::CanRead | QGalleryProperty::CanWrite);
+ gallery->setPropertyAttributes(attributes);
+
+ {
+ QHash<QString, QVariant> metaData;
+ metaData.insert(QLatin1String("displayName"), QLatin1String("Interlude"));
+ metaData.insert(QLatin1String("title"), QLatin1String("Interlude"));
+ metaData.insert(QLatin1String("albumTitle"), QLatin1String("Greatest Hits"));
+ metaData.insert(QLatin1String("albumArtist"), QLatin1String("Self Titled"));
+ metaData.insert(QLatin1String("albumId"), QLatin1String("album:SelfTitled:GreatestHits"));
+ metaData.insert(QLatin1String("duration"), 120100);
+ metaData.insert(QLatin1String("rating"), 4);
+
+ gallery->addRow(
+ 3,
+ QUrl(QLatin1String("file:///music/interlude.mp3")),
+ QLatin1String("Audio"),
+ metaData);
+ } {
+ QHash<QString, QVariant> metaData;
+ metaData.insert(QLatin1String("displayName"), QLatin1String("beep.wav"));
+ metaData.insert(QLatin1String("duration"), 600);
+
+ gallery->addRow(
+ 45,
+ QUrl(QLatin1String("file:///sounds/beep.wav")),
+ QLatin1String("Audio"),
+ metaData);
+ }
+}
+
+void tst_QGalleryQueryModel::execute()
+{
+ QtTestGallery gallery;
+
+ QGalleryQueryModel model(&gallery);
+
+ QSignalSpy finishedSpy(&model, SIGNAL(finished()));
+ QSignalSpy canceledSpy(&model, SIGNAL(canceled()));
+ QSignalSpy errorSpy(&model, SIGNAL(error(int,QString)));
+ QSignalSpy stateSpy(&model, SIGNAL(stateChanged(QGalleryAbstractRequest::State)));
+
+ model.execute();
+ QCOMPARE(model.state(), QGalleryAbstractRequest::Finished);
+ QCOMPARE(model.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 1);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), model.state());
+
+ gallery.setState(QGalleryAbstractRequest::Active);
+ model.execute();
+ QCOMPARE(model.state(), QGalleryAbstractRequest::Active);
+ QCOMPARE(model.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 0);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 2);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), model.state());
+
+ model.cancel();
+ QCOMPARE(model.state(), QGalleryAbstractRequest::Canceled);
+ QCOMPARE(model.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 1);
+ QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(stateSpy.count(), 3);
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), model.state());
+
+ gallery.setError(120, QLatin1String("bad connection"));
+ model.execute();
+ QCOMPARE(model.state(), QGalleryAbstractRequest::Error);
+ QCOMPARE(model.error(), 120);
+ QCOMPARE(model.errorString(), QLatin1String("bad connection"));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 1);
+ QCOMPARE(errorSpy.count(), 1);
+ QCOMPARE(stateSpy.count(), 4);
+ QCOMPARE(errorSpy.last().value(0).toInt(), model.error());
+ QCOMPARE(errorSpy.last().value(1).toString(), model.errorString());
+ QCOMPARE(stateSpy.last().value(0).value<QGalleryAbstractRequest::State>(), model.state());
+
+ model.clear();
+ QCOMPARE(model.state(), QGalleryAbstractRequest::Inactive);
+ QCOMPARE(model.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(finishedSpy.count(), 1);
+ QCOMPARE(canceledSpy.count(), 1);
+ QCOMPARE(errorSpy.count(), 1);
+ QCOMPARE(stateSpy.count(), 5);
+}
+
+void tst_QGalleryQueryModel::sortPropertyNames()
+{
+ const QStringList propertyNames = QStringList()
+ << QLatin1String("-rating")
+ << QLatin1String("+duration");
+
+ QGalleryQueryModel model;
+
+ QSignalSpy spy(&model, SIGNAL(sortPropertyNamesChanged()));
+
+ QCOMPARE(model.sortPropertyNames(), QStringList());
+
+ model.setSortPropertyNames(QStringList());
+ QCOMPARE(model.sortPropertyNames(), QStringList());
+ QCOMPARE(spy.count(), 0);
+
+ model.setSortPropertyNames(propertyNames);
+ QCOMPARE(model.sortPropertyNames(), propertyNames);
+ QCOMPARE(spy.count(), 1);
+
+ model.setSortPropertyNames(propertyNames);
+ QCOMPARE(model.sortPropertyNames(), propertyNames);
+ QCOMPARE(spy.count(), 1);
+
+ model.setSortPropertyNames(QStringList());
+ QCOMPARE(model.sortPropertyNames(), QStringList());
+ QCOMPARE(spy.count(), 2);
+}
+
+void tst_QGalleryQueryModel::autoUpdate()
+{
+ QGalleryQueryModel model;
+
+ QSignalSpy spy(&model, SIGNAL(autoUpdateChanged()));
+
+ QCOMPARE(model.autoUpdate(), false);
+
+ model.setAutoUpdate(false);
+ QCOMPARE(model.autoUpdate(), false);
+ QCOMPARE(spy.count(), 0);
+
+ model.setAutoUpdate(true);
+ QCOMPARE(model.autoUpdate(), true);
+ QCOMPARE(spy.count(), 1);
+
+ model.setAutoUpdate(true);
+ QCOMPARE(model.autoUpdate(), true);
+ QCOMPARE(spy.count(), 1);
+
+ model.setAutoUpdate(false);
+ QCOMPARE(model.autoUpdate(), false);
+ QCOMPARE(spy.count(), 2);
+}
+
+void tst_QGalleryQueryModel::offset()
+{
+ QGalleryQueryModel model;
+
+ QSignalSpy spy(&model, SIGNAL(offsetChanged()));
+
+ QCOMPARE(model.offset(), 0);
+
+ model.setOffset(0);
+ QCOMPARE(model.offset(), 0);
+ QCOMPARE(spy.count(), 0);
+
+ model.setOffset(-45);
+ QCOMPARE(model.offset(), 0);
+ QCOMPARE(spy.count(), 0);
+
+ model.setOffset(32);
+ QCOMPARE(model.offset(), 32);
+ QCOMPARE(spy.count(), 1);
+
+ model.setOffset(32);
+ QCOMPARE(model.offset(), 32);
+ QCOMPARE(spy.count(), 1);
+
+ model.setOffset(-45);
+ QCOMPARE(model.offset(), 0);
+ QCOMPARE(spy.count(), 2);
+}
+
+void tst_QGalleryQueryModel::limit()
+{
+ QGalleryQueryModel model;
+
+ QSignalSpy spy(&model, SIGNAL(limitChanged()));
+
+ QCOMPARE(model.limit(), 0);
+
+ model.setLimit(0);
+ QCOMPARE(model.limit(), 0);
+ QCOMPARE(spy.count(), 0);
+
+ model.setLimit(-21);
+ QCOMPARE(model.limit(), 0);
+ QCOMPARE(spy.count(), 0);
+
+ model.setLimit(102);
+ QCOMPARE(model.limit(), 102);
+ QCOMPARE(spy.count(), 1);
+
+ model.setLimit(102);
+ QCOMPARE(model.limit(), 102);
+ QCOMPARE(spy.count(), 1);
+
+ model.setLimit(-21);
+ QCOMPARE(model.limit(), 0);
+ QCOMPARE(spy.count(), 2);
+}
+
+void tst_QGalleryQueryModel::rootType()
+{
+ const QString itemType = QLatin1String("Audio");
+
+ QGalleryQueryModel model;
+
+ QSignalSpy spy(&model, SIGNAL(rootTypeChanged()));
+
+ QCOMPARE(model.rootType(), QString());
+
+ model.setRootType(QString());
+ QCOMPARE(model.rootType(), QString());
+ QCOMPARE(spy.count(), 0);
+
+ model.setRootType(itemType);
+ QCOMPARE(model.rootType(), itemType);
+ QCOMPARE(spy.count(), 1);
+
+ model.setRootType(itemType);
+ QCOMPARE(model.rootType(), itemType);
+ QCOMPARE(spy.count(), 1);
+
+ model.setRootType(QString());
+ QCOMPARE(model.rootType(), QString());
+ QCOMPARE(spy.count(), 2);
+}
+
+void tst_QGalleryQueryModel::rootItem()
+{
+ QGalleryQueryModel model;
+
+ QSignalSpy spy(&model, SIGNAL(rootItemChanged()));
+
+ QCOMPARE(model.rootItem(), QVariant());
+
+ model.setRootItem(QVariant());
+ QCOMPARE(model.rootItem(), QVariant());
+ QCOMPARE(spy.count(), 0);
+
+ model.setRootItem(76);
+ QCOMPARE(model.rootItem(), QVariant(76));
+ QCOMPARE(spy.count(), 1);
+
+ model.setRootItem(76);
+ QCOMPARE(model.rootItem(), QVariant(76));
+ QCOMPARE(spy.count(), 1);
+
+ model.setRootItem(QLatin1String("65"));
+ QCOMPARE(model.rootItem(), QVariant(QLatin1String("65")));
+ QCOMPARE(spy.count(), 2);
+
+ model.setRootItem(QLatin1String("65"));
+ QCOMPARE(model.rootItem(), QVariant(QLatin1String("65")));
+ QCOMPARE(spy.count(), 2);
+
+ model.setRootItem(QVariant());
+ QCOMPARE(model.rootItem(), QVariant());
+ QCOMPARE(spy.count(), 3);
+}
+
+void tst_QGalleryQueryModel::scope()
+{
+ QGalleryQueryModel model;
+
+ QSignalSpy spy(&model, SIGNAL(scopeChanged()));
+
+ QCOMPARE(model.scope(), QGalleryQueryRequest::AllDescendants);
+
+ model.setScope(QGalleryQueryRequest::AllDescendants);
+ QCOMPARE(model.scope(), QGalleryQueryRequest::AllDescendants);
+ QCOMPARE(spy.count(), 0);
+
+ model.setScope(QGalleryQueryRequest::DirectDescendants);
+ QCOMPARE(model.scope(), QGalleryQueryRequest::DirectDescendants);
+ QCOMPARE(spy.count(), 1);
+
+ model.setScope(QGalleryQueryRequest::DirectDescendants);
+ QCOMPARE(model.scope(), QGalleryQueryRequest::DirectDescendants);
+ QCOMPARE(spy.count(), 1);
+
+ model.setScope(QGalleryQueryRequest::AllDescendants);
+ QCOMPARE(model.scope(), QGalleryQueryRequest::AllDescendants);
+ QCOMPARE(spy.count(), 2);
+}
+
+void tst_QGalleryQueryModel::filter()
+{
+ const QGalleryFilter filter = QGalleryMetaDataFilter(
+ QLatin1String("rating"), 3, QGalleryFilter::GreaterThan);
+
+ QGalleryQueryModel model;
+
+ QSignalSpy spy(&model, SIGNAL(filterChanged()));
+
+ QCOMPARE(model.filter(), QGalleryFilter());
+
+ model.setFilter(QGalleryFilter());
+ QCOMPARE(model.filter(), QGalleryFilter());
+ QCOMPARE(spy.count(), 0);
+
+ model.setFilter(filter);
+ QCOMPARE(model.filter(), filter);
+ QCOMPARE(spy.count(), 1);
+
+ model.setFilter(filter);
+ QCOMPARE(model.filter(), filter);
+ QCOMPARE(spy.count(), 1);
+
+ model.setFilter(QGalleryFilter());
+ QCOMPARE(model.filter(), QGalleryFilter());
+ QCOMPARE(spy.count(), 2);
+}
+
+void tst_QGalleryQueryModel::indexes()
+{
+ QtTestGallery gallery;
+ populateGallery(&gallery);
+
+ QGalleryQueryModel model(&gallery);
+ model.addColumn(albumProperties);
+ model.addColumn(titleProperties);
+ model.addColumn(QLatin1String("duration"), Qt::DisplayRole);
+ model.addColumn(QLatin1String("rating"), Qt::DisplayRole);
+ model.addColumn(QLatin1String("turtle"), Qt::DisplayRole);
+
+ QSignalSpy insertSpy(&model, SIGNAL(rowsInserted(QModelIndex,int,int)));
+ QSignalSpy removeSpy(&model, SIGNAL(rowsRemoved(QModelIndex,int,int)));
+
+ QCOMPARE(model.rowCount(), 0);
+ QCOMPARE(model.columnCount(), 5);
+
+ QCOMPARE(model.index(-1, -1).isValid(), false);
+ QCOMPARE(model.index(-1, 0).isValid(), false);
+ QCOMPARE(model.index(-1, 2).isValid(), false);
+ QCOMPARE(model.index(-1, 3).isValid(), false);
+ QCOMPARE(model.index(-1, 4).isValid(), false);
+ QCOMPARE(model.index(-1, 5).isValid(), false);
+ QCOMPARE(model.index( 0, -1).isValid(), false);
+ QCOMPARE(model.index( 0, 0).isValid(), false);
+ QCOMPARE(model.index( 0, 2).isValid(), false);
+ QCOMPARE(model.index( 0, 3).isValid(), false);
+ QCOMPARE(model.index( 0, 4).isValid(), false);
+ QCOMPARE(model.index( 0, 5).isValid(), false);
+ QCOMPARE(model.index( 1, -1).isValid(), false);
+ QCOMPARE(model.index( 1, 0).isValid(), false);
+ QCOMPARE(model.index( 1, 2).isValid(), false);
+ QCOMPARE(model.index( 1, 3).isValid(), false);
+ QCOMPARE(model.index( 1, 4).isValid(), false);
+ QCOMPARE(model.index( 1, 5).isValid(), false);
+ QCOMPARE(model.index( 2, -1).isValid(), false);
+ QCOMPARE(model.index( 2, 0).isValid(), false);
+ QCOMPARE(model.index( 2, 2).isValid(), false);
+ QCOMPARE(model.index( 2, 3).isValid(), false);
+ QCOMPARE(model.index( 2, 4).isValid(), false);
+ QCOMPARE(model.index( 2, 5).isValid(), false);
+
+ model.execute();
+
+ QCOMPARE(model.rowCount(), 2);
+ QCOMPARE(model.columnCount(), 5);
+
+ QCOMPARE(insertSpy.count(), 1);
+ QCOMPARE(insertSpy.last().at(0).value<QModelIndex>(), QModelIndex());
+ QCOMPARE(insertSpy.last().at(1).toInt(), 0);
+ QCOMPARE(insertSpy.last().at(2).toInt(), 1);
+
+ QCOMPARE(model.index(-1, -1).isValid(), false);
+ QCOMPARE(model.index(-1, 0).isValid(), false);
+ QCOMPARE(model.index(-1, 2).isValid(), false);
+ QCOMPARE(model.index(-1, 3).isValid(), false);
+ QCOMPARE(model.index(-1, 4).isValid(), false);
+ QCOMPARE(model.index(-1, 5).isValid(), false);
+ QCOMPARE(model.index( 0, -1).isValid(), false);
+ QCOMPARE(model.index( 0, 0).isValid(), true);
+ QCOMPARE(model.index( 0, 2).isValid(), true);
+ QCOMPARE(model.index( 0, 3).isValid(), true);
+ QCOMPARE(model.index( 0, 4).isValid(), true);
+ QCOMPARE(model.index( 0, 5).isValid(), false);
+ QCOMPARE(model.index( 1, -1).isValid(), false);
+ QCOMPARE(model.index( 1, 0).isValid(), true);
+ QCOMPARE(model.index( 1, 2).isValid(), true);
+ QCOMPARE(model.index( 1, 3).isValid(), true);
+ QCOMPARE(model.index( 1, 4).isValid(), true);
+ QCOMPARE(model.index( 1, 5).isValid(), false);
+ QCOMPARE(model.index( 2, -1).isValid(), false);
+ QCOMPARE(model.index( 2, 0).isValid(), false);
+ QCOMPARE(model.index( 2, 2).isValid(), false);
+ QCOMPARE(model.index( 2, 3).isValid(), false);
+ QCOMPARE(model.index( 2, 4).isValid(), false);
+ QCOMPARE(model.index( 2, 5).isValid(), false);
+
+ model.clear();
+
+ QCOMPARE(model.rowCount(), 0);
+ QCOMPARE(model.columnCount(), 5);
+
+ QCOMPARE(removeSpy.count(), 1);
+ QCOMPARE(removeSpy.last().at(0).value<QModelIndex>(), QModelIndex());
+ QCOMPARE(removeSpy.last().at(1).toInt(), 0);
+ QCOMPARE(removeSpy.last().at(2).toInt(), 1);
+
+ QCOMPARE(model.index(-1, -1).isValid(), false);
+ QCOMPARE(model.index(-1, 0).isValid(), false);
+ QCOMPARE(model.index(-1, 2).isValid(), false);
+ QCOMPARE(model.index(-1, 3).isValid(), false);
+ QCOMPARE(model.index(-1, 4).isValid(), false);
+ QCOMPARE(model.index(-1, 5).isValid(), false);
+ QCOMPARE(model.index( 0, -1).isValid(), false);
+ QCOMPARE(model.index( 0, 0).isValid(), false);
+ QCOMPARE(model.index( 0, 2).isValid(), false);
+ QCOMPARE(model.index( 0, 3).isValid(), false);
+ QCOMPARE(model.index( 0, 4).isValid(), false);
+ QCOMPARE(model.index( 0, 5).isValid(), false);
+ QCOMPARE(model.index( 1, -1).isValid(), false);
+ QCOMPARE(model.index( 1, 0).isValid(), false);
+ QCOMPARE(model.index( 1, 2).isValid(), false);
+ QCOMPARE(model.index( 1, 3).isValid(), false);
+ QCOMPARE(model.index( 1, 4).isValid(), false);
+ QCOMPARE(model.index( 1, 5).isValid(), false);
+ QCOMPARE(model.index( 2, -1).isValid(), false);
+ QCOMPARE(model.index( 2, 0).isValid(), false);
+ QCOMPARE(model.index( 2, 2).isValid(), false);
+ QCOMPARE(model.index( 2, 3).isValid(), false);
+ QCOMPARE(model.index( 2, 4).isValid(), false);
+ QCOMPARE(model.index( 2, 5).isValid(), false);
+}
+
+void tst_QGalleryQueryModel::data()
+{
+ QtTestGallery gallery;
+ populateGallery(&gallery);
+
+ QGalleryQueryModel model(&gallery);
+ model.addColumn(albumProperties);
+ model.addColumn(titleProperties);
+ model.addColumn(QLatin1String("duration"), Qt::DisplayRole);
+ model.addColumn(QLatin1String("rating"), Qt::DisplayRole);
+ model.addColumn(QLatin1String("turtle"), Qt::DisplayRole);
+ model.execute();
+
+ QModelIndex index;
+
+ index = model.index(0, 0);
+ QCOMPARE(model.itemId(index), QVariant(3));
+ QCOMPARE(model.itemUrl(index), QUrl(QLatin1String("file:///music/interlude.mp3")));
+ QCOMPARE(model.itemType(index), QString::fromLatin1("Audio"));
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(QLatin1String("Greatest Hits")));
+ QCOMPARE(index.data(Qt::EditRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole), QVariant(QLatin1String("Self Titled")));
+ QCOMPARE(index.data(Qt::UserRole + 1), QVariant(QLatin1String("album:SelfTitled:GreatestHits")));
+
+ index = model.index(0, 1);
+ QCOMPARE(model.itemId(index), QVariant(3));
+ QCOMPARE(model.itemUrl(index), QUrl(QLatin1String("file:///music/interlude.mp3")));
+ QCOMPARE(model.itemType(index), QString::fromLatin1("Audio"));
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(QLatin1String("Interlude")));
+ QCOMPARE(index.data(Qt::EditRole), QVariant(QLatin1String("Interlude")));
+ QCOMPARE(index.data(Qt::UserRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole + 1), QVariant());
+
+ index = model.index(0, 2);
+ QCOMPARE(model.itemId(index), QVariant(3));
+ QCOMPARE(model.itemUrl(index), QUrl(QLatin1String("file:///music/interlude.mp3")));
+ QCOMPARE(model.itemType(index), QString::fromLatin1("Audio"));
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(120100));
+ QCOMPARE(index.data(Qt::EditRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole + 1), QVariant());
+
+ index = model.index(0, 3);
+ QCOMPARE(model.itemId(index), QVariant(3));
+ QCOMPARE(model.itemUrl(index), QUrl(QLatin1String("file:///music/interlude.mp3")));
+ QCOMPARE(model.itemType(index), QString::fromLatin1("Audio"));
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(4));
+ QCOMPARE(index.data(Qt::EditRole), QVariant(4));
+ QCOMPARE(index.data(Qt::UserRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole + 1), QVariant());
+
+ index = model.index(0, 4);
+ QCOMPARE(model.itemId(index), QVariant(3));
+ QCOMPARE(model.itemUrl(index), QUrl(QLatin1String("file:///music/interlude.mp3")));
+ QCOMPARE(model.itemType(index), QString::fromLatin1("Audio"));
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant());
+ QCOMPARE(index.data(Qt::EditRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole + 1), QVariant());
+
+ index = model.index(1, 0);
+ QCOMPARE(model.itemId(index), QVariant(45));
+ QCOMPARE(model.itemUrl(index), QUrl(QLatin1String("file:///sounds/beep.wav")));
+ QCOMPARE(model.itemType(index), QString::fromLatin1("Audio"));
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant());
+ QCOMPARE(index.data(Qt::EditRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole + 1), QVariant());
+
+ QCOMPARE(model.setData(index, QLatin1String("Noise"), Qt::DisplayRole), false);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant());
+
+ QCOMPARE(model.setData(index, QLatin1String("Noise"), Qt::EditRole), false);
+ QCOMPARE(index.data(Qt::EditRole), QVariant());
+
+ QCOMPARE(model.setData(index, QLatin1String("Effects People"), Qt::UserRole), false);
+ QCOMPARE(index.data(Qt::UserRole), QVariant());
+
+ QCOMPARE(model.setData(index, QLatin1String("album:EffectsPeople:Noise"), Qt::UserRole + 1), true);
+ QCOMPARE(index.data(Qt::UserRole + 1), QVariant(QLatin1String("album:EffectsPeople:Noise")));
+
+ index = model.index(1, 1);
+ QCOMPARE(model.itemId(index), QVariant(45));
+ QCOMPARE(model.itemUrl(index), QUrl(QLatin1String("file:///sounds/beep.wav")));
+ QCOMPARE(model.itemType(index), QString::fromLatin1("Audio"));
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(QLatin1String("beep.wav")));
+ QCOMPARE(index.data(Qt::EditRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole + 1), QVariant());
+
+ QCOMPARE(model.setData(index, QLatin1String("Beep Sound"), Qt::DisplayRole), false);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(QLatin1String("beep.wav")));
+
+ QCOMPARE(model.setData(index, QLatin1String("Beep Sound"), Qt::EditRole), true);
+ QCOMPARE(index.data(Qt::EditRole), QVariant(QLatin1String("Beep Sound")));
+
+ index = model.index(1, 2);
+ QCOMPARE(model.itemId(index), QVariant(45));
+ QCOMPARE(model.itemUrl(index), QUrl(QLatin1String("file:///sounds/beep.wav")));
+ QCOMPARE(model.itemType(index), QString::fromLatin1("Audio"));
+ QCOMPARE(index.isValid(), true);
+ QCOMPARE(index.flags(), Qt::ItemIsSelectable | Qt::ItemIsEnabled);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(600));
+ QCOMPARE(index.data(Qt::EditRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole + 1), QVariant());
+
+ QCOMPARE(model.setData(index, 1000, Qt::DisplayRole), false);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(600));
+
+ QCOMPARE(model.setData(index, 1000, Qt::EditRole), false);
+ QCOMPARE(index.data(Qt::EditRole), QVariant());
+
+ index = model.index(1, 3);
+ QCOMPARE(model.itemId(index), QVariant(45));
+ QCOMPARE(model.itemUrl(index), QUrl(QLatin1String("file:///sounds/beep.wav")));
+ QCOMPARE(model.itemType(index), QString::fromLatin1("Audio"));
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant());
+ QCOMPARE(index.data(Qt::EditRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole + 1), QVariant());
+
+ QCOMPARE(model.setData(index, 2, Qt::DisplayRole), true);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(2));
+ QCOMPARE(index.data(Qt::EditRole), QVariant(2));
+
+ QCOMPARE(model.setData(index, 5, Qt::EditRole), true);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(5));
+ QCOMPARE(index.data(Qt::EditRole), QVariant(5));
+
+ index = model.index(1, 4);
+ QCOMPARE(model.itemId(index), QVariant(45));
+ QCOMPARE(model.itemUrl(index), QUrl(QLatin1String("file:///sounds/beep.wav")));
+ QCOMPARE(model.itemType(index), QString::fromLatin1("Audio"));
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant());
+ QCOMPARE(index.data(Qt::EditRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole + 1), QVariant());
+
+ // Random access.
+ index = model.index(0, 3);
+ QCOMPARE(model.setData(index, 4, Qt::DisplayRole), true);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(4));
+ QCOMPARE(index.data(Qt::EditRole), QVariant(4));
+
+ index = model.index(1, 0);
+ QCOMPARE(model.itemId(index), QVariant(45));
+
+ index = model.index(0, 0);
+ QCOMPARE(model.itemUrl(index), QUrl(QLatin1String("file:///music/interlude.mp3")));
+
+ index = model.index(1, 0);
+ QCOMPARE(model.itemType(index), QString::fromLatin1("Audio"));
+}
+
+void tst_QGalleryQueryModel::flags()
+{
+ QtTestGallery gallery;
+ populateGallery(&gallery);
+
+ QGalleryQueryModel model(&gallery);
+ model.addColumn(albumProperties);
+ model.addColumn(titleProperties);
+ model.addColumn(QLatin1String("duration"), Qt::DisplayRole);
+ model.addColumn(QLatin1String("rating"), Qt::DisplayRole);
+ model.addColumn(QLatin1String("turtle"), Qt::DisplayRole);
+ model.execute();
+
+ QCOMPARE(model.index(0, 0).flags(), Qt::ItemIsSelectable | Qt::ItemIsEnabled);
+ QCOMPARE(model.index(0, 1).flags(), Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable);
+ QCOMPARE(model.index(0, 2).flags(), Qt::ItemIsSelectable | Qt::ItemIsEnabled);
+ QCOMPARE(model.index(0, 3).flags(), Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable);
+ QCOMPARE(model.index(0, 4).flags(), Qt::ItemFlags());
+
+ QCOMPARE(model.index(1, 0).flags(), Qt::ItemIsSelectable | Qt::ItemIsEnabled);;
+ QCOMPARE(model.index(1, 1).flags(), Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable);
+ QCOMPARE(model.index(1, 2).flags(), Qt::ItemIsSelectable | Qt::ItemIsEnabled);
+ QCOMPARE(model.index(1, 3).flags(), Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable);
+ QCOMPARE(model.index(1, 4).flags(), Qt::ItemFlags());
+}
+
+void tst_QGalleryQueryModel::headerData()
+{
+ QtTestGallery gallery;
+ populateGallery(&gallery);
+
+ QGalleryQueryModel model(&gallery);
+
+ model.addColumn(QLatin1String("title"));
+ model.addColumn(QLatin1String("artist"));
+ model.addColumn(QLatin1String("duration"));
+
+ QCOMPARE(model.headerData(-1, Qt::Horizontal, Qt::DisplayRole), QVariant());
+ QCOMPARE(model.headerData(3, Qt::Horizontal, Qt::DisplayRole), QVariant());
+ QCOMPARE(model.headerData(-1, Qt::Vertical, Qt::DisplayRole), QVariant());
+ QCOMPARE(model.headerData(3, Qt::Vertical, Qt::DisplayRole), QVariant());
+ QCOMPARE(model.headerData(0, Qt::Vertical, Qt::DisplayRole), QVariant());
+ QCOMPARE(model.headerData(2, Qt::Vertical, Qt::DisplayRole), QVariant());
+
+ QCOMPARE(model.setHeaderData(-1, Qt::Horizontal, QLatin1String("Hello"), Qt::DisplayRole), false);
+ QCOMPARE(model.setHeaderData(3, Qt::Horizontal, QLatin1String("Hello"), Qt::DisplayRole), false);
+ QCOMPARE(model.setHeaderData(-1, Qt::Vertical, QLatin1String("Hello"), Qt::DisplayRole), false);
+ QCOMPARE(model.setHeaderData(3, Qt::Vertical, QLatin1String("Hello"), Qt::DisplayRole), false);
+ QCOMPARE(model.setHeaderData(0, Qt::Vertical, QLatin1String("Hello"), Qt::DisplayRole), false);
+ QCOMPARE(model.setHeaderData(2, Qt::Vertical, QLatin1String("Hello"), Qt::DisplayRole), false);
+
+ QCOMPARE(model.setHeaderData(0, Qt::Horizontal, QLatin1String("Title"), Qt::DisplayRole), true);
+ QCOMPARE(model.headerData(0, Qt::Horizontal, Qt::DisplayRole), QVariant(QLatin1String("Title")));
+ QCOMPARE(model.setHeaderData(1, Qt::Horizontal, QLatin1String("Artist"), Qt::DisplayRole), true);
+ QCOMPARE(model.headerData(1, Qt::Horizontal, Qt::DisplayRole), QVariant(QLatin1String("Artist")));
+ QCOMPARE(model.setHeaderData(2, Qt::Horizontal, QLatin1String("Duration"), Qt::DisplayRole), true);
+ QCOMPARE(model.headerData(2, Qt::Horizontal, Qt::DisplayRole), QVariant(QLatin1String("Duration")));
+
+ QCOMPARE(model.headerData(0, Qt::Horizontal, Qt::EditRole), QVariant(QLatin1String("Title")));
+ QCOMPARE(model.setHeaderData(0, Qt::Horizontal, QLatin1String("Edit"), Qt::EditRole), true);
+ QCOMPARE(model.headerData(0, Qt::Horizontal, Qt::EditRole), QVariant(QLatin1String("Edit")));
+
+ QCOMPARE(model.headerData(0, Qt::Horizontal, Qt::UserRole), QVariant());
+ QCOMPARE(model.setHeaderData(0, Qt::Horizontal, QLatin1String("User"), Qt::UserRole), true);
+ QCOMPARE(model.headerData(0, Qt::Horizontal, Qt::UserRole), QVariant(QLatin1String("User")));
+
+ QCOMPARE(model.headerData(0, Qt::Horizontal, Qt::DisplayRole), QVariant(QLatin1String("Edit")));
+}
+
+void tst_QGalleryQueryModel::addColumn()
+{
+ QtTestGallery gallery;
+ populateGallery(&gallery);
+
+ QGalleryQueryModel model(&gallery);
+ model.execute();
+
+ QSignalSpy columnSpy(&model, SIGNAL(columnsInserted(QModelIndex,int,int)));
+
+ QCOMPARE(model.columnCount(), 0);
+
+ QCOMPARE(model.index(0, 0).isValid(), false);
+ QCOMPARE(model.index(0, 1).isValid(), false);
+ QCOMPARE(model.index(0, 2).isValid(), false);
+ QCOMPARE(model.index(0, 3).isValid(), false);
+ QCOMPARE(model.index(0, 4).isValid(), false);
+
+ model.addColumn(albumProperties);
+ QCOMPARE(model.columnCount(), 1);
+ QCOMPARE(model.setHeaderData(0, Qt::Horizontal, QLatin1String("Album")), true);
+
+ QCOMPARE(columnSpy.count(), 1);
+ QCOMPARE(columnSpy.last().at(0).value<QModelIndex>(), QModelIndex());
+ QCOMPARE(columnSpy.last().at(1).toInt(), 0);
+ QCOMPARE(columnSpy.last().at(2).toInt(), 0);
+
+ model.addColumn(titleProperties);
+ QCOMPARE(model.columnCount(), 2);
+ QCOMPARE(model.setHeaderData(1, Qt::Horizontal, QLatin1String("Title")), true);
+
+ QCOMPARE(columnSpy.count(), 2);
+ QCOMPARE(columnSpy.last().at(0).value<QModelIndex>(), QModelIndex());
+ QCOMPARE(columnSpy.last().at(1).toInt(), 1);
+ QCOMPARE(columnSpy.last().at(2).toInt(), 1);
+
+ model.addColumn(QLatin1String("duration"), Qt::DisplayRole);
+ QCOMPARE(model.columnCount(), 3);
+ QCOMPARE(model.setHeaderData(2, Qt::Horizontal, QLatin1String("Duration")), true);
+
+ QCOMPARE(columnSpy.count(), 3);
+ QCOMPARE(columnSpy.last().at(0).value<QModelIndex>(), QModelIndex());
+ QCOMPARE(columnSpy.last().at(1).toInt(), 2);
+ QCOMPARE(columnSpy.last().at(2).toInt(), 2);
+
+ model.addColumn(QLatin1String("rating"), Qt::DisplayRole);
+ QCOMPARE(model.columnCount(), 4);
+ QCOMPARE(model.setHeaderData(3, Qt::Horizontal, QLatin1String("Rating")), true);
+
+ QCOMPARE(columnSpy.count(), 4);
+ QCOMPARE(columnSpy.last().at(0).value<QModelIndex>(), QModelIndex());
+ QCOMPARE(columnSpy.last().at(1).toInt(), 3);
+ QCOMPARE(columnSpy.last().at(2).toInt(), 3);
+
+ model.addColumn(QLatin1String("turtle"));
+ QCOMPARE(model.columnCount(), 5);
+ QCOMPARE(model.setHeaderData(4, Qt::Horizontal, QLatin1String("Turtle")), true);
+
+ QCOMPARE(columnSpy.count(), 5);
+ QCOMPARE(columnSpy.last().at(0).value<QModelIndex>(), QModelIndex());
+ QCOMPARE(columnSpy.last().at(1).toInt(), 4);
+ QCOMPARE(columnSpy.last().at(2).toInt(), 4);
+
+ QCOMPARE(model.roleProperties(0), albumProperties);
+ QCOMPARE(model.roleProperties(1), titleProperties);
+ QCOMPARE(model.roleProperties(2), durationProperties);
+ QCOMPARE(model.roleProperties(3), ratingProperties);
+ QCOMPARE(model.roleProperties(4), turtleProperties);
+
+ QCOMPARE(model.index(0, 0).isValid(), true);
+ QCOMPARE(model.index(0, 1).isValid(), true);
+ QCOMPARE(model.index(0, 2).isValid(), true);
+ QCOMPARE(model.index(0, 3).isValid(), true);
+ QCOMPARE(model.index(0, 4).isValid(), true);
+
+ QCOMPARE(model.index(0, 0).flags(), Qt::ItemIsSelectable | Qt::ItemIsEnabled);
+ QCOMPARE(model.index(0, 1).flags(), Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable);
+ QCOMPARE(model.index(0, 2).flags(), Qt::ItemIsSelectable | Qt::ItemIsEnabled);
+ QCOMPARE(model.index(0, 3).flags(), Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable);
+ QCOMPARE(model.index(0, 4).flags(), Qt::ItemFlags());
+
+ QCOMPARE(model.headerData(0, Qt::Horizontal), QVariant(QLatin1String("Album")));
+ QCOMPARE(model.headerData(1, Qt::Horizontal), QVariant(QLatin1String("Title")));
+ QCOMPARE(model.headerData(2, Qt::Horizontal), QVariant(QLatin1String("Duration")));
+ QCOMPARE(model.headerData(3, Qt::Horizontal), QVariant(QLatin1String("Rating")));
+ QCOMPARE(model.headerData(4, Qt::Horizontal), QVariant(QLatin1String("Turtle")));
+
+ QModelIndex index;
+
+ index = model.index(0, 0);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(QLatin1String("Greatest Hits")));
+ QCOMPARE(index.data(Qt::EditRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole), QVariant(QLatin1String("Self Titled")));
+ QCOMPARE(index.data(Qt::UserRole + 1), QVariant(QLatin1String("album:SelfTitled:GreatestHits")));
+
+ index = model.index(0, 1);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(QLatin1String("Interlude")));
+ QCOMPARE(index.data(Qt::EditRole), QVariant(QLatin1String("Interlude")));
+ QCOMPARE(index.data(Qt::UserRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole + 1), QVariant());
+
+ index = model.index(0, 2);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(120100));
+ QCOMPARE(index.data(Qt::EditRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole + 1), QVariant());
+
+ index = model.index(0, 3);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(4));
+ QCOMPARE(index.data(Qt::EditRole), QVariant(4));
+ QCOMPARE(index.data(Qt::UserRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole + 1), QVariant());
+
+ index = model.index(0, 4);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant());
+ QCOMPARE(index.data(Qt::EditRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole + 1), QVariant());
+
+ index = model.index(1, 0);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant());
+ QCOMPARE(model.setData(index, QLatin1String("Noise"), Qt::DisplayRole), false);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant());
+
+ QCOMPARE(index.data(Qt::EditRole), QVariant());
+ QCOMPARE(model.setData(index, QLatin1String("Noise"), Qt::EditRole), false);
+ QCOMPARE(index.data(Qt::EditRole), QVariant());
+
+ QCOMPARE(index.data(Qt::UserRole), QVariant());
+ QCOMPARE(model.setData(index, QLatin1String("Effects People"), Qt::UserRole), false);
+ QCOMPARE(index.data(Qt::UserRole), QVariant());
+
+ QCOMPARE(index.data(Qt::UserRole + 1), QVariant());
+ QCOMPARE(model.setData(index, QLatin1String("album:EffectsPeople:Noise"), Qt::UserRole + 1), true);
+ QCOMPARE(index.data(Qt::UserRole + 1), QVariant(QLatin1String("album:EffectsPeople:Noise")));
+
+ index = model.index(1, 1);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(QLatin1String("beep.wav")));
+ QCOMPARE(model.setData(index, QLatin1String("Beep Sound"), Qt::DisplayRole), false);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(QLatin1String("beep.wav")));
+
+ QCOMPARE(index.data(Qt::EditRole), QVariant());
+ QCOMPARE(model.setData(index, QLatin1String("Beep Sound"), Qt::EditRole), true);
+ QCOMPARE(index.data(Qt::EditRole), QVariant(QLatin1String("Beep Sound")));
+
+ index = model.index(1, 2);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(600));
+ QCOMPARE(model.setData(index, 1000, Qt::DisplayRole), false);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(600));
+
+ QCOMPARE(index.data(Qt::EditRole), QVariant());
+ QCOMPARE(model.setData(index, 1000, Qt::EditRole), false);
+ QCOMPARE(index.data(Qt::EditRole), QVariant());
+
+ index = model.index(1, 3);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant());
+ QCOMPARE(model.setData(index, 2, Qt::DisplayRole), true);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(2));
+ QCOMPARE(index.data(Qt::EditRole), QVariant(2));
+ QCOMPARE(model.setData(index, 5, Qt::EditRole), true);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(5));
+ QCOMPARE(index.data(Qt::EditRole), QVariant(5));
+}
+
+void tst_QGalleryQueryModel::insertColumn()
+{
+ QtTestGallery gallery;
+ populateGallery(&gallery);
+
+ QGalleryQueryModel model(&gallery);
+ model.execute();
+
+ QSignalSpy columnSpy(&model, SIGNAL(columnsInserted(QModelIndex,int,int)));
+
+ QCOMPARE(model.columnCount(), 0);
+ QCOMPARE(model.index(0, 0).isValid(), false);
+ QCOMPARE(model.index(0, 1).isValid(), false);
+ QCOMPARE(model.index(0, 2).isValid(), false);
+ QCOMPARE(model.index(0, 3).isValid(), false);
+ QCOMPARE(model.index(0, 4).isValid(), false);
+
+ model.insertColumn(0, albumProperties);
+ QCOMPARE(model.columnCount(), 1);
+ QCOMPARE(model.setHeaderData(0, Qt::Horizontal, QLatin1String("Album")), true);
+ QCOMPARE(model.index(0, 0).data(Qt::DisplayRole), QVariant(QLatin1String("Greatest Hits")));
+
+ QCOMPARE(columnSpy.count(), 1);
+ QCOMPARE(columnSpy.last().at(0).value<QModelIndex>(), QModelIndex());
+ QCOMPARE(columnSpy.last().at(1).toInt(), 0);
+ QCOMPARE(columnSpy.last().at(2).toInt(), 0);
+
+ model.insertColumn(0, titleProperties);
+ QCOMPARE(model.columnCount(), 2);
+ QCOMPARE(model.setHeaderData(0, Qt::Horizontal, QLatin1String("Title")), true);
+
+ QCOMPARE(columnSpy.count(), 2);
+ QCOMPARE(columnSpy.last().at(0).value<QModelIndex>(), QModelIndex());
+ QCOMPARE(columnSpy.last().at(1).toInt(), 0);
+ QCOMPARE(columnSpy.last().at(2).toInt(), 0);
+
+ model.insertColumn(1, QLatin1String("duration"), Qt::DisplayRole);
+ QCOMPARE(model.columnCount(), 3);
+ QCOMPARE(model.setHeaderData(1, Qt::Horizontal, QLatin1String("Duration")), true);
+
+ QCOMPARE(columnSpy.count(), 3);
+ QCOMPARE(columnSpy.last().at(0).value<QModelIndex>(), QModelIndex());
+ QCOMPARE(columnSpy.last().at(1).toInt(), 1);
+ QCOMPARE(columnSpy.last().at(2).toInt(), 1);
+
+ model.insertColumn(2, QLatin1String("rating"), Qt::DisplayRole);
+ QCOMPARE(model.columnCount(), 4);
+ QCOMPARE(model.setHeaderData(2, Qt::Horizontal, QLatin1String("Rating")), true);
+
+ QCOMPARE(columnSpy.count(), 4);
+ QCOMPARE(columnSpy.last().at(0).value<QModelIndex>(), QModelIndex());
+ QCOMPARE(columnSpy.last().at(1).toInt(), 2);
+ QCOMPARE(columnSpy.last().at(2).toInt(), 2);
+
+ model.insertColumn(4, QLatin1String("turtle"));
+ QCOMPARE(model.columnCount(), 5);
+ QCOMPARE(model.setHeaderData(4, Qt::Horizontal, QLatin1String("Turtle")), true);
+
+ QCOMPARE(columnSpy.count(), 5);
+ QCOMPARE(columnSpy.last().at(0).value<QModelIndex>(), QModelIndex());
+ QCOMPARE(columnSpy.last().at(1).toInt(), 4);
+ QCOMPARE(columnSpy.last().at(2).toInt(), 4);
+
+ QCOMPARE(model.roleProperties(0), titleProperties);
+ QCOMPARE(model.roleProperties(1), durationProperties);
+ QCOMPARE(model.roleProperties(2), ratingProperties);
+ QCOMPARE(model.roleProperties(3), albumProperties);
+ QCOMPARE(model.roleProperties(4), turtleProperties);
+
+ QCOMPARE(model.index(0, 0).isValid(), true);
+ QCOMPARE(model.index(0, 1).isValid(), true);
+ QCOMPARE(model.index(0, 2).isValid(), true);
+ QCOMPARE(model.index(0, 3).isValid(), true);
+ QCOMPARE(model.index(0, 4).isValid(), true);
+
+ QCOMPARE(model.index(0, 0).flags(), Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable);
+ QCOMPARE(model.index(0, 1).flags(), Qt::ItemIsSelectable | Qt::ItemIsEnabled);
+ QCOMPARE(model.index(0, 2).flags(), Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable);
+ QCOMPARE(model.index(0, 3).flags(), Qt::ItemIsSelectable | Qt::ItemIsEnabled);
+ QCOMPARE(model.index(0, 4).flags(), Qt::ItemFlags());
+
+ QCOMPARE(model.headerData(0, Qt::Horizontal), QVariant(QLatin1String("Title")));
+ QCOMPARE(model.headerData(1, Qt::Horizontal), QVariant(QLatin1String("Duration")));
+ QCOMPARE(model.headerData(2, Qt::Horizontal), QVariant(QLatin1String("Rating")));
+ QCOMPARE(model.headerData(3, Qt::Horizontal), QVariant(QLatin1String("Album")));
+ QCOMPARE(model.headerData(4, Qt::Horizontal), QVariant(QLatin1String("Turtle")));
+
+ QModelIndex index;
+
+ index = model.index(0, 0);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(QLatin1String("Interlude")));
+ QCOMPARE(index.data(Qt::EditRole), QVariant(QLatin1String("Interlude")));
+ QCOMPARE(index.data(Qt::UserRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole + 1), QVariant());
+
+ index = model.index(0, 1);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(120100));
+ QCOMPARE(index.data(Qt::EditRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole + 1), QVariant());
+
+ index = model.index(0, 2);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(4));
+ QCOMPARE(index.data(Qt::EditRole), QVariant(4));
+ QCOMPARE(index.data(Qt::UserRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole + 1), QVariant());
+
+ index = model.index(0, 3);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(QLatin1String("Greatest Hits")));
+ QCOMPARE(index.data(Qt::EditRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole), QVariant(QLatin1String("Self Titled")));
+ QCOMPARE(index.data(Qt::UserRole + 1), QVariant(QLatin1String("album:SelfTitled:GreatestHits")));
+
+ index = model.index(0, 4);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant());
+ QCOMPARE(index.data(Qt::EditRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole + 1), QVariant());
+
+ index = model.index(1, 0);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(QLatin1String("beep.wav")));
+ QCOMPARE(model.setData(index, QLatin1String("Beep Sound"), Qt::DisplayRole), false);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(QLatin1String("beep.wav")));
+
+ QCOMPARE(index.data(Qt::EditRole), QVariant());
+ QCOMPARE(model.setData(index, QLatin1String("Beep Sound"), Qt::EditRole), true);
+ QCOMPARE(index.data(Qt::EditRole), QVariant(QLatin1String("Beep Sound")));
+
+ index = model.index(1, 1);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(600));
+ QCOMPARE(model.setData(index, 1000, Qt::DisplayRole), false);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(600));
+
+ QCOMPARE(index.data(Qt::EditRole), QVariant());
+ QCOMPARE(model.setData(index, 1000, Qt::EditRole), false);
+ QCOMPARE(index.data(Qt::EditRole), QVariant());
+
+ index = model.index(1, 2);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant());
+ QCOMPARE(model.setData(index, 2, Qt::DisplayRole), true);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(2));
+ QCOMPARE(index.data(Qt::EditRole), QVariant(2));
+ QCOMPARE(model.setData(index, 5, Qt::EditRole), true);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(5));
+ QCOMPARE(index.data(Qt::EditRole), QVariant(5));
+
+ index = model.index(1, 3);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant());
+ QCOMPARE(model.setData(index, QLatin1String("Noise"), Qt::DisplayRole), false);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant());
+
+ QCOMPARE(index.data(Qt::EditRole), QVariant());
+ QCOMPARE(model.setData(index, QLatin1String("Noise"), Qt::EditRole), false);
+ QCOMPARE(index.data(Qt::EditRole), QVariant());
+
+ QCOMPARE(index.data(Qt::UserRole), QVariant());
+ QCOMPARE(model.setData(index, QLatin1String("Effects People"), Qt::UserRole), false);
+ QCOMPARE(index.data(Qt::UserRole), QVariant());
+
+ QCOMPARE(index.data(Qt::UserRole + 1), QVariant());
+ QCOMPARE(model.setData(index, QLatin1String("album:EffectsPeople:Noise"), Qt::UserRole + 1), true);
+ QCOMPARE(index.data(Qt::UserRole + 1), QVariant(QLatin1String("album:EffectsPeople:Noise")));
+}
+
+void tst_QGalleryQueryModel::removeColumn()
+{
+ QtTestGallery gallery;
+ populateGallery(&gallery);
+
+ QGalleryQueryModel model(&gallery);
+
+ QCOMPARE(model.index(0, 0).isValid(), false);
+ QCOMPARE(model.index(0, 1).isValid(), false);
+ QCOMPARE(model.index(0, 2).isValid(), false);
+ QCOMPARE(model.index(0, 3).isValid(), false);
+ QCOMPARE(model.index(0, 4).isValid(), false);
+
+ model.addColumn(albumProperties);
+ model.addColumn(titleProperties);
+ model.addColumn(QLatin1String("duration"), Qt::DisplayRole);
+ model.addColumn(QLatin1String("rating"), Qt::DisplayRole);
+ model.addColumn(QLatin1String("turtle"));
+
+ QCOMPARE(model.setHeaderData(0, Qt::Horizontal, QLatin1String("Album")), true);
+ QCOMPARE(model.setHeaderData(1, Qt::Horizontal, QLatin1String("Title")), true);
+ QCOMPARE(model.setHeaderData(2, Qt::Horizontal, QLatin1String("Duration")), true);
+ QCOMPARE(model.setHeaderData(3, Qt::Horizontal, QLatin1String("Rating")), true);
+ QCOMPARE(model.setHeaderData(4, Qt::Horizontal, QLatin1String("Turtle")), true);
+
+ model.execute();
+
+ QSignalSpy columnSpy(&model, SIGNAL(columnsRemoved(QModelIndex,int,int)));
+
+ model.removeColumn(4);
+ QCOMPARE(columnSpy.count(), 1);
+ QCOMPARE(columnSpy.last().at(0).value<QModelIndex>(), QModelIndex());
+ QCOMPARE(columnSpy.last().at(1).toInt(), 4);
+ QCOMPARE(columnSpy.last().at(2).toInt(), 4);
+
+ model.removeColumn(0);
+ QCOMPARE(columnSpy.count(), 2);
+ QCOMPARE(columnSpy.last().at(0).value<QModelIndex>(), QModelIndex());
+ QCOMPARE(columnSpy.last().at(1).toInt(), 0);
+ QCOMPARE(columnSpy.last().at(2).toInt(), 0);
+
+ model.removeColumn(1);
+ QCOMPARE(columnSpy.count(), 3);
+ QCOMPARE(columnSpy.last().at(0).value<QModelIndex>(), QModelIndex());
+ QCOMPARE(columnSpy.last().at(1).toInt(), 1);
+ QCOMPARE(columnSpy.last().at(2).toInt(), 1);
+
+ QCOMPARE(model.columnCount(), 2);
+
+ QCOMPARE(model.roleProperties(0), titleProperties);
+ QCOMPARE(model.roleProperties(1), ratingProperties);
+
+ QCOMPARE(model.index(0, 0).isValid(), true);
+ QCOMPARE(model.index(0, 1).isValid(), true);
+
+ QCOMPARE(model.index(0, 0).flags(), Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable);
+ QCOMPARE(model.index(0, 1).flags(), Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable);
+
+ QCOMPARE(model.headerData(0, Qt::Horizontal), QVariant(QLatin1String("Title")));
+ QCOMPARE(model.headerData(1, Qt::Horizontal), QVariant(QLatin1String("Rating")));
+
+ QModelIndex index;
+
+ index = model.index(0, 0);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(QLatin1String("Interlude")));
+ QCOMPARE(index.data(Qt::EditRole), QVariant(QLatin1String("Interlude")));
+ QCOMPARE(index.data(Qt::UserRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole + 1), QVariant());
+
+ index = model.index(0, 1);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(4));
+ QCOMPARE(index.data(Qt::EditRole), QVariant(4));
+ QCOMPARE(index.data(Qt::UserRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole + 1), QVariant());
+
+ index = model.index(1, 0);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(QLatin1String("beep.wav")));
+ QCOMPARE(model.setData(index, QLatin1String("Beep Sound"), Qt::DisplayRole), false);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(QLatin1String("beep.wav")));
+
+ QCOMPARE(index.data(Qt::EditRole), QVariant());
+ QCOMPARE(model.setData(index, QLatin1String("Beep Sound"), Qt::EditRole), true);
+ QCOMPARE(index.data(Qt::EditRole), QVariant(QLatin1String("Beep Sound")));
+
+ index = model.index(1, 1);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant());
+ QCOMPARE(model.setData(index, 2, Qt::DisplayRole), true);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(2));
+ QCOMPARE(index.data(Qt::EditRole), QVariant(2));
+ QCOMPARE(model.setData(index, 5, Qt::EditRole), true);
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(5));
+ QCOMPARE(index.data(Qt::EditRole), QVariant(5));
+}
+
+void tst_QGalleryQueryModel::setRoleProperties()
+{
+ QtTestGallery gallery;
+ populateGallery(&gallery);
+
+ QGalleryQueryModel model(&gallery);
+ model.execute();
+ QVERIFY(gallery.request() != 0);
+
+ QtTestResultSet *resultSet = qobject_cast<QtTestResultSet *>(gallery.request()->resultSet());
+ QVERIFY(resultSet != 0);
+
+ QSignalSpy dataSpy(&model, SIGNAL(dataChanged(QModelIndex,QModelIndex)));
+
+ QCOMPARE(model.index(0, 0).isValid(), false);
+
+ model.addColumn(albumProperties);
+ QCOMPARE(model.index(0, 0).isValid(), true);
+ QCOMPARE(model.index(0, 0).flags(), Qt::ItemIsSelectable | Qt::ItemIsEnabled);
+
+ model.setRoleProperties(0, titleProperties);
+ QCOMPARE(model.roleProperties(0), titleProperties);
+ QCOMPARE(model.index(0, 0).isValid(), true);
+ QCOMPARE(model.index(0, 0).flags(), Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable);
+
+ QCOMPARE(dataSpy.count(), 1);
+ QCOMPARE(dataSpy.last().at(0).value<QModelIndex>(), model.index(0, 0));
+ QCOMPARE(dataSpy.last().at(1).value<QModelIndex>(), model.index(1, 0));
+
+ model.setRoleProperties(0, durationProperties);
+ QCOMPARE(model.roleProperties(0), durationProperties);
+ QCOMPARE(model.index(0, 0).isValid(), true);
+ QCOMPARE(model.index(0, 0).flags(), Qt::ItemIsSelectable | Qt::ItemIsEnabled);
+
+ QCOMPARE(dataSpy.count(), 2);
+ QCOMPARE(dataSpy.last().at(0).value<QModelIndex>(), model.index(0, 0));
+ QCOMPARE(dataSpy.last().at(1).value<QModelIndex>(), model.index(1, 0));
+
+ model.setRoleProperties(0, ratingProperties);
+ QCOMPARE(model.roleProperties(0), ratingProperties);
+ QCOMPARE(model.index(0, 0).isValid(), true);
+ QCOMPARE(model.index(0, 0).flags(), Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable);
+
+ QCOMPARE(dataSpy.count(), 3);
+ QCOMPARE(dataSpy.last().at(0).value<QModelIndex>(), model.index(0, 0));
+ QCOMPARE(dataSpy.last().at(1).value<QModelIndex>(), model.index(1, 0));
+
+ const QHash<int, QString> emptyProperties;
+
+ model.setRoleProperties(-1, albumProperties);
+ QCOMPARE(model.roleProperties(-1), emptyProperties);
+ QCOMPARE(dataSpy.count(), 3);
+
+ model.setRoleProperties(1, albumProperties);
+ QCOMPARE(model.roleProperties(-1), emptyProperties);
+ QCOMPARE(dataSpy.count(), 3);
+
+ resultSet->removeRows(0, 2);
+
+ model.setRoleProperties(0, albumProperties);
+ QCOMPARE(model.roleProperties(0), albumProperties);
+ QCOMPARE(dataSpy.count(), 3);
+}
+
+void tst_QGalleryQueryModel::itemsInserted()
+{
+ QtTestGallery gallery;
+
+ QGalleryQueryModel model(&gallery);
+ model.execute();
+ QVERIFY(gallery.request() != 0);
+
+ QtTestResultSet *resultSet = qobject_cast<QtTestResultSet *>(gallery.request()->resultSet());
+ QVERIFY(resultSet != 0);
+
+ QSignalSpy insertSpy(&model, SIGNAL(rowsInserted(QModelIndex,int,int)));
+
+ QCOMPARE(model.rowCount(), 0);
+
+ resultSet->beginInsertRows(0);
+ resultSet->addRow();
+ resultSet->addRow();
+ resultSet->addRow();
+ resultSet->addRow();
+ resultSet->endInsertRows();
+
+ QCOMPARE(model.rowCount(), 4);
+
+ QCOMPARE(insertSpy.count(), 1);
+ QCOMPARE(insertSpy.last().at(0).value<QModelIndex>(), QModelIndex());
+ QCOMPARE(insertSpy.last().at(1).toInt(), 0);
+ QCOMPARE(insertSpy.last().at(2).toInt(), 3);
+
+ resultSet->beginInsertRows(2);
+ resultSet->addRow();
+ resultSet->endInsertRows();
+
+ QCOMPARE(model.rowCount(), 5);
+
+ QCOMPARE(insertSpy.count(), 2);
+ QCOMPARE(insertSpy.last().at(0).value<QModelIndex>(), QModelIndex());
+ QCOMPARE(insertSpy.last().at(1).toInt(), 2);
+ QCOMPARE(insertSpy.last().at(2).toInt(), 2);
+
+ resultSet->beginInsertRows(5);
+ resultSet->addRow();
+ resultSet->addRow();
+ resultSet->addRow();
+ resultSet->endInsertRows();
+
+ QCOMPARE(model.rowCount(), 8);
+
+ QCOMPARE(insertSpy.count(), 3);
+ QCOMPARE(insertSpy.last().at(0).value<QModelIndex>(), QModelIndex());
+ QCOMPARE(insertSpy.last().at(1).toInt(), 5);
+ QCOMPARE(insertSpy.last().at(2).toInt(), 7);
+}
+
+void tst_QGalleryQueryModel::itemsRemoved()
+{
+ QtTestGallery gallery;
+
+ QGalleryQueryModel model(&gallery);
+ model.execute();
+ QVERIFY(gallery.request() != 0);
+
+ QtTestResultSet *resultSet = qobject_cast<QtTestResultSet *>(gallery.request()->resultSet());
+ QVERIFY(resultSet != 0);
+
+ resultSet->beginInsertRows(0);
+ resultSet->addRow();
+ resultSet->addRow();
+ resultSet->addRow();
+ resultSet->addRow();
+ resultSet->addRow();
+ resultSet->addRow();
+ resultSet->addRow();
+ resultSet->addRow();
+ resultSet->endInsertRows();
+
+ QCOMPARE(model.rowCount(), 8);
+
+ QSignalSpy removeSpy(&model, SIGNAL(rowsRemoved(QModelIndex,int,int)));
+
+ resultSet->removeRows(5, 3);
+ QCOMPARE(model.rowCount(), 5);
+
+ QCOMPARE(removeSpy.count(), 1);
+ QCOMPARE(removeSpy.last().at(0).value<QModelIndex>(), QModelIndex());
+ QCOMPARE(removeSpy.last().at(1).toInt(), 5);
+ QCOMPARE(removeSpy.last().at(2).toInt(), 7);
+
+ resultSet->removeRows(2, 1);
+ QCOMPARE(model.rowCount(), 4);
+
+ QCOMPARE(removeSpy.count(), 2);
+ QCOMPARE(removeSpy.last().at(0).value<QModelIndex>(), QModelIndex());
+ QCOMPARE(removeSpy.last().at(1).toInt(), 2);
+ QCOMPARE(removeSpy.last().at(2).toInt(), 2);
+
+ resultSet->removeRows(0, 4);
+ QCOMPARE(model.rowCount(), 0);
+
+ QCOMPARE(removeSpy.count(), 3);
+ QCOMPARE(removeSpy.last().at(0).value<QModelIndex>(), QModelIndex());
+ QCOMPARE(removeSpy.last().at(1).toInt(), 0);
+ QCOMPARE(removeSpy.last().at(2).toInt(), 3);
+}
+
+void tst_QGalleryQueryModel::itemsMoved()
+{
+ QtTestGallery gallery;
+
+ QGalleryQueryModel model(&gallery);
+ model.execute();
+ QVERIFY(gallery.request() != 0);
+
+ QtTestResultSet *resultSet = qobject_cast<QtTestResultSet *>(gallery.request()->resultSet());
+ QVERIFY(resultSet != 0);
+
+ resultSet->beginInsertRows(0);
+ resultSet->addRow();
+ resultSet->addRow();
+ resultSet->addRow();
+ resultSet->addRow();
+ resultSet->addRow();
+ resultSet->addRow();
+ resultSet->addRow();
+ resultSet->addRow();
+ resultSet->endInsertRows();
+
+ QCOMPARE(model.rowCount(), 8);
+
+ QSignalSpy moveSpy(&model, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)));
+
+ resultSet->itemsMoved(5, 2, 3);
+ QCOMPARE(model.rowCount(), 8);
+
+ QCOMPARE(moveSpy.count(), 1);
+ QCOMPARE(moveSpy.last().at(0).value<QModelIndex>(), QModelIndex());
+ QCOMPARE(moveSpy.last().at(1).toInt(), 5);
+ QCOMPARE(moveSpy.last().at(2).toInt(), 7);
+ QCOMPARE(moveSpy.last().at(3).value<QModelIndex>(), QModelIndex());
+ QCOMPARE(moveSpy.last().at(4).toInt(), 2);
+
+ resultSet->itemsMoved(2, 7, 1);
+ QCOMPARE(model.rowCount(), 8);
+
+ QCOMPARE(moveSpy.count(), 2);
+ QCOMPARE(moveSpy.last().at(0).value<QModelIndex>(), QModelIndex());
+ QCOMPARE(moveSpy.last().at(1).toInt(), 2);
+ QCOMPARE(moveSpy.last().at(2).toInt(), 2);
+ QCOMPARE(moveSpy.last().at(3).value<QModelIndex>(), QModelIndex());
+ QCOMPARE(moveSpy.last().at(4).toInt(), 7);
+
+ resultSet->itemsMoved(0, 4, 3);
+ QCOMPARE(model.rowCount(), 8);
+
+ QCOMPARE(moveSpy.count(), 3);
+ QCOMPARE(moveSpy.last().at(0).value<QModelIndex>(), QModelIndex());
+ QCOMPARE(moveSpy.last().at(1).toInt(), 0);
+ QCOMPARE(moveSpy.last().at(2).toInt(), 2);
+ QCOMPARE(moveSpy.last().at(3).value<QModelIndex>(), QModelIndex());
+ QCOMPARE(moveSpy.last().at(4).toInt(), 4);
+}
+
+void tst_QGalleryQueryModel::metaDataChanged()
+{
+ QtTestGallery gallery;
+ populateGallery(&gallery);
+ gallery.addRow();
+ gallery.addRow();
+ gallery.addRow();
+ gallery.addRow();
+
+ QGalleryQueryModel model(&gallery);
+
+ model.addColumn(albumProperties);
+ model.addColumn(titleProperties);
+ model.addColumn(QLatin1String("duration"), Qt::DisplayRole);
+ model.addColumn(QLatin1String("rating"), Qt::DisplayRole);
+
+ model.execute();
+ QVERIFY(gallery.request() != 0);
+
+ QtTestResultSet *resultSet = qobject_cast<QtTestResultSet *>(gallery.request()->resultSet());
+ QVERIFY(resultSet != 0);
+
+ const int key0_0 = resultSet->propertyKey(QLatin1String("albumTitle"));
+ const int key0_1 = resultSet->propertyKey(QLatin1String("albumArtist"));
+ const int key0_2 = resultSet->propertyKey(QLatin1String("albumId"));
+ const int key1_0 = resultSet->propertyKey(QLatin1String("displayName"));
+ const int key1_1 = resultSet->propertyKey(QLatin1String("title"));
+ const int key2_0 = resultSet->propertyKey(QLatin1String("duration"));
+ const int key3_0 = resultSet->propertyKey(QLatin1String("rating"));
+
+ QSignalSpy dataSpy(&model, SIGNAL(dataChanged(QModelIndex,QModelIndex)));
+ resultSet->metaDataChanged(0, 1, QList<int>());
+ QCOMPARE(dataSpy.count(), 0);
+
+ resultSet->metaDataChanged(0, 1, QList<int>()
+ << key0_0 << key0_1 << key0_2
+ << key1_0 << key1_1
+ << key2_0
+ << key3_0);
+ QCOMPARE(dataSpy.count(), 1);
+ QCOMPARE(dataSpy.at(dataSpy.count() - 1).at(0).value<QModelIndex>(), model.index(0, 0));
+ QCOMPARE(dataSpy.at(dataSpy.count() - 1).at(1).value<QModelIndex>(), model.index(0, 3));
+
+ resultSet->metaDataChanged(1, 1, QList<int>() << key0_2 << key3_0);
+ QCOMPARE(dataSpy.count(), 3);
+ QCOMPARE(dataSpy.at(dataSpy.count() - 2).at(0).value<QModelIndex>(), model.index(1, 0));
+ QCOMPARE(dataSpy.at(dataSpy.count() - 2).at(1).value<QModelIndex>(), model.index(1, 0));
+ QCOMPARE(dataSpy.at(dataSpy.count() - 1).at(0).value<QModelIndex>(), model.index(1, 3));
+ QCOMPARE(dataSpy.at(dataSpy.count() - 1).at(1).value<QModelIndex>(), model.index(1, 3));
+
+ resultSet->metaDataChanged(0, 2, QList<int>()
+ << key0_0 << key0_1 << key0_2
+ << key1_0 << key1_1
+ << key2_0
+ << key3_0);
+ QCOMPARE(dataSpy.count(), 4);
+ QCOMPARE(dataSpy.at(dataSpy.count() - 1).at(0).value<QModelIndex>(), model.index(0, 0));
+ QCOMPARE(dataSpy.at(dataSpy.count() - 1).at(1).value<QModelIndex>(), model.index(1, 3));
+
+ resultSet->metaDataChanged(1, 3, QList<int>() << key1_1 << key2_0);
+ QCOMPARE(dataSpy.count(), 5);
+ QCOMPARE(dataSpy.at(dataSpy.count() - 1).at(0).value<QModelIndex>(), model.index(1, 1));
+ QCOMPARE(dataSpy.at(dataSpy.count() - 1).at(1).value<QModelIndex>(), model.index(3, 2));
+
+ resultSet->metaDataChanged(0, 1, QList<int>() << key0_1 << key1_1 << key3_0);
+ QCOMPARE(dataSpy.count(), 7);
+ QCOMPARE(dataSpy.at(dataSpy.count() - 2).at(0).value<QModelIndex>(), model.index(0, 0));
+ QCOMPARE(dataSpy.at(dataSpy.count() - 2).at(1).value<QModelIndex>(), model.index(0, 1));
+ QCOMPARE(dataSpy.at(dataSpy.count() - 1).at(0).value<QModelIndex>(), model.index(0, 3));
+ QCOMPARE(dataSpy.at(dataSpy.count() - 1).at(1).value<QModelIndex>(), model.index(0, 3));
+
+ model.removeColumn(0);
+ model.removeColumn(0);
+ model.removeColumn(0);
+ model.removeColumn(0);
+
+ resultSet->metaDataChanged(0, 1, QList<int>());
+ QCOMPARE(dataSpy.count(), 7);
+
+ resultSet->metaDataChanged(1, 1, QList<int>() << key0_2 << key3_0);
+ QCOMPARE(dataSpy.count(), 7);
+
+ resultSet->metaDataChanged(0, 2, QList<int>()
+ << key0_0 << key0_1 << key0_2
+ << key1_0 << key1_1
+ << key2_0
+ << key3_0);
+ QCOMPARE(dataSpy.count(), 7);
+
+ resultSet->metaDataChanged(1, 3, QList<int>() << key0_1 << key2_0);
+ QCOMPARE(dataSpy.count(), 7);
+
+ resultSet->metaDataChanged(0, 1, QList<int>() << key0_1 << key1_1 << key3_0);
+ QCOMPARE(dataSpy.count(), 7);
+}
+
+void tst_QGalleryQueryModel::invalidIndex()
+{
+ QtTestGallery gallery;
+ populateGallery(&gallery);
+
+ QGalleryQueryModel model(&gallery);
+ model.addColumn(albumProperties);
+ model.addColumn(titleProperties);
+ model.addColumn(QLatin1String("duration"), Qt::DisplayRole);
+ model.addColumn(QLatin1String("rating"), Qt::DisplayRole);
+ model.addColumn(QLatin1String("turtle"), Qt::DisplayRole);
+
+ QCOMPARE(model.itemId(QModelIndex()), QVariant());
+ QCOMPARE(model.itemUrl(QModelIndex()), QUrl());
+ QCOMPARE(model.itemType(QModelIndex()), QString());
+ QCOMPARE(model.flags(QModelIndex()), Qt::ItemFlags());
+ QCOMPARE(model.data(QModelIndex(), Qt::DisplayRole), QVariant());
+ QCOMPARE(model.data(QModelIndex(), Qt::EditRole), QVariant());
+ QCOMPARE(model.data(QModelIndex(), Qt::UserRole), QVariant());
+ QCOMPARE(model.data(QModelIndex(), Qt::UserRole + 1), QVariant());
+ QCOMPARE(model.setData(QModelIndex(), QLatin1String("Hello"), Qt::DisplayRole), false);
+ QCOMPARE(model.setData(QModelIndex(), QLatin1String("Hello"), Qt::EditRole), false);
+ QCOMPARE(model.setData(QModelIndex(), QLatin1String("Hello"), Qt::UserRole), false);
+ QCOMPARE(model.setData(QModelIndex(), QLatin1String("Hello"), Qt::UserRole + 1), false);
+ QCOMPARE(model.data(QModelIndex(), Qt::DisplayRole), QVariant());
+ QCOMPARE(model.data(QModelIndex(), Qt::EditRole), QVariant());
+ QCOMPARE(model.data(QModelIndex(), Qt::UserRole), QVariant());
+ QCOMPARE(model.data(QModelIndex(), Qt::UserRole + 1), QVariant());
+}
+void tst_QGalleryQueryModel::hierarchy()
+{
+ QtTestGallery gallery;
+ populateGallery(&gallery);
+
+ QGalleryQueryModel model(&gallery);
+ model.addColumn(albumProperties);
+ model.addColumn(titleProperties);
+ model.addColumn(QLatin1String("duration"), Qt::DisplayRole);
+ model.addColumn(QLatin1String("rating"), Qt::DisplayRole);
+ model.execute();
+
+ QModelIndex index = model.index(0, 0);
+ QCOMPARE(index.isValid(), true);
+ QCOMPARE(model.parent(QModelIndex()).isValid(), false);
+ QCOMPARE(model.parent(index).isValid(), false);
+ QCOMPARE(model.rowCount(index), 0);
+ QCOMPARE(model.columnCount(index), 0);
+ QCOMPARE(model.index(-1, 0, index).isValid(), false);
+ QCOMPARE(model.index(-1, 2, index).isValid(), false);
+ QCOMPARE(model.index(-1, 3, index).isValid(), false);
+ QCOMPARE(model.index(-1, 4, index).isValid(), false);
+ QCOMPARE(model.index( 0, 0, index).isValid(), false);
+ QCOMPARE(model.index( 0, 2, index).isValid(), false);
+ QCOMPARE(model.index( 0, 3, index).isValid(), false);
+ QCOMPARE(model.index( 0, 4, index).isValid(), false);
+ QCOMPARE(model.index( 1, 0, index).isValid(), false);
+ QCOMPARE(model.index( 1, 2, index).isValid(), false);
+ QCOMPARE(model.index( 1, 3, index).isValid(), false);
+ QCOMPARE(model.index( 1, 4, index).isValid(), false);
+ QCOMPARE(model.index( 4, 0, index).isValid(), false);
+ QCOMPARE(model.index( 4, 2, index).isValid(), false);
+ QCOMPARE(model.index( 4, 3, index).isValid(), false);
+ QCOMPARE(model.index( 4, 4, index).isValid(), false);
+ QCOMPARE(model.index( 5, 0, index).isValid(), false);
+ QCOMPARE(model.index( 5, 2, index).isValid(), false);
+ QCOMPARE(model.index( 5, 3, index).isValid(), false);
+ QCOMPARE(model.index( 5, 4, index).isValid(), false);
+}
+
+void tst_QGalleryQueryModel::setGallery()
+{
+ QtTestGallery gallery;
+ populateGallery(&gallery);
+
+ QModelIndex index;
+
+ QGalleryQueryModel model;
+ model.addColumn(albumProperties);
+ model.addColumn(titleProperties);
+ model.addColumn(QLatin1String("duration"), Qt::DisplayRole);
+ model.addColumn(QLatin1String("rating"), Qt::DisplayRole);
+ model.addColumn(QLatin1String("turtle"), Qt::DisplayRole);
+
+ QVERIFY(model.gallery() == 0);
+ model.execute();
+
+ index = model.index(0, 0);
+ QCOMPARE(index.isValid(), false);
+
+ model.setGallery(&gallery);
+ QVERIFY(model.gallery() == &gallery);
+ model.execute();
+
+ index = model.index(0, 0);
+ QCOMPARE(index.isValid(), true);
+ QCOMPARE(model.itemId(index), QVariant(3));
+ QCOMPARE(model.itemUrl(index), QUrl(QLatin1String("file:///music/interlude.mp3")));
+ QCOMPARE(model.itemType(index), QString::fromLatin1("Audio"));
+ QCOMPARE(index.data(Qt::DisplayRole), QVariant(QLatin1String("Greatest Hits")));
+ QCOMPARE(index.data(Qt::EditRole), QVariant());
+ QCOMPARE(index.data(Qt::UserRole), QVariant(QLatin1String("Self Titled")));
+ QCOMPARE(index.data(Qt::UserRole + 1), QVariant(QLatin1String("album:SelfTitled:GreatestHits")));
+
+ model.setGallery(0);
+ QVERIFY(model.gallery() == 0);
+ model.execute();
+
+ index = model.index(0, 0);
+ QCOMPARE(index.isValid(), false);
+}
+
+void tst_QGalleryQueryModel::galleryChanged()
+{
+ QtTestGallery *gallery;
+ gallery = new (QtTestGallery);
+ QGalleryQueryModel model;
+
+ QSignalSpy galleryChangedSpy(&model, SIGNAL(galleryChanged()));
+ QCOMPARE(galleryChangedSpy.count(), 0);
+
+ model.setGallery(gallery);
+ QCOMPARE(model.gallery(), static_cast<QAbstractGallery*>(gallery));
+ QCOMPARE(galleryChangedSpy.count(), 1);
+
+}
+
+void tst_QGalleryQueryModel::errorChanged()
+{
+
+ QtTestGallery gallery;
+
+ QGalleryQueryModel model(&gallery);
+
+ QSignalSpy errorChangedSpy(&model, SIGNAL(errorChanged()));
+
+ model.execute();
+ QCOMPARE(model.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(errorChangedSpy.count(),0);
+
+ gallery.setError(120, QLatin1String("bad connection"));
+ model.execute();
+ QCOMPARE(model.state(), QGalleryAbstractRequest::Error);
+ QCOMPARE(model.error(),120);
+ QCOMPARE(model.errorString(), QLatin1String("bad connection"));
+ QCOMPARE(errorChangedSpy.count(),1);
+
+
+}
+
+
+QTEST_MAIN(tst_QGalleryQueryModel)
+
+#include "tst_qgalleryquerymodel.moc"
+
diff --git a/tests/auto/qgalleryqueryrequest/qgalleryqueryrequest.pro b/tests/auto/qgalleryqueryrequest/qgalleryqueryrequest.pro
new file mode 100644
index 0000000..ad96d20
--- /dev/null
+++ b/tests/auto/qgalleryqueryrequest/qgalleryqueryrequest.pro
@@ -0,0 +1,3 @@
+include(../auto.pri)
+
+SOURCES += tst_qgalleryqueryrequest.cpp
diff --git a/tests/auto/qgalleryqueryrequest/tst_qgalleryqueryrequest.cpp b/tests/auto/qgalleryqueryrequest/tst_qgalleryqueryrequest.cpp
new file mode 100644
index 0000000..34acd36
--- /dev/null
+++ b/tests/auto/qgalleryqueryrequest/tst_qgalleryqueryrequest.cpp
@@ -0,0 +1,627 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDocGallery module 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$
+**
+****************************************************************************/
+
+//TESTED_COMPONENT=src/gallery
+
+#include <qgalleryqueryrequest.h>
+
+#include <qabstractgallery.h>
+#include <qgalleryabstractresponse.h>
+#include <qgalleryresultset.h>
+#include <qgalleryresource.h>
+#include <qgallerytype.h>
+
+#include <QtTest/QtTest>
+
+Q_DECLARE_METATYPE(QGalleryResultSet*)
+
+class tst_QGalleryQueryRequest : public QObject
+{
+ Q_OBJECT
+public Q_SLOTS:
+ void initTestCase();
+
+private Q_SLOTS:
+ void propertyNames();
+ void sortPropertyNames();
+ void autoUpdate();
+ void offset();
+ void limit();
+ void rootType();
+ void rootItem();
+ void scope();
+ void filter();
+ void executeSynchronous();
+ void executeAsynchronous();
+ void noResponse();
+};
+
+
+class QtGalleryTestResponse : public QGalleryResultSet
+{
+ Q_OBJECT
+public:
+ QtGalleryTestResponse(
+ const QStringList &propertyNames,
+ int count,
+ QGalleryAbstractRequest::State state,
+ int error,
+ const QString &errorString)
+ : m_count(count)
+ , m_currentIndex(-1)
+ , m_propertyNames(propertyNames)
+ {
+ if (error != QGalleryAbstractRequest::NoError)
+ QGalleryAbstractResponse::error(error, errorString);
+ else if (state == QGalleryAbstractRequest::Finished)
+ finish();
+ else if (state == QGalleryAbstractRequest::Idle)
+ finish(true);
+ }
+
+ int propertyKey(const QString &propertyName) const {
+ return m_propertyNames.indexOf(propertyName); }
+ QGalleryProperty::Attributes propertyAttributes(int) const {
+ return QGalleryProperty::CanRead | QGalleryProperty::CanWrite; }
+ QVariant::Type propertyType(int) const { return QVariant::String; }
+
+ int itemCount() const { return m_count; }
+
+ int currentIndex() const { return m_currentIndex; }
+
+ bool fetch(int index)
+ {
+ emit currentIndexChanged(m_currentIndex = index);
+ emit currentItemChanged();
+
+ return isValid();
+ }
+
+ QVariant itemId() const { return isValid() ? QVariant(1) : QVariant(); }
+ QUrl itemUrl() const { return isValid() ? QUrl("http://example.com") : QUrl(); }
+ QString itemType() const { return isValid() ? QLatin1String("WebPage") : QString(); }
+
+ QVariant metaData(int key) const { return isValid() ? m_metaData.value(key) : QVariant(); }
+ bool setMetaData(int key, const QVariant &value)
+ {
+ if (isValid()) {
+ m_metaData.insert(key, value);
+ emit metaDataChanged(m_currentIndex, 1, QList<int>() << key);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ void setCount(int count) { m_count = count; }
+
+ using QGalleryAbstractResponse::finish;
+ using QGalleryResultSet::itemsInserted;
+ using QGalleryResultSet::itemsRemoved;
+ using QGalleryResultSet::itemsMoved;
+ using QGalleryResultSet::metaDataChanged;
+
+private:
+ int m_count;
+ int m_currentIndex;
+ QStringList m_propertyNames;
+ QHash<int, QVariant> m_metaData;
+};
+
+class QtTestGallery : public QAbstractGallery
+{
+public:
+ QtTestGallery()
+ : m_count(1)
+ , m_state(QGalleryAbstractRequest::Active)
+ , m_error(QGalleryAbstractRequest::NoError)
+ {}
+
+ bool isRequestSupported(QGalleryAbstractRequest::RequestType type) const {
+ return type == QGalleryAbstractRequest::QueryRequest; }
+
+ void setState(QGalleryAbstractRequest::State state) { m_state = state; }
+ void setError(int error, const QString &errorString) {
+ m_error = error; m_errorString = errorString; }
+
+ void setCount(int count) { m_count = count; }
+
+protected:
+ QGalleryAbstractResponse *createResponse(QGalleryAbstractRequest *request)
+ {
+ if (request->type() == QGalleryAbstractRequest::QueryRequest) {
+ return new QtGalleryTestResponse(
+ static_cast<QGalleryQueryRequest *>(request)->propertyNames(),
+ m_count,
+ m_state,
+ m_error,
+ m_errorString);
+ }
+ return 0;
+ }
+
+private:
+ int m_count;
+ QGalleryAbstractRequest::State m_state;
+ int m_error;
+ QString m_errorString;
+};
+
+
+void tst_QGalleryQueryRequest::initTestCase()
+{
+ qRegisterMetaType<QGalleryResultSet*>();
+}
+
+void tst_QGalleryQueryRequest::propertyNames()
+{
+ const QGalleryProperty titleProperty = {"title", sizeof("title")};
+ const QGalleryProperty artistProperty = {"artist", sizeof("artist")};
+
+ const QStringList propertyNames = QStringList()
+ << titleProperty
+ << artistProperty.name()
+ << QLatin1String("album")
+ << QLatin1String("trackNumber");
+
+ QGalleryQueryRequest request;
+
+ QSignalSpy spy(&request, SIGNAL(propertyNamesChanged()));
+
+ QCOMPARE(request.propertyNames(), QStringList());
+
+ request.setPropertyNames(QStringList());
+ QCOMPARE(request.propertyNames(), QStringList());
+ QCOMPARE(spy.count(), 0);
+
+ request.setPropertyNames(propertyNames);
+ QCOMPARE(request.propertyNames(), propertyNames);
+ QCOMPARE(spy.count(), 1);
+
+ request.setPropertyNames(propertyNames);
+ QCOMPARE(request.propertyNames(), propertyNames);
+ QCOMPARE(spy.count(), 1);
+
+ request.setPropertyNames(QStringList());
+ QCOMPARE(request.propertyNames(), QStringList());
+ QCOMPARE(spy.count(), 2);
+}
+
+void tst_QGalleryQueryRequest::sortPropertyNames()
+{
+ const QStringList propertyNames = QStringList()
+ << QLatin1String("-rating")
+ << QLatin1String("+duration");
+
+ QGalleryQueryRequest request;
+
+ QSignalSpy spy(&request, SIGNAL(sortPropertyNamesChanged()));
+
+ QCOMPARE(request.sortPropertyNames(), QStringList());
+
+ request.setSortPropertyNames(QStringList());
+ QCOMPARE(request.sortPropertyNames(), QStringList());
+ QCOMPARE(spy.count(), 0);
+
+ request.setSortPropertyNames(propertyNames);
+ QCOMPARE(request.sortPropertyNames(), propertyNames);
+ QCOMPARE(spy.count(), 1);
+
+ request.setSortPropertyNames(propertyNames);
+ QCOMPARE(request.sortPropertyNames(), propertyNames);
+ QCOMPARE(spy.count(), 1);
+
+ request.setSortPropertyNames(QStringList());
+ QCOMPARE(request.sortPropertyNames(), QStringList());
+ QCOMPARE(spy.count(), 2);
+}
+
+void tst_QGalleryQueryRequest::autoUpdate()
+{
+ QGalleryQueryRequest request;
+
+ QSignalSpy spy(&request, SIGNAL(autoUpdateChanged()));
+
+ QCOMPARE(request.autoUpdate(), false);
+
+ request.setAutoUpdate(false);
+ QCOMPARE(request.autoUpdate(), false);
+ QCOMPARE(spy.count(), 0);
+
+ request.setAutoUpdate(true);
+ QCOMPARE(request.autoUpdate(), true);
+ QCOMPARE(spy.count(), 1);
+
+ request.setAutoUpdate(true);
+ QCOMPARE(request.autoUpdate(), true);
+ QCOMPARE(spy.count(), 1);
+
+ request.setAutoUpdate(false);
+ QCOMPARE(request.autoUpdate(), false);
+ QCOMPARE(spy.count(), 2);
+}
+
+void tst_QGalleryQueryRequest::offset()
+{
+ QGalleryQueryRequest request;
+
+ QSignalSpy spy(&request, SIGNAL(offsetChanged()));
+
+ QCOMPARE(request.offset(), 0);
+
+ request.setOffset(0);
+ QCOMPARE(request.offset(), 0);
+ QCOMPARE(spy.count(), 0);
+
+ request.setOffset(-45);
+ QCOMPARE(request.offset(), 0);
+ QCOMPARE(spy.count(), 0);
+
+ request.setOffset(32);
+ QCOMPARE(request.offset(), 32);
+ QCOMPARE(spy.count(), 1);
+
+ request.setOffset(32);
+ QCOMPARE(request.offset(), 32);
+ QCOMPARE(spy.count(), 1);
+
+ request.setOffset(-45);
+ QCOMPARE(request.offset(), 0);
+ QCOMPARE(spy.count(), 2);
+}
+
+void tst_QGalleryQueryRequest::limit()
+{
+ QGalleryQueryRequest request;
+
+ QSignalSpy spy(&request, SIGNAL(limitChanged()));
+
+ QCOMPARE(request.limit(), 0);
+
+ request.setLimit(0);
+ QCOMPARE(request.limit(), 0);
+ QCOMPARE(spy.count(), 0);
+
+ request.setLimit(-21);
+ QCOMPARE(request.limit(), 0);
+ QCOMPARE(spy.count(), 0);
+
+ request.setLimit(102);
+ QCOMPARE(request.limit(), 102);
+ QCOMPARE(spy.count(), 1);
+
+ request.setLimit(102);
+ QCOMPARE(request.limit(), 102);
+ QCOMPARE(spy.count(), 1);
+
+ request.setLimit(-21);
+ QCOMPARE(request.limit(), 0);
+ QCOMPARE(spy.count(), 2);
+}
+
+void tst_QGalleryQueryRequest::rootType()
+{
+ const QString itemType = QLatin1String("Audio");
+
+ QGalleryQueryRequest request;
+
+ QSignalSpy spy(&request, SIGNAL(rootTypeChanged()));
+
+ QCOMPARE(request.rootType(), QString());
+
+ request.setRootType(QString());
+ QCOMPARE(request.rootType(), QString());
+ QCOMPARE(spy.count(), 0);
+
+ request.setRootType(itemType);
+ QCOMPARE(request.rootType(), itemType);
+ QCOMPARE(spy.count(), 1);
+
+ request.setRootType(itemType);
+ QCOMPARE(request.rootType(), itemType);
+ QCOMPARE(spy.count(), 1);
+
+ request.setRootType(QString());
+ QCOMPARE(request.rootType(), QString());
+ QCOMPARE(spy.count(), 2);
+}
+
+void tst_QGalleryQueryRequest::rootItem()
+{
+ QGalleryQueryRequest request;
+
+ QSignalSpy spy(&request, SIGNAL(rootItemChanged()));
+
+ QCOMPARE(request.rootItem(), QVariant());
+
+ request.setRootItem(QVariant());
+ QCOMPARE(request.rootItem(), QVariant());
+ QCOMPARE(spy.count(), 0);
+
+ request.setRootItem(76);
+ QCOMPARE(request.rootItem(), QVariant(76));
+ QCOMPARE(spy.count(), 1);
+
+ request.setRootItem(76);
+ QCOMPARE(request.rootItem(), QVariant(76));
+ QCOMPARE(spy.count(), 1);
+
+ request.setRootItem(QLatin1String("65"));
+ QCOMPARE(request.rootItem(), QVariant(QLatin1String("65")));
+ QCOMPARE(spy.count(), 2);
+
+ request.setRootItem(QLatin1String("65"));
+ QCOMPARE(request.rootItem(), QVariant(QLatin1String("65")));
+ QCOMPARE(spy.count(), 2);
+
+ request.setRootItem(QVariant());
+ QCOMPARE(request.rootItem(), QVariant());
+ QCOMPARE(spy.count(), 3);
+}
+
+void tst_QGalleryQueryRequest::scope()
+{
+ QGalleryQueryRequest request;
+
+ QSignalSpy spy(&request, SIGNAL(scopeChanged()));
+
+ QCOMPARE(request.scope(), QGalleryQueryRequest::AllDescendants);
+
+ request.setScope(QGalleryQueryRequest::AllDescendants);
+ QCOMPARE(request.scope(), QGalleryQueryRequest::AllDescendants);
+ QCOMPARE(spy.count(), 0);
+
+ request.setScope(QGalleryQueryRequest::DirectDescendants);
+ QCOMPARE(request.scope(), QGalleryQueryRequest::DirectDescendants);
+ QCOMPARE(spy.count(), 1);
+
+ request.setScope(QGalleryQueryRequest::DirectDescendants);
+ QCOMPARE(request.scope(), QGalleryQueryRequest::DirectDescendants);
+ QCOMPARE(spy.count(), 1);
+
+ request.setScope(QGalleryQueryRequest::AllDescendants);
+ QCOMPARE(request.scope(), QGalleryQueryRequest::AllDescendants);
+ QCOMPARE(spy.count(), 2);
+}
+
+void tst_QGalleryQueryRequest::filter()
+{
+ const QGalleryFilter filter = QGalleryMetaDataFilter(
+ QLatin1String("rating"), 3, QGalleryFilter::GreaterThan);
+
+ QGalleryQueryRequest request;
+
+ QSignalSpy spy(&request, SIGNAL(filterChanged()));
+
+ QCOMPARE(request.filter(), QGalleryFilter());
+
+ request.setFilter(QGalleryFilter());
+ QCOMPARE(request.filter(), QGalleryFilter());
+ QCOMPARE(spy.count(), 0);
+
+ request.setFilter(filter);
+ QCOMPARE(request.filter(), filter);
+ QCOMPARE(spy.count(), 1);
+
+ request.setFilter(filter);
+ QCOMPARE(request.filter(), filter);
+ QCOMPARE(spy.count(), 1);
+
+ request.setFilter(QGalleryFilter());
+ QCOMPARE(request.filter(), QGalleryFilter());
+ QCOMPARE(spy.count(), 2);
+}
+
+
+void tst_QGalleryQueryRequest::executeSynchronous()
+{
+ QtTestGallery gallery;
+ gallery.setError(80, QString());
+
+ QGalleryQueryRequest request(&gallery);
+ QVERIFY(request.resultSet() == 0);
+
+ request.setPropertyNames(QStringList()
+ << QLatin1String("album")
+ << QLatin1String("trackNumber"));
+
+ QSignalSpy spy(&request, SIGNAL(resultSetChanged(QGalleryResultSet*)));
+
+ request.execute();
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Error);
+ QCOMPARE(request.error(), 80);
+ QCOMPARE(spy.count(), 0);
+ QVERIFY(qobject_cast<QtGalleryTestResponse *>(request.resultSet()) == 0);
+
+ gallery.setState(QGalleryAbstractRequest::Finished);
+ gallery.setError(QGalleryAbstractRequest::NoError, QString());
+ gallery.setCount(10);
+ request.execute();
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Finished);
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(spy.count(), 1);
+ QVERIFY(qobject_cast<QtGalleryTestResponse *>(request.resultSet()) != 0);
+ QCOMPARE(spy.last().at(0).value<QGalleryResultSet*>(), request.resultSet());
+
+ QCOMPARE(request.propertyKey(QLatin1String("title")), -1);
+ QCOMPARE(request.propertyKey(QLatin1String("album")), 0);
+ QCOMPARE(request.propertyKey(QLatin1String("trackNumber")), 1);
+
+ QCOMPARE(request.propertyAttributes(0), QGalleryProperty::CanRead | QGalleryProperty::CanWrite);
+ QCOMPARE(request.propertyType(0), QVariant::String);
+
+ QCOMPARE(request.itemCount(), 10);
+ QCOMPARE(request.currentIndex(), -1);
+ QCOMPARE(request.itemId(), QVariant());
+ QCOMPARE(request.itemUrl(), QUrl());
+ QCOMPARE(request.itemType(), QString());
+ QCOMPARE(request.metaData(1), QVariant());
+ QCOMPARE(request.setMetaData(1, 12), false);
+ QCOMPARE(request.metaData(1), QVariant());
+ QCOMPARE(request.metaData(QLatin1String("trackNumber")), QVariant());
+ QCOMPARE(request.setMetaData(QLatin1String("trackNumber"), 12), false);
+ QCOMPARE(request.metaData(QLatin1String("trackNumber")), QVariant());
+ QCOMPARE(request.resources(), QList<QGalleryResource>());
+
+ QCOMPARE(request.seek(0, false), true);
+ QCOMPARE(request.currentIndex(), 0);
+ QCOMPARE(request.isValid(), true);
+ QCOMPARE(request.seek(1, true), true);
+ QCOMPARE(request.currentIndex(), 1);
+ QCOMPARE(request.isValid(), true);
+ QCOMPARE(request.seek(-1, true), true);
+ QCOMPARE(request.currentIndex(), 0);
+ QCOMPARE(request.isValid(), true);
+ QCOMPARE(request.seek(-1, false), false);
+ QCOMPARE(request.currentIndex(), -1);
+ QCOMPARE(request.isValid(), false);
+ QCOMPARE(request.last(), true);
+ QCOMPARE(request.currentIndex(), 9);
+ QCOMPARE(request.isValid(), true);
+ QCOMPARE(request.next(), false);
+ QCOMPARE(request.currentIndex(), 10);
+ QCOMPARE(request.isValid(), false);
+ QCOMPARE(request.previous(), true);
+ QCOMPARE(request.currentIndex(), 9);
+ QCOMPARE(request.isValid(), true);
+ QCOMPARE(request.first(), true);
+ QCOMPARE(request.currentIndex(), 0);
+ QCOMPARE(request.previous(), false);
+ QCOMPARE(request.currentIndex(), -1);
+ QCOMPARE(request.isValid(), false);
+ QCOMPARE(request.next(), true);
+ QCOMPARE(request.currentIndex(), 0);
+ QCOMPARE(request.isValid(), true);
+
+ QCOMPARE(request.itemId(), QVariant(1));
+ QCOMPARE(request.itemUrl(), QUrl(QLatin1String("http://example.com")));
+ QCOMPARE(request.itemType(), QLatin1String("WebPage"));
+ QCOMPARE(request.metaData(1), QVariant());
+ QCOMPARE(request.setMetaData(1, 12), true);
+ QCOMPARE(request.metaData(1), QVariant(12));
+ QCOMPARE(request.metaData(QLatin1String("trackNumber")), QVariant(12));
+ QCOMPARE(request.setMetaData(QLatin1String("trackNumber"), 5), true);
+ QCOMPARE(request.metaData(QLatin1String("trackNumber")), QVariant(5));
+ QCOMPARE(request.resources(), QList<QGalleryResource>()
+ << QGalleryResource(QUrl(QLatin1String("http://example.com"))));
+
+ QCOMPARE(request.previous(), false);
+ QCOMPARE(request.currentIndex(), -1);
+
+ QCOMPARE(request.itemId(), QVariant());
+ QCOMPARE(request.itemUrl(), QUrl());
+ QCOMPARE(request.itemType(), QString());
+ QCOMPARE(request.metaData(1), QVariant());
+ QCOMPARE(request.setMetaData(1, 12), false);
+ QCOMPARE(request.metaData(1), QVariant());
+ QCOMPARE(request.metaData(QLatin1String("trackNumber")), QVariant());
+ QCOMPARE(request.setMetaData(QLatin1String("trackNumber"), 12), false);
+ QCOMPARE(request.metaData(QLatin1String("trackNumber")), QVariant());
+ QCOMPARE(request.resources(), QList<QGalleryResource>());
+
+ request.clear();
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Inactive);
+ QCOMPARE(spy.count(), 2);
+ QVERIFY(request.resultSet() == 0);
+ QCOMPARE(spy.last().at(0).value<QGalleryResultSet*>(), request.resultSet());
+}
+
+void tst_QGalleryQueryRequest::executeAsynchronous()
+{
+ QtTestGallery gallery;
+ gallery.setState(QGalleryAbstractRequest::Active);
+
+ QGalleryQueryRequest request(&gallery);
+ QVERIFY(request.resultSet() == 0);
+
+ QSignalSpy spy(&request, SIGNAL(resultSetChanged(QGalleryResultSet*)));
+
+ request.execute();
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Active);
+ QCOMPARE(spy.count(), 1);
+ QVERIFY(qobject_cast<QtGalleryTestResponse *>(request.resultSet()) != 0);
+ QCOMPARE(spy.last().at(0).value<QGalleryResultSet*>(), request.resultSet());
+
+ qobject_cast<QtGalleryTestResponse *>(request.resultSet())->finish(false);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Finished);
+ QCOMPARE(spy.count(), 1);
+ QVERIFY(qobject_cast<QtGalleryTestResponse *>(request.resultSet()) != 0);
+
+ request.clear();
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Inactive);
+ QCOMPARE(spy.count(), 2);
+ QVERIFY(request.resultSet() == 0);
+ QCOMPARE(spy.last().at(0).value<QGalleryResultSet*>(), request.resultSet());
+}
+
+void tst_QGalleryQueryRequest::noResponse()
+{
+ QGalleryQueryRequest request;
+
+ QCOMPARE(request.propertyKey(QLatin1String("title")), -1);
+ QCOMPARE(request.propertyKey(QLatin1String("album")), -1);
+ QCOMPARE(request.propertyKey(QLatin1String("trackNumber")), -1);
+
+ QCOMPARE(request.propertyAttributes(0), QGalleryProperty::Attributes());
+ QCOMPARE(request.propertyType(0), QVariant::Invalid);
+
+ QCOMPARE(request.itemCount(), 0);
+ QCOMPARE(request.currentIndex(), -1);
+ QCOMPARE(request.itemId(), QVariant());
+ QCOMPARE(request.itemUrl(), QUrl());
+ QCOMPARE(request.itemType(), QString());
+ QCOMPARE(request.metaData(1), QVariant());
+ QCOMPARE(request.setMetaData(1, QLatin1String("hello")), false);
+ QCOMPARE(request.metaData(1), QVariant());
+ QCOMPARE(request.metaData(QLatin1String("title")), QVariant());
+ QCOMPARE(request.setMetaData(QLatin1String("title"), QLatin1String("hello")), false);
+ QCOMPARE(request.metaData(QLatin1String("title")), QVariant());
+ QCOMPARE(request.resources(), QList<QGalleryResource>());
+ QCOMPARE(request.seek(0, false), false);
+ QCOMPARE(request.seek(1, true), false);
+ QCOMPARE(request.seek(-1, true), false);
+ QCOMPARE(request.next(), false);
+ QCOMPARE(request.previous(), false);
+}
+
+QTEST_MAIN(tst_QGalleryQueryRequest)
+
+#include "tst_qgalleryqueryrequest.moc"
diff --git a/tests/auto/qgalleryresource/qgalleryresource.pro b/tests/auto/qgalleryresource/qgalleryresource.pro
new file mode 100644
index 0000000..e5947fe
--- /dev/null
+++ b/tests/auto/qgalleryresource/qgalleryresource.pro
@@ -0,0 +1,3 @@
+include(../auto.pri)
+
+SOURCES += tst_qgalleryresource.cpp
diff --git a/tests/auto/qgalleryresource/tst_qgalleryresource.cpp b/tests/auto/qgalleryresource/tst_qgalleryresource.cpp
new file mode 100644
index 0000000..8b71499
--- /dev/null
+++ b/tests/auto/qgalleryresource/tst_qgalleryresource.cpp
@@ -0,0 +1,259 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDocGallery module 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$
+**
+****************************************************************************/
+
+//TESTED_COMPONENT=src/gallery
+
+#include <qgalleryresource.h>
+
+#include <QtTest/QtTest>
+
+Q_DECLARE_METATYPE(QT_PREPEND_NAMESPACE(QGalleryResource))
+
+class tst_QGalleryResource : public QObject
+{
+ Q_OBJECT
+private Q_SLOTS:
+ void null();
+ void url();
+ void attributes();
+ void equality_data();
+ void equality();
+ void copy();
+};
+
+void tst_QGalleryResource::null()
+{
+ const int sampleRateKey = 3;
+ const int audioCodecKey = 6;
+ const int videoCodecKey = 9;
+ const int invalidKey = 4;
+
+ const QMap<int, QVariant> attributes;
+
+ QGalleryResource resource;
+
+ QCOMPARE(resource.url(), QUrl());
+ QCOMPARE(resource.attributes(), attributes);
+ QCOMPARE(resource.attribute(sampleRateKey), QVariant());
+ QCOMPARE(resource.attribute(audioCodecKey), QVariant());
+ QCOMPARE(resource.attribute(videoCodecKey), QVariant());
+ QCOMPARE(resource.attribute(invalidKey), QVariant());
+}
+
+void tst_QGalleryResource::url()
+{
+ const int sampleRateKey = 3;
+ const int audioCodecKey = 6;
+ const int videoCodecKey = 9;
+ const int invalidKey = 4;
+
+ const QMap<int, QVariant> attributes;
+
+ const QUrl url("file:///a/local/video/file.m4v");
+
+ QGalleryResource resource(url);
+
+ QCOMPARE(resource.url(), url);
+ QCOMPARE(resource.attributes(), attributes);
+ QCOMPARE(resource.attribute(sampleRateKey), QVariant());
+ QCOMPARE(resource.attribute(audioCodecKey), QVariant());
+ QCOMPARE(resource.attribute(videoCodecKey), QVariant());
+ QCOMPARE(resource.attribute(invalidKey), QVariant());
+}
+
+void tst_QGalleryResource::attributes()
+{
+ const int sampleRateKey = 3;
+ const int audioCodecKey = 6;
+ const int videoCodecKey = 9;
+ const int invalidKey = 4;
+
+ const QVariant sampleRate = 44100;
+ const QVariant audioCodec = QLatin1String("aac");
+ const QVariant videoCodec = QLatin1String("h264");
+
+ QMap<int, QVariant> attributes;
+ attributes.insert(sampleRateKey, sampleRate);
+ attributes.insert(audioCodecKey, audioCodec);
+ attributes.insert(videoCodecKey, videoCodec);
+
+ const QUrl url("file:///a/local/video/file.m4v");
+
+ QGalleryResource resource(url, attributes);
+
+ QCOMPARE(resource.url(), url);
+ QCOMPARE(resource.attributes(), attributes);
+ QCOMPARE(resource.attribute(sampleRateKey), sampleRate);
+ QCOMPARE(resource.attribute(audioCodecKey), audioCodec);
+ QCOMPARE(resource.attribute(videoCodecKey), videoCodec);
+ QCOMPARE(resource.attribute(invalidKey), QVariant());
+}
+
+void tst_QGalleryResource::equality_data()
+{
+ const int sampleRateKey = 3;
+ const int audioCodecKey = 6;
+ const int videoCodecKey = 9;
+
+ const QUrl url1("file:///a/local/video/file.m4v");
+ const QUrl url2("http://example.com/video.mpg");
+
+ QMap<int, QVariant> attributes1;
+ attributes1.insert(sampleRateKey, 44100);
+ attributes1.insert(audioCodecKey, QLatin1String("aac"));
+ attributes1.insert(videoCodecKey, QLatin1String("h264"));
+
+ QMap<int, QVariant> attributes2;
+ attributes2.insert(sampleRateKey, 22050);
+
+ const QGalleryResource resource1(url1);
+ const QGalleryResource resource2(url2);
+ const QGalleryResource resource3(url1, attributes1);
+ const QGalleryResource resource4(url1, attributes2);
+ const QGalleryResource resource5(url2, attributes1);
+
+ QTest::addColumn<QGalleryResource>("resource1");
+ QTest::addColumn<QGalleryResource>("resource2");
+ QTest::addColumn<bool>("isEqual");
+
+ QTest::newRow("Null resources")
+ << QGalleryResource()
+ << QGalleryResource()
+ << true;
+ QTest::newRow("Same resource (No attributes)")
+ << resource1
+ << resource1
+ << true;
+ QTest::newRow("Same resource (Attributes)")
+ << resource3
+ << resource3
+ << true;
+ QTest::newRow("Equal resource (No attributes)")
+ << QGalleryResource(url1)
+ << QGalleryResource(url1)
+ << true;
+ QTest::newRow("Equal resource (Attributes)")
+ << QGalleryResource(url1, attributes1)
+ << QGalleryResource(url1, attributes1)
+ << true;
+
+ QTest::newRow("Null resource != Non-null (No attributes)")
+ << QGalleryResource()
+ << resource1
+ << false;
+ QTest::newRow("Null resource != Non-null (Attributes)")
+ << QGalleryResource()
+ << resource3
+ << false;
+ QTest::newRow("Different URL, no attributes")
+ << resource1
+ << resource2
+ << false;
+ QTest::newRow("Same URL, With/without attributes")
+ << resource1
+ << resource3
+ << false;
+ QTest::newRow("Same Url, Different attributes")
+ << resource3
+ << resource4
+ << false;
+ QTest::newRow("Different URL, same attributes")
+ << resource3
+ << resource5
+ << false;
+}
+
+void tst_QGalleryResource::equality()
+{
+ QFETCH(QGalleryResource, resource1);
+ QFETCH(QGalleryResource, resource2);
+ QFETCH(bool, isEqual);
+
+ QCOMPARE(resource1 == resource2, isEqual);
+ QCOMPARE(resource2 == resource1 ,isEqual);
+ QCOMPARE(resource1 != resource2, !isEqual);
+ QCOMPARE(resource2 != resource1, !isEqual);
+}
+
+
+void tst_QGalleryResource::copy()
+{
+ const int sampleRateKey = 3;
+ const int audioCodecKey = 6;
+ const int videoCodecKey = 9;
+
+ const QUrl url1("file:///a/local/video/file.m4v");
+ const QUrl url2("http://example.com/video.mpg");
+
+ QMap<int, QVariant> attributes1;
+ attributes1.insert(sampleRateKey, 44100);
+ attributes1.insert(audioCodecKey, QLatin1String("aac"));
+ attributes1.insert(videoCodecKey, QLatin1String("h264"));
+
+ QMap<int, QVariant> attributes2;
+ attributes2.insert(sampleRateKey, 22050);
+
+ QGalleryResource resource1(url1);
+ QGalleryResource resource2(url1, attributes1);
+ QGalleryResource resource3(url2, attributes2);
+
+ QCOMPARE(resource1.url(), url1);
+ QCOMPARE(resource1.attributes().isEmpty(), true);
+
+ QCOMPARE(resource2.url(), url1);
+ QCOMPARE(resource2.attributes(), attributes1);
+
+ QCOMPARE(resource3.url(), url2);
+ QCOMPARE(resource3.attributes(), attributes2);
+
+ resource1 = resource2;
+ QCOMPARE(resource1.url(), url1);
+ QCOMPARE(resource1.attributes(), attributes1);
+
+ resource2 = resource3;
+ QCOMPARE(resource2.url(), url2);
+ QCOMPARE(resource2.attributes(), attributes2);
+}
+
+
+QTEST_MAIN(tst_QGalleryResource)
+
+#include "tst_qgalleryresource.moc"
diff --git a/tests/auto/qgallerytrackerresultset_tracker/qgallerytrackerresultset_tracker.pro b/tests/auto/qgallerytrackerresultset_tracker/qgallerytrackerresultset_tracker.pro
new file mode 100644
index 0000000..b9fe2d9
--- /dev/null
+++ b/tests/auto/qgallerytrackerresultset_tracker/qgallerytrackerresultset_tracker.pro
@@ -0,0 +1,5 @@
+include(../auto.pri)
+
+QT += gallery-private
+
+SOURCES += tst_qgallerytrackerresultset.cpp
diff --git a/tests/auto/qgallerytrackerresultset_tracker/tst_qgallerytrackerresultset.cpp b/tests/auto/qgallerytrackerresultset_tracker/tst_qgallerytrackerresultset.cpp
new file mode 100644
index 0000000..b247acf
--- /dev/null
+++ b/tests/auto/qgallerytrackerresultset_tracker/tst_qgallerytrackerresultset.cpp
@@ -0,0 +1,855 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Qt Mobility Components.
+**
+** $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$
+**
+****************************************************************************/
+
+//TESTED_COMPONENT=src/gallery
+
+#include <private/qgallerytrackerresultset_p.h>
+#include <private/qgallerytrackerlistcolumn_p.h>
+
+#include <qgalleryresource.h>
+
+#include <QtDBus/qdbusabstractadaptor.h>
+#include <QtDBus/qdbusmetatype.h>
+
+#include <QtTest/QtTest>
+
+Q_DECLARE_METATYPE(QVector<QStringList>)
+
+class QtTestQueryAdaptor;
+
+class tst_QGalleryTrackerResultSet : public QObject
+{
+ Q_OBJECT
+public:
+ tst_QGalleryTrackerResultSet()
+ : m_itemType(QLatin1String("itemType"))
+ , m_character(QLatin1String("character"))
+ , m_number(QLatin1String("number"))
+ , m_argument(QLatin1String("argument"))
+ , m_composite(QLatin1String("composite"))
+ , m_alias(QLatin1String("alias"))
+ , m_image(QLatin1String("image"))
+ , m_connection(QDBusConnection::sessionBus())
+ , m_queryAdaptor(0) {}
+
+public Q_SLOTS:
+ void initTestCase();
+ void cleanup();
+
+private Q_SLOTS:
+ void query();
+ void refresh();
+ void reset();
+ void removeItem();
+ void insertItem();
+ void replaceFirstItem();
+ void replaceLastItem();
+ void replaceMiddleItem();
+
+private:
+ void populateArguments(QGalleryTrackerResultSetArguments *arguments, const QString &argument);
+
+ const QString m_itemType;
+ const QString m_character;
+ const QString m_number;
+ const QString m_argument;
+ const QString m_composite;
+ const QString m_alias;
+ const QString m_image;
+ QDBusConnection m_connection;
+ QtTestQueryAdaptor *m_queryAdaptor;
+ QGalleryDBusInterfacePointer m_queryInterface;
+};
+
+class QtTestProgressMonitor : public QObject
+{
+ Q_OBJECT
+public:
+ QtTestProgressMonitor() : m_currentProgress(0), m_maximumProgress(1) {}
+
+ bool isFinished() const { return m_currentProgress == m_maximumProgress; }
+
+public Q_SLOTS:
+ void progressChanged(int current, int maximum)
+ {
+ m_currentProgress = current;
+ m_maximumProgress = maximum;
+ }
+
+private:
+ int m_currentProgress;
+ int m_maximumProgress;
+};
+
+class QtTestQueryAdaptor : public QDBusAbstractAdaptor
+{
+ Q_OBJECT
+ Q_CLASSINFO("D-Bus Interface", "com.nokia.QtTest.QGalleryTrackerResultSet.Query")
+public:
+ QtTestQueryAdaptor(QObject *object) : QDBusAbstractAdaptor(object)
+ {
+ qMemSet(m_counts, 0, sizeof(m_counts));
+ }
+
+public:
+ int count(char id) const { return m_counts[id != '\0' ? (id + 1 - 'a') : 0]; }
+ void setCount(char id, int count) { m_counts[id != '\0' ? (id + 1 - 'a') : 0] = count; }
+
+ void clear() { qMemSet(m_counts, 0, sizeof(m_counts)); }
+
+public Q_SLOTS:
+ QVector<QStringList> SparqlQuery(const QString &argument)
+ {
+ QVector<QStringList> results;
+
+ for (int i = 0; i < m_counts[0]; ++i) {
+ QStringList result;
+
+ QString number = QString(QLatin1String("%1")).arg(i, 3, 10, QLatin1Char('0'));
+
+ QString id = QLatin1String("0-") + number;
+ QString url;
+ QString type = QLatin1String("type0");
+
+ result.append(id);
+ result.append(url);
+ result.append(type);
+ result.append(QString());
+ result.append(number);
+ result.append(argument);
+
+ results.append(result);
+ }
+
+ for (int c = 1; c < 26; ++c) {
+ const QString character = QChar(QLatin1Char('a' + c - 1));
+
+ for (int i = 0; i < m_counts[c]; ++i) {
+ QStringList result;
+
+ QString number = QString(QLatin1String("%1")).arg(i, 3, 10, QLatin1Char('0'));
+
+ QString id = character + QLatin1Char('-') + number;
+ QString url
+ = QLatin1String("file:///")
+ + character
+ + QLatin1Char('/')
+ + number;
+ QString type = QLatin1String("type") + character;
+
+ result.append(id);
+ result.append(url);
+ result.append(type);
+ result.append(character);
+ result.append(number);
+ result.append(argument);
+
+ results.append(result);
+ }
+ }
+
+ return results;
+ }
+
+private:
+ int m_counts[27];
+};
+
+class QtTestStringValueColumn : public QGalleryTrackerValueColumn
+{
+public:
+ QVariant toVariant(const QString &string) const { return string; }
+ QString toString(const QVariant &variant) const { return variant.toString(); }
+};
+
+class QtTestIdentityColumn : public QGalleryTrackerCompositeColumn
+{
+public:
+ QtTestIdentityColumn(int column) : m_column(column) {}
+
+ QVariant value(QVector<QVariant>::const_iterator row) const { return *(row + m_column); }
+
+private:
+ const int m_column;
+};
+
+class QtTestCompositeColumn : public QGalleryTrackerCompositeColumn
+{
+public:
+ QtTestCompositeColumn(int columnA, int columnB) : m_columnA(columnA), m_columnB(columnB) {}
+
+ QVariant value(QVector<QVariant>::const_iterator row) const {
+ return (row + m_columnA)->toString() + QLatin1Char('|') + (row + m_columnB)->toString(); }
+
+private:
+ const int m_columnA;
+ const int m_columnB;
+};
+
+void tst_QGalleryTrackerResultSet::initTestCase()
+{
+ const QString service
+ = QLatin1String("com.nokia.QtTest.QGalleryTrackerResultSet")
+ + QString::number(QCoreApplication::applicationPid());
+ const QString path = QLatin1String("/");
+ const char *interface = "com.nokia.QtTest.QGalleryTrackerResultSet.Query";
+
+ qDBusRegisterMetaType<QVector<QStringList> >();
+
+ m_queryAdaptor = new QtTestQueryAdaptor(this);
+
+ m_connection.registerService(service);
+ m_connection.registerObject(path, this);
+
+ m_queryInterface = new QGalleryDBusInterface(service, path, interface);
+
+ QVERIFY(m_queryInterface->isValid());
+}
+
+void tst_QGalleryTrackerResultSet::cleanup()
+{
+ m_queryAdaptor->clear();
+}
+
+void tst_QGalleryTrackerResultSet::populateArguments(
+ QGalleryTrackerResultSetArguments *arguments, const QString &argument)
+{
+ arguments->idColumn.reset(new QtTestIdentityColumn(0));
+ arguments->urlColumn.reset(new QtTestIdentityColumn(1));
+ arguments->typeColumn.reset(new QtTestIdentityColumn(2));
+ arguments->updateMask = 0x01;
+ arguments->identityWidth = 1;
+ arguments->tableWidth = 6;
+ arguments->valueOffset = 2;
+ arguments->compositeOffset = 6;
+ arguments->queryInterface = m_queryInterface;
+ arguments->sparql = argument;
+ arguments->propertyNames = QStringList()
+ << m_itemType
+ << m_character
+ << m_number
+ << m_argument
+ << m_composite
+ << m_alias;
+ arguments->fieldNames = QStringList();
+ arguments->propertyAttributes = QVector<QGalleryProperty::Attributes>()
+ << (QGalleryProperty::CanRead | QGalleryProperty::CanFilter)
+ << (QGalleryProperty::CanRead | QGalleryProperty::CanFilter | QGalleryProperty::CanSort)
+ << (QGalleryProperty::CanRead | QGalleryProperty::CanFilter | QGalleryProperty::CanSort)
+ << (QGalleryProperty::CanRead | QGalleryProperty::CanSort)
+ << (QGalleryProperty::CanRead)
+ << (QGalleryProperty::CanRead | QGalleryProperty::CanFilter | QGalleryProperty::CanSort);
+ arguments->propertyTypes = QVector<QVariant::Type>()
+ << QVariant::String
+ << QVariant::Char
+ << QVariant::Int
+ << QVariant::String
+ << QVariant::String
+ << QVariant::Int;
+ arguments->valueColumns = QVector<QGalleryTrackerValueColumn *>()
+ << new QtTestStringValueColumn
+ << new QtTestStringValueColumn
+ << new QtTestStringValueColumn
+ << new QtTestStringValueColumn
+ << new QtTestStringValueColumn
+ << new QtTestStringValueColumn
+ << new QtTestStringValueColumn;
+ arguments->compositeColumns = QVector<QGalleryTrackerCompositeColumn *>()
+ << new QtTestCompositeColumn(3, 4);
+ arguments->aliasColumns = QVector<int>()
+ << 4;
+ arguments->resourceKeys = QVector<int>()
+ << 1
+ << 2
+ << 3;
+}
+
+void tst_QGalleryTrackerResultSet::query()
+{
+ const QStringList propertyNames = QStringList()
+ << m_itemType
+ << m_character
+ << m_number
+ << m_argument
+ << m_composite
+ << m_alias;
+
+ QGalleryTrackerResultSetArguments arguments;
+
+ populateArguments(&arguments, QLatin1String("query"));
+
+ m_queryAdaptor->setCount('\0', 1);
+ m_queryAdaptor->setCount('a', 16);
+
+ QGalleryTrackerResultSet resultSet(&arguments, false);
+ QCOMPARE(resultSet.propertyNames(), propertyNames);
+ QCOMPARE(resultSet.propertyKey(m_itemType), 2);
+ QCOMPARE(resultSet.propertyKey(m_alias), 7);
+ QCOMPARE(resultSet.propertyKey(QLatin1String("turtle")), -1);
+ QCOMPARE(resultSet.propertyAttributes(2), (QGalleryProperty::CanRead | QGalleryProperty::CanFilter));
+ QCOMPARE(resultSet.propertyAttributes(7), (QGalleryProperty::CanRead | QGalleryProperty::CanFilter | QGalleryProperty::CanSort));
+ QCOMPARE(resultSet.propertyType(2), QVariant::String);
+ QCOMPARE(resultSet.propertyType(7), QVariant::Int);
+
+ QSignalSpy insertSpy(&resultSet, SIGNAL(itemsInserted(int,int)));
+ QSignalSpy removeSpy(&resultSet, SIGNAL(itemsRemoved(int,int)));
+ QSignalSpy changeSpy(&resultSet, SIGNAL(metaDataChanged(int,int,QList<int>)));
+
+ QCOMPARE(resultSet.isActive(), true);
+ QCOMPARE(resultSet.itemCount(), 0);
+
+ QVERIFY(resultSet.waitForFinished(1000));
+
+ QCOMPARE(resultSet.isActive(), false);
+ QCOMPARE(resultSet.itemCount(), 17);
+ QCOMPARE(insertSpy.count(), 1);
+ QCOMPARE(removeSpy.count(), 0);
+ QCOMPARE(changeSpy.count(), 0);
+ QCOMPARE(insertSpy.at(insertSpy.count() - 1).value(0).toInt(), 0);
+ QCOMPARE(insertSpy.at(insertSpy.count() - 1).value(1).toInt(), 17);
+
+ QCOMPARE(resultSet.currentIndex(), -1);
+ QCOMPARE(resultSet.itemId(), QVariant());
+ QCOMPARE(resultSet.itemUrl(), QUrl());
+ QCOMPARE(resultSet.itemType(), QString());
+ QCOMPARE(resultSet.metaData(0), QVariant());
+ QCOMPARE(resultSet.metaData(1), QVariant());
+ QCOMPARE(resultSet.metaData(2), QVariant());
+ QCOMPARE(resultSet.metaData(3), QVariant());
+ QCOMPARE(resultSet.metaData(4), QVariant());
+ QCOMPARE(resultSet.metaData(5), QVariant());
+ QCOMPARE(resultSet.metaData(6), QVariant());
+ QCOMPARE(resultSet.metaData(7), QVariant());
+ QCOMPARE(resultSet.metaData(8), QVariant());
+ QCOMPARE(resultSet.resources(), QList<QGalleryResource>());
+
+ QCOMPARE(resultSet.fetchFirst(), true);
+ QCOMPARE(resultSet.currentIndex(), 0);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("0-000")));
+ QCOMPARE(resultSet.itemUrl(), QUrl());
+ QCOMPARE(resultSet.itemType(), QLatin1String("type0"));
+ QCOMPARE(resultSet.metaData(0), QVariant());
+ QCOMPARE(resultSet.metaData(1), QVariant());
+ QCOMPARE(resultSet.metaData(2), QVariant(QLatin1String("type0")));
+ QCOMPARE(resultSet.metaData(3), QVariant(QVariant::String));
+ QCOMPARE(resultSet.metaData(4), QVariant(QLatin1String("000")));
+ QCOMPARE(resultSet.metaData(5), QVariant(QLatin1String("query")));
+ QCOMPARE(resultSet.metaData(6), QVariant(QLatin1String("|000")));
+ QCOMPARE(resultSet.metaData(7), QVariant(QLatin1String("a-000")));
+ QCOMPARE(resultSet.metaData(8), QVariant());
+ QCOMPARE(resultSet.resources(), QList<QGalleryResource>());
+
+ QCOMPARE(resultSet.setMetaData(5, QLatin1String("edit")), false);
+ QCOMPARE(resultSet.metaData(5), QVariant(QLatin1String("query")));
+
+ QCOMPARE(resultSet.fetchPrevious(), false);
+ QCOMPARE(resultSet.currentIndex(), -1);
+ QCOMPARE(resultSet.itemId(), QVariant());
+ QCOMPARE(resultSet.itemUrl(), QUrl());
+ QCOMPARE(resultSet.itemType(), QString());
+ QCOMPARE(resultSet.metaData(0), QVariant());
+ QCOMPARE(resultSet.metaData(1), QVariant());
+ QCOMPARE(resultSet.metaData(2), QVariant());
+ QCOMPARE(resultSet.metaData(3), QVariant());
+ QCOMPARE(resultSet.metaData(4), QVariant());
+ QCOMPARE(resultSet.metaData(5), QVariant());
+ QCOMPARE(resultSet.metaData(6), QVariant());
+ QCOMPARE(resultSet.metaData(7), QVariant());
+ QCOMPARE(resultSet.metaData(8), QVariant());
+ QCOMPARE(resultSet.resources(), QList<QGalleryResource>());
+
+ QCOMPARE(resultSet.fetchLast(), true);
+ QCOMPARE(resultSet.currentIndex(), 16);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("a-015")));
+ QCOMPARE(resultSet.itemUrl(), QUrl(QLatin1String("file:///a/015")));
+ QCOMPARE(resultSet.itemType(), QLatin1String("typea"));
+ QCOMPARE(resultSet.metaData(0), QVariant());
+ QCOMPARE(resultSet.metaData(1), QVariant());
+ QCOMPARE(resultSet.metaData(2), QVariant(QLatin1String("typea")));
+ QCOMPARE(resultSet.metaData(3), QVariant(QLatin1String("a")));
+ QCOMPARE(resultSet.metaData(4), QVariant(QLatin1String("015")));
+ QCOMPARE(resultSet.metaData(5), QVariant(QLatin1String("query")));
+ QCOMPARE(resultSet.metaData(6), QVariant(QLatin1String("a|015")));
+ QCOMPARE(resultSet.metaData(7), QVariant());
+ QCOMPARE(resultSet.metaData(8), QVariant());
+ {
+ QMap<int, QVariant> attributes;
+ attributes.insert(2, QLatin1String("typea"));
+ attributes.insert(3, QLatin1String("a"));
+
+ QCOMPARE(resultSet.resources(), QList<QGalleryResource>()
+ << QGalleryResource(QUrl(QLatin1String("file:///a/015")), attributes));
+ }
+
+ QCOMPARE(resultSet.setMetaData(5, QLatin1String("edit")), false);
+ QCOMPARE(resultSet.metaData(5), QVariant(QLatin1String("query")));
+
+ QCOMPARE(resultSet.fetchNext(), false);
+ QCOMPARE(resultSet.currentIndex(), 17);
+ QCOMPARE(resultSet.itemId(), QVariant());
+ QCOMPARE(resultSet.itemUrl(), QUrl());
+ QCOMPARE(resultSet.itemType(), QString());
+ QCOMPARE(resultSet.metaData(0), QVariant());
+ QCOMPARE(resultSet.metaData(1), QVariant());
+ QCOMPARE(resultSet.metaData(2), QVariant());
+ QCOMPARE(resultSet.metaData(3), QVariant());
+ QCOMPARE(resultSet.metaData(4), QVariant());
+ QCOMPARE(resultSet.metaData(5), QVariant());
+ QCOMPARE(resultSet.metaData(6), QVariant());
+ QCOMPARE(resultSet.metaData(7), QVariant());
+ QCOMPARE(resultSet.metaData(8), QVariant());
+ QCOMPARE(resultSet.resources(), QList<QGalleryResource>());
+}
+
+
+void tst_QGalleryTrackerResultSet::refresh()
+{
+ QGalleryTrackerResultSetArguments arguments;
+
+ populateArguments(&arguments, QLatin1String("query"));
+
+ m_queryAdaptor->setCount('a', 16);
+
+ QGalleryTrackerResultSet resultSet(&arguments, true);
+
+ QSignalSpy insertSpy(&resultSet, SIGNAL(itemsInserted(int,int)));
+ QSignalSpy removeSpy(&resultSet, SIGNAL(itemsRemoved(int,int)));
+ QSignalSpy changeSpy(&resultSet, SIGNAL(metaDataChanged(int,int,QList<int>)));
+
+ QCOMPARE(resultSet.isActive(), true);
+ QCOMPARE(resultSet.itemCount(), 0);
+
+ QVERIFY(resultSet.waitForFinished(1000));
+
+ QCOMPARE(resultSet.isActive(), false);
+ QCOMPARE(resultSet.itemCount(), 16);
+ QCOMPARE(insertSpy.count(), 1);
+ QCOMPARE(removeSpy.count(), 0);
+ QCOMPARE(changeSpy.count(), 0);
+ QCOMPARE(insertSpy.at(insertSpy.count() - 1).value(0).toInt(), 0);
+ QCOMPARE(insertSpy.at(insertSpy.count() - 1).value(1).toInt(), 16);
+
+ QCOMPARE(resultSet.fetch(0), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("a-000")));
+
+ QCOMPARE(resultSet.fetch(15), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("a-015")));
+
+ resultSet.refresh();
+ QVERIFY(resultSet.waitForFinished(1000));
+
+ QCOMPARE(resultSet.isActive(), false);
+ QCOMPARE(resultSet.itemCount(), 16);
+ QCOMPARE(insertSpy.count(), 1);
+ QCOMPARE(removeSpy.count(), 0);
+ QCOMPARE(changeSpy.count(), 0);
+
+ QCOMPARE(resultSet.fetch(0), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("a-000")));
+
+ QCOMPARE(resultSet.fetch(15), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("a-015")));
+}
+
+void tst_QGalleryTrackerResultSet::reset()
+{
+ QGalleryTrackerResultSetArguments arguments;
+
+ populateArguments(&arguments, QLatin1String("query"));
+
+ m_queryAdaptor->setCount('a', 16);
+
+ QGalleryTrackerResultSet resultSet(&arguments, true);
+
+ QSignalSpy insertSpy(&resultSet, SIGNAL(itemsInserted(int,int)));
+ QSignalSpy removeSpy(&resultSet, SIGNAL(itemsRemoved(int,int)));
+ QSignalSpy changeSpy(&resultSet, SIGNAL(metaDataChanged(int,int,QList<int>)));
+
+ QCOMPARE(resultSet.isActive(), true);
+ QCOMPARE(resultSet.itemCount(), 0);
+
+ QVERIFY(resultSet.waitForFinished(1000));
+
+ QCOMPARE(resultSet.isActive(), false);
+ QCOMPARE(resultSet.itemCount(), 16);
+ QCOMPARE(insertSpy.count(), 1);
+ QCOMPARE(removeSpy.count(), 0);
+ QCOMPARE(changeSpy.count(), 0);
+ QCOMPARE(insertSpy.at(insertSpy.count() - 1).value(0).toInt(), 0);
+ QCOMPARE(insertSpy.at(insertSpy.count() - 1).value(1).toInt(), 16);
+
+ QCOMPARE(resultSet.fetch(0), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("a-000")));
+
+ QCOMPARE(resultSet.fetch(15), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("a-015")));
+
+ m_queryAdaptor->setCount('a', 0);
+ m_queryAdaptor->setCount('b', 16);
+
+ resultSet.refresh();
+ QVERIFY(resultSet.waitForFinished(1000));
+
+ QCOMPARE(resultSet.isActive(), false);
+ QCOMPARE(resultSet.itemCount(), 16);
+ QCOMPARE(insertSpy.count(), 2);
+ QCOMPARE(removeSpy.count(), 1);
+ QCOMPARE(changeSpy.count(), 0);
+ QCOMPARE(removeSpy.at(removeSpy.count() - 1).value(0).toInt(), 0);
+ QCOMPARE(removeSpy.at(removeSpy.count() - 1).value(1).toInt(), 16);
+ QCOMPARE(insertSpy.at(insertSpy.count() - 1).value(0).toInt(), 0);
+ QCOMPARE(insertSpy.at(insertSpy.count() - 1).value(1).toInt(), 16);
+
+ QCOMPARE(resultSet.fetch(0), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("b-000")));
+
+ QCOMPARE(resultSet.fetch(15), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("b-015")));
+}
+
+
+void tst_QGalleryTrackerResultSet::removeItem()
+{
+ QGalleryTrackerResultSetArguments arguments;
+
+ populateArguments(&arguments, QLatin1String("query"));
+
+ m_queryAdaptor->setCount('a', 8);
+ m_queryAdaptor->setCount('b', 2);
+ m_queryAdaptor->setCount('c', 8);
+
+ QGalleryTrackerResultSet resultSet(&arguments, true);
+
+ QSignalSpy insertSpy(&resultSet, SIGNAL(itemsInserted(int,int)));
+ QSignalSpy removeSpy(&resultSet, SIGNAL(itemsRemoved(int,int)));
+ QSignalSpy changeSpy(&resultSet, SIGNAL(metaDataChanged(int,int,QList<int>)));
+
+ QCOMPARE(resultSet.isActive(), true);
+ QCOMPARE(resultSet.itemCount(), 0);
+
+ QVERIFY(resultSet.waitForFinished(1000));
+
+ QCOMPARE(resultSet.isActive(), false);
+ QCOMPARE(resultSet.itemCount(), 18);
+ QCOMPARE(insertSpy.count(), 1);
+ QCOMPARE(removeSpy.count(), 0);
+ QCOMPARE(changeSpy.count(), 0);
+ QCOMPARE(insertSpy.at(insertSpy.count() - 1).value(0).toInt(), 0);
+ QCOMPARE(insertSpy.at(insertSpy.count() - 1).value(1).toInt(), 18);
+
+ QCOMPARE(resultSet.fetch(7), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("a-007")));
+
+ QCOMPARE(resultSet.fetch(8), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("b-000")));
+
+ QCOMPARE(resultSet.fetch(10), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("c-000")));
+
+ m_queryAdaptor->setCount('b', 0);
+
+ resultSet.refresh();
+ QVERIFY(resultSet.waitForFinished(1000));
+
+ QCOMPARE(resultSet.isActive(), false);
+ QCOMPARE(resultSet.itemCount(), 16);
+ QCOMPARE(insertSpy.count(), 1);
+ QCOMPARE(removeSpy.count(), 1);
+ QCOMPARE(changeSpy.count(), 0);
+ QCOMPARE(removeSpy.at(removeSpy.count() - 1).value(0).toInt(), 8);
+ QCOMPARE(removeSpy.at(removeSpy.count() - 1).value(1).toInt(), 2);
+
+ QCOMPARE(resultSet.fetch(7), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("a-007")));
+
+ QCOMPARE(resultSet.fetch(8), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("c-000")));
+}
+
+void tst_QGalleryTrackerResultSet::insertItem()
+{
+ QGalleryTrackerResultSetArguments arguments;
+
+ populateArguments(&arguments, QLatin1String("query"));
+
+ m_queryAdaptor->setCount('a', 8);
+ m_queryAdaptor->setCount('c', 8);
+
+ QGalleryTrackerResultSet resultSet(&arguments, true);
+
+ QSignalSpy insertSpy(&resultSet, SIGNAL(itemsInserted(int,int)));
+ QSignalSpy removeSpy(&resultSet, SIGNAL(itemsRemoved(int,int)));
+ QSignalSpy changeSpy(&resultSet, SIGNAL(metaDataChanged(int,int,QList<int>)));
+
+ QCOMPARE(resultSet.isActive(), true);
+ QCOMPARE(resultSet.itemCount(), 0);
+
+ QVERIFY(resultSet.waitForFinished(1000));
+
+ QCOMPARE(resultSet.isActive(), false);
+ QCOMPARE(resultSet.itemCount(), 16);
+ QCOMPARE(insertSpy.count(), 1);
+ QCOMPARE(removeSpy.count(), 0);
+ QCOMPARE(changeSpy.count(), 0);
+ QCOMPARE(insertSpy.at(insertSpy.count() - 1).value(0).toInt(), 0);
+ QCOMPARE(insertSpy.at(insertSpy.count() - 1).value(1).toInt(), 16);
+
+ QCOMPARE(resultSet.fetch(7), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("a-007")));
+
+ QCOMPARE(resultSet.fetch(8), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("c-000")));
+
+ m_queryAdaptor->setCount('b', 2);
+
+ resultSet.refresh();
+ QVERIFY(resultSet.waitForFinished(1000));
+
+ QCOMPARE(resultSet.isActive(), false);
+ QCOMPARE(resultSet.itemCount(), 18);
+ QCOMPARE(insertSpy.count(), 2);
+ QCOMPARE(removeSpy.count(), 0);
+ QCOMPARE(changeSpy.count(), 0);
+ QCOMPARE(insertSpy.at(insertSpy.count() - 1).value(0).toInt(), 8);
+ QCOMPARE(insertSpy.at(insertSpy.count() - 1).value(1).toInt(), 2);
+
+ QCOMPARE(resultSet.fetch(7), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("a-007")));
+
+ QCOMPARE(resultSet.fetch(8), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("b-000")));
+
+ QCOMPARE(resultSet.fetch(10), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("c-000")));
+}
+
+void tst_QGalleryTrackerResultSet::replaceFirstItem()
+{
+ QGalleryTrackerResultSetArguments arguments;
+
+ populateArguments(&arguments, QLatin1String("query"));
+
+ m_queryAdaptor->setCount('a', 1);
+ m_queryAdaptor->setCount('c', 15);
+
+ QGalleryTrackerResultSet resultSet(&arguments, true);
+
+ QSignalSpy insertSpy(&resultSet, SIGNAL(itemsInserted(int,int)));
+ QSignalSpy removeSpy(&resultSet, SIGNAL(itemsRemoved(int,int)));
+ QSignalSpy changeSpy(&resultSet, SIGNAL(metaDataChanged(int,int,QList<int>)));
+
+ QCOMPARE(resultSet.isActive(), true);
+ QCOMPARE(resultSet.itemCount(), 0);
+
+ QVERIFY(resultSet.waitForFinished(1000));
+
+ QCOMPARE(resultSet.isActive(), false);
+ QCOMPARE(resultSet.itemCount(), 16);
+ QCOMPARE(insertSpy.count(), 1);
+ QCOMPARE(removeSpy.count(), 0);
+ QCOMPARE(changeSpy.count(), 0);
+ QCOMPARE(insertSpy.at(insertSpy.count() - 1).value(0).toInt(), 0);
+ QCOMPARE(insertSpy.at(insertSpy.count() - 1).value(1).toInt(), 16);
+
+
+ QCOMPARE(resultSet.fetch(0), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("a-000")));
+
+ QCOMPARE(resultSet.fetch(1), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("c-000")));
+
+ m_queryAdaptor->setCount('a', 0);
+ m_queryAdaptor->setCount('b', 1);
+
+ resultSet.refresh();
+ QVERIFY(resultSet.waitForFinished(1000));
+
+ QCOMPARE(resultSet.isActive(), false);
+ QCOMPARE(resultSet.itemCount(), 16);
+ QCOMPARE(insertSpy.count(), 2);
+ QCOMPARE(removeSpy.count(), 1);
+ QCOMPARE(changeSpy.count(), 0);
+ QCOMPARE(removeSpy.at(removeSpy.count() - 1).value(0).toInt(), 0);
+ QCOMPARE(removeSpy.at(removeSpy.count() - 1).value(1).toInt(), 1);
+ QCOMPARE(insertSpy.at(insertSpy.count() - 1).value(0).toInt(), 0);
+ QCOMPARE(insertSpy.at(insertSpy.count() - 1).value(1).toInt(), 1);
+
+ QCOMPARE(resultSet.fetch(0), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("b-000")));
+
+ QCOMPARE(resultSet.fetch(1), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("c-000")));
+}
+
+
+void tst_QGalleryTrackerResultSet::replaceLastItem()
+{
+ QGalleryTrackerResultSetArguments arguments;
+
+ populateArguments(&arguments, QLatin1String("query"));
+
+ m_queryAdaptor->setCount('a', 15);
+ m_queryAdaptor->setCount('b', 1);
+
+ QGalleryTrackerResultSet resultSet(&arguments, true);
+
+ QSignalSpy insertSpy(&resultSet, SIGNAL(itemsInserted(int,int)));
+ QSignalSpy removeSpy(&resultSet, SIGNAL(itemsRemoved(int,int)));
+ QSignalSpy changeSpy(&resultSet, SIGNAL(metaDataChanged(int,int,QList<int>)));
+
+ QCOMPARE(resultSet.isActive(), true);
+ QCOMPARE(resultSet.itemCount(), 0);
+
+ QVERIFY(resultSet.waitForFinished(1000));
+
+ QCOMPARE(resultSet.isActive(), false);
+ QCOMPARE(resultSet.itemCount(), 16);
+ QCOMPARE(insertSpy.count(), 1);
+ QCOMPARE(removeSpy.count(), 0);
+ QCOMPARE(changeSpy.count(), 0);
+ QCOMPARE(insertSpy.at(insertSpy.count() - 1).value(0).toInt(), 0);
+ QCOMPARE(insertSpy.at(insertSpy.count() - 1).value(1).toInt(), 16);
+
+ QCOMPARE(resultSet.fetch(14), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("a-014")));
+
+ QCOMPARE(resultSet.fetch(15), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("b-000")));
+
+ m_queryAdaptor->setCount('b', 0);
+ m_queryAdaptor->setCount('c', 1);
+
+ resultSet.refresh();
+ QVERIFY(resultSet.waitForFinished(1000));
+
+ QCOMPARE(resultSet.isActive(), false);
+ QCOMPARE(resultSet.itemCount(), 16);
+ QCOMPARE(insertSpy.count(), 2);
+ QCOMPARE(removeSpy.count(), 1);
+ QCOMPARE(changeSpy.count(), 0);
+ QCOMPARE(removeSpy.at(removeSpy.count() - 1).value(0).toInt(), 15);
+ QCOMPARE(removeSpy.at(removeSpy.count() - 1).value(1).toInt(), 1);
+ QCOMPARE(insertSpy.at(insertSpy.count() - 1).value(0).toInt(), 15);
+ QCOMPARE(insertSpy.at(insertSpy.count() - 1).value(1).toInt(), 1);
+
+
+ QCOMPARE(resultSet.fetch(14), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("a-014")));
+
+ QCOMPARE(resultSet.fetch(15), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("c-000")));
+}
+
+void tst_QGalleryTrackerResultSet::replaceMiddleItem()
+{
+ QGalleryTrackerResultSetArguments arguments;
+
+ populateArguments(&arguments, QLatin1String("query"));
+
+ m_queryAdaptor->setCount('a', 8);
+ m_queryAdaptor->setCount('b', 2);
+ m_queryAdaptor->setCount('d', 6);
+
+ QGalleryTrackerResultSet resultSet(&arguments, true);
+
+ QSignalSpy insertSpy(&resultSet, SIGNAL(itemsInserted(int,int)));
+ QSignalSpy removeSpy(&resultSet, SIGNAL(itemsRemoved(int,int)));
+ QSignalSpy changeSpy(&resultSet, SIGNAL(metaDataChanged(int,int,QList<int>)));
+
+ QCOMPARE(resultSet.isActive(), true);
+ QCOMPARE(resultSet.itemCount(), 0);
+
+ QVERIFY(resultSet.waitForFinished(1000));
+
+ QCOMPARE(resultSet.isActive(), false);
+ QCOMPARE(resultSet.itemCount(), 16);
+ QCOMPARE(insertSpy.count(), 1);
+ QCOMPARE(removeSpy.count(), 0);
+ QCOMPARE(changeSpy.count(), 0);
+ QCOMPARE(insertSpy.at(insertSpy.count() - 1).value(0).toInt(), 0);
+ QCOMPARE(insertSpy.at(insertSpy.count() - 1).value(1).toInt(), 16);
+
+ QCOMPARE(resultSet.fetch(7), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("a-007")));
+
+ QCOMPARE(resultSet.fetch(8), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("b-000")));
+
+ QCOMPARE(resultSet.fetch(9), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("b-001")));
+
+ QCOMPARE(resultSet.fetch(10), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("d-000")));
+
+ m_queryAdaptor->setCount('b', 0);
+ m_queryAdaptor->setCount('c', 2);
+
+ resultSet.refresh();
+ QVERIFY(resultSet.waitForFinished(1000));
+
+ QCOMPARE(resultSet.isActive(), false);
+ QCOMPARE(resultSet.itemCount(), 16);
+ QCOMPARE(insertSpy.count(), 2);
+ QCOMPARE(removeSpy.count(), 1);
+ QCOMPARE(changeSpy.count(), 0);
+ QCOMPARE(removeSpy.at(removeSpy.count() - 1).value(0).toInt(), 8);
+ QCOMPARE(removeSpy.at(removeSpy.count() - 1).value(1).toInt(), 2);
+ QCOMPARE(insertSpy.at(insertSpy.count() - 1).value(0).toInt(), 8);
+ QCOMPARE(insertSpy.at(insertSpy.count() - 1).value(1).toInt(), 2);
+
+ QCOMPARE(resultSet.fetch(7), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("a-007")));
+
+ QCOMPARE(resultSet.fetch(8), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("c-000")));
+
+ QCOMPARE(resultSet.fetch(9), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("c-001")));
+
+ QCOMPARE(resultSet.fetch(10), true);
+ QCOMPARE(resultSet.itemId(), QVariant(QLatin1String("d-000")));
+}
+
+
+QTEST_MAIN(tst_QGalleryTrackerResultSet)
+
+#include "tst_qgallerytrackerresultset.moc"
+
diff --git a/tests/auto/qgallerytrackerschema_tracker/qgallerytrackerschema_tracker.pro b/tests/auto/qgallerytrackerschema_tracker/qgallerytrackerschema_tracker.pro
new file mode 100644
index 0000000..7ae2336
--- /dev/null
+++ b/tests/auto/qgallerytrackerschema_tracker/qgallerytrackerschema_tracker.pro
@@ -0,0 +1,5 @@
+include(../auto.pri)
+
+QT += gallery-private
+
+SOURCES += tst_qgallerytrackerschema.cpp
diff --git a/tests/auto/qgallerytrackerschema_tracker/tst_qgallerytrackerschema.cpp b/tests/auto/qgallerytrackerschema_tracker/tst_qgallerytrackerschema.cpp
new file mode 100644
index 0000000..b05de64
--- /dev/null
+++ b/tests/auto/qgallerytrackerschema_tracker/tst_qgallerytrackerschema.cpp
@@ -0,0 +1,2890 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Qt Mobility Components.
+**
+** $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$
+**
+****************************************************************************/
+
+//TESTED_COMPONENT=src/gallery
+
+#include <private/qgallerytrackerschema_p.h>
+
+#include <qdocumentgallery.h>
+#include <private/qgallerytrackerlistcolumn_p.h>
+#include <private/qgallerytrackerresultset_p.h>
+#include <private/qgallerytrackertyperesultset_p.h>
+
+#include <QtTest/QtTest>
+
+Q_DECLARE_METATYPE(QDocumentGallery::Error)
+Q_DECLARE_METATYPE(QVariant)
+Q_DECLARE_METATYPE(QVector<QVariant>)
+Q_DECLARE_METATYPE(QGalleryDBusInterfacePointer)
+Q_DECLARE_METATYPE(QGalleryQueryRequest::Scope)
+Q_DECLARE_METATYPE(QVector<QVariant::Type>)
+Q_DECLARE_METATYPE(QGalleryProperty::Attributes)
+Q_DECLARE_METATYPE(QVector<QGalleryProperty::Attributes>)
+Q_DECLARE_METATYPE(QVector<int>)
+Q_DECLARE_METATYPE(QGalleryFilter)
+
+#define QT_FILE_QUERY_ARGUMENTS_COUNT 9
+#define QT_FILE_QUERY_SERVICE_POSITION 1
+#define QT_FILE_QUERY_STRING_POSITION 5
+
+#define QT_AGGREGATE_QUERY_ARGUMENTS_COUNT 6
+#define QT_AGGREGATE_QUERY_SERVICE_POSITION 0
+#define QT_AGGREGATE_QUERY_STRING_POSITION 2
+
+class tst_QGalleryTrackerSchema : public QObject, public QGalleryDBusInterfaceFactory
+{
+ Q_OBJECT
+private Q_SLOTS:
+ void initTestCase();
+
+ void fromItemType_data();
+ void fromItemType();
+ void fromItemId_data();
+ void fromItemId();
+ void serviceUpdateId_data();
+ void serviceUpdateId();
+ void supportedPropertyNames_data();
+ void supportedPropertyNames();
+ void propertyAttributes_data();
+ void propertyAttributes();
+ void prepareValidTypeResponse_data();
+ void prepareValidTypeResponse();
+ void prepareInvalidTypeResponse_data();
+ void prepareInvalidTypeResponse();
+ void prepareValidItemResponse_data();
+ void prepareValidItemResponse();
+ void prepareInvalidItemResponse_data();
+ void prepareInvalidItemResponse();
+ void queryResponseRootType_data();
+ void queryResponseRootType();
+ void queryResponseFilePropertyNames_data();
+ void queryResponseFilePropertyNames();
+ void queryResponseRootItem_data();
+ void queryResponseRootItem();
+ void queryResponseFilter_data();
+ void queryResponseFilter();
+ void queryResponseValueColumnToVariant_data();
+ void queryResponseValueColumnToVariant();
+ void queryResponseValueColumnToString_data();
+ void queryResponseValueColumnToString();
+ void queryResponseCompositeColumn_data();
+ void queryResponseCompositeColumn();
+ void prepareInvalidQueryResponse_data();
+ void prepareInvalidQueryResponse();
+ void serviceForType_data();
+ void serviceForType();
+
+private:
+ QGalleryDBusInterfacePointer daemonInterface() { return m_daemonInterface; }
+ QGalleryDBusInterfacePointer metaDataInterface() { return m_metaDataInterface; }
+ QGalleryDBusInterfacePointer searchInterface() { return m_searchInterface; }
+ QGalleryDBusInterfacePointer fileInterface() { return m_fileInterface; }
+ QGalleryDBusInterfacePointer statisticsInterface() { return m_statisticsInterface; }
+ QGalleryDBusInterfacePointer resourcesClassInterface( const QString &) { return m_resourcesClassInterface; }
+
+ QGalleryDBusInterfacePointer m_daemonInterface;
+ QGalleryDBusInterfacePointer m_metaDataInterface;
+ QGalleryDBusInterfacePointer m_searchInterface;
+ QGalleryDBusInterfacePointer m_fileInterface;
+ QGalleryDBusInterfacePointer m_statisticsInterface;
+ QGalleryDBusInterfacePointer m_resourcesClassInterface;
+};
+
+void tst_QGalleryTrackerSchema::initTestCase()
+{
+ qRegisterMetaType<QDocumentGallery::Error>();
+ qRegisterMetaType<QVariant>();
+ qRegisterMetaType<QVector<QVariant> >();
+ qRegisterMetaType<QGalleryDBusInterfacePointer>();
+ qRegisterMetaType<QGalleryQueryRequest::Scope>();
+ qRegisterMetaType<QVector<QVariant::Type> >();
+ qRegisterMetaType<QGalleryProperty::Attributes>();
+ qRegisterMetaType<QVector<QGalleryProperty::Attributes> >();
+ qRegisterMetaType<QVector<int> >();
+ qRegisterMetaType<QGalleryFilter>();
+
+ // Initialize dbus interfaces of some sort here.
+}
+
+void tst_QGalleryTrackerSchema::fromItemType_data()
+{
+ QTest::addColumn<QString>("itemType");
+ QTest::addColumn<QString>("expectedType");
+ QTest::addColumn<bool>("isValid");
+
+ QTest::newRow("File")
+ << QString::fromLatin1("File")
+ << QString::fromLatin1("File")
+ << true;
+ QTest::newRow("AudioGenre")
+ << QString::fromLatin1("AudioGenre")
+ << QString::fromLatin1("AudioGenre")
+ << true;
+ QTest::newRow("Turtle")
+ << QString::fromLatin1("Turtle")
+ << QString()
+ << false;
+}
+
+void tst_QGalleryTrackerSchema::fromItemType()
+{
+ QFETCH(QString, itemType);
+ QFETCH(QString, expectedType);
+ QFETCH(bool, isValid);
+
+ QGalleryTrackerSchema schema(itemType);
+
+ QCOMPARE(schema.itemType(), expectedType);
+ QCOMPARE(schema.isValid(), isValid);
+}
+
+void tst_QGalleryTrackerSchema::fromItemId_data()
+{
+ QTest::addColumn<QString>("itemId");
+ QTest::addColumn<QString>("itemType");
+ QTest::addColumn<bool>("isValid");
+
+ QTest::newRow("File")
+ << QString::fromLatin1("file::/path/to/file.ext")
+ << QString::fromLatin1("File")
+ << true;
+ QTest::newRow("AudioGenre")
+ << QString::fromLatin1("audioGenre::Rock")
+ << QString::fromLatin1("AudioGenre")
+ << true;
+ QTest::newRow("Turtle")
+ << QString::fromLatin1("turtle::its/a/turtle")
+ << QString()
+ << false;
+}
+
+void tst_QGalleryTrackerSchema::fromItemId()
+{
+ QFETCH(QString, itemId);
+ QFETCH(QString, itemType);
+ QFETCH(bool, isValid);
+
+ QGalleryTrackerSchema schema = QGalleryTrackerSchema::fromItemId(itemId);
+
+ QCOMPARE(schema.itemType(), itemType);
+ QCOMPARE(schema.isValid(), isValid);
+}
+
+void tst_QGalleryTrackerSchema::serviceUpdateId_data()
+{
+ QTest::addColumn<QString>("service");
+ QTest::addColumn<int>("updateId");
+
+ QTest::newRow("File")
+ << QString::fromLatin1("nfo:FileDataObject")
+ << 0x01;
+ QTest::newRow("Folder")
+ << QString::fromLatin1("nfo:Folder")
+ << 0x02;
+ QTest::newRow("Document")
+ << QString::fromLatin1("nfo:Document")
+ << 0x04;
+ QTest::newRow("Audio")
+ << QString::fromLatin1("nfo:Audio")
+ << 0x08;
+ QTest::newRow("Image")
+ << QString::fromLatin1("nmm:Photo")
+ << 0x10;
+ QTest::newRow("Video")
+ << QString::fromLatin1("nfo:Video")
+ << 0x20;
+ QTest::newRow("Playlist")
+ << QString::fromLatin1("nmm:Playlist")
+ << 0x40;
+ QTest::newRow("Text")
+ << QString::fromLatin1("nfo:PlainTextDocument")
+ << 0x80;
+ QTest::newRow("Artist")
+ << QString::fromLatin1("nmm:Artist")
+ << 0x100;
+ QTest::newRow("Album")
+ << QString::fromLatin1("nmm:MusicAlbum")
+ << 0x200;
+ QTest::newRow("PhotoAlbum")
+ << QString::fromLatin1("nmm:ImageList")
+ << 0x400;
+ QTest::newRow("Turtles")
+ << QString::fromLatin1("Turtles")
+ << 0x01;
+}
+
+void tst_QGalleryTrackerSchema::serviceUpdateId()
+{
+ QFETCH(QString, service);
+ QFETCH(int, updateId);
+
+ QCOMPARE(QGalleryTrackerSchema::serviceUpdateId(service), updateId);
+}
+
+void tst_QGalleryTrackerSchema::supportedPropertyNames_data()
+{
+ QTest::addColumn<QString>("itemType");
+ QTest::addColumn<QStringList>("propertyNames");
+
+ QTest::newRow("File") << QString::fromLatin1("File") << (QStringList()
+ << QLatin1String("author")
+ << QLatin1String("fileExtension")
+ << QLatin1String("fileName")
+ << QLatin1String("filePath")
+ << QLatin1String("fileSize")
+ << QLatin1String("comments")
+ << QLatin1String("copyright")
+ << QLatin1String("description")
+ << QLatin1String("keywords")
+ << QLatin1String("language")
+ << QLatin1String("lastAccessed")
+ << QLatin1String("lastModified")
+ << QLatin1String("mimeType")
+ << QLatin1String("path")
+ << QLatin1String("rating")
+ << QLatin1String("subject")
+ << QLatin1String("title")
+ << QLatin1String("url")
+ );
+
+ QTest::newRow("AudioGenre") << QString::fromLatin1("AudioGenre") << (QStringList()
+ << QLatin1String("duration")
+ << QLatin1String("genre")
+ << QLatin1String("title")
+ << QLatin1String("trackCount")
+ );
+
+ QTest::newRow("Turtle")
+ << QString::fromLatin1("Turtle")
+ << QStringList();
+}
+
+void tst_QGalleryTrackerSchema::supportedPropertyNames()
+{
+ QFETCH(QString, itemType);
+ QFETCH(QStringList, propertyNames);
+ propertyNames.sort();
+
+ QGalleryTrackerSchema schema(itemType);
+
+ QStringList supportedPropertyNames = schema.supportedPropertyNames();
+ supportedPropertyNames.sort();
+
+ QCOMPARE(supportedPropertyNames, propertyNames);
+}
+
+void tst_QGalleryTrackerSchema::propertyAttributes_data()
+{
+ QTest::addColumn<QString>("itemType");
+ QTest::addColumn<QString>("propertyName");
+ QTest::addColumn<QGalleryProperty::Attributes>("attributes");
+
+ QTest::newRow("Null itemType, propertyName")
+ << QString()
+ << QString()
+ << QGalleryProperty::Attributes();
+ QTest::newRow("Null itemType, invalid propertyName")
+ << QString()
+ << QString::fromLatin1("Goodbye")
+ << QGalleryProperty::Attributes();
+ QTest::newRow("Null itemType, valid propertyName")
+ << QString()
+ << QString::fromLatin1("fileName")
+ << QGalleryProperty::Attributes();
+ QTest::newRow("Invalid itemType, invalid propertyName")
+ << QString::fromLatin1("Hello")
+ << QString::fromLatin1("Goodbye")
+ << QGalleryProperty::Attributes();
+ QTest::newRow("Invalid itemType, valid propertyName")
+ << QString::fromLatin1("Hello")
+ << QString::fromLatin1("fileName")
+ << QGalleryProperty::Attributes();
+ QTest::newRow("Valid itemType, invalid propertyName")
+ << QString::fromLatin1("File")
+ << QString::fromLatin1("Goodbye")
+ << QGalleryProperty::Attributes();
+ QTest::newRow("File.fileName")
+ << QString::fromLatin1("File")
+ << QString::fromLatin1("fileName")
+ << (QGalleryProperty::CanRead | QGalleryProperty::CanFilter | QGalleryProperty::CanSort);
+ QTest::newRow("File.filePath")
+ << QString::fromLatin1("File")
+ << QString::fromLatin1("filePath")
+ << (QGalleryProperty::CanRead | QGalleryProperty::CanFilter);
+ QTest::newRow("File.url")
+ << QString::fromLatin1("File")
+ << QString::fromLatin1("url")
+ << (QGalleryProperty::CanRead | QGalleryProperty::CanFilter | QGalleryProperty::CanSort);
+ QTest::newRow("Audio.albumTitle")
+ << QString::fromLatin1("Audio")
+ << QString::fromLatin1("albumTitle")
+ << (QGalleryProperty::CanRead | QGalleryProperty::CanFilter | QGalleryProperty::CanSort);
+ QTest::newRow("Album.title")
+ << QString::fromLatin1("Album")
+ << QString::fromLatin1("albumTitle")
+ << (QGalleryProperty::CanRead | QGalleryProperty::CanWrite | QGalleryProperty::CanFilter | QGalleryProperty::CanSort);
+ QTest::newRow("Album.albumTitle")
+ << QString::fromLatin1("Album")
+ << QString::fromLatin1("albumTitle")
+ << (QGalleryProperty::CanRead | QGalleryProperty::CanWrite | QGalleryProperty::CanFilter | QGalleryProperty::CanSort);
+ QTest::newRow("Album.duration")
+ << QString::fromLatin1("Album")
+ << QString::fromLatin1("duration")
+ << QGalleryProperty::Attributes(QGalleryProperty::CanRead | QGalleryProperty::CanFilter | QGalleryProperty::CanSort);
+ QTest::newRow("Album.turtle")
+ << QString::fromLatin1("Album")
+ << QString::fromLatin1("turtle")
+ << QGalleryProperty::Attributes();
+}
+
+void tst_QGalleryTrackerSchema::propertyAttributes()
+{
+ QFETCH(QString, itemType);
+ QFETCH(QString, propertyName);
+ QFETCH(QGalleryProperty::Attributes, attributes);
+
+ QGalleryTrackerSchema schema(itemType);
+
+ QCOMPARE(schema.propertyAttributes(propertyName), attributes);
+}
+
+void tst_QGalleryTrackerSchema::prepareValidTypeResponse_data()
+{
+ QTest::addColumn<QString>("itemType");
+ QTest::addColumn<int>("updateMask");
+ QTest::addColumn<QGalleryDBusInterfacePointer>("queryInterface");
+ QTest::addColumn<QString>("queryMethod");
+ QTest::addColumn<QVariantList>("queryArguments");
+
+ QTest::newRow("File")
+ << "File"
+ << 0xFF
+ << m_metaDataInterface
+ << "Get"
+ << QVariantList();
+
+ QTest::newRow("Artist")
+ << QString::fromLatin1("Artist")
+ << 0x0100
+ << m_metaDataInterface
+ << "SparqlQuery"
+ << (QVariantList() << QLatin1String(
+ "SELECT COUNT(DISTINCT ?x) "
+ "WHERE {"
+ "{?x rdf:type nmm:Artist}"
+ "{?y rdf:type nmm:MusicPiece}"
+ "FILTER(nmm:performer(?y)=?x)"
+ "}"));
+
+ QTest::newRow("Album")
+ << QString::fromLatin1("Album")
+ << 0x0200
+ << m_metaDataInterface
+ << "Get"
+ << QVariantList();
+
+ QTest::newRow("AudioGenre")
+ << "AudioGenre"
+ << 0x08
+ << m_metaDataInterface
+ << "SparqlQuery"
+ << (QVariantList() << QLatin1String(
+ "SELECT COUNT(DISTINCT nfo:genre(?x)) "
+ "WHERE {"
+ "{?x rdf:type nfo:Audio}"
+ "FILTER(nfo:genre(?x)!='')"
+ "}"));
+}
+
+void tst_QGalleryTrackerSchema::prepareValidTypeResponse()
+{
+ QFETCH(QString, itemType);
+ QFETCH(int, updateMask);
+ QFETCH(QGalleryDBusInterfacePointer, queryInterface);
+ QFETCH(QString, queryMethod);
+ QFETCH(QVariantList, queryArguments);
+
+ QGalleryTrackerTypeResultSetArguments arguments;
+
+ QGalleryTrackerSchema schema(itemType);
+ QCOMPARE(schema.prepareTypeResponse(&arguments, this), QDocumentGallery::NoError);
+
+ QCOMPARE(arguments.accumulative, false);
+ QCOMPARE(arguments.updateMask, updateMask);
+ QCOMPARE(arguments.queryInterface, queryInterface);
+ QCOMPARE(arguments.queryMethod, queryMethod);
+ QCOMPARE(arguments.queryArguments, queryArguments);
+}
+
+void tst_QGalleryTrackerSchema::prepareInvalidTypeResponse_data()
+{
+ QTest::addColumn<QString>("itemType");
+ QTest::addColumn<QDocumentGallery::Error>("error");
+
+ QTest::newRow("Turtle")
+ << QString::fromLatin1("Turtle")
+ << QDocumentGallery::ItemTypeError;
+}
+
+void tst_QGalleryTrackerSchema::prepareInvalidTypeResponse()
+{
+ QFETCH(QString, itemType);
+ QFETCH(QDocumentGallery::Error, error);
+
+ QGalleryTrackerTypeResultSetArguments arguments;
+
+ QGalleryTrackerSchema schema(itemType);
+ QCOMPARE(schema.prepareTypeResponse(&arguments, this), error);
+}
+
+void tst_QGalleryTrackerSchema::prepareValidItemResponse_data()
+{
+ QTest::addColumn<QVariant>("itemId");
+ QTest::addColumn<QStringList>("propertyNames");
+ QTest::addColumn<QVector<QVariant> >("row");
+ QTest::addColumn<QVariant>("itemUrl");
+ QTest::addColumn<QVariant>("itemType");
+ QTest::addColumn<int>("updateMask");
+ QTest::addColumn<int>("identityWidth");
+ QTest::addColumn<int>("tableWidth");
+ QTest::addColumn<int>("valueOffset");
+ QTest::addColumn<int>("compositeOffset");
+ QTest::addColumn<QGalleryDBusInterfacePointer>("queryInterface");
+ QTest::addColumn<QString>("sparql");
+
+ QTest::newRow("file:://path/to/file.ext")
+ << QVariant(QLatin1String("file::uuid:ff172362-d959-99e0-a792-0ddafdd2c559"))
+ << QStringList()
+ << (QVector<QVariant>()
+ << QLatin1String("uuid:ff172362-d959-99e0-a792-0ddafdd2c559")
+ << QLatin1String("file:///path/to/file.ext")
+ << 0)
+ << QVariant(QUrl(QLatin1String("file:///path/to/file.ext")))
+ << QVariant(QLatin1String("File"))
+ << 0xFF
+ << 1
+ << 3
+ << 3
+ << 3
+ << m_metaDataInterface
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:FileDataObject}"
+ "FILTER(?x=<uuid:ff172362-d959-99e0-a792-0ddafdd2c559>)"
+ "} "
+ "GROUP BY ?x";
+
+ QTest::newRow("album::album:Greatest Hits")
+ << QVariant(QLatin1String("album::album:Greatest Hits"))
+ << QStringList()
+ << (QVector<QVariant>()
+ << QLatin1String("album:Greatest Hits")
+ << QVariant()
+ << 10)
+ << QVariant()
+ << QVariant(QLatin1String("Album"))
+ << 0x0200
+ << 1
+ << 1
+ << 1
+ << 1
+ << m_metaDataInterface
+ << "SELECT ?x "
+ "WHERE {"
+ "{?x rdf:type nmm:MusicAlbum}"
+ "FILTER(?x=<album:Greatest Hits>)"
+ "} "
+ "GROUP BY ?x";
+}
+
+void tst_QGalleryTrackerSchema::prepareValidItemResponse()
+{
+ QFETCH(QVariant, itemId);
+ QFETCH(QStringList, propertyNames);
+ QFETCH(QVector<QVariant>, row);
+ QFETCH(QVariant, itemUrl);
+ QFETCH(QVariant, itemType);
+ QFETCH(int, updateMask);
+ QFETCH(int, identityWidth);
+ QFETCH(int, tableWidth);
+ QFETCH(int, valueOffset);
+ QFETCH(int, compositeOffset);
+ QFETCH(QGalleryDBusInterfacePointer, queryInterface);
+ QFETCH(QString, sparql);
+
+ QGalleryTrackerResultSetArguments arguments;
+
+ QGalleryTrackerSchema schema = QGalleryTrackerSchema::fromItemId(itemId.toString());
+ QCOMPARE(
+ schema.prepareItemResponse(&arguments, this, itemId.toString(), propertyNames),
+ QDocumentGallery::NoError);
+
+ QVERIFY(arguments.idColumn != 0);
+ QCOMPARE(arguments.idColumn->value(row.constBegin()), itemId);
+
+ QVERIFY(arguments.urlColumn != 0);
+ QCOMPARE(arguments.urlColumn->value(row.constBegin()), itemUrl);
+
+ QVERIFY(arguments.typeColumn != 0);
+ QCOMPARE(arguments.typeColumn->value(row.constBegin()), itemType);
+
+ QCOMPARE(arguments.updateMask, updateMask);
+ QCOMPARE(arguments.identityWidth, identityWidth);
+ QCOMPARE(arguments.tableWidth, tableWidth);
+ QCOMPARE(arguments.valueOffset, valueOffset);
+ QCOMPARE(arguments.compositeOffset, compositeOffset);
+
+ QCOMPARE(arguments.queryInterface, queryInterface);
+ QCOMPARE(arguments.sparql, sparql);
+}
+
+void tst_QGalleryTrackerSchema::prepareInvalidItemResponse_data()
+{
+ QTest::addColumn<QString>("itemId");
+ QTest::addColumn<QStringList>("propertyNames");
+ QTest::addColumn<QDocumentGallery::Error>("error");
+
+ QTest::newRow("Invalid Type")
+ << QString::fromLatin1("turtle::its/a/turtle")
+ << QStringList()
+ << QDocumentGallery::ItemIdError;
+}
+
+void tst_QGalleryTrackerSchema::prepareInvalidItemResponse()
+{
+ QFETCH(QString, itemId);
+ QFETCH(QStringList, propertyNames);
+ QFETCH(QDocumentGallery::Error, error);
+
+ QGalleryTrackerResultSetArguments arguments;
+
+ QGalleryTrackerSchema schema = QGalleryTrackerSchema::fromItemId(itemId);
+ QCOMPARE(schema.prepareItemResponse(&arguments, this, itemId, propertyNames), error);
+}
+
+void tst_QGalleryTrackerSchema::queryResponseRootType_data()
+{
+ QTest::addColumn<QString>("rootType");
+ QTest::addColumn<QString>("sparql");
+ QTest::addColumn<int>("updateMask");
+ QTest::addColumn<int>("identityWidth");
+ QTest::addColumn<QVector<QVariant> >("rowData");
+ QTest::addColumn<QString>("itemId");
+ QTest::addColumn<QVariant>("itemUrl");
+ QTest::addColumn<QString>("itemType");
+
+ QTest::newRow("File: Files")
+ << "File"
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {{?x rdf:type nfo:FileDataObject}} "
+ "GROUP BY ?x"
+ << 0xFF
+ << 1
+ << (QVector<QVariant>()
+ << QLatin1String("uuid:ff172362-d959-99e0-a792-0ddafdd2c559")
+ << QLatin1String("file:///path/to/file.ext")
+ << 0)
+ << "file::uuid:ff172362-d959-99e0-a792-0ddafdd2c559"
+ << QVariant(QUrl(QLatin1String("file:///path/to/file.ext")))
+ << "File";
+
+ QTest::newRow("File: Images")
+ << "File"
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {{?x rdf:type nfo:FileDataObject}} "
+ "GROUP BY ?x"
+ << 0xFF
+ << 1
+ << (QVector<QVariant>()
+ << QLatin1String("uuid:ff172362-d959-99e0-a792-0ddafdd2c559")
+ << QLatin1String("file:///path/to/image.png")
+ << 4)
+ << "image::uuid:ff172362-d959-99e0-a792-0ddafdd2c559"
+ << QVariant(QUrl(QLatin1String("file:///path/to/image.png")))
+ << "Image";
+
+ QTest::newRow("Text: Text")
+ << "Text"
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {{?x rdf:type nfo:PlainTextDocument}} "
+ "GROUP BY ?x"
+ << 0x80
+ << 1
+ << (QVector<QVariant>()
+ << QLatin1String("uuid:ff172362-d959-99e0-a792-0ddafdd2c559")
+ << QLatin1String("file:///path/to/text.txt")
+ << 7)
+ << "text::uuid:ff172362-d959-99e0-a792-0ddafdd2c559"
+ << QVariant(QUrl(QLatin1String("file:///path/to/text.txt")))
+ << "Text";
+
+ QTest::newRow("Artist")
+ << "Artist"
+ << "SELECT ?x "
+ "WHERE {"
+ "{?x rdf:type nmm:Artist}"
+ "{?y rdf:type nmm:MusicPiece}"
+ "FILTER(nmm:performer(?y)=?x)"
+ "} "
+ "GROUP BY ?x"
+ << 0x0100
+ << 1
+ << (QVector<QVariant>()
+ << QLatin1String("artist:Self%20Titled")
+ << QString()
+ << 8)
+ << QString::fromLatin1("artist::artist:Self%20Titled")
+ << QVariant()
+ << "Artist";
+
+ QTest::newRow("AlbumArtist")
+ << "AlbumArtist"
+ << "SELECT ?x "
+ "WHERE {"
+ "{?x rdf:type nmm:Artist}"
+ "{?y rdf:type nmm:MusicAlbum}"
+ "FILTER(nmm:albumArtist(?y)=?x)"
+ "} "
+ "GROUP BY ?x"
+ << 0x0100
+ << 1
+ << (QVector<QVariant>()
+ << QLatin1String("artist:Self%20Titled")
+ << QString()
+ << 9)
+ << QString::fromLatin1("albumArtist::artist:Self%20Titled")
+ << QVariant()
+ << "AlbumArtist";
+
+ QTest::newRow("Album")
+ << "Album"
+ << "SELECT ?x "
+ "WHERE {{?x rdf:type nmm:MusicAlbum}} "
+ "GROUP BY ?x"
+ << 0x0200
+ << 1
+ << (QVector<QVariant>()
+ << QLatin1String("musicAlbum:Greatest%20Hits")
+ << QString()
+ << 9)
+ << QString::fromLatin1("album::musicAlbum:Greatest%20Hits")
+ << QVariant()
+ << "Album";
+}
+
+void tst_QGalleryTrackerSchema::queryResponseRootType()
+{
+ QFETCH(QString, rootType);
+ QFETCH(QString, sparql);
+ QFETCH(int, updateMask);
+ QFETCH(int, identityWidth);
+ QFETCH(QVector<QVariant>, rowData);
+ QFETCH(QString, itemId);
+ QFETCH(QVariant, itemUrl);
+ QFETCH(QString, itemType);
+
+ QGalleryTrackerResultSetArguments arguments;
+
+ QGalleryTrackerSchema schema(rootType);
+
+ QCOMPARE(
+ schema.prepareQueryResponse(
+ &arguments,
+ this,
+ QGalleryQueryRequest::AllDescendants,
+ QString(),
+ QGalleryFilter(),
+ QStringList(),
+ QStringList(),
+ 0,
+ 0),
+ QDocumentGallery::NoError);
+
+ QCOMPARE(arguments.queryInterface, m_metaDataInterface);
+ QCOMPARE(arguments.sparql, sparql);
+
+ QCOMPARE(arguments.updateMask, updateMask);
+ QCOMPARE(arguments.identityWidth, identityWidth);
+
+ QVERIFY(arguments.idColumn != 0);
+ QCOMPARE(arguments.idColumn->value(rowData.constBegin()), QVariant(itemId));
+
+ QVERIFY(arguments.urlColumn != 0);
+ QCOMPARE(arguments.urlColumn->value(rowData.constBegin()), itemUrl);
+
+ QVERIFY(arguments.typeColumn != 0);
+ QCOMPARE(arguments.typeColumn->value(rowData.constBegin()), QVariant(itemType));
+}
+
+void tst_QGalleryTrackerSchema::queryResponseFilePropertyNames_data()
+{
+ QTest::addColumn<QString>("rootType");
+ QTest::addColumn<QStringList>("propertyNames");
+ QTest::addColumn<QStringList>("sortPropertyNames");
+ QTest::addColumn<int>("tableWidth");
+ QTest::addColumn<int>("compositeOffset");
+ QTest::addColumn<QString>("sparql");
+ QTest::addColumn<QStringList>("fieldNames");
+ QTest::addColumn<QStringList>("filteredPropertyNames");
+ QTest::addColumn<QVector<int> >("aliasColumns");
+ QTest::addColumn<QVector<int> >("resourceKeys");
+
+ QTest::newRow("File: [fileName, mimeType], []")
+ << "File" // rootType
+ << (QStringList() // propertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << QStringList() // sortPropertyNames
+ << 5 // tableWidth
+ << 5 // compositeOffset
+ << "SELECT ?x nie:url(?x) rdf:type(?x) nfo:fileName(?x) nie:mimeType(?x) "
+ "WHERE {{?x rdf:type nfo:FileDataObject}} "
+ "GROUP BY ?x"
+ << (QStringList() // fieldNames
+ << QLatin1String("nfo:fileName")
+ << QLatin1String("nie:mimeType"))
+ << (QStringList() // filteredPropertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << QVector<int>() // aliasColumns
+ << (QVector<int>() // resourceKeys
+ << 4);
+
+ QTest::newRow("File: [turtle, mimeType], []")
+ << "File" // rootType
+ << (QStringList() // propertyNames
+ << QLatin1String("turtle")
+ << QLatin1String("mimeType"))
+ << QStringList() // sortPropertyNames
+ << 4 // tableWidth
+ << 4 // compositeOffset
+ << "SELECT ?x nie:url(?x) rdf:type(?x) nie:mimeType(?x) "
+ "WHERE {{?x rdf:type nfo:FileDataObject}} "
+ "GROUP BY ?x"
+ << (QStringList() // fieldNames
+ << QLatin1String("nie:mimeType"))
+ << (QStringList() // filteredPropertyNames
+ << QLatin1String("mimeType"))
+ << QVector<int>() // aliasColumns
+ << (QVector<int>() // resourceKeys
+ << 3);
+
+ QTest::newRow("File: [fileName, mimeType], [fileName, mimeType]")
+ << "File" // rootType
+ << (QStringList() // propertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << (QStringList() // sortPropertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << 5 // tableWidth
+ << 5 // compositeOffset
+ << "SELECT ?x nie:url(?x) rdf:type(?x) nfo:fileName(?x) nie:mimeType(?x) "
+ "WHERE {{?x rdf:type nfo:FileDataObject}} "
+ "GROUP BY ?x "
+ "ORDER BY ASC(nfo:fileName(?x)) ASC(nie:mimeType(?x))"
+ << (QStringList() // fieldNames
+ << QLatin1String("nfo:fileName")
+ << QLatin1String("nie:mimeType"))
+ << (QStringList() // filteredPropertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << QVector<int>() // aliasColumns
+ << (QVector<int>() // resourceKeys
+ << 4);
+
+ QTest::newRow("File: [fileName, mimeType], [fileName, -mimeType]")
+ << "File" // rootType
+ << (QStringList() // propertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << (QStringList() // sortPropertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("-mimeType"))
+ << 5 // tableWidth
+ << 5 // compositeOffset
+ << "SELECT ?x nie:url(?x) rdf:type(?x) nfo:fileName(?x) nie:mimeType(?x) "
+ "WHERE {{?x rdf:type nfo:FileDataObject}} "
+ "GROUP BY ?x "
+ "ORDER BY ASC(nfo:fileName(?x)) DESC(nie:mimeType(?x))"
+ << (QStringList() // fieldNames
+ << QLatin1String("nfo:fileName")
+ << QLatin1String("nie:mimeType"))
+ << (QStringList() // filteredPropertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << QVector<int>() // aliasColumns
+ << (QVector<int>() // resourceKeys
+ << 4);
+
+ QTest::newRow("File: [fileName, mimeType], [-fileName, +mimeType]")
+ << "File" // rootType
+ << (QStringList() // propertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << (QStringList() // sortPropertyNames
+ << QLatin1String("-fileName")
+ << QLatin1String("+mimeType"))
+ << 5 // tableWidth
+ << 5 // compositeOffset
+ << "SELECT ?x nie:url(?x) rdf:type(?x) nfo:fileName(?x) nie:mimeType(?x) "
+ "WHERE {{?x rdf:type nfo:FileDataObject}} "
+ "GROUP BY ?x "
+ "ORDER BY DESC(nfo:fileName(?x)) ASC(nie:mimeType(?x))"
+ << (QStringList() // fieldNames
+ << QLatin1String("nfo:fileName")
+ << QLatin1String("nie:mimeType"))
+ << (QStringList() // filteredPropertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << QVector<int>() // aliasColumns
+ << (QVector<int>() // resourceKeys
+ << 4);
+
+ QTest::newRow("File: [fileName, mimeType], [-fileName, -mimeType]")
+ << "File" // rootType
+ << (QStringList() // propertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << (QStringList() // sortPropertyNames
+ << QLatin1String("-fileName")
+ << QLatin1String("-mimeType"))
+ << 5 // tableWidth
+ << 5 // compositeOffset
+ << "SELECT ?x nie:url(?x) rdf:type(?x) nfo:fileName(?x) nie:mimeType(?x) "
+ "WHERE {{?x rdf:type nfo:FileDataObject}} "
+ "GROUP BY ?x "
+ "ORDER BY DESC(nfo:fileName(?x)) DESC(nie:mimeType(?x))"
+ << (QStringList() // fieldNames
+ << QLatin1String("nfo:fileName")
+ << QLatin1String("nie:mimeType"))
+ << (QStringList() // filteredPropertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << QVector<int>() // aliasColumns
+ << (QVector<int>() // resourceKeys
+ << 4);
+
+ QTest::newRow("File: [fileName], [fileName, mimeType]")
+ << "File" // rootType
+ << (QStringList() // propertyNames
+ << QLatin1String("fileName"))
+ << (QStringList() // sortPropertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << 4 // tableWidth
+ << 4 // compositeOffset
+ << "SELECT ?x nie:url(?x) rdf:type(?x) nfo:fileName(?x) "
+ "WHERE {{?x rdf:type nfo:FileDataObject}} "
+ "GROUP BY ?x "
+ "ORDER BY ASC(nfo:fileName(?x)) ASC(nie:mimeType(?x))"
+ << (QStringList() // fieldNames
+ << QLatin1String("nfo:fileName"))
+ << (QStringList() // filteredPropertyNames
+ << QLatin1String("fileName"))
+ << QVector<int>() // aliasColumns
+ << QVector<int>(); // resourceKeys
+
+ QTest::newRow("File: [fileName], [fileName, -mimeType]")
+ << "File" // rootType
+ << (QStringList() // propertyNames
+ << QLatin1String("fileName"))
+ << (QStringList() // sortPropertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("-mimeType"))
+ << 4 // tableWidth
+ << 4 // compositeOffset
+ << "SELECT ?x nie:url(?x) rdf:type(?x) nfo:fileName(?x) "
+ "WHERE {{?x rdf:type nfo:FileDataObject}} "
+ "GROUP BY ?x "
+ "ORDER BY ASC(nfo:fileName(?x)) DESC(nie:mimeType(?x))"
+ << (QStringList() // fieldNames
+ << QLatin1String("nfo:fileName"))
+ << (QStringList() // filteredPropertyNames
+ << QLatin1String("fileName"))
+ << QVector<int>() // aliasColumns
+ << QVector<int>(); // resourceKeys
+
+ QTest::newRow("File: [fileName], [-fileName, +mimeType]")
+ << "File" // rootType
+ << (QStringList() // propertyNames
+ << QLatin1String("fileName"))
+ << (QStringList() // sortPropertyNames
+ << QLatin1String("-fileName")
+ << QLatin1String("+mimeType"))
+ << 4 // tableWidth
+ << 4 // compositeOffset
+ << "SELECT ?x nie:url(?x) rdf:type(?x) nfo:fileName(?x) "
+ "WHERE {{?x rdf:type nfo:FileDataObject}} "
+ "GROUP BY ?x "
+ "ORDER BY DESC(nfo:fileName(?x)) ASC(nie:mimeType(?x))"
+ << (QStringList() // fieldNames
+ << QLatin1String("nfo:fileName"))
+ << (QStringList() // filteredPropertyNames
+ << QLatin1String("fileName"))
+ << QVector<int>() // aliasColumns
+ << QVector<int>(); // resourceKeys
+
+ QTest::newRow("File: [fileName], [-fileName, -mimeType]")
+ << "File" // rootType
+ << (QStringList() // propertyNames
+ << QLatin1String("fileName"))
+ << (QStringList() // sortPropertyNames
+ << QLatin1String("-fileName")
+ << QLatin1String("-mimeType"))
+ << 4 // tableWidth
+ << 4 // compositeOffset
+ << "SELECT ?x nie:url(?x) rdf:type(?x) nfo:fileName(?x) "
+ "WHERE {{?x rdf:type nfo:FileDataObject}} "
+ "GROUP BY ?x "
+ "ORDER BY DESC(nfo:fileName(?x)) DESC(nie:mimeType(?x))"
+ << (QStringList() // fieldNames
+ << QLatin1String("nfo:fileName"))
+ << (QStringList() // filteredPropertyNames
+ << QLatin1String("fileName"))
+ << QVector<int>() // aliasColumns
+ << QVector<int>(); // resourceKeys
+
+ // turtle is an non-existent property.
+ QTest::newRow("File: [fileName, mimeType], [+turtle, +mimeType]")
+ << "File" // rootType
+ << (QStringList() // propertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << (QStringList() // sortPropertyNames
+ << QLatin1String("+turtle")
+ << QLatin1String("+mimeType"))
+ << 5 // tableWidth
+ << 5 // compositeOffset
+ << "SELECT ?x nie:url(?x) rdf:type(?x) nfo:fileName(?x) nie:mimeType(?x) "
+ "WHERE {{?x rdf:type nfo:FileDataObject}} "
+ "GROUP BY ?x "
+ "ORDER BY ASC(nie:mimeType(?x))"
+ << (QStringList() // fieldNames
+ << QLatin1String("nfo:fileName")
+ << QLatin1String("nie:mimeType"))
+ << (QStringList() // filteredPropertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << QVector<int>() // aliasColumns
+ << (QVector<int>() // resourceKeys
+ << 4);
+
+ QTest::newRow("File: [fileName, mimeType], [-turtle, +mimeType]")
+ << "File" // rootType
+ << (QStringList() // propertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << (QStringList() // sortPropertyNames
+ << QLatin1String("-turtle")
+ << QLatin1String("+mimeType"))
+ << 5 // tableWidth
+ << 5 // compositeOffset
+ << "SELECT ?x nie:url(?x) rdf:type(?x) nfo:fileName(?x) nie:mimeType(?x) "
+ "WHERE {{?x rdf:type nfo:FileDataObject}} "
+ "GROUP BY ?x "
+ "ORDER BY ASC(nie:mimeType(?x))"
+ << (QStringList() // fieldNames
+ << QLatin1String("nfo:fileName")
+ << QLatin1String("nie:mimeType"))
+ << (QStringList() // filteredPropertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << QVector<int>() // aliasColumns
+ << (QVector<int>() // resourceKeys
+ << 4);
+
+ QTest::newRow("File: [fileName, mimeType], [+turtle, -mimeType]")
+ << "File" // rootType
+ << (QStringList() // propertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << (QStringList() // sortPropertyNames
+ << QLatin1String("+turtle")
+ << QLatin1String("-mimeType"))
+ << 5 // tableWidth
+ << 5 // compositeOffset
+ << "SELECT ?x nie:url(?x) rdf:type(?x) nfo:fileName(?x) nie:mimeType(?x) "
+ "WHERE {{?x rdf:type nfo:FileDataObject}} "
+ "GROUP BY ?x "
+ "ORDER BY DESC(nie:mimeType(?x))"
+ << (QStringList() // fieldNames
+ << QLatin1String("nfo:fileName")
+ << QLatin1String("nie:mimeType"))
+ << (QStringList() // filteredPropertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << QVector<int>() // aliasColumns
+ << (QVector<int>() // resourceKeys
+ << 4);
+
+ QTest::newRow("File: [fileName, mimeType], [-turtle, -mimeType]")
+ << "File" // rootType
+ << (QStringList() // propertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << (QStringList() // sortPropertyNames
+ << QLatin1String("-turtle")
+ << QLatin1String("-mimeType"))
+ << 5 // tableWidth
+ << 5 // compositeOffset
+ << "SELECT ?x nie:url(?x) rdf:type(?x) nfo:fileName(?x) nie:mimeType(?x) "
+ "WHERE {{?x rdf:type nfo:FileDataObject}} "
+ "GROUP BY ?x "
+ "ORDER BY DESC(nie:mimeType(?x))"
+ << (QStringList() // fieldNames
+ << QLatin1String("nfo:fileName")
+ << QLatin1String("nie:mimeType"))
+ << (QStringList() // filteredPropertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << QVector<int>() // aliasColumns
+ << (QVector<int>() // resourceKeys
+ << 4);
+
+ QTest::newRow("File: [fileName, mimeType], [+url, +mimeType]")
+ << "File" // rootType
+ << (QStringList() // propertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << (QStringList() // sortPropertyNames
+ << QLatin1String("+url")
+ << QLatin1String("+mimeType"))
+ << 5 // tableWidth
+ << 5 // compositeOffset
+ << "SELECT ?x nie:url(?x) rdf:type(?x) nfo:fileName(?x) nie:mimeType(?x) "
+ "WHERE {{?x rdf:type nfo:FileDataObject}} "
+ "GROUP BY ?x "
+ "ORDER BY ASC(nie:url(?x)) ASC(nie:mimeType(?x))"
+ << (QStringList() // fieldNames
+ << QLatin1String("nfo:fileName")
+ << QLatin1String("nie:mimeType"))
+ << (QStringList() // filteredPropertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << QVector<int>() // aliasColumns
+ << (QVector<int>() // resourceKeys
+ << 4);
+
+ QTest::newRow("File: [fileName, mimeType], [-url, +mimeType]")
+ << "File" // rootType
+ << (QStringList() // propertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << (QStringList() // sortPropertyNames
+ << QLatin1String("-url")
+ << QLatin1String("+mimeType"))
+ << 5 // tableWidth
+ << 5 // compositeOffset
+ << "SELECT ?x nie:url(?x) rdf:type(?x) nfo:fileName(?x) nie:mimeType(?x) "
+ "WHERE {{?x rdf:type nfo:FileDataObject}} "
+ "GROUP BY ?x "
+ "ORDER BY DESC(nie:url(?x)) ASC(nie:mimeType(?x))"
+ << (QStringList() // fieldNames
+ << QLatin1String("nfo:fileName")
+ << QLatin1String("nie:mimeType"))
+ << (QStringList() // filteredPropertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << QVector<int>() // aliasColumns
+ << (QVector<int>() // resourceKeys
+ << 4);
+
+ QTest::newRow("File: [fileName, mimeType], [+url, -mimeType]")
+ << "File" // rootType
+ << (QStringList() // propertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << (QStringList() // sortPropertyNames
+ << QLatin1String("+url")
+ << QLatin1String("-mimeType"))
+ << 5 // tableWidth
+ << 5 // compositeOffset
+ << "SELECT ?x nie:url(?x) rdf:type(?x) nfo:fileName(?x) nie:mimeType(?x) "
+ "WHERE {{?x rdf:type nfo:FileDataObject}} "
+ "GROUP BY ?x "
+ "ORDER BY ASC(nie:url(?x)) DESC(nie:mimeType(?x))"
+ << (QStringList() // fieldNames
+ << QLatin1String("nfo:fileName")
+ << QLatin1String("nie:mimeType"))
+ << (QStringList() // filteredPropertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << QVector<int>() // aliasColumns
+ << (QVector<int>() // resourceKeys
+ << 4);
+
+ QTest::newRow("File: [fileName, mimeType], [-url, -mimeType]")
+ << "File" // rootType
+ << (QStringList() // propertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << (QStringList() // sortPropertyNames
+ << QLatin1String("-url")
+ << QLatin1String("-mimeType"))
+ << 5 // tableWidth
+ << 5 // compositeOffset
+ << "SELECT ?x nie:url(?x) rdf:type(?x) nfo:fileName(?x) nie:mimeType(?x) "
+ "WHERE {{?x rdf:type nfo:FileDataObject}} "
+ "GROUP BY ?x "
+ "ORDER BY DESC(nie:url(?x)) DESC(nie:mimeType(?x))"
+ << (QStringList() // fieldNames
+ << QLatin1String("nfo:fileName")
+ << QLatin1String("nie:mimeType"))
+ << (QStringList() // filteredPropertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << QVector<int>() // aliasColumns
+ << (QVector<int>() // resourceKeys
+ << 4);
+
+ QTest::newRow("File: [fileName, mimeType], [+keywords, +mimeType]")
+ << "File" // rootType
+ << (QStringList() // propertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << (QStringList() // sortPropertyNames
+ << QLatin1String("+keywords")
+ << QLatin1String("+mimeType"))
+ << 5 // tableWidth
+ << 5 // compositeOffset
+ << "SELECT ?x nie:url(?x) rdf:type(?x) nfo:fileName(?x) nie:mimeType(?x) "
+ "WHERE {{?x rdf:type nfo:FileDataObject}} "
+ "GROUP BY ?x "
+ "ORDER BY ASC(nie:keyword(?x)) ASC(nie:mimeType(?x))"
+ << (QStringList() // fieldNames
+ << QLatin1String("nfo:fileName")
+ << QLatin1String("nie:mimeType"))
+ << (QStringList() // filteredPropertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << QVector<int>() // aliasColumns
+ << (QVector<int>() // resourceKeys
+ << 4);
+
+ QTest::newRow("File: [fileName, mimeType], [-keywords, +mimeType]")
+ << "File" // rootType
+ << (QStringList() // propertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << (QStringList() // sortPropertyNames
+ << QLatin1String("-keywords")
+ << QLatin1String("+mimeType"))
+ << 5 // tableWidth
+ << 5 // compositeOffset
+ << "SELECT ?x nie:url(?x) rdf:type(?x) nfo:fileName(?x) nie:mimeType(?x) "
+ "WHERE {{?x rdf:type nfo:FileDataObject}} "
+ "GROUP BY ?x "
+ "ORDER BY DESC(nie:keyword(?x)) ASC(nie:mimeType(?x))"
+ << (QStringList() // fieldNames
+ << QLatin1String("nfo:fileName")
+ << QLatin1String("nie:mimeType"))
+ << (QStringList() // filteredPropertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << QVector<int>() // aliasColumns
+ << (QVector<int>() // resourceKeys
+ << 4);
+
+ QTest::newRow("File: [fileName, mimeType], [+keywords, -mimeType]")
+ << "File" // rootType
+ << (QStringList() // propertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << (QStringList() // sortPropertyNames
+ << QLatin1String("+keywords")
+ << QLatin1String("-mimeType"))
+ << 5 // tableWidth
+ << 5 // compositeOffset
+ << "SELECT ?x nie:url(?x) rdf:type(?x) nfo:fileName(?x) nie:mimeType(?x) "
+ "WHERE {{?x rdf:type nfo:FileDataObject}} "
+ "GROUP BY ?x "
+ "ORDER BY ASC(nie:keyword(?x)) DESC(nie:mimeType(?x))"
+ << (QStringList() // fieldNames
+ << QLatin1String("nfo:fileName")
+ << QLatin1String("nie:mimeType"))
+ << (QStringList() // filteredPropertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << QVector<int>() // aliasColumns
+ << (QVector<int>() // resourceKeys
+ << 4);
+
+ QTest::newRow("File: [fileName, mimeType], [-keywords, -mimeType]")
+ << "File" // rootType
+ << (QStringList() // propertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << (QStringList() // sortPropertyNames
+ << QLatin1String("-keywords")
+ << QLatin1String("-mimeType"))
+ << 5 // tableWidth
+ << 5 // compositeOffset
+ << "SELECT ?x nie:url(?x) rdf:type(?x) nfo:fileName(?x) nie:mimeType(?x) "
+ "WHERE {{?x rdf:type nfo:FileDataObject}} "
+ "GROUP BY ?x "
+ "ORDER BY DESC(nie:keyword(?x)) DESC(nie:mimeType(?x))"
+ << (QStringList() // fieldNames
+ << QLatin1String("nfo:fileName")
+ << QLatin1String("nie:mimeType"))
+ << (QStringList() // filteredPropertyNames
+ << QLatin1String("fileName")
+ << QLatin1String("mimeType"))
+ << QVector<int>() // aliasColumns
+ << (QVector<int>() // resourceKeys
+ << 4);
+}
+
+void tst_QGalleryTrackerSchema::queryResponseFilePropertyNames()
+{
+ QFETCH(QString, rootType);
+ QFETCH(QStringList, propertyNames);
+ QFETCH(QStringList, sortPropertyNames);
+ QFETCH(int, tableWidth);
+ QFETCH(int, compositeOffset);
+ QFETCH(QString, sparql);
+ QFETCH(QStringList, filteredPropertyNames);
+ QFETCH(QStringList, fieldNames);
+ QFETCH(QVector<int>, aliasColumns);
+ QFETCH(QVector<int>, resourceKeys);
+
+ QGalleryTrackerResultSetArguments arguments;
+
+ QGalleryTrackerSchema schema(rootType);
+
+ QCOMPARE(
+ schema.prepareQueryResponse(
+ &arguments,
+ this,
+ QGalleryQueryRequest::AllDescendants,
+ QString(),
+ QGalleryFilter(),
+ propertyNames,
+ sortPropertyNames,
+ 0,
+ 0),
+ QDocumentGallery::NoError);
+
+ QCOMPARE(arguments.tableWidth, tableWidth);
+ QCOMPARE(arguments.valueOffset, 3);
+ QCOMPARE(arguments.compositeOffset, compositeOffset);
+
+ QCOMPARE(arguments.sparql, sparql);
+
+ QCOMPARE(arguments.propertyNames, filteredPropertyNames);
+ QCOMPARE(arguments.fieldNames, fieldNames);
+
+ QCOMPARE(arguments.aliasColumns, aliasColumns);
+ QCOMPARE(arguments.resourceKeys, resourceKeys);
+}
+
+void tst_QGalleryTrackerSchema::queryResponseRootItem_data()
+{
+ QTest::addColumn<QString>("rootType");
+ QTest::addColumn<QString>("rootItem");
+ QTest::addColumn<QGalleryQueryRequest::Scope>("scope");
+ QTest::addColumn<QString>("sparql");
+
+ QTest::newRow("Folder, All File Descendants")
+ << QString::fromLatin1("File")
+ << QString::fromLatin1("folder::uuid:ff172362-d959-99e0-a792-0ddafdd2c559")
+ << QGalleryQueryRequest::AllDescendants
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:FileDataObject}"
+ "FILTER(nie:url(?x) > fn:concat(nie:url(<uuid:ff172362-d959-99e0-a792-0ddafdd2c559>),'/') "
+ "&& nie:url(?x) < fn:concat(nie:url(<uuid:ff172362-d959-99e0-a792-0ddafdd2c559>),'0'))"
+ "} "
+ "GROUP BY ?x";
+
+ QTest::newRow("Folder, Direct File Descendants")
+ << QString::fromLatin1("File")
+ << QString::fromLatin1("folder::uuid:ff172362-d959-99e0-a792-0ddafdd2c559")
+ << QGalleryQueryRequest::DirectDescendants
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:FileDataObject}"
+ "FILTER(nfo:belongsToContainer(?x)=<uuid:ff172362-d959-99e0-a792-0ddafdd2c559>)"
+ "} "
+ "GROUP BY ?x";
+
+ QTest::newRow("Album, All Audio Descendants")
+ << QString::fromLatin1("Audio")
+ << QString::fromLatin1("album::musicAlbum:Greatest%20Hits")
+ << QGalleryQueryRequest::AllDescendants
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:Audio}"
+ "FILTER(nmm:musicAlbum(?x)=<musicAlbum:Greatest%20Hits>)"
+ "} "
+ "GROUP BY ?x";
+
+ QTest::newRow("Album, Direct Audio Descendants")
+ << QString::fromLatin1("Audio")
+ << QString::fromLatin1("album::musicAlbum:Greatest%20Hits")
+ << QGalleryQueryRequest::DirectDescendants
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:Audio}"
+ "FILTER(nmm:musicAlbum(?x)=<musicAlbum:Greatest%20Hits>)"
+ "} "
+ "GROUP BY ?x";
+
+ QTest::newRow("Album Artist, All Audio Descendants")
+ << QString::fromLatin1("Audio")
+ << QString::fromLatin1("albumArtist::artist:Self%20Titled")
+ << QGalleryQueryRequest::AllDescendants
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:Audio}"
+ "FILTER(nmm:albumArtist(nmm:musicAlbum(?x))=<artist:Self%20Titled>)"
+ "} "
+ "GROUP BY ?x";
+
+ QTest::newRow("Album Artist, Direct Audio Descendants")
+ << QString::fromLatin1("Audio")
+ << QString::fromLatin1("albumArtist::artist:Self%20Titled")
+ << QGalleryQueryRequest::DirectDescendants
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:Audio}"
+ "FILTER(nmm:albumArtist(nmm:musicAlbum(?x))=<artist:Self%20Titled>)"
+ "} "
+ "GROUP BY ?x";
+
+ QTest::newRow("Album Artist, All Album Descendants")
+ << QString::fromLatin1("Album")
+ << QString::fromLatin1("albumArtist::artist:Self%20Titled")
+ << QGalleryQueryRequest::AllDescendants
+ << "SELECT ?x "
+ "WHERE {"
+ "{?x rdf:type nmm:MusicAlbum}"
+ "FILTER(nmm:albumArtist(?x)=<artist:Self%20Titled>)"
+ "} "
+ "GROUP BY ?x";
+
+ QTest::newRow("Album Artist, Direct Album Descendants")
+ << QString::fromLatin1("Album")
+ << QString::fromLatin1("albumArtist::artist:Self%20Titled")
+ << QGalleryQueryRequest::DirectDescendants
+ << "SELECT ?x "
+ "WHERE {"
+ "{?x rdf:type nmm:MusicAlbum}"
+ "FILTER(nmm:albumArtist(?x)=<artist:Self%20Titled>)"
+ "} "
+ "GROUP BY ?x";
+
+ QTest::newRow("Artist, All Audio Descendants")
+ << QString::fromLatin1("Audio")
+ << QString::fromLatin1("artist::artist:Self%20Titled")
+ << QGalleryQueryRequest::AllDescendants
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:Audio}"
+ "FILTER(nmm:performer(?x)=<artist:Self%20Titled>)"
+ "} "
+ "GROUP BY ?x";
+
+ QTest::newRow("Artist, Direct Audio Descendants")
+ << QString::fromLatin1("Audio")
+ << QString::fromLatin1("artist::artist:Self%20Titled")
+ << QGalleryQueryRequest::DirectDescendants
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:Audio}"
+ "FILTER(nmm:performer(?x)=<artist:Self%20Titled>)"
+ "} "
+ "GROUP BY ?x";
+
+ QTest::newRow("Artist, All Album Descendants")
+ << QString::fromLatin1("Album")
+ << QString::fromLatin1("artist::artist:Self%20Titled")
+ << QGalleryQueryRequest::AllDescendants
+ << "SELECT ?x "
+ "WHERE {"
+ "{?x rdf:type nmm:MusicAlbum}"
+ "{?track nie:isLogicalPartOf ?x}"
+ "FILTER(nmm:performer(?track)=<artist:Self%20Titled>)"
+ "} "
+ "GROUP BY ?x";
+
+ QTest::newRow("Artist, Direct Album Descendants")
+ << QString::fromLatin1("Album")
+ << QString::fromLatin1("artist::artist:Self%20Titled")
+ << QGalleryQueryRequest::DirectDescendants
+ << "SELECT ?x "
+ "WHERE {"
+ "{?x rdf:type nmm:MusicAlbum}"
+ "{?track nie:isLogicalPartOf ?x}"
+ "FILTER(nmm:performer(?track)=<artist:Self%20Titled>)"
+ "} "
+ "GROUP BY ?x";
+
+ QTest::newRow("Audio Genre, All Audio Descendants")
+ << QString::fromLatin1("Audio")
+ << QString::fromLatin1("audioGenre::Rock")
+ << QGalleryQueryRequest::AllDescendants
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:Audio}"
+ "FILTER(nfo:genre(?x)='Rock')"
+ "} "
+ "GROUP BY ?x";
+
+ QTest::newRow("Audio Genre, Direct Audio Descendants")
+ << QString::fromLatin1("Audio")
+ << QString::fromLatin1("audioGenre::Rock")
+ << QGalleryQueryRequest::DirectDescendants
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:Audio}"
+ "FILTER(nfo:genre(?x)='Rock')"
+ "} "
+ "GROUP BY ?x";
+
+ QTest::newRow("Audio Genre, All Album Descendants")
+ << QString::fromLatin1("Album")
+ << QString::fromLatin1("audioGenre::Rock")
+ << QGalleryQueryRequest::AllDescendants
+ << "SELECT ?x "
+ "WHERE {"
+ "{?x rdf:type nmm:MusicAlbum}"
+ "{?track nie:isLogicalPartOf ?x}"
+ "FILTER(nfo:genre(?track)='Rock')"
+ "} "
+ "GROUP BY ?x";
+
+ QTest::newRow("Audio Genre, Direct Album Descendants")
+ << QString::fromLatin1("Album")
+ << QString::fromLatin1("audioGenre::Rock")
+ << QGalleryQueryRequest::DirectDescendants
+ << "SELECT ?x "
+ "WHERE {"
+ "{?x rdf:type nmm:MusicAlbum}"
+ "{?track nie:isLogicalPartOf ?x}"
+ "FILTER(nfo:genre(?track)='Rock')"
+ "} "
+ "GROUP BY ?x";
+
+ QTest::newRow("Audio Genre, All Artist Descendants")
+ << QString::fromLatin1("Artist")
+ << QString::fromLatin1("audioGenre::Rock")
+ << QGalleryQueryRequest::AllDescendants
+ << "SELECT ?x "
+ "WHERE {"
+ "{?x rdf:type nmm:Artist}"
+ "{?y rdf:type nmm:MusicPiece}"
+ "FILTER(nmm:performer(?y)=?x && nfo:genre(?y)='Rock')"
+ "} "
+ "GROUP BY ?x";
+
+ QTest::newRow("Audio Genre, Direct Artist Descendants")
+ << QString::fromLatin1("Artist")
+ << QString::fromLatin1("audioGenre::Rock")
+ << QGalleryQueryRequest::DirectDescendants
+ << "SELECT ?x "
+ "WHERE {"
+ "{?x rdf:type nmm:Artist}"
+ "{?y rdf:type nmm:MusicPiece}"
+ "FILTER(nmm:performer(?y)=?x && nfo:genre(?y)='Rock')"
+ "} "
+ "GROUP BY ?x";
+
+ QTest::newRow("Audio Genre, All AlbumArtist Descendants")
+ << QString::fromLatin1("AlbumArtist")
+ << QString::fromLatin1("audioGenre::Rock")
+ << QGalleryQueryRequest::AllDescendants
+ << "SELECT ?x "
+ "WHERE {"
+ "{?x rdf:type nmm:Artist}"
+ "{?y rdf:type nmm:MusicAlbum}"
+ "{?track nie:isLogicalPartOf ?y}"
+ "FILTER(nmm:albumArtist(?y)=?x && nfo:genre(?track)='Rock')"
+ "} "
+ "GROUP BY ?x";
+
+ QTest::newRow("Audio Genre, Direct AlbumArtist Descendants")
+ << QString::fromLatin1("AlbumArtist")
+ << QString::fromLatin1("audioGenre::Rock")
+ << QGalleryQueryRequest::DirectDescendants
+ << "SELECT ?x "
+ "WHERE {"
+ "{?x rdf:type nmm:Artist}"
+ "{?y rdf:type nmm:MusicAlbum}"
+ "{?track nie:isLogicalPartOf ?y}"
+ "FILTER(nmm:albumArtist(?y)=?x && nfo:genre(?track)='Rock')"
+ "} "
+ "GROUP BY ?x";
+
+ QTest::newRow("Photo Album, All Image Descendants")
+ << QString::fromLatin1("Image")
+ << QString::fromLatin1("photoAlbum::photoAlbum:Camping")
+ << QGalleryQueryRequest::AllDescendants
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nmm:Photo}"
+ "FILTER(nie:isLogicalPartOf(?x)=<photoAlbum:Camping>)"
+ "} "
+ "GROUP BY ?x";
+
+ QTest::newRow("Photo Album, Direct Image Descendants")
+ << QString::fromLatin1("Image")
+ << QString::fromLatin1("photoAlbum::photoAlbum:Camping")
+ << QGalleryQueryRequest::DirectDescendants
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nmm:Photo}"
+ "FILTER(nie:isLogicalPartOf(?x)=<photoAlbum:Camping>)"
+ "} "
+ "GROUP BY ?x";
+
+ QTest::newRow("No Root Item, All Image Descendants")
+ << QString::fromLatin1("Image")
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nmm:Photo}"
+ "} "
+ "GROUP BY ?x";
+
+ QTest::newRow("No Root Item, All Album Descendants")
+ << QString::fromLatin1("Album")
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << "SELECT ?x "
+ "WHERE {"
+ "{?x rdf:type nmm:MusicAlbum}"
+ "} "
+ "GROUP BY ?x";
+
+ QTest::newRow("No Root Item, Direct Album Descendants")
+ << QString::fromLatin1("Album")
+ << QString()
+ << QGalleryQueryRequest::DirectDescendants
+ << "SELECT ?x "
+ "WHERE {"
+ "{?x rdf:type nmm:MusicAlbum}"
+ "} "
+ "GROUP BY ?x";
+}
+
+void tst_QGalleryTrackerSchema::queryResponseRootItem()
+{
+ QFETCH(QString, rootType);
+ QFETCH(QString, rootItem);
+ QFETCH(QGalleryQueryRequest::Scope, scope);
+ QFETCH(QString, sparql);
+
+ QGalleryTrackerResultSetArguments arguments;
+
+ QGalleryTrackerSchema schema(rootType);
+
+ QCOMPARE(
+ schema.prepareQueryResponse(
+ &arguments,
+ this,
+ scope,
+ rootItem,
+ QGalleryFilter(),
+ QStringList(),
+ QStringList(),
+ 0,
+ 0),
+ QDocumentGallery::NoError);
+
+ QCOMPARE(arguments.sparql, sparql);
+}
+
+void tst_QGalleryTrackerSchema::queryResponseFilter_data()
+{
+ QTest::addColumn<QString>("rootType");
+ QTest::addColumn<QString>("rootItem");
+ QTest::addColumn<QGalleryQueryRequest::Scope>("scope");
+ QTest::addColumn<QGalleryFilter>("filter");
+ QTest::addColumn<QString>("sparql");
+
+ {
+ QGalleryFilter filter
+ = QDocumentGallery::url == QUrl::fromLocalFile(QLatin1String("/path/to/file.ext"));
+
+ QTest::newRow("File.url == file:///path/to/file.ext")
+ << "File"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << filter
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:FileDataObject}"
+ "FILTER((nie:url(?x)='file:///path/to/file.ext'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter
+ = QDocumentGallery::url == QUrl::fromLocalFile(QLatin1String("/"));
+
+ QTest::newRow("File.url == file:///")
+ << "File"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << filter
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:FileDataObject}"
+ "FILTER((nie:url(?x)='file:///'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter
+ = QDocumentGallery::url == QUrl(QLatin1String("http://example.com"));
+
+ QTest::newRow("File.url == http://example.com")
+ << "File"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << filter
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:FileDataObject}"
+ "FILTER((nie:url(?x)='http://example.com'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter
+ = QDocumentGallery::url == QUrl(QLatin1String("http://example.com/index.html"));
+
+ QTest::newRow("File.url == http://example.com/index.html")
+ << "File"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << filter
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:FileDataObject}"
+ "FILTER((nie:url(?x)='http://example.com/index.html'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter = QDocumentGallery::filePath == QLatin1String("/path/to/file.ext");
+
+ QTest::newRow("File.filePath == /path/to/file.ext")
+ << "File"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << filter
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:FileDataObject}"
+ "FILTER((nie:url(?x)='file:///path/to/file.ext'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter = QDocumentGallery::filePath > QLatin1String("/path/to/file.ext");
+
+ QTest::newRow("File.filePath > /path/to/file.ext")
+ << "File"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << filter
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:FileDataObject}"
+ "FILTER((nie:url(?x)>'file:///path/to/file.ext'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter = QDocumentGallery::filePath >= QLatin1String("/path/to/file.ext");
+
+ QTest::newRow("File.filePath >= /path/to/file.ext")
+ << "File"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << filter
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:FileDataObject}"
+ "FILTER((nie:url(?x)>='file:///path/to/file.ext'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter = QDocumentGallery::filePath < QLatin1String("/path/to/file.ext");
+
+ QTest::newRow("File.filePath < /path/to/file.ext")
+ << "File"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << filter
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:FileDataObject}"
+ "FILTER((nie:url(?x)<'file:///path/to/file.ext'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter = QDocumentGallery::filePath <= QLatin1String("/path/to/file.ext");
+
+ QTest::newRow("File.filePath <= /path/to/file.ext")
+ << "File"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << filter
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:FileDataObject}"
+ "FILTER((nie:url(?x)<='file:///path/to/file.ext'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter = QDocumentGallery::path.startsWith(QLatin1String("/path/"));
+
+ QTest::newRow("File.path.startsWith(/path/)")
+ << "File"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << filter
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:FileDataObject}"
+ "FILTER(fn:starts-with(nie:url(nfo:belongsToContainer(?x)),'file:///path/'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter = QDocumentGallery::path.endsWith(QLatin1String("/to"));
+
+ QTest::newRow("File.path.endsWith(/to)")
+ << "File"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << filter
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:FileDataObject}"
+ "FILTER(fn:ends-with(nie:url(nfo:belongsToContainer(?x)),'/to'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter = QDocumentGallery::path.contains(QLatin1String("path"));
+
+ QTest::newRow("File.path.contains(path)")
+ << "File"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << filter
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:FileDataObject}"
+ "FILTER(fn:contains(nie:url(nfo:belongsToContainer(?x)),'path'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter = QDocumentGallery::path.wildcard(QLatin1String("/*/to"));
+
+ QTest::newRow("File.path.wildcard(/*/to)")
+ << "File"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << filter
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:FileDataObject}"
+ "FILTER(fn:contains(nie:url(nfo:belongsToContainer(?x)),'file:///*/to'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter = QDocumentGallery::fileExtension == QLatin1String("ext");
+
+ QTest::newRow("File.fileExtension == ext")
+ << "File"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << filter
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:FileDataObject}"
+ "FILTER(fn:ends-with(nfo:fileName(?x),'.ext'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter = QDocumentGallery::fileName == QLatin1String("file.ext");
+
+ QTest::newRow("File.fileName == file.ext")
+ << "File"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << filter
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:FileDataObject}"
+ "FILTER((nfo:fileName(?x)='file.ext'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter = QDocumentGallery::fileName.startsWith(QLatin1String("file."));
+
+ QTest::newRow("File.fileName.startsWith(file.)")
+ << "File"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << filter
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:FileDataObject}"
+ "FILTER(fn:starts-with(nfo:fileName(?x),'file.'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter = QDocumentGallery::fileName.endsWith(QLatin1String(".ext"));
+
+ QTest::newRow("File.fileName.endsWith(.ext)")
+ << "File"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << filter
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:FileDataObject}"
+ "FILTER(fn:ends-with(nfo:fileName(?x),'.ext'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter = QDocumentGallery::fileName.contains(QLatin1String("ext"));
+
+ QTest::newRow("File.fileName.contains(ext)")
+ << "File"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << filter
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:FileDataObject}"
+ "FILTER(fn:contains(nfo:fileName(?x),'ext'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter = QDocumentGallery::fileName.wildcard(QLatin1String("file*ext"));
+
+ QTest::newRow("File.fileName.wildcard(file*ext")
+ << "File"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << filter
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:FileDataObject}"
+ "FILTER(fn:contains(nfo:fileName(?x),'file*ext'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter
+ = QDocumentGallery::fileName.regExp(QLatin1String("(file|document).ext"));
+
+ QTest::newRow("File.fileName.regExp((file|document).ext)")
+ << "File"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << filter
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:FileDataObject}"
+ "FILTER(REGEX(nfo:fileName(?x),'(file|document).ext'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter
+ = QDocumentGallery::fileName.regExp(QRegExp(QLatin1String("(file|document).ext")));
+
+ QTest::newRow("File.fileName.regExp(QRegExp((file|document).ext))")
+ << "File"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << filter
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:FileDataObject}"
+ "FILTER(REGEX(nfo:fileName(?x),'(file|document).ext'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter
+ = QDocumentGallery::description == QUrl(QLatin1String("http://example.com/index.html"));
+
+ QTest::newRow("File.description == http://example.com/index.html")
+ << "File"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << filter
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:FileDataObject}"
+ "FILTER((nie:description(?x)='http://example.com/index.html'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter = QDocumentGallery::width > 1024;
+
+ QTest::newRow("Image.width > 1024")
+ << "Image"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << filter
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nmm:Photo}"
+ "FILTER((nfo:width(?x)>'1024'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter = QDocumentGallery::width >= 1024u;
+
+ QTest::newRow("Video.width >= 1024u")
+ << "Video"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << filter
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:Video}"
+ "FILTER((nfo:width(?x)>='1024'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter = QDocumentGallery::height < Q_INT64_C(1024);
+
+ QTest::newRow("Image.height < 1024ll")
+ << "Image"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << filter
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nmm:Photo}"
+ "FILTER((nfo:height(?x)<'1024'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter = QDocumentGallery::height <= Q_UINT64_C(1024);
+
+ QTest::newRow("Video.height <= 1024ull")
+ << "Video"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << filter
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:Video}"
+ "FILTER((nfo:height(?x)<='1024'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter = QDocumentGallery::focalLength <= 1.9;
+
+ QTest::newRow("Image.focalLength <= 1.9")
+ << "Image"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << filter
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nmm:Photo}"
+ "FILTER((nmm:focalLength(?x)<='1.9'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter = QDocumentGallery::focalLength < 0.25f;
+
+ QTest::newRow("Image.focalLength <= 0.25f")
+ << "Image"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << filter
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nmm:Photo}"
+ "FILTER((nmm:focalLength(?x)<'0.25'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter
+ = QDocumentGallery::lastModified > QDateTime(QDate(2008, 06, 01), QTime(12, 5, 8));
+
+ QTest::newRow("Image.lastModified > 2008-06-01T12:05:08")
+ << "Image"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << filter
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nmm:Photo}"
+ "FILTER((nfo:fileLastModified(?x)>'2008-06-01T12:05:08'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter = !(
+ QDocumentGallery::lastModified > QDateTime(QDate(2008, 06, 01), QTime(12, 5, 8)));
+
+ QTest::newRow("!(Image.lastModified > 2008-06-01T12:05:08")
+ << "Image"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << filter
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nmm:Photo}"
+ "FILTER(!(nfo:fileLastModified(?x)>'2008-06-01T12:05:08'))"
+ "} "
+ "GROUP BY ?x";
+
+ } {
+ QGalleryIntersectionFilter filter;
+ filter.append(QDocumentGallery::width > 1024);
+ filter.append(QDocumentGallery::height > 768);
+
+ QTest::newRow("Image.width > 1024 && Image.height > 768")
+ << "Image"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << QGalleryFilter(filter)
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nmm:Photo}"
+ "FILTER(((nfo:width(?x)>'1024')&&(nfo:height(?x)>'768')))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryIntersectionFilter filter;
+ filter.append(QDocumentGallery::width > 1024);
+
+ QTest::newRow("Image.width > 1024 (Single intersection item)")
+ << "Image"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << QGalleryFilter(filter)
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nmm:Photo}"
+ "FILTER(((nfo:width(?x)>'1024')))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryUnionFilter filter;
+ filter.append(QDocumentGallery::width < 1920);
+ filter.append(QDocumentGallery::height < 1024);
+
+ QTest::newRow("Image.width < 1920 || Image.height < 1024")
+ << "Image"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << QGalleryFilter(filter)
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nmm:Photo}"
+ "FILTER(((nfo:width(?x)<'1920')||(nfo:height(?x)<'1024')))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryUnionFilter filter;
+ filter.append(QDocumentGallery::width < 1920);
+
+ QTest::newRow("Image.width < 1920 (Single union item")
+ << "Image"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << QGalleryFilter(filter)
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nmm:Photo}"
+ "FILTER(((nfo:width(?x)<'1920')))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryUnionFilter filter;
+
+ QTest::newRow("Image (Empty union filter)")
+ << "Image"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << QGalleryFilter(filter)
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nmm:Photo}"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryIntersectionFilter filter;
+
+ QTest::newRow("Image (Empty intersection filter)")
+ << "Image"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << QGalleryFilter(filter)
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nmm:Photo}"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter = QDocumentGallery::fileName == QLatin1String("file.ext");
+
+ QTest::newRow("File.fileName == file.ext, In folder")
+ << "File"
+ << "folder::uuid:ff172362-d959-99e0-a792-0ddafdd2c559"
+ << QGalleryQueryRequest::DirectDescendants
+ << filter
+ << "SELECT ?x nie:url(?x) rdf:type(?x) "
+ "WHERE {"
+ "{?x rdf:type nfo:FileDataObject}"
+ "FILTER(nfo:belongsToContainer(?x)=<uuid:ff172362-d959-99e0-a792-0ddafdd2c559> "
+ "&& (nfo:fileName(?x)='file.ext'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter = QDocumentGallery::title == QLatin1String("Greatest Hits");
+
+ QTest::newRow("Album.title == Greatest Hits (All)")
+ << "Album"
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << QGalleryFilter(filter)
+ << "SELECT ?x "
+ "WHERE {"
+ "{?x rdf:type nmm:MusicAlbum}"
+ "FILTER((nmm:albumTitle(?x)='Greatest Hits'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter = QDocumentGallery::title == QLatin1String("Greatest Hits");
+
+ QTest::newRow("Album.title == Greatest Hits (Direct)")
+ << "Album"
+ << QString()
+ << QGalleryQueryRequest::DirectDescendants
+ << QGalleryFilter(filter)
+ << "SELECT ?x "
+ "WHERE {"
+ "{?x rdf:type nmm:MusicAlbum}"
+ "FILTER((nmm:albumTitle(?x)='Greatest Hits'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter = QDocumentGallery::title == QLatin1String("Greatest Hits");
+
+ QTest::newRow("Album.title == Greatest Hits, Belonging to AlbumArtist (All)")
+ << "Album"
+ << "albumArtist::artist:Self%20Titled"
+ << QGalleryQueryRequest::AllDescendants
+ << QGalleryFilter(filter)
+ << "SELECT ?x "
+ "WHERE {"
+ "{?x rdf:type nmm:MusicAlbum}"
+ "FILTER(nmm:albumArtist(?x)=<artist:Self%20Titled> "
+ "&& (nmm:albumTitle(?x)='Greatest Hits'))"
+ "} "
+ "GROUP BY ?x";
+ } {
+ QGalleryFilter filter = QDocumentGallery::title == QLatin1String("Greatest Hits");
+
+ QTest::newRow("Album.title == Greatest Hits, Belonging to AlbumArtist (Direct)")
+ << "Album"
+ << "albumArtist::artist:Self%20Titled"
+ << QGalleryQueryRequest::DirectDescendants
+ << QGalleryFilter(filter)
+ << "SELECT ?x "
+ "WHERE {"
+ "{?x rdf:type nmm:MusicAlbum}"
+ "FILTER(nmm:albumArtist(?x)=<artist:Self%20Titled> "
+ "&& (nmm:albumTitle(?x)='Greatest Hits'))"
+ "} "
+ "GROUP BY ?x";
+ }
+}
+
+void tst_QGalleryTrackerSchema::queryResponseFilter()
+{
+ QFETCH(QString, rootType);
+ QFETCH(QString, rootItem);
+ QFETCH(QGalleryQueryRequest::Scope, scope);
+ QFETCH(QGalleryFilter, filter);
+ QFETCH(QString, sparql);
+
+ QGalleryTrackerResultSetArguments arguments;
+
+ QGalleryTrackerSchema schema(rootType);
+
+ QCOMPARE(
+ schema.prepareQueryResponse(
+ &arguments,
+ this,
+ scope,
+ rootItem,
+ filter,
+ QStringList(),
+ QStringList(),
+ 0,
+ 0),
+ QDocumentGallery::NoError);
+
+ QCOMPARE(arguments.sparql, sparql);
+}
+
+void tst_QGalleryTrackerSchema::queryResponseValueColumnToVariant_data()
+{
+ QTest::addColumn<QString>("rootType");
+ QTest::addColumn<QString>("propertyName");
+ QTest::addColumn<QString>("string");
+ QTest::addColumn<QVariant>("value");
+
+ QTest::newRow("File.fileName")
+ << "File"
+ << "fileName"
+ << "file.ext"
+ << QVariant(QLatin1String("file.ext"));
+
+ QTest::newRow("File.fileName (Empty)")
+ << "File"
+ << "fileName"
+ << QString()
+ << QVariant(QString());
+
+ QTest::newRow("File.keywords (1)")
+ << "File"
+ << "keywords"
+ << "Holiday"
+ << QVariant(QStringList() << QLatin1String("Holiday"));
+
+ QTest::newRow("File.keywords (2)")
+ << "File"
+ << "keywords"
+ << "Holiday|Summer"
+ << QVariant(QStringList() << QLatin1String("Holiday") << QLatin1String("Summer"));
+
+ QTest::newRow("File.keywords (3)")
+ << "File"
+ << "keywords"
+ << "2009|Holiday|Summer"
+ << QVariant(QStringList()
+ << QLatin1String("2009")
+ << QLatin1String("Holiday")
+ << QLatin1String("Summer"));
+
+ QTest::newRow("File.keywords (Empty")
+ << "File"
+ << "keywords"
+ << QString()
+ << QVariant(QStringList());
+
+ QTest::newRow("Image.lastModified")
+ << "Image"
+ << "lastModified"
+ << "2009-08-23T09:03:32"
+ << QVariant(QDateTime(QDate(2009, 8, 23), QTime(9, 3, 32)));
+
+ QTest::newRow("Image.lastModfied (Invalid)")
+ << "Image"
+ << "lastModified"
+ << "Yesterday"
+ << QVariant();
+
+ QTest::newRow("Image.dateTaken (Empty)")
+ << "Image"
+ << "lastModified"
+ << QString()
+ << QVariant();
+
+ QTest::newRow("Image.focalLength (12)")
+ << "Image"
+ << "focalLength"
+ << "12"
+ << QVariant(12.0);
+
+ QTest::newRow("Image.focalLength (12.5)")
+ << "Image"
+ << "focalLength"
+ << "12.5"
+ << QVariant(12.5);
+
+ QTest::newRow("Image.focalLength (Invalid)")
+ << "Image"
+ << "focalLength"
+ << "twelve point 5"
+ << QVariant();
+
+ QTest::newRow("Image.focalLength (Empty")
+ << "Image"
+ << "focalLength"
+ << QString()
+ << QVariant();
+
+ QTest::newRow("Image.height")
+ << "Image"
+ << "height"
+ << "720"
+ << QVariant(720);
+
+ QTest::newRow("Image.height (Invalid")
+ << "Image"
+ << "height"
+ << "seven twenty"
+ << QVariant();
+
+ QTest::newRow("Image.height (Empty)")
+ << "Image"
+ << "height"
+ << QString()
+ << QVariant();
+}
+
+void tst_QGalleryTrackerSchema::queryResponseValueColumnToVariant()
+{
+ QFETCH(QString, rootType);
+ QFETCH(QString, propertyName);
+ QFETCH(QString, string);
+ QFETCH(QVariant, value);
+
+ QGalleryTrackerResultSetArguments arguments;
+
+ QGalleryTrackerSchema schema(rootType);
+
+ QCOMPARE(
+ schema.prepareQueryResponse(
+ &arguments,
+ this,
+ QGalleryQueryRequest::AllDescendants,
+ QString(),
+ QGalleryFilter(),
+ QStringList() << propertyName,
+ QStringList(),
+ 0,
+ 0),
+ QDocumentGallery::NoError);
+
+ QCOMPARE(arguments.valueColumns.count(), 4);
+ QCOMPARE(arguments.valueColumns.at(3)->toVariant(string), value);
+}
+
+void tst_QGalleryTrackerSchema::queryResponseValueColumnToString_data()
+{
+ QTest::addColumn<QString>("rootType");
+ QTest::addColumn<QString>("propertyName");
+ QTest::addColumn<QVariant>("value");
+ QTest::addColumn<QString>("string");
+
+ QTest::newRow("File.fileName")
+ << "File"
+ << "fileName"
+ << QVariant(QLatin1String("file.ext"))
+ << "file.ext";
+
+ QTest::newRow("File.fileName (Empty)")
+ << "File"
+ << "fileName"
+ << QVariant(QString())
+ << QString();
+
+ QTest::newRow("File.keywords (1)")
+ << "File"
+ << "keywords"
+ << QVariant(QStringList() << QLatin1String("Holiday"))
+ << "Holiday";
+
+ QTest::newRow("File.keywords (2)")
+ << "File"
+ << "keywords"
+ << QVariant(QStringList() << QLatin1String("Holiday") << QLatin1String("Summer"))
+ << "Holiday|Summer";
+
+ QTest::newRow("File.keywords (3)")
+ << "File"
+ << "keywords"
+ << QVariant(QStringList()
+ << QLatin1String("2009")
+ << QLatin1String("Holiday")
+ << QLatin1String("Summer"))
+ << "2009|Holiday|Summer";
+
+ QTest::newRow("File.keywords (QString)")
+ << "File"
+ << "keywords"
+ << QVariant(QLatin1String("Holiday"))
+ << "Holiday";
+
+ QTest::newRow("File.keywords (Empty")
+ << "File"
+ << "keywords"
+ << QVariant(QStringList())
+ << QString();
+
+ QTest::newRow("Image.lastModified")
+ << "Image"
+ << "lastModified"
+ << QVariant(QDateTime(QDate(2009, 8, 23), QTime(9, 3, 32)))
+ << "2009-08-23T09:03:32";
+
+ QTest::newRow("Image.lastModified (Invalid)")
+ << "Image"
+ << "lastModified"
+ << QVariant(QDateTime(QDate(2009, 8, 56), QTime(95, 3, 32)))
+ << QString();
+
+ QTest::newRow("Image.lastModified (Empty)")
+ << "Image"
+ << "lastModified"
+ << QVariant()
+ << QString();
+
+ QTest::newRow("Image.focalLength (12)")
+ << "Image"
+ << "focalLength"
+ << QVariant(12.0)
+ << "12";
+
+ QTest::newRow("Image.focalLength (12.5)")
+ << "Image"
+ << "focalLength"
+ << QVariant(12.5)
+ << "12.5";
+
+ QTest::newRow("Image.focalLength (Empty")
+ << "Image"
+ << "focalLength"
+ << QVariant()
+ << QString();
+
+ QTest::newRow("Image.height")
+ << "Image"
+ << "height"
+ << QVariant(720)
+ << "720";
+
+ QTest::newRow("Image.height (Empty)")
+ << "Image"
+ << "height"
+ << QVariant()
+ << QString();
+}
+
+void tst_QGalleryTrackerSchema::queryResponseValueColumnToString()
+{
+ QFETCH(QString, rootType);
+ QFETCH(QString, propertyName);
+ QFETCH(QVariant, value);
+ QFETCH(QString, string);
+
+ QGalleryTrackerResultSetArguments arguments;
+
+ QGalleryTrackerSchema schema(rootType);
+
+ QCOMPARE(
+ schema.prepareQueryResponse(
+ &arguments,
+ this,
+ QGalleryQueryRequest::AllDescendants,
+ QString(),
+ QGalleryFilter(),
+ QStringList() << propertyName,
+ QStringList(),
+ 0,
+ 0),
+ QDocumentGallery::NoError);
+
+ QCOMPARE(arguments.valueColumns.count(), 4);
+ QCOMPARE(arguments.valueColumns.at(3)->toString(value), string);
+}
+
+void tst_QGalleryTrackerSchema::queryResponseCompositeColumn_data()
+{
+ QTest::addColumn<QString>("rootType");
+ QTest::addColumn<QString>("propertyName");
+ QTest::addColumn<QVector<QVariant> >("rowData");
+ QTest::addColumn<QVariant>("value");
+
+ QTest::newRow("File.filePath")
+ << QString::fromLatin1("Image")
+ << QString::fromLatin1("filePath")
+ << (QVector<QVariant>()
+ << QLatin1String("uuid:ff172362-d959-99e0-a792-0ddafdd2c559")
+ << QLatin1String("file:///path/to/file.ext")
+ << QLatin1String("Files"))
+ << QVariant(QLatin1String("/path/to/file.ext"));
+
+ QTest::newRow("File.path")
+ << QString::fromLatin1("Image")
+ << QString::fromLatin1("path")
+ << (QVector<QVariant>()
+ << QLatin1String("uuid:ff172362-d959-99e0-a792-0ddafdd2c559")
+ << QLatin1String("file:///path/to/file.ext")
+ << QLatin1String("Files"))
+ << QVariant(QLatin1String("/path/to"));
+
+ QTest::newRow("File.path (empty fileName)")
+ << QString::fromLatin1("Image")
+ << QString::fromLatin1("path")
+ << (QVector<QVariant>()
+ << QLatin1String("uuid:ff172362-d959-99e0-a792-0ddafdd2c559")
+ << QLatin1String("file:///path/to/")
+ << QLatin1String("Files"))
+ << QVariant(QLatin1String("/path/to"));
+
+ QTest::newRow("File.fileExtension")
+ << QString::fromLatin1("Image")
+ << QString::fromLatin1("fileExtension")
+ << (QVector<QVariant>()
+ << QLatin1String("uuid:ff172362-d959-99e0-a792-0ddafdd2c559")
+ << QLatin1String("file:///path/to/file.ext")
+ << QLatin1String("Files"))
+ << QVariant(QLatin1String("ext"));
+
+
+ QTest::newRow("File.fileExtension (no extension)")
+ << QString::fromLatin1("Image")
+ << QString::fromLatin1("fileExtension")
+ << (QVector<QVariant>()
+ << QLatin1String("uuid:ff172362-d959-99e0-a792-0ddafdd2c559")
+ << QLatin1String("file:///path/to")
+ << QLatin1String("Files"))
+ << QVariant();
+}
+
+void tst_QGalleryTrackerSchema::queryResponseCompositeColumn()
+{
+ QFETCH(QString, rootType);
+ QFETCH(QString, propertyName);
+ QFETCH(QVector<QVariant>, rowData);
+ QFETCH(QVariant, value);
+
+ QGalleryTrackerResultSetArguments arguments;
+
+ QGalleryTrackerSchema schema(rootType);
+
+ QCOMPARE(
+ schema.prepareQueryResponse(
+ &arguments,
+ this,
+ QGalleryQueryRequest::AllDescendants,
+ QString(),
+ QGalleryFilter(),
+ QStringList() << propertyName,
+ QStringList(),
+ 0,
+ 0),
+ QDocumentGallery::NoError);
+
+ QCOMPARE(arguments.compositeColumns.count(), 1);
+ QCOMPARE(arguments.compositeColumns.at(0)->value(rowData.constBegin()), value);
+}
+
+void tst_QGalleryTrackerSchema::prepareInvalidQueryResponse_data()
+{
+ QTest::addColumn<QString>("rootItem");
+ QTest::addColumn<QGalleryQueryRequest::Scope>("scope");
+ QTest::addColumn<QString>("rootType");
+ QTest::addColumn<QGalleryFilter>("filter");
+ QTest::addColumn<QStringList>("propertyNames");
+ QTest::addColumn<QStringList>("sortPropertyNames");
+ QTest::addColumn<QDocumentGallery::Error>("error");
+
+ QTest::addColumn<QVariant>("itemId");
+ QTest::addColumn<QStringList>("propertyNames");
+ QTest::addColumn<QDocumentGallery::Error>("error");
+
+ QTest::newRow("Invalid Type, No Filter")
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << "Turtle"
+ << QGalleryFilter()
+ << QStringList()
+ << QStringList()
+ << QDocumentGallery::ItemTypeError;
+
+ QTest::newRow("Invalid Type, With Filter")
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << "Turtle"
+ << QGalleryFilter(QDocumentGallery::fileName == QLatin1String("file.ext"))
+ << QStringList()
+ << QStringList()
+ << QDocumentGallery::ItemTypeError;
+
+ QTest::newRow("No Type")
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << QString()
+ << QGalleryFilter()
+ << QStringList()
+ << QStringList()
+ << QDocumentGallery::ItemTypeError;
+
+ QTest::newRow("Invalid Root Item Type")
+ << "turtle::urn:turtle:/its/a/turtle"
+ << QGalleryQueryRequest::AllDescendants
+ << "File"
+ << QGalleryFilter()
+ << QStringList()
+ << QStringList()
+ << QDocumentGallery::ItemIdError;
+
+ QTest::newRow("File.filePath.regExp(/path)")
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << "File"
+ << QGalleryFilter(QDocumentGallery::filePath.regExp(QLatin1String("/path")))
+ << QStringList()
+ << QStringList()
+ << QDocumentGallery::FilterError;
+
+ QTest::newRow("File.filePath.regExp(/path) (within union)")
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << "File"
+ << QGalleryFilter(QGalleryUnionFilter(
+ QDocumentGallery::filePath.regExp(QLatin1String("/path"))))
+ << QStringList()
+ << QStringList()
+ << QDocumentGallery::FilterError;
+
+ QTest::newRow("File.filePath.regExp(/path) (within intersection)")
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << "File"
+ << QGalleryFilter(QGalleryIntersectionFilter(
+ QDocumentGallery::filePath.regExp(QLatin1String("/path"))))
+ << QStringList()
+ << QStringList()
+ << QDocumentGallery::FilterError;
+
+ QTest::newRow("File.filePath ? /path")
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << "File"
+ << QGalleryFilter(QGalleryMetaDataFilter(
+ QLatin1String("filePath"),
+ QLatin1String("file.ext"),
+ QGalleryFilter::Comparator(1200)))
+ << QStringList()
+ << QStringList()
+ << QDocumentGallery::FilterError;
+
+ QTest::newRow("File.filePath == QPoint(12, 44)")
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << "File"
+ << QGalleryFilter(QDocumentGallery::filePath == QPoint(12, 44))
+ << QStringList()
+ << QStringList()
+ << QDocumentGallery::FilterError;
+
+ QTest::newRow("File.fileName ? file.ext")
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << "File"
+ << QGalleryFilter(QGalleryMetaDataFilter(
+ QLatin1String("fileName"),
+ QLatin1String("file.ext"),
+ QGalleryFilter::Comparator(1200)))
+ << QStringList()
+ << QStringList()
+ << QDocumentGallery::FilterError;
+
+ QTest::newRow("File.fileName == QPoint(12, 44)")
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << "File"
+ << QGalleryFilter(QDocumentGallery::fileName == QPoint(12, 44))
+ << QStringList()
+ << QStringList()
+ << QDocumentGallery::FilterError;
+
+ QTest::newRow("File.fileExtension > ext")
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << "File"
+ << QGalleryFilter(QDocumentGallery::fileExtension > QLatin1String("ext"))
+ << QStringList()
+ << QStringList()
+ << QDocumentGallery::FilterError;
+
+ QTest::newRow("File.fileExtension == 13")
+ << QString()
+ << QGalleryQueryRequest::AllDescendants
+ << "File"
+ << QGalleryFilter(QDocumentGallery::fileExtension == 13)
+ << QStringList()
+ << QStringList()
+ << QDocumentGallery::FilterError;
+
+ QTest::newRow("File, File Descendants")
+ << "file::uuid:ff172362-d959-99e0-a792-0ddafdd2c559"
+ << QGalleryQueryRequest::AllDescendants
+ << "File"
+ << QGalleryFilter()
+ << QStringList()
+ << QStringList()
+ << QDocumentGallery::ItemIdError;
+
+
+ QTest::newRow("Folder, All Descendants")
+ << "folder::uuid:ff172362-d959-99e0-a792-0ddafdd2c559"
+ << QGalleryQueryRequest::AllDescendants
+ << "Album"
+ << QGalleryFilter()
+ << QStringList()
+ << QStringList()
+ << QDocumentGallery::ItemIdError;
+
+ QTest::newRow("Album, Image Descendants")
+ << "album::musicAlbum:Greatest%20Hits"
+ << QGalleryQueryRequest::AllDescendants
+ << "Image"
+ << QGalleryFilter()
+ << QStringList()
+ << QStringList()
+ << QDocumentGallery::ItemIdError;
+
+ QTest::newRow("Album Artist, Image Descendants")
+ << "albumArtist::artist:Self%20Titled"
+ << QGalleryQueryRequest::AllDescendants
+ << "Image"
+ << QGalleryFilter()
+ << QStringList()
+ << QStringList()
+ << QDocumentGallery::ItemIdError;
+
+ QTest::newRow("Album Artist, Image Descendants")
+ << "artist::artist:Self%20Titled"
+ << QGalleryQueryRequest::AllDescendants
+ << "Image"
+ << QGalleryFilter()
+ << QStringList()
+ << QStringList()
+ << QDocumentGallery::ItemIdError;
+
+ QTest::newRow("Album Artist, Image Descendants")
+ << "audioGenre::Rock"
+ << QGalleryQueryRequest::AllDescendants
+ << "Image"
+ << QGalleryFilter()
+ << QStringList()
+ << QStringList()
+ << QDocumentGallery::ItemIdError;
+
+ QTest::newRow("PhotoAlbum, Audio Descendants")
+ << "photoAlbum::photoAlbum:Camping"
+ << QGalleryQueryRequest::AllDescendants
+ << "Audio"
+ << QGalleryFilter()
+ << QStringList()
+ << QStringList()
+ << QDocumentGallery::ItemIdError;
+}
+
+void tst_QGalleryTrackerSchema::prepareInvalidQueryResponse()
+{
+ QFETCH(QString, rootItem);
+ QFETCH(QGalleryQueryRequest::Scope, scope);
+ QFETCH(QString, rootType);
+ QFETCH(QGalleryFilter, filter);
+ QFETCH(QStringList, propertyNames);
+ QFETCH(QStringList, sortPropertyNames);
+ QFETCH(QDocumentGallery::Error, error);
+
+ QGalleryTrackerResultSetArguments arguments;
+
+ QGalleryTrackerSchema schema(rootType);
+
+ QCOMPARE(
+ schema.prepareQueryResponse(
+ &arguments, this, scope, rootItem, filter, propertyNames, sortPropertyNames, 0, 0),
+ error);
+}
+
+void tst_QGalleryTrackerSchema::serviceForType_data()
+{
+ QTest::addColumn<QString>("itemType");
+ QTest::addColumn<QString>("expectedService");
+
+ QTest::newRow("File")
+ << QString::fromLatin1("File")
+ << QString::fromLatin1("nfo:FileDataObject");
+ QTest::newRow("Folder")
+ << QString::fromLatin1("Folder")
+ << QString::fromLatin1("nfo:Folder");
+ QTest::newRow("Document")
+ << QString::fromLatin1("Document")
+ << QString::fromLatin1("nfo:Document");
+ QTest::newRow("Audio")
+ << QString::fromLatin1("Audio")
+ << QString::fromLatin1("nfo:Audio");
+ QTest::newRow("Image")
+ << QString::fromLatin1("Image")
+ << QString::fromLatin1("nmm:Photo");
+ QTest::newRow("Video")
+ << QString::fromLatin1("Video")
+ << QString::fromLatin1("nfo:Video");
+ QTest::newRow("Playlist")
+ << QString::fromLatin1("Playlist")
+ << QString::fromLatin1("nmm:Playlist");
+ QTest::newRow("Text")
+ << QString::fromLatin1("Text")
+ << QString::fromLatin1("nfo:PlainTextDocument");
+ QTest::newRow("Artist")
+ << QString::fromLatin1("Artist")
+ << QString::fromLatin1("nmm:Artist");
+ QTest::newRow("Album")
+ << QString::fromLatin1("Album")
+ << QString::fromLatin1("nmm:MusicAlbum");
+ QTest::newRow("PhotoAlbum")
+ << QString::fromLatin1("PhotoAlbum")
+ << QString::fromLatin1("nmm:ImageList");
+}
+
+void tst_QGalleryTrackerSchema::serviceForType()
+{
+ QFETCH(QString, itemType);
+ QFETCH(QString, expectedService);
+
+ QCOMPARE(
+ QGalleryTrackerSchema::serviceForType( itemType),
+ expectedService);
+}
+
+QTEST_MAIN(tst_QGalleryTrackerSchema)
+
+#include "tst_qgallerytrackerschema.moc"
+
diff --git a/tests/auto/qgallerytyperequest/qgallerytyperequest.pro b/tests/auto/qgallerytyperequest/qgallerytyperequest.pro
new file mode 100644
index 0000000..48e3a2e
--- /dev/null
+++ b/tests/auto/qgallerytyperequest/qgallerytyperequest.pro
@@ -0,0 +1,3 @@
+include(../auto.pri)
+
+SOURCES += tst_qgallerytyperequest.cpp
diff --git a/tests/auto/qgallerytyperequest/tst_qgallerytyperequest.cpp b/tests/auto/qgallerytyperequest/tst_qgallerytyperequest.cpp
new file mode 100644
index 0000000..4493e5e
--- /dev/null
+++ b/tests/auto/qgallerytyperequest/tst_qgallerytyperequest.cpp
@@ -0,0 +1,517 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDocGallery module 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$
+**
+****************************************************************************/
+
+//TESTED_COMPONENT=src/gallery
+
+#include <qgallerytyperequest.h>
+
+#include <qabstractgallery.h>
+#include <qgalleryabstractresponse.h>
+#include <qgalleryresultset.h>
+#include <qgalleryresource.h>
+#include <qgallerytype.h>
+
+#include <QtTest/QtTest>
+
+Q_DECLARE_METATYPE(QList<int>)
+Q_DECLARE_METATYPE(QGalleryResultSet*)
+
+class tst_QGalleryTypeRequest : public QObject
+{
+ Q_OBJECT
+public Q_SLOTS:
+ void initTestCase();
+
+private Q_SLOTS:
+ void propertyNames();
+ void autoUpdate();
+ void itemType();
+ void executeSynchronous();
+ void executeAsynchronous();
+ void noResponse();
+ void multipleResults();
+};
+
+class QtGalleryTestResponse : public QGalleryResultSet
+{
+ Q_OBJECT
+public:
+ QtGalleryTestResponse(
+ const QStringList &propertyNames,
+ int count,
+ QGalleryAbstractRequest::State state,
+ int error,
+ const QString &errorString)
+ : m_count(count)
+ , m_currentIndex(-1)
+ , m_propertyNames(propertyNames)
+ {
+ m_propertyNames.removeAll(QLatin1String("turtle"));
+
+ if (error != QGalleryAbstractRequest::NoError)
+ QGalleryAbstractResponse::error(error, errorString);
+ else if (state == QGalleryAbstractRequest::Finished)
+ finish();
+ else if (state == QGalleryAbstractRequest::Idle)
+ finish(true);
+ }
+
+ int propertyKey(const QString &propertyName) const {
+ return m_propertyNames.indexOf(propertyName); }
+ QGalleryProperty::Attributes propertyAttributes(int) const {
+ return QGalleryProperty::CanRead | QGalleryProperty::CanWrite; }
+ QVariant::Type propertyType(int) const { return QVariant::String; }
+
+ int itemCount() const { return m_count; }
+
+ int currentIndex() const { return m_currentIndex; }
+
+ bool fetch(int index)
+ {
+ emit currentIndexChanged(m_currentIndex = index);
+ emit currentItemChanged();
+
+ return isValid();
+ }
+
+ QVariant itemId() const { return isValid() ? QVariant(1) : QVariant(); }
+ QUrl itemUrl() const { return isValid() ? QUrl("http://example.com") : QUrl(); }
+ QString itemType() const { return isValid() ? QLatin1String("WebPage") : QString(); }
+
+ QVariant metaData(int key) const { return isValid() ? m_metaData.value(key) : QVariant(); }
+ bool setMetaData(int key, const QVariant &value)
+ {
+ if (isValid()) {
+ m_metaData.insert(key, value);
+ emit metaDataChanged(m_currentIndex, 1, QList<int>() << key);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ void setCount(int count) { m_count = count; }
+
+ using QGalleryResultSet::finish;
+ using QGalleryResultSet::resume;
+ using QGalleryResultSet::itemsInserted;
+ using QGalleryResultSet::itemsRemoved;
+ using QGalleryResultSet::itemsMoved;
+ using QGalleryResultSet::metaDataChanged;
+
+private:
+ int m_count;
+ int m_currentIndex;
+ QStringList m_propertyNames;
+ QHash<int, QVariant> m_metaData;
+};
+
+class QtTestGallery : public QAbstractGallery
+{
+public:
+ QtTestGallery()
+ : m_count(0)
+ , m_state(QGalleryAbstractRequest::Active)
+ , m_error(QGalleryAbstractRequest::NoError)
+ {}
+
+ bool isRequestSupported(QGalleryAbstractRequest::RequestType type) const {
+ return type == QGalleryAbstractRequest::TypeRequest; }
+
+ void setState(QGalleryAbstractRequest::State state) { m_state = state; }
+ void setError(int error, const QString &errorString) {
+ m_error = error; m_errorString = errorString; }
+
+ void setCount(int count) { m_count = count; }
+
+protected:
+ QGalleryAbstractResponse *createResponse(QGalleryAbstractRequest *request)
+ {
+ if (request->type() == QGalleryAbstractRequest::TypeRequest) {
+ return new QtGalleryTestResponse(
+ static_cast<QGalleryTypeRequest *>(request)->propertyNames(),
+ m_count,
+ m_state,
+ m_error,
+ m_errorString);
+ }
+ return 0;
+ }
+
+private:
+ int m_count;
+ QGalleryAbstractRequest::State m_state;
+ int m_error;
+ QString m_errorString;
+};
+
+void tst_QGalleryTypeRequest::initTestCase()
+{
+ qRegisterMetaType<QGalleryResultSet*>();
+ qRegisterMetaType<QList<int> >();
+}
+
+void tst_QGalleryTypeRequest::propertyNames()
+{
+ const QGalleryProperty titleProperty = {"title", sizeof("title")};
+ const QGalleryProperty artistProperty = {"artist", sizeof("artist")};
+
+ const QStringList propertyNames = QStringList()
+ << titleProperty
+ << artistProperty.name()
+ << QLatin1String("album")
+ << QLatin1String("trackNumber");
+
+ QGalleryTypeRequest request;
+
+ QSignalSpy spy(&request, SIGNAL(propertyNamesChanged()));
+
+ QCOMPARE(request.propertyNames(), QStringList());
+
+ request.setPropertyNames(QStringList());
+ QCOMPARE(request.propertyNames(), QStringList());
+ QCOMPARE(spy.count(), 0);
+
+ request.setPropertyNames(propertyNames);
+ QCOMPARE(request.propertyNames(), propertyNames);
+ QCOMPARE(spy.count(), 1);
+
+ request.setPropertyNames(propertyNames);
+ QCOMPARE(request.propertyNames(), propertyNames);
+ QCOMPARE(spy.count(), 1);
+
+ request.setPropertyNames(QStringList());
+ QCOMPARE(request.propertyNames(), QStringList());
+ QCOMPARE(spy.count(), 2);
+}
+
+void tst_QGalleryTypeRequest::autoUpdate()
+{
+ QGalleryTypeRequest request;
+
+ QSignalSpy spy(&request, SIGNAL(autoUpdateChanged()));
+
+ QCOMPARE(request.autoUpdate(), false);
+
+ request.setAutoUpdate(false);
+ QCOMPARE(request.autoUpdate(), false);
+ QCOMPARE(spy.count(), 0);
+
+ request.setAutoUpdate(true);
+ QCOMPARE(request.autoUpdate(), true);
+ QCOMPARE(spy.count(), 1);
+
+ request.setAutoUpdate(true);
+ QCOMPARE(request.autoUpdate(), true);
+ QCOMPARE(spy.count(), 1);
+
+ request.setAutoUpdate(false);
+ QCOMPARE(request.autoUpdate(), false);
+ QCOMPARE(spy.count(), 2);
+}
+
+void tst_QGalleryTypeRequest::itemType()
+{
+ const QString itemType = QLatin1String("Audio");
+
+ QGalleryTypeRequest request;
+
+ QSignalSpy spy(&request, SIGNAL(itemTypeChanged()));
+
+ QCOMPARE(request.itemType(), QString());
+
+ request.setItemType(QString());
+ QCOMPARE(request.itemType(), QString());
+ QCOMPARE(spy.count(), 0);
+
+ request.setItemType(itemType);
+ QCOMPARE(request.itemType(), itemType);
+ QCOMPARE(spy.count(), 1);
+
+ request.setItemType(itemType);
+ QCOMPARE(request.itemType(), itemType);
+ QCOMPARE(spy.count(), 1);
+
+ request.setItemType(QString());
+ QCOMPARE(request.itemType(), QString());
+ QCOMPARE(spy.count(), 2);
+}
+
+void tst_QGalleryTypeRequest::executeSynchronous()
+{
+ QtTestGallery gallery;
+ gallery.setState(QGalleryAbstractRequest::Finished);
+ gallery.setCount(1);
+ gallery.setError(80, QString());
+
+ QGalleryTypeRequest request(&gallery);
+ QVERIFY(request.resultSet() == 0);
+
+ request.setPropertyNames(QStringList()
+ << QLatin1String("album")
+ << QLatin1String("trackNumber")
+ << QLatin1String("turtle"));
+
+ QSignalSpy resultSetSpy(&request, SIGNAL(resultSetChanged(QGalleryResultSet*)));
+ QSignalSpy typeChangedSpy(&request, SIGNAL(typeChanged()));
+ QSignalSpy metaDataSpy(&request, SIGNAL(metaDataChanged(QList<int>)));
+
+ request.execute();
+
+ QCOMPARE(request.error(), 80);
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Error);
+ QCOMPARE(resultSetSpy.count(), 0);
+ QVERIFY(qobject_cast<QtGalleryTestResponse *>(request.resultSet()) == 0);
+
+ gallery.setError(QGalleryAbstractRequest::NoError, QString());
+ request.execute();
+ QCOMPARE(request.error(), int(QGalleryAbstractRequest::NoError));
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Finished);
+ QCOMPARE(resultSetSpy.count(), 1);
+ QVERIFY(qobject_cast<QtGalleryTestResponse *>(request.resultSet()) != 0);
+ QCOMPARE(resultSetSpy.last().at(0).value<QGalleryResultSet*>(), request.resultSet());
+
+ QtGalleryTestResponse *resultSet = qobject_cast<QtGalleryTestResponse *>(
+ request.resultSet());
+ QVERIFY(resultSet != 0);
+
+ QCOMPARE(request.propertyKey(QLatin1String("title")), -1);
+ QCOMPARE(request.propertyKey(QLatin1String("album")), 0);
+ QCOMPARE(request.propertyKey(QLatin1String("trackNumber")), 1);
+ QCOMPARE(request.propertyKey(QLatin1String("turtle")), -1);
+
+ QCOMPARE(request.propertyAttributes(0), QGalleryProperty::CanRead | QGalleryProperty::CanWrite);
+ QCOMPARE(request.propertyType(0), QVariant::String);
+
+ const QList<int> propertyKeys = QList<int>()
+ << request.propertyKey(QLatin1String("album"))
+ << request.propertyKey(QLatin1String("trackNumber"));
+
+ QCOMPARE(typeChangedSpy.count(), 1);
+ QCOMPARE(metaDataSpy.count(), 1);
+ QCOMPARE(metaDataSpy.last().value(0).value<QList<int> >(), propertyKeys);
+
+ QCOMPARE(request.isValid(), true);
+ QCOMPARE(request.metaData(1), QVariant());
+ QCOMPARE(request.metaData(QLatin1String("trackNumber")), QVariant());
+ QCOMPARE(resultSet->setMetaData(1, 12), true);
+ QCOMPARE(request.metaData(1), QVariant(12));
+ QCOMPARE(request.metaData(QLatin1String("trackNumber")), QVariant(12));
+ QCOMPARE(metaDataSpy.count(), 2);
+
+ request.clear();
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Inactive);
+ QCOMPARE(resultSetSpy.count(), 2);
+ QVERIFY(request.resultSet() == 0);
+ QCOMPARE(resultSetSpy.last().at(0).value<QGalleryResultSet*>(), request.resultSet());
+ QCOMPARE(typeChangedSpy.count(), 2);
+ QCOMPARE(metaDataSpy.count(), 2);
+}
+
+void tst_QGalleryTypeRequest::executeAsynchronous()
+{
+ QtTestGallery gallery;
+ gallery.setState(QGalleryAbstractRequest::Active);
+
+ QGalleryTypeRequest request(&gallery);
+ QVERIFY(request.resultSet() == 0);
+
+ request.setPropertyNames(QStringList()
+ << QLatin1String("album")
+ << QLatin1String("trackNumber")
+ << QLatin1String("turtle"));
+
+ QSignalSpy resultSetSpy(&request, SIGNAL(resultSetChanged(QGalleryResultSet*)));
+ QSignalSpy typeChangedSpy(&request, SIGNAL(typeChanged()));
+ QSignalSpy metaDataSpy(&request, SIGNAL(metaDataChanged(QList<int>)));
+
+ request.execute();
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Active);
+ QCOMPARE(resultSetSpy.count(), 1);
+ QVERIFY(qobject_cast<QtGalleryTestResponse *>(request.resultSet()) != 0);
+ QCOMPARE(resultSetSpy.last().at(0).value<QGalleryResultSet*>(), request.resultSet());
+
+ QtGalleryTestResponse *resultSet = qobject_cast<QtGalleryTestResponse *>(
+ request.resultSet());
+ QVERIFY(resultSet != 0);
+
+ QCOMPARE(request.propertyKey(QLatin1String("title")), -1);
+ QCOMPARE(request.propertyKey(QLatin1String("album")), 0);
+ QCOMPARE(request.propertyKey(QLatin1String("trackNumber")), 1);
+ QCOMPARE(request.propertyKey(QLatin1String("turtle")), -1);
+
+ QCOMPARE(request.propertyAttributes(0), QGalleryProperty::CanRead | QGalleryProperty::CanWrite);
+ QCOMPARE(request.propertyType(0), QVariant::String);
+
+ const QList<int> propertyKeys = QList<int>()
+ << request.propertyKey(QLatin1String("album"))
+ << request.propertyKey(QLatin1String("trackNumber"));
+
+ QCOMPARE(typeChangedSpy.count(), 0);
+ QCOMPARE(metaDataSpy.count(), 0);
+
+ QCOMPARE(request.isValid(), false);
+ QCOMPARE(request.metaData(1), QVariant());
+
+ resultSet->setCount(1);
+ resultSet->itemsInserted(0, 1);
+
+ QCOMPARE(typeChangedSpy.count(), 1);
+ QCOMPARE(metaDataSpy.count(), 1);
+ QCOMPARE(metaDataSpy.last().value(0).value<QList<int> >(), propertyKeys);
+
+ QCOMPARE(request.isValid(), true);
+ QCOMPARE(request.metaData(1), QVariant());
+ QCOMPARE(request.metaData(QLatin1String("trackNumber")), QVariant());
+ QCOMPARE(resultSet->setMetaData(1, 12), true);
+ QCOMPARE(request.metaData(1), QVariant(12));
+ QCOMPARE(request.metaData(QLatin1String("trackNumber")), QVariant(12));
+ QCOMPARE(metaDataSpy.count(), 2);
+
+ resultSet->finish(false);
+
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Finished);
+ QCOMPARE(resultSetSpy.count(), 1);
+ QVERIFY(qobject_cast<QtGalleryTestResponse *>(request.resultSet()) != 0);
+
+ resultSet->setCount(0);
+ resultSet->itemsRemoved(0, 1);
+
+ QCOMPARE(typeChangedSpy.count(), 2);
+ QCOMPARE(metaDataSpy.count(), 3);
+ QCOMPARE(metaDataSpy.last().value(0).value<QList<int> >(), propertyKeys);
+
+ QCOMPARE(request.isValid(), false);
+ QCOMPARE(request.metaData(1), QVariant());
+ QCOMPARE(request.metaData(QLatin1String("trackNumber")), QVariant());
+
+
+ request.clear();
+ QCOMPARE(request.state(), QGalleryAbstractRequest::Inactive);
+ QCOMPARE(resultSetSpy.count(), 2);
+ QVERIFY(request.resultSet() == 0);
+ QCOMPARE(resultSetSpy.last().at(0).value<QGalleryResultSet*>(), request.resultSet());
+
+ QCOMPARE(typeChangedSpy.count(), 2);
+ QCOMPARE(metaDataSpy.count(), 3);
+}
+
+void tst_QGalleryTypeRequest::noResponse()
+{
+ QGalleryTypeRequest request;
+
+ QCOMPARE(request.propertyKey(QLatin1String("title")), -1);
+ QCOMPARE(request.propertyKey(QLatin1String("album")), -1);
+ QCOMPARE(request.propertyKey(QLatin1String("trackNumber")), -1);
+
+ QCOMPARE(request.propertyAttributes(0), QGalleryProperty::Attributes());
+ QCOMPARE(request.propertyType(0), QVariant::Invalid);
+
+ QCOMPARE(request.isValid(), false);
+ QCOMPARE(request.metaData(1), QVariant());
+ QCOMPARE(request.metaData(QLatin1String("title")), QVariant());
+}
+
+void tst_QGalleryTypeRequest::multipleResults()
+{
+ const QList<int> propertyKeys = QList<int>() << 2 << 15;
+
+ QtTestGallery gallery;
+ gallery.setCount(1);
+
+ QGalleryTypeRequest request(&gallery);
+
+ QSignalSpy typeChangedSpy(&request, SIGNAL(typeChanged()));
+ QSignalSpy metaDataSpy(&request, SIGNAL(metaDataChanged(QList<int>)));
+
+ request.execute();
+
+ QCOMPARE(request.isValid(), true);
+ QCOMPARE(typeChangedSpy.count(), 1);
+ QCOMPARE(metaDataSpy.count(), 0);
+
+ QtGalleryTestResponse *resultSet = qobject_cast<QtGalleryTestResponse *>(
+ request.resultSet());
+ QVERIFY(resultSet != 0);
+
+ resultSet->metaDataChanged(0, 1, propertyKeys);
+ QCOMPARE(metaDataSpy.count(), 1);
+ QCOMPARE(metaDataSpy.last().value(0).value<QList<int> >(), propertyKeys);
+
+ resultSet->setCount(3);
+ resultSet->itemsInserted(1, 2);
+
+ QCOMPARE(typeChangedSpy.count(), 1);
+ QCOMPARE(metaDataSpy.count(), 1);
+
+ resultSet->metaDataChanged(0, 1, propertyKeys);
+ QCOMPARE(metaDataSpy.count(), 2);
+ QCOMPARE(metaDataSpy.last().value(0).value<QList<int> >(), propertyKeys);
+
+ resultSet->metaDataChanged(1, 1, propertyKeys);
+ QCOMPARE(metaDataSpy.count(), 2);
+
+ resultSet->itemsMoved(0, 1, 1);
+ QCOMPARE(request.isValid(), true);
+ QCOMPARE(typeChangedSpy.count(), 2);
+ QCOMPARE(metaDataSpy.count(), 2);
+
+ resultSet->itemsMoved(2, 0, 1);
+ QCOMPARE(request.isValid(), true);
+ QCOMPARE(typeChangedSpy.count(), 3);
+ QCOMPARE(metaDataSpy.count(), 2);
+
+ resultSet->itemsMoved(1, 2, 1);
+ QCOMPARE(request.isValid(), true);
+ QCOMPARE(typeChangedSpy.count(), 3);
+ QCOMPARE(metaDataSpy.count(), 2);
+
+ resultSet->setCount(1);
+ resultSet->itemsRemoved(1, 1);
+
+ QCOMPARE(request.isValid(), true);
+ QCOMPARE(typeChangedSpy.count(), 3);
+ QCOMPARE(metaDataSpy.count(), 2);
+}
+
+QTEST_MAIN(tst_QGalleryTypeRequest)
+
+#include "tst_qgallerytyperequest.moc"
diff --git a/tests/tests.pro b/tests/tests.pro
new file mode 100644
index 0000000..157ef34
--- /dev/null
+++ b/tests/tests.pro
@@ -0,0 +1,2 @@
+TEMPLATE = subdirs
+SUBDIRS += auto