/*
* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). 
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "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:
*
*/

/**
@test
@internalComponent

This contains CT_DataFont
*/

//	User includes
#include "T_DataFont.h"

//	Epoc includes
#include <gdi.h>

/*@{*/
///	Parameters
_LIT(KText,									"text");
_LIT(KWidthAvailable,						"width_available");
_LIT(KCalculateExcess,						"calculate_excess");
_LIT(KExpectedExcess,						"expected_excess");
_LIT(KExpectedResult,						"expected_result");
_LIT(KExpectedFont,							"expected_font");	
_LIT(KCharCode,								"char_code");
_LIT(KUid,									"uid");
_LIT(KMeasureTextOutput,					"measure_text_output");
_LIT(KMeasureTextInput,						"measure_text_input");

///	Commands
_LIT(KCmdFontCapitalAscent,					"FontCapitalAscent");
_LIT(KCmdFontMaxAscent,						"FontMaxAscent");
_LIT(KCmdFontStandardDescent,				"FontStandardDescent");
_LIT(KCmdFontMaxDescent,					"FontMaxDescent");
_LIT(KCmdFontLineGap,						"FontLineGap");
_LIT(KCmdFontMaxHeight,						"FontMaxHeight");
_LIT(KCmdTypeUid,							"TypeUid");
_LIT(KCmdHeightInPixels,					"HeightInPixels");
_LIT(KCmdAscentInPixels,					"AscentInPixels");
_LIT(KCmdDescentInPixels,					"DescentInPixels");
_LIT(KCmdCharWidthInPixels,					"CharWidthInPixels");
_LIT(KCmdTextCount,							"TextCount");
_LIT(KCmdMaxCharWidthInPixels,				"MaxCharWidthInPixels");
_LIT(KCmdMaxNormalCharWidthInPixels,		"MaxNormalCharWidthInPixels");
_LIT(KCmdFontSpecInTwips,					"FontSpecInTwips");
_LIT(KCmdWidthZeroInPixels,					"WidthZeroInPixels");
_LIT(KCmdBaselineOffsetInPixels,			"BaselineOffsetInPixels");
_LIT(KCmdGetCharacterData,					"GetCharacterData");
_LIT(KCmdMeasureText,						"MeasureText");
_LIT(KCmdExtendedFunction,					"ExtendedFunction");
_LIT(KCmdTextWidthInPixels,					"TextWidthInPixels");
/*@}*/

/**
* Constructor. First phase construction
*/
CT_DataFont::CT_DataFont()
:	CDataWrapperBase()
	{
	}

