/* SPDX-FileCopyrightText: 2014 Martin Gräßlin SPDX-License-Identifier: GPL-2.0-or-later */ #include "../historymodel.h" #include "../historyimageitem.h" #include "../historystringitem.h" #include "../historyurlitem.h" #include #include class HistoryModelTest : public QObject { Q_OBJECT private Q_SLOTS: void testSetMaxSize(); void testInsertRemove(); void testClear(); void testIndexOf(); void testType_data(); void testType(); }; void HistoryModelTest::testSetMaxSize() { QScopedPointer history(new HistoryModel(nullptr)); QScopedPointer modelTest(new QAbstractItemModelTester(history.data())); QCOMPARE(history->rowCount(), 0); QCOMPARE(history->maxSize(), 0); // insert an item - should still be empty history->insert(QSharedPointer(new HistoryStringItem(QStringLiteral("foo")))); QCOMPARE(history->rowCount(), 0); // now it should insert again history->setMaxSize(1); QCOMPARE(history->maxSize(), 1); history->insert(QSharedPointer(new HistoryStringItem(QStringLiteral("foo")))); QCOMPARE(history->rowCount(), 1); // insert another item, foo should get removed history->insert(QSharedPointer(new HistoryStringItem(QStringLiteral("bar")))); QCOMPARE(history->rowCount(), 1); QCOMPARE(history->data(history->index(0, 0)).toString(), QLatin1String("bar")); // I don't trust the model, add more items history->setMaxSize(10); history->insert(QSharedPointer(new HistoryStringItem(QStringLiteral("foo")))); history->insert(QSharedPointer(new HistoryStringItem(QStringLiteral("foobar")))); QCOMPARE(history->rowCount(), 3); QCOMPARE(history->data(history->index(0, 0)).toString(), QLatin1String("foobar")); QCOMPARE(history->data(history->index(1, 0)).toString(), QLatin1String("foo")); QCOMPARE(history->data(history->index(2, 0)).toString(), QLatin1String("bar")); // setting to 0 should clear again history->setMaxSize(0); QCOMPARE(history->maxSize(), 0); QCOMPARE(history->rowCount(), 0); } void HistoryModelTest::testInsertRemove() { QScopedPointer history(new HistoryModel(nullptr)); QScopedPointer modelTest(new QAbstractItemModelTester(history.data())); history->setMaxSize(10); QCOMPARE(history->rowCount(), 0); const QString fooText = QStringLiteral("foo"); const QString barText = QStringLiteral("bar"); const QString fooBarText = QStringLiteral("foobar"); const QByteArray fooUuid = QCryptographicHash::hash(fooText.toUtf8(), QCryptographicHash::Sha1); const QByteArray barUuid = QCryptographicHash::hash(barText.toUtf8(), QCryptographicHash::Sha1); const QByteArray foobarUuid = QCryptographicHash::hash(fooBarText.toUtf8(), QCryptographicHash::Sha1); // let's insert a few items history->insert(QSharedPointer(new HistoryStringItem(fooText))); QModelIndex index = history->index(0, 0); QCOMPARE(index.data().toString(), fooText); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->next_uuid(), index.data(HistoryModel::UuidRole).toByteArray()); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->previous_uuid(), index.data(HistoryModel::UuidRole).toByteArray()); history->insert(QSharedPointer(new HistoryStringItem(barText))); QCOMPARE(index.data().toString(), barText); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->next_uuid(), fooUuid); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->previous_uuid(), fooUuid); index = history->indexOf(fooUuid); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->next_uuid(), barUuid); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->previous_uuid(), barUuid); history->insert(QSharedPointer(new HistoryStringItem(fooBarText))); QCOMPARE(history->data(history->index(0, 0)).toString(), fooBarText); index = history->index(0, 0); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->next_uuid(), barUuid); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->previous_uuid(), fooUuid); index = history->indexOf(fooUuid); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->next_uuid(), foobarUuid); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->previous_uuid(), barUuid); index = history->indexOf(barUuid); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->next_uuid(), fooUuid); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->previous_uuid(), foobarUuid); // insert one again - it should be moved to top history->insert(QSharedPointer(new HistoryStringItem(barText))); QCOMPARE(history->data(history->index(0, 0)).toString(), barText); index = history->index(0, 0); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->next_uuid(), foobarUuid); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->previous_uuid(), fooUuid); index = history->indexOf(fooUuid); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->next_uuid(), barUuid); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->previous_uuid(), foobarUuid); index = history->indexOf(foobarUuid); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->next_uuid(), fooUuid); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->previous_uuid(), barUuid); // move one to top using the slot // already on top, shouldn't change anything history->moveToTop(barUuid); QCOMPARE(history->data(history->index(0, 0)).toString(), barText); index = history->index(0, 0); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->next_uuid(), foobarUuid); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->previous_uuid(), fooUuid); index = history->indexOf(fooUuid); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->next_uuid(), barUuid); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->previous_uuid(), foobarUuid); index = history->indexOf(foobarUuid); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->next_uuid(), fooUuid); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->previous_uuid(), barUuid); // another one should change, though history->moveToTop(foobarUuid); QCOMPARE(history->data(history->index(0, 0)).toString(), fooBarText); index = history->index(0, 0); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->next_uuid(), barUuid); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->previous_uuid(), fooUuid); index = history->indexOf(fooUuid); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->next_uuid(), foobarUuid); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->previous_uuid(), barUuid); index = history->indexOf(barUuid); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->next_uuid(), fooUuid); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->previous_uuid(), foobarUuid); // remove them again QVERIFY(history->remove(foobarUuid)); QCOMPARE(history->data(history->index(0, 0)).toString(), barText); index = history->index(0, 0); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->next_uuid(), fooUuid); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->previous_uuid(), fooUuid); index = history->indexOf(fooUuid); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->next_uuid(), barUuid); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->previous_uuid(), barUuid); QVERIFY(history->remove(barUuid)); QCOMPARE(history->data(history->index(0, 0)).toString(), fooText); index = history->index(0, 0); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->next_uuid(), index.data(HistoryModel::UuidRole).toByteArray()); QCOMPARE(index.data(HistoryModel::HistoryItemConstPtrRole).value()->previous_uuid(), index.data(HistoryModel::UuidRole).toByteArray()); QVERIFY(history->remove(fooUuid)); QCOMPARE(history->rowCount(), 0); } void HistoryModelTest::testClear() { QScopedPointer history(new HistoryModel(nullptr)); QScopedPointer modelTest(new QAbstractItemModelTester(history.data())); history->setMaxSize(10); QCOMPARE(history->rowCount(), 0); history->clear(); QCOMPARE(history->rowCount(), 0); // insert some items history->insert(QSharedPointer(new HistoryStringItem(QStringLiteral("foo")))); history->insert(QSharedPointer(new HistoryStringItem(QStringLiteral("bar")))); history->insert(QSharedPointer(new HistoryStringItem(QStringLiteral("foobar")))); history->moveToTop(QCryptographicHash::hash(QByteArrayLiteral("bar"), QCryptographicHash::Sha1)); QCOMPARE(history->rowCount(), 3); // and clear history->clear(); QCOMPARE(history->rowCount(), 0); } void HistoryModelTest::testIndexOf() { QScopedPointer history(new HistoryModel(nullptr)); QScopedPointer modelTest(new QAbstractItemModelTester(history.data())); history->setMaxSize(10); QCOMPARE(history->rowCount(), 0); QVERIFY(!history->indexOf(QByteArrayLiteral("whatever")).isValid()); QVERIFY(!history->indexOf(QByteArray()).isValid()); // insert some items history->insert(QSharedPointer(new HistoryStringItem(QStringLiteral("foo")))); QVERIFY(!history->indexOf(QByteArrayLiteral("whatever")).isValid()); QVERIFY(!history->indexOf(QByteArray()).isValid()); const QByteArray fooUuid = QCryptographicHash::hash(QByteArrayLiteral("foo"), QCryptographicHash::Sha1); QVERIFY(history->indexOf(fooUuid).isValid()); QCOMPARE(history->indexOf(fooUuid).data(HistoryModel::UuidRole).toByteArray(), fooUuid); history->clear(); QVERIFY(!history->indexOf(fooUuid).isValid()); } void HistoryModelTest::testType_data() { QTest::addColumn("item"); QTest::addColumn("expectedType"); HistoryItem *item = new HistoryStringItem(QStringLiteral("foo")); QTest::newRow("text") << item << HistoryItemType::Text; item = new HistoryImageItem(QPixmap()); QTest::newRow("image") << item << HistoryItemType::Image; item = new HistoryURLItem(QList(), KUrlMimeData::MetaDataMap(), false); QTest::newRow("url") << item << HistoryItemType::Url; } void HistoryModelTest::testType() { QScopedPointer history(new HistoryModel(nullptr)); QScopedPointer modelTest(new QAbstractItemModelTester(history.data())); history->setMaxSize(10); QCOMPARE(history->rowCount(), 0); QFETCH(HistoryItem *, item); QFETCH(HistoryItemType, expectedType); history->insert(QSharedPointer(item)); QCOMPARE(history->index(0).data(HistoryModel::TypeRole).value(), expectedType); } QTEST_MAIN(HistoryModelTest) #include "historymodeltest.moc"