]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/tests/kfileitemmodeltest.cpp
Merge remote-tracking branch 'fork/work/zakharafoniam/useful-groups'
[dolphin.git] / src / tests / kfileitemmodeltest.cpp
index 16189a0fc647199335723f7cc98d3d987782db5e..34ae2ba8721c02479005e5e7011053a4dfbc4b63 100644 (file)
@@ -13,7 +13,7 @@
 #include <QTimer>
 
 #include <KDirLister>
-#include <kio/job.h>
+#include <KIO/SimpleJob>
 
 #include "kitemviews/kfileitemmodel.h"
 #include "testdir.h"
@@ -69,6 +69,7 @@ private Q_SLOTS:
     void testMakeExpandedItemHidden();
     void testRemoveFilteredExpandedItems();
     void testSorting();
+    void testNaturalSorting();
     void testIndexForKeyboardSearch();
     void testNameFilter();
     void testEmptyPath();
@@ -92,6 +93,7 @@ private Q_SLOTS:
     void testDeleteFileMoreThanOnce();
     void testInsertAfterExpand();
     void testCurrentDirRemoved();
+    void testSizeSortingAfterRefresh();
 
 private:
     QStringList itemsInModel() const;
@@ -156,14 +158,14 @@ void KFileItemModelTest::testDefaultSortRole()
     QVERIFY(itemsInsertedSpy.wait());
 
     QCOMPARE(m_model->count(), 3);
-    QCOMPARE(m_model->data(0).value("text").toString(), QString("a.txt"));
-    QCOMPARE(m_model->data(1).value("text").toString(), QString("b.txt"));
-    QCOMPARE(m_model->data(2).value("text").toString(), QString("c.txt"));
+    QCOMPARE(m_model->data(0).value("text").toString(), QStringLiteral("a.txt"));
+    QCOMPARE(m_model->data(1).value("text").toString(), QStringLiteral("b.txt"));
+    QCOMPARE(m_model->data(2).value("text").toString(), QStringLiteral("c.txt"));
 }
 
 void KFileItemModelTest::testDefaultGroupedSorting()
 {
-    QCOMPARE(m_model->groupedSorting(), false);
+    QCOMPARE(m_model->groupedSorting(), true);
 }
 
 void KFileItemModelTest::testNewItems()
@@ -261,8 +263,8 @@ void KFileItemModelTest::testSetData()
     QCOMPARE(itemsChangedSpy.count(), 1);
 
     values = m_model->data(0);
-    QCOMPARE(values.value("customRole1").toString(), QString("Test1"));
-    QCOMPARE(values.value("customRole2").toString(), QString("Test2"));
+    QCOMPARE(values.value("customRole1").toString(), QStringLiteral("Test1"));
+    QCOMPARE(values.value("customRole2").toString(), QStringLiteral("Test2"));
     QVERIFY(m_model->isConsistent());
 }
 
@@ -846,6 +848,108 @@ void KFileItemModelTest::testRemoveFilteredExpandedItems()
                            << "file");
 }
 