/**
* Process a command read from the ini file
*
* @param aDataWrapper	test step requiring command to be processed
* @param aCommand	the command to process
* @param aSection		the entry in the ini file requiring the command to be processed
*
* @return ETrue if the command is processed
*/
TBool CT_DataFont::DoCommandL(const TTEFFunction& aCommand, const TTEFSectionName& aSection, const TInt /*aAsyncErrorIndex*/)
	{
	TBool ret=ETrue;

	if (aCommand == KCmdFontCapitalAscent)
		{
		DoCmdFontCapitalAscent(aSection);
		}
	else if (aCommand == KCmdFontMaxAscent)
		{
		DoCmdFontMaxAscent(aSection);
		}
	else if (aCommand == KCmdFontStandardDescent)
		{
		DoCmdFontStandardDescent(aSection);
		}
	else if (aCommand == KCmdFontMaxDescent)
		{
		DoCmdFontMaxDescent(aSection);
		}
	else if (aCommand == KCmdFontLineGap)
		{
		DoCmdFontLineGap(aSection);
		}
	else if (aCommand == KCmdFontMaxHeight)
		{
		DoCmdFontMaxHeight(aSection);
		}
	else if (aCommand == KCmdTypeUid)
		{
		DoCmdTypeUid(aSection);
		}
	else if (aCommand == KCmdHeightInPixels)
		{
		DoCmdHeightInPixels(aSection);
		}
	else if (aCommand == KCmdAscentInPixels)
		{
		DoCmdAscentInPixels(aSection);
		}
	else if (aCommand == KCmdDescentInPixels)
		{
		DoCmdDescentInPixels(aSection);
		}
	else if (aCommand == KCmdCharWidthInPixels)
		{
		DoCmdCharWidthInPixels(aSection);
		}
	else if (aCommand == KCmdTextCount)
		{
		DoCmdTextCount(aSection);
		}
	else if (aCommand == KCmdMaxCharWidthInPixels)
		{
		DoCmdMaxCharWidthInPixels(aSection);
		}
	else if (aCommand == KCmdMaxNormalCharWidthInPixels)
		{
		DoCmdMaxNormalCharWidthInPixels(aSection);
		}
	else if (aCommand == KCmdFontSpecInTwips)
		{
		DoCmdFontSpecInTwips(aSection);
		}
	else if (aCommand == KCmdWidthZeroInPixels)
		{
		DoCmdWidthZeroInPixels(aSection);
		}
	else if (aCommand == KCmdBaselineOffsetInPixels)
		{
		DoCmdBaselineOffsetInPixels(aSection);
		}
	else if (aCommand == KCmdGetCharacterData)
		{
		DoCmdGetCharacterData(aSection);
		}
	else if (aCommand == KCmdMeasureText)
		{
		DoCmdMeasureTextL(aSection);
		}
	else if (aCommand == KCmdExtendedFunction)
		{
		DoCmdExtendedFunction(aSection);
		}
	else if (aCommand == KCmdTextWidthInPixels)
		{
		DoCmdTextWidthInPixels(aSection);
		}
	else
		{
		ret=EFalse;
		}

	return ret;
	}


////////////////// COMMANDS IMPLEMENTATION  ////////////////////////


/** Calls CFont::TextCount() */
void CT_DataFont::DoCmdTextCount(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFont::TextCount()"));
	// get text from parameters
	TPtrC	text;
	if ( !GetStringFromConfig(aSection, KText(), text) )
		{
		ERR_PRINTF2(_L("No %S"), &KText());
		SetBlockResult(EFail);
		}

	// get available width from parameters
	TInt	widthAvailable = 0;
	if(!GetIntFromConfig(aSection, KWidthAvailable(), widthAvailable))
		{
		ERR_PRINTF2(_L("No %S"), &KWidthAvailable());
		SetBlockResult(EFail);
		}

	// get if to use version of TextCount() that calculates excess from parameters
	TBool	calculateExcess = EFalse;
	GetBoolFromConfig(aSection, KCalculateExcess(), calculateExcess);

	// call TextCount()
	TInt	result = KErrNone;
	if ( calculateExcess )
		{
		TInt	excess = 0;
		result = GetFont()->TextCount(text, widthAvailable, excess);

		// get expected excess from parameters
		TInt	expectedExcess = 0;
		if ( GetIntFromConfig(aSection, KExpectedExcess(), expectedExcess) )
			{
			ERR_PRINTF1(_L("An expected excess should not be provided if calculate excess is set to false."));
			SetBlockResult(EFail);
			}
		}
	else
		{
		result = GetFont()->TextCount(text, widthAvailable);
		}

	// get expected result from parameters
	TInt	expectedResult = 0;
	if ( GetIntFromConfig(aSection, KExpectedResult(), expectedResult) )
		{
		if (result != expectedResult)
			{
			ERR_PRINTF3(_L("The result is not as expected! expected: %d, actual: %d"), expectedResult, result);
			SetBlockResult(EFail);
			}
		}
	}


