| 0 |      1 | // Copyright (c) 1995-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_float.cpp
 | 
|  |     15 | // Data split into files: t_float1.cpp, t_float2.cpp and t_float3.cpp
 | 
|  |     16 | // Overview:
 | 
|  |     17 | // Test conversion of real to descriptors, descriptors to real and the 
 | 
|  |     18 | // Math::Round method.
 | 
|  |     19 | // API Information:
 | 
|  |     20 | // TDes8, TDes16, TLex8, TLex16, Math.  
 | 
|  |     21 | // Details:
 | 
|  |     22 | // - Test conversion of specified TReal32, TReal64 into TBuf8, TBuf16 
 | 
|  |     23 | // is as expected.
 | 
|  |     24 | // - Round some numbers to a specified number of decimal places and check it 
 | 
|  |     25 | // is as expected.
 | 
|  |     26 | // - Test conversion of specified TReal32, TReal64 into TBuf8, TBuf16 in
 | 
|  |     27 | // calculator mode is as expected.
 | 
|  |     28 | // - Check that errors returned during conversion from TReal32, TReal64 into 
 | 
|  |     29 | // TBuf8, TBuf16 are as expected.
 | 
|  |     30 | // - Verify the result when a string is parsed to extract a real number.
 | 
|  |     31 | // - Test string to real conversion in cases, which are not exact and check
 | 
|  |     32 | // that results are as expected.
 | 
|  |     33 | // - Test errors in string to real conversion are as expected.
 | 
|  |     34 | // - Test that the conversion from string to real and then real to string, verify
 | 
|  |     35 | // the results are as expected.
 | 
|  |     36 | // - For specified strings values check parsing of string to extract real value, 
 | 
|  |     37 | // absolute value, token length is as expected.
 | 
|  |     38 | // - Check the character representation of specified real numbers are as expected.
 | 
|  |     39 | // Platforms/Drives/Compatibility:
 | 
|  |     40 | // All 
 | 
|  |     41 | // Assumptions/Requirement/Pre-requisites:
 | 
|  |     42 | // Failures and causes:
 | 
|  |     43 | // Base Port information:
 | 
|  |     44 | // 
 | 
|  |     45 | //
 | 
|  |     46 | 
 | 
|  |     47 | #include "t_math.h"
 | 
|  |     48 | #include "t_float.h"
 | 
|  |     49 | 
 | 
|  |     50 | GLREF_D RtoB_TEST testd[];
 | 
|  |     51 | GLREF_D TUint size_testd;
 | 
|  |     52 | GLREF_D RtoB_TEST testcalc[];
 | 
|  |     53 | GLREF_D TUint size_testcalc;
 | 
|  |     54 | GLREF_D ERR_TEST testerr[];
 | 
|  |     55 | GLREF_D TUint size_testerr;
 | 
|  |     56 | GLREF_D DtoR_ERR_TEST testerr2[];
 | 
|  |     57 | GLREF_D TUint size_testerr2;
 | 
|  |     58 | GLREF_D DtoR_ERR_TEST testerr3[];
 | 
|  |     59 | GLREF_D TUint size_testerr3;
 | 
|  |     60 | GLREF_D CALC_TEST calctest[];
 | 
|  |     61 | GLREF_D TUint size_calctest;
 | 
|  |     62 | GLREF_D ROUND_TEST testround[];
 | 
|  |     63 | GLREF_D TUint size_testround;
 | 
|  |     64 | GLREF_D DtoR_TEST64 testd2[];
 | 
|  |     65 | GLREF_D TUint size_testd2;
 | 
|  |     66 | GLREF_D DtoR_TEST64 testApprox[];
 | 
|  |     67 | GLREF_D TUint size_testApprox;
 | 
|  |     68 | GLREF_D DtoR_TEST32 testd32[];
 | 
|  |     69 | GLREF_D TUint size_testd32;
 | 
|  |     70 | 
 | 
|  |     71 | GLDEF_D RTest test(_L("T_FLOAT"));
 | 
|  |     72 | 
 | 
|  |     73 | LOCAL_C TInt rtob(RtoB_TEST& tst)
 | 
