diff -r 000000000000 -r e686773b3f54 phonebookengines/contactsmodel/tsrc/T_ContactViewEvents.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/contactsmodel/tsrc/T_ContactViewEvents.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,979 @@ +// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include +#include +#include +#include +#include +#include +#include + +#include "CContactViewEventQueue.h" +#include "CContactDbEventQueue.h" + +_LIT(KTestName, "T_GroupViewEvents"); + +_LIT(KTestDbName, "c:T_GroupViewEvents.cdb"); + +_LIT(KTestGrpName, "T_Group"); + +_LIT(KRemoteView, "Test_UnderlyingRemoteView"); + +LOCAL_D RTest test(KTestName); + +class CTestResources : public CBase + { + public: + static CTestResources* NewLC(TBool aShowContactInGrp); + static CTestResources* NewLC(TBool aShowContactInGrp, TBool aUnderlyingRemoteView); + void ConstructL(TBool aUnderlinedRemoteView = EFalse); + TContactItemId CreateTestContactL(const TDesC& aFamilyName); + ~CTestResources(); + + CContactDatabase* iDb; + CContactDbEventQueue* iDbEventQueue; + CContactViewEventQueue* iLocalViewEventQueue; + CContactViewEventQueue* iRemoteViewEventQueue; + RContactViewSortOrder iViewSortOrder; + CContactLocalView* iLocalView; + CContactNamedRemoteView* iRemoteView; + + CContactViewEventQueue* iOldAPIGroupViewEventQueue; + CContactViewEventQueue* iOldAPIFindViewEventQueue; + CContactViewEventQueue* iOldAPISubViewEventQueue; + + CContactViewEventQueue* iNewAPIGroupViewEventQueue; + CContactViewEventQueue* iNewAPIFindViewEventQueue; + CContactViewEventQueue* iNewAPISubViewEventQueue; + + CContactGroupView* iGroupViewOldAPI; + CContactFindView* iFindViewOldAPI; + CContactSubView* iSubViewOldAPI; + + CContactGroupView* iGroupViewNewAPI; + CContactFindView* iFindViewNewAPI; + CContactSubView* iSubViewNewAPI; + + CContactIdArray* iContactIdArray; + TContactItemId iTestContactId; + TContactItemId iGrpId; + + TBool iShowContactInGrp; + private: + CTestResources(TBool aShowContactInGrp); + + }; + +CTestResources::CTestResources(TBool aShowContactInGrp) + : iShowContactInGrp(aShowContactInGrp) + { + } + +CTestResources* CTestResources::NewLC(TBool aShowContactInGrp) + { + CTestResources* self = new(ELeave) CTestResources(aShowContactInGrp); + + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +CTestResources* CTestResources::NewLC(TBool aShowContactInGrp, TBool aUnderlyingRemoteView) + { + if(aUnderlyingRemoteView == EFalse) + { + return NewLC(aShowContactInGrp); + } + + CTestResources* self = new(ELeave) CTestResources(aShowContactInGrp); + CleanupStack::PushL(self); + self->ConstructL(ETrue); + return self; + } + +void CTestResources::ConstructL(TBool aUnderlinedRemoteView) + { + iDb = CContactDatabase::ReplaceL(KTestDbName); + iDbEventQueue = CContactDbEventQueue::NewL(iDb); + + iViewSortOrder.AppendL(KUidContactFieldFamilyName); + iViewSortOrder.AppendL(KUidContactFieldGivenName); + iViewSortOrder.AppendL(KUidContactFieldCompanyName); + + iContactIdArray = CContactIdArray::NewL(); + + CContactItem* grpItem = iDb->CreateContactGroupL(KTestGrpName); + iGrpId = grpItem->Id(); + delete grpItem; + + if(aUnderlinedRemoteView == EFalse) + { + iLocalViewEventQueue = CContactViewEventQueue::NewL(); + iLocalView = CContactLocalView::NewL + (*iLocalViewEventQueue, *iDb, iViewSortOrder, EContactsOnly); + } + else + { + iRemoteViewEventQueue = CContactViewEventQueue::NewL(); + iRemoteView = CContactNamedRemoteView::NewL + (*iRemoteViewEventQueue, KRemoteView, *iDb, iViewSortOrder, EContactsOnly); + } + + iOldAPIGroupViewEventQueue = CContactViewEventQueue::NewL(); + + CContactGroupView::TGroupType grpType = iShowContactInGrp ? + CContactGroupView::EShowContactsInGroup : + CContactGroupView::EShowContactsNotInAnyGroup; + + CContactViewBase* underlyingView = aUnderlinedRemoteView?(static_cast(iRemoteView)):(static_cast(iLocalView)); //do not take the ownership + // Create a group view to test old functionality/API + iGroupViewOldAPI = CContactGroupView::NewL(*iDb, *underlyingView, *iOldAPIGroupViewEventQueue, KTestGrpName, grpType); + + iOldAPIFindViewEventQueue = CContactViewEventQueue::NewL(); + CPtrCArray* findWordArray = new (ELeave) CPtrCArray(1); + findWordArray->AppendL(_L("")); + // Create a find view to test old functionality/API + iFindViewOldAPI = CContactFindView::NewL(*iDb, *underlyingView, *iOldAPIFindViewEventQueue, findWordArray); + + iOldAPISubViewEventQueue = CContactViewEventQueue::NewL(); + // Create a sub view to test old functionality/API + iSubViewOldAPI = CContactSubView::NewL(*iOldAPISubViewEventQueue,*iDb, *underlyingView,_L(">a"), _L("a"), _L("Reset(); + delete findWordArray; + + // Wait for contact views derived classes to get ready + TContactViewEvent event; + if(aUnderlinedRemoteView == EFalse) + { + __ASSERT_ALWAYS(iOldAPIGroupViewEventQueue->ListenForEvent(10,event), User::Invariant()); + __ASSERT_ALWAYS(event.iEventType == TContactViewEvent::EReady, User::Invariant()); + __ASSERT_ALWAYS(iOldAPIFindViewEventQueue->ListenForEvent(10,event), User::Invariant()); + __ASSERT_ALWAYS(event.iEventType == TContactViewEvent::EReady, User::Invariant()); + __ASSERT_ALWAYS(iOldAPISubViewEventQueue->ListenForEvent(10,event), User::Invariant()); + __ASSERT_ALWAYS(event.iEventType == TContactViewEvent::EReady, User::Invariant()); + + __ASSERT_ALWAYS(iNewAPIGroupViewEventQueue->ListenForEvent(10,event), User::Invariant()); + __ASSERT_ALWAYS(event.iEventType == TContactViewEvent::EReady, User::Invariant()); + __ASSERT_ALWAYS(iNewAPIFindViewEventQueue->ListenForEvent(10,event), User::Invariant()); + __ASSERT_ALWAYS(event.iEventType == TContactViewEvent::EReady, User::Invariant()); + __ASSERT_ALWAYS(iNewAPISubViewEventQueue->ListenForEvent(10,event), User::Invariant()); + __ASSERT_ALWAYS(event.iEventType == TContactViewEvent::EReady, User::Invariant()); + } + + // Flush all other events + iDbEventQueue->Flush(); + if(aUnderlinedRemoteView == EFalse) + { + iLocalViewEventQueue->Flush(); + } + else + { + iRemoteViewEventQueue->Flush(); + } + + iOldAPIGroupViewEventQueue->Flush(); + iOldAPIFindViewEventQueue->Flush(); + iOldAPISubViewEventQueue->Flush(); + + iNewAPIGroupViewEventQueue->Flush(); + iNewAPIFindViewEventQueue->Flush(); + iNewAPISubViewEventQueue->Flush(); + } + +TContactItemId CTestResources::CreateTestContactL(const TDesC& aFamilyName) + { + // Create a contact card + CContactCard* card = CContactCard::NewLC(); + // Create a name field + CContactItemField* field = CContactItemField::NewLC(KStorageTypeText, KUidContactFieldFamilyName); + field->TextStorage()->SetTextL(aFamilyName); + card->AddFieldL(*field); + CleanupStack::Pop(field); + // Create a phone number field + CContactItemField* phoneField = CContactItemField::NewLC(KStorageTypeText, KUidContactFieldPhoneNumber); + phoneField->TextStorage()->SetTextL(_L("555")); + card->AddFieldL(*phoneField); + CleanupStack::Pop(phoneField); + + // Add the contact to the DB + const TContactItemId contactId = iDb->AddNewContactL(*card); + CleanupStack::PopAndDestroy(card); + + // Eat away contact db events + TContactDbObserverEvent event; + while + (iDbEventQueue->ListenForEvent(10,event) && + (event.iType != EContactDbObserverEventContactAdded || + event.iContactId != contactId)) + { + } + iTestContactId = contactId; + + if(iShowContactInGrp) + { + iDb->AddContactToGroupL(contactId, iGrpId); + } + + return contactId; + } + +CTestResources::~CTestResources() + { + if (iGroupViewOldAPI) + iGroupViewOldAPI->Close(*iOldAPIGroupViewEventQueue); + delete iOldAPIGroupViewEventQueue; + + if (iFindViewOldAPI) + iFindViewOldAPI->Close(*iOldAPIFindViewEventQueue); + delete iOldAPIFindViewEventQueue; + + if (iSubViewOldAPI) + iSubViewOldAPI->Close(*iOldAPISubViewEventQueue); + delete iOldAPISubViewEventQueue; + + if (iGroupViewNewAPI) + iGroupViewNewAPI->Close(*iNewAPIGroupViewEventQueue); + delete iNewAPIGroupViewEventQueue; + + if (iFindViewNewAPI) + iFindViewNewAPI->Close(*iNewAPIFindViewEventQueue); + delete iNewAPIFindViewEventQueue; + + if (iSubViewNewAPI) + iSubViewNewAPI->Close(*iNewAPISubViewEventQueue); + delete iNewAPISubViewEventQueue; + + if (iLocalView) + iLocalView->Close(*iLocalViewEventQueue); + delete iLocalViewEventQueue; + + if (iRemoteView) + iRemoteView->Close(*iRemoteViewEventQueue); + delete iRemoteViewEventQueue; + + iContactIdArray->Reset(); + delete iContactIdArray; + + iViewSortOrder.Close(); + delete iDbEventQueue; + delete iDb; + TRAP_IGNORE(CContactDatabase::DeleteDatabaseL(KTestDbName)); + } + +LOCAL_C CTestResources* DoTestAddContactAPILC(TBool aShowContactInGrp) + { + //add 2 contacts and check if localview send events + CTestResources* res = CTestResources::NewLC(aShowContactInGrp); + + const TContactItemId contactId = res->CreateTestContactL(_L("Example1")); + res->iContactIdArray->AddL(contactId); + + // Check that iLocalView sends an event + TContactViewEvent event; + test(res->iLocalViewEventQueue->ListenForEvent(10,event)); + test(event.iEventType == TContactViewEvent::EItemAdded); + test(event.iContactId == contactId); + test(event.iInt == 0 && event.iInt < res->iLocalView->CountL()); + test(res->iLocalView->AtL(event.iInt) == res->iTestContactId); + + if(aShowContactInGrp) + { + test(res->iLocalViewEventQueue->ListenForEvent(10,event)); + test(event.iEventType == TContactViewEvent::EGroupChanged); + test(event.iContactId == res->iGrpId); + } + + const TContactItemId contactId1 = res->CreateTestContactL(_L("Example2")); + res->iContactIdArray->AddL(contactId1); + + //get the EItemAdd event + test(res->iLocalViewEventQueue->ListenForEvent(10,event)); + test(event.iEventType == TContactViewEvent::EItemAdded); + test(event.iContactId == contactId1); + test(event.iInt == 1); + test(res->iLocalView->AtL(event.iInt) == res->iTestContactId); + + if(aShowContactInGrp) + { + test(res->iLocalViewEventQueue->ListenForEvent(10,event)); + test(event.iEventType == TContactViewEvent::EGroupChanged); + test(event.iContactId == res->iGrpId); + } + + return res; + } + + +LOCAL_C void TestAddContactOldAPIL(TBool aShowContactInGrp) + { + test.Next(_L("Add a contact with phone number - old api")); + + CTestResources* res = DoTestAddContactAPILC(aShowContactInGrp); + + TContactViewEvent event; + + for(int i = 0; i < 2; i++) + { + // There should come EItemAdded event from group view - check if iInt is the right one + test(res->iOldAPIGroupViewEventQueue->ListenForEvent(10,event)); + test(event.iEventType == TContactViewEvent::EItemAdded); + test(event.iInt == 0); + + if(aShowContactInGrp) + { + //Consume add to group event + test(res->iOldAPIGroupViewEventQueue->ListenForEvent(10,event)); + } + + // There should come EItemAdded event from find view - check if iInt is the right one + test(res->iOldAPIFindViewEventQueue->ListenForEvent(10,event)); + test(event.iEventType == TContactViewEvent::EItemAdded); + test(event.iInt == 0); + + if(aShowContactInGrp) + { + //Consume add to group event + test(res->iOldAPIFindViewEventQueue->ListenForEvent(10,event)); + } + + // There should come EItemAdded event from sub view - check if iInt is the right one + test(res->iOldAPISubViewEventQueue->ListenForEvent(10,event)); + test(event.iEventType == TContactViewEvent::EItemAdded); + test(event.iInt == 0); + + if(aShowContactInGrp) + { + //Consume add to group event + test(res->iOldAPISubViewEventQueue->ListenForEvent(10,event)); + } + } + CleanupStack::PopAndDestroy(res); + } + + +LOCAL_C void TestRemoveContactOldAPIL(TBool aShowContactInGrp) + { + test.Next(_L("Remove a contact with phone number - old api")); + + CTestResources* res = DoTestAddContactAPILC(aShowContactInGrp); + + TContactViewEvent viewEvent; + + int factor = aShowContactInGrp? 2 : 1; + + // first comsume the add events from group view, find view and sub view + for(int i = 0; i < 2 * factor; i++) + { + test(res->iOldAPIGroupViewEventQueue->ListenForEvent(10,viewEvent)); + test(res->iOldAPIFindViewEventQueue->ListenForEvent(10,viewEvent)); + test(res->iOldAPISubViewEventQueue->ListenForEvent(10,viewEvent)); + } + + // Delete the last added contact + res->iDb->DeleteContactL(res->iTestContactId); + + // Wait for a DB event + TContactDbObserverEvent dbEvent; + if(aShowContactInGrp) + { + test(res->iDbEventQueue->ListenForEvent(10,dbEvent)); + test(dbEvent.iType == EContactDbObserverEventGroupChanged); + } + + test(res->iDbEventQueue->ListenForEvent(10,dbEvent)); + test(dbEvent.iType == EContactDbObserverEventContactDeleted); + test(dbEvent.iContactId == res->iTestContactId); + + // Check that iLocalView sends an event + test(res->iLocalViewEventQueue->ListenForEvent(10,viewEvent)); + test(viewEvent.iEventType == TContactViewEvent::EItemRemoved); + test(viewEvent.iContactId == res->iTestContactId); + test(viewEvent.iInt == 1); + test(res->iLocalView->FindL(viewEvent.iContactId) == KErrNotFound); + + // There should come events from group view - check if iInt is the right one + test(res->iOldAPIGroupViewEventQueue->ListenForEvent(10,viewEvent)); + test(viewEvent.iEventType == TContactViewEvent::EItemRemoved); + test(viewEvent.iContactId == res->iTestContactId); + test(viewEvent.iInt == 1); + test(res->iGroupViewOldAPI->FindL(viewEvent.iContactId) == KErrNotFound); + + // There should come events from find view - check if iInt is the right one + test(res->iOldAPIFindViewEventQueue->ListenForEvent(10,viewEvent)); + test(viewEvent.iEventType == TContactViewEvent::EItemRemoved); + test(viewEvent.iContactId == res->iTestContactId); + test(viewEvent.iInt == 0); + test(res->iGroupViewOldAPI->FindL(viewEvent.iContactId) == KErrNotFound); + + // There should come events from sub view - check if iInt is the right one + test(res->iOldAPISubViewEventQueue->ListenForEvent(10,viewEvent)); + test(viewEvent.iEventType == TContactViewEvent::EItemRemoved); + test(viewEvent.iContactId == res->iTestContactId); + test(viewEvent.iInt == 0); + test(res->iGroupViewOldAPI->FindL(viewEvent.iContactId) == KErrNotFound); + + CleanupStack::PopAndDestroy(res); + } + +LOCAL_C void TestAddContactNewAPIL(TBool aShowContactInGrp) + { + test.Next(_L("Add a contact with phone number - new api")); + + CTestResources* res = DoTestAddContactAPILC(aShowContactInGrp); + + TContactViewEvent event; + + for(int i = 0; i < 2; i++) + { + // There should come EItemAdded event from group view - check if iInt is the right one + if(aShowContactInGrp) + { + //Consume add to group event + test(res->iNewAPIGroupViewEventQueue->ListenForEvent(10,event)); + test(event.iEventType == TContactViewEvent::ESortOrderChanged); + } + else //TO_FIX + { + test(res->iNewAPIGroupViewEventQueue->ListenForEvent(10,event)); + test(event.iEventType == TContactViewEvent::EItemAdded); + test(event.iInt == i); + } + + + // There should come EItemAdded event from find view - check if iInt is the right one + test(res->iNewAPIFindViewEventQueue->ListenForEvent(10,event)); + test(event.iEventType == TContactViewEvent::EItemAdded); + test(event.iInt == i); + + if(aShowContactInGrp) + { + //Consume add to group event + test(res->iNewAPIFindViewEventQueue->ListenForEvent(10,event)); + test(event.iEventType == TContactViewEvent::EGroupChanged); + } + + + // There should come EItemAdded event from sub view - check if iInt is the right one + test(res->iNewAPISubViewEventQueue->ListenForEvent(10,event)); + test(event.iEventType == TContactViewEvent::EItemAdded); + test(event.iInt == i); + if(aShowContactInGrp) + { + //Consume add to group event + test(res->iNewAPISubViewEventQueue->ListenForEvent(10,event)); + test(event.iEventType == TContactViewEvent::EGroupChanged); + } + + } + CleanupStack::PopAndDestroy(res); + } + + +LOCAL_C void TestRemoveContactNewAPIL(TBool aShowContactInGrp) + { + test.Next(_L("Remove a contact with phone number - new api")); + + CTestResources* res = DoTestAddContactAPILC(aShowContactInGrp); + + TContactViewEvent viewEvent; + + // first comsume the add events from group view, find view and sub view + res->iNewAPIGroupViewEventQueue->Flush(); + res->iNewAPIFindViewEventQueue->Flush(); + res->iNewAPISubViewEventQueue->Flush(); + + // Delete the last added contact + res->iDb->DeleteContactL(res->iTestContactId); + + // Wait for a DB event + TContactDbObserverEvent dbEvent; + if(aShowContactInGrp) + { + test(res->iDbEventQueue->ListenForEvent(10,dbEvent)); + test(dbEvent.iType == EContactDbObserverEventGroupChanged); + } + + test(res->iDbEventQueue->ListenForEvent(10,dbEvent)); + test(dbEvent.iType == EContactDbObserverEventContactDeleted); + test(dbEvent.iContactId == res->iTestContactId); + + // Check that iLocalView sends an event + test(res->iLocalViewEventQueue->ListenForEvent(10,viewEvent)); + test(viewEvent.iEventType == TContactViewEvent::EItemRemoved); + test(viewEvent.iContactId == res->iTestContactId); + test(viewEvent.iInt == 1); + test(res->iLocalView->FindL(viewEvent.iContactId) == KErrNotFound); + + // There should come events from group view - check if iInt is the right one + test(res->iNewAPIGroupViewEventQueue->ListenForEvent(10,viewEvent)); + test(viewEvent.iEventType == TContactViewEvent::EItemRemoved); + test(viewEvent.iContactId == res->iTestContactId); + test(viewEvent.iInt == 1); + test(res->iGroupViewOldAPI->FindL(viewEvent.iContactId) == KErrNotFound); + + // There should come events from find view - check if iInt is the right one + test(res->iNewAPIFindViewEventQueue->ListenForEvent(10,viewEvent)); + test(viewEvent.iEventType == TContactViewEvent::EItemRemoved); + test(viewEvent.iContactId == res->iTestContactId); + test(viewEvent.iInt == 1); + test(res->iGroupViewOldAPI->FindL(viewEvent.iContactId) == KErrNotFound); + + // There should come events from sub view - check if iInt is the right one + test(res->iNewAPISubViewEventQueue->ListenForEvent(10,viewEvent)); + test(viewEvent.iEventType == TContactViewEvent::EItemRemoved); + test(viewEvent.iContactId == res->iTestContactId); + test(viewEvent.iInt == 1); + test(res->iGroupViewOldAPI->FindL(viewEvent.iContactId) == KErrNotFound); + + CleanupStack::PopAndDestroy(res); + } + +/* +This function checks that for multiple deletes using the DeleteContactsL api, this generates +an EUnavailable event before sending EItemRemoved events to signify that the views are +not synchronised yet. When the views are synchronised then a final EReady event is sent +and all the views should then be consistent. All the subviews also receive the EUnavailable +and EReady events. +*/ + + +LOCAL_C void TestRemoveContactsNewAPIL(TBool aShowContactInGrp) + { + test.Next(_L("Remove multiple contacts with phone number - new api")); + + CTestResources* res = DoTestAddContactAPILC(aShowContactInGrp); + + TContactViewEvent viewEvent; + + // first consume the add events from group view, find view and sub view + res->iNewAPIGroupViewEventQueue->Flush(); + res->iNewAPIFindViewEventQueue->Flush(); + res->iNewAPISubViewEventQueue->Flush(); + + // Delete multiple contacts, there are two in the array + res->iDb->DeleteContactsL(*(res->iContactIdArray)); + + + //Check that the view has not been updated yet after the delete + TInt groupViewCount = res->iGroupViewNewAPI->CountL(); + test(groupViewCount == 2); + TInt contactViewBaseContactId = res->iGroupViewNewAPI->AtL(0); + const CViewContact &vcontact = res->iGroupViewNewAPI->ContactAtL(0); + + + // Wait for a DB event + TContactDbObserverEvent dbEvent; + + test(res->iDbEventQueue->ListenForEvent(10,dbEvent)); + test(res->iDbEventQueue->ListenForEvent(10,dbEvent)); + test(dbEvent.iType == EContactDbObserverEventUnknownChanges); + + // Check that iLocalView sends an event + test(res->iLocalViewEventQueue->ListenForEvent(10,viewEvent)); + test(viewEvent.iEventType == TContactViewEvent::EUnavailable); + test(res->iLocalViewEventQueue->ListenForEvent(10,viewEvent)); + test(viewEvent.iEventType == TContactViewEvent::EReady); + + + // There should be events from the group view - check if iInt is the right one + test(res->iNewAPIGroupViewEventQueue->ListenForEvent(10,viewEvent)); + test(viewEvent.iEventType == TContactViewEvent::EUnavailable); + test(res->iNewAPIGroupViewEventQueue->ListenForEvent(10,viewEvent)); + test(viewEvent.iEventType == TContactViewEvent::EItemRemoved); + test(res->iNewAPIGroupViewEventQueue->ListenForEvent(10,viewEvent)); + test(viewEvent.iEventType == TContactViewEvent::EItemRemoved); + test(viewEvent.iContactId == res->iTestContactId); + test(viewEvent.iInt == 0); + + test(res->iNewAPIGroupViewEventQueue->ListenForEvent(10,viewEvent)); + test(viewEvent.iEventType == TContactViewEvent::EReady); + + + // The group view should be consistent, there should be no contacts in this view + groupViewCount = res->iGroupViewNewAPI->CountL(); + test(groupViewCount == 0); + // should not be able to find anything + TRAPD(err, contactViewBaseContactId = res->iGroupViewNewAPI->AtL(0)); + test(err == KErrNotFound); + + + + // Check that the find view receives its events + if(aShowContactInGrp) + { + test(res->iNewAPIFindViewEventQueue->ListenForEvent(10,viewEvent)); + test(viewEvent.iEventType == TContactViewEvent::EUnavailable); + test(res->iNewAPIFindViewEventQueue->ListenForEvent(10,viewEvent)); + test(viewEvent.iEventType == TContactViewEvent::EReady); + } + + + // Check that the subview event queue receives events correctly + if(aShowContactInGrp) + { + test(res->iNewAPISubViewEventQueue->ListenForEvent(10,viewEvent)); + test(viewEvent.iEventType == TContactViewEvent::EUnavailable); + test(res->iNewAPISubViewEventQueue->ListenForEvent(10,viewEvent)); + test(viewEvent.iEventType == TContactViewEvent::EReady); + } + test.Next(_L("Remove multiple contacts with phone number - new api Successfull")); + CleanupStack::PopAndDestroy(res); + } + +/* +This function checks that for multiple deletes using the DeleteContactL api, EItemRemoved +events are sent in the right order and with the right info. A remote view is used +*/ + + +LOCAL_C void TestRemoveContactRemoteViewNewAPIL(TBool aShowContactInGrp) +{ + test.Next(_L("Remote view - delete multiple contacts - new api")); + + CTestResources* res = CTestResources::NewLC(aShowContactInGrp, ETrue); + TContactViewEvent viewEvent; + + CContactIdArray* idArray = CContactIdArray::NewLC(); + // Create 4 contacts + for(TInt loop = 0; loop < 4; ++loop) + { + idArray->AddL(res->CreateTestContactL(_L("a"))); + } + + //just consume events + while(res->iRemoteViewEventQueue->ListenForEvent(1, viewEvent)) + { + } + + // how many contacts do we have in remote view? + TInt remoteViewCount = res->iRemoteView->CountL(); + test(remoteViewCount == 4); + + //delete all contacts now + for(TInt loop = 0; loop < idArray->Count(); ++loop) + { + res->iDb->DeleteContactL((*idArray)[loop]); + } + + int currentEvent = 0; + // check incoming events + while(res->iRemoteViewEventQueue->ListenForEvent(1, viewEvent)) + { + test(viewEvent.iEventType == TContactViewEvent::EItemRemoved); + test(viewEvent.iInt == 0); + test(viewEvent.iContactId == (*idArray)[currentEvent++]); + } + + while(idArray->Count() > 0) + { + idArray->Remove(0); + } + + CleanupStack::PopAndDestroy(2, res); + } + +LOCAL_C void SetTextFieldL(CContactItem& aItem, TUid aType, const TDesC& aValue) + { + CContactItemFieldSet& fieldSet = aItem.CardFields(); + const TInt pos = fieldSet.Find(aType); + if(pos == KErrNotFound) + { + // if does not exist add this field + CContactItemField* field = CContactItemField::NewLC(KStorageTypeText, aType); + field->TextStorage()->SetTextL(aValue); + aItem.AddFieldL(*field); + CleanupStack::Pop(field); + } + else + { + fieldSet[pos].TextStorage()->SetTextL(aValue); + } + } + + +LOCAL_C void TestSimulateSyncSessionL() + { + test.Next(_L("Simulate a sync session - 2 contacts changed - new api")); + + CTestResources* res = CTestResources::NewLC(ETrue, ETrue); + TContactViewEvent viewEvent; + + // Create 2 contacts + TContactItemId firstContactId = res->CreateTestContactL(_L("ExampleA")); + TContactItemId secondContactId = res->CreateTestContactL(_L("ExampleB")); + + //we should have 5 events here + test(res->iNewAPIGroupViewEventQueue->ListenForEvent(10,viewEvent)); + test(viewEvent.iEventType == TContactViewEvent::EReady); + test(res->iNewAPIGroupViewEventQueue->ListenForEvent(10,viewEvent)); + test(viewEvent.iEventType == TContactViewEvent::EItemAdded); + test(res->iNewAPIGroupViewEventQueue->ListenForEvent(10,viewEvent)); + test(viewEvent.iEventType == TContactViewEvent::ESortOrderChanged); + test(res->iNewAPIGroupViewEventQueue->ListenForEvent(10,viewEvent)); + test(viewEvent.iEventType == TContactViewEvent::EItemAdded); + test(res->iNewAPIGroupViewEventQueue->ListenForEvent(10,viewEvent)); + test(viewEvent.iEventType == TContactViewEvent::ESortOrderChanged); + + TInt groupViewCount = res->iGroupViewNewAPI->CountL(); + test(groupViewCount == 2); + + // change existing contact items + CContactItem* firstContact = res->iDb->OpenContactL(firstContactId); + CleanupStack::PushL(firstContact); + CContactItem* secondContact = res->iDb->OpenContactL(secondContactId); + CleanupStack::PushL(secondContact); + + // change name + SetTextFieldL(*firstContact, KUidContactFieldFamilyName, _L("ExampleA1")); + SetTextFieldL(*secondContact, KUidContactFieldFamilyName, _L("1ExampleB")); + + res->iNewAPIGroupViewEventQueue->Flush(); + res->iNewAPIFindViewEventQueue->Flush(); + res->iNewAPISubViewEventQueue->Flush(); + + res->iDb->CommitContactL(*firstContact); + res->iDb->CommitContactL(*secondContact); + + // check events and count in group view after these changes + test(res->iNewAPIGroupViewEventQueue->ListenForEvent(10, viewEvent)); + test(viewEvent.iEventType == TContactViewEvent::EItemRemoved); //first we should have a removed + test(res->iGroupViewNewAPI->CountL() == 1); + test(res->iNewAPIGroupViewEventQueue->ListenForEvent(10, viewEvent)); + test(viewEvent.iEventType == TContactViewEvent::EItemAdded); //then we should have an add + test(res->iGroupViewNewAPI->CountL() == 2); + test(res->iNewAPIGroupViewEventQueue->ListenForEvent(10, viewEvent)); + test(viewEvent.iEventType == TContactViewEvent::EItemRemoved); //then we should have a removed + test(res->iGroupViewNewAPI->CountL() == 1); + test(res->iNewAPIGroupViewEventQueue->ListenForEvent(10, viewEvent)); + test(viewEvent.iEventType == TContactViewEvent::EItemAdded); //then we should have an add + test(res->iGroupViewNewAPI->CountL() == 2); + + // check now the status of the group view - we should have 1Baname ; Apan1 in the group view + test(res->iGroupViewNewAPI->ContactAtL(0).Id() == secondContactId); + test(res->iGroupViewNewAPI->ContactAtL(1).Id() == firstContactId); + CleanupStack::PopAndDestroy(2, firstContact); + + // change back + firstContact = res->iDb->OpenContactL(firstContactId); + CleanupStack::PushL(firstContact); + secondContact = res->iDb->OpenContactL(secondContactId); + CleanupStack::PushL(secondContact); + // change back contacts + SetTextFieldL(*firstContact, KUidContactFieldFamilyName, _L("ExampleA")); + SetTextFieldL(*secondContact, KUidContactFieldFamilyName, _L("ExampleB")); + res->iDb->CommitContactL(*firstContact); + res->iDb->CommitContactL(*secondContact); + //just consume events + while(res->iNewAPIGroupViewEventQueue->ListenForEvent(1, viewEvent)) + { + } + // check now the status of the group view - we should have Apan ; Baname in the group view + test(res->iGroupViewNewAPI->ContactAtL(0).Id() == firstContactId); + test(res->iGroupViewNewAPI->ContactAtL(1).Id() == secondContactId); + CleanupStack::PopAndDestroy(2, firstContact); + + // change again contacts but commit changes in different order + firstContact = res->iDb->OpenContactL(firstContactId); + CleanupStack::PushL(firstContact); + secondContact = res->iDb->OpenContactL(secondContactId); + CleanupStack::PushL(secondContact); + // change back contacts + SetTextFieldL(*firstContact, KUidContactFieldFamilyName, _L("ExampleA1")); + SetTextFieldL(*secondContact, KUidContactFieldFamilyName, _L("1ExampleB")); + res->iDb->CommitContactL(*firstContact); + res->iDb->CommitContactL(*secondContact); + + // check events and count in group view after these changes + test(res->iNewAPIGroupViewEventQueue->ListenForEvent(10, viewEvent)); + test(viewEvent.iEventType == TContactViewEvent::EItemRemoved); //first we should have a removed + test(res->iGroupViewNewAPI->CountL() == 1); + test(res->iNewAPIGroupViewEventQueue->ListenForEvent(10, viewEvent)); + test(viewEvent.iEventType == TContactViewEvent::EItemAdded); //then we should have an add + test(res->iGroupViewNewAPI->CountL() == 2); + test(res->iNewAPIGroupViewEventQueue->ListenForEvent(10, viewEvent)); + test(viewEvent.iEventType == TContactViewEvent::EItemRemoved); //then we should have a removed + test(res->iGroupViewNewAPI->CountL() == 1); + test(res->iNewAPIGroupViewEventQueue->ListenForEvent(10, viewEvent)); + test(viewEvent.iEventType == TContactViewEvent::EItemAdded); //then we should have an add + test(res->iGroupViewNewAPI->CountL() == 2); + // check now the status of the group view - we should have 1Baname ; Apan1 in the group view + test(res->iGroupViewNewAPI->ContactAtL(0).Id() == secondContactId); + test(res->iGroupViewNewAPI->ContactAtL(1).Id() == firstContactId); + + CleanupStack::PopAndDestroy(3, res); + } + + +LOCAL_C void TestSimulateSyncSession1L() + { + test.Next(_L("Simulate a sync session - 3 contacts changed - new api - new api")); + + CTestResources* res = CTestResources::NewLC(ETrue, ETrue); + TContactViewEvent viewEvent; + + // Create 3 contacts + TContactItemId firstContactId = res->CreateTestContactL(_L("a")); + TContactItemId secondContactId = res->CreateTestContactL(_L("b")); + TContactItemId thirdContactId = res->CreateTestContactL(_L("c")); + + //just consume events + while(res->iNewAPIGroupViewEventQueue->ListenForEvent(10, viewEvent)) + { + } + + TInt groupViewCount = res->iGroupViewNewAPI->CountL(); + test(groupViewCount == 3); + + // change existing contact items + CContactItem* firstContact = res->iDb->OpenContactL(firstContactId); + CleanupStack::PushL(firstContact); + CContactItem* secondContact = res->iDb->OpenContactL(secondContactId); + CleanupStack::PushL(secondContact); + CContactItem* thirdContact = res->iDb->OpenContactL(thirdContactId); + CleanupStack::PushL(thirdContact); + + // change name + SetTextFieldL(*firstContact, KUidContactFieldFamilyName, _L("3a")); + SetTextFieldL(*secondContact, KUidContactFieldFamilyName, _L("2b")); + SetTextFieldL(*thirdContact, KUidContactFieldFamilyName, _L("1c")); + + res->iNewAPIGroupViewEventQueue->Flush(); + res->iNewAPIFindViewEventQueue->Flush(); + res->iNewAPISubViewEventQueue->Flush(); + + res->iDb->CommitContactL(*firstContact); + res->iDb->CommitContactL(*secondContact); + res->iDb->CommitContactL(*thirdContact); + + //just consume events + while(res->iNewAPIGroupViewEventQueue->ListenForEvent(1, viewEvent)) + { + } + + // check now the status of the group view - we should have 1c ; 2b ; 3a in the group view + test(res->iGroupViewNewAPI->ContactAtL(0).Id() == thirdContactId); + test(res->iGroupViewNewAPI->ContactAtL(1).Id() == secondContactId); + test(res->iGroupViewNewAPI->ContactAtL(2).Id() == firstContactId); + CleanupStack::PopAndDestroy(3, firstContact); + + //change back + firstContact = res->iDb->OpenContactL(firstContactId); + CleanupStack::PushL(firstContact); + secondContact = res->iDb->OpenContactL(secondContactId); + CleanupStack::PushL(secondContact); + thirdContact = res->iDb->OpenContactL(thirdContactId); + CleanupStack::PushL(thirdContact); + + // change name + SetTextFieldL(*firstContact, KUidContactFieldFamilyName, _L("a")); + SetTextFieldL(*secondContact, KUidContactFieldFamilyName, _L("b")); + SetTextFieldL(*thirdContact, KUidContactFieldFamilyName, _L("c")); + + res->iDb->CommitContactL(*firstContact); + res->iDb->CommitContactL(*secondContact); + res->iDb->CommitContactL(*thirdContact); + + //just consume events + while(res->iNewAPIGroupViewEventQueue->ListenForEvent(1, viewEvent)) + { + } + + // check now the status of the group view - we should have a ; b ; c in the group view + test(res->iGroupViewNewAPI->ContactAtL(0).Id() == firstContactId); + test(res->iGroupViewNewAPI->ContactAtL(1).Id() == secondContactId); + test(res->iGroupViewNewAPI->ContactAtL(2).Id() == thirdContactId); + + CleanupStack::PopAndDestroy(4, res); + } + +/** + +@SYMTestCaseID PIM-T-CONTACTVIEWEVENTS-0001 + +*/ + +void DoTestsL() + { + test.Start(_L("@SYMTESTCaseID:PIM-T-CONTACTVIEWEVENTS-0001 T_FilteredViewEvents")); + + + //Test with contacts not in group + TestAddContactOldAPIL(EFalse); + TestRemoveContactOldAPIL(EFalse); + TestAddContactNewAPIL(EFalse); + TestRemoveContactNewAPIL(EFalse); + TestRemoveContactRemoteViewNewAPIL(EFalse); + + //Test with contacts in group + TestAddContactOldAPIL(ETrue); + TestRemoveContactOldAPIL(ETrue); + TestAddContactNewAPIL(ETrue); + TestRemoveContactNewAPIL(ETrue); + TestRemoveContactRemoteViewNewAPIL(ETrue); + + // remove multiple contacts + TestRemoveContactsNewAPIL(ETrue); + TestSimulateSyncSessionL(); + TestSimulateSyncSession1L(); + + test.End(); + test.Close(); + + } + +GLDEF_C TInt E32Main() + { + // Init + __UHEAP_MARK; + + CTrapCleanup* cleanupStack = CTrapCleanup::New(); + if (!cleanupStack) + { + return KErrNoMemory; + } + + CActiveScheduler* activeScheduler = new CActiveScheduler; + if (!activeScheduler) + { + return KErrNoMemory; + } + CActiveScheduler::Install(activeScheduler); + + // Run the tests + TRAPD(err, DoTestsL()); + + // Cleanup + delete activeScheduler; + delete cleanupStack; + + __UHEAP_MARKEND; + + return err; + }