| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 ********************************************************************** | |
| 3 * Copyright (c) 2011-2014,International Business Machines | |
| 4 * Corporation and others. All Rights Reserved. | |
| 5 ********************************************************************** | |
| 6 */ | |
| 7 #include <stdio.h> | |
| 8 #include <string.h> | |
| 9 | |
| 10 #include "sieve.h" | |
| 11 #include "unicode/utimer.h" | |
| 12 #include "udbgutil.h" | |
| 13 #include "unicode/ustring.h" | |
| 14 #include "unicode/decimfmt.h" | |
| 15 #include "unicode/udat.h" | |
| 16 U_NAMESPACE_USE | |
| 17 | |
| 18 #if U_PLATFORM_IMPLEMENTS_POSIX | |
| 19 #include <unistd.h> | |
| 20 | |
| 21 static void usage(const char *prog) { | |
| 22 fprintf(stderr, "Usage: %s [ -f outfile.xml ] [ -t 'TestName' ]\n", prog); | |
| 23 } | |
| 24 #endif | |
| 25 | |
| 26 void runTests(void); | |
| 27 | |
| 28 #ifndef ITERATIONS | |
| 29 #define ITERATIONS 5 | |
| 30 #endif | |
| 31 | |
| 32 #ifndef TEST_LOCALE | |
| 33 #define TEST_LOCALE "en_US" | |
| 34 #endif | |
| 35 | |
| 36 FILE *out = NULL; | |
| 37 UErrorCode setupStatus = U_ZERO_ERROR; | |
| 38 const char *outName = NULL; | |
| 39 int listmode = 0; | |
| 40 const char *testName = NULL; | |
| 41 const char *progname = NULL; | |
| 42 int errflg = 0; | |
| 43 int testhit = 0; | |
| 44 | |
| 45 int testMatch(const char *aName) { | |
| 46 if(testName==NULL) return 1; | |
| 47 int len = strlen(testName); | |
| 48 if(testName[len-1]=='*') { | |
| 49 return strncmp(testName,aName,len-1); | |
| 50 } else { | |
| 51 return strcmp(testName,aName); | |
| 52 } | |
| 53 } | |
| 54 | |
| 55 int main(int argc, char * const * argv){ | |
| 56 #if U_DEBUG | |
| 57 fprintf(stderr,"%s: warning: U_DEBUG is on.\n", argv[0]); | |
| 58 #endif | |
| 59 #if U_DEBUG | |
| 60 { | |
| 61 double m; | |
| 62 double s = uprv_getSieveTime(&m); | |
| 63 fprintf(stderr, "** Standard sieve time: %.9fs +/- %.9fs (%d iterations)\n",
s,m, (int)U_LOTS_OF_TIMES); | |
| 64 } | |
| 65 #endif | |
| 66 | |
| 67 #if U_PLATFORM_IMPLEMENTS_POSIX | |
| 68 int c; | |
| 69 //extern int optind; | |
| 70 extern char *optarg; | |
| 71 while((c=getopt(argc,argv,"lf:t:")) != EOF) { | |
| 72 switch(c) { | |
| 73 case 'f': | |
| 74 outName = optarg; | |
| 75 break; | |
| 76 case 'l': | |
| 77 listmode++; | |
| 78 break; | |
| 79 case 't': | |
| 80 testName = optarg; | |
| 81 break; | |
| 82 case '?': | |
| 83 errflg++; | |
| 84 } | |
| 85 if(errflg) { | |
| 86 usage(progname); | |
| 87 return 0; | |
| 88 } | |
| 89 } | |
| 90 /* for ( ; optind < argc; optind++) { ... argv[optind] } */ | |
| 91 #else | |
| 92 if(argc==2) { | |
| 93 outName = argv[1]; | |
| 94 } else if(argc>2) { | |
| 95 fprintf(stderr, "Err: usage: %s [ output-file.xml ]\n", argv[0]); | |
| 96 } | |
| 97 #endif | |
| 98 | |
| 99 if(listmode && outName != NULL ) { | |
| 100 fprintf(stderr, "Warning: no output when list mode\n"); | |
| 101 outName=NULL; | |
| 102 } | |
| 103 | |
| 104 if(outName != NULL) { | |
| 105 | |
| 106 | |
| 107 out=fopen(outName,"w"); | |
| 108 if(out==NULL) { | |
| 109 fprintf(stderr,"Err: can't open %s for writing.\n", outName); | |
| 110 return 1; | |
| 111 } else { | |
| 112 fprintf(stderr, "# writing results to %s\n", outName); | |
| 113 } | |
| 114 fprintf(out, "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"); | |
| 115 fprintf(out, "<tests icu=\"%s\">\n", U_ICU_VERSION); | |
| 116 fprintf(out, "<!-- %s -->\n", U_COPYRIGHT_STRING); | |
| 117 } else { | |
| 118 fprintf(stderr, "# (no output)\n"); | |
| 119 } | |
| 120 | |
| 121 if(listmode && testName!=NULL) { | |
| 122 fprintf(stderr, "ERR: no -l mode when specific test with -t\n"); | |
| 123 usage(progname); | |
| 124 return 1; | |
| 125 } | |
| 126 | |
| 127 | |
| 128 runTests(); | |
| 129 | |
| 130 | |
| 131 if(out!=NULL) { | |
| 132 #ifndef SKIP_INFO | |
| 133 udbg_writeIcuInfo(out); | |
| 134 #endif | |
| 135 fprintf(out, "</tests>\n"); | |
| 136 fclose(out); | |
| 137 } | |
| 138 | |
| 139 if(U_FAILURE(setupStatus)) { | |
| 140 fprintf(stderr, "Error in tests: %s\n", u_errorName(setupStatus)); | |
| 141 return 1; | |
| 142 } | |
| 143 | |
| 144 return 0; | |
| 145 } | |
| 146 | |
| 147 class HowExpensiveTest { | |
| 148 public: | |
| 149 virtual ~HowExpensiveTest(){} | |
| 150 protected: | |
| 151 HowExpensiveTest(const char *name, const char *file, int32_t line) : fName(nam
e), fFile(file), fLine(line) {} | |
| 152 protected: | |
| 153 /** | |
| 154 * @return number of iterations | |
| 155 */ | |
| 156 virtual int32_t run() = 0; | |
| 157 virtual void warmup() { run(); } | |
| 158 public: | |
| 159 virtual const char *getName() { return fName; } | |
| 160 public: | |
| 161 virtual int32_t runTest(double *subTime) { | |
| 162 UTimer a,b; | |
| 163 utimer_getTime(&a); | |
| 164 int32_t iter = run(); | |
| 165 utimer_getTime(&b); | |
| 166 *subTime = utimer_getDeltaSeconds(&a,&b); | |
| 167 return iter; | |
| 168 } | |
| 169 | |
| 170 virtual int32_t runTests(double *subTime, double *marginOfError) { | |
| 171 warmup(); /* warmup */ | |
| 172 double times[ITERATIONS]; | |
| 173 int subIterations = 0; | |
| 174 for(int i=0;i<ITERATIONS;i++) { | |
| 175 subIterations = runTest(×[i]); | |
| 176 #if U_DEBUG | |
| 177 fprintf(stderr, "trial: %d/%d = %.9fs\n", i, ITERATIONS,times[i]); | |
| 178 fflush(stderr); | |
| 179 #endif | |
| 180 } | |
| 181 uint32_t iterations = ITERATIONS; | |
| 182 *subTime = uprv_getMeanTime(times,&iterations,marginOfError); | |
| 183 return subIterations; | |
| 184 } | |
| 185 public: | |
| 186 const char *fName; | |
| 187 const char *fFile; | |
| 188 int32_t fLine; | |
| 189 int32_t fIterations; | |
| 190 }; | |
| 191 | |
| 192 void runTestOn(HowExpensiveTest &t) { | |
| 193 if(U_FAILURE(setupStatus)) return; // silently | |
| 194 const char *tn = t.getName(); | |
| 195 if(testName!=NULL && testMatch(tn)) return; // skipped. | |
| 196 if(listmode) { | |
| 197 fprintf(stderr, "%s:%d:\t%s\n", t.fFile, t.fLine, t.getName()); | |
| 198 testhit++; | |
| 199 return; | |
| 200 } else { | |
| 201 fprintf(stderr, "%s:%d: Running: %s\n", t.fFile, t.fLine, t.getName()); | |
| 202 testhit++; | |
| 203 } | |
| 204 double sieveTime = uprv_getSieveTime(NULL); | |
| 205 double st; | |
| 206 double me; | |
| 207 | |
| 208 fflush(stdout); | |
| 209 fflush(stderr); | |
| 210 int32_t iter = t.runTests(&st,&me); | |
| 211 if(U_FAILURE(setupStatus)) { | |
| 212 fprintf(stderr, "Error in tests: %s\n", u_errorName(setupStatus)); | |
| 213 return; | |
| 214 } | |
| 215 fflush(stdout); | |
| 216 fflush(stderr); | |
| 217 | |
| 218 double stn = st/sieveTime; | |
| 219 | |
| 220 printf("%s\t%.9f\t%.9f +/- %.9f, @ %d iter\n", t.getName(),stn,st,me,iter); | |
| 221 | |
| 222 if(out!=NULL) { | |
| 223 fprintf(out, " <test name=\"%s\" standardizedTime=\"%f\" realDuration=\"%f
\" marginOfError=\"%f\" iterations=\"%d\" />\n", | |
| 224 tn,stn,st,me,iter); | |
| 225 fflush(out); | |
| 226 } | |
| 227 } | |
| 228 | |
| 229 /* ------------------- test code here --------------------- */ | |
| 230 | |
| 231 class SieveTest : public HowExpensiveTest { | |
| 232 public: | |
| 233 virtual ~SieveTest(){} | |
| 234 SieveTest():HowExpensiveTest("SieveTest",__FILE__,__LINE__){} | |
| 235 virtual int32_t run(){return 0;} // dummy | |
| 236 int32_t runTest(double *subTime) { | |
| 237 *subTime = uprv_getSieveTime(NULL); | |
| 238 return U_LOTS_OF_TIMES; | |
| 239 } | |
| 240 virtual int32_t runTests(double *subTime, double *marginOfError) { | |
| 241 *subTime = uprv_getSieveTime(marginOfError); | |
| 242 return U_LOTS_OF_TIMES; | |
| 243 } | |
| 244 }; | |
| 245 | |
| 246 | |
| 247 /* ------- NumParseTest ------------- */ | |
| 248 #include "unicode/unum.h" | |
| 249 /* open and close tests */ | |
| 250 #define OCName(svc,ub,testn,suffix,n) testn ## svc ## ub ## suffix ## n | |
| 251 #define OCStr(svc,ub,suffix,n) "Test_" # svc # ub # suffix # n | |
| 252 #define OCRun(svc,ub,suffix) svc ## ub ## suffix | |
| 253 // TODO: run away screaming | |
| 254 #define OpenCloseTest(n, svc,suffix,c,a,d) class OCName(svc,_,Test_,suffix,n) :
public HowExpensiveTest { public: OCName(svc,_,Test_,suffix,n)():HowExpensiveTes
t(OCStr(svc,_,suffix,n),__FILE__,__LINE__) c int32_t run() { int32_t i; for(i=0;
i<U_LOTS_OF_TIMES;i++){ OCRun(svc,_,close) ( OCRun(svc,_,suffix) a ); } return
i; } void warmup() { OCRun(svc,_,close) ( OCRun(svc,_,suffix) a); } virtual ~
OCName(svc,_,Test_,suffix,n) () d }; | |
| 255 #define QuickTest(n,c,r,d) class n : public HowExpensiveTest { public: n():HowE
xpensiveTest(#n,__FILE__,__LINE__) c int32_t run() r virtual ~n () d }; | |
| 256 | |
| 257 class NumTest : public HowExpensiveTest { | |
| 258 private: | |
| 259 double fExpect; | |
| 260 UNumberFormat *fFmt; | |
| 261 UnicodeString fPat; | |
| 262 UnicodeString fString; | |
| 263 const UChar *fStr; | |
| 264 int32_t fLen; | |
| 265 const char *fFile; | |
| 266 int fLine; | |
| 267 const char *fCPat; | |
| 268 const char *fCStr; | |
| 269 char name[100]; | |
| 270 public: | |
| 271 virtual const char *getName() { | |
| 272 if(name[0]==0) { | |
| 273 sprintf(name,"%s:p=|%s|,str=|%s|",getClassName(),fCPat,fCStr); | |
| 274 } | |
| 275 return name; | |
| 276 } | |
| 277 protected: | |
| 278 virtual UNumberFormat* initFmt() { | |
| 279 return unum_open(UNUM_PATTERN_DECIMAL, fPat.getTerminatedBuffer(), -1, TEST_
LOCALE, 0, &setupStatus); | |
| 280 } | |
| 281 virtual const char *getClassName() { | |
| 282 return "NumTest"; | |
| 283 } | |
| 284 public: | |
| 285 NumTest(const char *pat, const char *num, double expect, const char *FILE, int
LINE) | |
| 286 : HowExpensiveTest("(n/a)",FILE, LINE), | |
| 287 fExpect(expect), | |
| 288 fFmt(0), | |
| 289 fPat(pat, -1, US_INV), | |
| 290 fString(num,-1,US_INV), | |
| 291 fStr(fString.getTerminatedBuffer()), | |
| 292 fLen(u_strlen(fStr)), | |
| 293 fFile(FILE), | |
| 294 fLine(LINE), | |
| 295 fCPat(pat), | |
| 296 fCStr(num) | |
| 297 { | |
| 298 name[0]=0; | |
| 299 } | |
| 300 void warmup() { | |
| 301 fFmt = initFmt(); | |
| 302 if(U_SUCCESS(setupStatus)) { | |
| 303 double trial = unum_parseDouble(fFmt,fStr,fLen, NULL, &setupStatus); | |
| 304 if(U_SUCCESS(setupStatus) && trial!=fExpect) { | |
| 305 setupStatus = U_INTERNAL_PROGRAM_ERROR; | |
| 306 printf("%s:%d: warmup() %s got %.8f expected %.8f\n", | |
| 307 fFile,fLine,getName(),trial,fExpect); | |
| 308 } | |
| 309 } | |
| 310 } | |
| 311 int32_t run() { | |
| 312 double trial=0.0; | |
| 313 int i; | |
| 314 for(i=0;i<U_LOTS_OF_TIMES;i++){ | |
| 315 trial = unum_parse(fFmt,fStr,fLen, NULL, &setupStatus); | |
| 316 } | |
| 317 return i; | |
| 318 } | |
| 319 virtual ~NumTest(){} | |
| 320 }; | |
| 321 | |
| 322 #define DO_NumTest(p,n,x) { NumTest t(p,n,x,__FILE__,__LINE__); runTestOn(t); } | |
| 323 | |
| 324 | |
| 325 class AttrNumTest : public NumTest | |
| 326 { | |
| 327 private: | |
| 328 UNumberFormatAttribute fAttr; | |
| 329 int32_t fAttrValue; | |
| 330 char name2[100]; | |
| 331 protected: | |
| 332 virtual const char *getClassName() { | |
| 333 sprintf(name2,"AttrNumTest:%d=%d", fAttr,fAttrValue); | |
| 334 return name2; | |
| 335 } | |
| 336 public: | |
| 337 AttrNumTest(const char *pat, const char *num, double expect, const char *FILE,
int LINE, UNumberFormatAttribute attr, int32_t newValue) | |
| 338 : NumTest(pat,num,expect,FILE,LINE), | |
| 339 fAttr(attr), | |
| 340 fAttrValue(newValue) | |
| 341 { | |
| 342 } | |
| 343 virtual UNumberFormat* initFmt() { | |
| 344 UNumberFormat *fmt = NumTest::initFmt(); | |
| 345 unum_setAttribute(fmt, fAttr,fAttrValue); | |
| 346 return fmt; | |
| 347 } | |
| 348 }; | |
| 349 | |
| 350 #define DO_AttrNumTest(p,n,x,a,v) { AttrNumTest t(p,n,x,__FILE__,__LINE__,a,v);
runTestOn(t); } | |
| 351 | |
| 352 | |
| 353 class NOXNumTest : public NumTest | |
| 354 { | |
| 355 private: | |
| 356 UNumberFormatAttribute fAttr; | |
| 357 int32_t fAttrValue; | |
| 358 char name2[100]; | |
| 359 protected: | |
| 360 virtual const char *getClassName() { | |
| 361 sprintf(name2,"NOXNumTest:%d=%d", fAttr,fAttrValue); | |
| 362 return name2; | |
| 363 } | |
| 364 public: | |
| 365 NOXNumTest(const char *pat, const char *num, double expect, const char *FILE,
int LINE /*, UNumberFormatAttribute attr, int32_t newValue */) | |
| 366 : NumTest(pat,num,expect,FILE,LINE) /* , | |
| 367 fAttr(attr), | |
| 368 fAttrValue(newValue) */ | |
| 369 { | |
| 370 } | |
| 371 virtual UNumberFormat* initFmt() { | |
| 372 UNumberFormat *fmt = NumTest::initFmt(); | |
| 373 //unum_setAttribute(fmt, fAttr,fAttrValue); | |
| 374 return fmt; | |
| 375 } | |
| 376 }; | |
| 377 | |
| 378 #define DO_NOXNumTest(p,n,x) { NOXNumTest t(p,n,x,__FILE__,__LINE__); runTestOn(
t); } | |
| 379 | |
| 380 #define DO_TripleNumTest(p,n,x) DO_AttrNumTest(p,n,x,UNUM_PARSE_ALL_INPUT,UNUM_Y
ES) \ | |
| 381 DO_AttrNumTest(p,n,x,UNUM_PARSE_ALL_INPUT,UNUM_N
O) \ | |
| 382 DO_AttrNumTest(p,n,x,UNUM_PARSE_ALL_INPUT,UNUM_M
AYBE) | |
| 383 | |
| 384 | |
| 385 class NumFmtTest : public HowExpensiveTest { | |
| 386 private: | |
| 387 double fExpect; | |
| 388 UNumberFormat *fFmt; | |
| 389 UnicodeString fPat; | |
| 390 UnicodeString fString; | |
| 391 const UChar *fStr; | |
| 392 int32_t fLen; | |
| 393 const char *fFile; | |
| 394 int fLine; | |
| 395 const char *fCPat; | |
| 396 const char *fCStr; | |
| 397 char name[100]; | |
| 398 public: | |
| 399 virtual const char *getName() { | |
| 400 if(name[0]==0) { | |
| 401 sprintf(name,"%s:p=|%s|,str=|%s|",getClassName(),fCPat,fCStr); | |
| 402 } | |
| 403 return name; | |
| 404 } | |
| 405 protected: | |
| 406 virtual UNumberFormat* initFmt() { | |
| 407 return unum_open(UNUM_PATTERN_DECIMAL, fPat.getTerminatedBuffer(), -1, TEST_
LOCALE, 0, &setupStatus); | |
| 408 } | |
| 409 virtual const char *getClassName() { | |
| 410 return "NumFmtTest"; | |
| 411 } | |
| 412 public: | |
| 413 NumFmtTest(const char *pat, const char *num, double expect, const char *FILE,
int LINE) | |
| 414 : HowExpensiveTest("(n/a)",FILE, LINE), | |
| 415 fExpect(expect), | |
| 416 fFmt(0), | |
| 417 fPat(pat, -1, US_INV), | |
| 418 fString(num,-1,US_INV), | |
| 419 fStr(fString.getTerminatedBuffer()), | |
| 420 fLen(u_strlen(fStr)), | |
| 421 fFile(FILE), | |
| 422 fLine(LINE), | |
| 423 fCPat(pat), | |
| 424 fCStr(num) | |
| 425 { | |
| 426 name[0]=0; | |
| 427 } | |
| 428 void warmup() { | |
| 429 fFmt = initFmt(); | |
| 430 UChar buf[100]; | |
| 431 if(U_SUCCESS(setupStatus)) { | |
| 432 int32_t trial = unum_formatDouble(fFmt,fExpect, buf, 100, NULL, &setupStat
us); | |
| 433 if(!U_SUCCESS(setupStatus) | |
| 434 || trial!=fLen | |
| 435 ||trial<=0 | |
| 436 || u_strncmp(fStr,buf,trial) ) { | |
| 437 char strBuf[200]; | |
| 438 u_strToUTF8(strBuf,200,NULL,buf,trial+1,&setupStatus); | |
| 439 printf("%s:%d: warmup() %s got %s expected %s, err %s\n", | |
| 440 fFile,fLine,getName(),strBuf,fCStr, u_errorName(setupStatus)); | |
| 441 setupStatus = U_INTERNAL_PROGRAM_ERROR; | |
| 442 } | |
| 443 } | |
| 444 } | |
| 445 int32_t run() { | |
| 446 int32_t trial; | |
| 447 int i; | |
| 448 UChar buf[100]; | |
| 449 if(U_SUCCESS(setupStatus)) { | |
| 450 for(i=0;i<U_LOTS_OF_TIMES;i++){ | |
| 451 trial = unum_formatDouble(fFmt,fExpect, buf, 100, NULL, &setupStatus); | |
| 452 } | |
| 453 } | |
| 454 return i; | |
| 455 } | |
| 456 virtual ~NumFmtTest(){} | |
| 457 }; | |
| 458 | |
| 459 #define DO_NumFmtTest(p,n,x) { NumFmtTest t(p,n,x,__FILE__,__LINE__); runTestOn(
t); } | |
| 460 | |
| 461 class NumFmtInt64Test : public HowExpensiveTest { | |
| 462 public: | |
| 463 enum EMode { | |
| 464 kDefault, | |
| 465 kPattern, | |
| 466 kApplyPattern, | |
| 467 kGroupOff, | |
| 468 kApplyGroupOff | |
| 469 }; | |
| 470 private: | |
| 471 EMode fMode; | |
| 472 int64_t fExpect; | |
| 473 UNumberFormat *fFmt; | |
| 474 UnicodeString fPat; | |
| 475 UnicodeString fString; | |
| 476 const UChar *fStr; | |
| 477 int32_t fLen; | |
| 478 const char *fFile; | |
| 479 int fLine; | |
| 480 const char *fCPat; | |
| 481 const char *fCStr; | |
| 482 char name[100]; | |
| 483 public: | |
| 484 virtual const char *getName() { | |
| 485 if(name[0]==0) { | |
| 486 sprintf(name,"%s:p=|%s|,str=|%s|",getClassName(),fCPat,fCStr); | |
| 487 } | |
| 488 return name; | |
| 489 } | |
| 490 protected: | |
| 491 virtual UNumberFormat* initFmt() { | |
| 492 switch(fMode) { | |
| 493 case kPattern: | |
| 494 return unum_open(UNUM_PATTERN_DECIMAL, fPat.getTerminatedBuffer(), -1, TES
T_LOCALE, 0, &setupStatus); | |
| 495 case kApplyPattern: | |
| 496 { | |
| 497 UNumberFormat *fmt = unum_open(UNUM_DECIMAL, NULL, -1, TEST_LOCALE, 0, &
setupStatus); | |
| 498 unum_applyPattern(fmt, FALSE, fPat.getTerminatedBuffer(), -1, NULL, &set
upStatus); | |
| 499 return fmt; | |
| 500 } | |
| 501 case kGroupOff: | |
| 502 { | |
| 503 UNumberFormat *fmt = unum_open(UNUM_PATTERN_DECIMAL, fPat.getTerminatedB
uffer(), -1, TEST_LOCALE, 0, &setupStatus); | |
| 504 unum_setAttribute(fmt, UNUM_GROUPING_USED, UNUM_NO); | |
| 505 return fmt; | |
| 506 } | |
| 507 case kApplyGroupOff: | |
| 508 { | |
| 509 UNumberFormat *fmt = unum_open(UNUM_DECIMAL, NULL, -1, TEST_LOCALE, 0, &
setupStatus); | |
| 510 unum_applyPattern(fmt, FALSE, fPat.getTerminatedBuffer(), -1, NULL, &set
upStatus); | |
| 511 unum_setAttribute(fmt, UNUM_GROUPING_USED, UNUM_NO); | |
| 512 return fmt; | |
| 513 } | |
| 514 default: | |
| 515 case kDefault: | |
| 516 return unum_open(UNUM_DEFAULT, NULL, -1, TEST_LOCALE, 0, &setupStatus); | |
| 517 } | |
| 518 } | |
| 519 virtual const char *getClassName() { | |
| 520 switch(fMode) { | |
| 521 case EMode::kDefault: | |
| 522 return "NumFmtInt64Test (default)"; | |
| 523 case EMode::kPattern: | |
| 524 return "NumFmtInt64Test (pattern)"; | |
| 525 case EMode::kApplyPattern: | |
| 526 return "NumFmtInt64Test (applypattern)"; | |
| 527 case EMode::kGroupOff: | |
| 528 return "NumFmtInt64Test (pattern, group=off)"; | |
| 529 case EMode::kApplyGroupOff: | |
| 530 return "NumFmtInt64Test (applypattern, group=off)"; | |
| 531 default: | |
| 532 return "NumFmtInt64Test (? ? ?)"; | |
| 533 } | |
| 534 } | |
| 535 public: | |
| 536 NumFmtInt64Test(const char *pat, const char *num, int64_t expect, const char *
FILE, int LINE, EMode mode) | |
| 537 : HowExpensiveTest("(n/a)",FILE, LINE), | |
| 538 fMode(mode), | |
| 539 fExpect(expect), | |
| 540 fFmt(0), | |
| 541 fPat(pat, -1, US_INV), | |
| 542 fString(num,-1,US_INV), | |
| 543 fStr(fString.getTerminatedBuffer()), | |
| 544 fLen(u_strlen(fStr)), | |
| 545 fFile(FILE), | |
| 546 fLine(LINE), | |
| 547 fCPat(pat), | |
| 548 fCStr(num) | |
| 549 { | |
| 550 name[0]=0; | |
| 551 } | |
| 552 void warmup() { | |
| 553 fFmt = initFmt(); | |
| 554 UChar buf[100]; | |
| 555 if(U_SUCCESS(setupStatus)) { | |
| 556 int32_t trial = unum_formatInt64(fFmt,fExpect, buf, 100, NULL, &setupStatu
s); | |
| 557 if(!U_SUCCESS(setupStatus) | |
| 558 || trial!=fLen | |
| 559 ||trial<=0 | |
| 560 || u_strncmp(fStr,buf,trial) ) { | |
| 561 char strBuf[200]; | |
| 562 u_strToUTF8(strBuf,200,NULL,buf,trial+1,&setupStatus); | |
| 563 printf("%s:%d: warmup() %s got %s (len %d) expected %s (len %d), err %s\
n", | |
| 564 fFile,fLine,getName(),strBuf,trial,fCStr,fLen, u_errorName(setupS
tatus)); | |
| 565 setupStatus = U_INTERNAL_PROGRAM_ERROR; | |
| 566 } | |
| 567 } | |
| 568 } | |
| 569 int32_t run() { | |
| 570 int32_t trial; | |
| 571 int i; | |
| 572 UChar buf[100]; | |
| 573 if(U_SUCCESS(setupStatus)) { | |
| 574 for(i=0;i<U_LOTS_OF_TIMES;i++){ | |
| 575 trial = unum_formatInt64(fFmt,fExpect, buf, 100, NULL, &setupStatus); | |
| 576 } | |
| 577 } | |
| 578 return i; | |
| 579 } | |
| 580 virtual ~NumFmtInt64Test(){} | |
| 581 }; | |
| 582 | |
| 583 /** | |
| 584 * unum_open .. with pattern, == new DecimalFormat(pattern) | |
| 585 */ | |
| 586 #define DO_NumFmtInt64Test(p,n,x) { NumFmtInt64Test t(p,n,x,__FILE__,__LINE__,Nu
mFmtInt64Test::EMode::kPattern); runTestOn(t); } | |
| 587 /** | |
| 588 * unum_open(UNUM_DECIMAL), then | |
| 589 */ | |
| 590 #define DO_NumFmtInt64Test_apply(p,n,x) { NumFmtInt64Test t(p,n,x,__FILE__,__LIN
E__,NumFmtInt64Test::EMode::kApplyPattern); runTestOn(t); } | |
| 591 | |
| 592 #define DO_NumFmtInt64Test_default(p,n,x) { NumFmtInt64Test t(p,n,x,__FILE__,__L
INE__,NumFmtInt64Test::EMode::kDefault); runTestOn(t); } | |
| 593 #define DO_NumFmtInt64Test_gr0(p,n,x) { NumFmtInt64Test t(p,n,x,__FILE__,__LINE_
_,NumFmtInt64Test::EMode::kGroupOff); runTestOn(t); } | |
| 594 #define DO_NumFmtInt64Test_applygr0(p,n,x) { NumFmtInt64Test t(p,n,x,__FILE__,__
LINE__,NumFmtInt64Test::EMode::kApplyGroupOff); runTestOn(t); } | |
| 595 | |
| 596 | |
| 597 class NumFmtStringPieceTest : public HowExpensiveTest { | |
| 598 private: | |
| 599 const StringPiece &fExpect; | |
| 600 UNumberFormat *fFmt; | |
| 601 UnicodeString fPat; | |
| 602 UnicodeString fString; | |
| 603 const UChar *fStr; | |
| 604 int32_t fLen; | |
| 605 const char *fFile; | |
| 606 int fLine; | |
| 607 const char *fCPat; | |
| 608 const char *fCStr; | |
| 609 char name[100]; | |
| 610 public: | |
| 611 virtual const char *getName() { | |
| 612 if(name[0]==0) { | |
| 613 sprintf(name,"%s:p=|%s|,str=|%s|,sp=|%s|",getClassName(),fCPat,fCStr, fExp
ect.data()); | |
| 614 } | |
| 615 return name; | |
| 616 } | |
| 617 protected: | |
| 618 virtual UNumberFormat* initFmt() { | |
| 619 DecimalFormat *d = new DecimalFormat(setupStatus); | |
| 620 UParseError pe; | |
| 621 d->applyPattern(fPat, pe, setupStatus); | |
| 622 return (UNumberFormat*) d; | |
| 623 } | |
| 624 virtual const char *getClassName() { | |
| 625 return "NumFmtStringPieceTest"; | |
| 626 } | |
| 627 public: | |
| 628 NumFmtStringPieceTest(const char *pat, const char *num, const StringPiece& exp
ect, const char *FILE, int LINE) | |
| 629 : HowExpensiveTest("(n/a)",FILE, LINE), | |
| 630 fExpect(expect), | |
| 631 fFmt(0), | |
| 632 fPat(pat, -1, US_INV), | |
| 633 fString(num,-1,US_INV), | |
| 634 fStr(fString.getTerminatedBuffer()), | |
| 635 fLen(u_strlen(fStr)), | |
| 636 fFile(FILE), | |
| 637 fLine(LINE), | |
| 638 fCPat(pat), | |
| 639 fCStr(num) | |
| 640 { | |
| 641 name[0]=0; | |
| 642 } | |
| 643 void warmup() { | |
| 644 fFmt = initFmt(); | |
| 645 UnicodeString buf; | |
| 646 if(U_SUCCESS(setupStatus)) { | |
| 647 buf.remove(); | |
| 648 ((const DecimalFormat*)fFmt)->format(fExpect, buf, NULL, setupStatus); | |
| 649 if(!U_SUCCESS(setupStatus) | |
| 650 || fString!=buf | |
| 651 ) { | |
| 652 char strBuf[200]; | |
| 653 u_strToUTF8(strBuf,200,NULL,buf.getTerminatedBuffer(),buf.length()+1,&se
tupStatus); | |
| 654 printf("%s:%d: warmup() %s got %s (len %d) expected %s (len %d), err %s\
n", | |
| 655 fFile,fLine,getName(),strBuf,buf.length(),fCStr,fLen, u_errorName
(setupStatus)); | |
| 656 setupStatus = U_INTERNAL_PROGRAM_ERROR; | |
| 657 } | |
| 658 } | |
| 659 } | |
| 660 | |
| 661 int32_t run() { | |
| 662 #if U_DEBUG | |
| 663 int32_t trial; | |
| 664 #endif | |
| 665 int i=0; | |
| 666 UnicodeString buf; | |
| 667 if(U_SUCCESS(setupStatus)) { | |
| 668 for(i=0;i<U_LOTS_OF_TIMES;i++){ | |
| 669 buf.remove(); | |
| 670 ((const DecimalFormat*)fFmt)->format(fExpect, buf, NULL, setupStatus); | |
| 671 } | |
| 672 } | |
| 673 return i; | |
| 674 } | |
| 675 virtual ~NumFmtStringPieceTest(){} | |
| 676 }; | |
| 677 | |
| 678 #define DO_NumFmtStringPieceTest(p,n,x) { NumFmtStringPieceTest t(p,n,x,__FILE__
,__LINE__); runTestOn(t); } | |
| 679 | |
| 680 // TODO: move, scope. | |
| 681 static UChar pattern[] = { 0x23 }; // '#' | |
| 682 static UChar strdot[] = { '2', '.', '0', 0 }; | |
| 683 static UChar strspc[] = { '2', ' ', 0 }; | |
| 684 static UChar strgrp[] = {'2',',','2','2','2', 0 }; | |
| 685 static UChar strbeng[] = {0x09E8,0x09E8,0x09E8,0x09E8, 0 }; | |
| 686 | |
| 687 UNumberFormat *NumParseTest_fmt; | |
| 688 | |
| 689 // TODO: de-uglify. | |
| 690 QuickTest(NumParseTest,{ static UChar pattern[] = { 0x23 }; NumParseTest_f
mt = unum_open(UNUM_PATTERN_DECIMAL, pattern, 1,
TEST_LOCALE, 0, &setupStatu
s); },{ int32_t i; static UChar str[] = { 0x31 };double val; for(i=0;i
<U_LOTS_OF_TIMES;i++) { val=unum_parse(NumParseTest_fmt,str,1,NULL,&setupSt
atus); } return i; },{unum_close(NumParseTest_fmt);}) | |
| 691 | |
| 692 QuickTest(NumParseTestdot,{ static UChar pattern[] = { 0x23 }; NumParseTes
t_fmt = unum_open(UNUM_PATTERN_DECIMAL, pattern, 1,
TEST_LOCALE, 0, &setupSt
atus); },{ int32_t i; double val; for(i=0;i<U_LOTS_OF_TIMES;i++) {
val=unum_parse(NumParseTest_fmt,strdot,1,NULL,&setupStatus); } return i;
},{unum_close(NumParseTest_fmt);}) | |
| 693 QuickTest(NumParseTestspc,{ static UChar pattern[] = { 0x23 }; NumParseTes
t_fmt = unum_open(UNUM_PATTERN_DECIMAL, pattern, 1,
TEST_LOCALE, 0, &setupSt
atus); },{ int32_t i; double val; for(i=0;i<U_LOTS_OF_TIMES;i++) {
val=unum_parse(NumParseTest_fmt,strspc,1,NULL,&setupStatus); } return i;
},{unum_close(NumParseTest_fmt);}) | |
| 694 QuickTest(NumParseTestgrp,{ static UChar pattern[] = { 0x23 }; NumParseTes
t_fmt = unum_open(UNUM_PATTERN_DECIMAL, pattern, 1,
TEST_LOCALE, 0, &setupSt
atus); },{ int32_t i; double val; for(i=0;i<U_LOTS_OF_TIMES;i++) {
val=unum_parse(NumParseTest_fmt,strgrp,-1,NULL,&setupStatus); } return i
; },{unum_close(NumParseTest_fmt);}) | |
| 695 | |
| 696 QuickTest(NumParseTestbeng,{ static UChar pattern[] = { 0x23 }; NumParseTe
st_fmt = unum_open(UNUM_PATTERN_DECIMAL, pattern, 1,
TEST_LOCALE, 0, &setupS
tatus); },{ int32_t i; double val; for(i=0;i<U_LOTS_OF_TIMES;i++) {
val=unum_parse(NumParseTest_fmt,strbeng,-1,NULL,&setupStatus); } return
i; },{unum_close(NumParseTest_fmt);}) | |
| 697 | |
| 698 UDateFormat *DateFormatTest_fmt = NULL; | |
| 699 UDate sometime = 100000000.0; | |
| 700 UChar onekbuf[1024]; | |
| 701 const int32_t onekbuf_len = sizeof(onekbuf)/sizeof(onekbuf[0]); | |
| 702 | |
| 703 | |
| 704 QuickTest(DateFormatTestBasic, \ | |
| 705 { \ | |
| 706 DateFormatTest_fmt = udat_open(UDAT_DEFAULT, UDAT_DEFAULT, NULL, NUL
L, -1, NULL, -1, &setupStatus); \ | |
| 707 }, \ | |
| 708 { \ | |
| 709 int i; \ | |
| 710 for(i=0;i<U_LOTS_OF_TIMES;i++) \ | |
| 711 { \ | |
| 712 udat_format(DateFormatTest_fmt, sometime, onekbuf, onekbuf_len, NU
LL, &setupStatus); \ | |
| 713 } \ | |
| 714 return i; \ | |
| 715 }, \ | |
| 716 { \ | |
| 717 udat_close(DateFormatTest_fmt); \ | |
| 718 } \ | |
| 719 ) | |
| 720 | |
| 721 | |
| 722 QuickTest(NullTest,{},{int j=U_LOTS_OF_TIMES;while(--j);return U_LOTS_OF_TIMES;}
,{}) | |
| 723 | |
| 724 #if 0 | |
| 725 #include <time.h> | |
| 726 | |
| 727 QuickTest(RandomTest,{},{timespec ts; ts.tv_sec=rand()%4; int j=U_LOTS_OF_TIMES;
while(--j) { ts.tv_nsec=100000+(rand()%10000)*1000000; nanosleep(&ts,NULL); retu
rn j;} return U_LOTS_OF_TIMES;},{}) | |
| 728 #endif | |
| 729 | |
| 730 OpenCloseTest(pattern,unum,open,{},(UNUM_PATTERN_DECIMAL,pattern,1,TEST_LOCALE,0
,&setupStatus),{}) | |
| 731 OpenCloseTest(default,unum,open,{},(UNUM_DEFAULT,NULL,-1,TEST_LOCALE,0,&setupSta
tus),{}) | |
| 732 #if !UCONFIG_NO_CONVERSION | |
| 733 #include "unicode/ucnv.h" | |
| 734 OpenCloseTest(gb18030,ucnv,open,{},("gb18030",&setupStatus),{}) | |
| 735 #endif | |
| 736 #include "unicode/ures.h" | |
| 737 OpenCloseTest(root,ures,open,{},(NULL,"root",&setupStatus),{}) | |
| 738 | |
| 739 void runTests() { | |
| 740 { | |
| 741 SieveTest t; | |
| 742 runTestOn(t); | |
| 743 } | |
| 744 #if 0 | |
| 745 { | |
| 746 RandomTest t; | |
| 747 runTestOn(t); | |
| 748 } | |
| 749 #endif | |
| 750 { | |
| 751 NullTest t; | |
| 752 runTestOn(t); | |
| 753 } | |
| 754 | |
| 755 #ifndef SKIP_DATEFMT_TESTS | |
| 756 { | |
| 757 DateFormatTestBasic t; | |
| 758 runTestOn(t); | |
| 759 } | |
| 760 #endif | |
| 761 | |
| 762 #ifndef SKIP_NUMPARSE_TESTS | |
| 763 { | |
| 764 // parse tests | |
| 765 | |
| 766 DO_NumTest("#","0",0.0); | |
| 767 DO_NumTest("#","2.0",2.0); | |
| 768 DO_NumTest("#","2 ",2); | |
| 769 DO_NumTest("#","-2 ",-2); | |
| 770 DO_NumTest("+#","+2",2); | |
| 771 DO_NumTest("#,###.0","2222.0",2222.0); | |
| 772 DO_NumTest("#.0","1.00000000000000000000000000000000000000000000000000000000
0000000000000000000000",1.0); | |
| 773 DO_NumTest("#","123456",123456); | |
| 774 | |
| 775 // attr | |
| 776 #ifdef HAVE_UNUM_MAYBE | |
| 777 DO_AttrNumTest("#","0",0.0,UNUM_PARSE_ALL_INPUT,UNUM_YES); | |
| 778 DO_AttrNumTest("#","0",0.0,UNUM_PARSE_ALL_INPUT,UNUM_NO); | |
| 779 DO_AttrNumTest("#","0",0.0,UNUM_PARSE_ALL_INPUT,UNUM_MAYBE); | |
| 780 DO_TripleNumTest("#","2.0",2.0); | |
| 781 DO_AttrNumTest("#.0","1.0000000000000000000000000000000000000000000000000000
00000000000000000000000000",1.0,UNUM_PARSE_ALL_INPUT,UNUM_NO); | |
| 782 #endif | |
| 783 | |
| 784 | |
| 785 // { NumParseTestgrp t; runTestOn(t); } | |
| 786 { NumParseTestbeng t; runTestOn(t); } | |
| 787 | |
| 788 } | |
| 789 #endif | |
| 790 | |
| 791 #ifndef SKIP_NUMFORMAT_TESTS | |
| 792 // format tests | |
| 793 { | |
| 794 | |
| 795 DO_NumFmtInt64Test("0000","0001",1); | |
| 796 DO_NumFmtInt64Test("0000","0000",0); | |
| 797 StringPiece sp3456("3456"); | |
| 798 DO_NumFmtStringPieceTest("0000","3456",sp3456); | |
| 799 DO_NumFmtStringPieceTest("#","3456",sp3456); | |
| 800 StringPiece sp3("3"); | |
| 801 DO_NumFmtStringPieceTest("0000","0003",sp3); | |
| 802 DO_NumFmtStringPieceTest("#","3",sp3); | |
| 803 StringPiece spn3("-3"); | |
| 804 DO_NumFmtStringPieceTest("0000","-0003",spn3); | |
| 805 DO_NumFmtStringPieceTest("#","-3",spn3); | |
| 806 StringPiece spPI("123.456"); | |
| 807 DO_NumFmtStringPieceTest("#.0000","123.4560",spPI); | |
| 808 DO_NumFmtStringPieceTest("#.00","123.46",spPI); | |
| 809 | |
| 810 DO_NumFmtTest("#","0",0.0); | |
| 811 DO_NumFmtTest("#","12345",12345); | |
| 812 DO_NumFmtTest("#","-2",-2); | |
| 813 DO_NumFmtTest("+#","+2",2); | |
| 814 | |
| 815 DO_NumFmtInt64Test("#","-682",-682); | |
| 816 DO_NumFmtInt64Test("#","0",0); | |
| 817 DO_NumFmtInt64Test("#","12345",12345); | |
| 818 DO_NumFmtInt64Test("#,###","12,345",12345); | |
| 819 DO_NumFmtInt64Test("#","1234",1234); | |
| 820 DO_NumFmtInt64Test("#","123",123); | |
| 821 DO_NumFmtInt64Test("#,###","123",123); | |
| 822 DO_NumFmtInt64Test_apply("#","123",123); | |
| 823 DO_NumFmtInt64Test_apply("#","12345",12345); | |
| 824 DO_NumFmtInt64Test_apply("#,###","123",123); | |
| 825 DO_NumFmtInt64Test_apply("#,###","12,345",12345); | |
| 826 DO_NumFmtInt64Test_default("","123",123); | |
| 827 DO_NumFmtInt64Test_default("","12,345",12345); | |
| 828 DO_NumFmtInt64Test_applygr0("#","123",123); | |
| 829 DO_NumFmtInt64Test_applygr0("#","12345",12345); | |
| 830 DO_NumFmtInt64Test_applygr0("#,###","123",123); | |
| 831 DO_NumFmtInt64Test_applygr0("#,###","12345",12345); | |
| 832 DO_NumFmtInt64Test_gr0("#","123",123); | |
| 833 DO_NumFmtInt64Test_gr0("#","12345",12345); | |
| 834 DO_NumFmtInt64Test_gr0("#,###","123",123); | |
| 835 DO_NumFmtInt64Test_gr0("#,###","12345",12345); | |
| 836 DO_NumFmtInt64Test("#","-2",-2); | |
| 837 DO_NumFmtInt64Test("+#","+2",2); | |
| 838 } | |
| 839 | |
| 840 #ifndef SKIP_NUM_OPEN_TEST | |
| 841 { | |
| 842 Test_unum_opendefault t; | |
| 843 runTestOn(t); | |
| 844 } | |
| 845 { | |
| 846 Test_unum_openpattern t; | |
| 847 runTestOn(t); | |
| 848 } | |
| 849 #endif | |
| 850 | |
| 851 #endif /* skip numformat tests */ | |
| 852 #if !UCONFIG_NO_CONVERSION | |
| 853 { | |
| 854 Test_ucnv_opengb18030 t; | |
| 855 runTestOn(t); | |
| 856 } | |
| 857 #endif | |
| 858 { | |
| 859 Test_ures_openroot t; | |
| 860 runTestOn(t); | |
| 861 } | |
| 862 | |
| 863 if(testhit==0) { | |
| 864 fprintf(stderr, "ERROR: no tests matched.\n"); | |
| 865 } | |
| 866 } | |
| OLD | NEW |