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