|  |     74 |     {
 | 
|  |     75 | 
 | 
|  |     76 |     TBuf<0x100> buf;
 | 
|  |     77 | 
 | 
|  |     78 |  	TInt ret=buf.Num(tst.num,tst.format);
 | 
|  |     79 | 	if (ret!=KErrGeneral)
 | 
|  |     80 | 		{
 | 
|  |     81 | 		buf.ZeroTerminate();
 | 
|  |     82 | 		TPtrC result(tst.res);
 | 
|  |     83 | //		test.Printf(_L("buf=%S\nres=%S\n"),&buf,&result);
 | 
|  |     84 | 		test(buf.Compare(result)==0);
 | 
|  |     85 | 		}
 | 
|  |     86 |     return(ret);
 | 
|  |     87 |     }
 | 
|  |     88 | 
 | 
|  |     89 | LOCAL_C void test1()
 | 
|  |     90 | // 
 | 
|  |     91 | // Test RtoB using selected numbers
 | 
|  |     92 | //
 | 
|  |     93 |     {
 | 
|  |     94 | 
 | 
|  |     95 |   	for (TInt jj=0;jj<TInt(size_testd/sizeof(RtoB_TEST));jj++)
 | 
|  |     96 |         test(rtob(testd[jj])>=0);
 | 
|  |     97 | 	}
 | 
|  |     98 | 
 | 
|  |     99 | LOCAL_C void test2()
 | 
|  |    100 | //
 | 
|  |    101 | // Test Math::Round(_,_,_) for specific numbers
 | 
|  |    102 | //
 | 
|  |    103 |     {
 | 
|  |    104 | 
 | 
|  |    105 |     TReal res;
 | 
|  |    106 |     TRealFormat pf;
 | 
|  |    107 | 	pf.iType=KRealFormatExponent;
 | 
|  |    108 | 	pf.iWidth=22;
 | 
|  |    109 | 	pf.iPlaces=15;
 | 
|  |    110 | 	pf.iPoint='.';
 | 
|  |    111 | 	pf.iTriad=',';
 | 
|  |    112 | 	pf.iTriLen=1;
 | 
|  |    113 | 					
 | 
|  |    114 |     for (TInt jj=0;jj<TInt(size_testround/sizeof(ROUND_TEST));jj++) 
 | 
|  |    115 |         {
 | 
|  |    116 |         test(Math::Round(res,testround[jj].num,testround[jj].plcs)==KErrNone);
 | 
|  |    117 |         TReal err=(res-testround[jj].res);
 | 
|  |    118 |         if (res)
 | 
|  |    119 |             err/=res;
 | 
|  |    120 |         test(Abs(err)<=1E-15);
 | 
|  |    121 |         }
 | 
|  |    122 |     }
 | 
|  |    123 | 
 | 
|  |    124 | LOCAL_C void test3()
 | 
|  |    125 | // 
 | 
|  |    126 | // Test RtoB in calculator mode using selected numbers
 | 
|  |    127 | // Added by AnnW, November 1996
 | 
|  |    128 | //
 | 
|  |    129 |     {
 | 
|  |    130 | 
 | 
|  |    131 |   	for (TInt jj=0;jj<TInt(size_testcalc/sizeof(RtoB_TEST));jj++)
 | 
|  |    132 |         test(rtob(testcalc[jj])>=0);
 | 
|  |    133 |     }
 | 
|  |    134 | 
 | 
|  |    135 | LOCAL_C void test4()
 | 
|  |    136 | //
 | 
|  |    137 | // Tests errors
 | 
|  |    138 | //
 | 
|  |    139 |     {
 | 
|  |    140 | 
 | 
|  |    141 |     for (TInt jj=0;jj<TInt(size_testerr/sizeof(ERR_TEST));jj++)
 | 
|  |    142 |         {
 | 
|  |    143 |         RtoB_TEST tst=testerr[jj].rtob;
 | 
|  |    144 | 		TInt ret=rtob(tst);
 | 
|  |    145 | 		test(testerr[jj].err==ret);
 | 
|  |    146 |         }
 | 
|  |    147 |     }
 | 
|  |    148 | 
 | 
|  |    149 | // End of translated test code from plib.  Now some tests from string o real conversions:
 | 
|  |    150 | 
 | 
|  |    151 | LOCAL_C void test5()
 | 
|  |    152 | //
 | 
|  |    153 | // Test string to real conversion with selected numbers
 | 
|  |    154 | // added by AnnW, December 1996
 | 
|  |    155 | //
 | 
