kerneltest/e32test/math/t_realx.cpp
changeset 0 a41df078684a
equal deleted inserted replaced
-1:000000000000 0:a41df078684a
       
     1 // Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of the License "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // e32test\math\t_realx.cpp
       
    15 // T_REALX.CPP - Test routines for TRealX
       
    16 // Overview:
       
    17 // Test the functionality of a class that encapsulates 64 bit extended precision
       
    18 // real values.
       
    19 // API Information:
       
    20 // TRealX 
       
    21 // Details:
       
    22 // - Test the constructor and assignment operator with signed, unsigned, 64 bit
       
    23 // integer, float and double values.
       
    24 // - Check the conversion of TRealX value to signed, unsigned, 64 bit integer,
       
    25 // float and double values is as expected.
       
    26 // - Set TRealX variable with some special values and check it is as expected.
       
    27 // - Test addition, multiplication, division of TRealX values is as expected.
       
    28 // - Test Unary operators, comparison of two TRealX values are as expected.
       
    29 // Platforms/Drives/Compatibility:
       
    30 // All 
       
    31 // Assumptions/Requirement/Pre-requisites:
       
    32 // Failures and causes:
       
    33 // Base Port information:
       
    34 // 
       
    35 //
       
    36 
       
    37 #include <e32std.h>
       
    38 #include <e32std_private.h>
       
    39 #include <e32test.h>
       
    40 #include <e32math.h>
       
    41 #include "t_realxd.h"
       
    42 
       
    43 LOCAL_D RTest test(_L("T_TREALX"));
       
    44 
       
    45 // Conversion functions TInt64 <-> TReal64
       
    46 LOCAL_C void TReal64ToTInt64(TInt64 *aDest, const TReal64 *aSrc)
       
    47 	{
       
    48 	TInt *pD=(TInt*)aDest;
       
    49 	const TInt *pS=(TInt*)aSrc;
       
    50 #ifdef __DOUBLE_WORDS_SWAPPED__
       
    51 	pD[1]=pS[0];		// word containing sign,exp
       
    52 	pD[0]=pS[1];
       
    53 #else
       
    54 	pD[1]=pS[1];		// word containing sign,exp
       
    55 	pD[0]=pS[0];
       
    56 #endif
       
    57 	}
       
    58 
       
    59 LOCAL_C void TInt64ToTReal64(TReal64 *aDest, const TInt64 *aSrc)
       
    60 	{
       
    61 	TInt *pD=(TInt*)aDest;
       
    62 	const TInt *pS=(TInt*)aSrc;
       
    63 #ifdef __DOUBLE_WORDS_SWAPPED__
       
    64 	pD[0]=pS[1];		// word containing sign,exp
       
    65 	pD[1]=pS[0];
       
    66 #else
       
    67 	pD[1]=pS[1];		// word containing sign,exp
       
    68 	pD[0]=pS[0];
       
    69 #endif
       
    70 	}
       
    71 
       
    72 // Test functions
       
    73 SRealX::SRealX(TUint a, TUint b, TUint c)
       
    74 	{
       
    75 	iExpFlagSign=a;
       
    76 	iMantHigh=b;
       
    77 	iMantLow=c;
       
    78 	}
       
    79 
       
    80 SRealX::SRealX(const TRealX& aRealX)
       
    81 	{
       
    82 	const TUint *pR = (const TUint *)&aRealX;
       
    83 	iExpFlagSign=pR[2];
       
    84 	iMantHigh=pR[1];
       
    85 	iMantLow=pR[0];
       
    86 	}
       
    87 
       
    88 SRealX& SRealX::operator=(const TRealX& aRealX)
       
    89 	{
       
    90 	const TUint *pR = (const TUint *)&aRealX;
       
    91 	iExpFlagSign=pR[2];
       
    92 	iMantHigh=pR[1];
       
    93 	iMantLow=pR[0];
       
    94 	return *this;
       
    95 	}
       
    96 
       
    97 SRealX::operator TRealX() const
       
    98 	{
       
    99 	TRealX r;
       
   100 	TUint *pR=(TUint *)&r;
       
   101 	pR[2]=iExpFlagSign;
       
   102 	pR[1]=iMantHigh;
       
   103 	pR[0]=iMantLow;
       
   104 	return r;
       
   105 	}
       
   106 
       
   107 TBool SRealX::operator==(const SRealX& aSRealX) const
       
   108 	{
       
   109 	TUint e1=iExpFlagSign >> 16;
       
   110 	TUint e2=aSRealX.iExpFlagSign >> 16;
       
   111 	TUint s1=iExpFlagSign & 0x00000001;
       
   112 	TUint s2=aSRealX.iExpFlagSign & 0x00000001;
       
   113 	TUint f1=iExpFlagSign & 0x00000300;
       
   114 	TUint f2=aSRealX.iExpFlagSign & 0x00000300;
       
   115 	return( e1==e2 && s1==s2 && (e1==0 || (f1==f2 && iMantHigh==aSRealX.iMantHigh && iMantLow==aSRealX.iMantLow)) );
       
   116 	}
       
   117 
       
   118 SConvertFrom32BitTest::SConvertFrom32BitTest(TInt op, const SRealX& res, TInt r)
       
   119 	{
       
   120 	iOperand=op;
       
   121 	iResult=res;
       
   122 	iReturnCode=r;
       
   123 	}
       
   124 
       
   125 void SConvertFrom32BitTest::Test(TConversionFrom32Bits aConversion) const
       
   126 	{
       
   127 	TInt r=iReturnCode;
       
   128 	SRealX sr;
       
   129 	switch(aConversion)
       
   130 		{
       
   131 		case EConstructInt:
       
   132 			{
       
   133 			TRealX x(iOperand);
       
   134 			sr=(SRealX)x;
       
   135 			break;
       
   136 			}
       
   137 		case EAssignInt:
       
   138 			{
       
   139 			TRealX x;
       
   140 			x=iOperand;
       
   141 			sr=(SRealX)x;
       
   142 			break;
       
   143 			}
       
   144 		case ESetInt:
       
   145 			{
       
   146 			TRealX x;
       
   147 			r=x.Set(iOperand);
       
   148 			sr=(SRealX)x;
       
   149 			break;
       
   150 			}
       
   151 		case EConstructUint:
       
   152 			{
       
   153 			TUint uint=(TUint)iOperand;
       
   154 			TRealX x(uint);
       
   155 			sr=(SRealX)x;
       
   156 			break;
       
   157 			}
       
   158 		case EAssignUint:
       
   159 			{
       
   160 			TUint uint=(TUint)iOperand;
       
   161 			TRealX x;
       
   162 			x=uint;
       
   163 			sr=(SRealX)x;
       
   164 			break;
       
   165 			}
       
   166 		case ESetUint:
       
   167 			{
       
   168 			TUint uint=(TUint)iOperand;
       
   169 			TRealX x;
       
   170 			r=x.Set(uint);
       
   171 			sr=(SRealX)x;
       
   172 			break;
       
   173 			}
       
   174 		case EConstructFloat:
       
   175 			{
       
   176 			TReal32 f;
       
   177 			TInt *pF=(TInt*)&f;
       
   178 			*pF=iOperand;
       
   179 			TRealX x(f);
       
   180 			sr=(SRealX)x;
       
   181 			break;
       
   182 			}
       
   183 		case EAssignFloat:
       
   184 			{
       
   185 			TReal32 f;
       
   186 			TInt *pF=(TInt*)&f;
       
   187 			*pF=iOperand;
       
   188 			TRealX x;
       
   189 			x=f;
       
   190 			sr=(SRealX)x;
       
   191 			break;
       
   192 			}
       
   193 		case ESetFloat:
       
   194 			{
       
   195 			TReal32 f;
       
   196 			TInt *pF=(TInt*)&f;
       
   197 			*pF=iOperand;
       
   198 			TRealX x;
       
   199 			r=x.Set(f);
       
   200 			sr=(SRealX)x;
       
   201 			break;
       
   202 			}
       
   203 		}
       
   204 	if (sr==iResult && r==iReturnCode)
       
   205 		return;
       
   206 	test.Printf(_L("Conversion %d from 32 bit operand test failed\noperand = %08X\n"),
       
   207 		(TInt)aConversion, iOperand );
       
   208 	test.Printf(_L("Result %08X %08X %08X\nReturn code %d\n"),
       
   209 		sr.iExpFlagSign, sr.iMantHigh, sr.iMantLow, r );
       
   210 	test.Printf(_L("Correct result %08X %08X %08X\nCorrect return code %d\n"),
       
   211 		iResult.iExpFlagSign, iResult.iMantHigh, iResult.iMantLow, iReturnCode );
       
   212 	//test.Getch();
       
   213 	test(0);
       
   214 	}
       
   215 
       
   216 SConvertFrom64BitTest::SConvertFrom64BitTest(TInt64 op, const SRealX& res, TInt r)
       
   217 	{
       
   218 	iOperand=op;
       
   219 	iResult=res;
       
   220 	iReturnCode=r;
       
   221 	}
       
   222 
       
   223 void SConvertFrom64BitTest::Test(TConversionFrom64Bits aConversion) const
       
   224 	{
       
   225 	TInt r=iReturnCode;
       
   226 	SRealX sr;
       
   227 	switch(aConversion)
       
   228 		{
       
   229 		case EConstructInt64:
       
   230 			{
       
   231 			TRealX x(iOperand);
       
   232 			sr=(SRealX)x;
       
   233 			break;
       
   234 			}
       
   235 		case EAssignInt64:
       
   236 			{
       
   237 			TRealX x;
       
   238 			x=iOperand;
       
   239 			sr=(SRealX)x;
       
   240 			break;
       
   241 			}
       
   242 		case ESetInt64:
       
   243 			{
       
   244 			TRealX x;
       
   245 			r=x.Set(iOperand);
       
   246 			sr=(SRealX)x;
       
   247 			break;
       
   248 			}
       
   249 /*		case EConstructUint:
       
   250 			{
       
   251 			TUint uint=(TUint)iOperand;
       
   252 			TRealX x(uint);
       
   253 			sr=(SRealX)x;
       
   254 			break;
       
   255 			}
       
   256 		case EAssignUint:
       
   257 			{
       
   258 			TUint uint=(TUint)iOperand;
       
   259 			TRealX x;
       
   260 			x=uint;
       
   261 			sr=(SRealX)x;
       
   262 			break;
       
   263 			}
       
   264 		case ESetUint:
       
   265 			{
       
   266 			TUint uint=(TUint)iOperand;
       
   267 			TRealX x;
       
   268 			r=x.Set(uint);
       
   269 			sr=(SRealX)x;
       
   270 			break;
       
   271 			}*/
       
   272 		case EConstructDouble:
       
   273 			{
       
   274 			TReal64 d;
       
   275 			TInt64ToTReal64(&d, &iOperand);
       
   276 			TRealX x(d);
       
   277 			sr=(SRealX)x;
       
   278 			break;
       
   279 			}
       
   280 		case EAssignDouble:
       
   281 			{
       
   282 			TReal64 d;
       
   283 			TInt64ToTReal64(&d, &iOperand);
       
   284 			TRealX x;
       
   285 			x=d;
       
   286 			sr=(SRealX)x;
       
   287 			break;
       
   288 			}
       
   289 		case ESetDouble:
       
   290 			{
       
   291 			TReal64 d;
       
   292 			TInt64ToTReal64(&d, &iOperand);
       
   293 			TRealX x;
       
   294 			r=x.Set(d);
       
   295 			sr=(SRealX)x;
       
   296 			break;
       
   297 			}
       
   298 		}
       
   299 	if (sr==iResult && r==iReturnCode)
       
   300 		return;
       
   301 	test.Printf(_L("Conversion %d from 64 bit operand test failed\noperand = %08X %08X\n"),
       
   302 		(TInt)aConversion, I64HIGH(iOperand), I64LOW(iOperand) );
       
   303 	test.Printf(_L("Result %08X %08X %08X\nReturn code %d\n"),
       
   304 		sr.iExpFlagSign, sr.iMantHigh, sr.iMantLow, r );
       
   305 	test.Printf(_L("Correct result %08X %08X %08X\nCorrect return code %d\n"),
       
   306 		iResult.iExpFlagSign, iResult.iMantHigh, iResult.iMantLow, iReturnCode );
       
   307 	//test.Getch();
       
   308 	test(0);
       
   309 	}
       
   310 
       
   311 SConvertTo32BitTest::SConvertTo32BitTest(const SRealX& op, TInt res, TInt r)
       
   312 	{
       
   313 	iOperand=op;
       
   314 	iResult=res;
       
   315 	iReturnCode=r;
       
   316 	}
       
   317 
       
   318 void SConvertTo32BitTest::Test(TConversionTo32Bits aConversion) const
       
   319 	{
       
   320 	TInt r=iReturnCode;
       
   321 	TRealX op=(TRealX)iOperand;
       
   322 	TInt result=0;
       
   323 	switch(aConversion)
       
   324 		{
       
   325 		case EOperatorInt:
       
   326 			result=(TInt)op;
       
   327 			break;
       
   328 		case EOperatorUint:
       
   329 			{
       
   330 			TUint uint;
       
   331 			uint=(TUint)op;
       
   332 			result=(TInt)uint;
       
   333 			break;
       
   334 			}
       
   335 		case EOperatorTReal32:
       
   336 			{
       
   337 			TReal32 x;
       
   338 			x=(TReal32)op;
       
   339 			result=*((TInt*)&x);
       
   340 			break;
       
   341 			}
       
   342 		case EGetTReal32:
       
   343 			{
       
   344 			TReal32 x;
       
   345 			r=op.GetTReal(x);
       
   346 			result=*((TInt*)&x);
       
   347 			break;
       
   348 			}
       
   349 		}
       
   350 	if (result==iResult && r==iReturnCode)
       
   351 		return;
       
   352 	test.Printf(_L("Conversion %d to 32 bit operand test failed\noperand = %08X %08X %08X\n"),
       
   353 		(TInt)aConversion, iOperand.iExpFlagSign, iOperand.iMantHigh, iOperand.iMantLow );
       
   354 	test.Printf(_L("Result %08X\nReturn code %d\n"),
       
   355 		result, r );
       
   356 	test.Printf(_L("Correct result %08X\nCorrect return code %d\n"),
       
   357 		iResult, iReturnCode );
       
   358 	//test.Getch();
       
   359 	test(0);
       
   360 	}
       
   361 
       
   362 SConvertTo64BitTest::SConvertTo64BitTest(const SRealX& op, TInt64 res, TInt r)
       
   363 	{
       
   364 	iOperand=op;
       
   365 	iResult=res;
       
   366 	iReturnCode=r;
       
   367 	}
       
   368 
       
   369 void SConvertTo64BitTest::Test(TConversionTo64Bits aConversion) const
       
   370 	{
       
   371 	TInt r=iReturnCode;
       
   372 	TRealX op=(TRealX)iOperand;
       
   373 	TInt64 result=0;
       
   374 	switch(aConversion)
       
   375 		{
       
   376 		case EOperatorInt64:
       
   377 			result=op.operator TInt64();  // odd conversion syntax required for VC5 compilation
       
   378 			break;
       
   379 		case EOperatorTReal64:
       
   380 			{
       
   381 			TReal64 d;
       
   382 			d=(TReal64)op;
       
   383 			TReal64ToTInt64(&result, &d);
       
   384 			break;
       
   385 			}
       
   386 		case EGetTReal64:
       
   387 			{
       
   388 			TReal64 d;
       
   389 			r=op.GetTReal(d);
       
   390 			TReal64ToTInt64(&result, &d);
       
   391 			break;
       
   392 			}
       
   393 		}
       
   394 	if (result==iResult && r==iReturnCode)
       
   395 		return;
       
   396 	test.Printf(_L("Conversion %d to 64 bit operand test failed\noperand = %08X %08X %08X\n"),
       
   397 		(TInt)aConversion, iOperand.iExpFlagSign, iOperand.iMantHigh, iOperand.iMantLow );
       
   398 	test.Printf(_L("Result %08X %08X\nReturn code %d\n"),
       
   399 		I64HIGH(result), I64LOW(result), r );
       
   400 	test.Printf(_L("Correct result %08X %08X\nCorrect return code %d\n"),
       
   401 		I64HIGH(iResult), I64LOW(iResult), iReturnCode );
       
   402 	//test.Getch();
       
   403 	test(0);
       
   404 	}
       
   405 
       
   406 SCompareTest::SCompareTest(const SRealX& o1, const SRealX& o2, TInt r)
       
   407 	{
       
   408 	iOperand1=o1;
       
   409 	iOperand2=o2;
       
   410 	iReturnCode=r;
       
   411 	}
       
   412 
       
   413 void SCompareTest::Test() const
       
   414 	{
       
   415 	TRealX op1=(TRealX)iOperand1;
       
   416 	TRealX op2=(TRealX)iOperand2;
       
   417 	TRealX::TRealXOrder r=op1.Compare(op2);
       
   418 	TBool lt=op1<op2;
       
   419 	TBool le=op1<=op2;
       
   420 	TBool gt=op1>op2;
       
   421 	TBool ge=op1>=op2;
       
   422 	TBool eq=op1==op2;
       
   423 	TBool ne=op1!=op2;
       
   424 	if ((TInt)r==iReturnCode)
       
   425 		{
       
   426 		switch(r)
       
   427 			{
       
   428 			case TRealX::ELessThan:
       
   429 				if (lt && le && !gt && !ge && !eq && ne)
       
   430 					return;
       
   431 				break;
       
   432 
       
   433 			case TRealX::EEqual:
       
   434 				if (!lt && le && !gt && ge && eq && !ne)
       
   435 					return;
       
   436 				break;
       
   437 			case TRealX::EGreaterThan:
       
   438 				if (!lt && !le && gt && ge && !eq && ne)
       
   439 					return;
       
   440 				break;
       
   441 
       
   442 			case TRealX::EUnordered:
       
   443 				if (!lt && !le && !gt && !ge && !eq && ne)
       
   444 					return;
       
   445 				break;
       
   446 			}
       
   447 		}
       
   448 	test.Printf(_L("Compare test failed\nop1 = %08X %08X %08X\nop2 = %08X %08X %08X\n"),
       
   449 		iOperand1.iExpFlagSign, iOperand1.iMantHigh, iOperand1.iMantLow,
       
   450 		iOperand2.iExpFlagSign, iOperand2.iMantHigh, iOperand2.iMantLow );
       
   451 	test.Printf(_L("Return code %d\nlt=%d, le=%d, gt=%d, ge=%d, eq=%d, ne=%d\n"),
       
   452 		r, lt, le, gt, ge, eq, ne );
       
   453 	//test.Getch();
       
   454 	test(0);
       
   455 	}
       
   456 
       
   457 SOneOpTest::SOneOpTest(const SRealX& op, const SRealX& res, TInt r)
       
   458 	{
       
   459 	iOperand=op;
       
   460 	iResult=res;
       
   461 	iReturnCode=r;
       
   462 	}
       
   463 
       
   464 TInt SOneOpTest::DoTest(TUnaryOperation anOperation, TRealX *aResult) const
       
   465 	{
       
   466 	TInt r=KErrNone;
       
   467 	TRealX op;
       
   468 	*aResult=(TRealX)iOperand;
       
   469 
       
   470 	switch(anOperation)
       
   471 		{
       
   472 		case EUnaryPlus:
       
   473 			*aResult=+(*aResult);
       
   474 			break;
       
   475 		case EUnaryMinus:
       
   476 			*aResult=-(*aResult);
       
   477 			break;
       
   478 		case EPreInc:
       
   479 			++*aResult;
       
   480 			break;
       
   481 		case EPreDec:
       
   482 			--*aResult;
       
   483 			break;
       
   484 		case EPostInc:
       
   485 			op=(*aResult)++;
       
   486 			if (!(SRealX(op)==iOperand))
       
   487 				r=KErrGeneral;
       
   488 			break;
       
   489 		case EPostDec:
       
   490 			op=(*aResult)--;
       
   491 			if (!(SRealX(op)==iOperand))
       
   492 				r=KErrGeneral;
       
   493 			break;
       
   494 		}
       
   495 	return r;
       
   496 	}
       
   497 
       
   498 TInt OneOpTestThreadFunction(TAny *anInfo)
       
   499 	{
       
   500 	SOneOpTestThreadInfo *pI=(SOneOpTestThreadInfo *)anInfo;
       
   501 	TInt r=pI->iTest->DoTest(pI->iOperation,pI->iResult);
       
   502 	return r;
       
   503 	}
       
   504 
       
   505 void SOneOpTest::Test(TUnaryOperation anOperation) const
       
   506 	{
       
   507 	SOneOpTestThreadInfo info;
       
   508 	TRealX result;
       
   509 	info.iTest=this;
       
   510 	info.iOperation=anOperation;
       
   511 	info.iResult=&result;
       
   512 	RThread t;
       
   513 	TInt r=t.Create(_L("TestThread"),OneOpTestThreadFunction,0x1000,0x1000,0x100000,&info);
       
   514 	test(r==KErrNone);
       
   515 	t.SetPriority(EPriorityMore);	// so we will not run again until thread terminates
       
   516 	TRequestStatus s;
       
   517 	t.Logon(s);
       
   518 	t.Resume();
       
   519 	User::WaitForRequest(s);
       
   520 	TExitType exittype=t.ExitType();
       
   521 	r=s.Int();
       
   522 	CLOSE_AND_WAIT(t);
       
   523 	SRealX sr(result);
       
   524 	if (sr==iResult && r==iReturnCode)
       
   525 		{
       
   526 		if (anOperation>EUnaryMinus)
       
   527 			{
       
   528 			if (r==KErrNone && exittype==EExitKill)
       
   529 				return;
       
   530 			if (r!=KErrNone && exittype==EExitPanic)
       
   531 				return;
       
   532 			}
       
   533 		else
       
   534 			{
       
   535 			if (exittype==EExitKill)
       
   536 				return;
       
   537 			}
       
   538 		}
       
   539 	
       
   540 	test.Printf(_L("Unary operation %d test failed\nop = %08X %08X %08X\n"),
       
   541 		(TInt)anOperation,
       
   542 		iOperand.iExpFlagSign, iOperand.iMantHigh, iOperand.iMantLow );
       
   543 	test.Printf(_L("Result %08X %08X %08X\nReturn code %d Exit type %d\n"),
       
   544 		sr.iExpFlagSign, sr.iMantHigh, sr.iMantLow, r, (TInt)exittype );
       
   545 	test.Printf(_L("Correct result %08X %08X %08X\nCorrect return code %d\n"),
       
   546 		iResult.iExpFlagSign, iResult.iMantHigh, iResult.iMantLow, iReturnCode );
       
   547 	//test.Getch();
       
   548 	test(0);
       
   549 	}
       
   550 
       
   551 STwoOpTest::STwoOpTest(const SRealX& o1, const SRealX& o2, const SRealX& res, TInt r)
       
   552 	{
       
   553 	iOperand1=o1;
       
   554 	iOperand2=o2;
       
   555 	iResult=res;
       
   556 	iReturnCode=r;
       
   557 	}
       
   558 
       
   559 TInt STwoOpTest::DoTest(TBinaryOperation anOperation, TRealX *aResult, TBool aSwap) const
       
   560 	{
       
   561 	TInt r=KErrNone;
       
   562 	TRealX op1, op2;
       
   563 	if (aSwap)
       
   564 		{
       
   565 		op2=(TRealX)iOperand1;
       
   566 		op1=(TRealX)iOperand2;
       
   567 		*aResult=(TRealX)iOperand2;
       
   568 		}
       
   569 	else
       
   570 		{
       
   571 		op1=(TRealX)iOperand1;
       
   572 		op2=(TRealX)iOperand2;
       
   573 		*aResult=(TRealX)iOperand1;
       
   574 		}
       
   575 
       
   576 	switch(anOperation)
       
   577 		{
       
   578 		case EAddEq:
       
   579 			r=aResult->AddEq(op2);
       
   580 			break;
       
   581 		case ESubEq:
       
   582 			r=aResult->SubEq(op2);
       
   583 			break;
       
   584 		case EMultEq:
       
   585 			r=aResult->MultEq(op2);
       
   586 			break;
       
   587 		case EDivEq:
       
   588 			r=aResult->DivEq(op2);
       
   589 			break;
       
   590 		case EAdd:
       
   591 			r=op1.Add(*aResult,op2);
       
   592 			break;
       
   593 		case ESub:
       
   594 			r=op1.Sub(*aResult,op2);
       
   595 			break;
       
   596 		case EMult:
       
   597 			r=op1.Mult(*aResult,op2);
       
   598 			break;
       
   599 		case EDiv:
       
   600 			r=op1.Div(*aResult,op2);
       
   601 			break;
       
   602 		case EPlusEq:
       
   603 			*aResult+=op2;
       
   604 			break;
       
   605 		case EMinusEq:
       
   606 			*aResult-=op2;
       
   607 			break;
       
   608 		case EStarEq:
       
   609 			*aResult*=op2;
       
   610 			break;
       
   611 		case ESlashEq:
       
   612 			*aResult/=op2;
       
   613 			break;
       
   614 		case EPlus:
       
   615 			*aResult=op1+op2;
       
   616 			break;
       
   617 		case EMinus:
       
   618 			*aResult=op1-op2;
       
   619 			break;
       
   620 		case EStar:
       
   621 			*aResult=op1*op2;
       
   622 			break;
       
   623 		case ESlash:
       
   624 			*aResult=op1/op2;
       
   625 			break;
       
   626 		}
       
   627 	return r;
       
   628 	}
       
   629 
       
   630 TInt TwoOpTestThreadFunction(TAny *anInfo)
       
   631 	{
       
   632 	STwoOpTestThreadInfo *pI=(STwoOpTestThreadInfo *)anInfo;
       
   633 	TInt r=pI->iTest->DoTest(pI->iOperation,pI->iResult,pI->iSwap);
       
   634 	return r;
       
   635 	}
       
   636 
       
   637 void STwoOpTest::Test(TBinaryOperation anOperation, TBool aSwap) const
       
   638 	{
       
   639 	STwoOpTestThreadInfo info;
       
   640 	TRealX result;
       
   641 	info.iTest=this;
       
   642 	info.iOperation=anOperation;
       
   643 	info.iResult=&result;
       
   644 	info.iSwap=aSwap;
       
   645 	RThread t;
       
   646 	TInt r=t.Create(_L("TestThread"),TwoOpTestThreadFunction,0x1000,0x1000,0x100000,&info);
       
   647 	test(r==KErrNone);
       
   648 	t.SetPriority(EPriorityMore);	// so we will not run again until thread terminates
       
   649 	TRequestStatus s;
       
   650 	t.Logon(s);
       
   651 	t.Resume();
       
   652 	User::WaitForRequest(s);
       
   653 	TExitType exittype=t.ExitType();
       
   654 	r=s.Int();
       
   655 	CLOSE_AND_WAIT(t);
       
   656 	SRealX sr(result);
       
   657 	if (anOperation>=EPlus && exittype==EExitPanic)
       
   658 		{
       
   659 		// if +,-,*,/ operation paniced, result will be lost
       
   660 		sr=iResult;
       
   661 		}
       
   662 	if (sr==iResult && r==iReturnCode)
       
   663 		{
       
   664 		if (anOperation>=EPlusEq)
       
   665 			{
       
   666 			if (r==KErrNone && exittype==EExitKill)
       
   667 				return;
       
   668 			if (r!=KErrNone && exittype==EExitPanic)
       
   669 				return;
       
   670 			}
       
   671 		else
       
   672 			{
       
   673 			if (exittype==EExitKill)
       
   674 				return;
       
   675 			}
       
   676 		}
       
   677 	
       
   678 	test.Printf(_L("Binary operation %d test failed\nop1 = %08X %08X %08X\nop2 = %08X %08X %08X\n"),
       
   679 		(TInt)anOperation,
       
   680 		iOperand1.iExpFlagSign, iOperand1.iMantHigh, iOperand1.iMantLow,
       
   681 		iOperand2.iExpFlagSign, iOperand2.iMantHigh, iOperand2.iMantLow );
       
   682 	test.Printf(_L("Result %08X %08X %08X\nReturn code %d Exit type %d\n"),
       
   683 		sr.iExpFlagSign, sr.iMantHigh, sr.iMantLow, r, (TInt)exittype );
       
   684 	test.Printf(_L("Correct result %08X %08X %08X\nCorrect return code %d\n"),
       
   685 		iResult.iExpFlagSign, iResult.iMantHigh, iResult.iMantLow, iReturnCode );
       
   686 	//test.Getch();
       
   687 	test(0);
       
   688 	}
       
   689 
       
   690 SSpecialValueTest::SSpecialValueTest(const SRealX& op, TInt aResults)
       
   691 	{
       
   692 	iOperand=op;
       
   693 	iIsZero=aResults & 8;
       
   694 	iIsNaN=aResults & 4;
       
   695 	iIsInfinite=aResults & 2;
       
   696 	iIsFinite=aResults & 1;
       
   697 	}
       
   698 
       
   699 LOCAL_C TBool same(TBool a, TBool b)
       
   700 	{
       
   701 	return( (a && b) || (!a && !b) );
       
   702 	}
       
   703 
       
   704 void SSpecialValueTest::Test() const
       
   705 	{
       
   706 	TRealX x=(TRealX)iOperand;
       
   707 	TBool isZero=x.IsZero();
       
   708 	TBool isNaN=x.IsNaN();
       
   709 	TBool isInfinite=x.IsInfinite();
       
   710 	TBool isFinite=x.IsFinite();
       
   711 	if ( same(isZero,iIsZero) && same(isNaN,iIsNaN) && same(isInfinite,iIsInfinite) && same(isFinite,iIsFinite) )
       
   712 		return;
       
   713 	test.Printf(_L("Special value test failed\nOperand %08X %08X %08X\n"),
       
   714 		iOperand.iExpFlagSign, iOperand.iMantHigh, iOperand.iMantLow );
       
   715 	test.Printf(_L("Results IsZero=%d, IsNaN=%d, IsInfinite=%d, IsFinite=%d "),
       
   716 		isZero, isNaN, isInfinite, isFinite );
       
   717 	test.Printf(_L("Correct results IsZero=%d, IsNaN=%d, IsInfinite=%d, IsFinite=%d "),
       
   718 		iIsZero, iIsNaN, iIsInfinite, iIsFinite );
       
   719 	//test.Getch();
       
   720 	test(0);
       
   721 	}
       
   722 
       
   723 LOCAL_C void TestAssignConstruct()
       
   724 	{
       
   725 	TInt i;
       
   726 
       
   727 	// test default constructor
       
   728 	TRealX z;
       
   729 	SRealX sz(z);
       
   730 	test(sz.iExpFlagSign==0);
       
   731 	test(sz.iMantHigh==0);
       
   732 	test(sz.iMantLow==0);
       
   733 
       
   734 	for (i=0; i<NumConvertFromIntTests; i++)
       
   735 		{
       
   736 		const SConvertFrom32BitTest *pT=&(ConvertFromIntTests[i]);
       
   737 		pT->Test(EConstructInt);
       
   738 		pT->Test(EAssignInt);
       
   739 		pT->Test(ESetInt);
       
   740 		}
       
   741 	for (i=0; i<NumConvertFromUintTests; i++)
       
   742 		{
       
   743 		const SConvertFrom32BitTest *pT=&(ConvertFromUintTests[i]);
       
   744 		pT->Test(EConstructUint);
       
   745 		pT->Test(EAssignUint);
       
   746 		pT->Test(ESetUint);
       
   747 		}
       
   748 	for (i=0; i<NumConvertFromInt64Tests; i++)
       
   749 		{
       
   750 		const SConvertFrom64BitTest *pT=&(ConvertFromInt64Tests[i]);
       
   751 		pT->Test(EConstructInt64);
       
   752 		pT->Test(EAssignInt64);
       
   753 		pT->Test(ESetInt64);
       
   754 		}
       
   755 	for (i=0; i<NumConvertFromFloatTests; i++)
       
   756 		{
       
   757 		const SConvertFrom32BitTest *pT=&(ConvertFromFloatTests[i]);
       
   758 		pT->Test(EConstructFloat);
       
   759 		pT->Test(EAssignFloat);
       
   760 		pT->Test(ESetFloat);
       
   761 		}
       
   762 	for (i=0; i<NumConvertFromDoubleTests; i++)
       
   763 		{
       
   764 		const SConvertFrom64BitTest *pT=&(ConvertFromDoubleTests[i]);
       
   765 		pT->Test(EConstructDouble);
       
   766 		pT->Test(EAssignDouble);
       
   767 		pT->Test(ESetDouble);
       
   768 		}
       
   769 	}
       
   770 
       
   771 LOCAL_C void TestConversions()
       
   772 	{
       
   773 	TInt i;
       
   774 	for (i=0; i<NumConvertToIntTests; i++)
       
   775 		{
       
   776 		const SConvertTo32BitTest *pT=&(ConvertToIntTests[i]);
       
   777 		pT->Test(EOperatorInt);
       
   778 		}
       
   779 	for (i=0; i<NumConvertToUintTests; i++)
       
   780 		{
       
   781 		const SConvertTo32BitTest *pT=&(ConvertToUintTests[i]);
       
   782 		pT->Test(EOperatorUint);
       
   783 		}
       
   784 	for (i=0; i<NumConvertToInt64Tests; i++)
       
   785 		{
       
   786 		const SConvertTo64BitTest *pT=&(ConvertToInt64Tests[i]);
       
   787 		pT->Test(EOperatorInt64);
       
   788 		}
       
   789 	for (i=0; i<NumConvertToFloatTests; i++)
       
   790 		{
       
   791 		const SConvertTo32BitTest *pT=&(ConvertToFloatTests[i]);
       
   792 		pT->Test(EOperatorTReal32);
       
   793 		pT->Test(EGetTReal32);
       
   794 		}
       
   795 	for (i=0; i<NumConvertToDoubleTests; i++)
       
   796 		{
       
   797 		const SConvertTo64BitTest *pT=&(ConvertToDoubleTests[i]);
       
   798 		pT->Test(EOperatorTReal64);
       
   799 		pT->Test(EGetTReal64);
       
   800 		}
       
   801 	}
       
   802 
       
   803 LOCAL_C void TestSpecials()
       
   804 	{
       
   805 	TRealX x;
       
   806 	SRealX sx;
       
   807 	x.SetInfinite(EFalse);
       
   808 	sx=x;
       
   809 	test(sx.iExpFlagSign==0xFFFF0000);
       
   810 	test(sx.iMantHigh==0x80000000);
       
   811 	test(sx.iMantLow==0);
       
   812 	x.SetZero();
       
   813 	sx=x;
       
   814 	test(sx.iExpFlagSign==0x00000000);
       
   815 	x.SetInfinite(ETrue);
       
   816 	sx=x;
       
   817 	test(sx.iExpFlagSign==0xFFFF0001);
       
   818 	test(sx.iMantHigh==0x80000000);
       
   819 	test(sx.iMantLow==0);
       
   820 	x.SetNaN();
       
   821 	sx=x;
       
   822 	test(sx.iExpFlagSign==0xFFFF0001);
       
   823 	test(sx.iMantHigh==0xC0000000);
       
   824 	test(sx.iMantLow==0);
       
   825 	x.SetZero(ETrue);
       
   826 	sx=x;
       
   827 	test(sx.iExpFlagSign==0x00000001);
       
   828 
       
   829 	TInt i;
       
   830 	for(i=0; i<NumSpecialValueTests; i++)
       
   831 		{
       
   832 		const SSpecialValueTest *pT=&(SpecialValueTests[i]);
       
   833 		pT->Test();
       
   834 		}
       
   835 	}
       
   836 
       
   837 LOCAL_C void TestUnaryOperators()
       
   838 	{
       
   839 	TInt i;
       
   840 	for (i=0; i<NumUnaryPlusTests; i++)
       
   841 		{
       
   842 		const SOneOpTest *pT=&(UnaryPlusTests[i]);
       
   843 		pT->Test(EUnaryPlus);
       
   844 		}
       
   845 	for (i=0; i<NumUnaryMinusTests; i++)
       
   846 		{
       
   847 		const SOneOpTest *pT=&(UnaryMinusTests[i]);
       
   848 		pT->Test(EUnaryMinus);
       
   849 		}
       
   850 	for (i=0; i<NumIncTests; i++)
       
   851 		{
       
   852 		const SOneOpTest *pT=&(IncTests[i]);
       
   853 		pT->Test(EPreInc);
       
   854 		pT->Test(EPostInc);
       
   855 		}
       
   856 	for (i=0; i<NumDecTests; i++)
       
   857 		{
       
   858 		const SOneOpTest *pT=&(DecTests[i]);
       
   859 		pT->Test(EPreDec);
       
   860 		pT->Test(EPostDec);
       
   861 		}
       
   862 	}
       
   863 
       
   864 LOCAL_C void TestAddition()
       
   865 	{
       
   866 	TInt i;
       
   867 	for (i=0; i<NumAdditionTests; i++)
       
   868 		{
       
   869 		const STwoOpTest *pT=&(AdditionTests[i]);
       
   870 		pT->Test(EAddEq,EFalse);
       
   871 		pT->Test(EAddEq,ETrue);
       
   872 		pT->Test(EAdd,EFalse);
       
   873 		pT->Test(EAdd,ETrue);
       
   874 		pT->Test(EPlusEq,EFalse);
       
   875 		pT->Test(EPlusEq,ETrue);
       
   876 		pT->Test(EPlus,EFalse);
       
   877 		pT->Test(EPlus,ETrue);
       
   878 		}
       
   879 	for (i=0; i<NumBinaryOpNaNTests; i++)
       
   880 		{
       
   881 		const STwoOpTest *pT=&(BinaryOpNaNTests[i]);
       
   882 		pT->Test(EAddEq,EFalse);
       
   883 		pT->Test(EAddEq,ETrue);
       
   884 		pT->Test(EAdd,EFalse);
       
   885 		pT->Test(EAdd,ETrue);
       
   886 		pT->Test(EPlusEq,EFalse);
       
   887 		pT->Test(EPlusEq,ETrue);
       
   888 		pT->Test(EPlus,EFalse);
       
   889 		pT->Test(EPlus,ETrue);
       
   890 		}
       
   891 	}
       
   892 
       
   893 LOCAL_C void TestMultiplication()
       
   894 	{
       
   895 	TInt i;
       
   896 	for (i=0; i<NumMultiplicationTests; i++)
       
   897 		{
       
   898 		const STwoOpTest *pT=&(MultiplicationTests[i]);
       
   899 		pT->Test(EMultEq,EFalse);
       
   900 		pT->Test(EMultEq,ETrue);
       
   901 		pT->Test(EMult,EFalse);
       
   902 		pT->Test(EMult,ETrue);
       
   903 		pT->Test(EStarEq,EFalse);
       
   904 		pT->Test(EStarEq,ETrue);
       
   905 		pT->Test(EStar,EFalse);
       
   906 		pT->Test(EStar,ETrue);
       
   907 		}
       
   908 	for (i=0; i<NumBinaryOpNaNTests; i++)
       
   909 		{
       
   910 		const STwoOpTest *pT=&(BinaryOpNaNTests[i]);
       
   911 		pT->Test(EMultEq,EFalse);
       
   912 		pT->Test(EMultEq,ETrue);
       
   913 		pT->Test(EMult,EFalse);
       
   914 		pT->Test(EMult,ETrue);
       
   915 		pT->Test(EStarEq,EFalse);
       
   916 		pT->Test(EStarEq,ETrue);
       
   917 		pT->Test(EStar,EFalse);
       
   918 		pT->Test(EStar,ETrue);
       
   919 		}
       
   920 	}
       
   921 
       
   922 LOCAL_C void TestDivision()
       
   923 	{
       
   924 	TInt i;
       
   925 	for (i=0; i<NumDivisionTests; i++)
       
   926 		{
       
   927 		const STwoOpTest *pT=&(DivisionTests[i]);
       
   928 		pT->Test(EDivEq,EFalse);
       
   929 		pT->Test(EDiv,EFalse);
       
   930 		pT->Test(ESlashEq,EFalse);
       
   931 		pT->Test(ESlash,EFalse);
       
   932 		}
       
   933 	for (i=0; i<NumBinaryOpNaNTests; i++)
       
   934 		{
       
   935 		const STwoOpTest *pT=&(BinaryOpNaNTests[i]);
       
   936 		pT->Test(EDivEq,EFalse);
       
   937 		pT->Test(EDiv,EFalse);
       
   938 		pT->Test(ESlashEq,EFalse);
       
   939 		pT->Test(ESlash,EFalse);
       
   940 		}
       
   941 	}
       
   942 
       
   943 LOCAL_C void TestComparison()
       
   944 	{
       
   945 	TInt i;
       
   946 	for (i=0; i<NumComparisonTests; i++)
       
   947 		{
       
   948 		const SCompareTest *pT=&(ComparisonTests[i]);
       
   949 		pT->Test();
       
   950 		}
       
   951 	}
       
   952 
       
   953 
       
   954 GLDEF_C TInt E32Main()
       
   955 //
       
   956 //	Test TRealX
       
   957 //
       
   958     {
       
   959 
       
   960 	User::SetJustInTime(EFalse);
       
   961 	test.Title();
       
   962 	test.Start(_L("Assignment Operator and Constructors"));	
       
   963 	TestAssignConstruct();
       
   964 	test.Next(_L("Conversions"));
       
   965 	TestConversions();
       
   966 	test.Next(_L("Setting and Checking Specials"));
       
   967 	TestSpecials();
       
   968 	test.Next(_L("Addition"));
       
   969 	TestAddition();
       
   970 	test.Next(_L("Multiplication"));
       
   971 	TestMultiplication();
       
   972 	test.Next(_L("Division"));
       
   973 	TestDivision();
       
   974 	test.Next(_L("Unary Operators"));
       
   975 	TestUnaryOperators();
       
   976 	test.Next(_L("Comparisons"));
       
   977 	TestComparison();
       
   978 	
       
   979 	test.End();
       
   980 	return(KErrNone);
       
   981     }