#include <QTest>
#include <QSignalSpy>
-#include <algorithm>
#include <random>
#include "kitemviews/kfileitemmodel.h"
#include "kitemviews/private/kfileitemmodelsortalgorithm.h"
-#include "testdir.h"
-
-void myMessageOutput(QtMsgType type, const char* msg)
+void myMessageOutput(QtMsgType type, const QMessageLogContext& context, const QString& msg)
{
+ Q_UNUSED(context)
+
switch (type) {
case QtDebugMsg:
break;
case QtWarningMsg:
break;
case QtCriticalMsg:
- fprintf(stderr, "Critical: %s\n", msg);
+ fprintf(stderr, "Critical: %s\n", msg.toLocal8Bit().data());
break;
case QtFatalMsg:
- fprintf(stderr, "Fatal: %s\n", msg);
+ fprintf(stderr, "Fatal: %s\n", msg.toLocal8Bit().data());
abort();
default:
break;
private slots:
void insertAndRemoveManyItems_data();
void insertAndRemoveManyItems();
- void insertManyChildItems();
private:
static KFileItemList createFileItemList(const QStringList& fileNames, const QString& urlPrefix = QLatin1String("file:///"));
QTest::addColumn<KItemRangeList>("expectedItemsRemoved");
QList<int> sizes;
- sizes << 1000 << 4000 << 16000 << 64000 << 256000;
- //sizes << 50000 << 100000 << 150000 << 200000 << 250000;
+ sizes << 100000;
foreach (int n, sizes) {
QStringList allStrings;
model.m_naturalSorting = false;
model.setRoles({"text"});
- QSignalSpy spyItemsInserted(&model, SIGNAL(itemsInserted(KItemRangeList)));
- QSignalSpy spyItemsRemoved(&model, SIGNAL(itemsRemoved(KItemRangeList)));
+ QSignalSpy spyItemsInserted(&model, &KFileItemModel::itemsInserted);
+ QSignalSpy spyItemsRemoved(&model, &KFileItemModel::itemsRemoved);
QBENCHMARK {
model.slotClear();
}
}
-void KFileItemModelBenchmark::insertManyChildItems()
-{
- // TODO: this function needs to be adjusted to the changes in KFileItemModel
- // (replacement of slotNewItems(KFileItemList) by slotItemsAdded(KUrl,KFileItemList))
- // Currently, this function tries to insert child items of multiple
- // directories by invoking the slot only once.
-#if 0
- qInstallMsgHandler(myMessageOutput);
-
- KFileItemModel model;
-
- // Avoid overhead caused by natural sorting.
- model.m_naturalSorting = false;
-
- QSet<QByteArray> modelRoles = model.roles();
- modelRoles << "isExpanded" << "isExpandable" << "expandedParentsCount";
- model.setRoles(modelRoles);
- model.setSortDirectoriesFirst(false);
-
- // Create a test folder with a 3-level tree structure of folders.
- TestDir testFolder;
- int numberOfFolders = 0;
-
- QStringList subFolderNames;
- subFolderNames << "a/" << "b/" << "c/" << "d/";
-
- foreach (const QString& s1, subFolderNames) {
- ++numberOfFolders;
- foreach (const QString& s2, subFolderNames) {
- ++numberOfFolders;
- foreach (const QString& s3, subFolderNames) {
- testFolder.createDir("level-1-" + s1 + "level-2-" + s2 + "level-3-" + s3);
- ++numberOfFolders;
- }
- }
- }
-
- // Open the folder in the model and expand all subfolders.
- model.loadDirectory(testFolder.url());
- QVERIFY(QTest::kWaitForSignal(&model, SIGNAL(itemsInserted(KItemRangeList)), DefaultTimeout));
-
- int index = 0;
- while (index < model.count()) {
- if (model.isExpandable(index)) {
- model.setExpanded(index, true);
-
- if (!model.data(index).value("text").toString().startsWith("level-3")) {
- // New subfolders will appear unless we are on the final level already.
- QVERIFY(QTest::kWaitForSignal(&model, SIGNAL(itemsInserted(KItemRangeList)), DefaultTimeout));
- }
-
- QVERIFY(model.isExpanded(index));
- }
- ++index;
- }
-
- QCOMPARE(model.count(), numberOfFolders);
-
- // Create a list of many file items, which will be added to each of the
- // "level 1", "level 2", and "level 3" folders.
- const int filesPerDirectory = 500;
- QStringList allStrings;
- for (int i = 0; i < filesPerDirectory; ++i) {
- allStrings << QString::number(i);
- }
- allStrings.sort();
-
- KFileItemList newItems;
-
- // Also keep track of all expected items, including the existing
- // folders, to verify the final state of the model.
- KFileItemList allExpectedItems;
-
- for (int i = 0; i < model.count(); ++i) {
- const KFileItem folderItem = model.fileItem(i);
- allExpectedItems << folderItem;
-
- const KUrl folderUrl = folderItem.url();
- KFileItemList itemsInFolder = createFileItemList(allStrings, folderUrl.url(KUrl::AddTrailingSlash));
-
- newItems.append(itemsInFolder);
- allExpectedItems.append(itemsInFolder);
- }
-
- // Bring the items into random order.
- std::random_device rd;
- std::mt19937 g(rd());
- std::shuffle(newItems.begin(), newItems.end(), g);
-
- // Measure how long it takes to insert and then remove all files.
- QBENCHMARK {
- model.slotNewItems(newItems);
- model.slotCompleted();
-
- QCOMPARE(model.count(), allExpectedItems.count());
- QVERIFY(model.isConsistent());
- for (int i = 0; i < model.count(); ++i) {
- QCOMPARE(model.fileItem(i), allExpectedItems.at(i));
- }
-
- model.slotItemsDeleted(newItems);
- QCOMPARE(model.count(), numberOfFolders);
- QVERIFY(model.isConsistent());
- }
-#endif
-}
-
KFileItemList KFileItemModelBenchmark::createFileItemList(const QStringList& fileNames, const QString& prefix)
{
// Suppress 'file does not exist anymore' messages from KFileItemPrivate::init().
- qInstallMsgHandler(myMessageOutput);
+ qInstallMessageHandler(myMessageOutput);
KFileItemList result;
foreach (const QString& name, fileNames) {