diff options
Diffstat (limited to 'tests/auto')
30 files changed, 16480 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(©Request, SIGNAL(galleryChanged())); + QSignalSpy moveGallerySpy(&moveRequest, SIGNAL(galleryChanged())); + QSignalSpy copySupportedSpy(©Request, 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(©Gallery); + moveRequest.setGallery(&moveGallery); + + QVERIFY(copyRequest.gallery() == ©Gallery); + 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(©Gallery); + moveRequest.setGallery(&moveGallery); + QVERIFY(copyRequest.gallery() == ©Gallery); + 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(©Gallery); + + QVERIFY(copyRequest.gallery() == &moveGallery); + QVERIFY(moveRequest.gallery() == ©Gallery); + 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" |