phonebookui/cnthistorymodel/tsrc/mt_cnthistorymodel/mt_cnthistorymodel.cpp
changeset 31 2a11b5b00470
parent 27 de1630741fbe
child 37 fd64c38c277d
equal deleted inserted replaced
27:de1630741fbe 31:2a11b5b00470
    16 */
    16 */
    17 
    17 
    18 #include <QtTest/QtTest>
    18 #include <QtTest/QtTest>
    19 
    19 
    20 #include "mt_cnthistorymodel.h"
    20 #include "mt_cnthistorymodel.h"
       
    21 #include "cnthistorymodel_p.h"
    21 #include "cnthistorymodel.h"
    22 #include "cnthistorymodel.h"
    22 #include "stub_classes.h"
    23 
    23 
    24 void TestCntHistoryModel::init()
    24 void TestCntHistoryModel::initTestCase()
    25 {
    25 {
    26     cm = new QContactManager("symbian");
    26 }
    27     model = new CntHistoryModel(1, cm);
    27 
    28     model->d->m_List.clear();
    28 void TestCntHistoryModel::cleanupTestCase()
    29     model->d->m_logsMap.clear();
    29 {
    30     model->d->m_msgMap.clear();
       
    31 }
       
    32 
       
    33 void TestCntHistoryModel::cleanup()
       
    34 {
       
    35     delete cm;
       
    36     delete model;
       
    37 }
       
    38 
       
    39 void TestCntHistoryModel::testLogsInsertions()
       
    40 {   
       
    41     QSignalSpy spy( model, SIGNAL(rowsInserted(const QModelIndex &, int, int)));
       
    42     model->logsRowsInserted(QModelIndex(), 0, 0);
       
    43     
       
    44     QVERIFY(model->rowCount() == 1);
       
    45     QVERIFY(model->d->m_logsMap.count() == 1);
       
    46     QVERIFY(spy.count() == 1);
       
    47 }
       
    48 
       
    49 void TestCntHistoryModel::testLogsRemovals()
       
    50 {
       
    51     model->logsRowsInserted(QModelIndex(), 0, 0);
       
    52     
       
    53     QSignalSpy spy( model, SIGNAL(rowsRemoved(const QModelIndex &, int, int)));
       
    54     model->logsRowsRemoved(QModelIndex(), 0, 0);
       
    55     QVERIFY(model->rowCount() == 0);
       
    56     QVERIFY(model->d->m_logsMap.count() == 0);
       
    57     QVERIFY(spy.count() == 1);
       
    58     
       
    59     // Remove the same item
       
    60     QSignalSpy spy1( model, SIGNAL(rowsRemoved(const QModelIndex &, int, int)));
       
    61     model->logsRowsRemoved(QModelIndex(), 0, 0);
       
    62     QVERIFY(spy1.count() == 0);
       
    63 }
       
    64 
       
    65 void TestCntHistoryModel::testLogsUpdates()
       
    66 {
       
    67     model->logsRowsInserted(QModelIndex(), 0, 0);
       
    68     
       
    69     QSignalSpy spy( model, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &)));
       
    70     QModelIndex in = model->d->m_AbstractLogsModel->index(0,0);
       
    71     model->logsDataChanged(in, in);
       
    72     QVERIFY(spy.count() == 1);
       
    73 }
       
    74 
       
    75 void TestCntHistoryModel::testMsgInsertions()
       
    76 {
       
    77     QList<MsgItem> msgs;
       
    78     MsgItem msg1;
       
    79     msg1.setId(111);
       
    80     MsgItem msg2;
       
    81     msg2.setId(222);
       
    82     MsgItem msg3;
       
    83     msg3.setId(333);
       
    84     msgs.append(msg1);
       
    85     msgs.append(msg2);
       
    86     msgs.append(msg3);
       
    87     
       
    88     QSignalSpy spy( model, SIGNAL(rowsInserted(const QModelIndex &, int, int)));
       
    89     model->messagesReady(msgs);
       
    90     
       
    91     QVERIFY(model->rowCount() == 3);
       
    92     QVERIFY(model->d->m_msgMap.count() == 3);
       
    93     QVERIFY(model->d->m_msgMap.contains(111));
       
    94     QVERIFY(model->d->m_msgMap.contains(222));
       
    95     QVERIFY(model->d->m_msgMap.contains(333));
       
    96     QVERIFY(spy.count() == 1);
       
    97     
       
    98     MsgItem msg;
       
    99     QSignalSpy spy2( model, SIGNAL(rowsInserted(const QModelIndex &, int, int)));
       
   100     model->messageAdded(msg);
       
   101     QVERIFY(model->rowCount() == 4);
       
   102     QVERIFY(model->d->m_msgMap.count() == 4);
       
   103     QVERIFY(spy2.count() == 1);
       
   104     
       
   105 }
       
   106 
       
   107 void TestCntHistoryModel::testMsgRemovals()
       
   108 {
       
   109     QList<MsgItem> msgs;
       
   110     MsgItem msg1;
       
   111     msg1.setId(111);
       
   112     MsgItem msg2;
       
   113     msg2.setId(222);
       
   114     MsgItem msg3;
       
   115     msg3.setId(333);
       
   116     msgs.append(msg1);
       
   117     msgs.append(msg2);
       
   118     msgs.append(msg3);
       
   119     model->messagesReady(msgs);
       
   120     
       
   121     QSignalSpy spy( model, SIGNAL(rowsRemoved(const QModelIndex &, int, int)));
       
   122     model->messageDeleted(msg2);
       
   123     QVERIFY(!model->d->m_msgMap.contains(222));
       
   124     QVERIFY(model->rowCount() == 2);
       
   125     QVERIFY(spy.count() == 1);
       
   126     
       
   127     // Increase code coverage
       
   128     HItemPointer p;
       
   129     model->d->m_msgMap.insert(333, p);
       
   130     model->messageDeleted(msg3);
       
   131 }
       
   132 
       
   133 void TestCntHistoryModel::testMsgUpdates()
       
   134 {
       
   135     QList<MsgItem> msgs;
       
   136     MsgItem msg1;
       
   137     msg1.setId(111);
       
   138     MsgItem msg2;
       
   139     msg2.setId(222);
       
   140     MsgItem msg3;
       
   141     msg3.setId(333);
       
   142     msgs.append(msg1);
       
   143     msgs.append(msg2);
       
   144     msgs.append(msg3);
       
   145     model->messagesReady(msgs);
       
   146     
       
   147     QSignalSpy spy( model, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &)));
       
   148     QString s("test message");
       
   149     msg2.setBody(s);
       
   150     model->messageChanged(msg2);
       
   151     QVERIFY(model->d->m_msgMap.value(222)->message == s);
       
   152     QVERIFY(spy.count() == 1);
       
   153     
       
   154     // Increase code coverage
       
   155     HItemPointer p;
       
   156     model->d->m_msgMap.insert(333, p);
       
   157     model->messageChanged(msg3);
       
   158 }
       
   159 
       
   160 void TestCntHistoryModel::testReadLogEvent()
       
   161 {
       
   162     LogsEvent event;
       
   163     HItemPointer item(new HistoryItem);
       
   164     model->readLogEvent(&event, *item);
       
   165     
       
   166     QVERIFY(event.time() == item->timeStamp);
       
   167     QVERIFY(item->flags & CntHistoryModel::Incoming);
       
   168     QVERIFY(event.number() == item->number);
       
   169     QVERIFY(item->flags & CntHistoryModel::CallLog);
       
   170     QVERIFY(!item->message.isEmpty());
       
   171     
       
   172     // Increase code coverage
       
   173     model->d->m_isMyCard = true;
       
   174     model->readLogEvent(&event, *item);
       
   175 }
       
   176 
       
   177 void TestCntHistoryModel::testReadMsgEvent()
       
   178 {
       
   179     MsgItem msg;
       
   180     QString body("Some message");
       
   181     msg.setBody(body);
       
   182     msg.setDirection(MsgItem::MsgDirectionIncoming);
       
   183     msg.setPhoneNumber("123456");
       
   184     QDateTime d = QDateTime(QDate(2012, 12, 12), QTime(12, 23, 10));
       
   185     msg.setTimeStamp(d.toTime_t());
       
   186     
       
   187     HItemPointer item(new HistoryItem);
       
   188     model->readMsgEvent(msg, *item);
       
   189     
       
   190     QVERIFY(item->timeStamp == d);
       
   191     QVERIFY(item->message == body);
       
   192     QVERIFY(item->flags & CntHistoryModel::Message);
       
   193     QVERIFY(item->number == QString("123456"));
       
   194     QVERIFY(item->flags & CntHistoryModel::Incoming);
    30 }
   195 }
    31 
   196 
    32 void TestCntHistoryModel::testRoles()
   197 void TestCntHistoryModel::testRoles()
    33 {
   198 {
    34     // Contact centric history data
   199     MsgItem msg;
    35     QContactManager* cm = new QContactManager("symbian");
   200     model->messageAdded(msg);
    36     QContact c;
   201     
    37     QVERIFY(cm->saveContact(&c));
   202     QModelIndex modelIndex = model->index(0, 0);
    38     CntHistoryModel* model = new CntHistoryModel(c.localId(), cm);
   203     QVERIFY(modelIndex.isValid());
    39     QVERIFY(model != 0);
       
    40     QVERIFY(model->rowCount() == FILTERED_EVENTS);
       
    41     
   204     
    42     // Branded icon path
   205     // Branded icon path
    43     int index = 1;
   206     //QVariant var = modelIndex.data(Qt::DecorationRole);
    44     QModelIndex modelIndex = model->index(index, 0);
   207     //QVERIFY(var.type() == QVariant::String);
    45     QVERIFY(modelIndex.isValid());
   208     
    46     QVariant var = modelIndex.data(Qt::DecorationRole);
   209     // FlagsRole
       
   210     var = modelIndex.data(CntHistoryModel::FlagsRole);
       
   211     QVERIFY(var.type() == QVariant::Int);
       
   212     
       
   213     // Display role
       
   214     var = modelIndex.data(Qt::DisplayRole);
       
   215     QVERIFY(var.type() == QVariant::StringList);
       
   216     
       
   217     // PhoneNumberRole
       
   218     var = modelIndex.data(CntHistoryModel::PhoneNumberRole);
    47     QVERIFY(var.type() == QVariant::String);
   219     QVERIFY(var.type() == QVariant::String);
    48     
   220 
    49     // Direction
   221     // BackgroundRole
    50     modelIndex = model->index(index, 0);
   222     var = modelIndex.data(Qt::BackgroundRole);
    51     QVERIFY(modelIndex.isValid());
   223     QVERIFY(var.type() > (QVariant::UserType - 1));
    52     var = modelIndex.data(DirectionRole);
       
    53     QVERIFY(var.type() == QVariant::Int);
       
    54     QVERIFY(var.toInt() == Incoming ||
       
    55             var.toInt() == Outgoing ||
       
    56             var.toInt() == Missed);
       
    57     
       
    58     // Display role
       
    59     modelIndex = model->index(index, 0);
       
    60     QVERIFY(modelIndex.isValid());
       
    61     var = modelIndex.data(Qt::DisplayRole);
       
    62     QString str = QString(cc_msg).arg(index);
       
    63     QVERIFY(var.toStringList().at(0) == "");
       
    64     QDateTime t = constDateTime.addSecs(5*index);
       
    65     str = t.toString();
       
    66     QVERIFY(var.toStringList().at(2) == str);
       
    67     
       
    68     index = 3;
       
    69     modelIndex = model->index(index, 0);
       
    70     QVERIFY(modelIndex.isValid());
       
    71     var = modelIndex.data(Qt::DisplayRole);
       
    72     str = QString(cc_msg).arg(index);
       
    73     QVERIFY(var.type() == QVariant::StringList);
       
    74     QVERIFY(var.toStringList().at(0) == "");
       
    75     t = constDateTime.addSecs(5*index);
       
    76     str = t.toString();
       
    77     QVERIFY(var.toStringList().at(2) == str);
       
    78     
       
    79     // decoration role
       
    80     modelIndex = model->index(index, 0);
       
    81     QVERIFY(modelIndex.isValid());
       
    82     var = modelIndex.data(Qt::DecorationRole);
       
    83     QVERIFY(var.type() == QVariant::String);
       
    84     QVERIFY(var.toString() == QString("qtg_small_missed_call") || 
       
    85             var.toString() == QString("qtg_small_sent") ||
       
    86             var.toString() == QString("qtg_small_received"));
       
    87     
       
    88     // SeenStatusRole
       
    89     index = 1;
       
    90     modelIndex = model->index(index, 0);
       
    91     QVERIFY(modelIndex.isValid());
       
    92     var = modelIndex.data(SeenStatusRole);
       
    93     QVERIFY(var.type() == QVariant::Int);
       
    94     QVERIFY(var.toInt() == Unseen ||
       
    95             var.toInt() == Seen);
       
    96     
       
    97     // ItemTypeRole
       
    98     index = 1;
       
    99     modelIndex = model->index(index, 0);
       
   100     QVERIFY(modelIndex.isValid());
       
   101     var = modelIndex.data(ItemTypeRole);
       
   102     QVERIFY(var.type() == QVariant::Int);
       
   103     QVERIFY(var.toInt() == CallLog ||
       
   104             var.toInt() == Message);
       
   105     
       
   106     // PhoneNumberRole
       
   107     modelIndex = model->index(index, 0);
       
   108     QVERIFY(modelIndex.isValid());
       
   109     var = modelIndex.data(PhoneNumberRole);
       
   110     QVERIFY(var.type() == QVariant::String);
       
   111     QVERIFY(var.toString() == "1234567");
       
   112     
   224     
   113     // Invalid role
   225     // Invalid role
   114     index = 1;
   226     var = modelIndex.data(-10);
   115     modelIndex = model->index(index, 0);
       
   116     QVERIFY(modelIndex.isValid());
       
   117     var = modelIndex.data(1000);
       
   118     QVERIFY(var.type() == QVariant::Invalid);
   227     QVERIFY(var.type() == QVariant::Invalid);
   119     
   228     
   120     // Invalid indices
   229     // Invalid indices
   121     modelIndex = model->index(-1, 0);
   230     modelIndex = model->index(-10, 0);
   122     QVERIFY(!modelIndex.isValid());
   231     QVERIFY(!modelIndex.isValid());
   123     var = modelIndex.data(Qt::DisplayRole);
       
   124     QVERIFY(var.type() == QVariant::Invalid);
       
   125     
       
   126     var = model->data(modelIndex, Qt::DisplayRole);
   232     var = model->data(modelIndex, Qt::DisplayRole);
   127     QVERIFY(var.type() == QVariant::Invalid);
   233     QVERIFY(var.type() == QVariant::Invalid);
   128     
   234     
   129     modelIndex = model->index(100, 0);
   235     modelIndex = model->index(100, 0);
   130     QVERIFY(!modelIndex.isValid());
   236     QVERIFY(!modelIndex.isValid());
   131     var = modelIndex.data(Qt::DisplayRole);
   237     
   132     QVERIFY(var.type() == QVariant::Invalid);
   238     // Stored history item is null
   133     
   239     model->d->m_List.first().clear();
       
   240     modelIndex = model->index(0, 0);
   134     var = model->data(modelIndex, Qt::DisplayRole);
   241     var = model->data(modelIndex, Qt::DisplayRole);
   135     QVERIFY(var.type() == QVariant::Invalid);
   242     QVERIFY(var.type() == QVariant::Invalid);
   136     
       
   137     // Test all conversations
       
   138     QVERIFY(cm->setSelfContactId(c.localId()));
       
   139     delete model;
       
   140     model = new CntHistoryModel(c.localId(), cm);
       
   141     QVERIFY(model != 0);
       
   142     QVERIFY(model->rowCount() == ALL_EVENTS);
       
   143     
       
   144     cm->removeContact(c.localId());
       
   145     
       
   146     delete cm;
       
   147     delete model;
       
   148 }
   243 }
   149 
   244 
   150 void TestCntHistoryModel::testSorting()
   245 void TestCntHistoryModel::testSorting()
   151 {
   246 {
   152     QContactManager* cm = new QContactManager("symbian");
   247     // Create random data
   153     QContact c;
   248     QList<int> delta;
   154     QVERIFY(cm->saveContact(&c));
   249     delta.append(23);
   155     CntHistoryModel* model = new CntHistoryModel(c.localId(), cm);
   250     delta.append(12);
   156     QVERIFY(model != 0);
   251     delta.append(45);
   157     QVERIFY(model->rowCount() == FILTERED_EVENTS);
   252     delta.append(32);
       
   253     delta.append(67);
       
   254     delta.append(45);
       
   255     delta.append(92);
       
   256     delta.append(12);
       
   257     
       
   258     QDateTime dt = QDateTime::currentDateTime();
       
   259     
       
   260     for(int i=0; i<delta.count(); i++) {
       
   261         HItemPointer p(new HistoryItem());
       
   262         dt = dt.addMSecs(delta.at(i));
       
   263         p.data()->timeStamp = dt.toLocalTime();
       
   264         if ( i % 2 )
       
   265             p.data()->flags |= CntHistoryModel::CallLog;
       
   266         else
       
   267             p.data()->flags |= CntHistoryModel::Message;
       
   268         
       
   269         qDebug() << "Flag: " << p.data()->flags;
       
   270         qDebug() << "Delta: " << delta.at(i);
       
   271         model->d->m_List.append(p);
       
   272     } 
   158     
   273     
   159     // Sort ascending
   274     // Sort ascending
   160     QSignalSpy spy( model, SIGNAL( layoutChanged()));
   275     QSignalSpy spy( model, SIGNAL( rowsInserted(const QModelIndex &, int, int)));
   161     model->sortAndRefresh(Qt::AscendingOrder);
   276     model->sortAndRefresh(Qt::AscendingOrder);
   162     
   277     
   163     QModelIndex modelIndex = model->index(1, 0);
   278     QVERIFY(spy.count() == 1);    
   164     QVERIFY(modelIndex.isValid());
   279     HItemPointer current = model->d->m_List.first();
   165     QVariant var = modelIndex.data(Qt::DisplayRole);
   280     for(int i=1; i<model->d->m_List.count(); i++) {
   166     QDateTime dt1 = QDateTime::fromString(var.toStringList().at(2));
   281         QVERIFY(current.data()->timeStamp <= model->d->m_List.at(i).data()->timeStamp);
   167     
   282         current = model->d->m_List.at(i);
   168     modelIndex = model->index(2, 0);
   283     }
   169     QVERIFY(modelIndex.isValid());
       
   170     var = modelIndex.data(Qt::DisplayRole);
       
   171     QDateTime dt2 = QDateTime::fromString(var.toStringList().at(2));
       
   172     QVERIFY(dt1 < dt2);    
       
   173     QVERIFY(spy.count() == 1);
       
   174     
   284     
   175     // Sort descending
   285     // Sort descending
   176     QSignalSpy spy1( model, SIGNAL( layoutChanged()));
   286     QSignalSpy spy1( model, SIGNAL( rowsInserted(const QModelIndex &, int, int)));
   177     model->sortAndRefresh(Qt::DescendingOrder);
   287     model->sortAndRefresh(Qt::DescendingOrder);
   178     
   288     
   179     modelIndex = model->index(1, 0);
   289     QVERIFY(spy1.count() == 1);    
   180     QVERIFY(modelIndex.isValid());
   290     current = model->d->m_List.last();
   181     var = modelIndex.data(Qt::DisplayRole);
   291     for(int i=model->d->m_List.count(); i<1; i--) {
   182     dt1 = QDateTime::fromString(var.toStringList().at(2));
   292         QVERIFY(current.data()->timeStamp >= model->d->m_List.at(i).data()->timeStamp);
   183     
   293         current = model->d->m_List.at(i);
   184     modelIndex = model->index(2, 0);
   294     }
   185     QVERIFY(modelIndex.isValid());
       
   186     var = modelIndex.data(Qt::DisplayRole);
       
   187     dt2 = QDateTime::fromString(var.toStringList().at(2));
       
   188     QVERIFY(dt1 > dt2);
       
   189     QVERIFY(spy1.count() == 1);
       
   190     
       
   191     cm->removeContact(c.localId()); 
       
   192     delete model;
       
   193     delete cm;
       
   194 }
   295 }
   195 
   296 
   196 void TestCntHistoryModel::testClear()
   297 void TestCntHistoryModel::testClear()
   197 {
   298 {
   198     QContactManager* cm = new QContactManager("symbian");
   299     model->logsRowsInserted(QModelIndex(), 0, 0);
   199     QContact c;
   300     
   200     QVERIFY(cm->saveContact(&c));
   301     // Clear history with log
   201     CntHistoryModel* model = new CntHistoryModel(c.localId(), cm);
       
   202     QVERIFY(model != 0);
       
   203     QVERIFY(model->rowCount() == FILTERED_EVENTS);
       
   204     
       
   205     // Clear history
       
   206     QSignalSpy spy( model, SIGNAL( rowsRemoved(const QModelIndex &, int, int)));
   302     QSignalSpy spy( model, SIGNAL( rowsRemoved(const QModelIndex &, int, int)));
   207     int beforeClear = model->rowCount();
       
   208     model->clearHistory();
   303     model->clearHistory();
   209     QTest::qWait(1000); // wait clearing completion
       
   210     QVERIFY( model->rowCount() == 0 );
   304     QVERIFY( model->rowCount() == 0 );
   211     QVERIFY(spy.count() == 1);
   305     QVERIFY(spy.count() == 1);
   212     
       
   213     QList<QVariant> arguments = spy.takeFirst();
       
   214     QVERIFY(arguments.at(1).type() == QVariant::Int);
       
   215     QVERIFY(arguments.at(2).type() == QVariant::Int);
       
   216     QVERIFY(arguments.at(2).toInt() == beforeClear);
       
   217     
   306     
   218     // Clear already empty history view
   307     // Clear already empty history view
   219     QSignalSpy spy1( model, SIGNAL( rowsRemoved(const QModelIndex &, int, int)));
   308     QSignalSpy spy1( model, SIGNAL( rowsRemoved(const QModelIndex &, int, int)));
   220     model->clearHistory();
   309     model->clearHistory();
   221     QTest::qWait(1000); // wait clearing completion
       
   222     QVERIFY(spy1.count() == 0);
   310     QVERIFY(spy1.count() == 0);
   223     
       
   224     cm->removeContact(c.localId());
       
   225     delete model;
       
   226     delete cm;
       
   227 }
   311 }
   228 
   312 
   229 void TestCntHistoryModel::testMarkSeen()
   313 void TestCntHistoryModel::testMarkSeen()
   230 {
   314 {
   231     QContactManager* cm = new QContactManager("symbian");
       
   232     QContact c;
       
   233     QVERIFY(cm->saveContact(&c));
       
   234     CntHistoryModel* model = new CntHistoryModel(c.localId(), cm);
       
   235     QVERIFY(model != 0);
       
   236     QVERIFY(model->rowCount() == FILTERED_EVENTS);
       
   237     
       
   238     // Mark history as seen
   315     // Mark history as seen
   239     QSignalSpy spy( model, SIGNAL( layoutChanged()));
   316     QVERIFY(!model->d->m_isMarkedAsSeen);
   240     model->markAllAsSeen();
   317     model->markAllAsSeen();
   241     QTest::qWait(1000); // wait marking completion
   318     QVERIFY(model->d->m_isMarkedAsSeen);
   242     QVERIFY(spy.count() == 1);
   319     
   243     
   320     // NOT TESTING! Increasing code coverage
   244     // Mark already marked history as seen
       
   245     QSignalSpy spy1( model, SIGNAL( layoutChanged()));
       
   246     model->markAllAsSeen();
   321     model->markAllAsSeen();
   247     QTest::qWait(1000); // wait marking completion
   322     model->d->m_isMarkedAsSeen = false;
   248     QVERIFY(spy1.count() == 0);
   323     model->d->m_isMyCard = true;
   249     
   324     model->initializeMsgModel();
   250     cm->removeContact(c.localId());
   325     model->markAllAsSeen();
   251     delete model;
   326     model->clearHistory();
   252     delete cm;
       
   253 }
   327 }
   254 
   328 
   255 QTEST_MAIN(TestCntHistoryModel);
   329 QTEST_MAIN(TestCntHistoryModel);
   256 
   330