]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/tests/kfileitemmodelbenchmark.cpp
make use of initializer lists
[dolphin.git] / src / tests / kfileitemmodelbenchmark.cpp
index 7017863ab177636df5484d7bd3e0270ddfc29eb7..43d7173de60662356de94ac53cb60cabf0254800 100644 (file)
  *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA            *
  ***************************************************************************/
 
-#include <qtest_kde.h>
-
-#include <KGlobalSettings>
-
+#include <qtest.h>
+#include <QSignalSpy>
 #include "kitemviews/kfileitemmodel.h"
 #include "kitemviews/private/kfileitemmodelsortalgorithm.h"
 
+#include "testdir.h"
+
+#include <KRandomSequence>
+
 void myMessageOutput(QtMsgType type, const char* msg)
 {
     switch (type) {
@@ -43,6 +45,10 @@ void myMessageOutput(QtMsgType type, const char* msg)
     }
 }
 
+namespace {
+    const int DefaultTimeout = 5000;
+};
+
 Q_DECLARE_METATYPE(KFileItemList)
 Q_DECLARE_METATYPE(KItemRangeList)
 
@@ -56,6 +62,7 @@ public:
 private slots:
     void insertAndRemoveManyItems_data();
     void insertAndRemoveManyItems();
+    void insertManyChildItems();
 
 private:
     static KFileItemList createFileItemList(const QStringList& fileNames, const QString& urlPrefix = QLatin1String("file:///"));
@@ -160,25 +167,25 @@ void KFileItemModelBenchmark::insertAndRemoveManyItems()
     // Avoid overhead caused by natural sorting
     // and determining the isDir/isLink roles.
     model.m_naturalSorting = false;
-    model.setRoles(QSet<QByteArray>() << "text");
+    model.setRoles({"text"});
 
     QSignalSpy spyItemsInserted(&model, SIGNAL(itemsInserted(KItemRangeList)));
     QSignalSpy spyItemsRemoved(&model, SIGNAL(itemsRemoved(KItemRangeList)));
 
     QBENCHMARK {
         model.slotClear();
-        model.slotNewItems(initialItems);
+        model.slotItemsAdded(model.directory(), initialItems);
         model.slotCompleted();
         QCOMPARE(model.count(), initialItems.count());
 
         if (!newItems.isEmpty()) {
-            model.slotNewItems(newItems);
+            model.slotItemsAdded(model.directory(), newItems);
             model.slotCompleted();
         }
         QCOMPARE(model.count(), initialItems.count() + newItems.count());
 
         if (!removedItems.isEmpty()) {
-            model.removeItems(removedItems);
+            model.slotItemsDeleted(removedItems);
         }
         QCOMPARE(model.count(), initialItems.count() + newItems.count() - removedItems.count());
     }
@@ -202,6 +209,112 @@ void KFileItemModelBenchmark::insertAndRemoveManyItems()
     }
 }
 
+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.
+    KRandomSequence randomSequence(0);
+    randomSequence.randomize(newItems);
+
+    // 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().
@@ -209,13 +322,12 @@ KFileItemList KFileItemModelBenchmark::createFileItemList(const QStringList& fil
 
     KFileItemList result;
     foreach (const QString& name, fileNames) {
-        const KUrl url(prefix + name);
-        const KFileItem item(url, QString(), KFileItem::Unknown);
+        const KFileItem item(QUrl::fromLocalFile(prefix + name), QString(), KFileItem::Unknown);
         result << item;
     }
     return result;
 }
 
-QTEST_KDEMAIN(KFileItemModelBenchmark, NoGUI)
+QTEST_MAIN(KFileItemModelBenchmark)
 
 #include "kfileitemmodelbenchmark.moc"