friend class KFileItemModelSortAlgorithm; // Accesses lessThan() method
friend class KFileItemModelRolesUpdater; // Accesses emitSortProgress() method
- friend class KFileItemModelTest; // For unit testing (accesses m_dirLister)
- friend class KFileItemListViewTest; // For unit testing (accesses m_dirLister)
+ friend class KFileItemModelTest; // For unit testing
+ friend class KFileItemListViewTest; // For unit testing
};
inline bool KFileItemModel::isChildItem(int index) const
void KStandardItemModel::insertItem(int index, KStandardItem* item)
{
+ if (index < 0 || index > count() || !item) {
+ delete item;
+ return;
+ }
+
if (item && !m_indexesForItems.contains(item)) {
item->m_model = this;
m_items.insert(index, item);
void KStandardItemModel::changeItem(int index, KStandardItem* item)
{
- if (item && index >= 0 && index < count()) {
- item->m_model = this;
+ if (index < 0 || index > count() || !item) {
+ delete item;
+ return;
+ }
- QSet<QByteArray> changedRoles;
-
- KStandardItem* oldItem = m_items[index];
- const QHash<QByteArray, QVariant> oldData = oldItem->data();
- const QHash<QByteArray, QVariant> newData = item->data();
-
- // Determine which roles have been changed
- QHashIterator<QByteArray, QVariant> it(oldData);
- while (it.hasNext()) {
- it.next();
- const QByteArray role = it.key();
- const QVariant oldValue = it.value();
- if (newData.contains(role) && newData.value(role) != oldValue) {
- changedRoles.insert(role);
- }
- }
+ item->m_model = this;
- m_indexesForItems.remove(oldItem);
- delete oldItem;
- oldItem = 0;
+ QSet<QByteArray> changedRoles;
- m_items[index] = item;
- m_indexesForItems.insert(item, index);
+ KStandardItem* oldItem = m_items[index];
+ const QHash<QByteArray, QVariant> oldData = oldItem->data();
+ const QHash<QByteArray, QVariant> newData = item->data();
- onItemChanged(index, changedRoles);
- emit itemsChanged(KItemRangeList() << KItemRange(index, 1), changedRoles);
- } else {
- kWarning() << "No item available to replace on the given index" << index;
- delete item;
- item = 0;
+ // Determine which roles have been changed
+ QHashIterator<QByteArray, QVariant> it(oldData);
+ while (it.hasNext()) {
+ it.next();
+ const QByteArray role = it.key();
+ const QVariant oldValue = it.value();
+ if (newData.contains(role) && newData.value(role) != oldValue) {
+ changedRoles.insert(role);
+ }
}
+
+ m_indexesForItems.remove(oldItem);
+ delete oldItem;
+ oldItem = 0;
+
+ m_items[index] = item;
+ m_indexesForItems.insert(item, index);
+
+ onItemChanged(index, changedRoles);
+ emit itemsChanged(KItemRangeList() << KItemRange(index, 1), changedRoles);
}
void KStandardItemModel::removeItem(int index)
* Inserts the item \a item at the index \a index. If the index
* is equal to the number of items of the model, the item
* gets appended as last element. KStandardItemModel takes
- * the ownership of the item.
+ * the ownership of the item. If the index is invalid, the item
+ * gets deleted.
*/
void insertItem(int index, KStandardItem* item);
/**
* Changes the item on the index \a index to \a item.
* KStandardItemModel takes the ownership of the item. The
- * old item gets deleted.
+ * old item gets deleted. If the index is invalid, the item
+ * gets deleted.
*/
void changeItem(int index, KStandardItem* item);
QHash<const KStandardItem*, int> m_indexesForItems;
friend class KStandardItem;
+ friend class KStandardItemModelTest; // For unit testing
};
#endif
kde4_add_unit_test(dolphinsearchboxtest TEST ${dolphinsearchboxtest_SRCS})
target_link_libraries(dolphinsearchboxtest ${KDE4_KIO_LIBS} ${SOPRANO_LIBRARIES} ${NEPOMUK_LIBRARIES} ${NEPOMUK_QUERY_LIBRARIES} nepomukutils ${QT_QTTEST_LIBRARY})
endif (Nepomuk_FOUND)
+
+# KStandardItemModelTest
+set(kstandarditemmodeltest_SRCS
+ kstandarditemmodeltest.cpp
+ ../kitemviews/kstandarditem.cpp
+ ../kitemviews/kstandarditemmodel.cpp
+ ../kitemviews/kitemmodelbase.cpp
+)
+kde4_add_unit_test(kstandarditemmodeltest TEST ${kstandarditemmodeltest_SRCS})
+target_link_libraries(kstandarditemmodeltest dolphinprivate ${KDE4_KIO_LIBS} ${QT_QTTEST_LIBRARY})
+
--- /dev/null
+/***************************************************************************
+ * Copyright (C) 2011 by Peter Penz <peter.penz19@gmail.com> *
+ * Copyright (C) 2011 by Frank Reininghaus <frank78ac@googlemail.com> *
+ * *
+ * 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/kstandarditem.h"
+#include "kitemviews/kstandarditemmodel.h"
+
+class KStandardItemModelTest : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void init();
+ void cleanup();
+
+ void testNewItems();
+ void testRemoveItems();
+
+private:
+ bool isModelConsistent() const;
+
+private:
+ KStandardItemModel* m_model;
+};
+
+void KStandardItemModelTest::init()
+{
+ m_model = new KStandardItemModel();
+}
+
+void KStandardItemModelTest::cleanup()
+{
+ delete m_model;
+ m_model = 0;
+}
+
+void KStandardItemModelTest::testNewItems()
+{
+ m_model->insertItem(0, new KStandardItem("item 1"));
+ m_model->insertItem(0, new KStandardItem("item 2"));
+ m_model->insertItem(2, new KStandardItem("item 3"));
+ m_model->appendItem(new KStandardItem("item 4"));
+ m_model->insertItem(-1, new KStandardItem("invalid 1"));
+ m_model->insertItem(5, new KStandardItem("invalid 2"));
+ QCOMPARE(m_model->count(), 4);
+ QCOMPARE(m_model->item(0)->text(), QString("item 2"));
+ QCOMPARE(m_model->item(1)->text(), QString("item 1"));
+ QCOMPARE(m_model->item(2)->text(), QString("item 3"));
+ QCOMPARE(m_model->item(3)->text(), QString("item 4"));
+
+ QVERIFY(isModelConsistent());
+}
+
+void KStandardItemModelTest::testRemoveItems()
+{
+ for (int i = 1; i <= 10; ++i) {
+ m_model->appendItem(new KStandardItem("item " + QString::number(i)));
+ }
+
+ m_model->removeItem(0);
+ m_model->removeItem(3);
+ m_model->removeItem(5);
+ m_model->removeItem(-1);
+ QCOMPARE(m_model->count(), 7);
+ QCOMPARE(m_model->item(0)->text(), QString("item 2"));
+ QCOMPARE(m_model->item(1)->text(), QString("item 3"));
+ QCOMPARE(m_model->item(2)->text(), QString("item 4"));
+ QCOMPARE(m_model->item(3)->text(), QString("item 6"));
+ QCOMPARE(m_model->item(4)->text(), QString("item 7"));
+ QCOMPARE(m_model->item(5)->text(), QString("item 9"));
+ QCOMPARE(m_model->item(6)->text(), QString("item 10"));
+}
+
+bool KStandardItemModelTest::isModelConsistent() const
+{
+ if (m_model->m_items.count() != m_model->m_indexesForItems.count()) {
+ return false;
+ }
+
+ for (int i = 0; i < m_model->count(); ++i) {
+ const KStandardItem* item = m_model->item(i);
+ if (!item) {
+ qWarning() << "Item" << i << "is null";
+ return false;
+ }
+
+ const int itemIndex = m_model->index(item);
+ if (itemIndex != i) {
+ qWarning() << "Item" << i << "has a wrong index:" << itemIndex;
+ return false;
+ }
+ }
+
+ return true;
+}
+
+QTEST_KDEMAIN(KStandardItemModelTest, NoGUI)
+
+#include "kstandarditemmodeltest.moc"