|  |    156 | 	{
 | 
|  |    157 | 	
 | 
|  |    158 | 	TLex l;
 | 
|  |    159 | 	TReal64 r64;
 | 
|  |    160 | 	TInt jj;
 | 
|  |    161 | 	
 | 
|  |    162 | 	for (jj=0; jj<TInt(size_testd2/sizeof(DtoR_TEST64)); jj++)
 | 
|  |    163 | 		{
 | 
|  |    164 | 		const DtoR_TEST64* tst64=&testd2[jj];
 | 
|  |    165 | 		l=tst64->iLex;
 | 
|  |    166 | 		test(l.Val(r64)==KErrNone);
 | 
|  |    167 | 		test(tst64->iRes==r64);
 | 
|  |    168 | 		}
 | 
|  |    169 | 	
 | 
|  |    170 | 	TReal32 r32;
 | 
|  |    171 | 
 | 
|  |    172 | 	for (jj=0; jj<TInt(size_testd32/sizeof(DtoR_TEST32)); jj++)
 | 
|  |    173 | 		{
 | 
|  |    174 | 		const DtoR_TEST32* tst32=&testd32[jj];
 | 
|  |    175 | 		l=tst32->iLex;
 | 
|  |    176 | 		test(l.Val(r32)==KErrNone);
 | 
|  |    177 | 		test(tst32->iRes==r32);
 | 
|  |    178 | 		}
 | 
|  |    179 | 	}	
 | 
|  |    180 | 
 | 
|  |    181 | LOCAL_C void test6()
 | 
|  |    182 | //
 | 
|  |    183 | // Test string to real conversion in cases which are not exact
 | 
|  |    184 | // Added by AnnW, December 1996
 | 
|  |    185 | //
 | 
|  |    186 | 	{
 | 
|  |    187 | 	
 | 
|  |    188 | 	TReal r64;
 | 
|  |    189 | 	
 | 
|  |    190 | 	for (TInt jj=0; jj<TInt(size_testApprox/sizeof(DtoR_TEST64)); jj++)
 | 
|  |    191 | 		{
 | 
|  |    192 | 		const DtoR_TEST64* tst64=&testApprox[jj];
 | 
|  |    193 | 		TLex l=tst64->iLex;
 | 
|  |    194 | 		test(l.Val(r64)==KErrNone);
 | 
|  |    195 | 		test(tst64->iRes==r64);
 | 
|  |    196 | 		}
 | 
|  |    197 | 	}
 | 
|  |    198 | 
 | 
|  |    199 | LOCAL_C void test7()
 | 
|  |    200 | //
 | 
|  |    201 | // Test errors in string to real conversion
 | 
|  |    202 | // added by AnnW, December 1996
 | 
|  |    203 | //
 | 
|  |    204 | 	{
 | 
|  |    205 | 
 | 
|  |    206 | 	TReal r64;
 | 
|  |    207 | 	TInt jj;
 | 
|  |    208 | 
 | 
|  |    209 | 	for (jj=0; jj<TInt(size_testerr2/sizeof(DtoR_ERR_TEST)); jj++)
 | 
|  |    210 | 		{
 | 
|  |    211 | 		const DtoR_ERR_TEST* errtst64=&testerr2[jj];
 | 
|  |    212 | 		TLex l=errtst64->iLex;
 | 
|  |    213 | 		TInt err=errtst64->iErr;
 | 
|  |    214 | 		test(l.Val(r64)==err);
 | 
|  |    215 | 		}
 | 
|  |    216 | 
 | 
|  |    217 | 	TReal32 r32;
 | 
|  |    218 | 
 | 
|  |    219 | 	for (jj=0; jj<TInt(size_testerr3/sizeof(DtoR_ERR_TEST)); jj++)
 | 
|  |    220 | 		{
 | 
|  |    221 | 		const DtoR_ERR_TEST* errtst32=&testerr3[jj];
 | 
|  |    222 | 		TLex l=errtst32->iLex;
 | 
|  |    223 | 		TInt err=errtst32->iErr;
 | 
|  |    224 | 		test(l.Val(r32)==err);
 | 
|  |    225 | 		}
 | 
|  |    226 | 	}
 | 
|  |    227 | 
 | 
|  |    228 | LOCAL_C void test8()
 | 
|  |    229 | //
 | 
|  |    230 | // Some tests for calc to check that a number entered is printed to same significance when
 | 
|  |    231 | // returned
 | 
|  |    232 | // do dtor and rtod test
 | 
|  |    233 | //
 | 
