mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
348 lines
13 KiB
348 lines
13 KiB
/* |
|
SPDX-FileCopyrightText: 2014 Martin Gräßlin <[email protected]> |
|
|
|
SPDX-License-Identifier: GPL-2.0-or-later |
|
*/ |
|
|
|
#include "../history.h" |
|
#include "../historystringitem.h" |
|
// Qt |
|
#include <QObject> |
|
#include <QSignalSpy> |
|
#include <QtTest> |
|
|
|
class HistoryTest : public QObject |
|
{ |
|
Q_OBJECT |
|
private Q_SLOTS: |
|
void testSetMaxSize(); |
|
void testInsertRemove(); |
|
void testClear(); |
|
void testFind(); |
|
void testCycle(); |
|
}; |
|
|
|
void HistoryTest::testSetMaxSize() |
|
{ |
|
QScopedPointer<History> history(new History(nullptr)); |
|
QSignalSpy changedSpy(history.data(), &History::changed); |
|
QSignalSpy topSpy(history.data(), &History::topChanged); |
|
QVERIFY(history->empty()); |
|
QCOMPARE(history->maxSize(), 0u); |
|
QVERIFY(changedSpy.isEmpty()); |
|
QVERIFY(topSpy.isEmpty()); |
|
|
|
// insert an item - should still be empty |
|
history->insert(HistoryItemPtr(new HistoryStringItem(QStringLiteral("foo")))); |
|
QVERIFY(history->empty()); |
|
QVERIFY(changedSpy.isEmpty()); |
|
QVERIFY(topSpy.isEmpty()); |
|
|
|
// now it should insert again |
|
history->setMaxSize(1); |
|
QCOMPARE(history->maxSize(), 1u); |
|
history->insert(HistoryItemPtr(new HistoryStringItem(QStringLiteral("foo")))); |
|
QVERIFY(!history->empty()); |
|
QCOMPARE(changedSpy.size(), 1); |
|
changedSpy.clear(); |
|
QVERIFY(changedSpy.isEmpty()); |
|
QCOMPARE(topSpy.size(), 1); |
|
topSpy.clear(); |
|
QVERIFY(topSpy.isEmpty()); |
|
|
|
// insert another item, foo should get removed |
|
history->insert(HistoryItemPtr(new HistoryStringItem(QStringLiteral("bar")))); |
|
QCOMPARE(history->first()->text(), QLatin1String("bar")); |
|
QCOMPARE(history->first()->next_uuid(), history->first()->uuid()); |
|
QEXPECT_FAIL("", "Item is first inserted, then removed, changed signal gets emitted, although not changed", Continue); |
|
QCOMPARE(topSpy.size(), 1); |
|
topSpy.clear(); |
|
QVERIFY(topSpy.isEmpty()); |
|
// two changed events - once added, once removed |
|
QCOMPARE(changedSpy.size(), 2); |
|
changedSpy.clear(); |
|
QVERIFY(changedSpy.isEmpty()); |
|
|
|
// setting to 0 should clear again |
|
history->setMaxSize(0); |
|
QCOMPARE(history->maxSize(), 0u); |
|
QVERIFY(history->empty()); |
|
QCOMPARE(changedSpy.size(), 1); |
|
QCOMPARE(topSpy.size(), 1); |
|
} |
|
|
|
void HistoryTest::testInsertRemove() |
|
{ |
|
QScopedPointer<History> history(new History(nullptr)); |
|
QSignalSpy topSpy(history.data(), &History::topChanged); |
|
QSignalSpy topUserSelectedSpy(history.data(), &History::topIsUserSelectedSet); |
|
|
|
history->setMaxSize(10); |
|
QVERIFY(history->empty()); |
|
QVERIFY(!history->topIsUserSelected()); |
|
|
|
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(HistoryItemPtr(new HistoryStringItem(fooText))); |
|
QVERIFY(!history->topIsUserSelected()); |
|
QCOMPARE(history->first()->text(), fooText); |
|
QCOMPARE(history->first()->next_uuid(), history->first()->uuid()); |
|
QCOMPARE(history->first()->previous_uuid(), history->first()->uuid()); |
|
QCOMPARE(topSpy.size(), 1); |
|
topSpy.clear(); |
|
QVERIFY(topSpy.isEmpty()); |
|
|
|
history->insert(HistoryItemPtr(new HistoryStringItem(barText))); |
|
QVERIFY(!history->topIsUserSelected()); |
|
QCOMPARE(history->first()->text(), barText); |
|
QCOMPARE(history->first()->next_uuid(), fooUuid); |
|
QCOMPARE(history->first()->previous_uuid(), fooUuid); |
|
QCOMPARE(history->find(fooUuid)->next_uuid(), barUuid); |
|
QCOMPARE(history->find(fooUuid)->previous_uuid(), barUuid); |
|
QCOMPARE(topSpy.size(), 1); |
|
topSpy.clear(); |
|
QVERIFY(topSpy.isEmpty()); |
|
|
|
history->insert(HistoryItemPtr(new HistoryStringItem(fooBarText))); |
|
QVERIFY(!history->topIsUserSelected()); |
|
QCOMPARE(history->first()->text(), fooBarText); |
|
QCOMPARE(history->first()->next_uuid(), barUuid); |
|
QCOMPARE(history->first()->previous_uuid(), fooUuid); |
|
QCOMPARE(history->find(fooUuid)->next_uuid(), foobarUuid); |
|
QCOMPARE(history->find(fooUuid)->previous_uuid(), barUuid); |
|
QCOMPARE(history->find(barUuid)->next_uuid(), fooUuid); |
|
QCOMPARE(history->find(barUuid)->previous_uuid(), foobarUuid); |
|
QCOMPARE(topSpy.size(), 1); |
|
topSpy.clear(); |
|
QVERIFY(topSpy.isEmpty()); |
|
|
|
// insert one again - it should be moved to top |
|
history->insert(HistoryItemPtr(new HistoryStringItem(barText))); |
|
QVERIFY(!history->topIsUserSelected()); |
|
QCOMPARE(history->first()->text(), barText); |
|
QCOMPARE(history->first()->next_uuid(), foobarUuid); |
|
QCOMPARE(history->first()->previous_uuid(), fooUuid); |
|
QCOMPARE(history->find(fooUuid)->next_uuid(), barUuid); |
|
QCOMPARE(history->find(fooUuid)->previous_uuid(), foobarUuid); |
|
QCOMPARE(history->find(foobarUuid)->next_uuid(), fooUuid); |
|
QCOMPARE(history->find(foobarUuid)->previous_uuid(), barUuid); |
|
QCOMPARE(topSpy.size(), 1); |
|
topSpy.clear(); |
|
QVERIFY(topSpy.isEmpty()); |
|
|
|
// move one to top using the slot |
|
// as well as the top changing, topIsUserSelected will also be signalled to show that it got re-selected |
|
history->slotMoveToTop(barUuid); |
|
QVERIFY(history->topIsUserSelected()); |
|
QCOMPARE(history->first()->text(), barText); |
|
QCOMPARE(history->first()->next_uuid(), foobarUuid); |
|
QCOMPARE(history->first()->previous_uuid(), fooUuid); |
|
QCOMPARE(history->find(fooUuid)->next_uuid(), barUuid); |
|
QCOMPARE(history->find(fooUuid)->previous_uuid(), foobarUuid); |
|
QCOMPARE(history->find(foobarUuid)->next_uuid(), fooUuid); |
|
QCOMPARE(history->find(foobarUuid)->previous_uuid(), barUuid); |
|
QCOMPARE(topSpy.size(), 1); |
|
topSpy.clear(); |
|
QVERIFY(topSpy.isEmpty()); |
|
QCOMPARE(topUserSelectedSpy.size(), 1); |
|
topUserSelectedSpy.clear(); |
|
QVERIFY(topUserSelectedSpy.isEmpty()); |
|
|
|
// another one should change, though |
|
history->slotMoveToTop(foobarUuid); |
|
QVERIFY(history->topIsUserSelected()); |
|
QCOMPARE(history->first()->text(), fooBarText); |
|
QCOMPARE(history->first()->next_uuid(), barUuid); |
|
QCOMPARE(history->first()->previous_uuid(), fooUuid); |
|
QCOMPARE(history->find(fooUuid)->next_uuid(), foobarUuid); |
|
QCOMPARE(history->find(fooUuid)->previous_uuid(), barUuid); |
|
QCOMPARE(history->find(barUuid)->next_uuid(), fooUuid); |
|
QCOMPARE(history->find(barUuid)->previous_uuid(), foobarUuid); |
|
QCOMPARE(topSpy.size(), 1); |
|
topSpy.clear(); |
|
QVERIFY(topSpy.isEmpty()); |
|
|
|
// remove them again |
|
history->remove(history->find(foobarUuid)); |
|
QVERIFY(!history->topIsUserSelected()); |
|
QCOMPARE(history->first()->text(), barText); |
|
QCOMPARE(history->first()->next_uuid(), fooUuid); |
|
QCOMPARE(history->first()->previous_uuid(), fooUuid); |
|
QCOMPARE(history->find(fooUuid)->next_uuid(), barUuid); |
|
QCOMPARE(history->find(fooUuid)->previous_uuid(), barUuid); |
|
QCOMPARE(topSpy.size(), 1); |
|
topSpy.clear(); |
|
QVERIFY(topSpy.isEmpty()); |
|
|
|
history->remove(history->find(barUuid)); |
|
QVERIFY(!history->topIsUserSelected()); |
|
QCOMPARE(history->first()->text(), fooText); |
|
QCOMPARE(history->first()->next_uuid(), history->first()->uuid()); |
|
QCOMPARE(history->first()->previous_uuid(), history->first()->uuid()); |
|
QCOMPARE(topSpy.size(), 1); |
|
topSpy.clear(); |
|
QVERIFY(topSpy.isEmpty()); |
|
|
|
history->remove(history->find(fooUuid)); |
|
QVERIFY(!history->topIsUserSelected()); |
|
QVERIFY(!history->first()); |
|
QVERIFY(history->empty()); |
|
QCOMPARE(topSpy.size(), 1); |
|
} |
|
|
|
void HistoryTest::testClear() |
|
{ |
|
QScopedPointer<History> history(new History(nullptr)); |
|
history->setMaxSize(10); |
|
QVERIFY(history->empty()); |
|
QVERIFY(!history->topIsUserSelected()); |
|
|
|
history->slotClear(); |
|
QVERIFY(history->empty()); |
|
|
|
// insert some items |
|
history->insert(HistoryItemPtr(new HistoryStringItem(QStringLiteral("foo")))); |
|
history->insert(HistoryItemPtr(new HistoryStringItem(QStringLiteral("bar")))); |
|
history->insert(HistoryItemPtr(new HistoryStringItem(QStringLiteral("foobar")))); |
|
history->slotMoveToTop(QCryptographicHash::hash(QByteArrayLiteral("bar"), QCryptographicHash::Sha1)); |
|
QVERIFY(!history->empty()); |
|
QVERIFY(history->topIsUserSelected()); |
|
QVERIFY(history->first()); |
|
|
|
// and clear |
|
QSignalSpy topSpy(history.data(), &History::topChanged); |
|
QVERIFY(topSpy.isEmpty()); |
|
history->slotClear(); |
|
QVERIFY(history->empty()); |
|
QVERIFY(!history->first()); |
|
QVERIFY(!history->topIsUserSelected()); |
|
QVERIFY(!topSpy.isEmpty()); |
|
} |
|
|
|
void HistoryTest::testFind() |
|
{ |
|
QScopedPointer<History> history(new History(nullptr)); |
|
history->setMaxSize(10); |
|
QVERIFY(history->empty()); |
|
QVERIFY(!history->find(QByteArrayLiteral("whatever"))); |
|
QVERIFY(!history->find(QByteArray())); |
|
|
|
// insert some items |
|
history->insert(HistoryItemPtr(new HistoryStringItem(QStringLiteral("foo")))); |
|
QVERIFY(!history->find(QByteArrayLiteral("whatever"))); |
|
QVERIFY(!history->find(QByteArray())); |
|
const QByteArray fooUuid = QCryptographicHash::hash(QByteArrayLiteral("foo"), QCryptographicHash::Sha1); |
|
QCOMPARE(history->find(fooUuid)->uuid(), fooUuid); |
|
|
|
history->slotClear(); |
|
QVERIFY(!history->find(fooUuid)); |
|
} |
|
|
|
void HistoryTest::testCycle() |
|
{ |
|
QScopedPointer<History> history(new History(nullptr)); |
|
QSignalSpy topSpy(history.data(), &History::topChanged); |
|
history->setMaxSize(10); |
|
QVERIFY(!history->nextInCycle()); |
|
QVERIFY(!history->prevInCycle()); |
|
|
|
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); |
|
|
|
history->insert(HistoryItemPtr(new HistoryStringItem(fooText))); |
|
QCOMPARE(topSpy.size(), 1); |
|
topSpy.clear(); |
|
QVERIFY(!history->nextInCycle()); |
|
QVERIFY(!history->prevInCycle()); |
|
// cycling to next shouldn't change anything |
|
history->cycleNext(); |
|
QVERIFY(topSpy.isEmpty()); |
|
QVERIFY(!history->nextInCycle()); |
|
QVERIFY(!history->prevInCycle()); |
|
// cycling to previous shouldn't change anything |
|
history->cyclePrev(); |
|
QVERIFY(topSpy.isEmpty()); |
|
QVERIFY(!history->nextInCycle()); |
|
QVERIFY(!history->prevInCycle()); |
|
|
|
// insert more items |
|
history->insert(HistoryItemPtr(new HistoryStringItem(barText))); |
|
QCOMPARE(topSpy.size(), 1); |
|
topSpy.clear(); |
|
QCOMPARE(history->nextInCycle(), history->find(fooUuid)); |
|
QVERIFY(!history->prevInCycle()); |
|
// cycle to next |
|
history->cycleNext(); |
|
QCOMPARE(topSpy.size(), 1); |
|
topSpy.clear(); |
|
QCOMPARE(history->first(), history->find(fooUuid)); |
|
QVERIFY(!history->nextInCycle()); |
|
QCOMPARE(history->prevInCycle(), history->find(barUuid)); |
|
// there are no more next |
|
history->cycleNext(); |
|
QVERIFY(topSpy.isEmpty()); |
|
// cycle to prev should restore previous state |
|
history->cyclePrev(); |
|
QCOMPARE(topSpy.size(), 1); |
|
topSpy.clear(); |
|
QCOMPARE(history->first(), history->find(barUuid)); |
|
QCOMPARE(history->nextInCycle(), history->find(fooUuid)); |
|
QVERIFY(!history->prevInCycle()); |
|
// there are no more prev |
|
history->cyclePrev(); |
|
QVERIFY(topSpy.isEmpty()); |
|
|
|
// insert a third item |
|
history->insert(HistoryItemPtr(new HistoryStringItem(fooBarText))); |
|
QCOMPARE(topSpy.size(), 1); |
|
topSpy.clear(); |
|
QCOMPARE(history->nextInCycle(), history->find(barUuid)); |
|
QVERIFY(!history->prevInCycle()); |
|
// cycle to next |
|
history->cycleNext(); |
|
QCOMPARE(topSpy.size(), 1); |
|
topSpy.clear(); |
|
QCOMPARE(history->first(), history->find(barUuid)); |
|
QCOMPARE(history->nextInCycle(), history->find(fooUuid)); |
|
QCOMPARE(history->prevInCycle(), history->find(foobarUuid)); |
|
// cycle to next (should be last) |
|
history->cycleNext(); |
|
QCOMPARE(topSpy.size(), 1); |
|
topSpy.clear(); |
|
QCOMPARE(history->first(), history->find(fooUuid)); |
|
QVERIFY(!history->nextInCycle()); |
|
QCOMPARE(history->prevInCycle(), history->find(barUuid)); |
|
// there are no more next |
|
history->cycleNext(); |
|
QVERIFY(topSpy.isEmpty()); |
|
// and back again |
|
history->cyclePrev(); |
|
QCOMPARE(topSpy.size(), 1); |
|
topSpy.clear(); |
|
QCOMPARE(history->first(), history->find(barUuid)); |
|
QCOMPARE(history->nextInCycle(), history->find(fooUuid)); |
|
QCOMPARE(history->prevInCycle(), history->find(foobarUuid)); |
|
// one more |
|
history->cyclePrev(); |
|
QCOMPARE(topSpy.size(), 1); |
|
topSpy.clear(); |
|
QCOMPARE(history->first(), history->find(foobarUuid)); |
|
QCOMPARE(history->nextInCycle(), history->find(barUuid)); |
|
QVERIFY(!history->prevInCycle()); |
|
// there are no more prev |
|
history->cyclePrev(); |
|
QVERIFY(topSpy.isEmpty()); |
|
} |
|
|
|
QTEST_MAIN(HistoryTest) |
|
#include "historytest.moc"
|
|
|