contacts_plat/predictivesearch_utils_api/tsrc/PsUtilsTestSuite/src/TestSuiteInputData.cpp
branchRCL_3
changeset 63 f4a778e096c2
child 64 c1e8ba0c2b16
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contacts_plat/predictivesearch_utils_api/tsrc/PsUtilsTestSuite/src/TestSuiteInputData.cpp	Wed Sep 01 12:29:52 2010 +0100
@@ -0,0 +1,579 @@
+/*
+* Copyright (c) 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:  
+*
+*/
+
+
+// INCLUDE FILES
+#include <StifParser.h>
+#include <CPsQueryItem.h>
+#include <collate.h>
+#include "TestSuiteInputData.h"
+
+// ============================== MEMBER FUNCTIONS ============================
+
+// ----------------------------------------------------------------------------
+// Two Phase constructor
+// ----------------------------------------------------------------------------
+CTestSuiteInputData* CTestSuiteInputData::NewL(CStifItemParser& aItem)
+{
+	CTestSuiteInputData* self = new (ELeave) CTestSuiteInputData();	
+    CleanupStack::PushL(self);
+    self->ConstructL(aItem);
+    CleanupStack::Pop();
+    return self;
+}
+
+// ----------------------------------------------------------------------------
+// Default constructor
+// ----------------------------------------------------------------------------
+CTestSuiteInputData::CTestSuiteInputData()
+{
+}
+
+// ----------------------------------------------------------------------------
+// Destructor
+// ----------------------------------------------------------------------------
+CTestSuiteInputData::~CTestSuiteInputData()
+{    	
+    if(iQueryBuf)
+    {
+    	delete iQueryBuf;
+		iQueryBuf = NULL;    
+    }	
+    if(iKeyboardModeBuf)
+    {
+    	delete iKeyboardModeBuf;
+    	iKeyboardModeBuf = NULL;
+    }
+
+    iCacheUris.ResetAndDestroy();
+
+	iDisplayFields.Close();
+}
+
+// ----------------------------------------------------------------------------
+// Destructor
+// ----------------------------------------------------------------------------
+TDesC& CTestSuiteInputData::KeyboardMode() const
+{
+	return *iKeyboardModeBuf;
+}
+
+// ----------------------------------------------------------------------------
+// Returns the Id
+// ----------------------------------------------------------------------------
+TInt CTestSuiteInputData::Id()
+{
+	return iId;
+}
+
+void CTestSuiteInputData::Data(RPointerArray<TDesC> & aDataArray)
+{
+	for(TInt i = 0; i < iDataArray.Count(); i++)
+	{
+		aDataArray.Append(iDataArray[i]->AllocL());
+	}
+}
+
+// ----------------------------------------------------------------------------
+// Sets the keyboard mode
+// ----------------------------------------------------------------------------
+void CTestSuiteInputData::SetKeyboardModeL(const TDesC& aKeyboardMode)
+{
+	iKeyboardModeBuf = aKeyboardMode.AllocL();
+}
+
+TSortType CTestSuiteInputData::SortType() const
+{
+	return iSortType;
+}
+		
+void CTestSuiteInputData::SetSortType(TSortType aSortType)
+{
+	iSortType = aSortType;
+}
+
+// ----------------------------------------------------------------------------
+// Returns the search query (as specified in the config file)
+// ----------------------------------------------------------------------------
+TDesC& CTestSuiteInputData::Query() const
+{
+	return *iQueryBuf;
+}
+
+// ----------------------------------------------------------------------------
+// Sets the search query
+// 
+// ----------------------------------------------------------------------------
+void CTestSuiteInputData::SetQueryL(const TDesC& aQuery)
+{
+	iQueryBuf = aQuery.AllocL();
+}
+
+// ----------------------------------------------------------------------------
+// Return the cache uri at given index 
+// ----------------------------------------------------------------------------
+TDesC& CTestSuiteInputData::CacheUriAt(TInt aIndex) const
+{
+	if ( aIndex >= iCacheUris.Count() ) 
+	{
+		HBufC* temp = HBufC::NewL(2);
+		temp->Des().Copy(KNullDesC);
+		return *temp;
+	
+	}
+         
+    return *(iCacheUris[aIndex]);
+}
+
+// ----------------------------------------------------------------------------
+// Return the cache uri 
+// ----------------------------------------------------------------------------
+void CTestSuiteInputData::CacheUris(RPointerArray<TDesC> & aUriArray)
+{
+	for(TInt i = 0; i < iCacheUris.Count(); i++)
+	{
+		aUriArray.Append(iCacheUris[i]->AllocL());
+	}
+}
+
+// ----------------------------------------------------------------------------
+// Sets the cache uris
+// ----------------------------------------------------------------------------
+void CTestSuiteInputData::ApendCacheUrisL(RPointerArray<TDesC>& aCacheUriArray)
+{
+    iCacheUris.ResetAndDestroy();
+	for(TInt i =0; i <aCacheUriArray.Count(); i++ ) 
+    	iCacheUris.Append(aCacheUriArray[i]);
+}
+
+
+// ----------------------------------------------------------------------------
+// Return the display fields
+// ----------------------------------------------------------------------------
+void CTestSuiteInputData::DisplayFields(RArray<TInt>& aDisplayFields)
+{
+	for(TInt i = 0 ; i < iDisplayFields.Count(); i++)
+	{
+		aDisplayFields.Append(iDisplayFields[i]);
+	}
+}
+
+// ----------------------------------------------------------------------------
+// Return the group ids
+// ----------------------------------------------------------------------------
+void CTestSuiteInputData::GroupIds(RArray<TInt>& aGroupId)
+{
+	for(TInt i = 0 ; i < iGroupIds.Count(); i++)
+	{
+		aGroupId.Append(iGroupIds[i]);
+	}
+}
+// ----------------------------------------------------------------------------
+// Second phase construction
+// ----------------------------------------------------------------------------
+void CTestSuiteInputData::ConstructL(CStifItemParser& /*aItem*/)
+{
+}
+
+// -----------------------------------------------------------------------------
+// This function parses the input parameters
+// -----------------------------------------------------------------------------
+void CTestSuiteInputData:: ParseInputL(CStifItemParser& aItem)
+{
+	TPtrC string;
+
+   	// parsing type to be set before parsing a string 
+	// EQuoteStyleParsing: information between quotes is handled as a one string. 
+	aItem.SetParsingType( CStifItemParser::EQuoteStyleParsing );
+	
+	// loop till there is a token in i/p string
+	while ( aItem.GetNextString ( string ) == KErrNone )
+	{
+		HBufC *item = string.AllocL();
+		TChar sqBracketOpen = '[';
+		TChar sqBracketClose = ']';
+		
+		TInt sqBracketStartPos = string.Locate(sqBracketOpen);
+		TInt sqBracketEndPos = string.Locate(sqBracketClose);
+		
+		if(  (sqBracketStartPos != KErrNotFound) && ( sqBracketEndPos!=KErrNotFound))
+		{
+			TPtrC16 optionPtr = string.Left(sqBracketStartPos);	
+				
+			TPtrC16 dataPtr = string.Mid(sqBracketStartPos + 1,sqBracketEndPos - sqBracketStartPos - 1 );	
+			
+			
+			// Check the type of tag, then do the corresponding parsing
+		    if(optionPtr.Compare(KSearchQueryTag) == 0)
+		    {
+		    	// Search query
+		    	ParseInputForSearchQueryL(dataPtr);
+		    
+		    }
+		    else if(optionPtr.Compare(KUriTag) == 0)
+		    {
+		    	// Data store uris
+		    	ParseInputForDataStoresUriL(dataPtr);
+		    }
+		
+		    else if(optionPtr.Compare(KIdTag) == 0)
+		    {
+		    	// Id
+		    	ParseInputForIdL(dataPtr);
+		    }
+		    else if(optionPtr.Compare(KDataTag) == 0)
+		    {
+		    	// data
+		    	ParseInputForData(dataPtr);
+		    }
+		    
+		    else if(optionPtr.Compare(KSetDisplayFields) == 0)
+		    {
+		    	// Display fields
+		    	ParseInputForDisplayFieldsL(dataPtr);
+		    }
+		    else if(optionPtr.Compare(KSortTag) == 0)
+		    {
+		    	// Sorting
+		    	ParseInputForSortTypeL(dataPtr);
+		    }
+		    else if(optionPtr.Compare(KGroupIdTag) == 0)
+		    {
+		    	// Sorting
+		    	ParseInputForGroupIdsL(dataPtr);
+		    }
+		}
+		else
+		{
+			// Wrong Input..
+			User::Leave(KErrGeneral);
+		}
+	}
+}
+
+// -----------------------------------------------------------------------------
+// This function parses input for number id
+// -----------------------------------------------------------------------------
+void CTestSuiteInputData::ParseInputForIdL(TDesC& aInput)
+{
+    TInt fieldId = 0;
+    TLex num(aInput);
+    
+    TInt err = num.Val(fieldId);
+    if(err == KErrNone)
+    {
+        iId = fieldId;
+    }
+    else
+    {
+        User::Leave(KErrArgument);
+    }
+}
+
+// -----------------------------------------------------------------------------
+// This function parses input for sort type
+// -----------------------------------------------------------------------------
+void CTestSuiteInputData::ParseInputForSortTypeL(TDesC& aInput)
+{
+//	TSortType sorttype;
+	
+	// set the sort type
+	if(aInput.Compare(KAlphabetic) == 0)
+	{
+	    iSortType = EAlphabetical;
+	}
+	else if (aInput.Compare(KPattern) == 0)
+	{
+	    iSortType = EPatternBased;
+	}
+	else
+	{
+		User::Leave(KErrArgument);
+	}
+}
+
+// -----------------------------------------------------------------------------
+// This function parses input for cache uris
+// -----------------------------------------------------------------------------
+void CTestSuiteInputData::ParseInputForData(TDesC& aInput)
+{
+	RPointerArray<TDesC> data;
+	TChar separator = ',';
+	
+	// Get the uris which are separated by commas
+	GetCharacterSeparatedDataL( aInput,separator, data);
+	for(TInt i = 0; i< data.Count(); i++)
+	{
+        HBufC *temp =  data[i]->AllocL();
+        iDataArray.Append(data[i]);
+	}
+}
+
+// -----------------------------------------------------------------------------
+// This function parses input for cache uris
+// -----------------------------------------------------------------------------
+void CTestSuiteInputData::ParseInputForDataStoresUriL(TDesC& aInput)
+{
+	RPointerArray<TDesC> Uris;
+	TChar separator = ',';
+	
+	// Get the uris which are separated by commas
+	GetCharacterSeparatedDataL( aInput,separator, Uris);
+	for(TInt i = 0; i< Uris.Count(); i++)
+	{
+        HBufC *temp =  Uris[i]->AllocL();
+        iCacheUris.Append(Uris[i]);
+	}
+}
+
+// -----------------------------------------------------------------------------
+// This function parses the input for display fields
+// -----------------------------------------------------------------------------
+void CTestSuiteInputData::ParseInputForDisplayFieldsL(TDesC& aInput)
+{
+	RPointerArray<TDesC> dispFieldsBuf;
+	
+	TChar separator = ',';
+	GetCharacterSeparatedDataL( aInput,separator, dispFieldsBuf);
+	for(TInt i = 0; i< dispFieldsBuf.Count(); i++)
+	{
+		TInt fieldId = 0;
+		TLex num(*(dispFieldsBuf[i]));
+		
+        TInt err = num.Val(fieldId);  // parse the string to extract integer value
+        if(err != KErrNone)
+        {
+            User::Leave(KErrGeneral);
+        }
+        else
+        {
+            iDisplayFields.Append(fieldId);
+        }
+	}
+}
+
+// -----------------------------------------------------------------------------
+// This function parses the input for expected group ids
+// -----------------------------------------------------------------------------
+void CTestSuiteInputData::ParseInputForGroupIdsL(TDesC& aInput)
+{
+	RPointerArray<TDesC> grpIdsBuf;
+	
+	TChar separator = ',';
+	GetCharacterSeparatedDataL( aInput,separator, grpIdsBuf);
+	for(TInt i = 0; i< grpIdsBuf.Count(); i++)
+	{
+		TInt groupId = 0;
+		TLex num(*(grpIdsBuf[i]));
+		
+        TInt err = num.Val(groupId);  // parse the string to extract integer value
+        if(err != KErrNone)
+        {
+            User::Leave(KErrGeneral);
+        }
+        else
+        {
+            iGroupIds.Append(groupId);
+        }
+	}
+}
+
+// -----------------------------------------------------------------------------
+// This function splits the the input separated by particular character
+// -----------------------------------------------------------------------------
+void CTestSuiteInputData::GetCharacterSeparatedDataL(TDesC& aInput,TChar aSeparator, RPointerArray<TDesC> &aSeparatedData)
+{
+	TInt SeparatorPos = -1 ;
+    for (TInt j = 0 ; j< aInput.Length();)
+	{
+        TInt Startpos = SeparatorPos + 1;
+		// Get the data for each contact
+        while((aInput[j] != aSeparator) && (j < ( aInput.Length()-1) ) )
+            j++;
+		if(j == (aInput.Length() - 1))
+			j++; 
+
+        TPtrC16 dataPtr = aInput.Mid(Startpos ,j - Startpos);	
+
+        // Add data to the output
+        HBufC* tempData = dataPtr.AllocL();
+        aSeparatedData.Append(tempData);
+        SeparatorPos = j ;  
+        j++;   
+    }
+}
+
+// -----------------------------------------------------------------------------
+// This function parses the input for search query
+// -----------------------------------------------------------------------------
+void CTestSuiteInputData::ParseInputForSearchQueryL(TDesC& aInput)
+{
+	RPointerArray<TDesC> queryData;
+	TChar separator = ',';
+	GetCharacterSeparatedDataL( aInput,separator, queryData);
+
+    // If there are more than 2 field, then it is an error
+    if(queryData.Count() == 2)
+    {
+    	iQueryBuf = queryData[0]->AllocL();
+    	iKeyboardModeBuf = queryData[1]->AllocL();
+    	queryData.ResetAndDestroy();
+    }
+    else
+    {
+    	queryData.ResetAndDestroy();
+     	User::Leave(KErrArgument);
+    }
+}
+
+// -----------------------------------------------------------------------------
+// This function creates the search query from the input buffer
+// -----------------------------------------------------------------------------
+void CTestSuiteInputData::CreateSearchQueryL(CPsQuery& aPsQuery,TDesC& aQueryBuf)
+{
+	TKeyboardModes keyboardMode = EModeUndefined;
+
+    // Check the keyboard mode
+	if(iKeyboardModeBuf->Des().Compare(KItut) == 0)
+	{
+	    keyboardMode = EItut;
+	}
+	else if (iKeyboardModeBuf->Des().Compare(KQwerty) == 0)
+	{
+	    keyboardMode = EQwerty;
+	}
+
+	else // mixed mode
+	{
+		// convert the search query to the required format
+		_LIT(KCode,"i");
+		for(TInt i = 0; i < aQueryBuf.Length(); i++)
+		{
+			CPsQueryItem* item = CPsQueryItem::NewL();
+	    	item->SetCharacter(aQueryBuf[i]); // set search character
+	    	
+	    	// set the keyboard mode
+	    	if( (iKeyboardModeBuf->Des().Mid(i,1)).Compare(KCode) == 0)
+ 			{
+ 				item->SetMode(EItut);
+ 			}
+ 			else 
+ 			{
+ 				item->SetMode(EQwerty);
+ 			}
+ 			
+ 			aPsQuery.AppendL(*item);
+		}
+		
+		return ;
+	}
+	
+	// create the query as CPsQuery object
+	// for EItut and EQwerty mode
+	for(TInt j = 0; j < aQueryBuf.Length(); j++)
+	{
+		CPsQueryItem* item1 = CPsQueryItem::NewL();
+	    item1->SetCharacter(aQueryBuf[j]);
+	    item1->SetMode(keyboardMode);
+	    aPsQuery.AppendL(*item1);
+	}
+}
+
+// -----------------------------------------------------------------------------
+// Perform the search settings
+// -----------------------------------------------------------------------------
+
+void CTestSuiteInputData::PerformSearchSettingsL(CPsSettings& aSettings)
+{
+	RPointerArray<TDesC> databases; // list of databases
+	RArray<TInt> displayFields;     // list of display fields
+	TInt maxResults = 100;
+
+	// add the display fields
+    if(iDisplayFields.Count())
+    {
+		for(TInt i =0; i<iDisplayFields.Count();i++)
+		    displayFields.Append(iDisplayFields[i]);
+    }
+    else
+    {
+	    displayFields.Append(6); // Firstname
+	    displayFields.Append(4); // Lastname
+	    displayFields.Append(27); // Company name
+    }
+     
+    // Set the databases to be searched 
+	for(TInt i =0; i <iCacheUris.Count(); i++ )
+	{
+		databases.Append(iCacheUris[i]->AllocL());
+	}
+	
+	// Perform the settings
+	aSettings.SetSearchUrisL(databases);
+    aSettings.SetDisplayFieldsL(displayFields);
+    aSettings.SetMaxResults(maxResults);
+
+	// cleanup
+	displayFields.Close();
+	databases.Reset(); 
+	databases.Close(); 
+}
+
+TInt CTestSuiteInputData::CompareByDataL ( const CPsClientData& aObject1, const CPsClientData& aObject2 )
+{
+	TBuf<KBufferMaxLen> data1;
+    TBuf<255> data2;
+     
+    _LIT(KSpace, " ");
+     
+    data1 = KNullDesC;
+    for ( int i = 0; i < aObject1.DataElementCount(); i++ )
+    {
+        if ( aObject1.Data(i) )
+        {
+            data1 += aObject1.Data(i)->Des();
+            data1 += KSpace;
+        }	     
+    }
+    
+    // Trim the unnecessary white spaces before we compare
+    data1.TrimAll();
+    
+    data2 = KNullDesC;
+    for ( int i = 0; i < aObject2.DataElementCount(); i++ )
+    {
+        if ( aObject2.Data(i) )
+        {
+            data2 += aObject2.Data(i)->Des();
+            data2 += KSpace;
+        }	     
+    }   
+    
+    // Trim the unnecessary white spaces before we compare 
+    data2.TrimAll();   
+    
+    // Get the standard method
+    TCollationMethod meth = *Mem::CollationMethodByIndex( 0 );
+    meth.iFlags |= TCollationMethod::EIgnoreNone;
+    meth.iFlags |= TCollationMethod::EFoldCase;
+    
+    // Magic: Collation level 3 is used
+    TInt comparison(data1.CompareC( data2, 3, &meth ));
+    return comparison;
+}
+
+// End of file