]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/tests/kfileitemmodeltest.cpp
Merge remote-tracking branch 'origin/KDE/4.11'
[dolphin.git] / src / tests / kfileitemmodeltest.cpp
index 484ddee110ce816bf3146e19ca300c5bdab51d21..513ecef5a0f65cd19067ad9d0075f1ffbf619db5 100644 (file)
@@ -69,6 +69,7 @@ private slots:
     void testSetData();
     void testSetDataWithModifiedSortRole_data();
     void testSetDataWithModifiedSortRole();
+    void testChangeSortRole();
     void testModelConsistencyWhenInsertingItems();
     void testItemRangeConsistencyWhenInsertingItems();
     void testExpandItems();
@@ -78,10 +79,12 @@ private slots:
     void testIndexForKeyboardSearch();
     void testNameFilter();
     void testEmptyPath();
+    void testRefreshExpandedItem();
     void testRemoveHiddenItems();
     void collapseParentOfHiddenItems();
     void removeParentOfHiddenItems();
     void testGeneralParentChildRelationships();
+    void testNameRoleGroups();
 
 private:
     QStringList itemsInModel() const;
@@ -104,6 +107,9 @@ void KFileItemModelTest::init()
     m_testDir = new TestDir();
     m_model = new KFileItemModel();
     m_model->m_dirLister->setAutoUpdate(false);
+
+    // Reduce the timer interval to make the test run faster.
+    m_model->m_resortAllItemsTimer->setInterval(0);
 }
 
 void KFileItemModelTest::cleanup()
@@ -276,6 +282,8 @@ void KFileItemModelTest::testSetDataWithModifiedSortRole()
     // Changing the value of a sort-role must result in
     // a reordering of the items.
     QCOMPARE(m_model->sortRole(), QByteArray("text"));
+    m_model->setSortRole("rating");
+    QCOMPARE(m_model->sortRole(), QByteArray("rating"));
 
     QStringList files;
     files << "a.txt" << "b.txt" << "c.txt";
@@ -301,7 +309,6 @@ void KFileItemModelTest::testSetDataWithModifiedSortRole()
     ratingC.insert("rating", 6);
     m_model->setData(2, ratingC);
 
-    m_model->setSortRole("rating");
     QCOMPARE(m_model->data(0).value("rating").toInt(), 2);
     QCOMPARE(m_model->data(1).value("rating").toInt(), 4);
     QCOMPARE(m_model->data(2).value("rating").toInt(), 6);
@@ -322,6 +329,45 @@ void KFileItemModelTest::testSetDataWithModifiedSortRole()
     QVERIFY(m_model->isConsistent());
 }
 
+void KFileItemModelTest::testChangeSortRole()
+{
+    QCOMPARE(m_model->sortRole(), QByteArray("text"));
+
+    QStringList files;
+    files << "a.txt" << "b.jpg" << "c.txt";
+    m_testDir->createFiles(files);
+
+    m_model->loadDirectory(m_testDir->url());
+    QVERIFY(QTest::kWaitForSignal(m_model, SIGNAL(itemsInserted(KItemRangeList)), DefaultTimeout));
+    QCOMPARE(itemsInModel(), QStringList() << "a.txt" << "b.jpg" << "c.txt");
+
+    // Simulate that KFileItemModelRolesUpdater determines the mime type.
+    // Resorting the files by 'type' will only work immediately if their
+    // mime types are known.
+    for (int index = 0; index < m_model->count(); ++index) {
+        m_model->fileItem(index).determineMimeType();
+    }
+
+    // Now: sort by type.
+    QSignalSpy spyItemsMoved(m_model, SIGNAL(itemsMoved(KItemRange,QList<int>)));
+    m_model->setSortRole("type");
+    QCOMPARE(m_model->sortRole(), QByteArray("type"));
+    QVERIFY(!spyItemsMoved.isEmpty());
+
+    // The actual order of the files might depend on the translation of the
+    // result of KFileItem::mimeComment() in the user's language.
+    QStringList version1;
+    version1 << "b.jpg" << "a.txt" << "c.txt";
+
+    QStringList version2;
+    version2 << "a.txt" << "c.txt" << "b.jpg";
+
+    const bool ok1 = (itemsInModel() == version1);
+    const bool ok2 = (itemsInModel() == version2);
+
+    QVERIFY(ok1 || ok2);
+}
+
 void KFileItemModelTest::testModelConsistencyWhenInsertingItems()
 {
     //QSKIP("Temporary disabled", SkipSingle);
@@ -847,15 +893,48 @@ void KFileItemModelTest::testEmptyPath()
 
     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->slotItemsAdded(emptyUrl, items);
     m_model->slotCompleted();
 }
 
