diff options
Diffstat (limited to 'src/tests')
| -rw-r--r-- | src/tests/CMakeLists.txt | 38 | ||||
| -rw-r--r-- | src/tests/kfileitemmodeltest.cpp | 222 | ||||
| -rw-r--r-- | src/tests/kstandarditemmodeltest.cpp | 113 | ||||
| -rw-r--r-- | src/tests/placesitemmodeltest.cpp | 939 | ||||
| -rw-r--r-- | src/tests/testdir.cpp | 4 |
5 files changed, 235 insertions, 1081 deletions
diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt index e9a0e2dce..64003850c 100644 --- a/src/tests/CMakeLists.txt +++ b/src/tests/CMakeLists.txt @@ -1,78 +1,68 @@ set( EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR} ) -find_package(Qt5Test CONFIG REQUIRED) +find_package(Qt${QT_MAJOR_VERSION}Test CONFIG REQUIRED) include(ECMAddTests) include(FindGem) # For servicemenutest, see bottom of this file # KItemSetTest -ecm_add_test(kitemsettest.cpp LINK_LIBRARIES dolphinprivate Qt5::Test) +ecm_add_test(kitemsettest.cpp LINK_LIBRARIES dolphinprivate Qt${QT_MAJOR_VERSION}::Test) # KItemRangeTest -ecm_add_test(kitemrangetest.cpp LINK_LIBRARIES dolphinprivate Qt5::Test) +ecm_add_test(kitemrangetest.cpp LINK_LIBRARIES dolphinprivate Qt${QT_MAJOR_VERSION}::Test) # KItemListSelectionManagerTest -ecm_add_test(kitemlistselectionmanagertest.cpp LINK_LIBRARIES dolphinprivate Qt5::Test) +ecm_add_test(kitemlistselectionmanagertest.cpp LINK_LIBRARIES dolphinprivate Qt${QT_MAJOR_VERSION}::Test) # KItemListControllerTest ecm_add_test(kitemlistcontrollertest.cpp testdir.cpp TEST_NAME kitemlistcontrollertest -LINK_LIBRARIES dolphinprivate Qt5::Test) +LINK_LIBRARIES dolphinprivate Qt${QT_MAJOR_VERSION}::Test) # KFileItemListViewTest ecm_add_test(kfileitemlistviewtest.cpp testdir.cpp TEST_NAME kfileitemlistviewtest -LINK_LIBRARIES dolphinprivate Qt5::Test) +LINK_LIBRARIES dolphinprivate Qt${QT_MAJOR_VERSION}::Test) # KFileItemModelTest ecm_add_test(kfileitemmodeltest.cpp testdir.cpp TEST_NAME kfileitemmodeltest -LINK_LIBRARIES dolphinprivate dolphinstatic Qt5::Test) +LINK_LIBRARIES dolphinprivate dolphinstatic Qt${QT_MAJOR_VERSION}::Test) # KFileItemModelBenchmark, not run automatically with `ctest` or `make test` add_executable(kfileitemmodelbenchmark kfileitemmodelbenchmark.cpp testdir.cpp) -target_link_libraries(kfileitemmodelbenchmark dolphinprivate Qt5::Test) +target_link_libraries(kfileitemmodelbenchmark dolphinprivate Qt${QT_MAJOR_VERSION}::Test) # KItemListKeyboardSearchManagerTest -ecm_add_test(kitemlistkeyboardsearchmanagertest.cpp LINK_LIBRARIES dolphinprivate Qt5::Test) +ecm_add_test(kitemlistkeyboardsearchmanagertest.cpp LINK_LIBRARIES dolphinprivate Qt${QT_MAJOR_VERSION}::Test) # DolphinSearchBox if (KF5Baloo_FOUND) ecm_add_test(dolphinsearchboxtest.cpp TEST_NAME dolphinsearchboxtest - LINK_LIBRARIES dolphinprivate dolphinstatic Qt5::Test) + LINK_LIBRARIES dolphinprivate dolphinstatic Qt${QT_MAJOR_VERSION}::Test) endif() # DolphinQuery if (KF5Baloo_FOUND) ecm_add_test(dolphinquerytest.cpp TEST_NAME dolphinquerytest - LINK_LIBRARIES dolphinprivate dolphinstatic Qt5::Test) + LINK_LIBRARIES dolphinprivate dolphinstatic Qt${QT_MAJOR_VERSION}::Test) endif() -# KStandardItemModelTest -ecm_add_test(kstandarditemmodeltest.cpp -TEST_NAME kstandarditemmodeltest -LINK_LIBRARIES dolphinprivate dolphinstatic Qt5::Test) - # ViewPropertiesTest ecm_add_test(viewpropertiestest.cpp testdir.cpp TEST_NAME viewpropertiestest -LINK_LIBRARIES dolphinprivate dolphinstatic Qt5::Test) +LINK_LIBRARIES dolphinprivate dolphinstatic Qt${QT_MAJOR_VERSION}::Test) # DolphinMainWindowTest ecm_add_test(dolphinmainwindowtest.cpp ${CMAKE_SOURCE_DIR}/src/dolphin.qrc TEST_NAME dolphinmainwindowtest -LINK_LIBRARIES dolphinprivate dolphinstatic Qt5::Test) +LINK_LIBRARIES dolphinprivate dolphinstatic Qt${QT_MAJOR_VERSION}::Test) # DragAndDropHelperTest -ecm_add_test(draganddrophelpertest.cpp LINK_LIBRARIES dolphinprivate Qt5::Test) - -# PlacesItemModelTest -ecm_add_test(placesitemmodeltest.cpp -TEST_NAME placesitemmodeltest -LINK_LIBRARIES dolphinprivate dolphinstatic Qt5::Test) +ecm_add_test(draganddrophelpertest.cpp LINK_LIBRARIES dolphinprivate Qt${QT_MAJOR_VERSION}::Test) find_gem(test-unit) set_package_properties(Gem:test-unit PROPERTIES diff --git a/src/tests/kfileitemmodeltest.cpp b/src/tests/kfileitemmodeltest.cpp index 7a22a1a7f..679b8ab3a 100644 --- a/src/tests/kfileitemmodeltest.cpp +++ b/src/tests/kfileitemmodeltest.cpp @@ -73,6 +73,10 @@ private Q_SLOTS: void testNameFilter(); void testEmptyPath(); void testRefreshExpandedItem(); + void testAddItemToFilteredExpandedFolder(); + void testDeleteItemsWithExpandedFolderWithFilter(); + void testRefreshItemsWithFilter(); + void testRefreshExpandedFolderWithFilter(); void testRemoveHiddenItems(); void collapseParentOfHiddenItems(); void removeParentOfHiddenItems(); @@ -516,7 +520,7 @@ void KFileItemModelTest::testExpandItems() // Test expanding subfolders in a folder with the items "a/", "a/a/", "a/a/1", "a/a-1/", "a/a-1/1". // Besides testing the basic item expansion functionality, the test makes sure that // KFileItemModel::expansionLevelsCompare(const KFileItem& a, const KFileItem& b) - // yields the correct result for "a/a/1" and "a/a-1/", whis is non-trivial because they share the + // yields the correct result for "a/a/1" and "a/a-1/", which is non-trivial because they share the // first three characters. QSet<QByteArray> originalModelRoles = m_model->roles(); QSet<QByteArray> modelRoles = originalModelRoles; @@ -1144,6 +1148,219 @@ void KFileItemModelTest::testRefreshExpandedItem() } /** + * Verifies that adding an item to an expanded folder that's filtered makes the parental chain visible. + */ +void KFileItemModelTest::testAddItemToFilteredExpandedFolder() +{ + QSignalSpy itemsInsertedSpy(m_model, &KFileItemModel::itemsInserted); + QSignalSpy fileItemsChangedSpy(m_model, &KFileItemModel::fileItemsChanged); + + QSet<QByteArray> modelRoles = m_model->roles(); + modelRoles << "isExpanded" << "isExpandable" << "expandedParentsCount"; + m_model->setRoles(modelRoles); + + m_testDir->createFile("a/b/file"); + + m_model->loadDirectory(m_testDir->url()); + QVERIFY(itemsInsertedSpy.wait()); + QCOMPARE(m_model->count(), 1); // "a + + // Expand "a/". + m_model->setExpanded(0, true); + QVERIFY(itemsInsertedSpy.wait()); + + // Expand "a/b/". + m_model->setExpanded(1, true); + QVERIFY(itemsInsertedSpy.wait()); + + QCOMPARE(m_model->count(), 3); // 3 items: "a/", "a/b/", "a/b/file" + + const QUrl urlB = m_model->fileItem(1).url(); + + // Set a filter that matches ".txt" extension + m_model->setNameFilter("*.txt"); + QCOMPARE(m_model->count(), 0); // Everything got hidden since we don't have a .txt file yet + + m_model->slotItemsAdded(urlB, KFileItemList() << KFileItem(QUrl("a/b/newItem.txt"))); + m_model->slotCompleted(); + + // Entire parental chain should now be shown + QCOMPARE(m_model->count(), 3); // 3 items: "a/", "a/b/", "a/b/newItem.txt" + QCOMPARE(itemsInModel(), QStringList() << "a" << "b" << "newItem.txt"); + + // Items should be indented in hierarchy + QCOMPARE(m_model->expandedParentsCount(0), 0); + QCOMPARE(m_model->expandedParentsCount(1), 1); + QCOMPARE(m_model->expandedParentsCount(2), 2); +} + +/** + * Verifies that deleting the last filter-passing child from expanded folders + * makes the parental chain hidden. + */ +void KFileItemModelTest::testDeleteItemsWithExpandedFolderWithFilter() +{ + QSignalSpy itemsInsertedSpy(m_model, &KFileItemModel::itemsInserted); + QSignalSpy itemsRemovedSpy(m_model, &KFileItemModel::itemsRemoved); + + QSet<QByteArray> modelRoles = m_model->roles(); + modelRoles << "isExpanded" << "isExpandable" << "expandedParentsCount"; + m_model->setRoles(modelRoles); + + m_testDir->createFile("a/b/file"); + + m_model->loadDirectory(m_testDir->url()); + QVERIFY(itemsInsertedSpy.wait()); + QCOMPARE(m_model->count(), 1); // "a + + // Expand "a/". + m_model->setExpanded(0, true); + QVERIFY(itemsInsertedSpy.wait()); + + // Expand "a/b/". + m_model->setExpanded(1, true); + QVERIFY(itemsInsertedSpy.wait()); + + QCOMPARE(m_model->count(), 3); // 3 items: "a/", "a/b/", "a/b/file" + + // Set a filter that matches "file" extension + m_model->setNameFilter("file"); + QCOMPARE(m_model->count(), 3); // Everything is still shown + + // Delete "file" + QCOMPARE(itemsRemovedSpy.count(), 0); + m_model->slotItemsDeleted(KFileItemList() << m_model->fileItem(2)); + QCOMPARE(itemsRemovedSpy.count(), 1); + + // Entire parental chain should now be filtered + QCOMPARE(m_model->count(), 0); + QCOMPARE(m_model->m_filteredItems.size(), 2); +} + +/** + * Verifies that the fileItemsChanged signal is raised with the correct index after renaming files with filter set. + * The rename operation will cause one item to be filtered out and another item to be reordered. + */ +void KFileItemModelTest::testRefreshItemsWithFilter() +{ + QSignalSpy itemsInsertedSpy(m_model, &KFileItemModel::itemsInserted); + QSignalSpy itemsRemovedSpy(m_model, &KFileItemModel::itemsRemoved); + QSignalSpy itemsChangedSpy(m_model, &KFileItemModel::itemsChanged); + QSignalSpy itemsMovedSpy(m_model, &KFileItemModel::itemsMoved); + + // Creates three .txt files + m_testDir->createFiles({"b.txt", "c.txt", "d.txt"}); + + m_model->loadDirectory(m_testDir->url()); + QVERIFY(itemsInsertedSpy.wait()); + + QCOMPARE(m_model->count(), 3); // "b.txt", "c.txt", "d.txt" + + // Set a filter that matches ".txt" extension + m_model->setNameFilter("*.txt"); + QCOMPARE(m_model->count(), 3); // Still all items are shown + QCOMPARE(itemsInModel(), QStringList() << "b.txt" << "c.txt" << "d.txt"); + + // Objects used to rename + const KFileItem fileItemC_txt = m_model->fileItem(1); + KFileItem fileItemC_cfg = fileItemC_txt; + fileItemC_cfg.setUrl(QUrl("c.cfg")); + + const KFileItem fileItemD_txt = m_model->fileItem(2); + KFileItem fileItemA_txt = fileItemD_txt; + fileItemA_txt.setUrl(QUrl("a.txt")); + + // Rename "c.txt" to "c.cfg"; and rename "d.txt" to "a.txt" + QCOMPARE(itemsRemovedSpy.count(), 0); + QCOMPARE(itemsChangedSpy.count(), 0); + m_model->slotRefreshItems({qMakePair(fileItemC_txt, fileItemC_cfg), qMakePair(fileItemD_txt, fileItemA_txt)}); + QCOMPARE(itemsRemovedSpy.count(), 1); + QCOMPARE(itemsChangedSpy.count(), 1); + QCOMPARE(m_model->count(), 2); // Only "a.txt" and "b.txt". "c.cfg" got filtered out + + QList<QVariant> arguments = itemsChangedSpy.takeLast(); + KItemRangeList itemRangeList = arguments.at(0).value<KItemRangeList>(); + + // We started with the order "b.txt", "c.txt", "d.txt" + // "d.txt" started with index "2" + // "c.txt" got renamed and got filtered out + // "d.txt" index shifted from index "2" to "1" + // So we expect index "1" in this argument, meaning "d.txt" was renamed + QCOMPARE(itemRangeList, KItemRangeList() << KItemRange(1, 1)); + + // Re-sorting is done asynchronously: + QCOMPARE(itemsInModel(), QStringList() << "b.txt" << "a.txt"); // Files should still be in the incorrect order + QVERIFY(itemsMovedSpy.wait()); + QCOMPARE(itemsInModel(), QStringList() << "a.txt" << "b.txt"); // Files were re-sorted and should now be in the correct order +} + + +/** + * Verifies that parental chains are hidden and shown as needed while their children get filtered/unfiltered due to renaming. + * Also verifies that the "isExpanded" and "expandedParentsCount" values are kept for expanded folders that get refreshed. + */ +void KFileItemModelTest::testRefreshExpandedFolderWithFilter() { + QSignalSpy itemsInsertedSpy(m_model, &KFileItemModel::itemsInserted); + QSignalSpy itemsRemovedSpy(m_model, &KFileItemModel::itemsRemoved); + + QSet<QByteArray> modelRoles = m_model->roles(); + modelRoles << "isExpanded" << "isExpandable" << "expandedParentsCount"; + m_model->setRoles(modelRoles); + + m_testDir->createFile("a/b/someFolder/someFile"); + + m_model->loadDirectory(m_testDir->url()); + QVERIFY(itemsInsertedSpy.wait()); + + QCOMPARE(m_model->count(), 1); // Only "a/" + + // Expand "a/". + m_model->setExpanded(0, true); + QVERIFY(itemsInsertedSpy.wait()); + + // Expand "a/b/". + m_model->setExpanded(1, true); + QVERIFY(itemsInsertedSpy.wait()); + + // Expand "a/b/someFolder/". + m_model->setExpanded(2, true); + QVERIFY(itemsInsertedSpy.wait()); + QCOMPARE(m_model->count(), 4); // 4 items: "a/", "a/b/", "a/b/someFolder", "a/b/someFolder/someFile" + + // Set a filter that matches the expanded folder "someFolder" + m_model->setNameFilter("someFolder"); + QCOMPARE(m_model->count(), 3); // 3 items: "a/", "a/b/", "a/b/someFolder" + + // Objects used to rename + const KFileItem fileItemA = m_model->fileItem(0); + KFileItem fileItemARenamed = fileItemA; + fileItemARenamed.setUrl(QUrl("a_renamed")); + + const KFileItem fileItemSomeFolder = m_model->fileItem(2); + KFileItem fileItemRenamedFolder = fileItemSomeFolder; + fileItemRenamedFolder.setUrl(QUrl("/a_renamed/b/renamedFolder")); + + // Rename "a" to "a_renamed" + // This way we test if the algorithm is sane as to NOT hide "a_renamed" since it will have visible children + m_model->slotRefreshItems({qMakePair(fileItemA, fileItemARenamed)}); + QCOMPARE(m_model->count(), 3); // Entire parental chain must still be shown + QCOMPARE(itemsInModel(), QStringList() << "a_renamed" << "b" << "someFolder"); + + // Rename "a_renamed" back to "a"; and "someFolder" to "renamedFolder" + m_model->slotRefreshItems({qMakePair(fileItemARenamed, fileItemA), qMakePair(fileItemSomeFolder, fileItemRenamedFolder)}); + QCOMPARE(m_model->count(), 0); // Entire parental chain became hidden + + // Rename "renamedFolder" back to "someFolder". Filter is passing again + m_model->slotRefreshItems({qMakePair(fileItemRenamedFolder, fileItemSomeFolder)}); + QCOMPARE(m_model->count(), 3); // Entire parental chain is shown again + QCOMPARE(itemsInModel(), QStringList() << "a" << "b" << "someFolder"); + + // slotRefreshItems() should preserve "isExpanded" and "expandedParentsCount" values explicitly in this case + QCOMPARE(m_model->m_itemData.at(2)->values.value("isExpanded").toBool(), true); + QCOMPARE(m_model->m_itemData.at(2)->values.value("expandedParentsCount"), 2); +} + +/** * Verify that removing hidden files and folders from the model does not * result in a crash, see https://bugs.kde.org/show_bug.cgi?id=314046 */ @@ -1298,8 +1515,7 @@ void KFileItemModelTest::removeParentOfHiddenItems() // Simulate the deletion of the directory "a/b/". m_model->slotItemsDeleted(KFileItemList() << m_model->fileItem(1)); QCOMPARE(itemsRemovedSpy.count(), 2); - QCOMPARE(m_model->count(), 1); - QCOMPARE(itemsInModel(), QStringList() << "a"); + QCOMPARE(m_model->count(), 0); // "a" will be filtered out since it doesn't pass the filter and doesn't have visible children // Remove the filter -> only the file "a/1" should appear. m_model->setNameFilter(QString()); diff --git a/src/tests/kstandarditemmodeltest.cpp b/src/tests/kstandarditemmodeltest.cpp deleted file mode 100644 index 943a85214..000000000 --- a/src/tests/kstandarditemmodeltest.cpp +++ /dev/null @@ -1,113 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2011 Peter Penz <[email protected]> - * SPDX-FileCopyrightText: 2011 Frank Reininghaus <[email protected]> - * - * SPDX-License-Identifier: GPL-2.0-or-later - */ - -#include "dolphindebug.h" - -#include "kitemviews/kstandarditem.h" -#include "kitemviews/kstandarditemmodel.h" - -#include <QStandardPaths> -#include <QTest> - -class KStandardItemModelTest : public QObject -{ - Q_OBJECT - -private Q_SLOTS: - void initTestCase(); - void init(); - void cleanup(); - - void testNewItems(); - void testRemoveItems(); - -private: - bool isModelConsistent() const; - -private: - KStandardItemModel* m_model; -}; - -void KStandardItemModelTest::initTestCase() -{ - QStandardPaths::setTestModeEnabled(true); -} - -void KStandardItemModelTest::init() -{ - m_model = new KStandardItemModel(); -} - -void KStandardItemModelTest::cleanup() -{ - delete m_model; - m_model = nullptr; -} - -void KStandardItemModelTest::testNewItems() -{ - m_model->insertItem(0, new KStandardItem("item 1")); - m_model->insertItem(0, new KStandardItem("item 2")); - m_model->insertItem(2, new KStandardItem("item 3")); - m_model->appendItem(new KStandardItem("item 4")); - m_model->insertItem(-1, new KStandardItem("invalid 1")); - m_model->insertItem(5, new KStandardItem("invalid 2")); - QCOMPARE(m_model->count(), 4); - QCOMPARE(m_model->item(0)->text(), QString("item 2")); - QCOMPARE(m_model->item(1)->text(), QString("item 1")); - QCOMPARE(m_model->item(2)->text(), QString("item 3")); - QCOMPARE(m_model->item(3)->text(), QString("item 4")); - - QVERIFY(isModelConsistent()); -} - -void KStandardItemModelTest::testRemoveItems() -{ - for (int i = 1; i <= 10; ++i) { - m_model->appendItem(new KStandardItem("item " + QString::number(i))); - } - - m_model->removeItem(0); - m_model->removeItem(3); - m_model->removeItem(5); - m_model->removeItem(-1); - QCOMPARE(m_model->count(), 7); - QCOMPARE(m_model->item(0)->text(), QString("item 2")); - QCOMPARE(m_model->item(1)->text(), QString("item 3")); - QCOMPARE(m_model->item(2)->text(), QString("item 4")); - QCOMPARE(m_model->item(3)->text(), QString("item 6")); - QCOMPARE(m_model->item(4)->text(), QString("item 7")); - QCOMPARE(m_model->item(5)->text(), QString("item 9")); - QCOMPARE(m_model->item(6)->text(), QString("item 10")); -} - -bool KStandardItemModelTest::isModelConsistent() const -{ - if (m_model->m_items.count() != m_model->m_indexesForItems.count()) { - return false; - } - - for (int i = 0; i < m_model->count(); ++i) { - const KStandardItem* item = m_model->item(i); - if (!item) { - qCWarning(DolphinDebug) << "Item" << i << "is null"; - return false; - } - - const int itemIndex = m_model->index(item); - if (itemIndex != i) { - qCWarning(DolphinDebug) << "Item" << i << "has a wrong index:" << itemIndex; - return false; - } - } - - return true; -} - -QTEST_GUILESS_MAIN(KStandardItemModelTest) - -#include "kstandarditemmodeltest.moc" diff --git a/src/tests/placesitemmodeltest.cpp b/src/tests/placesitemmodeltest.cpp deleted file mode 100644 index 15a494691..000000000 --- a/src/tests/placesitemmodeltest.cpp +++ /dev/null @@ -1,939 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2017 Renato Araujo Oliveira <[email protected]> - * - * SPDX-License-Identifier: GPL-2.0-or-later - */ - -#include <QTest> -#include <QSignalSpy> -#include <QStandardPaths> -#include <QAction> -#include <QDBusInterface> - -#include <KBookmarkManager> -#include <KConfig> -#include <KConfigGroup> -#include <KAboutData> -#include <KFilePlacesModel> -#include <KProtocolInfo> - -#include "dolphin_generalsettings.h" -#include "panels/places/placesitemmodel.h" -#include "panels/places/placesitem.h" -#include "views/viewproperties.h" - -Q_DECLARE_METATYPE(KItemRangeList) -Q_DECLARE_METATYPE(KItemRange) - -static QString bookmarksFile() -{ - return QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + "/user-places.xbel"; -} - -class PlacesItemModelTest : public QObject -{ - Q_OBJECT - -private Q_SLOTS: - void init(); - void cleanup(); - - void initTestCase(); - void cleanupTestCase(); - - void testModelSort(); - void testGroups(); - void testDeletePlace(); - void testPlaceItem_data(); - void testPlaceItem(); - void testTearDownDevice(); - void testDefaultViewProperties_data(); - void testDefaultViewProperties(); - void testClear(); - void testHideItem(); - void testSystemItems(); - void testEditBookmark(); - void testEditAfterCreation(); - void testEditMetadata(); - void testRefresh(); - void testIcons_data(); - void testIcons(); - void testDragAndDrop(); - void testHideDevices(); - void testDuplicatedEntries(); - void renameAfterCreation(); - -private: - PlacesItemModel* m_model; - QSet<int> m_tobeRemoved; - QMap<QString, QDBusInterface *> m_interfacesMap; - int m_expectedModelCount = 14; - bool m_hasDesktopFolder = false; - bool m_hasDocumentsFolder = false; - bool m_hasDownloadsFolder = false; - bool m_hasMusicFolder = false; - bool m_hasPicturesFolder = false; - bool m_hasVideosFolder = false; - - void setBalooEnabled(bool enabled); - int indexOf(const QUrl &url); - QDBusInterface *fakeManager(); - QDBusInterface *fakeDevice(const QString &udi); - QStringList placesUrls(PlacesItemModel *model = nullptr) const; - QStringList initialUrls() const; - void createPlaceItem(const QString &text, const QUrl &url, const QString &icon); - void schedulePlaceRemoval(int index); - void cancelPlaceRemoval(int index); - QMimeData *createMimeData(const QList<int> &indexes) const; - void increaseIndexIfNeeded(int &index) const; - QTemporaryDir m_tempHomeDir; -}; - -#define CHECK_PLACES_URLS(urls) \ - { \ - QStringList places = placesUrls(); \ - if (places != urls) { \ - qWarning() << "Expected:" << urls; \ - qWarning() << "Got:" << places; \ - QCOMPARE(places, urls); \ - } \ - } - -void PlacesItemModelTest::setBalooEnabled(bool enabled) -{ - KConfig config(QStringLiteral("baloofilerc")); - KConfigGroup basicSettings = config.group("Basic Settings"); - basicSettings.writeEntry("Indexing-Enabled", enabled); - config.sync(); -} - -int PlacesItemModelTest::indexOf(const QUrl &url) -{ - for (int r = 0; r < m_model->count(); r++) { - if (m_model->placesItem(r)->url() == url) { - return r; - } - } - return -1; -} - -QDBusInterface *PlacesItemModelTest::fakeManager() -{ - return fakeDevice(QStringLiteral("/org/kde/solid/fakehw")); -} - -QDBusInterface *PlacesItemModelTest::fakeDevice(const QString &udi) -{ - if (m_interfacesMap.contains(udi)) { - return m_interfacesMap[udi]; - } - - QDBusInterface *iface = new QDBusInterface(QDBusConnection::sessionBus().baseService(), udi); - m_interfacesMap[udi] = iface; - - return iface; -} - -QStringList PlacesItemModelTest::placesUrls(PlacesItemModel *model) const -{ - QStringList urls; - if (!model) { - model = m_model; - } - - for (int row = 0; row < model->count(); ++row) { - urls << model->placesItem(row)->url().toDisplayString(QUrl::PreferLocalFile); - } - return urls; -} - -QStringList PlacesItemModelTest::initialUrls() const -{ - static QStringList urls; - if (urls.isEmpty()) { - urls << QDir::homePath(); - - if (m_hasDesktopFolder) { - urls << QDir::homePath() + QStringLiteral("/Desktop"); - } - - if (m_hasDocumentsFolder) { - urls << QDir::homePath() + QStringLiteral("/Documents"); - } - - if (m_hasDownloadsFolder) { - urls << QDir::homePath() + QStringLiteral("/Downloads"); - } - - if (m_hasMusicFolder) { - urls << QDir::homePath() + QStringLiteral("/Music"); - } - - if (m_hasPicturesFolder) { - urls << QDir::homePath() + QStringLiteral("/Pictures"); - } - - if (m_hasVideosFolder) { - urls << QDir::homePath() + QStringLiteral("/Videos"); - } - - urls << QStringLiteral("trash:/") - << QStringLiteral("remote:/") - << QStringLiteral("/media/nfs"); - - if (qEnvironmentVariableIsSet("KDE_FULL_SESSION") && KProtocolInfo::isKnownProtocol(QStringLiteral("recentlyused"))) { - urls << QStringLiteral("recentlyused:/files"); - urls << QStringLiteral("recentlyused:/locations"); - } else { - urls << QStringLiteral("timeline:/today") - << QStringLiteral("timeline:/yesterday"); - } - - urls << QStringLiteral("search:/documents") << QStringLiteral("search:/images") << QStringLiteral("search:/audio") << QStringLiteral("search:/videos") - << QStringLiteral("/foreign") - << QStringLiteral("/media/floppy0") << QStringLiteral("/media/XO-Y4") << QStringLiteral("/media/cdrom"); - } - return urls; -} - -void PlacesItemModelTest::createPlaceItem(const QString &text, const QUrl &url, const QString &icon) -{ - m_model->createPlacesItem(text, url, icon); -} - -void PlacesItemModelTest::schedulePlaceRemoval(int index) -{ - m_tobeRemoved.insert(index); -} - -void PlacesItemModelTest::cancelPlaceRemoval(int index) -{ - m_tobeRemoved.remove(index); -} - -QMimeData *PlacesItemModelTest::createMimeData(const QList<int> &indexes) const -{ - QByteArray itemData; - QDataStream stream(&itemData, QIODevice::WriteOnly); - QList<QUrl> urls; - - for (int index : indexes) { - const QUrl itemUrl = m_model->placesItem(index)->url(); - if (itemUrl.isValid()) { - urls << itemUrl; - } - stream << index; - } - - QMimeData* mimeData = new QMimeData(); - mimeData->setUrls(urls); - // copied from PlacesItemModel::internalMimeType() - const QString internalMimeType = "application/x-dolphinplacesmodel-" + - QString::number((qptrdiff)m_model); - mimeData->setData(internalMimeType, itemData); - return mimeData; -} - -void PlacesItemModelTest::increaseIndexIfNeeded(int &index) const -{ - if (m_hasDesktopFolder) { - index++; - } - if (m_hasDocumentsFolder) { - index++; - } - if (m_hasDownloadsFolder) { - index++; - } - if (m_hasMusicFolder) { - index++; - } - if (m_hasPicturesFolder) { - index++; - } - if (m_hasVideosFolder) { - index++; - } -} - -void PlacesItemModelTest::init() -{ - m_model = new PlacesItemModel(); - // WORKAROUND: need to wait for bookmark to load - QTest::qWait(300); - QCOMPARE(m_model->count(), m_expectedModelCount); -} - -void PlacesItemModelTest::cleanup() -{ - const auto tobeRemoved = m_tobeRemoved; - for (const int i : tobeRemoved) { - int before = m_model->count(); - m_model->deleteItem(i); - QTRY_COMPARE(m_model->count(), before - 1); - } - m_tobeRemoved.clear(); - delete m_model; - m_model = nullptr; -} - -void PlacesItemModelTest::initTestCase() -{ - QVERIFY(m_tempHomeDir.isValid()); - QVERIFY(qputenv("HOME", m_tempHomeDir.path().toUtf8())); - QVERIFY(qputenv("KDE_FORK_SLAVES", "yes")); - - QStandardPaths::setTestModeEnabled(true); - - const QString fakeHw = QFINDTESTDATA("data/fakecomputer.xml"); - QVERIFY(!fakeHw.isEmpty()); - qputenv("SOLID_FAKEHW", QFile::encodeName(fakeHw)); - - setBalooEnabled(true); - const QString bookmarsFileName = bookmarksFile(); - if (QFileInfo::exists(bookmarsFileName)) { - // Ensure we'll have a clean bookmark file to start - QVERIFY(QFile::remove(bookmarsFileName)); - } - - if (QDir(QStandardPaths::writableLocation(QStandardPaths::DesktopLocation)).exists()) { - m_hasDesktopFolder = true; - m_expectedModelCount++; - } - - if (QDir(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)).exists()) { - m_hasDocumentsFolder = true; - m_expectedModelCount++; - } - - if (QDir(QStandardPaths::writableLocation(QStandardPaths::DownloadLocation)).exists()) { - m_hasDownloadsFolder = true; - m_expectedModelCount++; - } - - if (QDir(QStandardPaths::writableLocation(QStandardPaths::MusicLocation)).exists()) { - m_hasMusicFolder = true; - m_expectedModelCount++; - } - - if (QDir(QStandardPaths::writableLocation(QStandardPaths::PicturesLocation)).exists()) { - m_hasPicturesFolder = true; - m_expectedModelCount++; - } - - if (QDir(QStandardPaths::writableLocation(QStandardPaths::MoviesLocation)).exists()) { - m_hasVideosFolder = true; - m_expectedModelCount++; - } - - qRegisterMetaType<KItemRangeList>(); - qRegisterMetaType<KItemRange>(); -} - -void PlacesItemModelTest::cleanupTestCase() -{ - qDeleteAll(m_interfacesMap); - QFile::remove(bookmarksFile()); -} - -void PlacesItemModelTest::testModelSort() -{ - CHECK_PLACES_URLS(initialUrls()); -} - -void PlacesItemModelTest::testGroups() -{ - const auto groups = m_model->groups(); - int expectedRemoteIndex = 2; - increaseIndexIfNeeded(expectedRemoteIndex); - - QCOMPARE(groups.size(), 6); - - QCOMPARE(groups.at(0).first, 0); - QCOMPARE(groups.at(0).second.toString(), QStringLiteral("Places")); - - QCOMPARE(groups.at(1).first, expectedRemoteIndex); - QCOMPARE(groups.at(1).second.toString(), QStringLiteral("Remote")); - - QCOMPARE(groups.at(2).first, expectedRemoteIndex + 2); - QCOMPARE(groups.at(2).second.toString(), QStringLiteral("Recent")); - - QCOMPARE(groups.at(3).first, expectedRemoteIndex + 4); - QCOMPARE(groups.at(3).second.toString(), QStringLiteral("Search For")); - - QCOMPARE(groups.at(4).first, expectedRemoteIndex + 8); - QCOMPARE(groups.at(4).second.toString(), QStringLiteral("Devices")); - - QCOMPARE(groups.at(5).first, expectedRemoteIndex + 9); - QCOMPARE(groups.at(5).second.toString(), QStringLiteral("Removable Devices")); -} - -void PlacesItemModelTest::testPlaceItem_data() -{ - QTest::addColumn<QUrl>("url"); - QTest::addColumn<bool>("expectedIsHidden"); - QTest::addColumn<bool>("expectedIsSystemItem"); - QTest::addColumn<QString>("expectedGroup"); - QTest::addColumn<bool>("expectedStorageSetupNeeded"); - - // places - QTest::newRow("Places - Home") << QUrl::fromLocalFile(QDir::homePath()) << false << true << QStringLiteral("Places") << false; - - // baloo -search - QTest::newRow("Baloo - Documents") << QUrl("search:/documents") << false << true << QStringLiteral("Search For") << false; - - // devices - QTest::newRow("Devices - Floppy") << QUrl("file:///media/floppy0") << false << false << QStringLiteral("Removable Devices") << false; -} - -void PlacesItemModelTest::testPlaceItem() -{ - QFETCH(QUrl, url); - QFETCH(bool, expectedIsHidden); - QFETCH(bool, expectedIsSystemItem); - QFETCH(QString, expectedGroup); - QFETCH(bool, expectedStorageSetupNeeded); - - const int index = indexOf(url); - PlacesItem *item = m_model->placesItem(index); - QCOMPARE(item->url(), url); - QCOMPARE(item->isHidden(), expectedIsHidden); - QCOMPARE(item->isSystemItem(), expectedIsSystemItem); - QCOMPARE(item->group(), expectedGroup); - QCOMPARE(item->storageSetupNeeded(), expectedStorageSetupNeeded); -} - -void PlacesItemModelTest::testDeletePlace() -{ - const QUrl tempUrl = QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::TempLocation)); - QStringList urls = initialUrls(); - QSignalSpy itemsInsertedSpy(m_model, &PlacesItemModel::itemsInserted); - QSignalSpy itemsRemovedSpy(m_model, &PlacesItemModel::itemsRemoved); - - PlacesItemModel *model = new PlacesItemModel(); - - int tempDirIndex = 2; - increaseIndexIfNeeded(tempDirIndex); - - // create a new place - createPlaceItem(QStringLiteral("Temporary Dir"), tempUrl, QString()); - urls.insert(tempDirIndex, tempUrl.toLocalFile()); - - // check if the new entry was created - QTRY_COMPARE(itemsInsertedSpy.count(), 1); - CHECK_PLACES_URLS(urls); - QTRY_COMPARE(model->count(), m_model->count()); - - // delete item - m_model->deleteItem(tempDirIndex); - - // make sure that the new item is removed - QTRY_COMPARE(itemsRemovedSpy.count(), 1); - QTRY_COMPARE(m_model->count(), m_expectedModelCount); - CHECK_PLACES_URLS(initialUrls()); - QTRY_COMPARE(model->count(), m_model->count()); -} - -void PlacesItemModelTest::testTearDownDevice() -{ - const QUrl mediaUrl = QUrl::fromLocalFile(QStringLiteral("/media/XO-Y4")); - int index = indexOf(mediaUrl); - QVERIFY(index != -1); - - auto ejectAction = m_model->ejectAction(index); - QVERIFY(!ejectAction); - - auto teardownAction = m_model->teardownAction(index); - QVERIFY(teardownAction); - - QCOMPARE(m_model->count(), m_expectedModelCount); - - QSignalSpy spyItemsRemoved(m_model, &PlacesItemModel::itemsRemoved); - fakeManager()->call(QStringLiteral("unplug"), "/org/kde/solid/fakehw/volume_part1_size_993284096"); - QTRY_COMPARE(m_model->count(), m_expectedModelCount - 1); - QCOMPARE(spyItemsRemoved.count(), 1); - const QList<QVariant> spyItemsRemovedArgs = spyItemsRemoved.takeFirst(); - const KItemRangeList removedRange = spyItemsRemovedArgs.at(0).value<KItemRangeList>(); - QCOMPARE(removedRange.size(), 1); - QCOMPARE(removedRange.first().index, index); - QCOMPARE(removedRange.first().count, 1); - - QCOMPARE(indexOf(mediaUrl), -1); - - QSignalSpy spyItemsInserted(m_model, &PlacesItemModel::itemsInserted); - fakeManager()->call(QStringLiteral("plug"), "/org/kde/solid/fakehw/volume_part1_size_993284096"); - QTRY_COMPARE(m_model->count(), m_expectedModelCount); - QCOMPARE(spyItemsInserted.count(), 1); - index = indexOf(mediaUrl); - - const QList<QVariant> args = spyItemsInserted.takeFirst(); - const KItemRangeList insertedRange = args.at(0).value<KItemRangeList>(); - QCOMPARE(insertedRange.size(), 1); - QCOMPARE(insertedRange.first().index, index); - QCOMPARE(insertedRange.first().count, 1); -} - -void PlacesItemModelTest::testDefaultViewProperties_data() -{ - QTest::addColumn<QUrl>("url"); - QTest::addColumn<DolphinView::Mode>("expectedViewMode"); - QTest::addColumn<bool>("expectedPreviewShow"); - QTest::addColumn<QList<QByteArray> >("expectedVisibleRole"); - - // places - QTest::newRow("Places - Home") << QUrl::fromLocalFile(QDir::homePath()) << DolphinView::IconsView << true << QList<QByteArray>({"text"}); - - // baloo -search - QTest::newRow("Baloo - Documents") << QUrl("search:/documents") << DolphinView::DetailsView << false << QList<QByteArray>({"text", "path"}); - - // audio files - QTest::newRow("Places - Audio") << QUrl("search:/audio") << DolphinView::DetailsView << false << QList<QByteArray>({"text", "artist", "album"}); - - // devices - QTest::newRow("Devices - Floppy") << QUrl("file:///media/floppy0") << DolphinView::IconsView << true << QList<QByteArray>({"text"}); - -} - -void PlacesItemModelTest::testDefaultViewProperties() -{ - QFETCH(QUrl, url); - QFETCH(DolphinView::Mode, expectedViewMode); - QFETCH(bool, expectedPreviewShow); - QFETCH(QList<QByteArray>, expectedVisibleRole); - - // In order to test the default view properties, turn off the global view properties and re-init the test to reload the model. - GeneralSettings* settings = GeneralSettings::self(); - settings->setGlobalViewProps(false); - settings->save(); - cleanup(); - init(); - - ViewProperties properties(KFilePlacesModel::convertedUrl(url)); - QCOMPARE(properties.viewMode(), expectedViewMode); - QCOMPARE(properties.previewsShown(), expectedPreviewShow); - QCOMPARE(properties.visibleRoles(), expectedVisibleRole); - - settings->setGlobalViewProps(true); - settings->save(); -} - -void PlacesItemModelTest::testClear() -{ - QCOMPARE(m_model->count(), m_expectedModelCount); - m_model->clear(); - QCOMPARE(m_model->count(), 0); - QCOMPARE(m_model->hiddenCount(), 0); - m_model->refresh(); - QTRY_COMPARE(m_model->count(), m_expectedModelCount); -} - -void PlacesItemModelTest::testHideItem() -{ - const QUrl mediaUrl = QUrl::fromLocalFile(QStringLiteral("/media/XO-Y4")); - const int index = indexOf(mediaUrl); - - PlacesItem *item = m_model->placesItem(index); - - QSignalSpy spyItemsRemoved(m_model, &PlacesItemModel::itemsRemoved); - QList<QVariant> spyItemsRemovedArgs; - KItemRangeList removedRange; - - QSignalSpy spyItemsInserted(m_model, &PlacesItemModel::itemsInserted); - QList<QVariant> spyItemsInsertedArgs; - KItemRangeList insertedRange; - QVERIFY(item); - - // hide an item - item->setHidden(true); - - // check if items removed was fired - QTRY_COMPARE(m_model->count(), m_expectedModelCount - 1); - QCOMPARE(spyItemsRemoved.count(), 1); - spyItemsRemovedArgs = spyItemsRemoved.takeFirst(); - removedRange = spyItemsRemovedArgs.at(0).value<KItemRangeList>(); - QCOMPARE(removedRange.size(), 1); - QCOMPARE(removedRange.first().index, index); - QCOMPARE(removedRange.first().count, 1); - - // allow model to show hidden items - m_model->setHiddenItemsShown(true); - - // check if the items inserted was fired - spyItemsInsertedArgs = spyItemsInserted.takeFirst(); - insertedRange = spyItemsInsertedArgs.at(0).value<KItemRangeList>(); - QCOMPARE(insertedRange.size(), 1); - QCOMPARE(insertedRange.first().index, index); - QCOMPARE(insertedRange.first().count, 1); - - // mark item as visible - item = m_model->placesItem(index); - item->setHidden(false); - - // mark model to hide invisible items - m_model->setHiddenItemsShown(true); - - QTRY_COMPARE(m_model->count(), m_expectedModelCount); -} - -void PlacesItemModelTest::testSystemItems() -{ - int tempDirIndex = 2; - increaseIndexIfNeeded(tempDirIndex); - - QCOMPARE(m_model->count(), m_expectedModelCount); - for (int r = 0; r < m_model->count(); r++) { - QCOMPARE(m_model->placesItem(r)->isSystemItem(), !m_model->placesItem(r)->device().isValid()); - } - - QSignalSpy itemsInsertedSpy(m_model, &PlacesItemModel::itemsInserted); - - // create a new entry (non system item) - createPlaceItem(QStringLiteral("Temporary Dir"), QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::TempLocation)), QString()); - - // check if the new entry was created - QTRY_COMPARE(itemsInsertedSpy.count(), 1); - - // make sure the new place get removed - schedulePlaceRemoval(tempDirIndex); - - QList<QVariant> args = itemsInsertedSpy.takeFirst(); - KItemRangeList range = args.at(0).value<KItemRangeList>(); - QCOMPARE(range.first().index, tempDirIndex); - QCOMPARE(range.first().count, 1); - QVERIFY(!m_model->placesItem(tempDirIndex)->isSystemItem()); - QCOMPARE(m_model->count(), m_expectedModelCount + 1); - - QTest::qWait(300); - // check if the removal signal is correct - QSignalSpy itemsRemovedSpy(m_model, &PlacesItemModel::itemsRemoved); - m_model->deleteItem(tempDirIndex); - QTRY_COMPARE(itemsRemovedSpy.count(), 1); - args = itemsRemovedSpy.takeFirst(); - range = args.at(0).value<KItemRangeList>(); - QCOMPARE(range.first().index, tempDirIndex); - QCOMPARE(range.first().count, 1); - QTRY_COMPARE(m_model->count(), m_expectedModelCount); - - //cancel removal (it was removed above) - cancelPlaceRemoval(tempDirIndex); -} - -void PlacesItemModelTest::testEditBookmark() -{ - int tempDirIndex = 2; - increaseIndexIfNeeded(tempDirIndex); - - QScopedPointer<PlacesItemModel> other(new PlacesItemModel()); - - createPlaceItem(QStringLiteral("Temporary Dir"), QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::TempLocation)), QString()); - - // make sure that the new item will be removed later - schedulePlaceRemoval(tempDirIndex); - - QSignalSpy itemsChangedSply(m_model, &PlacesItemModel::itemsChanged); - - // modify place text - m_model->item(tempDirIndex)->setText(QStringLiteral("Renamed place")); - m_model->refresh(); - - // check if the correct signal was fired - QTRY_COMPARE(itemsChangedSply.count(), 1); - QList<QVariant> args = itemsChangedSply.takeFirst(); - KItemRangeList range = args.at(0).value<KItemRangeList>(); - QCOMPARE(range.first().index, tempDirIndex); - QCOMPARE(range.first().count, 1); - QSet<QByteArray> roles = args.at(1).value<QSet<QByteArray> >(); - QCOMPARE(roles.size(), 1); - QCOMPARE(*roles.begin(), QByteArrayLiteral("text")); - QCOMPARE(m_model->item(tempDirIndex)->text(), QStringLiteral("Renamed place")); - - // check if the item was updated in the other model - QTRY_COMPARE(other->item(tempDirIndex)->text(), QStringLiteral("Renamed place")); -} - -void PlacesItemModelTest::testEditAfterCreation() -{ - int tempDirIndex = 2; - increaseIndexIfNeeded(tempDirIndex); - - const QUrl tempUrl = QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::TempLocation)); - QSignalSpy itemsInsertedSpy(m_model, &PlacesItemModel::itemsInserted); - - // create a new place - createPlaceItem(QStringLiteral("Temporary Dir"), tempUrl, QString()); - QTRY_COMPARE(itemsInsertedSpy.count(), 1); - - PlacesItemModel *model = new PlacesItemModel(); - QTRY_COMPARE(model->count(), m_model->count()); - - // make sure that the new item will be removed later - schedulePlaceRemoval(tempDirIndex); - - // modify place text - PlacesItem *item = m_model->placesItem(tempDirIndex); - item->setText(QStringLiteral("Renamed place")); - m_model->refresh(); - - // check if the second model got the changes - QTRY_COMPARE(model->count(), m_model->count()); - QTRY_COMPARE(model->placesItem(tempDirIndex)->text(), m_model->placesItem(tempDirIndex)->text()); - QTRY_COMPARE(model->placesItem(tempDirIndex)->bookmark().metaDataItem(QStringLiteral("OnlyInApp")), - m_model->placesItem(tempDirIndex)->bookmark().metaDataItem(QStringLiteral("OnlyInApp"))); - QTRY_COMPARE(model->placesItem(tempDirIndex)->icon(), m_model->placesItem(tempDirIndex)->icon()); - QTRY_COMPARE(model->placesItem(tempDirIndex)->url(), m_model->placesItem(tempDirIndex)->url()); -} - -void PlacesItemModelTest::testEditMetadata() -{ - int tempDirIndex = 2; - increaseIndexIfNeeded(tempDirIndex); - - const QUrl tempUrl = QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::TempLocation)); - QSignalSpy itemsInsertedSpy(m_model, &PlacesItemModel::itemsInserted); - - // create a new place - createPlaceItem(QStringLiteral("Temporary Dir"), tempUrl, QString()); - QTRY_COMPARE(itemsInsertedSpy.count(), 1); - - // check if the new entry was created - PlacesItemModel *model = new PlacesItemModel(); - QTRY_COMPARE(model->count(), m_model->count()); - - // make sure that the new item will be removed later - schedulePlaceRemoval(tempDirIndex); - - // modify place metadata - auto bookmark = m_model->placesItem(tempDirIndex)->bookmark(); - bookmark.setMetaDataItem(QStringLiteral("OnlyInApp"), KAboutData::applicationData().componentName()); - m_model->refresh(); - - // check if the place was modified in both models - QTRY_COMPARE(model->placesItem(tempDirIndex)->bookmark().metaDataItem(QStringLiteral("OnlyInApp")), - KAboutData::applicationData().componentName()); - QTRY_COMPARE(model->placesItem(tempDirIndex)->text(), m_model->placesItem(tempDirIndex)->text()); - QTRY_COMPARE(model->placesItem(tempDirIndex)->bookmark().metaDataItem(QStringLiteral("OnlyInApp")), - m_model->placesItem(tempDirIndex)->bookmark().metaDataItem(QStringLiteral("OnlyInApp"))); - QTRY_COMPARE(model->placesItem(tempDirIndex)->icon(), m_model->placesItem(tempDirIndex)->icon()); - QTRY_COMPARE(model->placesItem(tempDirIndex)->url(), m_model->placesItem(tempDirIndex)->url()); -} - -void PlacesItemModelTest::testRefresh() -{ - int tempDirIndex = 2; - increaseIndexIfNeeded(tempDirIndex); - - const QUrl tempUrl = QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::TempLocation)); - QSignalSpy itemsInsertedSpy(m_model, &PlacesItemModel::itemsInserted); - - // create a new place - createPlaceItem(QStringLiteral("Temporary Dir"), tempUrl, QString()); - QTRY_COMPARE(itemsInsertedSpy.count(), 1); - - PlacesItemModel *model = new PlacesItemModel(); - QTRY_COMPARE(model->count(), m_model->count()); - - // make sure that the new item will be removed later - schedulePlaceRemoval(tempDirIndex); - - PlacesItem *item = m_model->placesItem(tempDirIndex); - PlacesItem *sameItem = model->placesItem(tempDirIndex); - QCOMPARE(item->text(), sameItem->text()); - - // modify place text - item->setText(QStringLiteral("Renamed place")); - - // item from another model is not affected at the moment - QVERIFY(item->text() != sameItem->text()); - - // propagate change - m_model->refresh(); - - // item must be equal - QTRY_COMPARE(item->text(), sameItem->text()); -} - -void PlacesItemModelTest::testIcons_data() -{ - QTest::addColumn<QUrl>("url"); - QTest::addColumn<QString>("expectedIconName"); - - // places - QTest::newRow("Places - Home") << QUrl::fromLocalFile(QDir::homePath()) << QStringLiteral("user-home"); - - // baloo -search - QTest::newRow("Baloo - Documents") << QUrl("search:/documents") << QStringLiteral("folder-text"); - - // devices - QTest::newRow("Devices - Floppy") << QUrl("file:///media/floppy0") << QStringLiteral("blockdevice"); -} - -void PlacesItemModelTest::testIcons() -{ - QFETCH(QUrl, url); - QFETCH(QString, expectedIconName); - - PlacesItem *item = m_model->placesItem(indexOf(url)); - QCOMPARE(item->icon(), expectedIconName); - - for (int r = 0; r < m_model->count(); r++) { - QVERIFY(!m_model->placesItem(r)->icon().isEmpty()); - } -} - -void PlacesItemModelTest::testDragAndDrop() -{ - int lastIndex = 1; // last index of places group - increaseIndexIfNeeded(lastIndex); - - QList<QVariant> args; - KItemRangeList range; - QStringList urls = initialUrls(); - - QSignalSpy itemsInsertedSpy(m_model, &PlacesItemModel::itemsInserted); - QSignalSpy itemsRemovedSpy(m_model, &PlacesItemModel::itemsRemoved); - - CHECK_PLACES_URLS(initialUrls()); - // Move the home directory to the end of the places group - QMimeData *dropData = createMimeData(QList<int>() << 0); - m_model->dropMimeDataBefore(m_model->count() - 1, dropData); - urls.move(0, lastIndex); - delete dropData; - - QTRY_COMPARE(itemsInsertedSpy.count(), 1); - QTRY_COMPARE(itemsRemovedSpy.count(), 1); - - // remove item from actual position - args = itemsRemovedSpy.takeFirst(); - range = args.at(0).value<KItemRangeList>(); - QCOMPARE(range.size(), 1); - QCOMPARE(range.at(0).count, 1); - QCOMPARE(range.at(0).index, 0); - - // insert intem in his group - args = itemsInsertedSpy.takeFirst(); - range = args.at(0).value<KItemRangeList>(); - QCOMPARE(range.size(), 1); - QCOMPARE(range.at(0).count, 1); - QCOMPARE(range.at(0).index, lastIndex); - - CHECK_PLACES_URLS(urls); - - itemsInsertedSpy.clear(); - itemsRemovedSpy.clear(); - - // Move home directory item back to its original position - dropData = createMimeData(QList<int>() << lastIndex); - m_model->dropMimeDataBefore(0, dropData); - urls.move(lastIndex, 0); - delete dropData; - - QTRY_COMPARE(itemsInsertedSpy.count(), 1); - QTRY_COMPARE(itemsRemovedSpy.count(), 1); - - // remove item from actual position - args = itemsRemovedSpy.takeFirst(); - range = args.at(0).value<KItemRangeList>(); - QCOMPARE(range.size(), 1); - QCOMPARE(range.at(0).count, 1); - QCOMPARE(range.at(0).index, lastIndex); - - // insert intem in the requested position - args = itemsInsertedSpy.takeFirst(); - range = args.at(0).value<KItemRangeList>(); - QCOMPARE(range.size(), 1); - QCOMPARE(range.at(0).count, 1); - QCOMPARE(range.at(0).index, 0); - - CHECK_PLACES_URLS(urls); -} - -void PlacesItemModelTest::testHideDevices() -{ - QSignalSpy itemsRemoved(m_model, &PlacesItemModel::itemsRemoved); - QStringList urls = initialUrls(); - - m_model->setGroupHidden(KFilePlacesModel::RemovableDevicesType, true); - QTRY_VERIFY(m_model->isGroupHidden(KFilePlacesModel::RemovableDevicesType)); - QTRY_COMPARE(itemsRemoved.count(), 3); - - // remove removable-devices - urls.removeOne(QStringLiteral("/media/floppy0")); - urls.removeOne(QStringLiteral("/media/XO-Y4")); - urls.removeOne(QStringLiteral("/media/cdrom")); - - // check if the correct urls was removed - CHECK_PLACES_URLS(urls); - - delete m_model; - m_model = new PlacesItemModel(); - QTRY_COMPARE(m_model->count(), urls.count()); - CHECK_PLACES_URLS(urls); - - // revert changes - m_model->setGroupHidden(KFilePlacesModel::RemovableDevicesType, false); - urls = initialUrls(); - QTRY_COMPARE(m_model->count(), urls.count()); - CHECK_PLACES_URLS(urls); -} - -void PlacesItemModelTest::testDuplicatedEntries() -{ - QStringList urls = initialUrls(); - // create a duplicated entry on bookmark - KBookmarkManager *bookmarkManager = KBookmarkManager::managerForFile(bookmarksFile(), QStringLiteral("kfilePlaces")); - KBookmarkGroup root = bookmarkManager->root(); - KBookmark bookmark = root.addBookmark(QStringLiteral("Duplicated Search Videos"), QUrl("search:/videos"), {}); - - const QString id = QUuid::createUuid().toString(); - bookmark.setMetaDataItem(QStringLiteral("ID"), id); - bookmark.setMetaDataItem(QStringLiteral("OnlyInApp"), KAboutData::applicationData().componentName()); - bookmarkManager->emitChanged(bookmarkManager->root()); - - PlacesItemModel *newModel = new PlacesItemModel(); - QTRY_COMPARE(placesUrls(newModel).count(QStringLiteral("search:/videos")), 1); - QTRY_COMPARE(urls, placesUrls(newModel)); - delete newModel; -} - -void PlacesItemModelTest::renameAfterCreation() -{ - int tempDirIndex = 2; - increaseIndexIfNeeded(tempDirIndex); - - const QUrl tempUrl = QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::TempLocation)); - QStringList urls = initialUrls(); - PlacesItemModel *model = new PlacesItemModel(); - - CHECK_PLACES_URLS(urls); - QTRY_COMPARE(model->count(), m_model->count()); - - // create a new place - createPlaceItem(QStringLiteral("Temporary Dir"), tempUrl, QString()); - urls.insert(tempDirIndex, tempUrl.toLocalFile()); - - // make sure that the new item will be removed later - schedulePlaceRemoval(tempDirIndex); - - CHECK_PLACES_URLS(urls); - QCOMPARE(model->count(), m_model->count()); - - - // modify place text - QSignalSpy changedSpy(m_model, &PlacesItemModel::itemsChanged); - - PlacesItem *item = m_model->placesItem(tempDirIndex); - item->setText(QStringLiteral("New Temporary Dir")); - item->setUrl(item->url()); - item->setIcon(item->icon()); - m_model->refresh(); - - QTRY_COMPARE(changedSpy.count(), 1); - - // check if the place was modified in both models - QTRY_COMPARE(m_model->placesItem(tempDirIndex)->text(), QStringLiteral("New Temporary Dir")); - QTRY_COMPARE(model->placesItem(tempDirIndex)->text(), QStringLiteral("New Temporary Dir")); -} - -QTEST_MAIN(PlacesItemModelTest) - -#include "placesitemmodeltest.moc" diff --git a/src/tests/testdir.cpp b/src/tests/testdir.cpp index 51dbdbc58..5d75a5343 100644 --- a/src/tests/testdir.cpp +++ b/src/tests/testdir.cpp @@ -31,12 +31,12 @@ static void setTimeStamp(const QString& path, const QDateTime& mtime) { #ifdef Q_OS_UNIX struct utimbuf utbuf; - utbuf.actime = mtime.toTime_t(); + utbuf.actime = mtime.toSecsSinceEpoch(); utbuf.modtime = utbuf.actime; utime(QFile::encodeName(path), &utbuf); #elif defined(Q_OS_WIN) struct _utimbuf utbuf; - utbuf.actime = mtime.toTime_t(); + utbuf.actime = mtime.toSecsSinceEpoch(); utbuf.modtime = utbuf.actime; _wutime(reinterpret_cast<const wchar_t *>(path.utf16()), &utbuf); #endif |