|  |    234 | 	{
 | 
|  |    235 | 
 | 
|  |    236 | 	TLex l;
 | 
|  |    237 | 	TBuf<0x100> buf;
 | 
|  |    238 | 	TInt ret;
 | 
|  |    239 | 	TReal64 num;
 | 
|  |    240 | 
 | 
|  |    241 | 	for (TInt jj=0;jj<TInt(size_calctest/sizeof(CALC_TEST));jj++)
 | 
|  |    242 | 		{
 | 
|  |    243 | 		// string to real
 | 
|  |    244 | 		const CALC_TEST tst=calctest[jj];
 | 
|  |    245 | 		l=tst.iLex;
 | 
|  |    246 | 		test(l.Val(num)==KErrNone);
 | 
|  |    247 | 		
 | 
|  |    248 | 		// real to string
 | 
|  |    249 |  		ret=buf.Num(num,tst.iFormat);
 | 
|  |    250 | 		if (ret!=KErrGeneral)
 | 
|  |    251 | 			{
 | 
|  |    252 | 			buf.ZeroTerminate();
 | 
|  |    253 | 			test(buf.Compare(TPtrC(tst.iRes))==0);
 | 
|  |    254 | 			}
 | 
|  |    255 | 		test(ret>=0);    
 | 
|  |    256 | 		}
 | 
|  |    257 | 	}
 | 
|  |    258 | 
 | 
|  |    259 | // Tag on a few extra tests relating to ascii and unicode
 | 
|  |    260 | 
 | 
|  |    261 | template<class R,class S,class L,class B,class T> 		
 | 
|  |    262 | class AsciiUnicode
 | 
|  |    263 | 	{
 | 
|  |    264 | public:
 | 
|  |    265 | 	void Test1();
 | 
|  |    266 | 	};
 | 
|  |    267 | 
 | 
|  |    268 | template<class R, class S,class L,class B,class T>
 | 
|  |    269 | void AsciiUnicode<R,S,L,B,T>::Test1()
 | 
|  |    270 | // R == TReal32 or TReal64
 | 
|  |    271 | // S == TText, TText8 or TText16
 | 
|  |    272 | // L == TLex, TLex8 or TLex16
 | 
|  |    273 | // B == TBuf, TBuf8 or TBuf16
 | 
|  |    274 | // T == TPtr, TPtr8 or TPtr16
 | 
|  |    275 | 	{
 | 
|  |    276 | 
 | 
|  |    277 | 	L lex1(_TL("123.456"));
 | 
|  |    278 | 	R real; // TReal32 or TReal64 
 | 
|  |    279 | 	test(lex1.Val(real)==KErrNone);							 
 | 
|  |    280 | 	test(Abs(real-123.456)<1E-5);
 | 
|  |    281 | 	test(lex1.TokenLength()==7);
 | 
|  |    282 | 	test((lex1.Remainder()).Compare(T(_TL(""),0,0))==0);
 | 
|  |    283 | 	test(lex1.Val(real)==KErrGeneral);
 | 
|  |    284 | 
 | 
|  |    285 | 	L lex2(_TL("123.456abc"));
 | 
|  |    286 | 	test(lex2.Val(real)==KErrNone);
 | 
|  |    287 | 	test(Abs(real-123.456)<1E-5);
 | 
|  |    288 | 	test(lex2.TokenLength()==7);
 | 
|  |    289 | 	test((lex2.Remainder()).Compare(T(_TL("abc"),3,3))==0);
 | 
|  |    290 | 	test(lex2.Val(real)==KErrGeneral);
 | 
|  |    291 | 
 | 
|  |    292 | 	L lex3;
 | 
|  |    293 | 	real=(R)0.5;
 | 
|  |    294 | 	test(lex3.Val(real)==KErrGeneral);
 | 
|  |    295 | 	test(real==((R)0.5));
 | 
|  |    296 | 	test(lex3.TokenLength()==0);
 | 
|  |    297 | 
 | 
|  |    298 | 	L lex4(_TL("abc123.45"));
 | 
|  |    299 | 	real=(R)0.5;
 | 
|  |    300 | 	test(lex4.Val(real)==KErrGeneral);
 | 
|  |    301 | 	test(real==((R)0.5));
 | 
|  |    302 | 
 | 
|  |    303 | 	L Lex5(_TL("1.2e37"));
 | 
|  |    304 | 	real=(R)0.5;
 | 
|  |    305 | 	test(Lex5.Val(real)==KErrNone);
 | 
|  |    306 | 	
 | 
|  |    307 | 	L Lex6(_TL("1.2e"));
 | 
|  |    308 | 	real=(R)0.5;
 | 
|  |    309 | 	test(Lex6.Val(real)==KErrNone);
 | 
|  |    310 | 
 | 
|  |    311 | 	TRealFormat format(20,3); // first param width, 2nd decimals
 | 
|  |    312 | 	real=(R)12345.6789;
 | 
|  |    313 | 	B buf1;
 | 
|  |    314 | 	test(buf1.Num(real,format)==10);
 | 
|  |    315 | 	test(buf1.Compare(T(_TL("12,345.679"),10,10))==0);
 | 
|  |    316 | 
 | 
|  |    317 | 	B buf2(_TL("abc"));
 | 
|  |    318 | 	test(buf2.AppendNum(real,format)==13);
 | 
|  |    319 | 	test(buf2.Compare(T(_TL("abc12,345.679"),13,13))==0); 
 | 
|  |    320 | 
 | 
|  |    321 | 	B buf3;
 | 
|  |    322 | 	test(buf3.AppendNum(real,format)==10);
 | 
|  |    323 | 	test(buf3.Compare(T(_TL("12,345.679"),10,10))==0);
 | 
|  |    324 | 	}
 | 
