1 /********************************************************************
3 * Copyright (c) 1997-2004, International Business Machines Corporation and
4 * others. All Rights Reserved.
5 ********************************************************************/
6 /********************************************************************************
10 * Modification History:
12 * Madhu Katragadda Creation
13 *********************************************************************************
16 /* C API TEST FOR DATE FORMAT */
18 #include "unicode/utypes.h"
20 #if !UCONFIG_NO_FORMATTING
22 #include "unicode/uloc.h"
23 #include "unicode/udat.h"
24 #include "unicode/ucal.h"
25 #include "unicode/unum.h"
26 #include "unicode/ustring.h"
34 static void TestExtremeDates(void);
36 #define LEN(a) (sizeof(a)/sizeof(a[0]))
38 void addDateForTest(TestNode
** root
);
40 #define TESTCASE(x) addTest(root, &x, "tsformat/cdattst/" #x)
42 void addDateForTest(TestNode
** root
)
44 TESTCASE(TestDateFormat
);
45 TESTCASE(TestSymbols
);
46 TESTCASE(TestDateFormatCalendar
);
47 TESTCASE(TestExtremeDates
);
49 /* Testing the DateFormat API */
50 static void TestDateFormat()
52 UDateFormat
*def
, *fr
, *it
, *de
, *def1
, *fr_pat
;
55 UErrorCode status
= U_ZERO_ERROR
;
58 const UNumberFormat
*numformat1
, *numformat2
;
64 int32_t resultlengthneeded
;
66 UDate d
= 837039928046.0;
67 double num
= -10456.37;
68 /*const char* str="yyyy.MM.dd G 'at' hh:mm:ss z";
69 const char t[]="2/3/76 2:50 AM";*/
70 /*Testing udat_open() to open a dateformat */
72 ctest_setTimeZone(NULL
, &status
);
74 log_verbose("\nTesting udat_open() with various parameters\n");
75 fr
= udat_open(UDAT_FULL
, UDAT_DEFAULT
, "fr_FR", NULL
,0, NULL
, 0,&status
);
78 log_err("FAIL: error in creating the dateformat using full time style with french locale\n %s\n",
79 myErrorName(status
) );
82 /* this is supposed to open default date format, but later on it treats it like it is "en_US"
83 - very bad if you try to run the tests on machine where default locale is NOT "en_US" */
84 /* def = udat_open(UDAT_SHORT, UDAT_SHORT, NULL, NULL, 0, &status); */
85 def
= udat_open(UDAT_SHORT
, UDAT_SHORT
, "en_US", NULL
, 0,NULL
, 0, &status
);
88 log_err("FAIL: error in creating the dateformat using short date and time style\n %s\n",
89 myErrorName(status
) );
92 it
= udat_open(UDAT_DEFAULT
, UDAT_MEDIUM
, "it_IT", NULL
, 0, NULL
, 0,&status
);
95 log_err("FAIL: error in creating the dateformat using medium date style with italian locale\n %s\n",
96 myErrorName(status
) );
99 de
= udat_open(UDAT_LONG
, UDAT_LONG
, "de_DE", NULL
, 0, NULL
, 0,&status
);
100 if(U_FAILURE(status
))
102 log_err("FAIL: error in creating the dateformat using long time and date styles with german locale\n %s\n",
103 myErrorName(status
));
106 /*creating a default dateformat */
107 def1
= udat_open(UDAT_SHORT
, UDAT_SHORT
, NULL
, NULL
, 0,NULL
, 0, &status
);
108 if(U_FAILURE(status
))
110 log_err("FAIL: error in creating the dateformat using short date and time style\n %s\n",
111 myErrorName(status
) );
116 /*Testing udat_getAvailable() and udat_countAvailable()*/
117 log_verbose("\nTesting getAvailableLocales and countAvailable()\n");
118 numlocales
=udat_countAvailable();
119 /* use something sensible w/o hardcoding the count */
121 log_data_err("FAIL: error in countAvailable\n");
122 log_verbose("The number of locales for which date/time formatting patterns are available is %d\n", numlocales
);
124 for(i
=0;i
<numlocales
;i
++) {
125 UErrorCode subStatus
= U_ZERO_ERROR
;
126 log_verbose("Testing open of %s\n", udat_getAvailable(i
));
127 any
= udat_open(UDAT_SHORT
, UDAT_SHORT
, udat_getAvailable(i
), NULL
,0, NULL
, 0, &status
);
128 if(U_FAILURE(subStatus
)) {
129 log_data_err("FAIL: date format %s (getAvailable(%d)) is not instantiable: %s\n", udat_getAvailable(i
), i
, u_errorName(subStatus
));
134 /*Testing udat_clone()*/
135 log_verbose("\nTesting the udat_clone() function of date format\n");
136 copy
=udat_clone(def
, &status
);
137 if(U_FAILURE(status
)){
138 log_err("Error in creating the clone using udat_clone: %s\n", myErrorName(status
) );
141 log_err("Error in udat_clone");*/ /*how should i check for equality???? */
143 /*Testing udat_format()*/
144 log_verbose("\nTesting the udat_format() function of date format\n");
145 u_uastrcpy(temp
, "7/10/96 4:05 PM");
146 /*format using def */
148 resultlengthneeded
=udat_format(def
, d
, NULL
, resultlength
, NULL
, &status
);
149 if(status
==U_BUFFER_OVERFLOW_ERROR
)
152 resultlength
=resultlengthneeded
+1;
157 result
=(UChar
*)malloc(sizeof(UChar
) * resultlength
);
158 udat_format(def
, d
, result
, resultlength
, NULL
, &status
);
160 if(U_FAILURE(status
) || !result
)
162 log_err("FAIL: Error in formatting using udat_format(.....) %s\n", myErrorName(status
) );
166 log_verbose("PASS: formatting successful\n");
167 if(u_strcmp(result
, temp
)==0)
168 log_verbose("PASS: Date Format for US locale successful uisng udat_format()\n");
170 log_err("FAIL: Date Format for US locale failed using udat_format()\n");
173 u_unescape("10 juil. 96 16 h 05 HAP (\\u00c9UA)", temp
, 30);
178 result
=myDateFormat(fr
, d
);
179 if(u_strcmp(result
, temp
)==0)
180 log_verbose("PASS: Date Format for french locale successful using udat_format()\n");
182 log_data_err("FAIL: Date Format for french locale failed using udat_format(). Expected:\n");
184 u_uastrcpy(temp
, "10/lug/96 16:05:28");
186 if(u_strcmp(myDateFormat(it
,d
), temp
)==0)
187 log_verbose("PASS: Date Format for italian locale successful uisng udat_format()\n");
189 log_data_err("FAIL: Date Format for italian locale failed using udat_format()\n");
192 /*Testing parsing using udat_parse()*/
193 log_verbose("\nTesting parsing using udat_parse()\n");
194 u_uastrcpy(temp
,"2/3/76 2:50 AM");
198 d1
=udat_parse(def
, temp
, u_strlen(temp
), &parsepos
, &status
);
199 if(U_FAILURE(status
))
201 log_err("FAIL: Error in parsing using udat_parse(.....) %s\n", myErrorName(status
) );
204 log_verbose("PASS: parsing succesful\n");
205 /*format it back and check for equality */
208 if(u_strcmp(myDateFormat(def
, d1
),temp
)!=0)
209 log_err("FAIL: error in parsing\n");
211 /*Testing parsing using udat_parse()*/
212 log_verbose("\nTesting parsing using udat_parse()\n");
213 u_uastrcpy(temp
,"2/Don't parse this part");
216 d1
=udat_parse(def
, temp
, u_strlen(temp
), NULL
, &status
);
217 if(status
!= U_PARSE_ERROR
)
219 log_err("FAIL: udat_parse(\"bad string\") passed when it should have failed\n");
222 log_verbose("PASS: parsing succesful\n");
226 /*Testing udat_openPattern() */
228 log_verbose("\nTesting the udat_openPattern with a specified pattern\n");
229 /*for french locale */
230 fr_pat
=udat_open(UDAT_IGNORE
, UDAT_IGNORE
,"fr_FR",NULL
,0,temp
, u_strlen(temp
), &status
);
231 if(U_FAILURE(status
))
233 log_err("FAIL: Error in creating a date format using udat_openPattern \n %s\n",
234 myErrorName(status
) );
237 log_verbose("PASS: creating dateformat using udat_openPattern() succesful\n");
240 /*Testing applyPattern and toPattern */
241 log_verbose("\nTesting applyPattern and toPattern()\n");
242 udat_applyPattern(def1
, FALSE
, temp
, u_strlen(temp
));
243 log_verbose("Extracting the pattern\n");
246 resultlengthneeded
=udat_toPattern(def1
, FALSE
, NULL
, resultlength
, &status
);
247 if(status
==U_BUFFER_OVERFLOW_ERROR
)
250 resultlength
=resultlengthneeded
+ 1;
251 result
=(UChar
*)malloc(sizeof(UChar
) * resultlength
);
252 udat_toPattern(def1
, FALSE
, result
, resultlength
, &status
);
254 if(U_FAILURE(status
))
256 log_err("FAIL: error in extracting the pattern from UNumberFormat\n %s\n",
257 myErrorName(status
) );
259 if(u_strcmp(result
, temp
)!=0)
260 log_err("FAIL: Error in extracting the pattern\n");
262 log_verbose("PASS: applyPattern and toPattern work fine\n");
270 /*Testing getter and setter functions*/
271 /*isLenient and setLenient()*/
272 log_verbose("\nTesting the isLenient and setLenient properties\n");
273 udat_setLenient(fr
, udat_isLenient(it
));
274 if(udat_isLenient(fr
) != udat_isLenient(it
))
275 log_err("ERROR: setLenient() failed\n");
277 log_verbose("PASS: setLenient() successful\n");
280 /*Test get2DigitYearStart set2DigitYearStart */
281 log_verbose("\nTesting the get and set 2DigitYearStart properties\n");
282 d1
= udat_get2DigitYearStart(fr_pat
,&status
);
283 if(U_FAILURE(status
)) {
284 log_err("ERROR: udat_get2DigitYearStart failed %s\n", myErrorName(status
) );
286 status
= U_ZERO_ERROR
;
287 udat_set2DigitYearStart(def1
,d1
, &status
);
288 if(U_FAILURE(status
)) {
289 log_err("ERROR: udat_set2DigitYearStart failed %s\n", myErrorName(status
) );
291 if(udat_get2DigitYearStart(fr_pat
, &status
) != udat_get2DigitYearStart(def1
, &status
))
292 log_err("FAIL: error in set2DigitYearStart\n");
294 log_verbose("PASS: set2DigitYearStart successful\n");
295 /*try setting it to another value */
296 udat_set2DigitYearStart(de
, 2000.0, &status
);
297 if(U_FAILURE(status
)){
298 log_verbose("ERROR: udat_set2DigitYearStart failed %s\n", myErrorName(status
) );
300 if(udat_get2DigitYearStart(de
, &status
) != 2000)
301 log_err("FAIL: error in set2DigitYearStart\n");
303 log_verbose("PASS: set2DigitYearStart successful\n");
307 /*Test getNumberFormat() and setNumberFormat() */
308 log_verbose("\nTesting the get and set NumberFormat properties of date format\n");
309 numformat1
=udat_getNumberFormat(fr_pat
);
310 udat_setNumberFormat(def1
, numformat1
);
311 numformat2
=udat_getNumberFormat(def1
);
312 if(u_strcmp(myNumformat(numformat1
, num
), myNumformat(numformat2
, num
)) !=0)
313 log_err("FAIL: error in setNumberFormat or getNumberFormat()\n");
315 log_verbose("PASS:setNumberFormat and getNumberFormat succesful\n");
317 /*try setting the number format to another format */
318 numformat1
=udat_getNumberFormat(def
);
319 udat_setNumberFormat(def1
, numformat1
);
320 numformat2
=udat_getNumberFormat(def1
);
321 if(u_strcmp(myNumformat(numformat1
, num
), myNumformat(numformat2
, num
)) !=0)
322 log_err("FAIL: error in setNumberFormat or getNumberFormat()\n");
324 log_verbose("PASS: setNumberFormat and getNumberFormat succesful\n");
328 /*Test getCalendar and setCalendar*/
329 log_verbose("\nTesting the udat_getCalendar() and udat_setCalendar() properties\n");
330 cal
=udat_getCalendar(fr_pat
);
333 udat_setCalendar(def1
, cal
);
334 if(!ucal_equivalentTo(udat_getCalendar(fr_pat
), udat_getCalendar(def1
)))
335 log_err("FAIL: Error in setting and getting the calendar\n");
337 log_verbose("PASS: getting and setting calendar successful\n");
343 /*Closing the UDateForamt */
352 ctest_resetTimeZone();
355 /*Testing udat_getSymbols() and udat_setSymbols() and udat_countSymbols()*/
356 static void TestSymbols()
358 UDateFormat
*def
, *fr
;
359 UErrorCode status
= U_ZERO_ERROR
;
361 UChar
*result
= NULL
;
362 int32_t resultlength
;
363 int32_t resultlengthout
;
367 /*creating a dateformat with french locale */
368 log_verbose("\ncreating a date format with french locale\n");
369 fr
= udat_open(UDAT_FULL
, UDAT_DEFAULT
, "fr_FR", NULL
, 0, NULL
, 0, &status
);
370 if(U_FAILURE(status
))
372 log_err("error in creating the dateformat using full time style with french locale\n %s\n",
373 myErrorName(status
) );
376 /*creating a default dateformat */
377 log_verbose("\ncreating a date format with default locale\n");
378 /* this is supposed to open default date format, but later on it treats it like it is "en_US"
379 - very bad if you try to run the tests on machine where default locale is NOT "en_US" */
380 /* def = udat_open(UDAT_DEFAULT,UDAT_DEFAULT ,NULL, NULL, 0, &status); */
381 def
= udat_open(UDAT_DEFAULT
,UDAT_DEFAULT
,"en_US", NULL
, 0, NULL
, 0, &status
);
382 if(U_FAILURE(status
))
384 log_err("error in creating the dateformat using short date and time style\n %s\n",
385 myErrorName(status
) );
390 /*Testing countSymbols, getSymbols and setSymbols*/
391 log_verbose("\nTesting countSymbols\n");
392 /*since the month names has the last string empty and week names are 1 based 1.e first string in the weeknames array is empty */
393 if(udat_countSymbols(def
, UDAT_ERAS
)!=2 || udat_countSymbols(def
, UDAT_MONTHS
)!=12 ||
394 udat_countSymbols(def
, UDAT_SHORT_MONTHS
)!=12 || udat_countSymbols(def
, UDAT_WEEKDAYS
)!=8 ||
395 udat_countSymbols(def
, UDAT_SHORT_WEEKDAYS
)!=8 || udat_countSymbols(def
, UDAT_AM_PMS
)!=2 ||
396 udat_countSymbols(def
, UDAT_LOCALIZED_CHARS
)!=1)
398 log_err("FAIL: error in udat_countSymbols\n");
401 log_verbose("PASS: udat_countSymbols() successful\n");
403 /*testing getSymbols*/
404 log_verbose("\nTesting getSymbols\n");
405 pattern
=(UChar
*)malloc(sizeof(UChar
) * 10);
406 u_uastrcpy(pattern
, "jeudi");
408 resultlengthout
=udat_getSymbols(fr
, UDAT_WEEKDAYS
, 5 , NULL
, resultlength
, &status
);
409 if(status
==U_BUFFER_OVERFLOW_ERROR
)
412 resultlength
=resultlengthout
+1;
417 result
=(UChar
*)malloc(sizeof(UChar
) * resultlength
);
418 udat_getSymbols(fr
, UDAT_WEEKDAYS
, 5, result
, resultlength
, &status
);
421 if(U_FAILURE(status
))
423 log_err("FAIL: Error in udat_getSymbols().... %s\n", myErrorName(status
) );
426 log_verbose("PASS: getSymbols succesful\n");
428 if(u_strcmp(result
, pattern
)==0)
429 log_verbose("PASS: getSymbols retrieved the right value\n");
431 log_data_err("FAIL: getSymbols retrieved the wrong value\n");
433 /*run series of tests to test getsymbols regressively*/
434 log_verbose("\nTesting getSymbols() regressively\n");
435 VerifygetSymbols(fr
, UDAT_WEEKDAYS
, 1, "dimanche");
436 VerifygetSymbols(def
, UDAT_WEEKDAYS
, 1, "Sunday");
437 VerifygetSymbols(fr
, UDAT_SHORT_WEEKDAYS
, 7, "sam.");
438 VerifygetSymbols(def
, UDAT_SHORT_WEEKDAYS
, 7, "Sat");
439 VerifygetSymbols(def
, UDAT_MONTHS
, 11, "December");
440 VerifygetSymbols(def
, UDAT_MONTHS
, 0, "January");
441 VerifygetSymbols(fr
, UDAT_ERAS
, 0, "av. J.-C.");
442 VerifygetSymbols(def
, UDAT_AM_PMS
, 0, "AM");
443 VerifygetSymbols(def
, UDAT_AM_PMS
, 1, "PM");
444 VerifygetSymbols(fr
, UDAT_SHORT_MONTHS
, 0, "janv.");
445 VerifygetSymbols(def
, UDAT_SHORT_MONTHS
, 11, "Dec");
446 VerifygetSymbols(def
,UDAT_LOCALIZED_CHARS
, 0, "GyMdkHmsSEDFwWahKzYeugAZ");
455 log_verbose("\nTesting setSymbols\n");
456 /*applying the pattern so that setSymbolss works */
458 resultlengthout
=udat_toPattern(fr
, FALSE
, NULL
, resultlength
, &status
);
459 if(status
==U_BUFFER_OVERFLOW_ERROR
)
462 resultlength
=resultlengthout
+ 1;
463 pattern
=(UChar
*)malloc(sizeof(UChar
) * resultlength
);
464 udat_toPattern(fr
, FALSE
, pattern
, resultlength
, &status
);
466 if(U_FAILURE(status
))
468 log_err("FAIL: error in extracting the pattern from UNumberFormat\n %s\n",
469 myErrorName(status
) );
472 udat_applyPattern(def
, FALSE
, pattern
, u_strlen(pattern
));
474 resultlengthout
=udat_toPattern(def
, FALSE
, NULL
, resultlength
,&status
);
475 if(status
==U_BUFFER_OVERFLOW_ERROR
)
478 resultlength
=resultlengthout
+ 1;
483 result
=(UChar
*)malloc(sizeof(UChar
) * resultlength
);
484 udat_toPattern(fr
, FALSE
,result
, resultlength
, &status
);
486 if(U_FAILURE(status
))
488 log_err("FAIL: error in extracting the pattern from UNumberFormat\n %s\n",
489 myErrorName(status
) );
491 if(u_strcmp(result
, pattern
)==0)
492 log_verbose("Pattern applied properly\n");
494 log_err("pattern could not be applied properly\n");
497 /*testing set symbols */
499 resultlengthout
=udat_getSymbols(fr
, UDAT_MONTHS
, 11 , NULL
, resultlength
, &status
);
500 if(status
==U_BUFFER_OVERFLOW_ERROR
){
502 resultlength
=resultlengthout
+1;
507 result
=(UChar
*)malloc(sizeof(UChar
) * resultlength
);
508 udat_getSymbols(fr
, UDAT_MONTHS
, 11, result
, resultlength
, &status
);
511 if(U_FAILURE(status
))
512 log_err("FAIL: error in getSymbols() %s\n", myErrorName(status
) );
513 resultlength
=resultlengthout
+1;
515 udat_setSymbols(def
, UDAT_MONTHS
, 11, result
, resultlength
, &status
);
516 if(U_FAILURE(status
))
518 log_err("FAIL: Error in udat_setSymbols() : %s\n", myErrorName(status
) );
521 log_verbose("PASS: SetSymbols successful\n");
524 resultlengthout
=udat_getSymbols(def
, UDAT_MONTHS
, 11, NULL
, resultlength
, &status
);
525 if(status
==U_BUFFER_OVERFLOW_ERROR
){
527 resultlength
=resultlengthout
+1;
528 value
=(UChar
*)malloc(sizeof(UChar
) * resultlength
);
529 udat_getSymbols(def
, UDAT_MONTHS
, 11, value
, resultlength
, &status
);
531 if(U_FAILURE(status
))
532 log_err("FAIL: error in retrieving the value using getSymbols i.e roundtrip\n");
534 if(u_strcmp(result
, value
)!=0)
535 log_data_err("FAIL: Error in settting and getting symbols\n");
537 log_verbose("PASS: setSymbols successful\n");
540 /*run series of tests to test setSymbols regressively*/
541 log_verbose("\nTesting setSymbols regressively\n");
542 VerifysetSymbols(def
, UDAT_WEEKDAYS
, 1, "Sundayweek");
543 VerifysetSymbols(def
, UDAT_ERAS
, 0, "BeforeChrist");
544 VerifysetSymbols(def
, UDAT_SHORT_WEEKDAYS
, 7, "Satweek");
545 VerifysetSymbols(fr
, UDAT_MONTHS
, 11, "december");
546 VerifysetSymbols(fr
, UDAT_SHORT_MONTHS
, 0, "Jan");
549 /*run series of tests to test get and setSymbols regressively*/
550 log_verbose("\nTesting get and set symbols regressively\n");
551 VerifygetsetSymbols(fr
, def
, UDAT_WEEKDAYS
, 1);
552 VerifygetsetSymbols(fr
, def
, UDAT_WEEKDAYS
, 7);
553 VerifygetsetSymbols(fr
, def
, UDAT_SHORT_WEEKDAYS
, 1);
554 VerifygetsetSymbols(fr
, def
, UDAT_SHORT_WEEKDAYS
, 7);
555 VerifygetsetSymbols(fr
, def
, UDAT_MONTHS
, 0);
556 VerifygetsetSymbols(fr
, def
, UDAT_SHORT_MONTHS
, 0);
557 VerifygetsetSymbols(fr
, def
, UDAT_ERAS
,1);
558 VerifygetsetSymbols(fr
, def
, UDAT_LOCALIZED_CHARS
, 0);
559 VerifygetsetSymbols(fr
, def
, UDAT_AM_PMS
, 1);
575 * Test DateFormat(Calendar) API
577 static void TestDateFormatCalendar() {
578 UDateFormat
*date
=0, *time
=0, *full
=0;
584 UErrorCode ec
= U_ZERO_ERROR
;
586 ctest_setTimeZone(NULL
, &ec
);
588 /* Create a formatter for date fields. */
589 date
= udat_open(UDAT_NONE
, UDAT_SHORT
, "en_US", NULL
, 0, NULL
, 0, &ec
);
591 log_err("FAIL: udat_open(NONE, SHORT, en_US) failed with %s\n",
596 /* Create a formatter for time fields. */
597 time
= udat_open(UDAT_SHORT
, UDAT_NONE
, "en_US", NULL
, 0, NULL
, 0, &ec
);
599 log_err("FAIL: udat_open(SHORT, NONE, en_US) failed with %s\n",
604 /* Create a full format for output */
605 full
= udat_open(UDAT_FULL
, UDAT_FULL
, "en_US", NULL
, 0, NULL
, 0, &ec
);
607 log_err("FAIL: udat_open(FULL, FULL, en_US) failed with %s\n",
612 /* Create a calendar */
613 cal
= ucal_open(NULL
, 0, "en_US", UCAL_GREGORIAN
, &ec
);
615 log_err("FAIL: ucal_open(en_US) failed with %s\n",
622 u_uastrcpy(buf
, "4/5/2001");
624 udat_parseCalendar(date
, cal
, buf
, -1, &pos
, &ec
);
626 log_err("FAIL: udat_parseCalendar(4/5/2001) failed at %d with %s\n",
627 pos
, u_errorName(ec
));
632 u_uastrcpy(buf
, "5:45 PM");
634 udat_parseCalendar(time
, cal
, buf
, -1, &pos
, &ec
);
636 log_err("FAIL: udat_parseCalendar(17:45) failed at %d with %s\n",
637 pos
, u_errorName(ec
));
642 when
= ucal_getMillis(cal
, &ec
);
644 log_err("FAIL: ucal_getMillis() failed with %s\n", u_errorName(ec
));
647 udat_format(full
, when
, buf
, sizeof(buf
), NULL
, &ec
);
649 log_err("FAIL: udat_format() failed with %s\n", u_errorName(ec
));
652 u_austrcpy(cbuf
, buf
);
653 /* Thursday, April 5, 2001 5:45:00 PM PDT 986517900000 */
654 if (when
== 986517900000.0) {
655 log_verbose("Ok: Parsed result: %s\n", cbuf
);
657 log_err("FAIL: Parsed result: %s, exp 4/5/2001 5:45 PM\n", cbuf
);
666 ctest_resetTimeZone();
669 /*INTERNAL FUNCTIONS USED*/
670 static void VerifygetSymbols(UDateFormat
* datfor
, UDateFormatSymbolType type
, int32_t index
, const char* expected
)
673 UErrorCode status
= U_ZERO_ERROR
;
675 int32_t resultlength
, resultlengthout
;
678 pattern
=(UChar
*)malloc(sizeof(UChar
) * (strlen(expected
)+1));
679 u_uastrcpy(pattern
, expected
);
681 resultlengthout
=udat_getSymbols(datfor
, type
, index
, NULL
, resultlength
, &status
);
682 if(status
==U_BUFFER_OVERFLOW_ERROR
)
685 resultlength
=resultlengthout
+1;
686 result
=(UChar
*)malloc(sizeof(UChar
) * resultlength
);
687 udat_getSymbols(datfor
, type
, index
, result
, resultlength
, &status
);
690 if(U_FAILURE(status
))
692 log_err("FAIL: Error in udat_getSymbols()... %s\n", myErrorName(status
) );
695 if(u_strcmp(result
, pattern
)==0)
696 log_verbose("PASS: getSymbols retrieved the right value\n");
698 log_data_err("FAIL: getSymbols retrieved the wrong value\n Expected %s Got %s\n", austrdup(pattern
),
705 static void VerifysetSymbols(UDateFormat
* datfor
, UDateFormatSymbolType type
, int32_t index
, const char* expected
)
709 int32_t resultlength
, resultlengthout
;
710 UErrorCode status
= U_ZERO_ERROR
;
712 value
=(UChar
*)malloc(sizeof(UChar
) * (strlen(expected
) + 1));
713 u_uastrcpy(value
, expected
);
714 udat_setSymbols(datfor
, type
, index
, value
, u_strlen(value
), &status
);
715 if(U_FAILURE(status
))
717 log_err("FAIL: Error in udat_setSymbols() %s\n", myErrorName(status
) );
722 resultlengthout
=udat_getSymbols(datfor
, type
, index
, NULL
, resultlength
, &status
);
723 if(status
==U_BUFFER_OVERFLOW_ERROR
){
725 resultlength
=resultlengthout
+1;
726 result
=(UChar
*)malloc(sizeof(UChar
) * resultlength
);
727 udat_getSymbols(datfor
, type
, index
, result
, resultlength
, &status
);
729 if(U_FAILURE(status
)){
730 log_err("FAIL: error in retrieving the value using getSymbols after setting it previously\n %s\n",
731 myErrorName(status
) );
735 if(u_strcmp(result
, value
)!=0){
736 log_err("FAIL:Error in setting and then getting symbols\n Expected %s Got %s\n", austrdup(value
),
740 log_verbose("PASS: setSymbols successful\n");
747 static void VerifygetsetSymbols(UDateFormat
* from
, UDateFormat
* to
, UDateFormatSymbolType type
, int32_t index
)
751 int32_t resultlength
, resultlengthout
;
752 UErrorCode status
= U_ZERO_ERROR
;
755 resultlengthout
=udat_getSymbols(from
, type
, index
, NULL
, resultlength
, &status
);
756 if(status
==U_BUFFER_OVERFLOW_ERROR
){
758 resultlength
=resultlengthout
+1;
759 result
=(UChar
*)malloc(sizeof(UChar
) * resultlength
);
760 udat_getSymbols(from
, type
, index
, result
, resultlength
, &status
);
762 if(U_FAILURE(status
)){
763 log_err("FAIL: error in getSymbols() %s\n", myErrorName(status
) );
767 resultlength
=resultlengthout
+1;
768 udat_setSymbols(to
, type
, index
, result
, resultlength
, &status
);
769 if(U_FAILURE(status
))
771 log_err("FAIL: Error in udat_setSymbols() : %s\n", myErrorName(status
) );
776 resultlengthout
=udat_getSymbols(to
, type
, index
, NULL
, resultlength
, &status
);
777 if(status
==U_BUFFER_OVERFLOW_ERROR
){
779 resultlength
=resultlengthout
+1;
780 value
=(UChar
*)malloc(sizeof(UChar
) * resultlength
);
781 udat_getSymbols(to
, type
, index
, value
, resultlength
, &status
);
783 if(U_FAILURE(status
)){
784 log_err("FAIL: error in retrieving the value using getSymbols i.e roundtrip\n %s\n",
785 myErrorName(status
) );
789 if(u_strcmp(result
, value
)!=0){
790 log_data_err("FAIL:Error in setting and then getting symbols\n Expected %s Got %s\n", austrdup(result
),
794 log_verbose("PASS: setSymbols successful\n");
801 static UChar
* myNumformat(const UNumberFormat
* numfor
, double d
)
804 int32_t resultlength
, resultlengthneeded
;
805 UErrorCode status
= U_ZERO_ERROR
;
808 resultlengthneeded
=unum_formatDouble(numfor
, d
, NULL
, resultlength
, NULL
, &status
);
809 if(status
==U_BUFFER_OVERFLOW_ERROR
)
812 resultlength
=resultlengthneeded
+1;
813 /*result2=(UChar*)malloc(sizeof(UChar) * resultlength);*/ /* this leaks */
814 result2
=(UChar
*)ctst_malloc(sizeof(UChar
) * resultlength
); /*this won't*/
815 unum_formatDouble(numfor
, d
, result2
, resultlength
, NULL
, &status
);
817 if(U_FAILURE(status
))
819 log_err("FAIL: Error in formatting using unum_format(.....) %s\n", myErrorName(status
) );
827 * The search depth for TestExtremeDates. The total number of
828 * dates that will be tested is (2^EXTREME_DATES_DEPTH) - 1.
830 #define EXTREME_DATES_DEPTH 8
833 * Support for TestExtremeDates (below).
835 * Test a single date to see whether udat_format handles it properly.
837 static UBool
_aux1ExtremeDates(UDateFormat
* fmt
, UDate date
,
838 UChar
* buf
, int32_t buflen
, char* cbuf
,
840 int32_t len
= udat_format(fmt
, date
, buf
, buflen
, 0, ec
);
841 if (!assertSuccess("udat_format", ec
)) return FALSE
;
842 u_austrncpy(cbuf
, buf
, buflen
);
844 log_err("FAIL: udat_format(%g) => \"%s\"\n", date
, cbuf
);
846 log_verbose("udat_format(%g) => \"%s\"\n", date
, cbuf
);
852 * Support for TestExtremeDates (below).
854 * Recursively test between 'small' and 'large', up to the depth
855 * limit specified by EXTREME_DATES_DEPTH.
857 static UBool
_aux2ExtremeDates(UDateFormat
* fmt
, UDate small
, UDate large
,
858 UChar
* buf
, int32_t buflen
, char* cbuf
,
861 /* Logarithmic midpoint; see below */
862 UDate mid
= (UDate
) exp((log(small
) + log(large
)) / 2);
863 if (count
== EXTREME_DATES_DEPTH
) {
867 _aux1ExtremeDates(fmt
, mid
, buf
, buflen
, cbuf
, ec
) &&
868 _aux2ExtremeDates(fmt
, small
, mid
, buf
, buflen
, cbuf
, count
+1, ec
) &&
869 _aux2ExtremeDates(fmt
, mid
, large
, buf
, buflen
, cbuf
, count
+1, ec
);
873 * http://www.jtcsv.com/cgibin/icu-bugs?findid=3659
875 * For certain large dates, udat_format crashes on MacOS. This test
876 * attempts to reproduce this problem by doing a recursive logarithmic*
877 * binary search of a predefined interval (from 'small' to 'large').
879 * The limit of the search is given by EXTREME_DATES_DEPTH, above.
881 * *The search has to be logarithmic, not linear. A linear search of the
882 * range 0..10^30, for example, will find 0.5*10^30, then 0.25*10^30 and
883 * 0.75*10^30, etc. A logarithmic search will find 10^15, then 10^7.5
886 static void TestExtremeDates() {
891 const double small
= 1000; /* 1 sec */
892 const double large
= 1e+30; /* well beyond usable UDate range */
894 /* There is no need to test larger values from 1e+30 to 1e+300;
895 the failures occur around 1e+27, and never above 1e+30. */
898 fmt
= udat_open(UDAT_LONG
, UDAT_LONG
, "en_US",
900 if (!assertSuccess("udat_open", &ec
)) return;
902 _aux2ExtremeDates(fmt
, small
, large
, buf
, LEN(buf
), cbuf
, 0, &ec
);
907 #endif /* #if !UCONFIG_NO_FORMATTING */