/** Calls CFont::TextWidthInPixels() */
void CT_DataFont::DoCmdTextWidthInPixels(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFont::TextWidthInPixels()"));
	// get text from parameters
	TPtrC	text;
	if (!GetStringFromConfig(aSection, KText(), text))
		{
		ERR_PRINTF2(_L("No %S"), &KText());
		SetBlockResult(EFail);
		}

	// call TextWidthInPixels()
	TInt	result = GetFont()->TextWidthInPixels(text);

	// get expected result from parameters
	TInt	expectedResult = 0;
	if(GetIntFromConfig(aSection, KExpectedResult(), expectedResult))
		{
		if (result != expectedResult)
			{
			ERR_PRINTF3(_L("The result is not as expected! expected: %d, actual: %d"), expectedResult, result);
			SetBlockResult(EFail);
			}
		}
	}


/** Calls CFont::CharWidthInPixels() */
void CT_DataFont::DoCmdCharWidthInPixels(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFont::CharWidthInPixels()"));
	// get character code from parameters
	TInt	charCode = 0;
	if(!GetIntFromConfig(aSection, KCharCode(), charCode))
		{
		ERR_PRINTF2(_L("No %S"), &KCharCode());
		SetBlockResult(EFail);
		}

	// call CharWidthInPixels()
	TInt	result = GetFont()->CharWidthInPixels(charCode);

	// get expected result from parameters
	TInt 	expectedResult = 0;
	if ( GetIntFromConfig(aSection, KExpectedResult(), expectedResult) )
		{
		if (result != expectedResult)
			{
			ERR_PRINTF3(_L("The result is not as expected! expected: %d, actual: %d"), expectedResult, result);
			SetBlockResult(EFail);
			}
		}
	}


/** Calls CFont::FontCapitalAscent() */
void CT_DataFont::DoCmdFontCapitalAscent(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFont::FontCapitalAscent()"));
	// call FontCapitalAscent()
	TInt	result = GetFont()->FontCapitalAscent();

	// get expected result from parameters
	TInt	expectedResult = 0;
	if ( GetIntFromConfig(aSection, KExpectedResult(), expectedResult) )
		{
		if (result != expectedResult)
			{
			ERR_PRINTF3(_L("The result is not as expected! expected: %d, actual: %d"), expectedResult, result);
			SetBlockResult(EFail);
			}
		}
	}


/** Calls CFont::FontMaxAscent() */
void CT_DataFont::DoCmdFontMaxAscent(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFont::FontMaxAscent()"));
	// call FontMaxAscent()
	TInt	result = GetFont()->FontMaxAscent();

	// get expected result from parameters
	TInt	expectedResult = 0;
	if ( GetIntFromConfig(aSection, KExpectedResult(), expectedResult) )
		{
		if (result != expectedResult)
			{
			ERR_PRINTF3(_L("The result is not as expected! expected: %d, actual: %d"), expectedResult, result);
			SetBlockResult(EFail);
			}
		}
	}


/** Calls CFont::FontStandardDescent() */
void CT_DataFont::DoCmdFontStandardDescent(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFont::FontStandardDescent()"));
	// call FontStandardDescent()
	TInt	result = GetFont()->FontStandardDescent();

	// get expected result from parameters
	TInt	expectedResult = 0;
	if(GetIntFromConfig(aSection, KExpectedResult(), expectedResult))
		{
		if (result != expectedResult)
			{
			ERR_PRINTF3(_L("The result is not as expected! expected: %d, actual: %d"), expectedResult, result);
			SetBlockResult(EFail);
			}
		}
	}


/** Calls CFont::FontMaxDescent() */
void CT_DataFont::DoCmdFontMaxDescent(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFont::FontMaxDescent()"));
	// call FontMaxDescent()
	TInt	result = GetFont()->FontMaxDescent();

	// get expected result from parameters
	TInt	expectedResult = 0;
	if(GetIntFromConfig(aSection, KExpectedResult(), expectedResult))
		{
		if (result != expectedResult)
			{
			ERR_PRINTF3(_L("The result is not as expected! expected: %d, actual: %d"), expectedResult, result);
			SetBlockResult(EFail);
			}
		}
	}