+void KFileItemModelTest::testSizeSortingAfterRefresh()
+{
+    // testDir structure is as follows
+    // ./
+    // ├─ a
+    // ├─ b
+    // ├─ c/
+    // │  ├─ c-2/
+    // │  │  ├─ c-3
+    // │  ├─ c-1
+    // ├─ d
+    // ├─ e
+
+    QSignalSpy itemsInsertedSpy(m_model, &KFileItemModel::itemsInserted);
+    QSignalSpy itemsMovedSpy(m_model, &KFileItemModel::itemsMoved);
+    QVERIFY(itemsMovedSpy.isValid());
+
+    // Create some files with different sizes and modification times to check the different sorting options
+    QDateTime now = QDateTime::currentDateTime();
+
+    QSet<QByteArray> roles;
+    roles.insert("text");
+    roles.insert("isExpanded");
+    roles.insert("isExpandable");
+    roles.insert("expandedParentsCount");
+    m_model->setRoles(roles);
+
+    m_testDir->createDir("c/c-2");
+    m_testDir->createFile("c/c-2/c-3");
+    m_testDir->createFile("c/c-1");
+
+    m_testDir->createFile("a", "A file", now.addDays(-3));
+    m_testDir->createFile("b", "A larger file", now.addDays(0));
+    m_testDir->createDir("c", now.addDays(-2));
+    m_testDir->createFile("d", "The largest file in this directory", now.addDays(-1));
+    m_testDir->createFile("e", "An even larger file", now.addDays(-4));
+
+    m_model->loadDirectory(m_testDir->url());
+    QVERIFY(itemsInsertedSpy.wait());
+
+    int index = m_model->index(QUrl(m_testDir->url().url() + "/c"));
+    m_model->setExpanded(index, true);
+    QVERIFY(itemsInsertedSpy.wait());
+
+    index = m_model->index(QUrl(m_testDir->url().url() + "/c/c-2"));
+    m_model->setExpanded(index, true);
+    QVERIFY(itemsInsertedSpy.wait());
+
+    // Default: Sort by Name, ascending
+    QCOMPARE(m_model->sortRole(), QByteArray("text"));
+    QCOMPARE(m_model->sortOrder(), Qt::AscendingOrder);
+    QCOMPARE(itemsInModel(),
+             QStringList() << "c"
+                           << "c-2"
+                           << "c-3"
+                           << "c-1"
+                           << "a"
+                           << "b"
+                           << "d"
+                           << "e");
+
+    // Sort by Size, ascending, before refresh
+    m_model->setSortRole("size");
+    QCOMPARE(m_model->sortRole(), QByteArray("size"));
+    QCOMPARE(m_model->sortOrder(), Qt::AscendingOrder);
+    QCOMPARE(itemsInModel(),
+             QStringList() << "c"
+                           << "c-2"
+                           << "c-3"
+                           << "c-1"
+                           << "a"
+                           << "b"
+                           << "e"
+                           << "d");
+
+    // Refresh directory
+    m_model->refreshDirectory(m_model->directory());
+    QVERIFY(itemsInsertedSpy.wait());
+
+    // Expand folders again
+    index = m_model->index(QUrl(m_testDir->url().url() + "/c"));
+    m_model->setExpanded(index, true);
+    QVERIFY(itemsInsertedSpy.wait());
+
+    index = m_model->index(QUrl(m_testDir->url().url() + "/c/c-2"));
+    m_model->setExpanded(index, true);
+    QVERIFY(itemsInsertedSpy.wait());
+
+    // Sort by Size, ascending, after refresh
+    QCOMPARE(m_model->sortRole(), QByteArray("size"));
+    QCOMPARE(m_model->sortOrder(), Qt::AscendingOrder);
+    QCOMPARE(itemsInModel(),
+             QStringList() << "c"
+                           << "c-2"
+                           << "c-3"
+                           << "c-1"
+                           << "a"
+                           << "b"
+                           << "e"
+                           << "d");
+}
+
 void KFileItemModelTest::testSorting()
 {
     // testDir structure is as follows
@@ -1172,11 +1276,88 @@ void KFileItemModelTest::testSorting()
     QCOMPARE(itemsMovedSpy.takeFirst().at(1).value<QList<int>>(), QList<int>() << 2 << 4 << 5 << 3 << 0 << 1 << 6 << 7 << 9 << 8);
 }
 
+void KFileItemModelTest::testNaturalSorting()
+{
+    QSignalSpy itemsInsertedSpy(m_model, &KFileItemModel::itemsInserted);
+    QSignalSpy itemsMovedSpy(m_model, &KFileItemModel::itemsMoved);
+    QVERIFY(itemsMovedSpy.isValid());
+
+    m_model->setSortRole("text");
+    m_model->setShowHiddenFiles(true);
+
+    m_testDir->createFiles({".a", "a.txt", "b.txt", "a 1.txt", "a 2.txt", "a 10.txt", "a.tar", "b.tar"});
+
+    m_model->loadDirectory(m_testDir->url());
+    QVERIFY(itemsInsertedSpy.wait());
+
+    // Sort by Name, ascending, natural sorting enabled
+    QCOMPARE(m_model->sortRole(), QByteArray("text"));
+    QCOMPARE(m_model->sortOrder(), Qt::AscendingOrder);
+    QCOMPARE(itemsInModel(),
+             QStringList() << ".a"
+                           << "a.tar"
+                           << "a.txt"
+                           << "a 1.txt"
+                           << "a 2.txt"
+                           << "a 10.txt"
+                           << "b.tar"
+                           << "b.txt");
+
+    // Sort by Extension
+    m_model->setSortRole("extension");
+    QCOMPARE(m_model->sortRole(), QByteArray("extension"));
+    QCOMPARE(itemsInModel(),
+             QStringList() << ".a"
+                           << "a.tar"
+                           << "b.tar"
+                           << "a.txt"
+                           << "a 1.txt"
+                           << "a 2.txt"
+                           << "a 10.txt"
+                           << "b.txt");
+    QCOMPARE(itemsMovedSpy.count(), 1);
+    QCOMPARE(itemsMovedSpy.first().at(0).value<KItemRange>(), KItemRange(2, 5));
+    QCOMPARE(itemsMovedSpy.takeFirst().at(1).value<QList<int>>(), QList<int>() << 3 << 4 << 5 << 6 << 2);
+
+    // Disable natural sorting, refresh directory for the change to take effect
+    m_model->m_naturalSorting = false;
+    m_model->refreshDirectory(m_model->directory());
+    QVERIFY(itemsInsertedSpy.wait());
+
+    // Sort by Extension, ascending, natural sorting disabled
+    QCOMPARE(m_model->sortRole(), QByteArray("extension"));
+    QCOMPARE(itemsInModel(),
+             QStringList() << ".a"
+                           << "a.tar"
+                           << "b.tar"
+                           << "a 1.txt"
+                           << "a 10.txt"
+                           << "a 2.txt"
+                           << "a.txt"
+                           << "b.txt");
+
+    // Sort by Name
+    m_model->setSortRole("text");
+    QCOMPARE(m_model->sortRole(), QByteArray("text"));
+    QCOMPARE(itemsInModel(),
+             QStringList() << ".a"
+                           << "a 1.txt"
+                           << "a 10.txt"
+                           << "a 2.txt"
+                           << "a.tar"
+                           << "a.txt"
+                           << "b.tar"
+                           << "b.txt");
+    QCOMPARE(itemsMovedSpy.count(), 1);
+    QCOMPARE(itemsMovedSpy.first().at(0).value<KItemRange>(), KItemRange(1, 6));
+    QCOMPARE(itemsMovedSpy.takeFirst().at(1).value<QList<int>>(), QList<int>() << 4 << 6 << 1 << 2 << 3 << 5);
+}
+
 void KFileItemModelTest::testIndexForKeyboardSearch()
 {
     QSignalSpy itemsInsertedSpy(m_model, &KFileItemModel::itemsInserted);
 
-    m_testDir->createFiles({"a", "aa", "Image.jpg", "Image.png", "Text", "Text1", "Text2", "Text11"});
+    m_testDir->createFiles({"a", "aa", "Image.jpg", "Image.png", "Text", "Text1", "Text2", "Text11", "U", "Ü", "Üu", "Ž"});
 
     m_model->loadDirectory(m_testDir->url());
     QVERIFY(itemsInsertedSpy.wait());
@@ -1193,6 +1374,9 @@ void KFileItemModelTest::testIndexForKeyboardSearch()
     QCOMPARE(m_model->indexForKeyboardSearch("text1", 0), 5);
     QCOMPARE(m_model->indexForKeyboardSearch("text2", 0), 6);
     QCOMPARE(m_model->indexForKeyboardSearch("text11", 0), 7);
+    QCOMPARE(m_model->indexForKeyboardSearch("u", 0), 8);
+    QCOMPARE(m_model->indexForKeyboardSearch("üu", 0), 10);
+    QCOMPARE(m_model->indexForKeyboardSearch("ž", 0), 11);
 
     // Start a search somewhere in the middle
     QCOMPARE(m_model->indexForKeyboardSearch("a", 1), 1);
@@ -1219,6 +1403,12 @@ void KFileItemModelTest::testIndexForKeyboardSearch()
     QCOMPARE(m_model->indexForKeyboardSearch("TexT", 5), 5);
     QCOMPARE(m_model->indexForKeyboardSearch("IMAGE", 4), 2);
 
+    // Test searches that match items with marks
+    QCOMPARE(m_model->indexForKeyboardSearch("u", 9), 9);
+    QCOMPARE(m_model->indexForKeyboardSearch("u", 10), 10);
+    QCOMPARE(m_model->indexForKeyboardSearch("uu", 0), 10);
+    QCOMPARE(m_model->indexForKeyboardSearch("z", 0), 11);
+
     // TODO: Maybe we should also test keyboard searches in directories which are not sorted by Name?
 }
 
