/*
* Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
* Contact: http://www.qt-project.org/legal
* 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: 
* TestHelpers Test module
*
*/



#ifndef __TEST_HELPERS__
#define __TEST_HELPERS__

#include <e32test.h>


#define PUSH(x) CleanupStack::PushL(x)
#define POP(x)  CleanupStack::Pop(x)
#define POPD(x) CleanupStack::PopAndDestroy(x); x = NULL;

//////////// Logging macros ///////////////
GLDEF_C RTest test(KTestName);
//int __NB_ERR;
int __NB_failures = 0;

_LIT(KNBTestSmile, "\n{°±°}");
_LIT(KNBTestNoErrMask, "%s(%d) : runtime error: Function '%s' returned %d\n");
_LIT(KNBTestTrapMask,  "%s(%d) : runtime error: Function '%s' left with code %d\n");
_LIT(KNBTestTrueMask,  "%s(%d) : runtime error: Statement '%s' equals %d\n");


#ifndef max
#define max(a,b)            (((a) > (b)) ? (a) : (b))
#endif


#define __ttv(x, c, l, f, val, leave)  \
	{const TInt __NB_ERR = x;	 \
	if (__NB_ERR != val) \
		__NB_PRINT_ERROR(KNBTestTrueMask, __NB_ERR, _S(c), l,_S(f), leave);}

#define TESTVALUE(x, val)  __ttv(x, #x, __LINE__,__FILE__,val,EFalse)
#define TESTVALUEL(x, val) __ttv(x, #x, __LINE__,__FILE__,val,ETrue)


#define __ttr(x, c, l, f, leave)  \
	{TBool __NB_ERR = x;	 \
	if (__NB_ERR == EFalse) \
	{__NB_PRINT_ERROR(KNBTestTrueMask, __NB_ERR, _S(c), l,_S(f), leave);} }

#define TESTTRUE(x)  __ttr(x, #x, __LINE__,__FILE__,EFalse)
#define TESTTRUEL(x) __ttr(x, #x, __LINE__,__FILE__,ETrue)

#define __ttt(x, c, l, f, leave)  \
	{const TInt __NB_ERR = x;     \
	if (__NB_ERR != KErrNone)	  \
		__NB_PRINT_ERROR(KNBTestNoErrMask, __NB_ERR, _S(c), l,_S(f), leave);}

#define TESTNOERR(x)  __ttt(x, #x, __LINE__,__FILE__, EFalse)
#define TESTNOERRL(x) __ttt(x, #x, __LINE__,__FILE__, ETrue) 		

#define __ttp(x, c, l, f, leave)		\
	{TRAPD(__NB_ERR, x);		\
	if (__NB_ERR != KErrNone)	\
		__NB_PRINT_ERROR(KNBTestTrapMask, __NB_ERR, _S(c), l,_S(f), leave);}

#define TESTTRAP(x)  __ttp(x, #x, __LINE__,__FILE__, EFalse)
#define TESTTRAPL(x) __ttp(x, #x, __LINE__,__FILE__, ETrue)

GLDEF_C void __NB_PRINT_ERROR(const TDesC& aMask, TInt aResult, const TText* aCommand, TInt aLineNum,const TText* aFileName, TBool leave = EFalse)
	{
	TBuf<0x400> str;
	str.Format(aMask, aFileName, aLineNum, aCommand, aResult);
	test.Printf(KNBTestSmile);
	test.Printf(str);
	if (leave)
		User::Leave(aResult < 0 ? aResult : KErrUnknown);
	else
		++__NB_failures;
	}
///////////////////////////////////////////////






#endif //__TEST_HELPERS__