/** Calls CFont::FontLineGap() */
void CT_DataFont::DoCmdFontLineGap(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFont::FontLineGap()"));
	// call FontLineGap()
	TInt	result = GetFont()->FontLineGap();

	// get expected result from parameters
	TInt	expectedResult = 0;
	if(GetIntFromConfig(aSection, KExpectedResult(), expectedResult))
		{
		if (result != expectedResult)
			{
			ERR_PRINTF3(_L("The result is not as expected! expected: %d, actual: %d"), expectedResult, result);
			SetBlockResult(EFail);
			}
		}
	}


/** Calls CFont::FontMaxHeight() */
void CT_DataFont::DoCmdFontMaxHeight(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFont::FontMaxHeight()"));
	// call FontMaxHeight()
	TInt	result = GetFont()->FontMaxHeight();

	// get expected result from parameters
	TInt	expectedResult = 0;
	if(GetIntFromConfig(aSection, KExpectedResult(), expectedResult))
		{
		if (result != expectedResult)
			{
			ERR_PRINTF3(_L("The result is not as expected! expected: %d, actual: %d"), expectedResult, result);
			SetBlockResult(EFail);
			}
		}
	}


/** Calls CFont::TypeUid() */
void CT_DataFont::DoCmdTypeUid(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFont::TypeUid()"));
	// call TypeUid()
	TUid	result = GetFont()->TypeUid();

	// get expected result from parameters
	TInt	expectedResult = 0;
	if(GetIntFromConfig(aSection, KExpectedResult(), expectedResult))
		{
		if (result != TUid::Uid(expectedResult))
			{
			ERR_PRINTF3(_L("The result is not as expected! expected: %d, actual: %d"), expectedResult, result.iUid);
			SetBlockResult(EFail);
			}
		}
	}


/** Calls CFont::HeightInPixels() */
void CT_DataFont::DoCmdHeightInPixels(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFont::HeightInPixels()"));
	// call HeightInPixels()
	TInt	result = GetFont()->HeightInPixels();

	// get expected result from parameters
	TInt	expectedResult = 0;
	if(GetIntFromConfig(aSection, KExpectedResult(), expectedResult))
		{
		if (result != expectedResult)
			{
			ERR_PRINTF3(_L("The result is not as expected! expected: %d, actual: %d"), expectedResult, result);
			SetBlockResult(EFail);
			}
		}
	}


/** Calls CFont::AscentInPixels() */
void CT_DataFont::DoCmdAscentInPixels(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFont::AscentInPixels()"));
	// call AscentInPixels()
	TInt	result = GetFont()->AscentInPixels();

	// get expected result from parameters
	TInt	expectedResult = 0;
	if(GetIntFromConfig(aSection, KExpectedResult(), expectedResult))
		{
		if (result != expectedResult)
			{
			ERR_PRINTF3(_L("The result is not as expected! expected: %d, actual: %d"), expectedResult, result);
			SetBlockResult(EFail);
			}
		}
	}


/** Calls CFont::DescentInPixels() */
void CT_DataFont::DoCmdDescentInPixels(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFont::DescentInPixels()"));
	// call DescentInPixels()
	TInt	result = GetFont()->DescentInPixels();

	// get expected result from parameters
	TInt	expectedResult = 0;
	if(GetIntFromConfig(aSection, KExpectedResult(), expectedResult))
		{
		if (result != expectedResult)
			{
			ERR_PRINTF3(_L("The result is not as expected! expected: %d, actual: %d"), expectedResult, result);
			SetBlockResult(EFail);
			}
		}
	}


/** Calls CFont::MaxCharWidthInPixels() */
void CT_DataFont::DoCmdMaxCharWidthInPixels(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFont::MaxCharWidthInPixels()"));
	// call MaxCharWidthInPixels()
	TInt	result = GetFont()->MaxCharWidthInPixels();

	// get expected result from parameters
	TInt	expectedResult = 0;
	if(GetIntFromConfig(aSection, KExpectedResult(), expectedResult))
		{
		if (result != expectedResult)
			{
			ERR_PRINTF3(_L("The result is not as expected! expected: %d, actual: %d"), expectedResult, result);
			SetBlockResult(EFail);
			}
		}
	}


