void testSetData();
void testSetDataWithModifiedSortRole_data();
void testSetDataWithModifiedSortRole();
+ void testChangeSortRole();
void testModelConsistencyWhenInsertingItems();
void testItemRangeConsistencyWhenInsertingItems();
void testExpandItems();
void testIndexForKeyboardSearch();
void testNameFilter();
void testEmptyPath();
+ void testRefreshExpandedItem();
void testRemoveHiddenItems();
void collapseParentOfHiddenItems();
void removeParentOfHiddenItems();
void testGeneralParentChildRelationships();
+ void testNameRoleGroups();
private:
QStringList itemsInModel() const;
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()
// 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";
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);
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);
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
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;