os/kernelhwsrv/kerneltest/e32test/math/t_realx.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     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     }