From 8a6d4b06f2291c363f3dea17837ed20893852453 Mon Sep 17 00:00:00 2001 From: Markus Mittendrein Date: Wed, 9 Sep 2015 19:00:56 +0200 Subject: Cleanup repo with some directories --- .../tests/auto/ircbuffermodel/ircbuffermodel.pro | 11 + .../auto/ircbuffermodel/tst_ircbuffermodel.cpp | 1461 ++++++++++++++++++++ 2 files changed, 1472 insertions(+) create mode 100644 src/libcommuni/tests/auto/ircbuffermodel/ircbuffermodel.pro create mode 100644 src/libcommuni/tests/auto/ircbuffermodel/tst_ircbuffermodel.cpp (limited to 'src/libcommuni/tests/auto/ircbuffermodel') diff --git a/src/libcommuni/tests/auto/ircbuffermodel/ircbuffermodel.pro b/src/libcommuni/tests/auto/ircbuffermodel/ircbuffermodel.pro new file mode 100644 index 0000000..16cf4c9 --- /dev/null +++ b/src/libcommuni/tests/auto/ircbuffermodel/ircbuffermodel.pro @@ -0,0 +1,11 @@ +###################################################################### +# Communi +###################################################################### + +SOURCES += tst_ircbuffermodel.cpp + +# FakeQmlBufferModel::createXxx() +*g++*|*clang*:QMAKE_CXXFLAGS_WARN_ON += -Wno-overloaded-virtual + +include(../shared/shared.pri) +include(../auto.pri) diff --git a/src/libcommuni/tests/auto/ircbuffermodel/tst_ircbuffermodel.cpp b/src/libcommuni/tests/auto/ircbuffermodel/tst_ircbuffermodel.cpp new file mode 100644 index 0000000..60ec958 --- /dev/null +++ b/src/libcommuni/tests/auto/ircbuffermodel/tst_ircbuffermodel.cpp @@ -0,0 +1,1461 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This test is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include "ircbuffermodel.h" +#include "ircconnection.h" +#include "ircchannel.h" +#include "ircbuffer.h" +#include +#include "tst_ircclientserver.h" +#include "tst_ircdata.h" + +class tst_IrcBufferModel : public tst_IrcClientServer +{ + Q_OBJECT + +public: + tst_IrcBufferModel(); + +private slots: + void testDefaults(); + void testBufferInit(); + void testAddRemove(); + void testSorting(); + void testClear(); + void testPersistent(); + void testPrototypes(); + void testChanges(); + void testActive(); + void testRoles(); + void testAIM(); + void testQML(); + void testWarnings(); +}; + +Q_DECLARE_METATYPE(QModelIndex) +tst_IrcBufferModel::tst_IrcBufferModel() +{ + Irc::registerMetaTypes(); + qRegisterMetaType(); + qRegisterMetaType("IrcBuffer*"); + qRegisterMetaType("IrcChannel*"); + qRegisterMetaType("IrcConnection*"); + qRegisterMetaType >("QList"); + qRegisterMetaType >("QList"); +} + +void tst_IrcBufferModel::testDefaults() +{ + IrcBufferModel model; + QCOMPARE(model.count(), 0); + QVERIFY(model.isEmpty()); + QCOMPARE(model.sortOrder(), Qt::AscendingOrder); + QCOMPARE(model.sortMethod(), Irc::SortByHand); + QVERIFY(model.channels().isEmpty()); + QCOMPARE(model.displayRole(), Irc::TitleRole); + QVERIFY(!model.isPersistent()); + QVERIFY(model.buffers().isEmpty()); + QVERIFY(!model.connection()); + QVERIFY(!model.network()); + QVERIFY(model.bufferPrototype()); + QVERIFY(model.channelPrototype()); +} + +void tst_IrcBufferModel::testBufferInit() +{ + IrcBufferModel model(connection); + model.setSortMethod(Irc::SortByTitle); + IrcBuffer* buffer1 = new IrcBuffer(&model); + buffer1->setName("1"); + model.add(buffer1); + IrcBuffer* buffer2 = new IrcBuffer(&model); + buffer2->setName("2"); + model.add(buffer2); +} + +void tst_IrcBufferModel::testAddRemove() +{ + IrcBufferModel model; + + QSignalSpy countSpy(&model, SIGNAL(countChanged(int))); + QSignalSpy emptySpy(&model, SIGNAL(emptyChanged(bool))); + QSignalSpy addedSpy(&model, SIGNAL(added(IrcBuffer*))); + QSignalSpy removedSpy(&model, SIGNAL(removed(IrcBuffer*))); + QSignalSpy aboutToBeAddedSpy(&model, SIGNAL(aboutToBeAdded(IrcBuffer*))); + QSignalSpy aboutToBeRemovedSpy(&model, SIGNAL(aboutToBeRemoved(IrcBuffer*))); + QSignalSpy buffersSpy(&model, SIGNAL(buffersChanged(QList))); + QSignalSpy channelsSpy(&model, SIGNAL(channelsChanged(QStringList))); + QVERIFY(countSpy.isValid()); + QVERIFY(emptySpy.isValid()); + QVERIFY(addedSpy.isValid()); + QVERIFY(removedSpy.isValid()); + QVERIFY(aboutToBeAddedSpy.isValid()); + QVERIFY(aboutToBeRemovedSpy.isValid()); + QVERIFY(buffersSpy.isValid()); + QVERIFY(channelsSpy.isValid()); + + // IrcBuffer* IrcBufferModel::add(const QString& title) + IrcBuffer* first = model.add("first"); + QCOMPARE(model.count(), 1); + QVERIFY(!model.isEmpty()); + QCOMPARE(model.get(0), first); + QCOMPARE(model.find("first"), first); + QCOMPARE(model.buffers(), QList() << first); + QVERIFY(model.contains("first")); + QCOMPARE(model.indexOf(first), 0); + QVERIFY(model.channels().isEmpty()); + + QCOMPARE(countSpy.count(), 1); + QCOMPARE(countSpy.last().last().toInt(), 1); + QCOMPARE(emptySpy.count(), 1); + QCOMPARE(emptySpy.last().last().toBool(), false); + QCOMPARE(aboutToBeAddedSpy.count(), 1); + QCOMPARE(aboutToBeAddedSpy.last().last().value(), first); + QCOMPARE(addedSpy.count(), 1); + QCOMPARE(addedSpy.last().last().value(), first); + QCOMPARE(buffersSpy.count(), 1); + QCOMPARE(buffersSpy.last().last().value >(), QList() << first); + QCOMPARE(channelsSpy.count(), 0); + + QModelIndex firstIdx = model.index(first); + QVERIFY(firstIdx.isValid()); + QCOMPARE(firstIdx.data(Irc::NameRole).toString(), QString("first")); + QCOMPARE(firstIdx.data(Irc::TitleRole).toString(), QString("first")); + QCOMPARE(firstIdx.data(Irc::PrefixRole).toString(), QString()); + QCOMPARE(firstIdx.data(Irc::BufferRole).value(), first); + QVERIFY(!firstIdx.data(Irc::ChannelRole).value()); + + // void IrcBufferModel::add(IrcBuffer* buffer) + IrcBuffer* second = new IrcBuffer(&model); + second->setName("second"); + model.add(second); + QCOMPARE(model.count(), 2); + QVERIFY(!model.isEmpty()); + QCOMPARE(model.get(1), second); + QCOMPARE(model.find("second"), second); + QCOMPARE(model.buffers(), QList() << first << second); + QVERIFY(model.contains("second")); + QCOMPARE(model.indexOf(second), 1); + QVERIFY(model.channels().isEmpty()); + + QCOMPARE(countSpy.count(), 2); + QCOMPARE(countSpy.last().last().toInt(), 2); + QCOMPARE(emptySpy.count(), 1); + QCOMPARE(aboutToBeAddedSpy.count(), 2); + QCOMPARE(aboutToBeAddedSpy.last().last().value(), second); + QCOMPARE(addedSpy.count(), 2); + QCOMPARE(addedSpy.last().last().value(), second); + QCOMPARE(buffersSpy.count(), 2); + QCOMPARE(buffersSpy.last().last().value >(), QList() << first << second); + QCOMPARE(channelsSpy.count(), 0); + + QModelIndex secondIdx = model.index(second); + QVERIFY(secondIdx.isValid()); + QCOMPARE(secondIdx.data(Irc::NameRole).toString(), QString("second")); + QCOMPARE(secondIdx.data(Irc::TitleRole).toString(), QString("second")); + QCOMPARE(secondIdx.data(Irc::PrefixRole).toString(), QString()); + QCOMPARE(secondIdx.data(Irc::BufferRole).value(), second); + QVERIFY(!secondIdx.data(Irc::ChannelRole).value()); + + // void IrcBufferModel::remove(IrcBuffer* buffer) + model.remove(second); + QCOMPARE(model.count(), 1); + QVERIFY(!model.isEmpty()); + QVERIFY(!model.find("second")); + QCOMPARE(model.buffers(), QList() << first); + QVERIFY(!model.contains("second")); + QVERIFY(model.channels().isEmpty()); + + QCOMPARE(countSpy.count(), 3); + QCOMPARE(countSpy.last().last().toInt(), 1); + QCOMPARE(emptySpy.count(), 1); + QCOMPARE(aboutToBeRemovedSpy.count(), 1); + QCOMPARE(removedSpy.count(), 1); + QCOMPARE(buffersSpy.count(), 3); + QCOMPARE(buffersSpy.last().last().value >(), QList() << first); + QCOMPARE(channelsSpy.count(), 0); + + // void IrcBufferModel::remove(const QString& title) + model.remove("first"); + QCOMPARE(model.count(), 0); + QVERIFY(model.isEmpty()); + QVERIFY(!model.find("first")); + QVERIFY(model.buffers().isEmpty()); + QVERIFY(!model.contains("first")); + QVERIFY(model.channels().isEmpty()); + + QCOMPARE(countSpy.count(), 4); + QCOMPARE(countSpy.last().last().toInt(), 0); + QCOMPARE(emptySpy.count(), 2); + QCOMPARE(emptySpy.last().last().toBool(), true); + QCOMPARE(aboutToBeRemovedSpy.count(), 2); + QCOMPARE(removedSpy.count(), 2); + QCOMPARE(buffersSpy.count(), 4); + QCOMPARE(buffersSpy.last().last().value >(), QList()); + QCOMPARE(channelsSpy.count(), 0); +} + +void tst_IrcBufferModel::testSorting() +{ + IrcBufferModel staticModel(connection); + IrcBufferModel dynamicModel(connection); + + connection->open(); + waitForOpened(); + waitForWritten(tst_IrcData::welcome()); + + IrcBuffer* b = staticModel.add("b"); + IrcBuffer* c = staticModel.add("#c"); + IrcBuffer* a = staticModel.add("#a"); + + QList buffers = QList() << b << c << a; + QCOMPARE(staticModel.buffers(), buffers); + + // IGNORE INVALID COLUMNS + staticModel.sort(-1, Qt::AscendingOrder); + QCOMPARE(staticModel.buffers(), buffers); + + staticModel.sort(1, Qt::AscendingOrder); + QCOMPARE(staticModel.buffers(), buffers); + + // STATIC - BY NAME - ASCENDING + buffers = QList() << a << b << c; + staticModel.setSortMethod(Irc::SortByName); + staticModel.sort(0, Qt::AscendingOrder); + QCOMPARE(staticModel.buffers(), buffers); + + // STATIC - BY NAME - DESCENDING + buffers = QList() << c << b << a; + staticModel.setSortMethod(Irc::SortByName); + staticModel.sort(0, Qt::DescendingOrder); + QCOMPARE(staticModel.buffers(), buffers); + + // STATIC - BY TITLE - ASCENDING + buffers = QList() << a << c << b; + staticModel.setSortMethod(Irc::SortByTitle); + staticModel.sort(0, Qt::AscendingOrder); + QCOMPARE(staticModel.buffers(), buffers); + + // STATIC - BY TITLE - DESCENDING + buffers = QList() << b << c << a; + staticModel.setSortMethod(Irc::SortByTitle); + staticModel.sort(0, Qt::DescendingOrder); + QCOMPARE(staticModel.buffers(), buffers); + + // STATIC - BY TITLE - ASCENDING & STICKY + c->setSticky(true); + buffers = QList() << c << a << b; + staticModel.setSortMethod(Irc::SortByTitle); + staticModel.sort(0, Qt::AscendingOrder); + QCOMPARE(staticModel.buffers(), buffers); + + // STATIC - BY TITLE - ASCENDING & 2 STICKIES + b->setSticky(true); + buffers = QList() << c << b << a; + staticModel.setSortMethod(Irc::SortByTitle); + staticModel.sort(0, Qt::AscendingOrder); + QCOMPARE(staticModel.buffers(), buffers); + + b = dynamicModel.add("b"); + c = dynamicModel.add("#c"); + a = dynamicModel.add("#a"); + + // DYNAMIC - BY NAME - ASCENDING + buffers = QList() << a << b << c; + dynamicModel.setSortMethod(Irc::SortByName); + QCOMPARE(dynamicModel.buffers(), buffers); + + // DYNAMIC - BY TITLE - ASCENDING + buffers = QList() << a << c << b; + dynamicModel.setSortMethod(Irc::SortByTitle); + QCOMPARE(dynamicModel.buffers(), buffers); + + dynamicModel.setSortOrder(Qt::DescendingOrder); + + // DYNAMIC - BY NAME - DESCENDING + buffers = QList() << c << b << a; + dynamicModel.setSortMethod(Irc::SortByName); + QCOMPARE(dynamicModel.buffers(), buffers); + + // DYNAMIC - BY TITLE - DESCENDING + buffers = QList() << b << c << a; + dynamicModel.setSortMethod(Irc::SortByTitle); + QCOMPARE(dynamicModel.buffers(), buffers); + + // DO NOTHING + dynamicModel.sort(Irc::SortByHand); + QCOMPARE(dynamicModel.buffers(), buffers); +} + +void tst_IrcBufferModel::testClear() +{ + IrcBufferModel model(connection); + connection->open(); + QVERIFY(waitForOpened()); + QVERIFY(waitForWritten(tst_IrcData::welcome())); + + QPointer a = model.add("#a"); + QPointer b = model.add("#b"); + QPointer c = model.add("c"); + QPointer d = model.add("d"); + + QSignalSpy countSpy(&model, SIGNAL(countChanged(int))); + QSignalSpy buffersSpy(&model, SIGNAL(buffersChanged(QList))); + QSignalSpy channelsSpy(&model, SIGNAL(channelsChanged(QStringList))); + QSignalSpy modelAboutToBeResetSpy(&model, SIGNAL(modelAboutToBeReset())); + QSignalSpy modelResetSpy(&model, SIGNAL(modelReset())); + + QVERIFY(countSpy.isValid()); + QVERIFY(buffersSpy.isValid()); + QVERIFY(channelsSpy.isValid()); + QVERIFY(modelAboutToBeResetSpy.isValid()); + QVERIFY(modelResetSpy.isValid()); + + b->setPersistent(true); + d->setPersistent(true); + + // #a, #b*, c, d* + model.clear(); + + QCOMPARE(model.count(), 2); + QCOMPARE(model.buffers(), QList() << b << d); + QCOMPARE(model.channels(), QStringList() << "#b"); + + QCOMPARE(model.get(0), b.data()); + QCOMPARE(model.get(1), d.data()); + QVERIFY(!model.get(2)); + QVERIFY(!model.find("#a")); + QVERIFY(model.find("#b")); + QVERIFY(!model.find("c")); + QVERIFY(model.find("d")); + QVERIFY(!model.contains("#a")); + QVERIFY(model.contains("#b")); + QVERIFY(!model.contains("c")); + QVERIFY(model.contains("d")); + + QVERIFY(!a); + QVERIFY(b); + QVERIFY(!c); + QVERIFY(d); + + QCOMPARE(countSpy.count(), 1); + QCOMPARE(countSpy.last().at(0).toInt(), 2); + + QCOMPARE(buffersSpy.count(), 1); + QCOMPARE(buffersSpy.last().at(0).value >(), QList() << b << d); + + QCOMPARE(channelsSpy.count(), 1); + QCOMPARE(channelsSpy.last().at(0).toStringList(), QStringList() << "#b"); + + QCOMPARE(modelAboutToBeResetSpy.count(), 1); + QCOMPARE(modelResetSpy.count(), 1); + + b->setPersistent(false); + + countSpy.clear(); + buffersSpy.clear(); + channelsSpy.clear(); + modelAboutToBeResetSpy.clear(); + modelResetSpy.clear(); + + // #b, d* + model.clear(); + + QCOMPARE(model.count(), 1); + QCOMPARE(model.buffers(), QList() << d); + QCOMPARE(model.channels(), QStringList()); + + QCOMPARE(model.get(0), d.data()); + QVERIFY(!model.get(1)); + QVERIFY(!model.find("#b")); + QVERIFY(model.find("d")); + QVERIFY(!model.contains("#b")); + QVERIFY(model.contains("d")); + + QVERIFY(!b); + QVERIFY(d); + + QCOMPARE(countSpy.count(), 1); + QCOMPARE(countSpy.last().at(0).toInt(), 1); + + QCOMPARE(buffersSpy.count(), 1); + QCOMPARE(buffersSpy.last().at(0).value >(), QList() << d); + + QCOMPARE(channelsSpy.count(), 1); + QCOMPARE(channelsSpy.last().at(0).toStringList(), QStringList()); + + QCOMPARE(modelAboutToBeResetSpy.count(), 1); + QCOMPARE(modelResetSpy.count(), 1); + + d->setPersistent(false); + + countSpy.clear(); + buffersSpy.clear(); + channelsSpy.clear(); + modelAboutToBeResetSpy.clear(); + modelResetSpy.clear(); + + // d + model.clear(); + + QCOMPARE(model.count(), 0); + QCOMPARE(model.buffers(), QList()); + QCOMPARE(model.channels(), QStringList()); + + QVERIFY(!model.get(0)); + QVERIFY(!model.find("d")); + QVERIFY(!model.contains("d")); + + QVERIFY(!d); + + QCOMPARE(countSpy.count(), 1); + QCOMPARE(countSpy.last().at(0).toInt(), 0); + + QCOMPARE(buffersSpy.count(), 1); + QCOMPARE(buffersSpy.last().at(0).value >(), QList()); + + QCOMPARE(channelsSpy.count(), 0); + + QCOMPARE(modelAboutToBeResetSpy.count(), 1); + QCOMPARE(modelResetSpy.count(), 1); + + countSpy.clear(); + buffersSpy.clear(); + channelsSpy.clear(); + modelAboutToBeResetSpy.clear(); + modelResetSpy.clear(); + + // + model.clear(); + + QCOMPARE(countSpy.count(), 0); + QCOMPARE(buffersSpy.count(), 0); + QCOMPARE(channelsSpy.count(), 0); + QCOMPARE(modelAboutToBeResetSpy.count(), 0); + QCOMPARE(modelResetSpy.count(), 0); + + QPointer e = model.add("e"); + QPointer f = model.add("f"); + + e->setPersistent(true); + f->setPersistent(true); + + countSpy.clear(); + buffersSpy.clear(); + channelsSpy.clear(); + modelAboutToBeResetSpy.clear(); + modelResetSpy.clear(); + + // e*, f* + model.clear(); + + QVERIFY(e); + QVERIFY(f); + + QCOMPARE(countSpy.count(), 0); + QCOMPARE(buffersSpy.count(), 0); + QCOMPARE(channelsSpy.count(), 0); + QCOMPARE(modelAboutToBeResetSpy.count(), 0); + QCOMPARE(modelResetSpy.count(), 0); + + qDeleteAll(model.buffers()); + + QCOMPARE(model.count(), 0); + QCOMPARE(model.buffers(), QList()); + QCOMPARE(model.channels(), QStringList()); + + QVERIFY(!model.get(0)); + QVERIFY(!model.find("e")); + QVERIFY(!model.find("f")); + QVERIFY(!model.contains("e")); + QVERIFY(!model.contains("f")); + + QVERIFY(!e); + QVERIFY(!f); + + QCOMPARE(countSpy.count(), 2); + QCOMPARE(countSpy.at(0).at(0).toInt(), 1); + QCOMPARE(countSpy.at(1).at(0).toInt(), 0); + + QCOMPARE(buffersSpy.count(), 2); + QCOMPARE(buffersSpy.at(0).at(0).value >().count(), 1); + QCOMPARE(buffersSpy.at(1).at(0).value >(), QList()); + + QCOMPARE(channelsSpy.count(), 0); + + QCOMPARE(modelAboutToBeResetSpy.count(), 0); + QCOMPARE(modelResetSpy.count(), 0); +} + +void tst_IrcBufferModel::testPersistent() +{ + IrcBufferModel model(connection); + connection->open(); + QVERIFY(waitForOpened()); + QVERIFY(waitForWritten(tst_IrcData::welcome())); + + QVERIFY(waitForWritten(":communi!communi@hidd.en JOIN :#communi")); + QCOMPARE(model.count(), 1); + + QPointer channel = model.get(0)->toChannel(); + QVERIFY(channel); + + QVERIFY(!model.isPersistent()); + QVERIFY(!channel->isPersistent()); + QVERIFY(waitForWritten(":communi!communi@hidd.en PART :#communi")); + QVERIFY(model.isEmpty()); + QVERIFY(channel); // deleteLater()'d + QCoreApplication::sendPostedEvents(channel, QEvent::DeferredDelete); + QVERIFY(!channel); // deleteLater()'d + + QVERIFY(waitForWritten(":communi!communi@hidd.en JOIN :#communi")); + QCOMPARE(model.count(), 1); + channel = model.get(0)->toChannel(); + QVERIFY(channel); + + model.setPersistent(true); + QVERIFY(model.isPersistent()); + QVERIFY(!channel->isPersistent()); + QVERIFY(waitForWritten(":communi!communi@hidd.en PART :#communi")); + QVERIFY(channel); + QCOMPARE(model.count(), 1); + + channel->setPersistent(true); + QVERIFY(model.isPersistent()); + QVERIFY(channel->isPersistent()); + QVERIFY(waitForWritten(":communi!communi@hidd.en PART :#communi")); + QVERIFY(channel); + QCOMPARE(model.count(), 1); + + model.setPersistent(false); + QVERIFY(!model.isPersistent()); + QVERIFY(channel->isPersistent()); + QVERIFY(waitForWritten(":communi!communi@hidd.en PART :#communi")); + QVERIFY(channel); + QCOMPARE(model.count(), 1); + + channel->setPersistent(false); + QVERIFY(!model.isPersistent()); + QVERIFY(!channel->isPersistent()); + QVERIFY(waitForWritten(":communi!communi@hidd.en PART :#communi")); + QVERIFY(model.isEmpty()); + QVERIFY(channel); // deleteLater()'d + QCoreApplication::sendPostedEvents(channel, QEvent::DeferredDelete); + QVERIFY(!channel); // deleteLater()'d +} + +void tst_IrcBufferModel::testPrototypes() +{ + IrcBufferModel model; + + QSignalSpy bufferProtoSpy(&model, SIGNAL(bufferPrototypeChanged(IrcBuffer*))); + QSignalSpy channelProtoSpy(&model, SIGNAL(channelPrototypeChanged(IrcChannel*))); + QVERIFY(bufferProtoSpy.isValid()); + QVERIFY(channelProtoSpy.isValid()); + + model.setBufferPrototype(0); + QVERIFY(model.bufferPrototype()); + QCOMPARE(bufferProtoSpy.count(), 1); + + model.setChannelPrototype(0); + QVERIFY(model.channelPrototype()); + QCOMPARE(channelProtoSpy.count(), 1); + + IrcBuffer* bufferProto = new IrcBuffer(&model); + model.setBufferPrototype(bufferProto); + QCOMPARE(model.bufferPrototype(), bufferProto); + QCOMPARE(bufferProtoSpy.count(), 2); + + IrcChannel* channelProto = new IrcChannel(&model); + model.setChannelPrototype(channelProto); + QCOMPARE(model.channelPrototype(), channelProto); + QCOMPARE(channelProtoSpy.count(), 2); +} + +void tst_IrcBufferModel::testChanges() +{ + IrcBufferModel bufferModel; + + // IrcBufferModel signals + QSignalSpy countChangedSpy(&bufferModel, SIGNAL(countChanged(int))); + QSignalSpy addedSpy(&bufferModel, SIGNAL(added(IrcBuffer*))); + QSignalSpy removedSpy(&bufferModel, SIGNAL(removed(IrcBuffer*))); + QSignalSpy aboutToBeAddedSpy(&bufferModel, SIGNAL(aboutToBeAdded(IrcBuffer*))); + QSignalSpy aboutToBeRemovedSpy(&bufferModel, SIGNAL(aboutToBeRemoved(IrcBuffer*))); + QSignalSpy buffersChangedSpy(&bufferModel, SIGNAL(buffersChanged(QList))); + QSignalSpy channelsChangedSpy(&bufferModel, SIGNAL(channelsChanged(QStringList))); + + QVERIFY(countChangedSpy.isValid()); + QVERIFY(addedSpy.isValid()); + QVERIFY(removedSpy.isValid()); + QVERIFY(aboutToBeAddedSpy.isValid()); + QVERIFY(aboutToBeRemovedSpy.isValid()); + QVERIFY(buffersChangedSpy.isValid()); + QVERIFY(channelsChangedSpy.isValid()); + + int countChangedCount = 0; + int aboutToBeAddedCount = 0, addedCount = 0; + int aboutToBeRemovedCount = 0, removedCount = 0; + int buffersChangedCount = 0; + int channelsChangedCount = 0; + + QSignalSpy connectionChangedSpy(&bufferModel, SIGNAL(connectionChanged(IrcConnection*))); + QSignalSpy networkChangedSpy(&bufferModel, SIGNAL(networkChanged(IrcNetwork*))); + QSignalSpy messageIgnoredSpy(&bufferModel, SIGNAL(messageIgnored(IrcMessage*))); + + QVERIFY(connectionChangedSpy.isValid()); + QVERIFY(networkChangedSpy.isValid()); + QVERIFY(messageIgnoredSpy.isValid()); + + int connectionChangedCount = 0; + int networkChangedCount = 0; + int messageIgnoredCount = 0; + + // relevant QAbstractItemModel signals + QSignalSpy dataChangedSpy(&bufferModel, SIGNAL(dataChanged(QModelIndex,QModelIndex))); + QSignalSpy layoutAboutToBeChangedSpy(&bufferModel, SIGNAL(layoutAboutToBeChanged())); + QSignalSpy layoutChangedSpy(&bufferModel, SIGNAL(layoutChanged())); + QSignalSpy rowsAboutToBeInsertedSpy(&bufferModel, SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int))); + QSignalSpy rowsInsertedSpy(&bufferModel, SIGNAL(rowsInserted(QModelIndex,int,int))); + QSignalSpy rowsAboutToBeRemovedSpy(&bufferModel, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int))); + QSignalSpy rowsRemovedSpy(&bufferModel, SIGNAL(rowsRemoved(QModelIndex,int,int))); + + QVERIFY(dataChangedSpy.isValid()); + QVERIFY(layoutAboutToBeChangedSpy.isValid()); + QVERIFY(layoutChangedSpy.isValid()); + QVERIFY(rowsAboutToBeInsertedSpy.isValid()); + QVERIFY(rowsInsertedSpy.isValid()); + QVERIFY(rowsAboutToBeRemovedSpy.isValid()); + QVERIFY(rowsRemovedSpy.isValid()); + + int dataChangedCount = 0; + int layoutAboutToBeChangedCount = 0, layoutChangedCount = 0; + int rowsAboutToBeInsertedCount = 0, rowsInsertedCount = 0; + int rowsAboutToBeRemovedCount = 0, rowsRemovedCount = 0; + + bufferModel.setConnection(connection); + QCOMPARE(connectionChangedSpy.count(), ++connectionChangedCount); + QCOMPARE(networkChangedSpy.count(), ++networkChangedCount); + + connection->open(); + QVERIFY(waitForOpened()); + QVERIFY(waitForWritten(tst_IrcData::welcome())); + + messageIgnoredCount = tst_IrcData::welcome().split('\n').count(); // N lines + a combined motd msg + + QCOMPARE(bufferModel.count(), 0); + QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); + + QVERIFY(waitForWritten(":communi!communi@hidd.en JOIN :#communi")); + QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); + + QCOMPARE(bufferModel.count(), 1); + + QPointer communi = bufferModel.get(0)->toChannel(); + QVERIFY(communi); + QCOMPARE(communi->title(), QString("#communi")); + QCOMPARE(communi->name(), QString("communi")); + QCOMPARE(communi->prefix(), QString("#")); + + int previousIndex = -1; + + QList buffers = QList() << communi; + QStringList channels = QStringList() << "#communi"; + + int nextIndex = buffers.indexOf(communi); + + QCOMPARE(bufferModel.count(), buffers.count()); + for (int i = 0; i < bufferModel.count(); ++i) { + QCOMPARE(bufferModel.get(i), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); + } + QCOMPARE(bufferModel.channels(), channels); + + QCOMPARE(countChangedSpy.count(), ++countChangedCount); + QCOMPARE(countChangedSpy.last().at(0).toInt(), buffers.count()); + + QCOMPARE(aboutToBeAddedSpy.count(), ++aboutToBeAddedCount); + QCOMPARE(aboutToBeAddedSpy.last().at(0).value(), communi.data()); + + QCOMPARE(addedSpy.count(), ++addedCount); + QCOMPARE(addedSpy.last().at(0).value(), communi.data()); + + QCOMPARE(buffersChangedSpy.count(), ++buffersChangedCount); + QCOMPARE(buffersChangedSpy.last().at(0).value >(), buffers); + + QCOMPARE(channelsChangedSpy.count(), ++channelsChangedCount); + QCOMPARE(channelsChangedSpy.last().at(0).toStringList(), channels); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); + + QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); + + QCOMPARE(rowsAboutToBeInsertedSpy.count(), ++rowsAboutToBeInsertedCount); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); + + QCOMPARE(rowsInsertedSpy.count(), ++rowsInsertedCount); + QCOMPARE(rowsInsertedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); + + QVERIFY(waitForWritten(":ChanServ!ChanServ@services. NOTICE communi :fake...")); + QCOMPARE(messageIgnoredSpy.count(), ++messageIgnoredCount); + + QCOMPARE(bufferModel.count(), buffers.count()); + QCOMPARE(bufferModel.buffers(), buffers); + QCOMPARE(bufferModel.channels(), channels); + + QCOMPARE(countChangedSpy.count(), countChangedCount); + QCOMPARE(aboutToBeAddedSpy.count(), aboutToBeAddedCount); + QCOMPARE(addedSpy.count(), addedCount); + QCOMPARE(buffersChangedSpy.count(), buffersChangedCount); + QCOMPARE(channelsChangedSpy.count(), channelsChangedCount); + QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); + QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); + QCOMPARE(rowsAboutToBeInsertedSpy.count(), rowsAboutToBeInsertedCount); + QCOMPARE(rowsInsertedSpy.count(), rowsInsertedCount); + + QVERIFY(waitForWritten(":ChanServ!ChanServ@services. PRIVMSG communi :fake...")); + QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); + + QPointer ChanServ = bufferModel.get(1); + QVERIFY(ChanServ); + QCOMPARE(ChanServ->title(), QString("ChanServ")); + QCOMPARE(ChanServ->name(), QString("ChanServ")); + QCOMPARE(ChanServ->prefix(), QString()); + + previousIndex = -1; + + buffers = QList() << communi << ChanServ; + channels = QStringList() << "#communi"; + + nextIndex = buffers.indexOf(ChanServ); + + QCOMPARE(bufferModel.count(), buffers.count()); + QCOMPARE(bufferModel.buffers(), buffers); + QCOMPARE(bufferModel.channels(), channels); + + QCOMPARE(bufferModel.count(), buffers.count()); + for (int i = 0; i < bufferModel.count(); ++i) { + QCOMPARE(bufferModel.get(i), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); + } + + QCOMPARE(countChangedSpy.count(), ++countChangedCount); + QCOMPARE(countChangedSpy.last().at(0).toInt(), buffers.count()); + + QCOMPARE(aboutToBeAddedSpy.count(), ++aboutToBeAddedCount); + QCOMPARE(aboutToBeAddedSpy.last().at(0).value(), ChanServ.data()); + + QCOMPARE(addedSpy.count(), ++addedCount); + QCOMPARE(addedSpy.last().at(0).value(), ChanServ.data()); + + QCOMPARE(buffersChangedSpy.count(), ++buffersChangedCount); + QCOMPARE(buffersChangedSpy.last().at(0).value >(), buffers); + + QCOMPARE(channelsChangedSpy.count(), channelsChangedCount); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); + + QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); + + QCOMPARE(rowsAboutToBeInsertedSpy.count(), ++rowsAboutToBeInsertedCount); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); + + QCOMPARE(rowsInsertedSpy.count(), ++rowsInsertedCount); + QCOMPARE(rowsInsertedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); + + QVERIFY(waitForWritten(":ChanServ!ChanServ@services. NOTICE communi :fake...")); + QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); + + QCOMPARE(bufferModel.count(), buffers.count()); + QCOMPARE(bufferModel.buffers(), buffers); + QCOMPARE(bufferModel.channels(), channels); + + QCOMPARE(bufferModel.count(), buffers.count()); + for (int i = 0; i < bufferModel.count(); ++i) { + QCOMPARE(bufferModel.get(i), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); + } + + QCOMPARE(countChangedSpy.count(), countChangedCount); + QCOMPARE(aboutToBeAddedSpy.count(), aboutToBeAddedCount); + QCOMPARE(addedSpy.count(), addedCount); + QCOMPARE(buffersChangedSpy.count(), buffersChangedCount); + QCOMPARE(channelsChangedSpy.count(), channelsChangedCount); + QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); + QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); + QCOMPARE(rowsAboutToBeInsertedSpy.count(), rowsAboutToBeInsertedCount); + QCOMPARE(rowsInsertedSpy.count(), rowsInsertedCount); + + QVERIFY(waitForWritten(":communi!communi@hidd.en JOIN :#freenode")); + QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); + + QPointer freenode = bufferModel.get(2)->toChannel(); + QVERIFY(freenode); + QCOMPARE(freenode->title(), QString("#freenode")); + QCOMPARE(freenode->name(), QString("freenode")); + QCOMPARE(freenode->prefix(), QString("#")); + + previousIndex = -1; + + buffers = QList() << communi << ChanServ << freenode; + channels = QStringList() << "#communi" << "#freenode"; + + nextIndex = buffers.indexOf(freenode); + + QCOMPARE(bufferModel.count(), buffers.count()); + QCOMPARE(bufferModel.buffers(), buffers); + QCOMPARE(bufferModel.channels(), channels); + + for (int i = 0; i < bufferModel.count(); ++i) { + QCOMPARE(bufferModel.get(i), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); + } + + QCOMPARE(countChangedSpy.count(), ++countChangedCount); + QCOMPARE(countChangedSpy.last().at(0).toInt(), buffers.count()); + + QCOMPARE(aboutToBeAddedSpy.count(), ++aboutToBeAddedCount); + QCOMPARE(aboutToBeAddedSpy.last().at(0).value(), freenode.data()); + + QCOMPARE(addedSpy.count(), ++addedCount); + QCOMPARE(addedSpy.last().at(0).value(), freenode.data()); + + QCOMPARE(buffersChangedSpy.count(), ++buffersChangedCount); + QCOMPARE(buffersChangedSpy.last().at(0).value >(), buffers); + + QCOMPARE(channelsChangedSpy.count(), ++channelsChangedCount); + QCOMPARE(channelsChangedSpy.last().at(0).toStringList(), channels); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); + + QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); + + QCOMPARE(rowsAboutToBeInsertedSpy.count(), ++rowsAboutToBeInsertedCount); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); + + QCOMPARE(rowsInsertedSpy.count(), ++rowsInsertedCount); + QCOMPARE(rowsInsertedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); + + bufferModel.setSortMethod(Irc::SortByTitle); + QCOMPARE(layoutAboutToBeChangedSpy.count(), ++layoutAboutToBeChangedCount); + QCOMPARE(layoutChangedSpy.count(), ++layoutChangedCount); + + previousIndex = -1; + + // Irc::SortByTitle + buffers = QList() << communi << freenode << ChanServ; + channels = QStringList() << "#communi" << "#freenode"; + + nextIndex = -1; + + QCOMPARE(bufferModel.count(), buffers.count()); + QCOMPARE(bufferModel.buffers(), buffers); + QCOMPARE(bufferModel.channels(), channels); + + for (int i = 0; i < bufferModel.count(); ++i) { + QCOMPARE(bufferModel.get(i), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); + } + + bufferModel.setSortMethod(Irc::SortByName); + QCOMPARE(layoutAboutToBeChangedSpy.count(), ++layoutAboutToBeChangedCount); + QCOMPARE(layoutChangedSpy.count(), ++layoutChangedCount); + + bufferModel.setSortOrder(Qt::DescendingOrder); + QCOMPARE(layoutAboutToBeChangedSpy.count(), ++layoutAboutToBeChangedCount); + QCOMPARE(layoutChangedSpy.count(), ++layoutChangedCount); + + previousIndex = -1; + + // Irc::SortByName, Qt::DescendingOrder + buffers = QList() << freenode << communi << ChanServ; + channels = QStringList() << "#communi" << "#freenode"; + + nextIndex = -1; + + QCOMPARE(bufferModel.count(), buffers.count()); + QCOMPARE(bufferModel.buffers(), buffers); + QCOMPARE(bufferModel.channels(), channels); + + for (int i = 0; i < bufferModel.count(); ++i) { + QCOMPARE(bufferModel.get(i), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); + } + + QVERIFY(waitForWritten(":qtassistant!qtassistant@hidd.en PRIVMSG communi :hola")); + QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); + + QPointer qtassistant = bufferModel.get(0); + QVERIFY(qtassistant); + QCOMPARE(qtassistant->title(), QString("qtassistant")); + QCOMPARE(qtassistant->name(), QString("qtassistant")); + QCOMPARE(qtassistant->prefix(), QString()); + + previousIndex = -1; + + // Irc::SortByName, Qt::DescendingOrder + buffers = QList() << qtassistant << freenode << communi << ChanServ; + channels = QStringList() << "#communi" << "#freenode"; + + nextIndex = buffers.indexOf(qtassistant); + + QCOMPARE(bufferModel.count(), buffers.count()); + QCOMPARE(bufferModel.buffers(), buffers); + QCOMPARE(bufferModel.channels(), channels); + + for (int i = 0; i < bufferModel.count(); ++i) { + QCOMPARE(bufferModel.get(i), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); + } + + QCOMPARE(countChangedSpy.count(), ++countChangedCount); + QCOMPARE(countChangedSpy.last().at(0).toInt(), buffers.count()); + + QCOMPARE(aboutToBeAddedSpy.count(), ++aboutToBeAddedCount); + QCOMPARE(aboutToBeAddedSpy.last().at(0).value(), qtassistant.data()); + + QCOMPARE(addedSpy.count(), ++addedCount); + QCOMPARE(addedSpy.last().at(0).value(), qtassistant.data()); + + QCOMPARE(buffersChangedSpy.count(), ++buffersChangedCount); + QCOMPARE(buffersChangedSpy.last().at(0).value >(), buffers); + + QCOMPARE(channelsChangedSpy.count(), channelsChangedCount); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); + + QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); + + QCOMPARE(rowsAboutToBeInsertedSpy.count(), ++rowsAboutToBeInsertedCount); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); + + QCOMPARE(rowsInsertedSpy.count(), ++rowsInsertedCount); + QCOMPARE(rowsInsertedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); + + QSignalSpy titleChangedSpy(qtassistant, SIGNAL(titleChanged(QString))); + QSignalSpy nameChangedSpy(qtassistant, SIGNAL(nameChanged(QString))); + QSignalSpy prefixChangedSpy(qtassistant, SIGNAL(prefixChanged(QString))); + + QVERIFY(titleChangedSpy.isValid()); + QVERIFY(nameChangedSpy.isValid()); + QVERIFY(prefixChangedSpy.isValid()); + + int titleChangedCount = 0; + int nameChangedCount = 0; + int prefixChangedCount = 0; + + QVERIFY(waitForWritten(":qtassistant!qtassistant@hidd.en NICK assistant :hola")); + QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); + + QCOMPARE(qtassistant->title(), QString("assistant")); + QCOMPARE(qtassistant->name(), QString("assistant")); + QCOMPARE(qtassistant->prefix(), QString()); + + QCOMPARE(titleChangedSpy.count(), ++titleChangedCount); + QCOMPARE(nameChangedSpy.count(), ++nameChangedCount); + QCOMPARE(prefixChangedSpy.count(), prefixChangedCount); + + previousIndex = buffers.indexOf(qtassistant); + + // Irc::SortByName, Qt::DescendingOrder + buffers = QList() << freenode << communi << ChanServ << qtassistant; // qtassistant=assistant + channels = QStringList() << "#communi" << "#freenode"; + + nextIndex = buffers.indexOf(qtassistant); + + QCOMPARE(bufferModel.count(), buffers.count()); + QCOMPARE(bufferModel.buffers(), buffers); + QCOMPARE(bufferModel.channels(), channels); + + for (int i = 0; i < bufferModel.count(); ++i) { + QCOMPARE(bufferModel.get(i), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); + } + + QCOMPARE(countChangedSpy.count(), countChangedCount); + + QCOMPARE(aboutToBeAddedSpy.count(), aboutToBeAddedCount); + + QCOMPARE(addedSpy.count(), addedCount); + + QCOMPARE(buffersChangedSpy.count(), ++buffersChangedCount); + QCOMPARE(buffersChangedSpy.last().at(0).value >(), buffers); + + QCOMPARE(channelsChangedSpy.count(), channelsChangedCount); + + QCOMPARE(dataChangedSpy.count(), ++dataChangedCount); + QModelIndex topLeft = dataChangedSpy.last().at(0).value(); + QModelIndex bottomRight = dataChangedSpy.last().at(0).value(); + QVERIFY(!topLeft.parent().isValid()); + QVERIFY(topLeft.isValid()); + QVERIFY(bottomRight.isValid()); + QVERIFY(topLeft == bottomRight); + QCOMPARE(topLeft.row(), previousIndex); + QCOMPARE(topLeft.column(), 0); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), ++rowsAboutToBeRemovedCount); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(1).toInt(), previousIndex); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(2).toInt(), previousIndex); + + QCOMPARE(rowsRemovedSpy.count(), ++rowsRemovedCount); + QCOMPARE(rowsRemovedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsRemovedSpy.last().at(1).toInt(), previousIndex); + QCOMPARE(rowsRemovedSpy.last().at(2).toInt(), previousIndex); + + QCOMPARE(rowsAboutToBeInsertedSpy.count(), ++rowsAboutToBeInsertedCount); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); + + QCOMPARE(rowsInsertedSpy.count(), ++rowsInsertedCount); + QCOMPARE(rowsInsertedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); + + QVERIFY(waitForWritten(":communi!communi@hidd.en PART #communi")); + QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); + + QVERIFY(communi); // deleteLater()'d + + QCOMPARE(aboutToBeRemovedSpy.count(), ++aboutToBeRemovedCount); + QCOMPARE(aboutToBeRemovedSpy.last().at(0).value(), communi.data()); + + QCOMPARE(removedSpy.count(), ++removedCount); + QCOMPARE(removedSpy.last().at(0).value(), communi.data()); + + previousIndex = buffers.indexOf(communi); + + QCoreApplication::sendPostedEvents(communi, QEvent::DeferredDelete); + QVERIFY(!communi); + + // Irc::SortByName, Qt::DescendingOrder + buffers = QList() << freenode << ChanServ << qtassistant; // qtassistant=assistant + channels = QStringList() << "#freenode"; + + nextIndex = buffers.indexOf(communi); + + QCOMPARE(bufferModel.count(), buffers.count()); + QCOMPARE(bufferModel.buffers(), buffers); + QCOMPARE(bufferModel.channels(), channels); + + for (int i = 0; i < bufferModel.count(); ++i) { + QCOMPARE(bufferModel.get(i), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); + } + + QCOMPARE(countChangedSpy.count(), ++countChangedCount); + QCOMPARE(countChangedSpy.last().at(0).toInt(), buffers.count()); + + QCOMPARE(aboutToBeAddedSpy.count(), aboutToBeAddedCount); + + QCOMPARE(addedSpy.count(), addedCount); + + QCOMPARE(buffersChangedSpy.count(), ++buffersChangedCount); + QCOMPARE(buffersChangedSpy.last().at(0).value >(), buffers); + + QCOMPARE(channelsChangedSpy.count(), ++channelsChangedCount); + QCOMPARE(channelsChangedSpy.last().at(0).toStringList(), channels); + + QCOMPARE(dataChangedSpy.count(), dataChangedCount); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), ++rowsAboutToBeRemovedCount); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(1).toInt(), previousIndex); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(2).toInt(), previousIndex); + + QCOMPARE(rowsRemovedSpy.count(), ++rowsRemovedCount); + QCOMPARE(rowsRemovedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsRemovedSpy.last().at(1).toInt(), previousIndex); + QCOMPARE(rowsRemovedSpy.last().at(2).toInt(), previousIndex); + + QCOMPARE(rowsAboutToBeInsertedSpy.count(), rowsAboutToBeInsertedCount); + + QCOMPARE(rowsInsertedSpy.count(), rowsInsertedCount); + + waitForWritten(":moorcock.freenode.net 324 communi #freenode +s"); + QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); + QCOMPARE(freenode->mode(), QString("+s")); + + QVERIFY(waitForWritten(":jpnurmi!jpnurmi@qt/jpnurmi KICK #freenode communi")); + QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); + + QVERIFY(freenode); // deleteLater()'d + + QCOMPARE(aboutToBeRemovedSpy.count(), ++aboutToBeRemovedCount); + QCOMPARE(aboutToBeRemovedSpy.last().at(0).value(), freenode.data()); + + QCOMPARE(removedSpy.count(), ++removedCount); + QCOMPARE(removedSpy.last().at(0).value(), freenode.data()); + + previousIndex = buffers.indexOf(freenode); + + QCoreApplication::sendPostedEvents(freenode, QEvent::DeferredDelete); + QVERIFY(!freenode); + + // Irc::SortByName, Qt::DescendingOrder + buffers = QList() << ChanServ << qtassistant; // qtassistant=assistant + channels = QStringList(); + + nextIndex = buffers.indexOf(freenode); + + QCOMPARE(bufferModel.count(), buffers.count()); + QCOMPARE(bufferModel.buffers(), buffers); + QCOMPARE(bufferModel.channels(), channels); + + for (int i = 0; i < bufferModel.count(); ++i) { + QCOMPARE(bufferModel.get(i), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); + } + + QCOMPARE(countChangedSpy.count(), ++countChangedCount); + QCOMPARE(countChangedSpy.last().at(0).toInt(), buffers.count()); + + QCOMPARE(aboutToBeAddedSpy.count(), aboutToBeAddedCount); + + QCOMPARE(addedSpy.count(), addedCount); + + QCOMPARE(buffersChangedSpy.count(), ++buffersChangedCount); + QCOMPARE(buffersChangedSpy.last().at(0).value >(), buffers); + + QCOMPARE(channelsChangedSpy.count(), ++channelsChangedCount); + QCOMPARE(channelsChangedSpy.last().at(0).toStringList(), channels); + + QCOMPARE(dataChangedSpy.count(), dataChangedCount); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), ++rowsAboutToBeRemovedCount); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(1).toInt(), previousIndex); + QCOMPARE(rowsAboutToBeRemovedSpy.last().at(2).toInt(), previousIndex); + + QCOMPARE(rowsRemovedSpy.count(), ++rowsRemovedCount); + QCOMPARE(rowsRemovedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsRemovedSpy.last().at(1).toInt(), previousIndex); + QCOMPARE(rowsRemovedSpy.last().at(2).toInt(), previousIndex); + + QCOMPARE(rowsAboutToBeInsertedSpy.count(), rowsAboutToBeInsertedCount); + + QCOMPARE(rowsInsertedSpy.count(), rowsInsertedCount); + + QVERIFY(waitForWritten(":communi!communi@hidd.en PRIVMSG jpnurmi :echo")); + QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); + + QPointer jpnurmi = bufferModel.get(0); + QVERIFY(jpnurmi); + QCOMPARE(jpnurmi->title(), QString("jpnurmi")); + QCOMPARE(jpnurmi->name(), QString("jpnurmi")); + QCOMPARE(jpnurmi->prefix(), QString()); + + previousIndex = -1; + + // Irc::SortByName, Qt::DescendingOrder + buffers = QList() << jpnurmi << ChanServ << qtassistant; // qtassistant=assistant + channels = QStringList(); + + nextIndex = buffers.indexOf(jpnurmi); + + QCOMPARE(bufferModel.count(), buffers.count()); + QCOMPARE(bufferModel.buffers(), buffers); + QCOMPARE(bufferModel.channels(), channels); + + for (int i = 0; i < bufferModel.count(); ++i) { + QCOMPARE(bufferModel.get(i), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); + } + + QCOMPARE(countChangedSpy.count(), ++countChangedCount); + QCOMPARE(countChangedSpy.last().at(0).toInt(), buffers.count()); + + QCOMPARE(aboutToBeAddedSpy.count(), ++aboutToBeAddedCount); + QCOMPARE(aboutToBeAddedSpy.last().at(0).value(), jpnurmi.data()); + + QCOMPARE(addedSpy.count(), ++addedCount); + QCOMPARE(addedSpy.last().at(0).value(), jpnurmi.data()); + + QCOMPARE(buffersChangedSpy.count(), ++buffersChangedCount); + QCOMPARE(buffersChangedSpy.last().at(0).value >(), buffers); + + QCOMPARE(channelsChangedSpy.count(), channelsChangedCount); + + QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); + + QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); + + QCOMPARE(rowsAboutToBeInsertedSpy.count(), ++rowsAboutToBeInsertedCount); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsAboutToBeInsertedSpy.last().at(2).toInt(), nextIndex); + + QCOMPARE(rowsInsertedSpy.count(), ++rowsInsertedCount); + QCOMPARE(rowsInsertedSpy.last().at(0).value(), QModelIndex()); + QCOMPARE(rowsInsertedSpy.last().at(1).toInt(), nextIndex); + QCOMPARE(rowsInsertedSpy.last().at(2).toInt(), nextIndex); + + QVERIFY(waitForWritten(":communi!communi@hidd.en QUIT :bye")); + QCOMPARE(messageIgnoredSpy.count(), messageIgnoredCount); + + serverSocket->close(); + QVERIFY(clientSocket->waitForDisconnected(100)); + QVERIFY(!connection->isConnected()); + QVERIFY(!connection->isActive()); + + QCOMPARE(bufferModel.count(), buffers.count()); + QCOMPARE(bufferModel.buffers(), buffers); + QCOMPARE(bufferModel.channels(), channels); + + for (int i = 0; i < bufferModel.count(); ++i) { + QCOMPARE(bufferModel.get(i), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::BufferRole).value(), buffers.at(i)); + QCOMPARE(bufferModel.index(i).data(Irc::ChannelRole).value(), buffers.at(i)->toChannel()); + QVERIFY(!buffers.at(i)->isActive()); + } + + QCOMPARE(countChangedSpy.count(), countChangedCount); + QCOMPARE(aboutToBeAddedSpy.count(), aboutToBeAddedCount); + QCOMPARE(addedSpy.count(), addedCount); + QCOMPARE(buffersChangedSpy.count(), buffersChangedCount); + QCOMPARE(channelsChangedSpy.count(), channelsChangedCount); + QCOMPARE(dataChangedSpy.count(), dataChangedCount); + QCOMPARE(rowsAboutToBeRemovedSpy.count(), rowsAboutToBeRemovedCount); + QCOMPARE(rowsRemovedSpy.count(), rowsRemovedCount); + QCOMPARE(rowsAboutToBeInsertedSpy.count(), rowsAboutToBeInsertedCount); + QCOMPARE(rowsInsertedSpy.count(), rowsInsertedCount); +} + +void tst_IrcBufferModel::testActive() +{ + IrcBufferModel bufferModel; + bufferModel.setConnection(connection); + + connection->open(); + QVERIFY(waitForOpened()); + QVERIFY(waitForWritten(tst_IrcData::welcome())); + + QVERIFY(waitForWritten(":communi!communi@hidd.en JOIN :#communi")); + + IrcChannel* channel = bufferModel.get(0)->toChannel(); + IrcBuffer* query = bufferModel.add("qtassistant"); + + channel->setPersistent(true); + query->setPersistent(true); + + QSignalSpy channelActiveSpy(channel, SIGNAL(activeChanged(bool))); + QSignalSpy queryActiveSpy(query, SIGNAL(activeChanged(bool))); + QVERIFY(channelActiveSpy.isValid()); + QVERIFY(queryActiveSpy.isValid()); + int channelActiveCount = 0; + int queryActiveCount = 0; + + QVERIFY(channel->isActive()); + QVERIFY(query->isActive()); + + connection->close(); + + QVERIFY(!channel->isActive()); + QVERIFY(!query->isActive()); + + QCOMPARE(channelActiveSpy.count(), ++channelActiveCount); + QCOMPARE(queryActiveSpy.count(), ++queryActiveCount); + + connection->open(); + QVERIFY(waitForOpened()); + QVERIFY(waitForWritten(tst_IrcData::welcome())); + + QVERIFY(!channel->isActive()); + QVERIFY(query->isActive()); + + QCOMPARE(channelActiveSpy.count(), channelActiveCount); + QCOMPARE(queryActiveSpy.count(), ++queryActiveCount); + + QVERIFY(waitForWritten(":communi!communi@hidd.en JOIN :#communi")); + + QVERIFY(channel->isActive()); + QVERIFY(query->isActive()); + + QCOMPARE(channelActiveSpy.count(), ++channelActiveCount); + QCOMPARE(queryActiveSpy.count(), queryActiveCount); + + QVERIFY(waitForWritten(":communi!communi@hidd.en PART #communi")); + + QVERIFY(!channel->isActive()); + QVERIFY(query->isActive()); + + QCOMPARE(channelActiveSpy.count(), ++channelActiveCount); + QCOMPARE(queryActiveSpy.count(), queryActiveCount); + + connection->close(); + + QVERIFY(!channel->isActive()); + QVERIFY(!query->isActive()); + + QCOMPARE(channelActiveSpy.count(), channelActiveCount); + QCOMPARE(queryActiveSpy.count(), ++queryActiveCount); +} + +void tst_IrcBufferModel::testRoles() +{ + IrcBufferModel model; + QHash roles = model.roleNames(); + QCOMPARE(roles.take(Qt::DisplayRole), QByteArray("display")); + QCOMPARE(roles.take(Irc::BufferRole), QByteArray("buffer")); + QCOMPARE(roles.take(Irc::ChannelRole), QByteArray("channel")); + QCOMPARE(roles.take(Irc::NameRole), QByteArray("name")); + QCOMPARE(roles.take(Irc::PrefixRole), QByteArray("prefix")); + QCOMPARE(roles.take(Irc::TitleRole), QByteArray("title")); + QVERIFY(roles.isEmpty()); +} + +void tst_IrcBufferModel::testAIM() +{ + IrcBufferModel bufferModel(connection); + IrcBuffer* a = bufferModel.add("#a"); + IrcBuffer* b = bufferModel.add("#b"); + IrcBuffer* c = bufferModel.add("c"); + IrcBuffer* o = 0; + + QAbstractItemModel* aim = &bufferModel; + QModelIndex ai = aim->index(0, 0); + QModelIndex bi = aim->index(1, 0); + QModelIndex ci = aim->index(2, 0); + QModelIndex oi = aim->index(100, 100); + + QVERIFY(ai.isValid()); + QVERIFY(bi.isValid()); + QVERIFY(ci.isValid()); + QVERIFY(!oi.isValid()); + + QCOMPARE(aim->rowCount(QModelIndex()), 3); + QCOMPARE(aim->rowCount(ai), 0); + + QCOMPARE(aim->columnCount(QModelIndex()), 1); + QCOMPARE(aim->columnCount(ai), 0); + + QCOMPARE(bufferModel.index(a), ai); + QCOMPARE(bufferModel.index(b), bi); + QCOMPARE(bufferModel.index(c), ci); + QVERIFY(!bufferModel.index(o).isValid()); + + QCOMPARE(bufferModel.buffer(ai), a); + QCOMPARE(bufferModel.buffer(bi), b); + QCOMPARE(bufferModel.buffer(ci), c); + QVERIFY(!bufferModel.buffer(oi)); + + bufferModel.setDisplayRole(Irc::TitleRole); + QCOMPARE(aim->data(ai, Qt::DisplayRole).toString(), a->title()); + QCOMPARE(aim->data(bi, Qt::DisplayRole).toString(), b->title()); + QCOMPARE(aim->data(ci, Qt::DisplayRole).toString(), c->title()); + QVERIFY(aim->data(oi, Qt::DisplayRole).toString().isEmpty()); + + bufferModel.setDisplayRole(Irc::BufferRole); + QCOMPARE(aim->data(ai, Qt::DisplayRole).value(), a); + QCOMPARE(aim->data(bi, Qt::DisplayRole).value(), b); + QCOMPARE(aim->data(ci, Qt::DisplayRole).value(), c); + QVERIFY(!aim->data(oi, Qt::DisplayRole).value()); + + QCOMPARE(aim->data(ai, Irc::BufferRole).value(), a); + QCOMPARE(aim->data(bi, Irc::BufferRole).value(), b); + QCOMPARE(aim->data(ci, Irc::BufferRole).value(), c); + QVERIFY(!aim->data(oi, Irc::BufferRole).value()); + + QCOMPARE(aim->data(ai, Irc::ChannelRole).value(), a->toChannel()); + QCOMPARE(aim->data(bi, Irc::ChannelRole).value(), b->toChannel()); + QCOMPARE(aim->data(ci, Irc::ChannelRole).value(), c->toChannel()); + QVERIFY(!aim->data(oi, Irc::ChannelRole).value()); + + QCOMPARE(aim->data(ai, Irc::TitleRole).toString(), a->title()); + QCOMPARE(aim->data(bi, Irc::TitleRole).toString(), b->title()); + QCOMPARE(aim->data(ci, Irc::TitleRole).toString(), c->title()); + QVERIFY(aim->data(oi, Irc::TitleRole).toString().isEmpty()); + + QCOMPARE(aim->data(ai, Irc::NameRole).toString(), a->name()); + QCOMPARE(aim->data(bi, Irc::NameRole).toString(), b->name()); + QCOMPARE(aim->data(ci, Irc::NameRole).toString(), c->name()); + QVERIFY(aim->data(oi, Irc::NameRole).toString().isEmpty()); + + QVERIFY(aim->data(ai, Irc::PrefixRole).toString().isEmpty()); + QVERIFY(aim->data(bi, Irc::PrefixRole).toString().isEmpty()); + QVERIFY(aim->data(ci, Irc::PrefixRole).toString().isEmpty()); + QVERIFY(aim->data(oi, Irc::PrefixRole).toString().isEmpty()); +} + +class FakeQmlBufferModel : public IrcBufferModel +{ + Q_OBJECT + friend class tst_IrcBufferModel; + +public slots: + // -Wno-overloaded-virtual + QVariant createBuffer(const QVariant& title) + { + IrcBuffer* buffer = IrcBufferModel::createBuffer(title.toString()); + buffer->setObjectName("QML buffer"); + return QVariant::fromValue(buffer); + } + QVariant createChannel(const QVariant& title) + { + IrcChannel* channel = IrcBufferModel::createChannel(title.toString()); + channel->setObjectName("QML channel"); + return QVariant::fromValue(channel); + } +}; + +void tst_IrcBufferModel::testQML() +{ + FakeQmlBufferModel model; + model.setConnection(connection); + + connection->open(); + QVERIFY(waitForOpened()); + QVERIFY(waitForWritten(tst_IrcData::welcome())); + + QCOMPARE(model.add("buffer")->objectName(), QString("QML buffer")); + QCOMPARE(model.add("#channel")->objectName(), QString("QML channel")); +} + +void tst_IrcBufferModel::testWarnings() +{ + IrcBufferModel model(connection); + model.setConnection(connection); + + QTest::ignoreMessage(QtCriticalMsg, "IrcBufferModel::setConnection(): changing the connection on the fly is not supported."); + + IrcConnection another; + model.setConnection(&another); +} + +QTEST_MAIN(tst_IrcBufferModel) + +#include "tst_ircbuffermodel.moc" -- cgit v1.2.3-54-g00ecf