phonebookengines_old/contactsmodel/tsrc/t_filterview.cpp
changeset 40 b46a585f6909
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines_old/contactsmodel/tsrc/t_filterview.cpp	Fri Jun 11 13:29:23 2010 +0300
@@ -0,0 +1,962 @@
+// Copyright (c) 2000-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 <e32std.h>
+#include <e32test.h>
+#include <cntdb.h>
+#include <cntitem.h>
+#include <cntfldst.h>
+#include "t_utils2.h"
+#include "t_filterview.h"
+#include "T_UTILS.H"
+
+//
+// Constants.
+//
+
+_LIT(KTestName,"t_filterview");
+_LIT(KLogFileName,"t_filterview.log");
+
+_LIT(KDbFileName,"c:t_filterview.cdb");
+
+_LIT(KRemoteViewName,"RemoteView");
+_LIT(KTextDefSeparator,"");
+
+LOCAL_D RTest test(KTestName);
+
+const TInt KNumSmsContacts = 111;
+const TInt KNumWorkEmailContacts = 121;
+const TInt KNumHomeEmailContacts = 131;
+const TInt KNumLandlineContacts = 141;
+const TInt KNumFaxContacts = 151;
+const TInt KNumRingTone = 161;
+const TInt KNumVoiceDial = 171;
+
+const TInt KNumIMProtocolWV = 53; 
+const TInt KNumIMAddress= KNumIMProtocolWV;
+
+const TInt KNumPhonable = KNumSmsContacts + KNumLandlineContacts + KNumFaxContacts;
+const TInt KNumUnfiltered =	KNumSmsContacts
+							+ KNumWorkEmailContacts
+							+ KNumHomeEmailContacts
+							+ KNumLandlineContacts
+							+ KNumFaxContacts
+							+ KNumRingTone
+							+ KNumVoiceDial
+							+ KNumIMAddress;
+
+
+//
+// CTestConductor.
+//
+
+CTestConductor* CTestConductor::NewL()
+	{
+	CTestConductor* self=new(ELeave) CTestConductor();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	self->RunTestsL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+CTestConductor::~CTestConductor()
+	{
+	delete iLog;
+	delete iDb;
+	delete iRandomGenerator;
+    TRAP_IGNORE(CContactDatabase::DeleteDatabaseL(KDbFileName));
+    
+	iFs.Close();
+	CCntTest::ProfileReset(0,1);	// ensure the profiling 'TLS' used in EKA2 is freed
+	}
+
+CTestConductor::CTestConductor() {}
+
+void CTestConductor::ConstructL()
+	{
+	User::LeaveIfError(iFs.Connect());
+	iLog=CLog::NewL(test,KLogFileName);
+	iDb=CContactDatabase::ReplaceL(KDbFileName);
+	iRandomGenerator=CRandomContactGenerator::NewL();
+	iRandomGenerator->SetDbL(*iDb);
+	AddContactsL();
+	}
+
+void CTestConductor::AddContactL(TInt aBitwiseFilterType)
+	{
+	test.Printf(_L("Adding Contact"));
+	iRandomGenerator->AddTypicalContactForFilterL(aBitwiseFilterType);
+	iTotalContacts++;
+	}
+
+void CTestConductor::AddContactsThatMatchFilterL(TInt aNumberOfContacts, TInt aFilter)
+	{
+	test.Printf(_L("Adding %d contacts which match filter 0x%X : "), aNumberOfContacts, aFilter);
+	TInt counter = 0;
+	for (counter = 0; counter < aNumberOfContacts; counter++)
+		{
+		if(aFilter & CContactDatabase::EWirelessVillage)
+			{
+			iRandomGenerator->AddTypicalContactForFilterL(aFilter, KUidContactFieldVCardMapWV);
+			}
+		else
+			{
+			iRandomGenerator->AddTypicalContactForFilterL(aFilter);
+			}
+		iTotalContacts++;
+		}
+	test.Printf(_L("Done\n"));
+	}
+
+void CTestConductor::AddContactsL()
+	{
+	iTotalContacts=0;
+	test.Printf(_L("Adding \n"));
+
+	AddContactsThatMatchFilterL(KNumSmsContacts, CContactDatabase::ESmsable);
+	AddContactsThatMatchFilterL(KNumWorkEmailContacts, CContactDatabase::EMailable);
+	AddContactsThatMatchFilterL(KNumHomeEmailContacts, CContactDatabase::EMailable | CContactDatabase::EHome);
+	AddContactsThatMatchFilterL(KNumLandlineContacts, CContactDatabase::ELandLine);
+	AddContactsThatMatchFilterL(KNumFaxContacts, CContactDatabase::EFaxable);
+	AddContactsThatMatchFilterL(KNumRingTone, CContactDatabase::ERingTone);
+	AddContactsThatMatchFilterL(KNumVoiceDial, CContactDatabase::EVoiceDial);
+	AddContactsThatMatchFilterL(KNumIMProtocolWV, /*CContactDatabase::EIMAddress |*/ CContactDatabase::EWirelessVillage);	
+	}
+
+void CTestConductor::RunTestsL()
+	{
+	CViewTester* tester=CViewTester::NewL(*iLog,*iDb,this);
+	CleanupStack::PushL(tester);
+	CActiveScheduler::Start();
+	CleanupStack::Pop(tester);
+
+	User::LeaveIfError(iTestError);
+	}
+
+
+void CTestConductor::SetTestError(TInt aTestError)
+	{
+	iTestError = aTestError;
+	}
+
+
+//
+// CViewTester.
+//
+
+CViewTester* CViewTester::NewL(CLog& aLog,CContactDatabase& aDb,CTestConductor* aTestConductor)
+	{
+	CViewTester* self=new(ELeave) CViewTester(aLog,aDb,aTestConductor);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+CViewTester::~CViewTester()
+	{
+	iVoiceDialView->Close(*this);
+	iRingToneView->Close(*this);
+	iLandlineFilterView->Close(*this);
+	iLandlineFilterView2Fields->Close(*this);
+	iSmsFilterView->Close(*this);
+	iEmailFilterView->Close(*this);
+	iFaxFilterView->Close(*this);
+	iPhonableFilterView->Close(*this);
+	iWorkFilterView->Close(*this);
+	iHomeFilterView->Close(*this);
+	iUnfilteredView->Close(*this);
+	iWirelessVillageView->Close(*this);
+	iIMAddressView->Close(*this);
+	iOOMIMAddressView->Close(*this);
+	iNamedRemoteView->Close(*this);
+	iSortOrder_1.Close();
+	iSortOrder_2.Close();
+	delete iTextDef;
+	}
+
+CViewTester::CViewTester(CLog& aLog,CContactDatabase& aDb,CTestConductor* aTestConductor)
+	: CActive(EPriorityStandard),iLog(aLog),iDb(aDb),iCurrentTest(-1),iTestConductor(aTestConductor)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CViewTester::ConstructL()
+	{
+	iSortOrder_1.AppendL(KUidContactFieldGivenName);
+	iSortOrder_1.AppendL(KUidContactFieldFamilyName);
+	iSortOrder_1.AppendL(KUidContactFieldCompanyName);
+
+	iTextDef=CContactTextDef::NewL();
+	iTextDef->AppendL(TContactTextDefItem(KUidContactFieldGivenName,KTextDefSeparator));
+	iTextDef->AppendL(TContactTextDefItem(KUidContactFieldFamilyName,KTextDefSeparator));
+	iTextDef->AppendL(TContactTextDefItem(KUidContactFieldCompanyName,KTextDefSeparator));
+
+	iSortOrder_2.AppendL(KUidContactFieldCompanyName);
+	iSortOrder_2.AppendL(KUidContactFieldFamilyName);
+	iSortOrder_2.AppendL(KUidContactFieldGivenName);
+
+	NextTest();
+	}
+
+void CViewTester::PrintTimeTaken(TInt aTime)
+	{
+	iScratchBuf.Format(_L("**  Test Took [%ds%dus]  **\n"), aTime/1000000, aTime%1000000);
+	iLog.LogLine(iScratchBuf);
+	//TBuf<100> buffer;
+	//buffer.Format(_L("  Test Took [%ds%dus]\n"), aProfile.iTime/1000000, aProfile.iTime%1000000);
+	//iLog.LogLine(buffer);
+	}
+
+
+void CViewTester::PrintTotalTimeTaken()
+	{
+	TInt counter;
+	TInt totalTime = 0;
+
+	for (counter = 0; counter < ENumTests; counter++)
+		{
+		totalTime += iTimeForTestsToComplete[counter];
+		}
+
+	iScratchBuf.Format(_L("**  Total amount of time taken [%ds%dus]  **"), totalTime/1000000, totalTime%1000000);
+	iLog.LogLine(iScratchBuf);
+
+	}
+
+CContactFilteredView* CViewTester::CreateFilterViewL()
+	{
+	CCntTest::ProfileReset(0,1);
+	CCntTest::ProfileStart(0);
+	return CContactFilteredView::NewL(*this,iDb,*iNamedRemoteView, iFilter);
+	}
+
+void CViewTester::RunL()
+	{
+	switch (iCurrentTest)
+		{
+		case ECreateLocalView:
+			iLog.LogLine(_L("=== Create Name Remote local view"));
+			CCntTest::ProfileReset(0,1);
+			CCntTest::ProfileStart(0);
+			iNamedRemoteView=CContactNamedRemoteView::NewL(*this,KRemoteViewName,iDb,iSortOrder_1,EContactsOnly);
+			break;
+		case EExerciseLocalView:
+			iLog.LogLine(_L("=== Exercise local view"));
+			ExceriseViewL(*iNamedRemoteView);
+			NextTest();
+			break;
+		case ECreateLandlineFilterView:
+			{
+			iLog.LogLine(_L("=== Create Land line Filter View {CContactFilteredView}"));
+			iFilter = CContactDatabase::ELandLine;
+			iLandlineFilterView = CreateFilterViewL();
+			}
+			break;
+		case ETestLandlineFilterView:
+			{
+			iLog.LogLine(_L("==== Exercise ETestLandlineFilterView"));
+			test(iLandlineFilterView->CountL()==KNumLandlineContacts);
+			TestViewIndiciesL(*iLandlineFilterView);
+			NextTest();
+			}
+			break;
+		case ECreateSmsFilterView:
+			{
+			iLog.LogLine(_L("==== Create SMS Filter View"));
+			iFilter=CContactDatabase::ESmsable;
+			iSmsFilterView=CreateFilterViewL();
+			}
+			break;
+		case ETestSmsFilterView:
+			{
+			iLog.LogLine(_L("==== Exercise ETestSmsFilterView"));
+			test(iSmsFilterView->CountL()==KNumSmsContacts);
+			TestViewIndiciesL(*iSmsFilterView);
+			NextTest();
+			}
+			break;
+		case ECreateEmailFilterView:
+			{
+			iLog.LogLine(_L("==== Create Email Filter View"));
+			iFilter=CContactDatabase::EMailable;
+			iEmailFilterView=CreateFilterViewL();
+			}
+			break;
+		case ETestEmailFilterView:
+			{
+			iLog.LogLine(_L("==== Exercise ETestEmailFilterView"));
+			CCntTest::ProfileReset(0,1);
+			CCntTest::ProfileStart(0);
+			test(iEmailFilterView->CountL()==KNumWorkEmailContacts+KNumHomeEmailContacts);
+			TestViewIndiciesL(*iEmailFilterView);
+			NextTest();
+			}
+			break;
+		case ECreateFaxFilterView:
+			{
+			iLog.LogLine(_L("==== Create Fax Filter View"));
+			iFilter=CContactDatabase::EFaxable;
+			iFaxFilterView=CreateFilterViewL();
+			}
+			break;
+		case ETestFaxFilterView:
+			{
+			iLog.LogLine(_L("==== Exercise ETestFaxFilterView"));
+			test(iFaxFilterView->CountL()==KNumFaxContacts);
+			TestViewIndiciesL(*iFaxFilterView);
+			NextTest();
+			}
+			break;
+		case ECreatePhonableFilterView:
+			{
+			iLog.LogLine(_L("==== Create Phonable Filter View"));
+			iFilter=CContactDatabase::EPhonable;
+			iPhonableFilterView=CreateFilterViewL();
+			}
+			break;
+		case ECreateWorkFilterView:
+			{
+			iLog.LogLine(_L("==== Create Work Filter View"));
+			iFilter=CContactDatabase::EWork;
+			iFilter|=CContactDatabase::EMailable;
+			iWorkFilterView=CreateFilterViewL();
+			}
+			break;
+		case ECreateHomeFilterView:
+			{
+			iLog.LogLine(_L("==== Create Home Filter View"));
+			iFilter=CContactDatabase::EHome;
+			iFilter|=CContactDatabase::EMailable;
+			iHomeFilterView=CreateFilterViewL();
+			}
+			break;
+		case ECreateUnfilteredView:
+			{
+			iLog.LogLine(_L("==== Create Unfiltered Filter View"));
+			iFilter=0;
+			iUnfilteredView=CreateFilterViewL();
+			}
+			break;
+
+		case ECreateRingToneView:
+			iLog.LogLine(_L("==== Create Unfiltered Filter View"));
+			iFilter = CContactDatabase::ERingTone;
+			CCntTest::ProfileReset(0,1);
+			CCntTest::ProfileStart(0);
+			iRingToneView = CreateFilterViewL();
+			break;
+
+		case ECreateVoiceDialView:
+			iLog.LogLine(_L("==== Create Unfiltered Filter View"));
+			iFilter = CContactDatabase::EVoiceDial;
+			iVoiceDialView = CreateFilterViewL();
+			break;
+
+		case ECreateWirelessVillageAddressView:
+			{
+			iLog.LogLine(_L("==== Create WirelessVillage address view"));
+			iFilter = CContactDatabase::EWirelessVillage;
+			iWirelessVillageView = CreateFilterViewL();
+			}
+			break;
+
+		case ECreateIMAddressView:
+			{
+			iLog.LogLine(_L("==== Create IM address view"));
+			iFilter = CContactDatabase::EIMAddress;
+			iIMAddressView = CreateFilterViewL();
+			}
+			break;
+
+		case ETestPhonableFilterView:
+			{
+			iLog.LogLine(_L("==== Exercise ETestPhonableFilterView"));
+			test(iPhonableFilterView->CountL()==KNumPhonable);
+			TestViewIndiciesL(*iPhonableFilterView);
+			NextTest();
+			}
+			break;
+		case ETestWorkFilterView:
+			{
+			iLog.LogLine(_L("==== Exercise ETestWorkFilterView"));
+			test(iWorkFilterView->CountL()==KNumWorkEmailContacts);
+			TestViewIndiciesL(*iWorkFilterView);
+			NextTest();
+			}
+			break;
+		case ETestHomeFilterView:
+			{
+			iLog.LogLine(_L("==== Exercise ETestHomeFilterView"));
+			test(iHomeFilterView->CountL()==KNumHomeEmailContacts);
+			TestViewIndiciesL(*iHomeFilterView);
+			NextTest();
+			}
+			break;
+		case ETestUnfilteredView:
+			{
+			iLog.LogLine(_L("==== Exercise EUnfilteredView"));
+			test(iUnfilteredView->CountL()==KNumUnfiltered);
+			TestViewIndiciesL(*iUnfilteredView);
+			NextTest();
+			}
+			break;
+
+		case ETestRingToneView:
+			iLog.LogLine(_L("==== Exercise ETestRingToneView"));
+			test(iRingToneView->CountL()==KNumRingTone);
+			TestViewIndiciesL(*iRingToneView);
+			NextTest();
+
+			break;
+
+		case ETestVoiceDialView:
+			iLog.LogLine(_L("==== Exercise ETestVoiceDialView"));
+			test( iVoiceDialView->CountL() == KNumVoiceDial );
+			TestViewIndiciesL(*iVoiceDialView);
+			NextTest();
+
+			break;
+
+		case ETestWirelessVillageAddressView:
+		// this should also test the different protocols assigned to the IMAddress for each contact
+			{
+			iLog.LogLine(_L("==== Exercise WirelessVillageAddressView"));
+			TInt numberContacts = iWirelessVillageView->CountL();
+			test(numberContacts == KNumIMAddress);
+			
+			TInt numberWV = 0;
+
+			for(TInt a = 0; a < numberContacts; a++)
+				{
+				TContactItemId contactID = iWirelessVillageView->AtL(a);
+				CContactItem* contact = iDb.ReadContactLC(contactID);	// PUSH
+				CContactItemFieldSet& fieldSet = contact->CardFields();
+				CContactItemField& field = fieldSet[contact->CardFields().Find(KUidContactFieldIMAddress)];
+				TFieldType imProtocol = field.ContentType().FieldType(1);
+
+				if(imProtocol == KUidContactFieldVCardMapWV)
+					numberWV++;
+				CleanupStack::PopAndDestroy();							// contact
+				}
+			test(numberWV == KNumIMProtocolWV);
+
+			TestViewIndiciesL(*iWirelessVillageView);
+			NextTest();
+			}
+			break;
+
+		case ETestIMAddressView:
+			{
+			iLog.LogLine(_L("==== Exercise IMAddressView"));
+			test(iIMAddressView->CountL()==KNumIMAddress);
+			TestViewIndiciesL(*iIMAddressView);
+			NextTest();
+			}
+			break;
+
+		case ETestRemoveContacts:
+			{
+			iLog.LogLine(_L("==== Remove Some Contacts"));
+			TContactItemId deletedId = iPhonableFilterView->AtL(10);
+			iDb.DeleteContactL(deletedId);
+			 RDebug::Print(_L("DELETED ID : %d"),deletedId);
+			deletedId = iEmailFilterView->AtL(3);
+			iDb.DeleteContactL(deletedId);
+			RDebug::Print(_L("DELETED ID : %d"),deletedId);
+			deletedId = iFaxFilterView->AtL(6);
+			iDb.DeleteContactL(deletedId);
+			RDebug::Print(_L("DELETED ID : %d"),deletedId);
+			iItemEventsExpected=3;
+			iItemsEventsRecieved=0;
+			}
+			break;
+		case ETestViewIndiciesAfterRemoval:
+			{
+			iLog.LogLine(_L("==== Exercise ETestPhonableFilterView after removal"));
+			TestViewIndiciesL(*iPhonableFilterView);
+			TestViewIndiciesL(*iLandlineFilterView);
+			TestViewIndiciesL(*iSmsFilterView);
+			TestViewIndiciesL(*iFaxFilterView);
+			TestViewIndiciesL(*iEmailFilterView);
+			NextTest();
+			}
+			break;
+		case ETestAddContacts:
+			{
+			iLog.LogLine(_L("==== Add some Contacts"));
+			iTestConductor->AddContactL(CContactDatabase::ELandLine);
+			iTestConductor->AddContactL(CContactDatabase::EMailable);
+			iTestConductor->AddContactL(CContactDatabase::ESmsable);
+			iTestConductor->AddContactL(CContactDatabase::EFaxable);
+			iItemEventsExpected=4;
+			iItemsEventsRecieved=0;
+	//		NextTest(); //wait until notitifications has gone through the system
+			}
+			break;
+		case ETestViewIndiciesAfterAddition:
+			{
+			iLog.LogLine(_L("==== Exercise ETestPhonableFilterView after addition"));
+			TestViewIndiciesL(*iPhonableFilterView);
+			TestViewIndiciesL(*iLandlineFilterView);
+			TestViewIndiciesL(*iSmsFilterView);
+			TestViewIndiciesL(*iFaxFilterView);
+			TestViewIndiciesL(*iEmailFilterView);
+			NextTest();
+			}
+			break;
+		case EAllViewsOutOfBoundsAccess:
+			{
+			//Views depend on their underlying views being in a good state, however
+			//as some base views are potentially in other processes they must be resistant
+			//to out of date views accessesing out of bound members, views, should not
+			//panic but should leave with KErrNotFound;
+			//local view
+			TInt err=0;
+			iLog.LogLine(_L("=== Test views for out of bounds access"));
+			TInt outCount = iPhonableFilterView->CountL();
+			TRAP(err,iPhonableFilterView->AtL(outCount));
+			test(err==KErrNotFound);
+			TRAP(err,iPhonableFilterView->ContactAtL(outCount));
+			test(err==KErrNotFound);
+			NextTest();
+			}
+			break;
+		case EOOMIMAddressView:
+			{
+			++iOOMCounter += iOOMCounter/25; //Increasing step as we go further
+			iFilter = CContactDatabase::EIMAddress;
+
+			__UHEAP_SETFAIL(RHeap::EDeterministic,iOOMCounter);
+			TRAPD(ret, iOOMIMAddressView = CContactFilteredView::NewL(*this,iDb,*iNamedRemoteView, iFilter));
+
+			if (ret==KErrNone) 
+				{
+				break; //Wait for asynchronous notification in HandleContactViewEvent
+				}
+
+			if (ret != KErrNoMemory)
+				{
+				_LIT(KOMMFail, "OOM Test failed: Leave reason is not KErrNoMemory: %d");
+				test.Printf(KOMMFail, ret);
+				User::Leave(KErrAbort);
+				}
+			__UHEAP_RESET;
+		
+			test.Printf(_L("KErrNoMemory at step %5d"), iOOMCounter);
+			TRequestStatus *pS=&iStatus;
+			User::RequestComplete(pS,KErrNone);
+			SetActive();
+			}
+			break;
+
+		case EOOMDeleteIMAddressView:
+			{
+			iOOMIMAddressView->Close(*this);
+			iCurrentTest = EOOMIMAddressView; //Back to OOM 
+			TRequestStatus *pS=&iStatus;
+			User::RequestComplete(pS,KErrNone);
+			SetActive();
+			}
+			break;
+			
+ 		case ECreateLandLineFilterView2Fields:
+ 			{
+ 			// For DEF077467. Propagated from DEF074316.
+ 			// Ensure hint field is set to landline when there's < 3 fields but one of them is voice
+ 			// One contact should appear in the filtered view 
+ 			// Clear the database first
+ 			while(iDb.CountL() !=0)
+ 				{
+ 				iDb.DeleteContactL((*iDb.SortedItemsL())[0]);
+ 				}
+ 			iFilterViewSavedId = KErrNotFound;
+ 			// Loop adds 2 contacts with 2 fields, Hint field should be set with ELandLine
+ 			// first time through loop and hence should appear in the filtered view
+ 			// Second time through the loop still 2 fields but not voice and hence will not
+ 			// appear in the filtered view
+ 			// Verify the correct one is in the view with the contact id
+ 			for(TInt i=0;i<2;++i)
+ 				{
+ 				CContactCard* card=CContactCard::NewLC();
+ 				CContactItemField* field=CContactItemField::NewLC(KStorageTypeText);
+ 				field->AddFieldTypeL(KUidContactFieldPhoneNumber);
+ 				if(i==0)
+ 					{
+ 					field->AddFieldTypeL(KUidContactFieldVCardMapVOICE);
+ 					}
+ 				else
+ 					{
+ 					field->AddFieldTypeL(KUidContactFieldVCardMapPAGER);
+ 					}
+ 				field->TextStorage()->SetTextL(_L("02071541222"));
+ 				card->AddFieldL(*field);
+ 				CleanupStack::Pop(field);
+ 				if(i==0)
+ 					{
+ 					iFilterViewSavedId = iDb.AddNewContactL(*card);
+ 					}
+ 				else
+ 					{
+ 					(void)iDb.AddNewContactL(*card);
+ 					}
+ 				CleanupStack::PopAndDestroy(card); // card
+ 				}
+ 			// Create the filtered view
+ 			iFilter = CContactDatabase::ESmsable|CContactDatabase::ELandLine;
+ 			iLandlineFilterView2Fields = CreateFilterViewL();
+ 			// Event handler kicks to next state where we check result
+ 			}
+ 			break;
+ 			
+ 		case ETestLandLineFilterView2Fields:
+ 			{
+ 			// Should only be one contact in the view even though there's 2 in the database
+ 			test(iLandlineFilterView2Fields->CountL()==1);
+ 			TContactItemId id = iLandlineFilterView2Fields->AtL(0);
+ 			// Make sure it's the one we're expecting
+ 			test(iFilterViewSavedId == id && iFilterViewSavedId != KErrNotFound);
+ 			NextTest();
+ 			}
+ 			break;
+		
+		case ENumTests:
+			iLog.LogLine(_L("==== Filter View Finished"));
+			PrintTotalTimeTaken();
+			CActiveScheduler::Stop();
+			delete this;
+			break;
+		default:
+			ASSERT(EFalse);
+			break;
+		}
+	}
+
+
+TInt CViewTester::RunError(TInt aError)
+	{
+	iTestConductor->SetTestError(aError);
+
+	switch (iCurrentTest)
+		{
+		case ECreateLocalView: test.Printf(_L("Test failed at step CreateLocalView (%i) with error %i"), iCurrentTest, aError); break;
+		case EExerciseLocalView: test.Printf(_L("Test failed at step ExerciseLocalView (%i) with error %i"), iCurrentTest, aError); break;
+		case ECreateLandlineFilterView: test.Printf(_L("Test failed at step CreateLandlineFilterView (%i) with error %i"), iCurrentTest, aError); break;
+		case ETestLandlineFilterView: test.Printf(_L("Test failed at step TestLandlineFilterView (%i) with error %i"), iCurrentTest, aError); break;
+		case ECreateSmsFilterView: test.Printf(_L("Test failed at step CreateSmsFilterView (%i) with error %i"), iCurrentTest, aError); break;
+		case ETestSmsFilterView: test.Printf(_L("Test failed at step TestSmsFilterView (%i) with error %i"), iCurrentTest, aError); break;
+		case ECreateEmailFilterView: test.Printf(_L("Test failed at step CreateEmailFilterView (%i) with error %i"), iCurrentTest, aError); break;
+		case ETestEmailFilterView: test.Printf(_L("Test failed at step TestEmailFilterView (%i) with error %i"), iCurrentTest, aError); break;
+		case ECreateFaxFilterView: test.Printf(_L("Test failed at step CreateFaxFilterView (%i) with error %i"), iCurrentTest, aError); break;
+		case ETestFaxFilterView: test.Printf(_L("Test failed at step TestFaxFilterView (%i) with error %i"), iCurrentTest, aError); break;
+		case ECreatePhonableFilterView: test.Printf(_L("Test failed at step CreatePhonableFilterView (%i) with error %i"), iCurrentTest, aError); break;
+		case ECreateWorkFilterView: test.Printf(_L("Test failed at step CreateWorkFilterView (%i) with error %i"), iCurrentTest, aError); break;
+		case ECreateHomeFilterView: test.Printf(_L("Test failed at step CreateHomeFilterView (%i) with error %i"), iCurrentTest, aError); break;
+		case ECreateUnfilteredView: test.Printf(_L("Test failed at step CreateUnfilteredView (%i) with error %i"), iCurrentTest, aError); break;
+		case ECreateRingToneView: test.Printf(_L("Test failed at step CreateRingToneView (%i) with error %i"), iCurrentTest, aError); break;
+		case ECreateVoiceDialView: test.Printf(_L("Test failed at step CreateVoiceDialView (%i) with error %i"), iCurrentTest, aError); break;
+		case ECreateWirelessVillageAddressView: test.Printf(_L("Test failed at step CreateWirelessVillageAddressView (%i) with error %i"), iCurrentTest, aError); break;
+		case ECreateIMAddressView: test.Printf(_L("Test failed at step CreateIMAddressView (%i) with error %i"), iCurrentTest, aError); break;
+		case ETestPhonableFilterView: test.Printf(_L("Test failed at step TestPhonableFilterView (%i) with error %i"), iCurrentTest, aError); break;
+		case ETestWorkFilterView: test.Printf(_L("Test failed at step TestWorkFilterView (%i) with error %i"), iCurrentTest, aError); break;
+		case ETestHomeFilterView: test.Printf(_L("Test failed at step TestHomeFilterView (%i) with error %i"), iCurrentTest, aError); break;
+		case ETestUnfilteredView: test.Printf(_L("Test failed at step TestUnfilteredView (%i) with error %i"), iCurrentTest, aError); break;
+		case ETestRingToneView: test.Printf(_L("Test failed at step TestRingToneView (%i) with error %i"), iCurrentTest, aError); break;
+		case ETestVoiceDialView: test.Printf(_L("Test failed at step TestVoiceDialView (%i) with error %i"), iCurrentTest, aError); break;
+		case ETestWirelessVillageAddressView: test.Printf(_L("Test failed at step TestWirelessVillageAddressView (%i) with error %i"), iCurrentTest, aError); break;
+		case ETestIMAddressView: test.Printf(_L("Test failed at step TestIMAddressView (%i) with error %i"), iCurrentTest, aError); break;
+		case ETestRemoveContacts: test.Printf(_L("Test failed at step TestRemoveContacts (%i) with error %i"), iCurrentTest, aError); break;
+		case ETestViewIndiciesAfterRemoval: test.Printf(_L("Test failed at step TestViewIndiciesAfterRemoval (%i) with error %i"), iCurrentTest, aError); break;
+		case ETestAddContacts: test.Printf(_L("Test failed at step TestAddContacts (%i) with error %i"), iCurrentTest, aError); break;
+		case ETestViewIndiciesAfterAddition: test.Printf(_L("Test failed at step TestViewIndiciesAfterAddition (%i) with error %i"), iCurrentTest, aError); break;
+		case EAllViewsOutOfBoundsAccess: test.Printf(_L("Test failed at step AllViewsOutOfBoundsAccess (%i) with error %i"), iCurrentTest, aError); break;
+		case EOOMIMAddressView: test.Printf(_L("Test failed at step OOMIMAddressView (%i) with error %i"), iCurrentTest, aError); break;
+		case EOOMDeleteIMAddressView: test.Printf(_L("Test failed at step OOMDeleteIMAddressView (%i) with error %i"), iCurrentTest, aError); break;
+ 		case ECreateLandLineFilterView2Fields: test.Printf(_L("Test failed at step CreateLandlineFilterView (%i) with error %i"), iCurrentTest, aError); break;
+ 		case ETestLandLineFilterView2Fields: test.Printf(_L("Test failed at step TestLandlineFilterView (%i) with error %i"), iCurrentTest, aError); break;
+
+		case ENumTests: test.Printf(_L("Test failed at step NumTests (%i) with error %i"), iCurrentTest, aError); break;
+
+		default: test.Printf(_L("Test failed at step %i with error %i"), iCurrentTest, aError); break;
+		}
+
+	CActiveScheduler::Stop();
+	return KErrNone;
+	}
+
+
+// Should always return true for a correct implementation of
+// CContactViewBase
+TBool CViewTester::ContactIdsEqualL(const CContactViewBase& aView, TInt aIndex)
+  {
+  TContactItemId viewId = aView.AtL(aIndex);
+  //RDebug::Print(_L("UnderLyingView viewId : %d"),viewId);
+  TContactItemId contactId = aView.ContactAtL(aIndex).Id();
+  //RDebug::Print(_L("Sub View Id contactId : %d"),contactId);
+  return (contactId == viewId);
+  }
+
+void CViewTester::TestViewIndiciesL(const CContactViewBase& aView)
+	{
+	for (TInt i=0; i < aView.CountL(); ++i)
+	  {
+	  test(ContactIdsEqualL(aView,i)!=EFalse);
+	  }
+	}
+/*
+CContactFilteredView* filteredView = ...;
+for (TInt i=0; i < filteredView->CountL(); ++i)
+  {
+  ASSERT(ContactIdsEqual(*filteredView, i);
+  }*/
+
+void CViewTester::HandleViewCreation(const CContactViewBase& aView, const TContactViewEvent& aEvent, CContactViewBase* aPtrView)
+	{
+	test(aPtrView==&aView);
+	test(aEvent.iEventType==TContactViewEvent::EReady);
+	CCntTest::ProfileEnd(0);
+	CCntTest::ProfileResult(&iProfile,0,1);
+	iTimeForTestsToComplete[iCurrentTest] = iProfile.iTime;
+	PrintTimeTaken(iProfile.iTime);
+	}
+
+
+void CViewTester::HandleContactViewEvent(const CContactViewBase& aView,const TContactViewEvent& aEvent)
+	{
+	switch (iCurrentTest)
+		{
+		case ECreateLocalView:
+			HandleViewCreation( aView, aEvent, iNamedRemoteView );
+			break;
+		case EExerciseLocalView:
+			test(ETrue);
+			break;
+		case ECreateLandlineFilterView:
+			HandleViewCreation( aView, aEvent, iLandlineFilterView );
+			break;
+		case ETestLandlineFilterView:
+			test(EFalse);
+			break;
+		case ECreateSmsFilterView:
+			HandleViewCreation( aView, aEvent, iSmsFilterView );
+			break;
+		case ETestSmsFilterView:
+			test(EFalse);
+			break;
+		case ECreateEmailFilterView:
+			HandleViewCreation( aView, aEvent, iEmailFilterView );
+			break;
+		case ETestEmailFilterView:
+			test(EFalse);
+			break;
+		case ECreateFaxFilterView:
+			HandleViewCreation( aView, aEvent, iFaxFilterView );
+			break;
+		case ETestFaxFilterView:
+			test(EFalse);
+			break;
+		case ECreatePhonableFilterView:
+			HandleViewCreation( aView, aEvent, iPhonableFilterView );
+			break;
+		case ECreateWorkFilterView:
+			HandleViewCreation( aView, aEvent, iWorkFilterView );
+			break;
+		case ECreateHomeFilterView:
+			HandleViewCreation( aView, aEvent, iHomeFilterView );
+			break;
+		case ECreateUnfilteredView:
+			HandleViewCreation( aView, aEvent, iUnfilteredView );
+			break;
+
+		case ECreateRingToneView:
+			HandleViewCreation( aView, aEvent, iRingToneView );
+			break;
+
+		case ECreateVoiceDialView:
+			HandleViewCreation( aView, aEvent, iVoiceDialView );
+			break;
+
+		case ECreateWirelessVillageAddressView:
+			HandleViewCreation( aView, aEvent, iWirelessVillageView );
+			break;
+
+		case ECreateIMAddressView:
+			HandleViewCreation( aView, aEvent, iIMAddressView );
+			break;
+
+		case ETestPhonableFilterView:
+			test(EFalse);
+			break;
+		case ETestRemoveContacts:
+			{
+			if(aEvent.iEventType==TContactViewEvent::EItemRemoved)
+				{
+				iItemsEventsRecieved++;
+				if(iItemEventsExpected==iItemsEventsRecieved)
+					{
+					NextTest();
+					}
+				}
+			return;
+			}
+		case ETestViewIndiciesAfterRemoval:
+			test(aEvent.iEventType==TContactViewEvent::EItemRemoved);
+			return;
+		case ETestAddContacts:
+			{
+			if(aEvent.iEventType==TContactViewEvent::EItemAdded)
+				{
+				iItemsEventsRecieved++;
+				if(iItemEventsExpected==iItemsEventsRecieved)
+					{
+					NextTest();
+					}
+				}
+			return;
+			}
+		case ETestViewIndiciesAfterAddition:
+			test(aEvent.iEventType==TContactViewEvent::EItemAdded);
+			return;
+		case EAllViewsOutOfBoundsAccess:
+			{
+			test(EFalse);
+			break;
+			}
+		case EOOMIMAddressView:
+			{
+			__UHEAP_RESET;
+			test(iOOMIMAddressView==&aView);
+			switch (aEvent.iEventType)
+				{
+				case TContactViewEvent::EReady:
+					test.Printf(_L("OOM: EReady at step %5d\n"), iOOMCounter);
+					++iCurrentTest; //Exit OOM loop - goto next test
+					break;
+				case TContactViewEvent::ESortError:
+					test.Printf(_L("OOM: ESortError at step %5d\n"), iOOMCounter);
+					break; //Go to EOOMDeleteIMAddressView - we cannot delete view in its callback.
+				default:
+					test.Printf(_L("OOM: Unexpected notification at step %5d\n"), iOOMCounter);
+					test(EFalse); //Unsupported event - fail
+				}
+			}
+			break;
+
+ 		case ECreateLandLineFilterView2Fields:
+ 			{
+ 			HandleViewCreation( aView, aEvent, iLandlineFilterView2Fields);
+ 			}
+ 			break;
+			
+		case EOOMDeleteIMAddressView: //there should not be any call backs after deletion
+		case ENumTests:
+		default:
+			test(EFalse);
+			break;
+		}
+	if (--iNumNotificationExpected<=0)
+		{
+		NextTest();
+		iNumNotificationExpected=0;
+		}
+	}
+
+void CViewTester::TestViewNotificationsL(CContactViewBase& /*aView*/)
+	{
+	//Test just add some contacts for now...
+/*	CRandomContactGenerator* generator=CRandomContactGenerator::NewL();
+	CleanupStack::PushL(generator);
+	generator->SetDbL(iDb);
+	for (TInt ii=0;ii<KInitialNumContacts;++ii)
+		{
+		generator->AddTypicalRandomContactL();
+		}
+	CleanupStack::PopAndDestroy(); // generator.
+*/	}
+
+void CViewTester::NextTest()
+	{
+	++iCurrentTest;
+	TRequestStatus *pS=&iStatus;
+	User::RequestComplete(pS,KErrNone);
+	SetActive();
+	}
+
+void CViewTester::ExceriseViewL(CContactViewBase& aView)
+	{
+	TContactItemId lastId=0;
+	const TInt numItems=aView.CountL();
+	for (TInt ii=0;ii<numItems;++ii)
+		{
+		if (ii==numItems-1)
+			{
+			lastId=aView.AtL(ii);
+			}
+		iDb.ReadContactTextDefL(aView.AtL(ii),iScratchBuf,iTextDef);
+		iLog.LogLineNoEcho(iScratchBuf);
+		iScratchBuf.SetLength(0);
+		}
+
+	test(aView.FindL(lastId)==numItems-1);
+	}
+
+void CViewTester::DoCancel()
+	{
+	}
+
+void doMainL()
+	{
+	__UHEAP_MARK;
+	CTestConductor* testConductor = NULL;
+	testConductor = CTestConductor::NewL();
+	CleanupStack::PushL( testConductor );
+	CleanupStack::PopAndDestroy( testConductor );
+	__UHEAP_MARKEND;
+	}
+//
+// Main.
+//
+
+
+/**
+
+@SYMTestCaseID     PIM-T-FILTERVIEW-0001
+
+*/
+
+GLDEF_C TInt E32Main()
+	{
+	__UHEAP_MARK;
+	test.Start(_L("@SYMTESTCaseID:PIM-T-FILTERVIEW-0001 "));
+
+	CActiveScheduler* scheduler=new CActiveScheduler;
+	if (scheduler)
+		{
+		CActiveScheduler::Install(scheduler);
+		CTrapCleanup* cleanup=CTrapCleanup::New();
+		if (cleanup)
+			{
+			TRAPD(err,doMainL());
+			test(err == KErrNone);
+			delete cleanup;
+			}
+		delete scheduler;
+		}
+	test.End();
+	test.Close();
+	__UHEAP_MARKEND;
+	return KErrNone;
+    }