┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/tests/kitemrangetest.cpp
diff options
context:
space:
mode:
authorFrank Reininghaus <[email protected]>2014-06-04 21:48:19 +0200
committerFrank Reininghaus <[email protected]>2014-06-04 21:49:02 +0200
commit352f6441590a050099ee685b2284d1679f733c97 (patch)
treee9547883bc442b94569496931b3e22b5c0689fa7 /src/tests/kitemrangetest.cpp
parent96c34cfe650cef24bcfd6cfa6977c3b0ccb77281 (diff)
Fix possible crash if a kioslave adds multiple items with the same URL
When opening the URL "man:", there are multiple items with the same name (for example, _exit is shown twice here). When opening a new tab, the kioslave reports some items as deleted (I have not quite understood why). The problem is that it reports some of the duplicate items twice in the list of deleted items. This confused KFileItemModel and corrupted the internal data structures, and finally, caused a crash. The fix is to remove all duplicates from KItemRangeList::fromSortedContainer(const Container& container). New unit tests included. BUG: 335672 REVIEW: 118507 FIXED-IN: 4.13.2
Diffstat (limited to 'src/tests/kitemrangetest.cpp')
-rw-r--r--src/tests/kitemrangetest.cpp75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/tests/kitemrangetest.cpp b/src/tests/kitemrangetest.cpp
new file mode 100644
index 000000000..9f3f79980
--- /dev/null
+++ b/src/tests/kitemrangetest.cpp
@@ -0,0 +1,75 @@
+/***************************************************************************
+ * Copyright (C) 2014 by Frank Reininghaus <[email protected]> *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
+ ***************************************************************************/
+
+#include <qtest_kde.h>
+
+#include "kitemviews/kitemrange.h"
+
+#include <QVector>
+
+Q_DECLARE_METATYPE(QVector<int>);
+Q_DECLARE_METATYPE(KItemRangeList);
+
+class KItemRangeTest : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void testFromSortedContainer_data();
+ void testFromSortedContainer();
+};
+
+void KItemRangeTest::testFromSortedContainer_data()
+{
+ QTest::addColumn<QVector<int> >("sortedNumbers");
+ QTest::addColumn<KItemRangeList>("expected");
+
+ QTest::newRow("empty") << QVector<int>() << KItemRangeList();
+ QTest::newRow("[1]") << (QVector<int>() << 1) << (KItemRangeList() << KItemRange(1, 1));
+ QTest::newRow("[9]") << (QVector<int>() << 9) << (KItemRangeList() << KItemRange(9, 1));
+ QTest::newRow("[1-2]") << (QVector<int>() << 1 << 2) << (KItemRangeList() << KItemRange(1, 2));
+ QTest::newRow("[1-3]") << (QVector<int>() << 1 << 2 << 3) << (KItemRangeList() << KItemRange(1, 3));
+ QTest::newRow("[1] [4]") << (QVector<int>() << 1 << 4) << (KItemRangeList() << KItemRange(1, 1) << KItemRange(4, 1));
+ QTest::newRow("[1-3] [5]") << (QVector<int>() << 1 << 2 << 3 << 5) << (KItemRangeList() << KItemRange(1, 3) << KItemRange(5, 1));
+ QTest::newRow("[1] [5-6]") << (QVector<int>() << 1 << 5 << 6) << (KItemRangeList() << KItemRange(1, 1) << KItemRange(5, 2));
+ QTest::newRow("duplicates: 1 1") << (QVector<int>() << 1 << 1) << (KItemRangeList() << KItemRange(1, 1));
+ QTest::newRow("duplicates: 1 1 1") << (QVector<int>() << 1 << 1 << 1) << (KItemRangeList() << KItemRange(1, 1));
+ QTest::newRow("duplicates: 1 1 5") << (QVector<int>() << 1 << 1 << 5) << (KItemRangeList() << KItemRange(1, 1) << KItemRange(5, 1));
+ QTest::newRow("duplicates: 1 5 5") << (QVector<int>() << 1 << 5 << 5) << (KItemRangeList() << KItemRange(1, 1) << KItemRange(5, 1));
+ QTest::newRow("duplicates: 1 1 1 5") << (QVector<int>() << 1 << 1 << 1 << 5) << (KItemRangeList() << KItemRange(1, 1) << KItemRange(5, 1));
+ QTest::newRow("duplicates: 1 5 5 5") << (QVector<int>() << 1 << 5 << 5 << 5) << (KItemRangeList() << KItemRange(1, 1) << KItemRange(5, 1));
+ QTest::newRow("duplicates: 1 1 2") << (QVector<int>() << 1 << 1 << 2) << (KItemRangeList() << KItemRange(1, 2));
+ QTest::newRow("duplicates: 1 2 2") << (QVector<int>() << 1 << 2 << 2) << (KItemRangeList() << KItemRange(1, 2));
+ QTest::newRow("duplicates: 1 1 2 3") << (QVector<int>() << 1 << 1 << 2 << 3) << (KItemRangeList() << KItemRange(1, 3));
+ QTest::newRow("duplicates: 1 2 2 3") << (QVector<int>() << 1 << 2 << 2 << 3) << (KItemRangeList() << KItemRange(1, 3));
+ QTest::newRow("duplicates: 1 2 3 3") << (QVector<int>() << 1 << 2 << 3 << 3) << (KItemRangeList() << KItemRange(1, 3));
+}
+
+void KItemRangeTest::testFromSortedContainer()
+{
+ QFETCH(QVector<int>, sortedNumbers);
+ QFETCH(KItemRangeList, expected);
+
+ const KItemRangeList result = KItemRangeList::fromSortedContainer(sortedNumbers);
+ QCOMPARE(expected, result);
+}
+
+QTEST_KDEMAIN(KItemRangeTest, NoGUI)
+
+#include "kitemrangetest.moc"