34
33
using namespace Akonadi;
35
34
using namespace KCalCore;
46
Q_DECLARE_METATYPE( QList<Akonadi::IncidenceChanger::ChangeType> )
48
static bool confirmExists( const Akonadi::Item &item )
50
ItemFetchJob *job = new ItemFetchJob( item );
51
return job->exec() != 0;
54
static bool confirmDoesntExists( const Akonadi::Item &item )
56
ItemFetchJob *job = new ItemFetchJob( item );
57
return job->exec() == 0;
60
static bool checkSummary( const Akonadi::Item &item, const QString &expected )
62
ItemFetchJob *job = new ItemFetchJob( item );
63
job->fetchScope().fetchFullPayload();
64
Q_ASSERT( job->exec() );
65
Q_ASSERT( !job->items().isEmpty() );
66
Item it = job->items().first();
67
Q_ASSERT( it.hasPayload() );
69
if ( it.payload<KCalCore::Incidence::Ptr>()->summary() == expected ) {
72
qDebug() << "Got " << it.payload<KCalCore::Incidence::Ptr>()->summary()
73
<< "Expected " << expected;
36
Q_DECLARE_METATYPE(QList<Akonadi::IncidenceChanger::ChangeType>)
39
static bool checkSummary(const Akonadi::Item &item, const QString &expected)
41
ItemFetchJob *job = new ItemFetchJob(item);
42
job->fetchScope().fetchFullPayload();
43
Q_ASSERT(job->exec());
44
Q_ASSERT(!job->items().isEmpty());
45
Item it = job->items().first();
46
Q_ASSERT(it.hasPayload());
48
if (it.payload<KCalCore::Incidence::Ptr>()->summary() == expected) {
51
qDebug() << "Got " << it.payload<KCalCore::Incidence::Ptr>()->summary()
52
<< "Expected " << expected;
78
57
static Akonadi::Item item()
81
Incidence::Ptr incidence = Incidence::Ptr( new Event() );
82
incidence->setSummary( QLatin1String( "random summary" ) );
83
item.setMimeType( incidence->mimeType() );
84
item.setPayload<KCalCore::Incidence::Ptr>( incidence );
88
static Akonadi::Item createItem( const Akonadi::Collection &collection )
91
ItemCreateJob *createJob = new ItemCreateJob( i, collection );
93
Q_ASSERT( createJob->exec() );
94
Q_ASSERT( createJob->item().isValid() );
95
return createJob->item();
98
class HistoryTest : public QObject
101
Collection mCollection;
102
IncidenceChanger *mChanger;
104
QHash<SignalType, int> mPendingSignals;
105
QHash<int, Akonadi::Item> mItemByChangeId;
106
QList<int> mKnownChangeIds;
108
void createIncidence( const QString &uid )
111
item.setMimeType( Event::eventMimeType() );
112
Incidence::Ptr incidence = Incidence::Ptr( new Event() );
113
incidence->setUid( uid );
114
incidence->setSummary( QLatin1String( "summary" ) );
115
item.setPayload<KCalCore::Incidence::Ptr>( incidence );
116
ItemCreateJob *job = new ItemCreateJob( item, mCollection, this );
120
static Akonadi::Item item()
123
Incidence::Ptr incidence = Incidence::Ptr( new Event() );
124
incidence->setSummary( QLatin1String( "some summary" ) );
125
item.setMimeType( incidence->mimeType() );
126
item.setPayload<KCalCore::Incidence::Ptr>( incidence );
130
void fetchCollection()
132
CollectionFetchJob *job = new CollectionFetchJob( Collection::root(),
133
CollectionFetchJob::Recursive,
135
// Get list of collections
136
job->fetchScope().setContentMimeTypes( QStringList()
137
<< QLatin1String( "application/x-vnd.akonadi.calendar.event" ) );
140
// Find our collection
141
Collection::List collections = job->collections();
142
QVERIFY( !collections.isEmpty() );
143
mCollection = collections.first();
145
QVERIFY( mCollection.isValid() );
151
qRegisterMetaType<Akonadi::Item>("Akonadi::Item");
152
qRegisterMetaType<QList<Akonadi::IncidenceChanger::ChangeType> >( "QList<Akonadi::IncidenceChanger::ChangeType>" );
153
qRegisterMetaType<QVector<Akonadi::Item::Id> >( "QVector<Akonadi::Item::Id>" );
154
mChanger = new IncidenceChanger( this );
155
mChanger->setShowDialogsOnError( false );
156
mChanger->setHistoryEnabled( true );
157
mHistory = mChanger->history();
158
mChanger->setDefaultCollection( mCollection );
160
SIGNAL(createFinished(int,Akonadi::Item,Akonadi::IncidenceChanger::ResultCode,QString)),
161
SLOT(createFinished(int,Akonadi::Item,Akonadi::IncidenceChanger::ResultCode,QString)) );
164
SIGNAL(deleteFinished(int,QVector<Akonadi::Item::Id>,Akonadi::IncidenceChanger::ResultCode,QString)),
165
SLOT(deleteFinished(int,QVector<Akonadi::Item::Id>,Akonadi::IncidenceChanger::ResultCode,QString)) );
168
SIGNAL(modifyFinished(int,Akonadi::Item,Akonadi::IncidenceChanger::ResultCode,QString)),
169
SLOT(modifyFinished(int,Akonadi::Item,Akonadi::IncidenceChanger::ResultCode,QString)) );
171
connect( mHistory, SIGNAL(undone(Akonadi::History::ResultCode)),
172
SLOT(handleUndone(Akonadi::History::ResultCode)));
174
connect( mHistory, SIGNAL(redone(Akonadi::History::ResultCode)),
175
SLOT(handleRedone(Akonadi::History::ResultCode)));
178
void testCreation_data()
180
QTest::addColumn<Akonadi::Item>( "item" );
181
QTest::newRow("item1") << item();
186
QFETCH( Akonadi::Item, item );
187
mPendingSignals[CreationSignal] = 1;
188
QCOMPARE( mHistory->redoCount(), 0 );
189
QCOMPARE( mHistory->undoCount(), 0 );
190
QVERIFY( item.hasPayload() );
191
const int changeId = mChanger->createIncidence( item.payload<KCalCore::Incidence::Ptr>() );
192
QVERIFY( changeId > 0 );
193
mKnownChangeIds << changeId;
196
// Check that it was created
197
QVERIFY( confirmExists( mItemByChangeId.value( changeId ) ) );
199
QCOMPARE( mHistory->redoCount(), 0 );
200
QCOMPARE( mHistory->undoCount(), 1 );
203
mPendingSignals[UndoSignal] = 1;
207
// Check that it doesn't exist anymore
208
QVERIFY( confirmDoesntExists( mItemByChangeId.value( changeId ) ) );
210
QCOMPARE( mHistory->redoCount(), 1 );
211
QCOMPARE( mHistory->undoCount(), 0 );
213
mPendingSignals[RedoSignal] = 1;
217
// Undo again just for fun
218
mPendingSignals[UndoSignal] = 1;
223
QCOMPARE( mHistory->redoCount(), 0 );
224
QCOMPARE( mHistory->undoCount(), 0 );
227
void testDeletion_data()
229
QTest::addColumn<Akonadi::Item::List>( "items" );
230
Akonadi::Item::List items;
231
items << createItem( mCollection );
232
QTest::newRow("one item") << items;
235
items << createItem( mCollection ) << createItem( mCollection );
236
QTest::newRow("two items") << items;
239
items << createItem( mCollection ) << createItem( mCollection ) << createItem( mCollection )
240
<< createItem( mCollection );
241
QTest::newRow("four items") << items;
246
QFETCH( Akonadi::Item::List, items );
247
mPendingSignals[DeletionSignal] = 1;
248
QCOMPARE( mHistory->redoCount(), 0 );
249
QCOMPARE( mHistory->undoCount(), 0 );
251
const int changeId = ( items.count() == 1 ) ? mChanger->deleteIncidence( items.first() ) :
252
mChanger->deleteIncidences( items );
253
QVERIFY( changeId > 0 );
254
mKnownChangeIds << changeId;
257
// Check that it doesn't exist anymore
258
foreach( const Akonadi::Item &item, items ) {
259
QVERIFY( confirmDoesntExists( item ) );
262
mPendingSignals[UndoSignal] = 1;
266
mPendingSignals[RedoSignal] = 1;
271
QCOMPARE( mHistory->redoCount(), 0 );
272
QCOMPARE( mHistory->undoCount(), 0 );
275
void testModification_data()
277
QTest::addColumn<Akonadi::Item>( "item" );
278
QTest::addColumn<QString>( "oldSummary" );
279
QTest::addColumn<QString>( "newSummary" );
280
Item item1 = createItem( mCollection );
281
const QString oldSummary( QLatin1String( "old" ) );
282
const QString newSummary( QLatin1String( "new" ) );
283
item1.payload<KCalCore::Incidence::Ptr>()->setSummary( oldSummary );
284
QTest::newRow("item1") << item1 << oldSummary << newSummary;
287
void testModification()
289
QFETCH( Akonadi::Item, item );
290
QFETCH( QString, oldSummary );
291
QFETCH( QString, newSummary );
292
QVERIFY( item.hasPayload() );
293
Incidence::Ptr originalPayload = Incidence::Ptr( item.payload<KCalCore::Incidence::Ptr>()->clone() );
295
item.payload<KCalCore::Incidence::Ptr>()->setSummary( newSummary );
296
mPendingSignals[ModificationSignal] = 1;
297
QCOMPARE( mHistory->redoCount(), 0 );
298
QCOMPARE( mHistory->undoCount(), 0 );
300
const int changeId = mChanger->modifyIncidence( item, originalPayload );
301
QVERIFY( changeId > 0 );
302
mKnownChangeIds << changeId;
305
QVERIFY( checkSummary( item, newSummary ) );
306
QCOMPARE( mHistory->redoCount(), 0 );
307
QCOMPARE( mHistory->undoCount(), 1 );
309
mPendingSignals[UndoSignal] = 1;
312
QVERIFY( checkSummary( item, oldSummary ) );
313
QCOMPARE( mHistory->redoCount(), 1 );
314
QCOMPARE( mHistory->undoCount(), 0 );
316
mPendingSignals[RedoSignal] = 1;
319
QVERIFY( checkSummary( item, newSummary ) );
320
QCOMPARE( mHistory->redoCount(), 0 );
321
QCOMPARE( mHistory->undoCount(), 1 );
324
QCOMPARE( mHistory->redoCount(), 0 );
325
QCOMPARE( mHistory->undoCount(), 0 );
327
// Test that it isn't recorded to history when history is disabled
328
mChanger->setHistoryEnabled( false );
329
const int changeId2 = mChanger->modifyIncidence( item, originalPayload );
330
mChanger->setHistoryEnabled( true );
331
QVERIFY( changeId > 0 );
332
mKnownChangeIds << changeId2;
334
QCOMPARE( mHistory->redoCount(), 0 );
335
QCOMPARE( mHistory->undoCount(), 0 );
338
void testAtomicOperations_data()
340
QTest::addColumn<Akonadi::Item::List>( "items" );
341
QTest::addColumn<QList<Akonadi::IncidenceChanger::ChangeType> >( "changeTypes" );
343
Akonadi::Item::List items;
344
QList<Akonadi::IncidenceChanger::ChangeType> changeTypes;
345
//------------------------------------------------------------------------------------------
346
// Create two incidences, should succeed
347
items << item() << item() ;
348
changeTypes << IncidenceChanger::ChangeTypeCreate << IncidenceChanger::ChangeTypeCreate;
350
QTest::newRow( "create two - success " ) << items << changeTypes;
351
//------------------------------------------------------------------------------------------
353
changeTypes << IncidenceChanger::ChangeTypeModify << IncidenceChanger::ChangeTypeModify;
355
items << createItem( mCollection ) << createItem( mCollection );
357
QTest::newRow( "modify two - success " ) << items << changeTypes;
358
//------------------------------------------------------------------------------------------
360
changeTypes << IncidenceChanger::ChangeTypeDelete << IncidenceChanger::ChangeTypeDelete;
361
QTest::newRow( "delete two - success " ) << items << changeTypes;
364
void testAtomicOperations()
367
QFETCH( Akonadi::Item::List, items );
368
QFETCH( QList<Akonadi::IncidenceChanger::ChangeType>, changeTypes );
369
mChanger->setDefaultCollection( mCollection );
370
mChanger->setRespectsCollectionRights( false );
371
mChanger->setDestinationPolicy( IncidenceChanger::DestinationPolicyNeverAsk );
372
mChanger->startAtomicOperation();
374
for( int i=0; i<items.count(); ++i ) {
60
Incidence::Ptr incidence = Incidence::Ptr(new Event());
61
incidence->setSummary(QLatin1String("random summary"));
62
item.setMimeType(incidence->mimeType());
63
item.setPayload<KCalCore::Incidence::Ptr>(incidence);
67
static Akonadi::Item createItem(const Akonadi::Collection &collection)
70
ItemCreateJob *createJob = new ItemCreateJob(i, collection);
72
Q_ASSERT(createJob->exec());
73
Q_ASSERT(createJob->item().isValid());
74
return createJob->item();
77
void HistoryTest::initTestCase()
79
AkonadiTest::checkTestIsIsolated();
81
mHistory = mChanger->history();
84
SIGNAL(createFinished(int,Akonadi::Item,Akonadi::IncidenceChanger::ResultCode,QString)),
85
SLOT(createFinished(int,Akonadi::Item,Akonadi::IncidenceChanger::ResultCode,QString)));
88
SIGNAL(deleteFinished(int,QVector<Akonadi::Item::Id>,Akonadi::IncidenceChanger::ResultCode,QString)),
89
SLOT(deleteFinished(int,QVector<Akonadi::Item::Id>,Akonadi::IncidenceChanger::ResultCode,QString)));
92
SIGNAL(modifyFinished(int,Akonadi::Item,Akonadi::IncidenceChanger::ResultCode,QString)),
93
SLOT(modifyFinished(int,Akonadi::Item,Akonadi::IncidenceChanger::ResultCode,QString)));
95
connect(mHistory, SIGNAL(undone(Akonadi::History::ResultCode)),
96
SLOT(handleUndone(Akonadi::History::ResultCode)));
98
connect(mHistory, SIGNAL(redone(Akonadi::History::ResultCode)),
99
SLOT(handleRedone(Akonadi::History::ResultCode)));
102
void HistoryTest::testCreation_data()
104
QTest::addColumn<Akonadi::Item>("item");
105
QTest::newRow("item1") << item();
108
void HistoryTest::testCreation()
110
QFETCH(Akonadi::Item, item);
111
mPendingSignals[CreationSignal] = 1;
112
QCOMPARE(mHistory->d->redoCount(), 0);
113
QCOMPARE(mHistory->d->undoCount(), 0);
114
QVERIFY(item.hasPayload());
115
const int changeId = mChanger->createIncidence(item.payload<KCalCore::Incidence::Ptr>());
116
QVERIFY(changeId > 0);
117
mKnownChangeIds << changeId;
120
// Check that it was created
121
QVERIFY(Helper::confirmExists(mItemByChangeId.value(changeId)));
123
QCOMPARE(mHistory->d->redoCount(), 0);
124
QCOMPARE(mHistory->d->undoCount(), 1);
127
mPendingSignals[UndoSignal] = 1;
131
// Check that it doesn't exist anymore
132
QVERIFY(Helper::confirmDoesntExist(mItemByChangeId.value(changeId)));
134
QCOMPARE(mHistory->d->redoCount(), 1);
135
QCOMPARE(mHistory->d->undoCount(), 0);
137
mPendingSignals[RedoSignal] = 1;
141
// Undo again just for fun
142
mPendingSignals[UndoSignal] = 1;
147
QCOMPARE(mHistory->d->redoCount(), 0);
148
QCOMPARE(mHistory->d->undoCount(), 0);
151
void HistoryTest::testDeletion_data()
153
QTest::addColumn<Akonadi::Item::List>("items");
154
Akonadi::Item::List items;
155
items << createItem(mCollection);
156
QTest::newRow("one item") << items;
159
items << createItem(mCollection) << createItem(mCollection);
160
QTest::newRow("two items") << items;
163
items << createItem(mCollection) << createItem(mCollection) << createItem(mCollection)
164
<< createItem(mCollection);
165
QTest::newRow("four items") << items;
168
void HistoryTest::testDeletion()
170
QFETCH(Akonadi::Item::List, items);
171
mPendingSignals[DeletionSignal] = 1;
172
QCOMPARE(mHistory->d->redoCount(), 0);
173
QCOMPARE(mHistory->d->undoCount(), 0);
175
const int changeId = (items.count() == 1) ? mChanger->deleteIncidence(items.first())
176
: mChanger->deleteIncidences(items);
177
QVERIFY(changeId > 0);
178
mKnownChangeIds << changeId;
181
// Check that it doesn't exist anymore
182
foreach(const Akonadi::Item &item, items) {
183
QVERIFY(Helper::confirmDoesntExist(item));
186
mPendingSignals[UndoSignal] = 1;
190
mPendingSignals[RedoSignal] = 1;
195
QCOMPARE(mHistory->d->redoCount(), 0);
196
QCOMPARE(mHistory->d->undoCount(), 0);
199
void HistoryTest::testModification_data()
201
QTest::addColumn<Akonadi::Item>("item");
202
QTest::addColumn<QString>("oldSummary");
203
QTest::addColumn<QString>("newSummary");
204
Item item1 = createItem(mCollection);
205
const QString oldSummary(QLatin1String("old"));
206
const QString newSummary(QLatin1String("new"));
207
item1.payload<KCalCore::Incidence::Ptr>()->setSummary(oldSummary);
208
QTest::newRow("item1") << item1 << oldSummary << newSummary;
211
void HistoryTest::testModification()
213
QFETCH(Akonadi::Item, item);
214
QFETCH(QString, oldSummary);
215
QFETCH(QString, newSummary);
216
QVERIFY(item.hasPayload());
217
Incidence::Ptr originalPayload = Incidence::Ptr(item.payload<KCalCore::Incidence::Ptr>()->clone());
219
item.payload<KCalCore::Incidence::Ptr>()->setSummary(newSummary);
220
mPendingSignals[ModificationSignal] = 1;
221
QCOMPARE(mHistory->d->redoCount(), 0);
222
QCOMPARE(mHistory->d->undoCount(), 0);
224
const int changeId = mChanger->modifyIncidence(item, originalPayload);
225
QVERIFY(changeId > 0);
226
mKnownChangeIds << changeId;
229
QVERIFY(checkSummary(item, newSummary));
230
QCOMPARE(mHistory->d->redoCount(), 0);
231
QCOMPARE(mHistory->d->undoCount(), 1);
233
mPendingSignals[UndoSignal] = 1;
236
QVERIFY(checkSummary(item, oldSummary));
237
QCOMPARE(mHistory->d->redoCount(), 1);
238
QCOMPARE(mHistory->d->undoCount(), 0);
240
mPendingSignals[RedoSignal] = 1;
243
QVERIFY(checkSummary(item, newSummary));
244
QCOMPARE(mHistory->d->redoCount(), 0);
245
QCOMPARE(mHistory->d->undoCount(), 1);
248
QCOMPARE(mHistory->d->redoCount(), 0);
249
QCOMPARE(mHistory->d->undoCount(), 0);
251
// Test that it isn't recorded to history when history is disabled
252
mChanger->setHistoryEnabled(false);
253
mPendingSignals[ModificationSignal] = 1;
254
const int changeId2 = mChanger->modifyIncidence(item, originalPayload);
255
mChanger->setHistoryEnabled(true);
256
QVERIFY(changeId > 0);
257
mKnownChangeIds << changeId2;
259
QCOMPARE(mHistory->d->redoCount(), 0);
260
QCOMPARE(mHistory->d->undoCount(), 0);
263
void HistoryTest::testAtomicOperations_data()
265
QTest::addColumn<Akonadi::Item::List>("items");
266
QTest::addColumn<QList<Akonadi::IncidenceChanger::ChangeType> >("changeTypes");
268
Akonadi::Item::List items;
269
QList<Akonadi::IncidenceChanger::ChangeType> changeTypes;
270
//------------------------------------------------------------------------------------------
271
// Create two incidences, should succeed
272
items << item() << item();
273
changeTypes << IncidenceChanger::ChangeTypeCreate << IncidenceChanger::ChangeTypeCreate;
275
QTest::newRow("create two - success ") << items << changeTypes;
276
//------------------------------------------------------------------------------------------
278
changeTypes << IncidenceChanger::ChangeTypeModify << IncidenceChanger::ChangeTypeModify;
280
items << createItem(mCollection) << createItem(mCollection);
282
QTest::newRow("modify two - success ") << items << changeTypes;
283
//------------------------------------------------------------------------------------------
285
changeTypes << IncidenceChanger::ChangeTypeDelete << IncidenceChanger::ChangeTypeDelete;
286
QTest::newRow("delete two - success ") << items << changeTypes;
289
void HistoryTest::testAtomicOperations()
292
QFETCH(Akonadi::Item::List, items);
293
QFETCH(QList<Akonadi::IncidenceChanger::ChangeType>, changeTypes);
294
mChanger->setDefaultCollection(mCollection);
295
mChanger->setRespectsCollectionRights(false);
296
mChanger->setDestinationPolicy(IncidenceChanger::DestinationPolicyNeverAsk);
297
mChanger->startAtomicOperation();
299
for (int i=0; i<items.count(); ++i) {
375
300
const Akonadi::Item item = items[i];
376
301
int changeId = -1;
377
switch( changeTypes[i] ) {
378
case IncidenceChanger::ChangeTypeCreate:
379
changeId = mChanger->createIncidence( item.hasPayload() ?
380
item.payload<KCalCore::Incidence::Ptr>() :
382
QVERIFY( changeId != -1 );
302
switch(changeTypes[i]) {
303
case IncidenceChanger::ChangeTypeCreate:
304
changeId = mChanger->createIncidence(item.hasPayload() ? item.payload<KCalCore::Incidence::Ptr>()
306
QVERIFY(changeId != -1);
383
307
mKnownChangeIds << changeId;
384
308
++mPendingSignals[CreationSignal];
386
case IncidenceChanger::ChangeTypeDelete:
387
changeId = mChanger->deleteIncidence( item );
388
QVERIFY( changeId != -1 );
310
case IncidenceChanger::ChangeTypeDelete:
311
changeId = mChanger->deleteIncidence(item);
312
QVERIFY(changeId != -1);
389
313
mKnownChangeIds << changeId;
390
314
++mPendingSignals[DeletionSignal];
392
case IncidenceChanger::ChangeTypeModify:
394
QVERIFY( item.isValid() );
395
QVERIFY( item.hasPayload<KCalCore::Incidence::Ptr>() );
396
Incidence::Ptr originalPayload = Incidence::Ptr( item.payload<KCalCore::Incidence::Ptr>()->clone() );
397
item.payload<KCalCore::Incidence::Ptr>()->setSummary( QLatin1String( "Changed" ) );
398
changeId = mChanger->modifyIncidence( item, originalPayload );
399
QVERIFY( changeId != -1 );
316
case IncidenceChanger::ChangeTypeModify:
318
QVERIFY(item.isValid());
319
QVERIFY(item.hasPayload<KCalCore::Incidence::Ptr>());
320
Incidence::Ptr originalPayload = Incidence::Ptr(item.payload<KCalCore::Incidence::Ptr>()->clone());
321
item.payload<KCalCore::Incidence::Ptr>()->setSummary(QLatin1String("Changed"));
322
changeId = mChanger->modifyIncidence(item, originalPayload);
323
QVERIFY(changeId != -1);
400
324
mKnownChangeIds << changeId;
401
325
++mPendingSignals[ModificationSignal];
409
mChanger->endAtomicOperation();
412
QCOMPARE( mHistory->undoCount(), 1 );
413
QCOMPARE( mHistory->redoCount(), 0 );
415
mPendingSignals[UndoSignal] = 1;
418
QCOMPARE( mHistory->undoCount(), 0 );
419
QCOMPARE( mHistory->redoCount(), 1 );
421
// Verify that it got undone
422
for( int i=0; i<items.count(); ++i ) {
333
mChanger->endAtomicOperation();
336
QCOMPARE(mHistory->d->undoCount(), 1);
337
QCOMPARE(mHistory->d->redoCount(), 0);
339
mPendingSignals[UndoSignal] = 1;
342
QCOMPARE(mHistory->d->undoCount(), 0);
343
QCOMPARE(mHistory->d->redoCount(), 1);
345
// Verify that it got undone
346
for (int i=0; i<items.count(); ++i) {
423
347
const Akonadi::Item item = items[i];
424
switch( changeTypes[i] ) {
425
case IncidenceChanger::ChangeTypeCreate:
348
switch(changeTypes[i]) {
349
case IncidenceChanger::ChangeTypeCreate:
426
350
// It changed id, have no way to verify
428
case IncidenceChanger::ChangeTypeDelete:
429
QVERIFY( confirmDoesntExists( item ) );
431
case IncidenceChanger::ChangeTypeModify:
432
QVERIFY( checkSummary( item, QLatin1String( "random summary" ) ) );
439
mPendingSignals[RedoSignal] = 1;
442
QCOMPARE( mHistory->undoCount(), 1 );
443
QCOMPARE( mHistory->redoCount(), 0 );
445
mPendingSignals[UndoSignal] = 1;
448
QCOMPARE( mHistory->undoCount(), 0 );
449
QCOMPARE( mHistory->redoCount(), 1 );
452
QCOMPARE( mHistory->redoCount(), 0 );
453
QCOMPARE( mHistory->undoCount(), 0 );
457
void waitForSignals()
459
bool somethingToWaitFor = false;
460
for ( int i=0; i<NumSignals; ++i ) {
461
if ( mPendingSignals.value( static_cast<SignalType>(i) ) ) {
462
somethingToWaitFor = true;
467
if ( !somethingToWaitFor )
470
QTestEventLoop::instance().enterLoop( 10 );
472
if ( QTestEventLoop::instance().timeout() ) {
473
for ( int i=0; i<NumSignals; ++i ) {
474
qDebug() << mPendingSignals.value( static_cast<SignalType>(i) );
478
QVERIFY( !QTestEventLoop::instance().timeout() );
482
void deleteFinished( int changeId,
483
const QVector<Akonadi::Item::Id> &deletedIds,
484
Akonadi::IncidenceChanger::ResultCode resultCode,
485
const QString &errorMessage )
487
QVERIFY( changeId != -1 );
489
if ( !mKnownChangeIds.contains(changeId) )
492
--mPendingSignals[DeletionSignal];
494
if ( resultCode != IncidenceChanger::ResultCodeSuccess ) {
352
case IncidenceChanger::ChangeTypeDelete:
353
QVERIFY(Helper::confirmDoesntExist(item));
355
case IncidenceChanger::ChangeTypeModify:
356
QVERIFY(checkSummary(item, QLatin1String("random summary")));
363
mPendingSignals[RedoSignal] = 1;
366
QCOMPARE(mHistory->d->undoCount(), 1);
367
QCOMPARE(mHistory->d->redoCount(), 0);
369
mPendingSignals[UndoSignal] = 1;
372
QCOMPARE(mHistory->d->undoCount(), 0);
373
QCOMPARE(mHistory->d->redoCount(), 1);
376
QCOMPARE(mHistory->d->redoCount(), 0);
377
QCOMPARE(mHistory->d->undoCount(), 0);
381
// Tests a sequence of various create/delete/modify operations
382
void HistoryTest::testMix_data()
384
QTest::addColumn<Akonadi::Item::List>("items");
385
QTest::addColumn<QList<Akonadi::IncidenceChanger::ChangeType> >("changeTypes");
387
Akonadi::Item::List items;
388
QList<Akonadi::IncidenceChanger::ChangeType> changeTypes;
389
//------------------------------------------------------------------------------------------
390
// Create two incidences
392
items << item() << item();
394
changeTypes << IncidenceChanger::ChangeTypeCreate << IncidenceChanger::ChangeTypeCreate;
395
QTest::newRow("create two - success ") << items << changeTypes;
396
//------------------------------------------------------------------------------------------
397
// Create one, then delete it
398
Akonadi::Item i = item();
402
changeTypes << IncidenceChanger::ChangeTypeCreate << IncidenceChanger::ChangeTypeDelete;
403
QTest::newRow("create then delete") << items << changeTypes;
404
//------------------------------------------------------------------------------------------
405
// Create one, then modify it, then delete it
408
items << i << i << i;
410
changeTypes << IncidenceChanger::ChangeTypeCreate << IncidenceChanger::ChangeTypeModify << IncidenceChanger::ChangeTypeDelete;
411
QTest::newRow("create then modify then deelte") << items << changeTypes;
414
void HistoryTest::testMix()
416
QFETCH(Akonadi::Item::List, items);
417
QFETCH(QList<Akonadi::IncidenceChanger::ChangeType>, changeTypes);
418
int lastCreateChangeId = -1;
420
mChanger->setDefaultCollection(mCollection);
421
mChanger->setRespectsCollectionRights(false);
422
mChanger->setDestinationPolicy(IncidenceChanger::DestinationPolicyNeverAsk);
424
for (int i=0; i<items.count(); ++i) {
425
Akonadi::Item item = items[i];
427
switch (changeTypes[i]) {
428
case IncidenceChanger::ChangeTypeCreate:
429
lastCreateChangeId = mChanger->createIncidence(item.payload<KCalCore::Incidence::Ptr>());
430
QVERIFY(lastCreateChangeId != -1);
431
mKnownChangeIds << lastCreateChangeId;
432
++mPendingSignals[CreationSignal];
435
case IncidenceChanger::ChangeTypeDelete:
436
item = item.isValid() ? item : mItemByChangeId.value(lastCreateChangeId);
437
QVERIFY(item.isValid());
438
changeId = mChanger->deleteIncidence(item);
439
QVERIFY(changeId != -1);
440
mKnownChangeIds << changeId;
441
++mPendingSignals[DeletionSignal];
444
case IncidenceChanger::ChangeTypeModify:
446
item = item.isValid() ? item : mItemByChangeId.value(lastCreateChangeId);
447
QVERIFY(item.isValid());
448
QVERIFY(item.hasPayload<KCalCore::Incidence::Ptr>());
449
Incidence::Ptr originalPayload = Incidence::Ptr(item.payload<KCalCore::Incidence::Ptr>()->clone());
450
item.payload<KCalCore::Incidence::Ptr>()->setSummary(QLatin1String("Changed"));
451
QVERIFY(originalPayload);
452
changeId = mChanger->modifyIncidence(item, originalPayload);
453
QVERIFY(changeId != -1);
454
mKnownChangeIds << changeId;
455
++mPendingSignals[ModificationSignal];
465
QCOMPARE(mHistory->d->undoCount(), changeTypes.count());
467
// All operations are done, now undo them:
468
for (int i=0; i<changeTypes.count(); i++) {
469
QCOMPARE(mHistory->d->undoCount(), changeTypes.count()-i);
470
QCOMPARE(mHistory->d->redoCount(), i);
471
mPendingSignals[UndoSignal] = 1;
476
QCOMPARE(mHistory->d->undoCount(), 0);
477
QCOMPARE(mHistory->d->redoCount(), changeTypes.count());
480
for (int i=0; i<changeTypes.count(); i++) {
481
QCOMPARE(mHistory->d->undoCount(), i);
482
QCOMPARE(mHistory->d->redoCount(), changeTypes.count()-i);
483
mPendingSignals[RedoSignal] = 1;
488
QCOMPARE(mHistory->d->undoCount(), changeTypes.count());
489
QCOMPARE(mHistory->d->redoCount(), 0);
493
void HistoryTest::waitForSignals()
495
bool somethingToWaitFor = false;
496
for (int i=0; i<NumSignals; ++i) {
497
if (mPendingSignals.value(static_cast<SignalType>(i))) {
498
somethingToWaitFor = true;
503
if (!somethingToWaitFor)
506
QTestEventLoop::instance().enterLoop(10);
508
if (QTestEventLoop::instance().timeout()) {
509
for (int i=0; i<NumSignals; ++i) {
510
qDebug() << mPendingSignals.value(static_cast<SignalType>(i));
514
QVERIFY(!QTestEventLoop::instance().timeout());
518
void HistoryTest::deleteFinished(int changeId,
519
const QVector<Akonadi::Item::Id> &deletedIds,
520
Akonadi::IncidenceChanger::ResultCode resultCode,
521
const QString &errorMessage)
523
QVERIFY(changeId != -1);
525
if (!mKnownChangeIds.contains(changeId))
528
QVERIFY(mPendingSignals[DeletionSignal] > 0);
529
--mPendingSignals[DeletionSignal];
531
if (resultCode != IncidenceChanger::ResultCodeSuccess) {
495
532
kDebug() << "Error string is " << errorMessage;
497
QVERIFY( !deletedIds.isEmpty() );
498
foreach( Akonadi::Item::Id id , deletedIds ) {
534
QVERIFY(!deletedIds.isEmpty());
535
foreach(Akonadi::Item::Id id , deletedIds) {
502
maybeQuitEventLoop();
505
void createFinished( int changeId,
506
const Akonadi::Item &item,
507
Akonadi::IncidenceChanger::ResultCode resultCode,
508
const QString &errorString )
510
QVERIFY( changeId != -1 );
512
if ( !mKnownChangeIds.contains(changeId) )
539
maybeQuitEventLoop();
542
void HistoryTest::createFinished(int changeId,
543
const Akonadi::Item &item,
544
Akonadi::IncidenceChanger::ResultCode resultCode,
545
const QString &errorString)
547
QVERIFY(changeId != -1);
549
if (!mKnownChangeIds.contains(changeId))
515
--mPendingSignals[CreationSignal];
517
if ( resultCode == IncidenceChanger::ResultCodeSuccess ) {
518
QVERIFY( item.isValid() );
519
QVERIFY( item.parentCollection().isValid() );
520
mItemByChangeId.insert( changeId, item );
521
QVERIFY( item.hasPayload() );
552
QVERIFY(mPendingSignals[CreationSignal] > 0);
554
--mPendingSignals[CreationSignal];
556
if (resultCode == IncidenceChanger::ResultCodeSuccess) {
557
QVERIFY(item.isValid());
558
QVERIFY(item.parentCollection().isValid());
559
mItemByChangeId.insert(changeId, item);
560
QVERIFY(item.hasPayload());
522
561
Incidence::Ptr incidence = item.payload<KCalCore::Incidence::Ptr>();
523
//mItemIdByUid.insert( incidence->uid(), item.id() );
562
//mItemIdByUid.insert(incidence->uid(), item.id());
525
564
kDebug() << "Error string is " << errorString;
528
maybeQuitEventLoop();
531
void modifyFinished( int changeId,
532
const Akonadi::Item &item,
533
Akonadi::IncidenceChanger::ResultCode resultCode,
534
const QString &errorString )
536
--mPendingSignals[ModificationSignal];
567
maybeQuitEventLoop();
538
if ( !mKnownChangeIds.contains(changeId) )
570
void HistoryTest::modifyFinished(int changeId,
571
const Akonadi::Item &item,
572
Akonadi::IncidenceChanger::ResultCode resultCode,
573
const QString &errorString)
575
if (!mKnownChangeIds.contains(changeId))
541
QVERIFY( changeId != -1 );
543
if ( resultCode == IncidenceChanger::ResultCodeSuccess )
544
QVERIFY( item.isValid() );
578
QVERIFY(mPendingSignals[ModificationSignal] > 0);
579
--mPendingSignals[ModificationSignal];
581
QVERIFY(changeId != -1);
582
QCOMPARE(resultCode, IncidenceChanger::ResultCodeSuccess);
584
if (resultCode == IncidenceChanger::ResultCodeSuccess)
585
QVERIFY(item.isValid());
546
587
kDebug() << "Error string is " << errorString;
548
maybeQuitEventLoop();
551
void handleRedone( Akonadi::History::ResultCode result )
553
QCOMPARE( result, History::ResultCodeSuccess );
554
--mPendingSignals[RedoSignal];
555
maybeQuitEventLoop();
558
void handleUndone( Akonadi::History::ResultCode result )
560
QCOMPARE( result, History::ResultCodeSuccess );
561
--mPendingSignals[UndoSignal];
562
maybeQuitEventLoop();
565
void maybeQuitEventLoop()
567
for ( int i=0; i<NumSignals; ++i ) {
568
if ( mPendingSignals.value( static_cast<SignalType>(i) ) > 0 )
571
QTestEventLoop::instance().exitLoop();
575
QTEST_AKONADIMAIN( HistoryTest, GUI )
577
#include "HistoryTest.moc"
589
maybeQuitEventLoop();
592
void HistoryTest::handleRedone(Akonadi::History::ResultCode result)
594
QCOMPARE(result, History::ResultCodeSuccess);
595
--mPendingSignals[RedoSignal];
596
maybeQuitEventLoop();
599
void HistoryTest::handleUndone(Akonadi::History::ResultCode result)
601
QCOMPARE(result, History::ResultCodeSuccess);
602
--mPendingSignals[UndoSignal];
603
maybeQuitEventLoop();
606
void HistoryTest::maybeQuitEventLoop()
608
for (int i=0; i<NumSignals; ++i) {
609
if (mPendingSignals.value(static_cast<SignalType>(i)) > 0)
612
QTestEventLoop::instance().exitLoop();
616
QTEST_AKONADIMAIN(HistoryTest, GUI)