@@ -1653,10 +1843,10 @@ void KFileItemModelTest::collapseParentOfHiddenItems()
     // Set a name filter that matches nothing -> nothing should remain.
     m_model->setNameFilter("xyz");
     QCOMPARE(itemsRemovedSpy.count(), 1);
-    QCOMPARE(m_model->count(), 0); //Everything is hidden
+    QCOMPARE(m_model->count(), 0); // Everything is hidden
     QCOMPARE(itemsInModel(), QStringList());
 
-    //Filter by the file names. Folder "d" will be hidden since it was collapsed
+    // Filter by the file names. Folder "d" will be hidden since it was collapsed
     m_model->setNameFilter("1");
     QCOMPARE(itemsRemovedSpy.count(), 1); // nothing was removed, itemsRemovedSpy count will remain the same:
     QCOMPARE(m_model->count(), 6); // 6 items: "a/", "a/b/", "a/b/c", "a/b/c/1", "a/b/1", "a/1"
@@ -1904,6 +2094,7 @@ void KFileItemModelTest::testNameRoleGroups()
     m_testDir->createFiles({"b.txt", "c.txt", "d.txt", "e.txt"});
 
     m_model->setGroupedSorting(true);
+    m_model->setGroupRole("text");
     m_model->loadDirectory(m_testDir->url());
     QVERIFY(itemsInsertedSpy.wait());
     QCOMPARE(itemsInModel(),
@@ -1990,6 +2181,8 @@ void KFileItemModelTest::testNameRoleGroupsWithExpandedItems()
     m_testDir->createFiles({"a/b.txt", "a/c.txt", "d/e.txt", "d/f.txt"});
 
     m_model->setGroupedSorting(true);
+    m_model->setGroupRole("text");
+
     m_model->loadDirectory(m_testDir->url());
     QVERIFY(itemsInsertedSpy.wait());
     QCOMPARE(itemsInModel(),
@@ -1999,6 +2192,7 @@ void KFileItemModelTest::testNameRoleGroupsWithExpandedItems()
     QList<QPair<int, QVariant>> expectedGroups;
     expectedGroups << QPair<int, QVariant>(0, QLatin1String("A"));
     expectedGroups << QPair<int, QVariant>(1, QLatin1String("D"));
+
     QCOMPARE(m_model->groups(), expectedGroups);
 
     // Verify that expanding "a" and "d" will not change the groups (except for the index of "D").