/** Calls CFont::MaxNormalCharWidthInPixels() */
void CT_DataFont::DoCmdMaxNormalCharWidthInPixels(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFont::MaxNormalCharWidthInPixels()"));
	// call MaxNormalCharWidthInPixels()
	TInt	result = GetFont()->MaxNormalCharWidthInPixels();

	// get expected result from parameters
	TInt	expectedResult = 0;
	if(GetIntFromConfig(aSection, KExpectedResult(), expectedResult))
		{
		if (result != expectedResult)
			{
			ERR_PRINTF3(_L("The result is not as expected! expected: %d, actual: %d"), expectedResult, result);
			SetBlockResult(EFail);
			}
		}
	}


/** Calls CFont::FontSpecInTwips() */
void CT_DataFont::DoCmdFontSpecInTwips(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFont::FontSpecInTwips()"));

	// call FontSpecInTwips()
	TFontSpec	fontSpec=GetFont()->FontSpecInTwips();
	INFO_PRINTF3(_L("iName	%S, iHeight    %d"), &fontSpec.iTypeface.iName,fontSpec.iHeight);
	
	TFontSpec expectedFontSpec;
	if(GetFontSpecFromConfig(aSection, KExpectedFont(), expectedFontSpec))
		{
		// just check font name
		if( fontSpec.iTypeface.iName!=expectedFontSpec.iTypeface.iName)
			{
			ERR_PRINTF3(_L("The result is not as expected! expected font: %S, actual font: %S"),
					&expectedFontSpec.iTypeface.iName, &fontSpec.iTypeface.iName);
			SetError(-1);			
			}
		}
	}


/** Calls CFont::WidthZeroInPixels() */
void CT_DataFont::DoCmdWidthZeroInPixels(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFont::WidthZeroInPixels()"));
	// call WidthZeroInPixels()
	TInt	result = GetFont()->WidthZeroInPixels();

	// get expected result from parameters
	TInt	expectedResult = 0;
	if(GetIntFromConfig(aSection, KExpectedResult(), expectedResult))
		{
		if (result != expectedResult)
			{
			ERR_PRINTF3(_L("The result is not as expected! expected: %d, actual: %d"), expectedResult, result);
			SetBlockResult(EFail);
			}
		}
	}


/** Calls CFont::BaselineOffsetInPixels() */
void CT_DataFont::DoCmdBaselineOffsetInPixels(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFont::BaselineOffsetInPixels()"));
	// call BaselineOffsetInPixels()
	TInt	result = GetFont()->BaselineOffsetInPixels();

	// get expected result from parameters
	TInt	expectedResult = 0;
	if(GetIntFromConfig(aSection, KExpectedResult(), expectedResult))
		{
		if (result != expectedResult)
			{
			ERR_PRINTF3(_L("The result is not as expected! expected: %d, actual: %d"), expectedResult, result);
			SetBlockResult(EFail);
			}
		}
	}


/** Calls CFont::GetCharacterData() */
void CT_DataFont::DoCmdGetCharacterData(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFont::GetCharacterData()"));
	// get character code from parameters
	TInt	charCode = 0;
	if(!GetIntFromConfig(aSection, KCharCode(), charCode))
		{
		ERR_PRINTF2(_L("No %S"), &KCharCode());
		SetBlockResult(EFail);
		}

	// call GetCharacterData()
	TUint								code = charCode;
	TOpenFontCharMetrics				metrics;
	const TUint8*						bitmapPointer;
	TSize								bitmapSize;
	CFont::TCharacterDataAvailability	ret=GetFont()->GetCharacterData(code, metrics, bitmapPointer, bitmapSize);
	INFO_PRINTF2(_L("CharacterDataAvailability %d"), ret);
	INFO_PRINTF2(_L("Height                    %d"), bitmapSize.iHeight);
	INFO_PRINTF2(_L("Width                     %d"), bitmapSize.iWidth);
	}


