phonebookengines/contactsmodel/tsrc/Integration/CntPerfTest/src/UnifiedSingular.cpp
changeset 0 e686773b3f54
child 24 0ba2181d7c28
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/contactsmodel/tsrc/Integration/CntPerfTest/src/UnifiedSingular.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,217 @@
+// Copyright (c) 2006-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:
+//
+
+/**
+ @file
+ @publishedAll
+ @released
+*/
+
+#include <e32panic.h>
+#include <test/testexecutelog.h>
+#include <cntfldst.h>
+#include "UnifiedSingular.h"
+#include "ClientServer.h"
+
+_LIT(KNewFieldsTest,"NewFields");
+_LIT(KTest1,"Adding empty new fields test...");
+
+CUnifiedSingular::CUnifiedSingular()
+			: CCntBaseStep(200)//Number of contacts
+	{
+	// Call base class method to set up the human readable name for logging
+	SetTestStepName(SharedConstants::KUnifiedSingular);
+	}
+
+TVerdict CUnifiedSingular::doTestStepL()
+	{
+	
+//Comment out all the tests for sqlite version because it tests against the 
+//field content based on fields position which is not part of cntmodel contract.
+#ifndef __SYMBIAN_CNTMODEL_USE_SQLITE__ 
+	__UHEAP_MARK;
+	
+	InitializeL();
+	
+	iIterate->Reset();
+	
+	const TDesC &KSectionName = ConfigSection();
+	
+
+	if( KSectionName == KNewFieldsTest )
+		{
+		INFO_PRINTF1(KTest1);
+		EmptyNewFieldTestL(iIterate->NextL());
+		}
+	else
+		{
+		MissngTestPanic();
+		}
+	Cleanup();
+	
+	__UHEAP_MARKEND;
+#endif //__SYMBIAN_CNTMODEL_USE_SQLITE__
+	
+	return TestStepResult();
+	}
+
+
+
+
+/*performs a single set on a field, set label, add uid, or add new field, set value*/
+void CUnifiedSingular::SetSingularL(const TContactItemId &aCid, const TInt &aPos, 
+const TUnitType &aType, const TInt32 &aUid, const TDesC &aLabel, 
+CContentType ** const aCtype, const TBool aEmpty)
+	{
+	CContactItem *cedit = NULL;
+	cedit = iContactsDatabase->OpenContactLX(aCid,*iViewAll);
+	CleanupStack::PushL(cedit);
+	CContactItemFieldSet &fields = cedit->CardFields();
+	TBool rptType = EFalse;
+	const TFieldType &tfield = TFieldType::Uid(aUid);
+	switch(aType)
+		{
+		case EAddUid:
+			{
+			CContactItemField &field = fields[aPos];
+			rptType = field.ContentType().ContainsFieldType( tfield ) && (field.ContentType().Mapping() != tfield);
+			field.AddFieldTypeL( tfield );
+			*aCtype = CContentType::NewL( field.ContentType() );
+			if(rptType)
+				{
+				(*aCtype)->RemoveFieldType(tfield);
+				}
+			CleanupStack::PushL(*aCtype);
+			}
+		break;
+		case ESetLabel:
+			SetLabelL(fields,aPos,aLabel);
+		break;
+		case EAddField:
+			AddNewFieldL( fields, aLabel, TFieldType::Uid(aUid),aEmpty );
+		break;
+		case ESetFieldValue:
+			SetFieldL(fields,aPos,aLabel);
+		break;
+		default:
+			{
+			_LIT(KSetSingular,"setsingular");
+			User::Panic(KSetSingular,EInvariantFalse);
+			}
+		break;
+		}
+	iContactsDatabase->CommitContactL(*cedit);
+	if(aCtype)
+		{
+		CleanupStack::Pop(*aCtype);
+		}
+	CleanupStack::PopAndDestroy(cedit);
+	CleanupStack::Pop();
+	cedit = NULL;
+	}
+	
+/*performs a single check on a field, check label, check uid, or check new field*/
+TBool CUnifiedSingular::CheckSingularL(const TContactItemId &aCid, const TInt &aPos, 
+const TUnitType &aType, const TInt32 &aUid, const CContentType &aCtype, const TDesC &aLabel, 
+const TBool aEmpty)
+	{
+	TBool ret=EFalse;
+	
+	CContactItem *cedit = NULL;
+	cedit = iContactsDatabase->ReadContactLC(aCid,*iViewAll);
+	CContactItemFieldSet &fields = cedit->CardFields();
+	switch(aType)
+		{
+		case EAddUid:
+			{
+			_LIT(KInvalidField, "Following field contains incorrect uids:");
+			const CContentType &ctype = fields[aPos].ContentType();
+			ret = SINGLECOMPARE( CompareCTypes(ctype,aCtype),0,0 );
+			if(!ret)
+				{
+				const TPtrC KFieldLabel = fields[aPos].Label();
+				ERR_PRINTF1( KInvalidField);
+				ERR_PRINTF1( KFieldLabel);
+				}
+			}
+		break;
+		case ESetLabel:
+			ret = STRINGCOMPARE( fields[aPos].Label(), ==, aLabel,0,0 );
+		break;
+		case EAddField:
+			ret = SINGLECOMPARE(  CheckNewFieldL( fields, aPos, TFieldType::Uid(aUid),aEmpty ),0,0 );
+		break;
+		default:
+			{
+			_LIT(KCheckSingular,"checksingular");
+			User::Panic(KCheckSingular,EInvariantFalse);
+			}
+		break;
+		}
+	iContactsDatabase->CloseContactL(aCid);
+	CleanupStack::PopAndDestroy(cedit);
+	cedit = NULL;
+	
+	return ret;
+	}
+	
+/*compares atype2 to atype1, must be equal length, and all atype2 items must be contained within
+atype1*/
+TBool CUnifiedSingular::CompareCTypes(const CContentType &aType1,const CContentType &aType2)
+	{
+	TBool ret = EFalse;
+	TInt length = aType1.FieldTypeCount();
+	if(length != aType2.FieldTypeCount() )
+		{
+		SINGLECOMPARE( ret,0,0 );
+		return ret;
+		}
+	
+	for(TInt i = 0; i<length; i++)
+		{
+		if( !aType1.ContainsFieldType(aType2.FieldType(i)) )
+			{
+			SINGLECOMPARE( ret, i,0 );
+			return ret;
+			}
+		}
+	ret = ETrue;
+	return ret;
+	}
+	
+/*
+add new field without value, then commit, field is not stored
+*/
+void CUnifiedSingular::EmptyNewFieldTestL(const TContactItemId &aCid)
+	{
+	CContactItem *cedit = NULL;
+	cedit = iContactsDatabase->ReadContactLC(aCid,*iViewAll);
+	CContactItemFieldSet &fields = cedit->CardFields();
+	TInt length = fields.Count();
+	iContactsDatabase->CloseContactL(aCid);
+	CleanupStack::PopAndDestroy(cedit);
+	cedit = NULL;
+	CContentType * ctype = NULL;
+	
+	for(int i=0, uids = TestConstants::KAltUID;i < length; uids++, i++)
+		{
+		SetSingularL(aCid,i,EAddField,uids,TestConstants::KLongString,NULL,ETrue);
+		SINGLECOMPARE( CheckSingularL(aCid,length+i,EAddField,uids,*ctype,KNullDesC,ETrue), i,0 );
+		}
+		
+	}
+
+
+