]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/tests/kfileitemmodeltest.cpp
Include parent-child relationships in KFileItemModel's consistency check
[dolphin.git] / src / tests / kfileitemmodeltest.cpp
index 3fc2b7c9ae0429c8c964ad9eb7267e68977a515a..85a46488f51505d85b7882511fe6b716b249bac0 100644 (file)
@@ -72,10 +72,10 @@ private slots:
     void testExpandItems();
     void testExpandParentItems();
     void testSorting();
-
     void testIndexForKeyboardSearch();
-
     void testNameFilter();
+    void testEmptyPath();
+    void testRemoveHiddenItems();
 
 private:
     QStringList itemsInModel() const;
@@ -486,6 +486,7 @@ void KFileItemModelTest::testExpandItems()
     QCOMPARE(spyRemoved.count(), 1);
     itemRangeList = spyRemoved.takeFirst().at(0).value<KItemRangeList>();
     QCOMPARE(itemRangeList, KItemRangeList() << KItemRange(1, 4)); // 4 items removed
+    QVERIFY(m_model->isConsistent());
 
     // Clear the model, reload the folder and try to restore the expanded folders.
     m_model->clear();
@@ -502,6 +503,7 @@ void KFileItemModelTest::testExpandItems()
     QVERIFY(m_model->isExpanded(3));
     QVERIFY(!m_model->isExpanded(4));
     QCOMPARE(m_model->expandedDirectories(), allFolders);
+    QVERIFY(m_model->isConsistent());
 
     // Move to a sub folder, then call restoreExpandedFolders() *before* going back.
     // This is how DolphinView restores the expanded folders when navigating in history.
@@ -564,6 +566,7 @@ void KFileItemModelTest::testExpandParentItems()
     QVERIFY(m_model->isExpanded(2));
     QVERIFY(m_model->isExpanded(3));
     QVERIFY(!m_model->isExpanded(4));
+    QVERIFY(m_model->isConsistent());
 }
 
 void KFileItemModelTest::testSorting()
@@ -773,6 +776,81 @@ void KFileItemModelTest::testNameFilter()
     QCOMPARE(m_model->count(), 5);
 }
 
+/**
+ * Verifies that we do not crash when adding a KFileItem with an empty path.
+ * Before this issue was fixed, KFileItemModel::expandedParentsCountCompare()
+ * tried to always read the first character of the path, even if the path is empty.
+ */
+void KFileItemModelTest::testEmptyPath()
+{
+    QSet<QByteArray> roles;
+    roles.insert("text");
+    roles.insert("isExpanded");
+    roles.insert("isExpandable");
+    roles.insert("expandedParentsCount");
+    m_model->setRoles(roles);
+
+    const KUrl emptyUrl;
+    QVERIFY(emptyUrl.path().isEmpty());
+    
+    const KUrl url("file:///test/");
+    
+    KFileItemList items;
+    items << KFileItem(emptyUrl, QString(), KFileItem::Unknown) << KFileItem(url, QString(), KFileItem::Unknown);
+    m_model->slotNewItems(items);
+    m_model->slotCompleted();
+}
+
+/**
+ * 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
+ */
+void KFileItemModelTest::testRemoveHiddenItems()
+{
+    m_testDir->createDir(".a");
+    m_testDir->createDir(".b");
+    m_testDir->createDir("c");
+    m_testDir->createDir("d");
+    m_testDir->createFiles(QStringList() << ".f" << ".g" << "h" << "i");
+
+    QSignalSpy spyItemsInserted(m_model, SIGNAL(itemsInserted(KItemRangeList)));
+    QSignalSpy spyItemsRemoved(m_model, SIGNAL(itemsRemoved(KItemRangeList)));
+
+    m_model->setShowHiddenFiles(true);
+    m_model->loadDirectory(m_testDir->url());
+    QVERIFY(QTest::kWaitForSignal(m_model, SIGNAL(itemsInserted(KItemRangeList)), DefaultTimeout));
+    QCOMPARE(itemsInModel(), QStringList() << ".a" << ".b" << "c" << "d" <<".f" << ".g" << "h" << "i");
+    QCOMPARE(spyItemsInserted.count(), 1);
+    QCOMPARE(spyItemsRemoved.count(), 0);
+    KItemRangeList itemRangeList = spyItemsInserted.takeFirst().at(0).value<KItemRangeList>();
+    QCOMPARE(itemRangeList, KItemRangeList() << KItemRange(0, 8));
+
+    m_model->setShowHiddenFiles(false);
+    QCOMPARE(itemsInModel(), QStringList() << "c" << "d" << "h" << "i");
+    QCOMPARE(spyItemsInserted.count(), 0);
+    QCOMPARE(spyItemsRemoved.count(), 1);
+    itemRangeList = spyItemsRemoved.takeFirst().at(0).value<KItemRangeList>();
+    QCOMPARE(itemRangeList, KItemRangeList() << KItemRange(0, 2) << KItemRange(4, 2));
+
+    m_model->setShowHiddenFiles(true);
+    QCOMPARE(itemsInModel(), QStringList() << ".a" << ".b" << "c" << "d" <<".f" << ".g" << "h" << "i");
+    QCOMPARE(spyItemsInserted.count(), 1);
+    QCOMPARE(spyItemsRemoved.count(), 0);
+    itemRangeList = spyItemsInserted.takeFirst().at(0).value<KItemRangeList>();
+    QCOMPARE(itemRangeList, KItemRangeList() << KItemRange(0, 2) << KItemRange(2, 2));
+
+    m_model->clear();
+    QCOMPARE(itemsInModel(), QStringList());
+    QCOMPARE(spyItemsInserted.count(), 0);
+    QCOMPARE(spyItemsRemoved.count(), 1);
+    itemRangeList = spyItemsRemoved.takeFirst().at(0).value<KItemRangeList>();
+    QCOMPARE(itemRangeList, KItemRangeList() << KItemRange(0, 8));
+
+    // Hiding hidden files makes the dir lister emit its itemsDeleted signal.
+    // Verify that this does not make the model crash.
+    m_model->setShowHiddenFiles(false);
+}
+
 QStringList KFileItemModelTest::itemsInModel() const
 {
     QStringList items;