phonebookengines/VirtualPhonebook/tsrc/MT_VPbkEng_SelectorFactory/src/MT_VPbkEng_SelectorFactoryCases.cpp
changeset 0 e686773b3f54
child 21 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/VirtualPhonebook/tsrc/MT_VPbkEng_SelectorFactory/src/MT_VPbkEng_SelectorFactoryCases.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,953 @@
+/*
+* Copyright (c) 2002 - 2007 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:  ?Description
+*
+*/
+
+
+
+// [INCLUDE FILES] - do not remove
+#include "MT_VPbkEng_SelectorFactory.h"
+#include "stifunitmacros.h"
+#include "constants.h"
+
+#include <VPbkFieldTypeSelectorFactory.h>
+#include <rlocalizedresourcefile.h>
+#include <vpbkdatacaging.hrh>
+#include <VPbkEng.rsg>
+#include <CVPbkFieldTypeSelector.h>
+#include <CVPbkContactTestUtils.h>
+#include <CVPbkContactManager.h>
+#include <MVPbkContactStore.h>
+#include <MVPbkStoreContact.h>
+#include <MVPbkStoreContactField.h>
+#include <MVPbkContactFieldTextData.h>
+#include <MVPbkFieldType.h>
+#include <MVPbkContactFieldUriData.h>
+#include <MVPbkStoreContactFieldCollection.h>
+#include <VPbkContactViewFilterBuilder.h>
+
+#include <spentry.h>
+#include <spproperty.h>
+#include <spsettings.h>
+#include <e32property.h>
+
+// System includes
+#include <f32file.h>
+#include <barsread.h>
+
+#include <VPbkEng.rsg>
+
+namespace {
+
+const TUint KSPSupportCallOutKey = 0x2000B160;
+
+
+void CreateTextFieldL(
+                MVPbkStoreContact& aNewContact, 
+                const MVPbkFieldType* aFieldType, 
+                const TDesC& aText)
+    {
+    __ASSERT_ALWAYS(aFieldType, User::Leave(KErrNotFound));
+    MVPbkStoreContactField* newField = aNewContact.CreateFieldLC(*aFieldType);
+    MVPbkContactFieldTextData& textData = MVPbkContactFieldTextData::Cast(newField->FieldData());       
+    textData.SetTextL(aText);
+    aNewContact.AddFieldL(newField);
+    CleanupStack::Pop(); // newField
+    }
+
+void CreateUriFieldL(
+                MVPbkStoreContact& aNewContact, 
+                const MVPbkFieldType* aFieldType, 
+                const TDesC& aScheme,
+                const TDesC& aText)
+    {
+    __ASSERT_ALWAYS(aFieldType, User::Leave(KErrNotFound));
+    MVPbkStoreContactField* newField = aNewContact.CreateFieldLC(*aFieldType);
+    MVPbkContactFieldUriData& uriData = MVPbkContactFieldUriData::Cast(
+            newField->FieldData());
+    uriData.SetUriL(aScheme, aText);
+    aNewContact.AddFieldL(newField);
+    CleanupStack::Pop(); // newField
+    }
+
+TInt Find(const TInt type, const TArray<TInt> aArray)
+    {
+    for (TInt i = 0; i < aArray.Count(); ++i)
+        {
+        if (type == aArray[i])
+            {
+            return i;
+            }
+        }
+    return KErrNotFound;
+    }
+
+void FillL(RArray<TInt>& aArray, const TInt* aTable, const TInt aSize)
+    {
+    for (TInt i = 0; i < aSize; ++i)
+        {
+        if (aArray.Find(aTable[i]) == KErrNotFound)
+            {
+            // allows to add only once 
+            aArray.AppendL(aTable[i]);
+            }
+        }
+    }
+
+void MergeL(RArray<TInt>& aArray, const MVPbkStoreContact& aContact)
+    {
+    const MVPbkStoreContactFieldCollection& fields = aContact.Fields();
+    RArray<TInt> result;
+    CleanupClosePushL(result);
+    for (TInt i = 0; i < fields.FieldCount(); ++i)
+        {
+        const MVPbkStoreContactField& field = fields.FieldAt(i);
+        TInt resourceId = field.BestMatchingFieldType()->FieldTypeResId();
+
+        if (Find(resourceId, aArray.Array()) >= 0)
+            {
+            if (result.Find(resourceId) == KErrNotFound)
+                {
+                result.AppendL(resourceId);
+                }
+            }
+        }
+
+    aArray.Reset();
+    for (TInt i = 0; i < result.Count(); ++i)
+        {
+        aArray.AppendL(result[i]);
+        }
+    CleanupStack::PopAndDestroy();
+    }
+
+void CreateServiceL(const TDesC& aName, CSPSettings& aSettings)
+    {
+    CSPEntry* entry = CSPEntry::NewLC();
+    entry->SetServiceName(aName);
+    
+    CSPProperty* prop = CSPProperty::NewLC();
+    User::LeaveIfError( prop->SetName(ESubPropertyIMLaunchUid) );
+    User::LeaveIfError( prop->SetValue(1) );
+    User::LeaveIfError( entry->AddPropertyL(*prop) );
+    CleanupStack::PopAndDestroy();
+    
+    CSPProperty* mask = CSPProperty::NewLC();
+    User::LeaveIfError( mask->SetName( EPropertyServiceAttributeMask ) );
+    TInt maskValue = ESupportsInternetCall | ESupportsMSISDNAddressing | 
+                     EIsVisibleInCallMenu;;
+    User::LeaveIfError( mask->SetValue( maskValue ) );
+    User::LeaveIfError( entry->AddPropertyL( *mask ) );
+    CleanupStack::PopAndDestroy( mask );
+
+    User::LeaveIfError( aSettings.AddEntryL(*entry) );
+    
+    CleanupStack::PopAndDestroy();
+    }
+
+
+
+}
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// executed once for whole test set
+void CMT_VPbkEng_SelectorFactory::BaseSetupL()
+    {
+    CActiveScheduler* activeScheduler = new (ELeave) CActiveScheduler;
+    CActiveScheduler::Install(activeScheduler);
+    iTestUtils = CVPbkContactTestUtils::NewL();
+    iAssertUtils = new CAssertUtils(*iLog);
+    
+    CVPbkContactManager* cmanager = iTestUtils->ContactManager();
+
+    iFieldTypes = &cmanager->FieldTypes();
+
+    // reset sp settings table before starting to test
+    iSpSettings = CSPSettings::NewL();
+    
+    RIdArray idArray;
+    CleanupClosePushL(idArray);
+    User::LeaveIfError( iSpSettings->FindServiceIdsL(idArray) );
+    
+    for (TInt i = 0; i < idArray.Count(); ++i)
+        {
+        TServiceId id = idArray[i];
+        iSpSettings->DeleteEntryL(id);
+        }
+    
+    CleanupStack::PopAndDestroy(); // idArray
+    
+    MVPbkContactStore* store = iTestUtils->S60ContactModelStore();
+    iContact = store->CreateNewContactLC();
+    CleanupStack::Pop(); // iContact
+
+    const MVPbkFieldType* field = iFieldTypes->Find(R_VPBK_FIELD_TYPE_FIRSTNAME);
+    CreateTextFieldL(*iContact, field, _L("Jambo"));
+    
+    field = iFieldTypes->Find(R_VPBK_FIELD_TYPE_LANDPHONEHOME);
+    CreateTextFieldL(*iContact, field, _L("09123456"));
+    
+    field = iFieldTypes->Find(R_VPBK_FIELD_TYPE_MOBILEPHONEHOME);
+    CreateTextFieldL(*iContact, field, _L("040123456"));
+    
+    field = iFieldTypes->Find(R_VPBK_FIELD_TYPE_IMPP);
+    CreateUriFieldL(*iContact, field, _L("gtalk"), _L("jambo@gtalk.com"));
+    
+    field = iFieldTypes->Find(R_VPBK_FIELD_TYPE_IMPP);
+    CreateUriFieldL(*iContact, field, _L("msn"), _L("jambo@msn.com"));
+    
+    field = iFieldTypes->Find(R_VPBK_FIELD_TYPE_EMAILHOME);
+    CreateTextFieldL(*iContact, field, _L("myemail"));
+
+    iTestUtils->CommitL(*iContact);
+    }
+
+// executed once for whole test set
+void CMT_VPbkEng_SelectorFactory::BaseTeardown()
+    {
+    iTestUtils->DeleteAllContactsInCntDbL();
+    delete iTestUtils;
+    delete iAssertUtils;
+    delete iSpSettings;
+    delete iContact;
+    
+    CActiveScheduler::Install(NULL);
+    }
+
+void CMT_VPbkEng_SelectorFactory::Setup()
+    {
+    STIF_LOG("Setup");
+    }
+
+void CMT_VPbkEng_SelectorFactory::SetupVoipL()
+    {
+    CSPEntry* entry = CSPEntry::NewLC();
+    entry->SetServiceName(_L("PlainVoip"));
+    
+    CSPProperty* prop = CSPProperty::NewLC();
+    prop->SetName(ESubPropertyVoIPSettingsId);
+    prop->SetValue(1);
+    entry->AddPropertyL(*prop);
+
+    // set voip service mask
+    CSPProperty* mask = CSPProperty::NewLC();
+    User::LeaveIfError( mask->SetName( EPropertyServiceAttributeMask ) );
+    TInt val = ESupportsInternetCall | EIsVisibleInCallMenu;
+    TInt maskValue = val;
+    User::LeaveIfError( mask->SetValue( maskValue ) );
+    User::LeaveIfError( entry->AddPropertyL( *mask ) );
+    CleanupStack::PopAndDestroy( mask );    
+    
+    User::LeaveIfError( iSpSettings->AddEntryL(*entry) );
+    
+    CleanupStack::PopAndDestroy(2);
+    }
+
+void CMT_VPbkEng_SelectorFactory::SetupVoipCallOutL()
+    {
+    CSPEntry* entry = CSPEntry::NewLC();
+    entry->SetServiceName(_L("Voip call out"));
+    
+    CSPProperty* prop = CSPProperty::NewLC();
+    prop->SetName(ESubPropertyVoIPSettingsId);
+    prop->SetValue(1);
+    entry->AddPropertyL(*prop);
+    
+    CSPProperty* mask = CSPProperty::NewLC();
+    User::LeaveIfError( mask->SetName( EPropertyServiceAttributeMask ) );
+    TInt val = ESupportsInternetCall | ESupportsMSISDNAddressing | 
+        EIsVisibleInCallMenu;
+    TInt maskValue = val;
+    User::LeaveIfError( mask->SetValue( maskValue ) );
+    User::LeaveIfError( entry->AddPropertyL( *mask ) );
+    CleanupStack::PopAndDestroy( mask );    
+
+    User::LeaveIfError( iSpSettings->AddEntryL(*entry) );
+    
+    CleanupStack::PopAndDestroy(2);
+
+    }
+
+void CMT_VPbkEng_SelectorFactory::SetupGtalkSupportsVoipL()
+    {
+    CreateServiceL(_L("gtalk"), *iSpSettings);
+    }
+    
+void CMT_VPbkEng_SelectorFactory::Teardown()
+    {
+    User::LeaveIfError( RProperty::Set( KUidSystemCategory, KSPSupportCallOutKey, 0 ) );
+    
+    RIdArray idArray;
+    CleanupClosePushL(idArray);
+    User::LeaveIfError( iSpSettings->FindServiceIdsL(idArray) );
+    
+    for (TInt i = 0; i < idArray.Count(); ++i)
+        {
+        TServiceId id = idArray[i];
+        iSpSettings->DeleteEntryL(id);
+        }
+    
+    CleanupStack::PopAndDestroy(); // idArray
+
+    STIF_LOG("Teardown");
+    }
+
+//TESTCASE("OK test", "CNone", Setup, TestPassed, Teardown)
+void CMT_VPbkEng_SelectorFactory::TestPassed()
+    {
+    STIF_LOG("The Ultimate Answer %d", 42);        
+
+    TInt* p = NULL;
+    TInt i = 5;
+    STIF_ASSERT_NULL( p );
+    STIF_ASSERT( !p );
+    STIF_ASSERT_NOT_NULL( &i );
+    
+    TInt* p1 = &i;
+    p1++;
+    STIF_ASSERT_SAME( &i, &i );
+    STIF_ASSERT_NOT_SAME( &i, p1 );
+    }
+
+//TESTCASE("FieldSelector Valid", "VPbkFieldTypeSelectorFactory", Setup, TestFieldSelectorFactoryValid, Teardown)
+void CMT_VPbkEng_SelectorFactory::TestFieldSelectorFactoryValid()
+    {
+    CVPbkFieldTypeSelector* selectorPtr = 
+            VPbkFieldTypeSelectorFactory::BuildFieldTypeSelectorL(
+                    VPbkFieldTypeSelectorFactory::EMobileNumberSelector, *iFieldTypes);
+    
+    STIF_ASSERT_NOT_NULL( selectorPtr );
+    
+    delete selectorPtr;
+    }
+    
+//TESTCASE("FieldSelector Invalid", "VPbkFieldTypeSelectorFactory", Setup, TestFieldSelectorFactoryInvalid, Teardown)
+void CMT_VPbkEng_SelectorFactory::TestFieldSelectorFactoryInvalid()
+    {
+    CVPbkFieldTypeSelector* selectorPtr = NULL;
+    TInt notExistingPredefinedSelector(-1);
+        
+    STIF_ASSERT_LEAVES( selectorPtr = 
+               VPbkFieldTypeSelectorFactory::BuildFieldTypeSelectorL(
+                       (VPbkFieldTypeSelectorFactory::TVPbkFieldTypeSelector)notExistingPredefinedSelector,
+                       *iFieldTypes) );
+    
+    delete selectorPtr;
+    }
+
+//TESTCASE("CommSelector Valid", "VPbkFieldTypeSelectorFactory", Setup, TestCommSelectorFactoryValid, Teardown)
+void CMT_VPbkEng_SelectorFactory::TestCommSelectorFactoryValid()
+    {
+    CVPbkFieldTypeList* aFieldTypes = CreateFieldTypeListL();
+        
+    CVPbkFieldTypeSelector* selectorPtr = 
+            VPbkFieldTypeSelectorFactory::BuildContactActionTypeSelectorL(
+                    VPbkFieldTypeSelectorFactory::EVoiceCallSelector, *iFieldTypes);
+    
+    STIF_ASSERT_NOT_NULL( selectorPtr );
+    
+    delete selectorPtr;
+    delete aFieldTypes;
+    }
+  
+//TESTCASE("CommSelector uni editor", "VPbkFieldTypeSelectorFactory", Setup, TestCommSelectorFactoryUniEditor, Teardown)
+void CMT_VPbkEng_SelectorFactory::TestCommSelectorFactoryUniEditor()
+    {
+    CVPbkFieldTypeList* aFieldTypes = CreateFieldTypeListL();
+        
+    CVPbkFieldTypeSelector* selectorPtr = 
+            VPbkFieldTypeSelectorFactory::BuildContactActionTypeSelectorL(
+                    VPbkFieldTypeSelectorFactory::EUniEditorSelector, *iFieldTypes);
+    
+    STIF_ASSERT_NOT_NULL( selectorPtr );
+    
+    delete selectorPtr;
+    delete aFieldTypes;
+    }
+
+
+//TESTCASE("CommSelector Invalid", "VPbkFieldTypeSelectorFactory", Setup, TestCommSelectorFactoryInvalid, Teardown)
+void CMT_VPbkEng_SelectorFactory::TestCommSelectorFactoryInvalid()
+    {
+    TInt notExistingPredefinedSelector(-1);
+        
+    CVPbkFieldTypeSelector* selector = VPbkFieldTypeSelectorFactory::
+            BuildContactActionTypeSelectorL(
+                    (VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector)
+                    notExistingPredefinedSelector,
+                    *iFieldTypes);
+    CleanupStack::PushL(selector);
+    
+    RArray<TInt> array;
+    CleanupClosePushL(array);
+
+    AssertTypesL(
+            *selector,
+            array.Array(),
+            *iFieldTypes);    
+    
+    CleanupStack::PopAndDestroy(2); // array, selector
+    }
+
+
+//TESTCASE("TestCommSelectorFactoryNoList", "VPbkFieldTypeSelectorFactory", Setup, TestCommSelectorFactoryNoList, Teardown)
+void CMT_VPbkEng_SelectorFactory::TestCommSelectorFactoryNoList()
+    {
+    CVPbkFieldTypeSelector* selectorPtr = 
+            VPbkFieldTypeSelectorFactory::BuildContactActionTypeSelectorL(
+                    VPbkFieldTypeSelectorFactory::EUniEditorSelector,
+                    *iFieldTypes);
+    
+    STIF_ASSERT_NOT_NULL( selectorPtr );
+    
+    delete selectorPtr;
+    }
+
+//TESTCASE("TestUniEditorSelectionL", "VPbkFieldTypeSelectorFactory", Setup, TestUniEditorSelectionL, Teardown)
+void CMT_VPbkEng_SelectorFactory::TestUniEditorSelectionL()
+    {
+    CVPbkFieldTypeSelector* selectorPtr = 
+            VPbkFieldTypeSelectorFactory::BuildContactActionTypeSelectorL(
+                    VPbkFieldTypeSelectorFactory::EUniEditorSelector,
+                    *iFieldTypes);
+    
+    CleanupStack::PushL(selectorPtr);
+    
+    iAssertUtils->AssertTypesL(
+            *selectorPtr, KUniEditorFields, KUniEditorFieldsSize, *iFieldTypes, *iResult);
+    
+    CleanupStack::PopAndDestroy();
+    }
+
+//TESTCASE("TestVoiceCallSelectionL", "VPbkFieldTypeSelectorFactory", Setup, TestVoiceCallSelectionL, Teardown)
+void CMT_VPbkEng_SelectorFactory::TestVoiceCallSelectionL()
+    {
+    // test selector creation from resource
+    CVPbkFieldTypeSelector* selector = 
+            VPbkFieldTypeSelectorFactory::BuildContactActionTypeSelectorL(
+                    VPbkFieldTypeSelectorFactory::EVoiceCallSelector,
+                    *iFieldTypes);
+
+    CleanupStack::PushL(selector);
+    
+    TFixedArray<TInt,KEVoiceCallSelectorFieldsSize> array(
+            KEVoiceCallSelectorFields, KEVoiceCallSelectorFieldsSize);
+
+    AssertTypesL(
+            *selector, 
+            array.Array(), 
+            *iFieldTypes);
+
+    // test externalization and internalization
+    HBufC8* buf = selector->ExternalizeLC();
+    CleanupStack::Pop();
+    CleanupStack::PopAndDestroy();
+    CleanupStack::PushL(buf);
+
+    selector = CVPbkFieldTypeSelector::NewL(*iFieldTypes);
+    CleanupStack::PushL(selector);
+    selector->InternalizeL(*buf);
+    
+    AssertTypesL(
+            *selector,
+            array.Array(),
+            *iFieldTypes);
+    
+    // test selector creation from an other selector
+    CVPbkFieldTypeSelector* copyselector = CVPbkFieldTypeSelector::NewL(*selector);
+    CleanupStack::PopAndDestroy(2, buf);
+    CleanupStack::PushL(copyselector);
+    AssertTypesL(
+            *copyselector,
+            array.Array(),
+            *iFieldTypes);
+    CleanupStack::PopAndDestroy(copyselector);
+    }
+
+//TESTCASE("TestVoipNotSupportedSelectionL", "VPbkFieldTypeSelectorFactory", Setup, TestVoipNotSupportedSelectionL, Teardown)
+void CMT_VPbkEng_SelectorFactory::TestVoipNotSupportedSelectionL()
+    {
+    // test selector creation from resource
+    CVPbkFieldTypeSelector* selector = 
+            VPbkFieldTypeSelectorFactory::BuildContactActionTypeSelectorL(
+                    VPbkFieldTypeSelectorFactory::EVOIPCallSelector,
+                    *iFieldTypes);
+
+    CleanupStack::PushL(selector);
+
+    RArray<TInt> array;
+    CleanupClosePushL(array);
+
+    AssertTypesL(
+            *selector,
+            array.Array(),
+            *iFieldTypes);
+
+    CleanupStack::PopAndDestroy(2); // array, selector
+    }
+
+//TESTCASE("Test No Voip available", "VPbkFieldTypeSelectorFactory", Setup, TestVoipNotAvailableSelectionL, Teardown)
+void CMT_VPbkEng_SelectorFactory::TestVoipNotAvailableSelectionL()
+    {
+    // test selector creation from resource
+    CVPbkFieldTypeSelector* selector = 
+            VPbkFieldTypeSelectorFactory::BuildContactActionTypeSelectorL(
+                    VPbkFieldTypeSelectorFactory::EVOIPCallSelector,
+                    *iFieldTypes);
+
+    CleanupStack::PushL(selector);
+    
+    RArray<TInt> array;
+    CleanupClosePushL(array);
+
+    AssertTypesL(
+            *selector,
+            array.Array(),
+            *iFieldTypes);
+
+    CleanupStack::PopAndDestroy(2);
+    }
+
+//TESTCASE("Test Voip Enabled", "VPbkFieldTypeSelectorFactory", SetupVoipL, TestVoipCallSelectionL, Teardown)
+void CMT_VPbkEng_SelectorFactory::TestVoipCallSelectionL()
+    {
+    // test selector creation from resource
+    CVPbkFieldTypeSelector* selector = 
+            VPbkFieldTypeSelectorFactory::BuildContactActionTypeSelectorL(
+                    VPbkFieldTypeSelectorFactory::EVOIPCallSelector,
+                    *iFieldTypes);
+
+    CleanupStack::PushL(selector);
+
+    TFixedArray<TInt,KEVOIPCallSelectorFieldsSize> array(
+            KEVOIPCallSelectorFields, KEVOIPCallSelectorFieldsSize);  
+
+    AssertTypesL(
+            *selector,
+            array.Array(),
+            *iFieldTypes);
+
+    CleanupStack::PopAndDestroy();
+    }
+
+//TESTCASE("Test Voip Call Out Enabled", "VPbkFieldTypeSelectorFactory", SetupVoipCallOutL, TestVoipCallOutSelectionL, Teardown)
+void CMT_VPbkEng_SelectorFactory::TestVoipCallOutSelectionL()
+    {
+    // test selector creation from resourceb
+    CVPbkFieldTypeSelector* selector = 
+            VPbkFieldTypeSelectorFactory::BuildContactActionTypeSelectorL(
+                    VPbkFieldTypeSelectorFactory::EVOIPCallSelector,
+                    *iFieldTypes);
+
+    CleanupStack::PushL(selector);
+
+    RArray<TInt> array;
+    CleanupClosePushL(array);
+    
+    FillL(array, KEVOIPCallSelectorFields, KEVOIPCallSelectorFieldsSize);
+    FillL(array, KEVOIPCallOutSelectorFields, KEVOIPCallOutSelectorFieldsSize);
+    
+    AssertTypesL(
+            *selector,
+            array.Array(),
+            *iFieldTypes);
+
+    CleanupStack::PopAndDestroy(2);
+    }
+
+//TESTCASE("Test xsp supports voip", "VPbkFieldTypeSelectorFactory", SetupGtalkSupportsVoipL, TestXspSupportsVoipSelectionL, Teardown)
+void CMT_VPbkEng_SelectorFactory::TestXspSupportsVoipSelectionL()
+    {
+    // test selector creation from resourceb
+    CVPbkFieldTypeSelector* selector = 
+            VPbkFieldTypeSelectorFactory::BuildContactActionTypeSelectorL(
+                    VPbkFieldTypeSelectorFactory::EVOIPCallSelector,
+                    *iFieldTypes);
+
+    CleanupStack::PushL(selector);
+
+    RArray<TInt> array;
+    CleanupClosePushL(array);
+
+    FillL(array, KEVOIPCallSelectorFields, KEVOIPCallSelectorFieldsSize);
+    FillL(array, KEVOIPCallOutSelectorFields, KEVOIPCallOutSelectorFieldsSize);
+    FillL(array, KEVOIPXspSelectorFields, KEVOIPXspSelectorFieldsSize);
+
+    AssertTypesL(
+            *selector,
+            array.Array(),
+            *iFieldTypes);
+
+    CleanupStack::PopAndDestroy(2);
+    }
+
+//TESTCASE("TestVideoSelectorL", "VPbkFieldTypeSelectorFactory", Setup, TestVideoSelectorL, Teardown)
+void CMT_VPbkEng_SelectorFactory::TestVideoSelectorL()
+    {
+    // test selector creation from resource
+    CVPbkFieldTypeSelector* selector = 
+            VPbkFieldTypeSelectorFactory::BuildContactActionTypeSelectorL(
+                    VPbkFieldTypeSelectorFactory::EVideoCallSelector,
+                    *iFieldTypes);
+
+    CleanupStack::PushL(selector);
+
+    TFixedArray<TInt,KVideoCallSelectorsSize> array(
+            KVideoCallSelectors, KVideoCallSelectorsSize);
+
+    AssertTypesL(
+            *selector,
+            array.Array(),
+            *iFieldTypes);
+
+    CleanupStack::PopAndDestroy();
+    }
+
+
+//TESTCASE("TestURLSelectorL", "VPbkFieldTypeSelectorFactory", Setup, TestURLSelectorL, Teardown)
+void CMT_VPbkEng_SelectorFactory::TestURLSelectorL()
+    {
+    // test selector creation from resource
+    CVPbkFieldTypeSelector* selector = 
+            VPbkFieldTypeSelectorFactory::BuildContactActionTypeSelectorL(
+                    VPbkFieldTypeSelectorFactory::EURLSelector,
+                    *iFieldTypes);
+
+    CleanupStack::PushL(selector);
+
+    TFixedArray<TInt,KURLSelectorsSize> array(
+            KURLSelectors, KURLSelectorsSize);
+
+    AssertTypesL(
+            *selector,
+            array.Array(),
+            *iFieldTypes);
+
+    CleanupStack::PopAndDestroy();
+    }
+
+//TESTCASE("TestEmailSelectorL", "VPbkFieldTypeSelectorFactory", Setup, TestEmailSelectorL, Teardown)
+void CMT_VPbkEng_SelectorFactory::TestEmailSelectorL()
+    {
+    // test selector creation from resource
+    CVPbkFieldTypeSelector* selector = 
+            VPbkFieldTypeSelectorFactory::BuildContactActionTypeSelectorL(
+                    VPbkFieldTypeSelectorFactory::EEmailEditorSelector,
+                    *iFieldTypes);
+
+    CleanupStack::PushL(selector);
+
+    TFixedArray<TInt,KEmailEditorSelectorsSize> array(
+            KEmailEditorSelectors, KEmailEditorSelectorsSize);
+
+    AssertTypesL(
+            *selector,
+            array.Array(),
+            *iFieldTypes);
+
+    CleanupStack::PopAndDestroy();
+    }
+
+//TESTCASE("TestIMSelectorL", "VPbkFieldTypeSelectorFactory", Setup, TestIMSelectorL, Teardown)
+void CMT_VPbkEng_SelectorFactory::TestIMSelectorL()
+    {
+    // test selector creation from resource
+    CVPbkFieldTypeSelector* selector = 
+            VPbkFieldTypeSelectorFactory::BuildContactActionTypeSelectorL(
+                    VPbkFieldTypeSelectorFactory::EInstantMessagingSelector,
+                    *iFieldTypes);
+
+    CleanupStack::PushL(selector);
+
+    TFixedArray<TInt,KInstantMessagingSelectorsSize> array(
+            KInstantMessagingSelectors, KInstantMessagingSelectorsSize);
+
+    AssertTypesL(
+            *selector,
+            array.Array(),
+            *iFieldTypes);
+
+    CleanupStack::PopAndDestroy();
+    }
+
+//TESTCASE("Test gtalk contact selection", "VPbkFieldTypeSelectorFactory", SetupGtalkSupportsVoipL, TestGtalkContactSelectionL, Teardown)
+void CMT_VPbkEng_SelectorFactory::TestGtalkContactSelectionL()
+    {
+    RArray<TInt> array;
+    CleanupClosePushL(array);
+    FillL(array, KEVOIPCallSelectorFields, KEVOIPCallSelectorFieldsSize);
+    FillL(array, KEVOIPCallOutSelectorFields, KEVOIPCallOutSelectorFieldsSize);
+    FillL(array, KEVOIPXspSelectorFields, KEVOIPXspSelectorFieldsSize);
+
+    // assert only with fields that are found from contact
+    // this is a sub set of array content
+    MergeL(array, *iContact);
+
+    // test selector creation from resource
+    CVPbkFieldTypeSelector* selector =
+            VPbkFieldTypeSelectorFactory::BuildContactActionTypeSelectorL(
+                    VPbkFieldTypeSelectorFactory::EVOIPCallSelector,
+                    *iFieldTypes);
+
+    CleanupStack::PushL(selector);
+
+    CDesCArray* providers = new (ELeave) CDesC16ArrayFlat(3);
+    CleanupStack::PushL(providers);
+    providers->AppendL(_L("gtalk"));
+
+    AssertFieldsL(
+            *selector,
+            *iContact,
+            array.Array(),
+            providers);
+
+    CleanupStack::PopAndDestroy(3);
+    }
+
+//TESTCASE("Test two services contact selection", "VPbkFieldTypeSelectorFactory", Setup, TestTwoServicesContactSelectionL, Teardown)
+void CMT_VPbkEng_SelectorFactory::TestTwoServicesContactSelectionL()
+    {
+    CreateServiceL(_L("gtalk"), *iSpSettings);
+    CreateServiceL(_L("msn"), *iSpSettings);
+
+    RArray<TInt> array;
+    CleanupClosePushL(array);
+    FillL(array, KEVOIPCallSelectorFields, KEVOIPCallSelectorFieldsSize);
+    FillL(array, KEVOIPCallOutSelectorFields, KEVOIPCallOutSelectorFieldsSize);
+    FillL(array, KEVOIPXspSelectorFields, KEVOIPXspSelectorFieldsSize);
+    
+    // assert only with fields that are found from contact
+    // this is a sub set of array content
+    MergeL(array, *iContact);
+
+    // test selector creation from resource
+    CVPbkFieldTypeSelector* selector =
+            VPbkFieldTypeSelectorFactory::BuildContactActionTypeSelectorL(
+                    VPbkFieldTypeSelectorFactory::EVOIPCallSelector,
+                    *iFieldTypes);
+
+    CleanupStack::PushL(selector);
+
+    CDesCArray* providers = new (ELeave) CDesC16ArrayFlat(3);
+    CleanupStack::PushL(providers);
+    providers->AppendL(_L("gtalk"));
+    providers->AppendL(_L("msn"));
+
+    AssertFieldsL(
+            *selector,
+            *iContact,
+            array.Array(),
+            providers);
+
+    CleanupStack::PopAndDestroy(3);
+    }
+
+//TESTCASE("TestVersion1SelectorL", "VPbkFieldTypeSelectorFactory", Setup, TestVersion1SelectorL, Teardown)
+void CMT_VPbkEng_SelectorFactory::TestVersion1SelectorL()
+    {
+    // test selector creation from resource
+    CVPbkFieldTypeSelector* selector =
+            VPbkFieldTypeSelectorFactory::BuildFieldTypeSelectorL(
+                    VPbkFieldTypeSelectorFactory::EFirstNameSelector,
+                    *iFieldTypes);
+
+    CleanupStack::PushL(selector);
+    
+    const TInt fields[] = {R_VPBK_FIELD_TYPE_FIRSTNAME};
+
+    TFixedArray<TInt,KInstantMessagingSelectorsSize> array(fields, 1);
+
+    AssertTypesL(
+            *selector,
+            array.Array(),
+            *iFieldTypes);
+
+    CleanupStack::PopAndDestroy();
+    }
+
+//TESTCASE("Test builder multiple selections", "VPbkFieldTypeSelectorFactory", Setup, TestMultipleSelectionL, Teardown)
+void CMT_VPbkEng_SelectorFactory::TestMultipleSelectionL()
+    {
+    const TInt KPhoneNumberFields[] = {
+            R_VPBK_FIELD_TYPE_MOBILEPHONEGEN, 
+            R_VPBK_FIELD_TYPE_MOBILEPHONEHOME,
+            R_VPBK_FIELD_TYPE_MOBILEPHONEWORK,
+            R_VPBK_FIELD_TYPE_LANDPHONEGEN,
+            R_VPBK_FIELD_TYPE_LANDPHONEHOME,
+            R_VPBK_FIELD_TYPE_LANDPHONEWORK,
+            R_VPBK_FIELD_TYPE_FAXNUMBERWORK,
+            R_VPBK_FIELD_TYPE_FAXNUMBERHOME,
+            R_VPBK_FIELD_TYPE_FAXNUMBERGEN,
+            R_VPBK_FIELD_TYPE_PAGERNUMBER,
+            R_VPBK_FIELD_TYPE_CARPHONE,
+            R_VPBK_FIELD_TYPE_VIDEONUMBERGEN,
+            R_VPBK_FIELD_TYPE_VIDEONUMBERWORK,
+            R_VPBK_FIELD_TYPE_VIDEONUMBERHOME,
+            R_VPBK_FIELD_TYPE_ASSTPHONE
+    };
+
+    RArray<TInt> array;
+    CleanupClosePushL(array);
+    FillL(array, KPhoneNumberFields, sizeof(KPhoneNumberFields) / sizeof(TInt));
+    FillL(array, KEmailEditorSelectors, KEmailEditorSelectorsSize);
+
+    // test selector creation from resource
+    CVPbkFieldTypeSelector* selector = CVPbkFieldTypeSelector::NewL(*iFieldTypes);  
+    CleanupStack::PushL(selector);
+    
+    VPbkContactViewFilterBuilder::BuildContactViewFilterL( *selector, 
+                                                           EVPbkContactViewFilterPhoneNumber,
+                                                           *iTestUtils->ContactManager() );
+                
+    VPbkContactViewFilterBuilder::BuildContactViewFilterL( *selector, 
+                                                           EVPbkContactViewFilterEmail,
+                                                           *iTestUtils->ContactManager() );
+
+    AssertTypesL(
+            *selector,
+            array.Array(),
+            *iFieldTypes);
+
+    HBufC8* buf = selector->ExternalizeLC();
+    CleanupStack::Pop();
+    CleanupStack::PopAndDestroy(); // selector
+    CleanupStack::PushL(buf);
+
+    selector = CVPbkFieldTypeSelector::NewL(*iFieldTypes);
+    CleanupStack::PushL(selector);
+    selector->InternalizeL(*buf);
+
+    AssertTypesL(
+            *selector,
+            array.Array(),
+            *iFieldTypes);
+
+    // test selector creation from an other selector
+    CVPbkFieldTypeSelector* copyselector = CVPbkFieldTypeSelector::NewL(*selector);
+    CleanupStack::PopAndDestroy(2, buf);
+    CleanupStack::PushL(copyselector);
+    AssertTypesL(
+            *copyselector,
+            array.Array(),
+            *iFieldTypes);
+
+    CleanupStack::PopAndDestroy(2); // copyselector, array
+    }
+
+//TESTCASE("TestNonVersitTypeSelectionL", "VPbkFieldTypeSelectorFactory", Setup, TestNonVersitTypeSelectionL, Teardown)
+void CMT_VPbkEng_SelectorFactory::TestNonVersitTypeSelectionL()
+    {
+    // test selector creation from resource
+    CVPbkFieldTypeSelector* selector =
+            VPbkFieldTypeSelectorFactory::BuildFieldTypeSelectorL(
+                    VPbkFieldTypeSelectorFactory::ECodTextSelector,
+                    *iFieldTypes);
+
+    CleanupStack::PushL(selector);
+    
+    const TInt fields[] = {R_VPBK_FIELD_TYPE_CALLEROBJTEXT};
+    TFixedArray<TInt,KInstantMessagingSelectorsSize> array(fields, 1);
+    AssertTypesL(
+            *selector,
+            array.Array(),
+            *iFieldTypes);
+
+    CleanupStack::PopAndDestroy();
+    }
+
+CVPbkFieldTypeList* CMT_VPbkEng_SelectorFactory::CreateFieldTypeListL()
+    {
+    // Create MVPbkFieldTypeList for an argument
+    RFs fs;
+    User::LeaveIfError( fs.Connect() );
+    CleanupClosePushL( fs );
+    VPbkEngUtils::RLocalizedResourceFile resFile;
+    resFile.OpenLC( fs, KVPbkRomFileDrive, KDC_RESOURCE_FILES_DIR, KVPbkDefResFileName );
+    HBufC8* fieldTypesBuf = resFile.AllocReadLC( R_VPBK_GLOBAL_FIELD_TYPES );
+    TResourceReader resReader;
+    resReader.SetBuffer( fieldTypesBuf );
+    CVPbkFieldTypeList* aFieldTypes = CVPbkFieldTypeList::NewL( resFile, resReader );
+        
+    CleanupStack::PopAndDestroy( 3 ); // fieldTypesBuf, resFile, fs
+    
+    return aFieldTypes;
+    }
+
+void CMT_VPbkEng_SelectorFactory::AssertTypesL(
+        CVPbkFieldTypeSelector& aSelector,
+        const TArray<TInt> aArray,
+        const MVPbkFieldTypeList& aFieldTypes)
+    {
+    TInt count = aFieldTypes.FieldTypeCount();
+    while (--count >= 0)
+        {
+        const MVPbkFieldType& type = aFieldTypes.FieldTypeAt(count);
+        TBool included = aSelector.IsFieldTypeIncluded(type);
+        TInt index = Find(type.FieldTypeResId(), aArray);
+        if (index >= 0)
+            {
+            // assert that field is included
+            STIF_LOG("resid: %d, included %d", type.FieldTypeResId(), included);
+            STIF_ASSERT(included);
+            }
+        else
+            {
+            // assert that field is not included
+            STIF_LOG("resid: %d, included %d", type.FieldTypeResId(), included);
+            STIF_ASSERT(!included);
+            }
+        }
+    }
+
+void CMT_VPbkEng_SelectorFactory::AssertFieldsL(
+        CVPbkFieldTypeSelector& aSelector,
+        const MVPbkStoreContact& aContact,
+        TArray<TInt> aAsserFields,
+        CDesCArray* aServiceNames)
+    {
+    const MVPbkStoreContactFieldCollection& fields = aContact.Fields();
+    for (TInt i = 0; i < fields.FieldCount(); ++i)
+        {
+        const MVPbkStoreContactField& field = fields.FieldAt(i);
+        TInt resourceId = field.BestMatchingFieldType()->FieldTypeResId();
+        TBool included = aSelector.IsFieldIncluded(field);
+        TInt index = Find(resourceId, aAsserFields);
+        STIF_LOG("resid: %d, included %d", resourceId, included);
+        if (resourceId == R_VPBK_FIELD_TYPE_IMPP)
+            {
+            const MVPbkContactFieldData& data = field.FieldData();
+            const MVPbkContactFieldUriData& uri = MVPbkContactFieldUriData::Cast(data);
+            const TPtrC scheme = uri.Scheme();
+            if (aServiceNames->Find(scheme, index) != KErrNone)
+                {
+                index = KErrNotFound;
+                }
+            }
+
+        if (index >= 0)
+            {
+            // assert that field is included
+            STIF_ASSERT(included);
+            }
+        else
+            {
+            // assert that field is not included
+            STIF_ASSERT(!included);
+            }
+        }
+    }
+
+//  [End of File] - do not remove