|  |    325 | 
 | 
|  |    326 | #ifndef _DEBUG
 | 
|  |    327 | #pragma warning (disable :4710) //Function not expanded
 | 
|  |    328 | #pragma warning (disable :4702) //Unreachable code
 | 
|  |    329 | #endif
 | 
|  |    330 | 
 | 
|  |    331 | GLDEF_C TInt E32Main()
 | 
|  |    332 |     {
 | 
|  |    333 | 	test.Title();
 | 
|  |    334 | 	test.Start(_L("Test ftol"));
 | 
|  |    335 |     TReal f=34.567;
 | 
|  |    336 |     TInt i=TInt(f);
 | 
|  |    337 |     test(i==34);
 | 
|  |    338 | 	test.Next(_L("Test TBuf8/16::Num() using selected numbers"));
 | 
|  |    339 | 	test1();
 | 
|  |    340 | 	test.Next(_L("Test specific numbers for Math::Round(_,_,_)"));
 | 
|  |    341 | 	test2();
 | 
|  |    342 | 	test.Next(_L("Test TBuf8/16::Num() using selected numbers in calculator mode"));
 | 
|  |    343 | 	test3();
 | 
|  |    344 | 	test.Next(_L("Test errors"));
 | 
|  |    345 | 	test4();
 | 
|  |    346 | 	test.Next(_L("Test TLex8/16::Val using selected values which give exact results"));
 | 
|  |    347 | 	test5();
 | 
|  |    348 | 	test.Next(_L("Test TLex8/16::Val using values which do NOT give exact results"));
 | 
|  |    349 | 	test6();
 | 
|  |    350 | 	test.Next(_L("Test errors"));
 | 
|  |    351 | 	test7();
 | 
|  |    352 | 	test.Next(_L("Test for CALC"));
 | 
|  |    353 | 	test8();
 | 
|  |    354 | 	//
 | 
|  |    355 | 	test.Next(_L("Ascii/Unicode: TText"));
 | 
|  |    356 | 	AsciiUnicode<TReal64,TText,TLex,TBuf<0x20>,TPtr> T1;
 | 
|  |    357 | 	T1.Test1();
 | 
|  |    358 | 	test.Next(_L("Ascii/Unicode: TText8"));
 | 
|  |    359 | 	AsciiUnicode<TReal32,TText8,TLex8,TBuf8<0x20>,TPtr8> T2;
 | 
|  |    360 | 	T2.Test1();
 | 
|  |    361 | 	test.Next(_L("Ascii/Unicode: TText16"));
 | 
|  |    362 | 	AsciiUnicode<TReal32,TText16,TLex16,TBuf16<0x20>,TPtr16> T3;
 | 
|  |    363 | 	T3.Test1();											
 | 
|  |    364 | 	//
 | 
|  |    365 | 	test.End();
 | 
|  |    366 | 	return(KErrNone);
 | 
|  |    367 | 	}
 | 
|  |    368 | #pragma warning (default :4710)
 | 
|  |    369 | #pragma warning (default :4702)
 | 
|  |    370 | 
 |