diff -r 000000000000 -r e686773b3f54 phonebookengines/contactsmodel/tsrc/T_PreferencesBug.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/contactsmodel/tsrc/T_PreferencesBug.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,865 @@ +// Copyright (c) 2003-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: +// PreferencesBug Test module +// +// + + +#include +#include +#include +#include +#include +#include +#include + +#include "CContactViewEventQueue.h" +#include "CContactDbEventQueue.h" + +_LIT(KTestName, "T_PreferencesBug"); + +_LIT(KTestDbName, "c:T_PreferencesBug.cdb"); + +const TInt KEventWaitTime = 2; + +LOCAL_D RTest test(KTestName); + +enum TPanicCode + { + EPanicNoReadyEventFromView = 1 + }; + +static void Panic(TInt aReason) + { + User::Panic(KTestName, aReason); + } + +class CTestResources : public CBase + { + public: // Interface + static CTestResources* NewLC(); + void ConstructL(); + void CreateTestViewsL + (TContactViewPreferences aAddViewPreferences=static_cast(0)); + ~CTestResources(); + + enum TTestViews + { + ETestViewContactsOnly, + ETestViewGroupsOnly, + ETestViewContactsAndGroups + }; + + CContactDatabase& Db() const { return *iDb; } + CContactDbEventQueue& DbEvents() const { return *iDbEvents; } + + CContactViewBase& TestView(TTestViews aViewIndex) const + { + return *iTestViews[aViewIndex].iView; + } + + CContactViewEventQueue& TestViewEvents(TTestViews aViewIndex) const + { + return *iTestViews[aViewIndex].iViewEvents; + } + + private: // Implementation + struct TTestViewInit + { + enum { KMaxSortOrderLen = 5 }; + TContactViewPreferences iViewPrefs; + TInt iSortOrder[KMaxSortOrderLen]; + }; + + class TTestView + { + public: + TTestView(); + void InitLC + (CContactDatabase& aDb, + TContactViewPreferences aAddViewPreferences, + const TTestViewInit& aInit); + void Destroy(); + RContactViewSortOrder iSortOrder; + CContactViewEventQueue* iViewEvents; + CContactLocalView* iView; + private: + static void Cleanup(TAny* aPtr); + }; + + private: // Data + static const TTestViewInit iTestViewInit[]; + CContactDatabase* iDb; + CContactDbEventQueue* iDbEvents; + RArray iTestViews; + }; + +// Constant data for creating the test views +const CTestResources::TTestViewInit CTestResources::iTestViewInit[] = + { + { EContactsOnly, + { KUidContactFieldFamilyNameValue, KUidContactFieldGivenNameValue, KUidContactFieldCompanyNameValue, KNullUidValue } }, + { EGroupsOnly, + { KUidContactFieldTemplateLabelValue, KNullUidValue } }, + { EContactAndGroups, + { KUidContactFieldFamilyNameValue, KUidContactFieldGivenNameValue, KUidContactFieldCompanyNameValue, KUidContactFieldTemplateLabelValue, KNullUidValue } }, + { static_cast(0), { KNullUidValue } } + }; + +CTestResources* CTestResources::NewLC() + { + CTestResources* self = new(ELeave) CTestResources; + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +void CTestResources::ConstructL() + { + iDb = CContactDatabase::ReplaceL(KTestDbName); + iDbEvents = CContactDbEventQueue::NewL(iDb); + } + +void CTestResources::CreateTestViewsL(TContactViewPreferences aAddViewPreferences) + { + for (const TTestViewInit* initData = iTestViewInit; + initData->iSortOrder[0]!=KNullUidValue; + ++initData) + { + TTestView testView; + testView.InitLC(*iDb,aAddViewPreferences,*initData); + User::LeaveIfError(iTestViews.Append(testView)); + CleanupStack::Pop(); // testView + } + + // Wait for the views to get ready + for (TInt i=0; iListenForEvent(10,event), + Panic(EPanicNoReadyEventFromView)); + __ASSERT_ALWAYS(event.iEventType==TContactViewEvent::EReady, + Panic(EPanicNoReadyEventFromView)); + } + } + +CTestResources::~CTestResources() + { + for (TInt i=iTestViews.Count()-1; i>=0; --i) + { + iTestViews[i].Destroy(); + } + iTestViews.Close(); + delete iDbEvents; + delete iDb; + TRAP_IGNORE(CContactDatabase::DeleteDatabaseL(KTestDbName)); + } + +CTestResources::TTestView::TTestView() + : iViewEvents(NULL), iView(NULL) + { + } + +void CTestResources::TTestView::InitLC + (CContactDatabase& aDb, + TContactViewPreferences aAddViewPreferences, + const TTestViewInit& aInit) + { + CleanupStack::PushL(TCleanupItem(Cleanup,this)); + for (const TInt* fieldType=aInit.iSortOrder; *fieldType!=KNullUidValue; ++fieldType) + { + iSortOrder.AppendL(TUid::Uid(*fieldType)); + } + iViewEvents = CContactViewEventQueue::NewL(); + iView = CContactLocalView::NewL + (*iViewEvents, + aDb, + iSortOrder, + static_cast(aInit.iViewPrefs|aAddViewPreferences)); + } + +void CTestResources::TTestView::Destroy() + { + if (iView) iView->Close(*iViewEvents); + delete iViewEvents; + iSortOrder.Close(); + } + +void CTestResources::TTestView::Cleanup(TAny* aPtr) + { + static_cast(aPtr)->Destroy(); + } + + +LOCAL_C void AddFieldToContactL + (CContactItem& aContact, TFieldType aFieldType, const TDesC& aText) + { + CContactItemField* field = CContactItemField::NewLC(KStorageTypeText, aFieldType); + field->TextStorage()->SetTextL(aText); + aContact.AddFieldL(*field); + CleanupStack::Pop(field); + } + +LOCAL_C TContactItemId CreateTestContactL + (CContactDatabase& aDb, + const TDesC& aFamilyName, + const TDesC& aGivenName, + const TDesC& aCompanyName) + { + CContactCard* card = CContactCard::NewLC(); + AddFieldToContactL(*card, KUidContactFieldFamilyName, aFamilyName); + AddFieldToContactL(*card, KUidContactFieldGivenName, aGivenName); + AddFieldToContactL(*card, KUidContactFieldCompanyName, aCompanyName); + const TContactItemId id = aDb.AddNewContactL(*card); + CleanupStack::PopAndDestroy(card); + return id; + } + +LOCAL_C TContactItemId CreateTestGroupL + (CContactDatabase& aDb, + const TDesC& aLabel) + { + CContactItem* group = aDb.CreateContactGroupLC(aLabel); + const TContactItemId id = group->Id(); + CleanupStack::PopAndDestroy(group); + return id; + } + +/** + * Returns ETrue if aView contains all the contacts in aContacts. + */ +LOCAL_C TBool ContainsAllContactsL + (const CContactViewBase& aView, const CContactIdArray& aContacts) + { + for (TInt i=0; i < aContacts.Count(); ++i) + { + if (aView.FindL(aContacts[i])==KErrNotFound) + { + return EFalse; + } + } + return ETrue; + } + +/** + * Returns ETrue if aView doesn't contain _any_ contact of aContacts. + */ +LOCAL_C TBool DoesNotContainsContactsL + (const CContactViewBase& aView, const CContactIdArray& aContacts) + { + for (TInt i=0; i < aContacts.Count(); ++i) + { + if (aView.FindL(aContacts[i])!=KErrNotFound) + { + return EFalse; + } + } + return ETrue; + } + + + +// TEST CODE + +LOCAL_C void TestOpenViewsWithExistingDataL + (TContactViewPreferences aAddPrefs) + { + CTestResources* res = CTestResources::NewLC(); + + // Create test contacts and a group + CContactIdArray* groups = CContactIdArray::NewLC(); + TContactItemId groupId = CreateTestGroupL(res->Db(), _L("SYMBIANFOUNDATION")); + groups->AddL(groupId); + + CContactIdArray* unsortedGroups = CContactIdArray::NewLC(); + groupId = CreateTestGroupL(res->Db(), _L("")); + unsortedGroups->AddL(groupId); + + CContactIdArray* contacts = CContactIdArray::NewLC(); + TContactItemId id = CreateTestContactL(res->Db(), _L("Test"), _L("Name"), _L("SYMBIANFOUNDATION")); + contacts->AddL(id); + res->Db().AddContactToGroupL(id,(*groups)[0]); + id = CreateTestContactL(res->Db(), _L("Example"), _L("Name"), _L("SYMBIANFOUNDATION")); + contacts->AddL(id); + res->Db().AddContactToGroupL(id,(*groups)[0]); + id = CreateTestContactL(res->Db(), _L("Sample"), _L("Name"), _L("SYMBIANFOUNDATION1")); + contacts->AddL(id); + + CContactIdArray* unsortedContacts = CContactIdArray::NewLC(); + id = CreateTestContactL(res->Db(), _L(""), _L(""), _L("")); + unsortedContacts->AddL(id); + + id = CreateTestContactL(res->Db(), _L(" "), _L(" "), _L(" ")); + if (aAddPrefs & ESingleWhiteSpaceIsEmptyField) + { + unsortedContacts->AddL(id); + } + else + { + contacts->AddL(id); + } + + // Eat all DB events + TContactDbObserverEvent dbEvent; + while (res->DbEvents().ListenForEvent(KEventWaitTime,dbEvent)) + { + } + + // Create the test contact views + res->CreateTestViewsL(aAddPrefs); + + // Check the test view states + test.Next(_L("Check EContactsOnly view contains all the contacts")); + test(ContainsAllContactsL(res->TestView(CTestResources::ETestViewContactsOnly), *contacts)); + if (res->TestView(CTestResources::ETestViewContactsOnly).ContactViewPreferences() & EIgnoreUnSorted) + { + test(DoesNotContainsContactsL(res->TestView(CTestResources::ETestViewContactsOnly), *unsortedContacts)); + } + else + { + test(ContainsAllContactsL(res->TestView(CTestResources::ETestViewContactsOnly), *unsortedContacts)); + } + + test.Next(_L("Check EGroupsOnly view contains all the groups")); + test(ContainsAllContactsL(res->TestView(CTestResources::ETestViewGroupsOnly), *groups)); + if (res->TestView(CTestResources::ETestViewGroupsOnly).ContactViewPreferences() & EIgnoreUnSorted) + { + test(DoesNotContainsContactsL(res->TestView(CTestResources::ETestViewGroupsOnly), *unsortedGroups)); + } + else + { + test(ContainsAllContactsL(res->TestView(CTestResources::ETestViewGroupsOnly), *unsortedGroups)); + } + + test.Next(_L("Check EContactAndGroups view contains all contacts and groups")); + test(ContainsAllContactsL(res->TestView(CTestResources::ETestViewContactsAndGroups), *groups)); + test(ContainsAllContactsL(res->TestView(CTestResources::ETestViewContactsAndGroups), *contacts)); + if (res->TestView(CTestResources::ETestViewContactsAndGroups).ContactViewPreferences() & EIgnoreUnSorted) + { + test(DoesNotContainsContactsL(res->TestView(CTestResources::ETestViewContactsAndGroups), *unsortedContacts)); + test(DoesNotContainsContactsL(res->TestView(CTestResources::ETestViewContactsAndGroups), *unsortedGroups)); + } + else + { + test(ContainsAllContactsL(res->TestView(CTestResources::ETestViewContactsAndGroups), *unsortedContacts)); + test(ContainsAllContactsL(res->TestView(CTestResources::ETestViewContactsAndGroups), *unsortedGroups)); + } + + test.Next(_L("Check EContactsOnly view does not contain any groups")); + test(DoesNotContainsContactsL(res->TestView(CTestResources::ETestViewContactsOnly), *groups)); + test(DoesNotContainsContactsL(res->TestView(CTestResources::ETestViewContactsOnly), *unsortedGroups)); + + test.Next(_L("Check EGroupsOnly view does not contain any contacts")); + test(DoesNotContainsContactsL(res->TestView(CTestResources::ETestViewGroupsOnly), *contacts)); + test(DoesNotContainsContactsL(res->TestView(CTestResources::ETestViewGroupsOnly), *unsortedContacts)); + + test.Next(_L("Check EContactsOnly view count")); + if (res->TestView(CTestResources::ETestViewContactsOnly).ContactViewPreferences() & EIgnoreUnSorted) + { + test(res->TestView(CTestResources::ETestViewContactsOnly).CountL() == contacts->Count()); + } + else + { + test(res->TestView(CTestResources::ETestViewContactsOnly).CountL() == contacts->Count()+unsortedContacts->Count()); + } + + test.Next(_L("Check EGroupsOnly view count")); + if (res->TestView(CTestResources::ETestViewGroupsOnly).ContactViewPreferences() & EIgnoreUnSorted) + { + test(res->TestView(CTestResources::ETestViewGroupsOnly).CountL() == groups->Count()); + } + else + { + test(res->TestView(CTestResources::ETestViewGroupsOnly).CountL() == groups->Count()+unsortedGroups->Count()); + } + + test.Next(_L("Check EContactAndGroups view count")); + if (res->TestView(CTestResources::ETestViewContactsAndGroups).ContactViewPreferences() & EIgnoreUnSorted) + { + const TInt count = contacts->Count()+groups->Count(); + test(res->TestView(CTestResources::ETestViewContactsAndGroups).CountL() == count); + } + else + { + const TInt count = contacts->Count()+unsortedContacts->Count()+groups->Count()+unsortedGroups->Count(); + test(res->TestView(CTestResources::ETestViewContactsAndGroups).CountL() == count); + } + + CleanupStack::PopAndDestroy(5,res); + } + +LOCAL_C void TestOpenViewsWithExistingDataL() + { + test.Start(_L("Open views with exisiting data (no special preferences)")); + TestOpenViewsWithExistingDataL(static_cast(0)); + + // Calypso Phonebook uses these view preferences + test.Next(_L("Open views with exisiting data (EUnSortedAtEnd | ESingleWhiteSpaceIsEmptyField)")); + TestOpenViewsWithExistingDataL + (static_cast(EUnSortedAtEnd|ESingleWhiteSpaceIsEmptyField)); + + test.Next(_L("Open views with exisiting data (EIgnoreUnSorted)")); + TestOpenViewsWithExistingDataL(EIgnoreUnSorted); + + test.Next(_L("Open views with exisiting data (EIgnoreUnSorted|ESingleWhiteSpaceIsEmptyField)")); + TestOpenViewsWithExistingDataL + (static_cast(EIgnoreUnSorted|ESingleWhiteSpaceIsEmptyField)); + + test.Next(_L("Open views with exisiting data (EUnSortedAtBeginning)")); + TestOpenViewsWithExistingDataL(EUnSortedAtBeginning); + + test.Next(_L("Open views with exisiting data (EUnSortedAtBeginning|ESingleWhiteSpaceIsEmptyField)")); + TestOpenViewsWithExistingDataL + (static_cast(EUnSortedAtBeginning|ESingleWhiteSpaceIsEmptyField)); + + test.Next(_L("Open views with exisiting data (EUnSortedAtEnd)")); + TestOpenViewsWithExistingDataL(EUnSortedAtEnd); + + test.Next(_L("Open views with exisiting data (EUnSortedAtEnd|ESingleWhiteSpaceIsEmptyField)")); + TestOpenViewsWithExistingDataL + (static_cast(EUnSortedAtEnd|ESingleWhiteSpaceIsEmptyField)); + + test.Next(_L("Open views with exisiting data (ESingleWhiteSpaceIsEmptyField)")); + TestOpenViewsWithExistingDataL(ESingleWhiteSpaceIsEmptyField); + + test.End(); + } + +LOCAL_C void TestModifyContactL(CTestResources& aRes, TContactItemId aContactId) + { + CContactItem* contact = aRes.Db().OpenContactLX(aContactId); + CleanupStack::PushL(contact); + const TInt fieldIndex = contact->CardFields().Find(KUidContactFieldFamilyName); + contact->CardFields()[fieldIndex].TextStorage()->SetTextL(_L("Modified")); + aRes.Db().CommitContactL(*contact); + CleanupStack::PopAndDestroy(2); + + TContactDbObserverEvent dbEvent; + test(aRes.DbEvents().ListenForEvent(KEventWaitTime,dbEvent)); + test(dbEvent.iType==EContactDbObserverEventContactChanged && dbEvent.iContactId==aContactId); + + TContactViewEvent event; + test(aRes.TestViewEvents(CTestResources::ETestViewContactsOnly).ListenForEvent(KEventWaitTime,event)); + test(event.iEventType==TContactViewEvent::EItemRemoved && event.iContactId==aContactId); + test(aRes.TestViewEvents(CTestResources::ETestViewContactsOnly).ListenForEvent(KEventWaitTime,event)); + test(event.iEventType==TContactViewEvent::EItemAdded && event.iContactId==aContactId); + test(aRes.TestView(CTestResources::ETestViewContactsOnly).FindL(aContactId)!=KErrNotFound); + test(!aRes.TestViewEvents(CTestResources::ETestViewContactsOnly).ListenForEvent(KEventWaitTime,event)); + + test(!aRes.TestViewEvents(CTestResources::ETestViewGroupsOnly).ListenForEvent(KEventWaitTime,event)); + test(aRes.TestView(CTestResources::ETestViewGroupsOnly).FindL(aContactId)==KErrNotFound); + + test(aRes.TestViewEvents(CTestResources::ETestViewContactsAndGroups).ListenForEvent(KEventWaitTime,event)); + test(event.iEventType==TContactViewEvent::EItemRemoved && event.iContactId==aContactId); + test(aRes.TestViewEvents(CTestResources::ETestViewContactsAndGroups).ListenForEvent(KEventWaitTime,event)); + test(event.iEventType==TContactViewEvent::EItemAdded && event.iContactId==aContactId); + test(aRes.TestView(CTestResources::ETestViewContactsAndGroups).FindL(aContactId)!=KErrNotFound); + test(!aRes.TestViewEvents(CTestResources::ETestViewContactsAndGroups).ListenForEvent(KEventWaitTime,event)); + } + +LOCAL_C void TestModifyUnsortedContactL(CTestResources& aRes, TContactItemId aContactId) + { + CContactItem* contact = aRes.Db().OpenContactLX(aContactId); + CleanupStack::PushL(contact); + AddFieldToContactL(*contact, KUidContactFieldEMail, _L("test@symbianfoundation.test")); + aRes.Db().CommitContactL(*contact); + CleanupStack::PopAndDestroy(2); + + TContactDbObserverEvent dbEvent; + test(aRes.DbEvents().ListenForEvent(KEventWaitTime,dbEvent)); + test(dbEvent.iType==EContactDbObserverEventContactChanged && dbEvent.iContactId==aContactId); + + TContactViewEvent event; + if (aRes.TestView(CTestResources::ETestViewContactsOnly).ContactViewPreferences() & EIgnoreUnSorted) + { + test(!aRes.TestViewEvents(CTestResources::ETestViewContactsOnly).ListenForEvent(KEventWaitTime,event)); + } + else + { + test(aRes.TestViewEvents(CTestResources::ETestViewContactsOnly).ListenForEvent(KEventWaitTime,event)); + test(event.iEventType==TContactViewEvent::EItemRemoved && event.iContactId==aContactId); + test(aRes.TestViewEvents(CTestResources::ETestViewContactsOnly).ListenForEvent(KEventWaitTime,event)); + test(event.iEventType==TContactViewEvent::EItemAdded && event.iContactId==aContactId); + test(aRes.TestView(CTestResources::ETestViewContactsOnly).FindL(aContactId)!=KErrNotFound); + test(!aRes.TestViewEvents(CTestResources::ETestViewContactsOnly).ListenForEvent(KEventWaitTime,event)); + } + + test(!aRes.TestViewEvents(CTestResources::ETestViewGroupsOnly).ListenForEvent(KEventWaitTime,event)); + test(aRes.TestView(CTestResources::ETestViewGroupsOnly).FindL(aContactId)==KErrNotFound); + + if (aRes.TestView(CTestResources::ETestViewContactsAndGroups).ContactViewPreferences() & EIgnoreUnSorted) + { + test(!aRes.TestViewEvents(CTestResources::ETestViewContactsAndGroups).ListenForEvent(KEventWaitTime,event)); + } + else + { + test(aRes.TestViewEvents(CTestResources::ETestViewContactsAndGroups).ListenForEvent(KEventWaitTime,event)); + test(event.iEventType==TContactViewEvent::EItemRemoved && event.iContactId==aContactId); + test(aRes.TestViewEvents(CTestResources::ETestViewContactsAndGroups).ListenForEvent(KEventWaitTime,event)); + test(event.iEventType==TContactViewEvent::EItemAdded && event.iContactId==aContactId); + test(aRes.TestView(CTestResources::ETestViewContactsAndGroups).FindL(aContactId)!=KErrNotFound); + test(!aRes.TestViewEvents(CTestResources::ETestViewContactsAndGroups).ListenForEvent(KEventWaitTime,event)); + } + } + +LOCAL_C void TestDeleteGroupL(CTestResources& aRes, TContactItemId aGroupId) + { + aRes.Db().DeleteContactL(aGroupId); + TContactDbObserverEvent dbEvent; + test(aRes.DbEvents().ListenForEvent(KEventWaitTime,dbEvent)); + test(dbEvent.iType==EContactDbObserverEventGroupDeleted && dbEvent.iContactId==aGroupId); + + TContactViewEvent event; + test(!aRes.TestViewEvents(CTestResources::ETestViewContactsOnly).ListenForEvent(KEventWaitTime,event)); + test(aRes.TestView(CTestResources::ETestViewContactsOnly).FindL(aGroupId)==KErrNotFound); + + test(aRes.TestViewEvents(CTestResources::ETestViewGroupsOnly).ListenForEvent(KEventWaitTime,event)); + test(event.iEventType==TContactViewEvent::EItemRemoved && event.iContactId==aGroupId); + test(aRes.TestView(CTestResources::ETestViewGroupsOnly).FindL(aGroupId)==KErrNotFound); + test(!aRes.TestViewEvents(CTestResources::ETestViewGroupsOnly).ListenForEvent(KEventWaitTime,event)); + + test(aRes.TestViewEvents(CTestResources::ETestViewContactsAndGroups).ListenForEvent(KEventWaitTime,event)); + test(event.iEventType==TContactViewEvent::EItemRemoved && event.iContactId==aGroupId); + test(aRes.TestView(CTestResources::ETestViewContactsAndGroups).FindL(aGroupId)==KErrNotFound); + test(!aRes.TestViewEvents(CTestResources::ETestViewContactsAndGroups).ListenForEvent(KEventWaitTime,event)); + } + +LOCAL_C void TestDeleteContactL(CTestResources& aRes, TContactItemId aContactId) + { + aRes.Db().DeleteContactL(aContactId); + TContactDbObserverEvent dbEvent; + test(aRes.DbEvents().ListenForEvent(KEventWaitTime,dbEvent)); + test(dbEvent.iType==EContactDbObserverEventContactDeleted && dbEvent.iContactId==aContactId); + + TContactViewEvent event; + test(aRes.TestViewEvents(CTestResources::ETestViewContactsOnly).ListenForEvent(KEventWaitTime,event)); + test(event.iEventType==TContactViewEvent::EItemRemoved && event.iContactId==aContactId); + test(aRes.TestView(CTestResources::ETestViewContactsOnly).FindL(aContactId)==KErrNotFound); + test(!aRes.TestViewEvents(CTestResources::ETestViewContactsOnly).ListenForEvent(KEventWaitTime,event)); + + test(!aRes.TestViewEvents(CTestResources::ETestViewGroupsOnly).ListenForEvent(KEventWaitTime,event)); + test(aRes.TestView(CTestResources::ETestViewGroupsOnly).FindL(aContactId)==KErrNotFound); + + test(aRes.TestViewEvents(CTestResources::ETestViewContactsAndGroups).ListenForEvent(KEventWaitTime,event)); + test(event.iEventType==TContactViewEvent::EItemRemoved && event.iContactId==aContactId); + test(aRes.TestView(CTestResources::ETestViewContactsAndGroups).FindL(aContactId)==KErrNotFound); + test(!aRes.TestViewEvents(CTestResources::ETestViewContactsAndGroups).ListenForEvent(KEventWaitTime,event)); + } + +LOCAL_C void TestDeleteUnsortedContactL(CTestResources& aRes, TContactItemId aContactId) + { + aRes.Db().DeleteContactL(aContactId); + TContactDbObserverEvent dbEvent; + test(aRes.DbEvents().ListenForEvent(KEventWaitTime,dbEvent)); + test(dbEvent.iType==EContactDbObserverEventContactDeleted && dbEvent.iContactId==aContactId); + + TContactViewEvent event; + if (aRes.TestView(CTestResources::ETestViewContactsOnly).ContactViewPreferences() & EIgnoreUnSorted) + { + test(!aRes.TestViewEvents(CTestResources::ETestViewContactsOnly).ListenForEvent(KEventWaitTime,event)); + test(aRes.TestView(CTestResources::ETestViewContactsOnly).FindL(aContactId)==KErrNotFound); + } + else + { + test(aRes.TestViewEvents(CTestResources::ETestViewContactsOnly).ListenForEvent(KEventWaitTime,event)); + test(event.iEventType==TContactViewEvent::EItemRemoved && event.iContactId==aContactId); + test(aRes.TestView(CTestResources::ETestViewContactsOnly).FindL(aContactId)==KErrNotFound); + test(!aRes.TestViewEvents(CTestResources::ETestViewContactsOnly).ListenForEvent(KEventWaitTime,event)); + } + + test(!aRes.TestViewEvents(CTestResources::ETestViewGroupsOnly).ListenForEvent(KEventWaitTime,event)); + test(aRes.TestView(CTestResources::ETestViewGroupsOnly).FindL(aContactId)==KErrNotFound); + + if (aRes.TestView(CTestResources::ETestViewContactsAndGroups).ContactViewPreferences() & EIgnoreUnSorted) + { + test(!aRes.TestViewEvents(CTestResources::ETestViewContactsAndGroups).ListenForEvent(KEventWaitTime,event)); + test(aRes.TestView(CTestResources::ETestViewContactsAndGroups).FindL(aContactId)==KErrNotFound); + } + else + { + test(aRes.TestViewEvents(CTestResources::ETestViewContactsAndGroups).ListenForEvent(KEventWaitTime,event)); + test(event.iEventType==TContactViewEvent::EItemRemoved && event.iContactId==aContactId); + test(aRes.TestView(CTestResources::ETestViewContactsAndGroups).FindL(aContactId)==KErrNotFound); + test(!aRes.TestViewEvents(CTestResources::ETestViewContactsAndGroups).ListenForEvent(KEventWaitTime,event)); + } + } + +LOCAL_C void TestViewEventsL + (TContactViewPreferences aAddPrefs) + { + CTestResources* res = CTestResources::NewLC(); + // Create the test contact views + res->CreateTestViewsL(aAddPrefs); + + // Add a contact + test.Next(_L("Add a contact")); + CContactIdArray* contacts = CContactIdArray::NewLC(); + TContactItemId id = CreateTestContactL(res->Db(), _L("Name2"), _L("LName"), _L("SYMBIANFOUNDATION")); + contacts->AddL(id); + + TContactDbObserverEvent dbEvent; + test(res->DbEvents().ListenForEvent(KEventWaitTime,dbEvent)); + test(dbEvent.iType==EContactDbObserverEventContactAdded && dbEvent.iContactId==id); + + TContactViewEvent event; + test(res->TestViewEvents(CTestResources::ETestViewContactsOnly).ListenForEvent(KEventWaitTime,event)); + test(event.iEventType==TContactViewEvent::EItemAdded && event.iContactId==id); + test(res->TestView(CTestResources::ETestViewContactsOnly).FindL(id)!=KErrNotFound); + test(!res->TestViewEvents(CTestResources::ETestViewContactsOnly).ListenForEvent(KEventWaitTime,event)); + + test(!res->TestViewEvents(CTestResources::ETestViewGroupsOnly).ListenForEvent(KEventWaitTime,event)); + + test(res->TestViewEvents(CTestResources::ETestViewContactsAndGroups).ListenForEvent(KEventWaitTime,event)); + test(event.iEventType==TContactViewEvent::EItemAdded && event.iContactId==id); + test(res->TestView(CTestResources::ETestViewContactsAndGroups).FindL(id)!=KErrNotFound); + test(!res->TestViewEvents(CTestResources::ETestViewContactsAndGroups).ListenForEvent(KEventWaitTime,event)); + + // Add a group + test.Next(_L("Add a group")); + CContactIdArray* groups = CContactIdArray::NewLC(); + id = CreateTestGroupL(res->Db(), _L("SYMBIANFOUNDATION")); + groups->AddL(id); + + test(res->DbEvents().ListenForEvent(KEventWaitTime,dbEvent)); + test(dbEvent.iType==EContactDbObserverEventGroupAdded && dbEvent.iContactId==id); + + test(!res->TestViewEvents(CTestResources::ETestViewContactsOnly).ListenForEvent(KEventWaitTime,event)); + + test(res->TestViewEvents(CTestResources::ETestViewGroupsOnly).ListenForEvent(KEventWaitTime,event)); + test(event.iEventType==TContactViewEvent::EItemAdded && event.iContactId==id); + test(res->TestView(CTestResources::ETestViewGroupsOnly).FindL(id)!=KErrNotFound); + test(!res->TestViewEvents(CTestResources::ETestViewGroupsOnly).ListenForEvent(KEventWaitTime,event)); + + test(res->TestViewEvents(CTestResources::ETestViewContactsAndGroups).ListenForEvent(KEventWaitTime,event)); + test(event.iEventType==TContactViewEvent::EItemAdded && event.iContactId==id); + test(res->TestView(CTestResources::ETestViewContactsAndGroups).FindL(id)!=KErrNotFound); + test(!res->TestViewEvents(CTestResources::ETestViewContactsAndGroups).ListenForEvent(KEventWaitTime,event)); + + // Add an unsorted contact + CContactIdArray* unsortedContacts = CContactIdArray::NewLC(); + test.Next(_L("Add an unsorted contact")); + id = CreateTestContactL(res->Db(), _L(""), _L(""), _L("")); + unsortedContacts->AddL(id); + + test(res->DbEvents().ListenForEvent(KEventWaitTime,dbEvent)); + test(dbEvent.iType==EContactDbObserverEventContactAdded && dbEvent.iContactId==id); + + if (aAddPrefs & EIgnoreUnSorted) + { + TContactViewEvent event; + test(!res->TestViewEvents(CTestResources::ETestViewContactsOnly).ListenForEvent(KEventWaitTime,event)); + test(!res->TestViewEvents(CTestResources::ETestViewGroupsOnly).ListenForEvent(KEventWaitTime,event)); + test(!res->TestViewEvents(CTestResources::ETestViewContactsAndGroups).ListenForEvent(KEventWaitTime,event)); + } + else + { + TContactViewEvent event; + test(res->TestViewEvents(CTestResources::ETestViewContactsOnly).ListenForEvent(KEventWaitTime,event)); + test(event.iEventType==TContactViewEvent::EItemAdded && event.iContactId==id); + test(res->TestView(CTestResources::ETestViewContactsOnly).FindL(id)!=KErrNotFound); + test(!res->TestViewEvents(CTestResources::ETestViewContactsOnly).ListenForEvent(KEventWaitTime,event)); + + test(!res->TestViewEvents(CTestResources::ETestViewGroupsOnly).ListenForEvent(KEventWaitTime,event)); + + test(res->TestViewEvents(CTestResources::ETestViewContactsAndGroups).ListenForEvent(KEventWaitTime,event)); + test(event.iEventType==TContactViewEvent::EItemAdded && event.iContactId==id); + test(res->TestView(CTestResources::ETestViewContactsAndGroups).FindL(id)!=KErrNotFound); + test(!res->TestViewEvents(CTestResources::ETestViewContactsAndGroups).ListenForEvent(KEventWaitTime,event)); + } + + // Add an unsorted contact (fields contain spaces) + test.Next(_L("Add an unsorted contact (fields contain spaces)")); + id = CreateTestContactL(res->Db(), _L(" "), _L(" "), _L(" ")); + if (aAddPrefs & ESingleWhiteSpaceIsEmptyField) + { + unsortedContacts->AddL(id); + } + + test(res->DbEvents().ListenForEvent(KEventWaitTime,dbEvent)); + test(dbEvent.iType==EContactDbObserverEventContactAdded && dbEvent.iContactId==id); + + if ((aAddPrefs & ESingleWhiteSpaceIsEmptyField) && (aAddPrefs & EIgnoreUnSorted)) + { + TContactViewEvent event; + test(!res->TestViewEvents(CTestResources::ETestViewContactsOnly).ListenForEvent(KEventWaitTime,event)); + test(!res->TestViewEvents(CTestResources::ETestViewGroupsOnly).ListenForEvent(KEventWaitTime,event)); + test(!res->TestViewEvents(CTestResources::ETestViewContactsAndGroups).ListenForEvent(KEventWaitTime,event)); + } + else + { + TContactViewEvent event; + test(res->TestViewEvents(CTestResources::ETestViewContactsOnly).ListenForEvent(KEventWaitTime,event)); + test(event.iEventType==TContactViewEvent::EItemAdded && event.iContactId==id); + test(res->TestView(CTestResources::ETestViewContactsOnly).FindL(id)!=KErrNotFound); + test(!res->TestViewEvents(CTestResources::ETestViewContactsOnly).ListenForEvent(KEventWaitTime,event)); + + test(!res->TestViewEvents(CTestResources::ETestViewGroupsOnly).ListenForEvent(KEventWaitTime,event)); + + test(res->TestViewEvents(CTestResources::ETestViewContactsAndGroups).ListenForEvent(KEventWaitTime,event)); + test(event.iEventType==TContactViewEvent::EItemAdded && event.iContactId==id); + test(res->TestView(CTestResources::ETestViewContactsAndGroups).FindL(id)!=KErrNotFound); + test(!res->TestViewEvents(CTestResources::ETestViewContactsAndGroups).ListenForEvent(KEventWaitTime,event)); + } + + // Modify contacts + TInt i; + test.Next(_L("Modify contacts")); + for (i=0; iCount(); ++i) + { + TestModifyContactL(*res,(*contacts)[i]); + } + + // Modify unsorted contacts + test.Next(_L("Modify unsorted contacts")); + for (i=0; iCount(); ++i) + { + TestModifyUnsortedContactL(*res,(*unsortedContacts)[i]); + } + + // Modify a group + test.Next(_L("Modify a group")); + res->Db().AddContactToGroupL((*contacts)[0], (*groups)[0]); + test(res->DbEvents().ListenForEvent(KEventWaitTime,dbEvent)); + test(dbEvent.iType==EContactDbObserverEventGroupChanged && dbEvent.iContactId==(*groups)[0]); + + // Here the design is really weird: why an EContactsOnly view sends an event when + // a _group_ changes??? + test(res->TestViewEvents(CTestResources::ETestViewContactsOnly).ListenForEvent(KEventWaitTime,event)); + test(event.iEventType==TContactViewEvent::EGroupChanged && event.iContactId==(*groups)[0]); + test(!res->TestViewEvents(CTestResources::ETestViewContactsOnly).ListenForEvent(KEventWaitTime,event)); + + test(res->TestViewEvents(CTestResources::ETestViewGroupsOnly).ListenForEvent(KEventWaitTime,event)); + test(event.iEventType==TContactViewEvent::EGroupChanged && event.iContactId==(*groups)[0]); + test(res->TestViewEvents(CTestResources::ETestViewGroupsOnly).ListenForEvent(KEventWaitTime,event)); + test(event.iEventType==TContactViewEvent::EItemRemoved && event.iContactId==(*groups)[0]); + test(res->TestViewEvents(CTestResources::ETestViewGroupsOnly).ListenForEvent(KEventWaitTime,event)); + test(event.iEventType==TContactViewEvent::EItemAdded && event.iContactId==(*groups)[0]); + test(!res->TestViewEvents(CTestResources::ETestViewGroupsOnly).ListenForEvent(KEventWaitTime,event)); + + // Same weirdness here + test(res->TestViewEvents(CTestResources::ETestViewContactsAndGroups).ListenForEvent(KEventWaitTime,event)); + // This seems to be the event ordering + test(event.iEventType==TContactViewEvent::EGroupChanged && event.iContactId==(*groups)[0]); + test(res->TestViewEvents(CTestResources::ETestViewContactsAndGroups).ListenForEvent(KEventWaitTime,event)); + test(event.iEventType==TContactViewEvent::EItemRemoved && event.iContactId==(*groups)[0]); + test(res->TestViewEvents(CTestResources::ETestViewContactsAndGroups).ListenForEvent(KEventWaitTime,event)); + test(event.iEventType==TContactViewEvent::EItemAdded && event.iContactId==(*groups)[0]); + test(!res->TestViewEvents(CTestResources::ETestViewContactsAndGroups).ListenForEvent(KEventWaitTime,event)); + + // Delete groups + test.Next(_L("Delete groups")); + for (i=0; iCount(); ++i) + { + TestDeleteGroupL(*res, (*groups)[i]); + } + + // Delete contacts + test.Next(_L("Delete contacts")); + for (i=0; iCount(); ++i) + { + TestDeleteContactL(*res,(*contacts)[i]); + } + + // Delete unsorted contacts + test.Next(_L("Delete unsorted contacts")); + for (i=0; iCount(); ++i) + { + TestDeleteUnsortedContactL(*res,(*unsortedContacts)[i]); + } + + CleanupStack::PopAndDestroy(4,res); + } + + +LOCAL_C void TestViewEventsL() + { + test.Start(_L("Test view events (no special preferences)")); + TestViewEventsL(static_cast(0)); + + // Calypso Phonebook uses these view preferences + test.Next(_L("Test view events (EUnSortedAtEnd | ESingleWhiteSpaceIsEmptyField)")); + TestViewEventsL + (static_cast(EUnSortedAtEnd|ESingleWhiteSpaceIsEmptyField)); + + test.Next(_L("Test view events (EIgnoreUnSorted)")); + TestViewEventsL(static_cast(EIgnoreUnSorted)); + + test.Next(_L("Test view events (EIgnoreUnSorted|ESingleWhiteSpaceIsEmptyField)")); + TestViewEventsL(static_cast(EIgnoreUnSorted|ESingleWhiteSpaceIsEmptyField)); + + test.Next(_L("Test view events (EUnSortedAtBeginning)")); + TestViewEventsL(EUnSortedAtBeginning); + + test.Next(_L("Test view events (EUnSortedAtBeginning|ESingleWhiteSpaceIsEmptyField)")); + TestViewEventsL + (static_cast(EUnSortedAtBeginning|ESingleWhiteSpaceIsEmptyField)); + + test.Next(_L("Test view events (EUnSortedAtEnd)")); + TestViewEventsL(EUnSortedAtEnd); + + test.Next(_L("Test view events (EUnSortedAtEnd|ESingleWhiteSpaceIsEmptyField)")); + TestViewEventsL + (static_cast(EUnSortedAtEnd|ESingleWhiteSpaceIsEmptyField)); + + test.Next(_L("Test view events (ESingleWhiteSpaceIsEmptyField)")); + TestViewEventsL(ESingleWhiteSpaceIsEmptyField); + + test.End(); + } +/** + +@SYMTestCaseID PIM-T-PREFERENCESBUG-0001 + +*/ +LOCAL_C void DoTestsL() + { + CleanupClosePushL(test); + test.Start(_L("@SYMTestCaseID:PIM-T-PREFERENCESBUG-0001 T_PreferencesBug")); + + TestOpenViewsWithExistingDataL(); + + test.Next(KNullDesC); + TestViewEventsL(); + + test.End(); + CleanupStack::PopAndDestroy(); // test.Close() + } + +GLDEF_C TInt E32Main() + { + // Init + CTrapCleanup* cleanupStack = CTrapCleanup::New(); + if (!cleanupStack) + { + return KErrNoMemory; + } + + CActiveScheduler* activeScheduler = new CActiveScheduler; + if (!activeScheduler) + { + return KErrNoMemory; + } + CActiveScheduler::Install(activeScheduler); + + // Run the tests + __UHEAP_MARK; + TRAPD(err, DoTestsL()); + __UHEAP_MARKEND; + + // Cleanup + delete activeScheduler; + delete cleanupStack; + + return err; + }