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 |