/** Calls CFont::ExtendedFunction() */
void CT_DataFont::DoCmdExtendedFunction(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFont::ExtendedFunction()"));
	// get function UID from parameters
	TInt	uidInt = 0;
	if(!GetHexFromConfig(aSection, KUid(), uidInt))
		{
		ERR_PRINTF2(_L("No %S"), &KUid());
		SetBlockResult(EFail);
		}

	// call ExtendedFunction()
	TInt	result=GetFont()->ExtendedFunction(TUid::Uid(uidInt), NULL);

	// get expected result from parameters
	TInt	expectedResult = 0;
	if ( GetIntFromConfig(aSection, KExpectedResult(), expectedResult) )
		{
		if (result != expectedResult)
			{
			ERR_PRINTF3(_L("The result is not as expected! expected: %d, actual: %d"), expectedResult, result);
			SetBlockResult(EFail);
			}
		}
	}


/** Calls CFbsFont::MeasureText() */
void CT_DataFont::DoCmdMeasureTextL(const TDesC& aSection)
	{
	CFont::TMeasureTextInput*	measureTextInputPointer = NULL;
	GetMeasureTextInputL(*this, KMeasureTextInput(), aSection, measureTextInputPointer);
	if ( measureTextInputPointer==NULL )
		{
		INFO_PRINTF1(_L("measureTextInputPointer NULL"));
		}

	CFont::TMeasureTextOutput*	measureTextOutputPointer = NULL;
	GetMeasureTextOutputL(*this, KMeasureTextOutput(), aSection, measureTextOutputPointer);
	if ( measureTextOutputPointer==NULL )
		{
		INFO_PRINTF1(_L("measureTextOutputPointer NULL"));
		}

	// get text from parameters
	TPtrC	text;
	if (!GetStringFromConfig(aSection, KText(), text))
		{
		ERR_PRINTF2(_L("No %S"), &KText());
		SetBlockResult(EFail);
		}
	else
		{
		TInt	width=GetFont()->MeasureText(text, measureTextInputPointer, measureTextOutputPointer);
		INFO_PRINTF2(_L("MeasureText %d"), width);
		}
	}


////////////////// UTIL METHODS ////////////////////////


/**
* Utility method that fetches TMeasureTextInput pointer by command parameter name from INI-file.
*/
TBool CT_DataFont::GetMeasureTextInputL(CDataWrapper& aDataWrapper, const TDesC& aParameterName, const TDesC& aSection, CFont::TMeasureTextInput*& aMeasureTextInput)
	{
	// get MeasureTextInputData object from parameters
	TPtrC	measureTextInputDataObjectName;
	TBool	ret=aDataWrapper.GetStringFromConfig(aSection, aParameterName, measureTextInputDataObjectName);
	if ( ret )
		{
		// check that the data object was found
		aMeasureTextInput=static_cast<CFont::TMeasureTextInput*>(aDataWrapper.GetDataObjectL(measureTextInputDataObjectName));
		}

	return ret;
	}


/**
* Utility method that fetches TMeasureTextOutput pointer by command parameter name from INI-file.
*/
TBool CT_DataFont::GetMeasureTextOutputL(CDataWrapper& aDataWrapper, const TDesC& aParameterName, const TDesC& aSection, CFont::TMeasureTextOutput*& aMeasureTextOutput)
	{
	// get MeasureTextOutputData object from parameters
	TPtrC	measureTextOutputDataObjectName;
	TBool	ret=aDataWrapper.GetStringFromConfig(aSection, aParameterName, measureTextOutputDataObjectName);
	if ( ret )
		{
		// check that the data object was found
		aMeasureTextOutput=static_cast<CFont::TMeasureTextOutput*>(aDataWrapper.GetDataObjectL(measureTextOutputDataObjectName));
		}

	return ret;
	}