+/**
+ * Verifies that the 'isExpanded' state of folders does not change when the
+ * 'refreshItems' signal is received, see https://bugs.kde.org/show_bug.cgi?id=299675.
+ */
+void KFileItemModelTest::testRefreshExpandedItem()
+{
+    QSet<QByteArray> modelRoles = m_model->roles();
+    modelRoles << "isExpanded" << "isExpandable" << "expandedParentsCount";
+    m_model->setRoles(modelRoles);
+
+    QStringList files;
+    files << "a/1" << "a/2" << "3" << "4";
+    m_testDir->createFiles(files);
+
+    m_model->loadDirectory(m_testDir->url());
+    QVERIFY(QTest::kWaitForSignal(m_model, SIGNAL(itemsInserted(KItemRangeList)), DefaultTimeout));
+    QCOMPARE(m_model->count(), 3); // "a/", "3", "4"
+
+    m_model->setExpanded(0, true);
+    QVERIFY(QTest::kWaitForSignal(m_model, SIGNAL(itemsInserted(KItemRangeList)), DefaultTimeout));
+    QCOMPARE(m_model->count(), 5); // "a/", "a/1", "a/2", "3", "4"
+    QVERIFY(m_model->isExpanded(0));
+
+    QSignalSpy spyItemsChanged(m_model, SIGNAL(itemsChanged(KItemRangeList,QSet<QByteArray>)));
+
+    const KFileItem item = m_model->fileItem(0);
+    m_model->slotRefreshItems(QList<QPair<KFileItem, KFileItem> >() << qMakePair(item, item));
+    QVERIFY(!spyItemsChanged.isEmpty());
+
+    QCOMPARE(m_model->count(), 5); // "a/", "a/1", "a/2", "3", "4"
+    QVERIFY(m_model->isExpanded(0));
+}
+
 /**
  * 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
@@ -1097,6 +1176,53 @@ void KFileItemModelTest::testGeneralParentChildRelationships()
     QCOMPARE(itemsInModel(), QStringList() << "parent1");
 }
 
+void KFileItemModelTest::testNameRoleGroups()
+{
+    QStringList files;
+    files << "b.txt" << "c.txt" << "d.txt" << "e.txt";
+
+    m_testDir->createFiles(files);
+
+    m_model->setGroupedSorting(true);
+    m_model->loadDirectory(m_testDir->url());
+    QVERIFY(QTest::kWaitForSignal(m_model, SIGNAL(itemsInserted(KItemRangeList)), DefaultTimeout));
+    QCOMPARE(itemsInModel(), QStringList() << "b.txt" << "c.txt" << "d.txt" << "e.txt");
+
+    QList<QPair<int, QVariant> > expectedGroups;
+    expectedGroups << QPair<int, QVariant>(0, QLatin1String("B"));
+    expectedGroups << QPair<int, QVariant>(1, QLatin1String("C"));
+    expectedGroups << QPair<int, QVariant>(2, QLatin1String("D"));
+    expectedGroups << QPair<int, QVariant>(3, QLatin1String("E"));
+    QCOMPARE(m_model->groups(), expectedGroups);
+
+    // Rename d.txt to a.txt.
+    QHash<QByteArray, QVariant> data;
+    data.insert("text", "a.txt");
+    m_model->setData(2, data);
+    QVERIFY(QTest::kWaitForSignal(m_model, SIGNAL(itemsMoved(KItemRange,QList<int>)), DefaultTimeout));
+    QCOMPARE(itemsInModel(), QStringList() << "a.txt" << "b.txt" << "c.txt" << "e.txt");
+
+    expectedGroups.clear();
+    expectedGroups << QPair<int, QVariant>(0, QLatin1String("A"));
+    expectedGroups << QPair<int, QVariant>(1, QLatin1String("B"));
+    expectedGroups << QPair<int, QVariant>(2, QLatin1String("C"));
+    expectedGroups << QPair<int, QVariant>(3, QLatin1String("E"));
+    QCOMPARE(m_model->groups(), expectedGroups);
+
+    // Rename c.txt to d.txt.
+    data.insert("text", "d.txt");
+    m_model->setData(2, data);
+    QVERIFY(QTest::kWaitForSignal(m_model, SIGNAL(itemsMoved(KItemRange,QList<int>)), DefaultTimeout));
+    QCOMPARE(itemsInModel(), QStringList() << "a.txt" << "b.txt" << "d.txt" << "e.txt");
+
+    expectedGroups.clear();
+    expectedGroups << QPair<int, QVariant>(0, QLatin1String("A"));
+    expectedGroups << QPair<int, QVariant>(1, QLatin1String("B"));
+    expectedGroups << QPair<int, QVariant>(2, QLatin1String("D"));
+    expectedGroups << QPair<int, QVariant>(3, QLatin1String("E"));
+    QCOMPARE(m_model->groups(), expectedGroups);
+}
+
 QStringList KFileItemModelTest::itemsInModel() const
 {
     QStringList items;