]> git.saurik.com Git - apple/icu.git/blame - icuSources/test/cintltst/cnmdptst.c
ICU-64260.0.1.tar.gz
[apple/icu.git] / icuSources / test / cintltst / cnmdptst.c
CommitLineData
f3c0d7a5
A
1// © 2016 and later: Unicode, Inc. and others.
2// License & terms of use: http://www.unicode.org/copyright.html
b75a7d8f 3/********************************************************************
46f4442e 4 * COPYRIGHT:
2ca993e8 5 * Copyright (c) 1997-2016, International Business Machines Corporation
374ca955 6 * and others. All Rights Reserved.
b75a7d8f
A
7 ********************************************************************/
8/*******************************************************************************
9*
10* File CNMDPTST.C
11*
12* Madhu Katragadda Creation
13* Modification History:
14*
15* Date Name Description
16* 06/24/99 helena Integrated Alan's NF enhancements and Java2 bug fixes
17*******************************************************************************
18*/
19
20/* C DEPTH TEST FOR NUMBER FORMAT */
21
22#include "unicode/utypes.h"
23
24#if !UCONFIG_NO_FORMATTING
25
374ca955 26#include "unicode/ucurr.h"
b75a7d8f
A
27#include "unicode/uloc.h"
28#include "unicode/unum.h"
29#include "unicode/ustring.h"
2ca993e8 30#include "unicode/putil.h"
b75a7d8f
A
31#include "cintltst.h"
32#include "cnmdptst.h"
33#include "cmemory.h"
34#include "cstring.h"
729e4ab9 35#include "ulist.h"
b75a7d8f
A
36
37#define CHECK(status,str) if (U_FAILURE(status)) { log_err("FAIL: %s\n", str); return; }
38
39void addNumFrDepTest(TestNode** root);
b75a7d8f
A
40static void TestCurrencyObject(void);
41
42void addNumFrDepTest(TestNode** root)
43{
44 addTest(root, &TestPatterns, "tsformat/cnmdptst/TestPatterns");
45 addTest(root, &TestQuotes, "tsformat/cnmdptst/TestQuotes");
46 addTest(root, &TestExponential, "tsformat/cnmdptst/TestExponential");
47 addTest(root, &TestCurrencySign, "tsformat/cnmdptst/TestCurrencySign");
48 addTest(root, &TestCurrency, "tsformat/cnmdptst/TestCurrency");
b75a7d8f
A
49 addTest(root, &TestCurrencyObject, "tsformat/cnmdptst/TestCurrencyObject");
50 addTest(root, &TestRounding487, "tsformat/cnmdptst/TestRounding487");
51 addTest(root, &TestDoubleAttribute, "tsformat/cnmdptst/TestDoubleAttribute");
52 addTest(root, &TestSecondaryGrouping, "tsformat/cnmdptst/TestSecondaryGrouping");
374ca955 53 addTest(root, &TestCurrencyKeywords, "tsformat/cnmdptst/TestCurrencyKeywords");
46f4442e 54 addTest(root, &TestRounding5350, "tsformat/cnmdptst/TestRounding5350");
729e4ab9 55 addTest(root, &TestGetKeywordValuesForLocale, "tsformat/cnmdptst/TestGetKeywordValuesForLocale");
b75a7d8f
A
56}
57
58/*Test Various format patterns*/
59static void TestPatterns(void)
60{
374ca955
A
61 int32_t pat_length, i, lneed;
62 UNumberFormat *fmt;
63 UChar upat[5];
64 UChar unewpat[5];
65 UChar unum[5];
66 UChar *unewp=NULL;
67 UChar *str=NULL;
68 UErrorCode status = U_ZERO_ERROR;
69 const char* pat[] = { "#.#", "#.", ".#", "#" };
3d1f044b 70 const char* newpat[] = { "0.#", "0.", "#.0", "0" };
374ca955 71 const char* num[] = { "0", "0.", ".0", "0" };
46f4442e 72
374ca955 73 log_verbose("\nTesting different format patterns\n");
2ca993e8 74 pat_length = UPRV_LENGTHOF(pat);
374ca955 75 for (i=0; i < pat_length; ++i)
b75a7d8f 76 {
374ca955
A
77 status = U_ZERO_ERROR;
78 u_uastrcpy(upat, pat[i]);
79 fmt= unum_open(UNUM_IGNORE,upat, u_strlen(upat), "en_US",NULL, &status);
80 if (U_FAILURE(status)) {
729e4ab9 81 log_err_status(status, "FAIL: Number format constructor failed for pattern %s -> %s\n", pat[i], u_errorName(status));
46f4442e 82 continue;
374ca955
A
83 }
84 lneed=0;
85 lneed=unum_toPattern(fmt, FALSE, NULL, lneed, &status);
86 if(status==U_BUFFER_OVERFLOW_ERROR){
87 status= U_ZERO_ERROR;
88 unewp=(UChar*)malloc(sizeof(UChar) * (lneed+1) );
89 unum_toPattern(fmt, FALSE, unewp, lneed+1, &status);
90 }
91 if(U_FAILURE(status)){
92 log_err("FAIL: Number format extracting the pattern failed for %s\n", pat[i]);
93 }
94 u_uastrcpy(unewpat, newpat[i]);
95 if(u_strcmp(unewp, unewpat) != 0)
96 log_err("FAIL: Pattern %s should be transmute to %s; %s seen instead\n", pat[i], newpat[i], austrdup(unewp) );
46f4442e 97
374ca955
A
98 lneed=0;
99 lneed=unum_format(fmt, 0, NULL, lneed, NULL, &status);
100 if(status==U_BUFFER_OVERFLOW_ERROR){
101 status=U_ZERO_ERROR;
102 str=(UChar*)malloc(sizeof(UChar) * (lneed+1) );
103 unum_format(fmt, 0, str, lneed+1, NULL, &status);
104 }
105 if(U_FAILURE(status)) {
106 log_err("Error in formatting using unum_format(.....): %s\n", myErrorName(status) );
107 }
108 u_uastrcpy(unum, num[i]);
109 if (u_strcmp(str, unum) != 0)
b75a7d8f 110 {
374ca955 111 log_err("FAIL: Pattern %s should format zero as %s; %s Seen instead\n", pat[i], num[i], austrdup(str) );
46f4442e 112
b75a7d8f 113 }
374ca955
A
114 free(unewp);
115 free(str);
116 unum_close(fmt);
b75a7d8f
A
117 }
118}
119
120/* Test the handling of quotes*/
121static void TestQuotes(void)
122{
374ca955
A
123 int32_t lneed;
124 UErrorCode status=U_ZERO_ERROR;
125 UChar pat[15];
126 UChar res[15];
127 UChar *str=NULL;
128 UNumberFormat *fmt;
129 char tempBuf[256];
130 log_verbose("\nTestting the handling of quotes in number format\n");
131 u_uastrcpy(pat, "a'fo''o'b#");
132 fmt =unum_open(UNUM_IGNORE,pat, u_strlen(pat), "en_US",NULL, &status);
133 if(U_FAILURE(status)){
729e4ab9 134 log_err_status(status, "Error in number format costruction using pattern \"a'fo''o'b#\" -> %s\n", u_errorName(status));
374ca955
A
135 }
136 lneed=0;
137 lneed=unum_format(fmt, 123, NULL, lneed, NULL, &status);
138 if(status==U_BUFFER_OVERFLOW_ERROR){
139 status=U_ZERO_ERROR;
140 str=(UChar*)malloc(sizeof(UChar) * (lneed+1) );
141 unum_format(fmt, 123, str, lneed+1, NULL, &status);
142 }
143 if(U_FAILURE(status) || !str) {
729e4ab9 144 log_err_status(status, "Error in formatting using unum_format(.....): %s\n", myErrorName(status) );
374ca955
A
145 return;
146 }
147 log_verbose("Pattern \"%s\" \n", u_austrcpy(tempBuf, pat) );
148 log_verbose("Format 123 -> %s\n", u_austrcpy(tempBuf, str) );
149 u_uastrcpy(res, "afo'ob123");
150 if(u_strcmp(str, res) != 0)
151 log_err("FAIL: Expected afo'ob123");
46f4442e 152
374ca955
A
153 free(str);
154 unum_close(fmt);
46f4442e
A
155
156
374ca955
A
157 u_uastrcpy(pat, "");
158 u_uastrcpy(pat, "a''b#");
46f4442e
A
159
160
374ca955
A
161 fmt =unum_open(UNUM_IGNORE,pat, u_strlen(pat), "en_US",NULL, &status);
162 if(U_FAILURE(status)){
163 log_err("Error in number format costruction using pattern \"a''b#\"\n");
164 }
165 lneed=0;
166 lneed=unum_format(fmt, 123, NULL, lneed, NULL, &status);
167 if(status==U_BUFFER_OVERFLOW_ERROR){
168 status=U_ZERO_ERROR;
169 str=(UChar*)malloc(sizeof(UChar) * (lneed+1) );
170 unum_format(fmt, 123, str, lneed+1, NULL, &status);
171 }
172 if(U_FAILURE(status)) {
173 log_err("Error in formatting using unum_format(.....): %s\n", myErrorName(status) );
174 }
175 log_verbose("Pattern \"%s\" \n", u_austrcpy(tempBuf, pat) );
176 log_verbose("Format 123 -> %s\n", u_austrcpy(tempBuf, str) );
177 u_uastrcpy(res, "");
178 u_uastrcpy(res, "a'b123");
179 if(u_strcmp(str, res) != 0)
180 log_err("FAIL: Expected a'b123\n");
46f4442e 181
374ca955
A
182 free(str);
183 unum_close(fmt);
b75a7d8f
A
184}
185
186/* Test exponential pattern*/
187static void TestExponential(void)
188{
374ca955
A
189 int32_t pat_length, val_length, lval_length;
190 int32_t ival, ilval, p, v, lneed;
191 UNumberFormat *fmt;
192 int32_t ppos;
193 UChar *upat;
194 UChar pattern[20];
195 UChar *str=NULL;
196 UChar uvalfor[20], ulvalfor[20];
197 char tempMsgBug[256];
198 double a;
199 UErrorCode status = U_ZERO_ERROR;
4388f060 200#if U_PLATFORM == U_PF_OS390
73c04bcf 201 static const double val[] = { 0.01234, 123456789, 1.23e75, -3.141592653e-78 };
b75a7d8f 202#else
73c04bcf 203 static const double val[] = { 0.01234, 123456789, 1.23e300, -3.141592653e-271 };
b75a7d8f 204#endif
73c04bcf
A
205 static const char* pat[] = { "0.####E0", "00.000E00", "##0.######E000", "0.###E0;[0.###E0]" };
206 static const int32_t lval[] = { 0, -1, 1, 123456789 };
46f4442e 207
73c04bcf 208 static const char* valFormat[] =
374ca955
A
209 {
210 "1.234E-2", "1.2346E8", "1.23E300", "-3.1416E-271",
73c04bcf
A
211 "12.340E-03", "12.346E07", "12.300E299", "-31.416E-272",
212 "12.34E-003", "123.4568E006", "1.23E300", "-314.1593E-273",
213 "1.234E-2", "1.235E8", "1.23E300", "[3.142E-271]"
374ca955 214 };
73c04bcf 215 static const char* lvalFormat[] =
374ca955
A
216 {
217 "0E0", "-1E0", "1E0", "1.2346E8",
73c04bcf
A
218 "00.000E00", "-10.000E-01", "10.000E-01", "12.346E07",
219 "0E000", "-1E000", "1E000", "123.4568E006",
220 "0E0", "[1E0]", "1E0", "1.235E8"
374ca955 221 };
73c04bcf 222 static const double valParse[] =
374ca955 223 {
4388f060 224#if U_PLATFORM == U_PF_OS390
374ca955 225 0.01234, 123460000, 1.23E75, -3.1416E-78,
73c04bcf
A
226 0.01234, 123460000, 1.23E75, -3.1416E-78,
227 0.01234, 123456800, 1.23E75, -3.141593E-78,
228 0.01234, 123500000, 1.23E75, -3.142E-78
b75a7d8f 229#else
73c04bcf
A
230 /* We define the whole IEEE 754 number in the 4th column because
231 Visual Age 7 has a bug in rounding numbers. */
232 0.01234, 123460000, 1.23E300, -3.1415999999999999E-271,
233 0.01234, 123460000, 1.23E300, -3.1415999999999999E-271,
234 0.01234, 123456800, 1.23E300, -3.1415929999999999E-271,
235 0.01234, 123500000, 1.23E300, -3.1420000000000001E-271
b75a7d8f 236#endif
374ca955 237 };
73c04bcf 238 static const int32_t lvalParse[] =
b75a7d8f 239 {
374ca955
A
240 0, -1, 1, 123460000,
241 0, -1, 1, 123460000,
242 0, -1, 1, 123456800,
243 0, -1, 1, 123500000
244 };
46f4442e
A
245
246
2ca993e8
A
247 pat_length = UPRV_LENGTHOF(pat);
248 val_length = UPRV_LENGTHOF(val);
249 lval_length = UPRV_LENGTHOF(lval);
374ca955
A
250 ival = 0;
251 ilval = 0;
252 for (p=0; p < pat_length; ++p)
253 {
254 upat=(UChar*)malloc(sizeof(UChar) * (strlen(pat[p])+1) );
255 u_uastrcpy(upat, pat[p]);
256 fmt=unum_open(UNUM_IGNORE,upat, u_strlen(upat), "en_US",NULL, &status);
46f4442e 257 if (U_FAILURE(status)) {
729e4ab9 258 log_err_status(status, "FAIL: Bad status returned by Number format construction with pattern %s -> %s\n", pat[p], u_errorName(status));
46f4442e 259 continue;
374ca955
A
260 }
261 lneed= u_strlen(upat) + 1;
262 unum_toPattern(fmt, FALSE, pattern, lneed, &status);
263 log_verbose("Pattern \" %s \" -toPattern-> \" %s \" \n", upat, u_austrcpy(tempMsgBug, pattern) );
264 for (v=0; v<val_length; ++v)
b75a7d8f 265 {
374ca955 266 /*format*/
46f4442e 267 lneed=0;
374ca955
A
268 lneed=unum_formatDouble(fmt, val[v], NULL, lneed, NULL, &status);
269 if(status==U_BUFFER_OVERFLOW_ERROR){
270 status=U_ZERO_ERROR;
271 str=(UChar*)malloc(sizeof(UChar) * (lneed+1) );
272 unum_formatDouble(fmt, val[v], str, lneed+1, NULL, &status);
273 }
274 if(U_FAILURE(status)) {
275 log_err("Error in formatting using unum_format(.....): %s\n", myErrorName(status) );
276 }
46f4442e
A
277
278
279
374ca955
A
280 u_uastrcpy(uvalfor, valFormat[v+ival]);
281 if(u_strcmp(str, uvalfor) != 0)
282 log_verbose("FAIL: Expected %s ( %s )\n", valFormat[v+ival], u_austrcpy(tempMsgBug, uvalfor) );
46f4442e 283
374ca955
A
284 /*parsing*/
285 ppos=0;
286 a=unum_parseDouble(fmt, str, u_strlen(str), &ppos, &status);
287 if (ppos== u_strlen(str)) {
288 if (a != valParse[v+ival])
289 log_err("FAIL: Expected: %e, Got: %g\n", valParse[v+ival], a);
290 }
291 else
292 log_err(" FAIL: Partial parse ( %d chars ) -> %e\n", ppos, a);
46f4442e 293
374ca955 294 free(str);
b75a7d8f 295 }
374ca955 296 for (v=0; v<lval_length; ++v)
b75a7d8f 297 {
374ca955 298 /*format*/
46f4442e 299 lneed=0;
374ca955
A
300 lneed=unum_formatDouble(fmt, lval[v], NULL, lneed, NULL, &status);
301 if(status==U_BUFFER_OVERFLOW_ERROR){
302 status=U_ZERO_ERROR;
303 str=(UChar*)malloc(sizeof(UChar) * (lneed+1) );
304 unum_formatDouble(fmt, lval[v], str, lneed+1, NULL, &status);
305 }
306 if(U_FAILURE(status)) {
307 log_err("Error in formatting using unum_format(.....): %s\n", myErrorName(status) );
308 }
309 /*printf(" Format %e -> %s\n", lval[v], austrdup(str) );*/
310 u_uastrcpy(ulvalfor, lvalFormat[v+ilval]);
311 if(u_strcmp(str, ulvalfor) != 0)
312 log_err("FAIL: Expected %s ( %s )\n", valFormat[v+ilval], austrdup(ulvalfor) );
46f4442e 313
374ca955
A
314 /*parsing*/
315 ppos=0;
316 a=unum_parseDouble(fmt, str, u_strlen(str), &ppos, &status);
317 if (ppos== u_strlen(str)) {
318 /*printf(" Parse -> %e\n", a);*/
319 if (a != lvalParse[v+ilval])
320 log_err("FAIL: Expected : %e\n", valParse[v+ival]);
321 }
322 else
323 log_err(" FAIL: Partial parse ( %d chars ) -> %e\n", ppos, a);
46f4442e 324
374ca955 325 free(str);
46f4442e 326
b75a7d8f 327 }
374ca955
A
328 ival += val_length;
329 ilval += lval_length;
330 unum_close(fmt);
331 free(upat);
b75a7d8f
A
332 }
333}
334
335/**
336 * Test the handling of the currency symbol in patterns.
337 */
338static void TestCurrencySign(void)
339{
374ca955
A
340 int32_t lneed;
341 UNumberFormat *fmt;
342 UChar *pattern=NULL;
343 UChar *str=NULL;
344 UChar *pat=NULL;
345 UChar *res=NULL;
346 UErrorCode status = U_ZERO_ERROR;
347 char tempBuf[256];
46f4442e 348
374ca955
A
349 pattern=(UChar*)malloc(sizeof(UChar) * (strlen("*#,##0.00;-*#,##0.00") + 1) );
350 u_uastrcpy(pattern, "*#,##0.00;-*#,##0.00");
351 pattern[0]=pattern[11]=0xa4; /* insert latin-1 currency symbol */
352 fmt = unum_open(UNUM_IGNORE,pattern, u_strlen(pattern), "en_US",NULL, &status);
353 if(U_FAILURE(status)){
729e4ab9 354 log_err_status(status, "Error in number format construction with pattern \"\\xA4#,##0.00;-\\xA4#,##0.00\\\" -> %s\n", u_errorName(status));
374ca955 355 }
46f4442e 356 lneed=0;
374ca955
A
357 lneed=unum_formatDouble(fmt, 1234.56, NULL, lneed, NULL, &status);
358 if(status==U_BUFFER_OVERFLOW_ERROR){
359 status=U_ZERO_ERROR;
360 str=(UChar*)malloc(sizeof(UChar) * (lneed+1) );
361 unum_formatDouble(fmt, 1234.56, str, lneed+1, NULL, &status);
362 }
363 if(U_FAILURE(status)) {
729e4ab9 364 log_err_status(status, "Error in formatting using unum_format(.....): %s\n", myErrorName(status) );
374ca955
A
365 }
366 lneed=0;
367 lneed=unum_toPattern(fmt, FALSE, NULL, lneed, &status);
368 if(status==U_BUFFER_OVERFLOW_ERROR){
369 status=U_ZERO_ERROR;
370 pat=(UChar*)malloc(sizeof(UChar) * (lneed+1) );
371 unum_formatDouble(fmt, FALSE, pat, lneed+1, NULL, &status);
372 }
373 log_verbose("Pattern \" %s \" \n", u_austrcpy(tempBuf, pat));
374 log_verbose("Format 1234.56 -> %s\n", u_austrcpy(tempBuf, str) );
375 if(U_SUCCESS(status) && str) {
376 res=(UChar*)malloc(sizeof(UChar) * (strlen("$1,234.56")+1) );
377 u_uastrcpy(res, "$1,234.56");
729e4ab9 378 if (u_strcmp(str, res) !=0) log_data_err("FAIL: Expected $1,234.56\n");
374ca955 379 } else {
729e4ab9 380 log_err_status(status, "Error formatting -> %s\n", u_errorName(status));
374ca955 381 }
b75a7d8f
A
382 free(str);
383 free(res);
374ca955 384 free(pat);
46f4442e
A
385
386 lneed=0;
374ca955
A
387 lneed=unum_formatDouble(fmt, -1234.56, NULL, lneed, NULL, &status);
388 if(status==U_BUFFER_OVERFLOW_ERROR){
389 status=U_ZERO_ERROR;
390 str=(UChar*)malloc(sizeof(UChar) * (lneed+1) );
391 unum_formatDouble(fmt, -1234.56, str, lneed+1, NULL, &status);
392 }
393 if(U_FAILURE(status)) {
729e4ab9 394 log_err_status(status, "Error in formatting using unum_format(.....): %s\n", myErrorName(status) );
374ca955
A
395 }
396 if(str) {
397 res=(UChar*)malloc(sizeof(UChar) * (strlen("-$1,234.56")+1) );
398 u_uastrcpy(res, "-$1,234.56");
729e4ab9 399 if (u_strcmp(str, res) != 0) log_data_err("FAIL: Expected -$1,234.56\n");
374ca955
A
400 free(str);
401 free(res);
402 }
46f4442e
A
403
404 unum_close(fmt);
374ca955 405 free(pattern);
b75a7d8f
A
406}
407
408/**
409 * Test localized currency patterns.
410 */
411static void TestCurrency(void)
412{
374ca955
A
413 UNumberFormat *currencyFmt;
414 UChar *str;
415 int32_t lneed, i;
416 UFieldPosition pos;
417 UChar res[100];
418 UErrorCode status = U_ZERO_ERROR;
3d1f044b 419 const char* locale[]={"fr_CA", "de_DE@currency=DEM", "fr_FR@currency=FRF"};
b331163b 420 const char* result[]={"1,50\\u00a0$", "1,50\\u00a0DM", "1,50\\u00a0F"};
374ca955
A
421 log_verbose("\nTesting the number format with different currency patterns\n");
422 for(i=0; i < 3; i++)
b75a7d8f 423 {
374ca955
A
424 str=NULL;
425 currencyFmt = unum_open(UNUM_CURRENCY, NULL,0,locale[i],NULL, &status);
73c04bcf 426
374ca955 427 if(U_FAILURE(status)){
729e4ab9 428 log_data_err("Error in the construction of number format with style currency: %s (Are you missing data?)\n",
374ca955 429 myErrorName(status));
73c04bcf
A
430 } else {
431 lneed=0;
432 lneed= unum_formatDouble(currencyFmt, 1.50, NULL, lneed, NULL, &status);
433 if(status==U_BUFFER_OVERFLOW_ERROR){
434 status=U_ZERO_ERROR;
435 str=(UChar*)malloc(sizeof(UChar) * (lneed+1) );
436 pos.field = 0;
437 unum_formatDouble(currencyFmt, 1.50, str, lneed+1, &pos, &status);
438 }
439
440 if(U_FAILURE(status)) {
441 log_err("Error in formatting using unum_formatDouble(.....): %s\n", myErrorName(status) );
442 } else {
46f4442e 443 u_unescape(result[i], res, (int32_t)strlen(result[i])+1);
73c04bcf
A
444
445 if (u_strcmp(str, res) != 0){
446 log_err("FAIL: Expected %s Got: %s for locale: %s\n", result[i], aescstrdup(str, -1), locale[i]);
447 }
448 }
374ca955 449 }
73c04bcf 450
374ca955
A
451 unum_close(currencyFmt);
452 free(str);
b75a7d8f
A
453 }
454}
b75a7d8f
A
455
456/**
457 * Test currency "object" (we use this name to match the other C++
458 * test name and the Jave name). Actually, test ISO currency code
459 * support in the C API.
460 */
461static void TestCurrencyObject(void)
462{
374ca955
A
463 UNumberFormat *currencyFmt;
464 UChar *str=NULL, *res=NULL;
465 int32_t lneed, i;
466 UFieldPosition pos;
467 UErrorCode status = U_ZERO_ERROR;
46f4442e 468
374ca955
A
469 const char* locale[]={
470 "fr_FR",
46f4442e 471 "fr_FR",
374ca955 472 };
46f4442e 473
374ca955
A
474 const char* currency[]={
475 "",
46f4442e 476 "JPY",
374ca955 477 };
46f4442e 478
374ca955 479 const char* result[]={
3d1f044b
A
480 "1\\u202F234,56\\u00A0\\u20AC",
481 "1\\u202F235\\u00A0JPY",
374ca955 482 };
46f4442e 483
374ca955
A
484 log_verbose("\nTesting the number format with different currency codes\n");
485 for(i=0; i < 2; i++)
b75a7d8f 486 {
374ca955
A
487 char cStr[20]={0};
488 UChar isoCode[16]={0};
489 currencyFmt = unum_open(UNUM_CURRENCY, NULL,0,locale[i],NULL, &status);
490 if(U_FAILURE(status)){
729e4ab9 491 log_data_err("Error in the construction of number format with style currency: %s (Are you missing data?)\n",
374ca955 492 myErrorName(status));
73c04bcf
A
493 } else {
494 if (*currency[i]) {
495 u_uastrcpy(isoCode, currency[i]);
496 unum_setTextAttribute(currencyFmt, UNUM_CURRENCY_CODE,
497 isoCode, u_strlen(isoCode), &status);
498
499 if(U_FAILURE(status)) {
500 log_err("FAIL: can't set currency code %s\n", myErrorName(status) );
501 }
502 }
503
504 unum_getTextAttribute(currencyFmt, UNUM_CURRENCY_CODE,
505 isoCode, sizeof(isoCode), &status);
506
374ca955 507 if(U_FAILURE(status)) {
73c04bcf
A
508 log_err("FAIL: can't get currency code %s\n", myErrorName(status) );
509 }
510
511 u_UCharsToChars(isoCode,cStr,u_strlen(isoCode));
512 log_verbose("ISO code %s\n", cStr);
513 if (*currency[i] && uprv_strcmp(cStr, currency[i])) {
514 log_err("FAIL: currency should be %s, but is %s\n", currency[i], cStr);
515 }
46f4442e 516
73c04bcf
A
517 lneed=0;
518 lneed= unum_formatDouble(currencyFmt, 1234.56, NULL, lneed, NULL, &status);
519 if(status==U_BUFFER_OVERFLOW_ERROR){
520 status=U_ZERO_ERROR;
521 str=(UChar*)malloc(sizeof(UChar) * (lneed+1) );
522 pos.field = 0;
523 unum_formatDouble(currencyFmt, 1234.56, str, lneed+1, &pos, &status);
524 }
525 if(U_FAILURE(status)) {
526 log_err("Error in formatting using unum_formatDouble(.....): %s\n", myErrorName(status) );
527 } else {
528 res=(UChar*)malloc(sizeof(UChar) * (strlen(result[i])+1) );
529 u_unescape(result[i],res, (int32_t)(strlen(result[i])+1));
530 if (u_strcmp(str, res) != 0){
531 log_err("FAIL: Expected %s Got: %s for locale: %s\n", result[i],aescstrdup(str, -1),locale[i]);
532 }
374ca955 533 }
374ca955 534 }
46f4442e 535
374ca955
A
536 unum_close(currencyFmt);
537 free(str);
538 free(res);
b75a7d8f
A
539 }
540}
541
542/**
543 * Test proper rounding by the format method.
544 */
545static void TestRounding487(void)
546{
374ca955
A
547 UNumberFormat *nnf;
548 UErrorCode status = U_ZERO_ERROR;
46f4442e 549 /* this is supposed to open default date format, but later on it treats it like it is "en_US"
b75a7d8f 550 - very bad if you try to run the tests on machine where default locale is NOT "en_US" */
374ca955
A
551 /* nnf = unum_open(UNUM_DEFAULT, NULL, &status); */
552 nnf = unum_open(UNUM_DEFAULT, NULL,0,"en_US",NULL, &status);
73c04bcf 553
374ca955 554 if(U_FAILURE(status)){
729e4ab9 555 log_data_err("FAIL: failure in the construction of number format: %s (Are you missing data?)\n", myErrorName(status));
73c04bcf
A
556 } else {
557 roundingTest(nnf, 0.00159999, 4, "0.0016");
558 roundingTest(nnf, 0.00995, 4, "0.01");
46f4442e 559
73c04bcf 560 roundingTest(nnf, 12.3995, 3, "12.4");
46f4442e 561
73c04bcf
A
562 roundingTest(nnf, 12.4999, 0, "12");
563 roundingTest(nnf, - 19.5, 0, "-20");
374ca955 564 }
73c04bcf 565
374ca955 566 unum_close(nnf);
b75a7d8f 567}
46f4442e 568
b75a7d8f 569/*-------------------------------------*/
46f4442e 570
b75a7d8f
A
571static void roundingTest(UNumberFormat* nf, double x, int32_t maxFractionDigits, const char* expected)
572{
374ca955
A
573 UChar *out = NULL;
574 UChar *res;
575 UFieldPosition pos;
576 UErrorCode status;
577 int32_t lneed;
b75a7d8f 578 status=U_ZERO_ERROR;
374ca955
A
579 unum_setAttribute(nf, UNUM_MAX_FRACTION_DIGITS, maxFractionDigits);
580 lneed=0;
581 lneed=unum_formatDouble(nf, x, NULL, lneed, NULL, &status);
582 if(status==U_BUFFER_OVERFLOW_ERROR){
583 status=U_ZERO_ERROR;
584 out=(UChar*)malloc(sizeof(UChar) * (lneed+1) );
585 pos.field=0;
586 unum_formatDouble(nf, x, out, lneed+1, &pos, &status);
587 }
588 if(U_FAILURE(status)) {
589 log_err("Error in formatting using unum_formatDouble(.....): %s\n", myErrorName(status) );
590 }
591 /*Need to use log_verbose here. Problem with the float*/
592 /*printf("%f format with %d fraction digits to %s\n", x, maxFractionDigits, austrdup(out) );*/
593 res=(UChar*)malloc(sizeof(UChar) * (strlen(expected)+1) );
594 u_uastrcpy(res, expected);
595 if (u_strcmp(out, res) != 0)
596 log_err("FAIL: Expected: %s or %s\n", expected, austrdup(res) );
597 free(res);
598 if(out != NULL) {
599 free(out);
600 }
b75a7d8f
A
601}
602
603/*
46f4442e 604 * Testing unum_getDoubleAttribute and unum_setDoubleAttribute()
b75a7d8f
A
605 */
606static void TestDoubleAttribute(void)
607{
608 double mydata[] = { 1.11, 22.22, 333.33, 4444.44, 55555.55, 666666.66, 7777777.77, 88888888.88, 999999999.99};
609 double dvalue;
610 int i;
611 UErrorCode status=U_ZERO_ERROR;
612 UNumberFormatAttribute attr;
613 UNumberFormatStyle style= UNUM_DEFAULT;
614 UNumberFormat *def;
73c04bcf 615
b75a7d8f 616 log_verbose("\nTesting get and set DoubleAttributes\n");
73c04bcf
A
617 def=unum_open(style, NULL,0,NULL,NULL, &status);
618
619 if (U_FAILURE(status)) {
729e4ab9 620 log_data_err("Fail: error creating a default number formatter -> %s (Are you missing data?)\n", u_errorName(status));
73c04bcf
A
621 } else {
622 attr=UNUM_ROUNDING_INCREMENT;
623 dvalue=unum_getDoubleAttribute(def, attr);
624 for (i = 0; i<9 ; i++)
625 {
46f4442e 626 dvalue = mydata[i];
73c04bcf
A
627 unum_setDoubleAttribute(def, attr, dvalue);
628 if(unum_getDoubleAttribute(def,attr)!=mydata[i])
629 log_err("Fail: error in setting and getting double attributes for UNUM_ROUNDING_INCREMENT\n");
630 else
631 log_verbose("Pass: setting and getting double attributes for UNUM_ROUNDING_INCREMENT works fine\n");
632 }
b75a7d8f 633 }
73c04bcf 634
b75a7d8f
A
635 unum_close(def);
636}
637
638/**
639 * Test the functioning of the secondary grouping value.
640 */
641static void TestSecondaryGrouping(void) {
642 UErrorCode status = U_ZERO_ERROR;
643 UNumberFormat *f = NULL, *g= NULL;
644 UNumberFormat *us = unum_open(UNUM_DECIMAL,NULL,0, "en_US", NULL,&status);
645 UFieldPosition pos;
646 UChar resultBuffer[512];
647 int32_t l = 1876543210L;
648 UBool ok = TRUE;
649 UChar buffer[512];
650 int32_t i;
651 UBool expectGroup = FALSE, isGroup = FALSE;
652
653 u_uastrcpy(buffer, "#,##,###");
654 f = unum_open(UNUM_IGNORE,buffer, -1, "en_US",NULL, &status);
729e4ab9
A
655 if (U_FAILURE(status)) {
656 log_data_err("Error DecimalFormat ct -> %s (Are you missing data?)\n", u_errorName(status));
657 return;
658 }
b75a7d8f
A
659
660 pos.field = 0;
661 unum_format(f, (int32_t)123456789L, resultBuffer, 512 , &pos, &status);
662 u_uastrcpy(buffer, "12,34,56,789");
663 if ((u_strcmp(resultBuffer, buffer) != 0) || U_FAILURE(status))
664 {
0f5d89e8 665 log_err("Fail: Formatting \"#,##,###\" pattern with 123456789 got %s, expected %s\n", austrdup(resultBuffer), "12,34,56,789");
b75a7d8f
A
666 }
667 if (pos.beginIndex != 0 && pos.endIndex != 12) {
668 log_err("Fail: Formatting \"#,##,###\" pattern pos = (%d, %d) expected pos = (0, 12)\n", pos.beginIndex, pos.endIndex);
669 }
670 memset(resultBuffer,0, sizeof(UChar)*512);
671 unum_toPattern(f, FALSE, resultBuffer, 512, &status);
3d1f044b 672 u_uastrcpy(buffer, "#,##,##0");
b75a7d8f
A
673 if ((u_strcmp(resultBuffer, buffer) != 0) || U_FAILURE(status))
674 {
3d1f044b 675 log_err("Fail: toPattern() got %s, expected %s\n", austrdup(resultBuffer), "#,##,##0");
b75a7d8f
A
676 }
677 memset(resultBuffer,0, sizeof(UChar)*512);
678 u_uastrcpy(buffer, "#,###");
679 unum_applyPattern(f, FALSE, buffer, -1,NULL,NULL);
680 if (U_FAILURE(status))
681 {
682 log_err("Fail: applyPattern call failed\n");
683 }
684 unum_setAttribute(f, UNUM_SECONDARY_GROUPING_SIZE, 4);
685 unum_format(f, (int32_t)123456789L, resultBuffer, 512 , &pos, &status);
686 u_uastrcpy(buffer, "12,3456,789");
687 if ((u_strcmp(resultBuffer, buffer) != 0) || U_FAILURE(status))
688 {
0f5d89e8 689 log_err("Fail: Formatting \"#,###\" pattern with 123456789 got %s, expected %s\n", austrdup(resultBuffer), "12,3456,789");
b75a7d8f
A
690 }
691 memset(resultBuffer,0, sizeof(UChar)*512);
692 unum_toPattern(f, FALSE, resultBuffer, 512, &status);
3d1f044b 693 u_uastrcpy(buffer, "#,####,##0");
b75a7d8f
A
694 if ((u_strcmp(resultBuffer, buffer) != 0) || U_FAILURE(status))
695 {
3d1f044b 696 log_err("Fail: toPattern() got %s, expected %s\n", austrdup(resultBuffer), "#,####,##0");
b75a7d8f
A
697 }
698 memset(resultBuffer,0, sizeof(UChar)*512);
699 g = unum_open(UNUM_DECIMAL, NULL,0,"hi_IN",NULL, &status);
700 if (U_FAILURE(status))
701 {
702 log_err("Fail: Cannot create UNumberFormat for \"hi_IN\" locale.\n");
703 }
704
705 unum_format(g, l, resultBuffer, 512, &pos, &status);
706 unum_close(g);
707 /* expect "1,87,65,43,210", but with Hindi digits */
708 /* 01234567890123 */
709 if (u_strlen(resultBuffer) != 14) {
710 ok = FALSE;
711 } else {
712 for (i=0; i<u_strlen(resultBuffer); ++i) {
713 expectGroup = FALSE;
714 switch (i) {
715 case 1:
716 case 4:
717 case 7:
718 case 10:
719 expectGroup = TRUE;
720 break;
721 }
722 /* Later -- fix this to get the actual grouping */
723 /* character from the resource bundle. */
724 isGroup = (UBool)(resultBuffer[i] == 0x002C);
725 if (isGroup != expectGroup) {
726 ok = FALSE;
727 break;
728 }
729 }
730 }
731 if (!ok) {
732 log_err("FAIL Expected %s x hi_IN -> \"1,87,65,43,210\" (with Hindi digits), got %s\n", "1876543210L", resultBuffer);
46f4442e 733 }
b75a7d8f
A
734 unum_close(f);
735 unum_close(us);
736}
737
374ca955
A
738static void TestCurrencyKeywords(void)
739{
46f4442e 740 static const char * const currencies[] = {
374ca955
A
741 "ADD", "ADP", "AED", "AFA", "AFN", "AIF", "ALK", "ALL", "ALV", "ALX", "AMD",
742 "ANG", "AOA", "AOK", "AON", "AOR", "AOS", "ARA", "ARM", "ARP", "ARS", "ATS",
743 "AUD", "AUP", "AWG", "AZM", "BAD", "BAM", "BAN", "BBD", "BDT", "BEC", "BEF",
744 "BEL", "BGL", "BGM", "BGN", "BGO", "BGX", "BHD", "BIF", "BMD", "BMP", "BND",
745 "BOB", "BOL", "BOP", "BOV", "BRB", "BRC", "BRE", "BRL", "BRN", "BRR", "BRZ",
746 "BSD", "BSP", "BTN", "BTR", "BUK", "BUR", "BWP", "BYB", "BYL", "BYR", "BZD",
747 "BZH", "CAD", "CDF", "CDG", "CDL", "CFF", "CHF", "CKD", "CLC", "CLE", "CLF",
748 "CLP", "CMF", "CNP", "CNX", "CNY", "COB", "COF", "COP", "CRC", "CSC", "CSK",
46f4442e
A
749 "CUP", "CUX", "CVE", "CWG", "CYP", "CZK", "DDM", "DEM", "DES", "DJF", "DKK",
750 "DOP", "DZD", "DZF", "DZG", "ECS", "ECV", "EEK", "EGP", "ERN", "ESP", "ETB",
751 "ETD", "EUR", "FIM", "FIN", "FJD", "FJP", "FKP", "FOK", "FRF", "FRG", "GAF",
752 "GBP", "GEK", "GEL", "GHC", "GHO", "GHP", "GHR", "GIP", "GLK", "GMD", "GMP",
753 "GNF", "GNI", "GNS", "GPF", "GQE", "GQF", "GQP", "GRD", "GRN", "GTQ", "GUF",
754 "GWE", "GWM", "GWP", "GYD", "HKD", "HNL", "HRD", "HRK", "HTG", "HUF", "IBP",
755 "IDG", "IDJ", "IDN", "IDR", "IEP", "ILL", "ILP", "ILS", "IMP", "INR", "IQD",
756 "IRR", "ISK", "ITL", "JEP", "JMD", "JMP", "JOD", "JPY", "KES", "KGS", "KHO",
757 "KHR", "KID", "KMF", "KPP", "KPW", "KRH", "KRO", "KRW", "KWD", "KYD", "KZR",
758 "KZT", "LAK", "LBP", "LIF", "LKR", "LNR", "LRD", "LSL", "LTL", "LTT", "LUF",
759 "LVL", "LVR", "LYB", "LYD", "LYP", "MAD", "MAF", "MCF", "MCG", "MDC", "MDL",
760 "MDR", "MGA", "MGF", "MHD", "MKD", "MKN", "MLF", "MMK", "MMX", "MNT", "MOP",
761 "MQF", "MRO", "MTL", "MTP", "MUR", "MVP", "MVR", "MWK", "MWP", "MXN", "MXP",
762 "MXV", "MYR", "MZE", "MZM", "NAD", "NCF", "NGN", "NGP", "NHF", "NIC", "NIG",
763 "NIO", "NLG", "NOK", "NPR", "NZD", "NZP", "OMR", "OMS", "PAB", "PDK", "PDN",
764 "PDR", "PEI", "PEN", "PES", "PGK", "PHP", "PKR", "PLN", "PLX", "PLZ", "PSP",
765 "PTC", "PTE", "PYG", "QAR", "REF", "ROL", "RON", "RUB", "RUR", "RWF", "SAR",
766 "SAS", "SBD", "SCR", "SDD", "SDP", "SEK", "SGD", "SHP", "SIB", "SIT", "SKK",
767 "SLL", "SML", "SOS", "SQS", "SRG", "SSP", "STD", "STE", "SUN", "SUR", "SVC",
768 "SYP", "SZL", "TCC", "TDF", "THB", "TJR", "TJS", "TMM", "TND", "TOP", "TOS",
769 "TPE", "TPP", "TRL", "TTD", "TTO", "TVD", "TWD", "TZS", "UAH", "UAK", "UGS",
770 "UGX", "USD", "USN", "USS", "UYF", "UYP", "UYU", "UZC", "UZS", "VAL", "VDD",
771 "VDN", "VDP", "VEB", "VGD", "VND", "VNN", "VNR", "VNS", "VUV", "WSP", "WST",
772 "XAD", "XAF", "XAM", "XAU", "XBA", "XBB", "XBC", "XBD", "XCD", "XCF", "XDR",
773 "XEF", "XEU", "XFO", "XFU", "XID", "XMF", "XNF", "XOF", "XPF", "XPS", "XSS",
774 "XTR", "YDD", "YEI", "YER", "YUD", "YUF", "YUG", "YUM", "YUN", "YUO", "YUR",
374ca955
A
775 "ZAL", "ZAP", "ZAR", "ZMK", "ZMP", "ZRN", "ZRZ", "ZWD"
776 };
46f4442e 777
374ca955
A
778 UErrorCode status = U_ZERO_ERROR;
779 int32_t i = 0, j = 0;
780 int32_t noLocales = uloc_countAvailable();
781 char locale[256];
782 char currLoc[256];
783 UChar result[4];
784 UChar currBuffer[256];
46f4442e
A
785
786
374ca955
A
787 for(i = 0; i < noLocales; i++) {
788 strcpy(currLoc, uloc_getAvailable(i));
2ca993e8 789 for(j = 0; j < UPRV_LENGTHOF(currencies); j++) {
374ca955
A
790 strcpy(locale, currLoc);
791 strcat(locale, "@currency=");
792 strcat(locale, currencies[j]);
793 ucurr_forLocale(locale, result, 4, &status);
794 u_charsToUChars(currencies[j], currBuffer, 3);
795 currBuffer[3] = 0;
796 if(u_strcmp(currBuffer, result) != 0) {
797 log_err("Didn't get the right currency for %s\n", locale);
798 }
799 }
46f4442e
A
800
801 }
802}
803
729e4ab9 804static void TestGetKeywordValuesForLocale(void) {
2ca993e8 805#define PREFERRED_SIZE 15
4388f060 806#define MAX_NUMBER_OF_KEYWORDS 4
729e4ab9 807 const char *PREFERRED[PREFERRED_SIZE][MAX_NUMBER_OF_KEYWORDS] = {
b331163b
A
808 { "root", "USD", "USN", NULL },
809 { "und", "USD", "USN", NULL },
810 /* { "und_ZZ", "USD", NULL, NULL }, -- temporarily remove as this locale now has 15 entries */
811 { "en_US", "USD", "USN", NULL },
812 { "en_029", "USD", "USN", NULL },
4388f060
A
813 { "en_TH", "THB", NULL, NULL },
814 { "de", "EUR", NULL, NULL },
815 { "de_DE", "EUR", NULL, NULL },
816 { "ar", "EGP", NULL, NULL },
51004dcb 817 { "ar_PS", "ILS", "JOD", NULL },
b331163b 818 { "en@currency=CAD", "USD", "USN", NULL },
4388f060
A
819 { "fr@currency=zzz", "EUR", NULL, NULL },
820 { "de_DE@currency=DEM", "EUR", NULL, NULL },
2ca993e8
A
821 { "en_US@rg=THZZZZ", "THB", NULL, NULL },
822 { "de@rg=USZZZZ", "USD", "USN", NULL },
823 { "en_US@currency=CAD;rg=THZZZZ", "THB", NULL, NULL },
729e4ab9
A
824 };
825 const int32_t EXPECTED_SIZE[PREFERRED_SIZE] = {
2ca993e8
A
826 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 1, 1, 1, 2, 1
827 };
828 /* ucurr_forLocale results for same locales; "" if no result expected */
829 const char *FORLOCALE[PREFERRED_SIZE] = {
830 "", "", "USD", "",
831 "THB", "", "EUR", "",
832 "ILS", "CAD", "ZZZ", "DEM",
833 "THB", "USD", "CAD"
729e4ab9
A
834 };
835 UErrorCode status = U_ZERO_ERROR;
836 int32_t i, j, size;
837 UEnumeration *pref, *all;
838 const char *loc = NULL;
839 UBool matchPref, matchAll;
840 const char *value = NULL;
841 int32_t valueLength = 0;
842
843 UList *ALLList = NULL;
844
845 UEnumeration *ALL = ucurr_getKeywordValuesForLocale("currency", uloc_getDefault(), FALSE, &status);
846 if (ALL == NULL) {
847 log_err_status(status, "ERROR getting keyword value for default locale. -> %s\n", u_errorName(status));
848 return;
849 }
850
851 for (i = 0; i < PREFERRED_SIZE; i++) {
2ca993e8
A
852 UChar getCurrU[4];
853 int32_t getCurrLen;
854
855 status = U_ZERO_ERROR;
729e4ab9
A
856 pref = NULL;
857 all = NULL;
858 loc = PREFERRED[i][0];
859 pref = ucurr_getKeywordValuesForLocale("currency", loc, TRUE, &status);
860 matchPref = FALSE;
861 matchAll = FALSE;
862
863 size = uenum_count(pref, &status);
864
865 if (size == EXPECTED_SIZE[i]) {
866 matchPref = TRUE;
867 for (j = 0; j < size; j++) {
868 if ((value = uenum_next(pref, &valueLength, &status)) != NULL && U_SUCCESS(status)) {
869 if (uprv_strcmp(value, PREFERRED[i][j+1]) != 0) {
870 log_err("ERROR: locale %s got keywords #%d %s expected %s\n", loc, j, value, PREFERRED[i][j+1]);
871
872 matchPref = FALSE;
873 break;
874 }
875 } else {
876 matchPref = FALSE;
877 log_err("ERROR getting keyword value for locale \"%s\"\n", loc);
878 break;
879 }
880 }
881 } else {
882 log_err("FAIL: size of locale \"%s\" %d does not match expected size %d\n", loc, size, EXPECTED_SIZE[i]);
883 }
884
885 if (!matchPref) {
886 log_err("FAIL: Preferred values for locale \"%s\" does not match expected.\n", loc);
887 break;
888 }
889 uenum_close(pref);
890
891 all = ucurr_getKeywordValuesForLocale("currency", loc, FALSE, &status);
892
893 size = uenum_count(all, &status);
894
895 if (U_SUCCESS(status) && size == uenum_count(ALL, &status)) {
896 matchAll = TRUE;
897 ALLList = ulist_getListFromEnum(ALL);
898 for (j = 0; j < size; j++) {
899 if ((value = uenum_next(all, &valueLength, &status)) != NULL && U_SUCCESS(status)) {
3d1f044b 900 if (!ulist_containsString(ALLList, value, (int32_t)uprv_strlen(value))) {
729e4ab9
A
901 log_err("Locale %s have %s not in ALL\n", loc, value);
902 matchAll = FALSE;
903 break;
904 }
905 } else {
906 matchAll = FALSE;
907 log_err("ERROR getting \"all\" keyword value for locale \"%s\"\n", loc);
908 break;
909 }
910 }
911 if (!matchAll) {
912 log_err("FAIL: All values for locale \"%s\" does not match expected.\n", loc);
913 }
914 } else {
915 if(U_FAILURE(status)) {
916 log_err("ERROR: %s\n", u_errorName(status));
917 } else if(size!=uenum_count(ALL, &status)) {
918 log_err("ERROR: got size of %d, wanted %d\n", size, uenum_count(ALL, &status));
919 }
920 }
921
922 uenum_close(all);
2ca993e8
A
923
924 status = U_ZERO_ERROR;
925 getCurrLen = ucurr_forLocale(loc, getCurrU, 4, &status);
926 if(U_FAILURE(status)) {
927 if (FORLOCALE[i][0] != 0) {
928 log_err("ERROR: ucurr_forLocale %s, status %s\n", loc, u_errorName(status));
929 }
930 } else if (getCurrLen != 3) {
931 if (FORLOCALE[i][0] != 0 || getCurrLen != -1) {
932 log_err("ERROR: ucurr_forLocale %s, returned len %d\n", loc, getCurrLen);
933 }
934 } else {
935 char getCurrB[4];
936 u_UCharsToChars(getCurrU, getCurrB, 4);
937 if ( uprv_strncmp(getCurrB, FORLOCALE[i], 4) != 0 ) {
938 log_err("ERROR: ucurr_forLocale %s, expected %s, got %s\n", loc, FORLOCALE[i], getCurrB);
939 }
940 }
729e4ab9
A
941 }
942
943 uenum_close(ALL);
944
945}
946
46f4442e
A
947/**
948 * Test proper handling of rounding modes.
949 */
950static void TestRounding5350(void)
951{
952 UNumberFormat *nnf;
953 UErrorCode status = U_ZERO_ERROR;
954 /* this is supposed to open default date format, but later on it treats it like it is "en_US"
955 - very bad if you try to run the tests on machine where default locale is NOT "en_US" */
956 /* nnf = unum_open(UNUM_DEFAULT, NULL, &status); */
957 nnf = unum_open(UNUM_DEFAULT, NULL,0,"en_US",NULL, &status);
958
959 if(U_FAILURE(status)){
729e4ab9 960 log_data_err("FAIL: failure in the construction of number format: %s (Are you missing data?)\n", myErrorName(status));
46f4442e
A
961 return;
962 }
963
964 unum_setAttribute(nnf, UNUM_MAX_FRACTION_DIGITS, 2);
965 roundingTest2(nnf, -0.125, UNUM_ROUND_CEILING, "-0.12");
966 roundingTest2(nnf, -0.125, UNUM_ROUND_FLOOR, "-0.13");
967 roundingTest2(nnf, -0.125, UNUM_ROUND_DOWN, "-0.12");
968 roundingTest2(nnf, -0.125, UNUM_ROUND_UP, "-0.13");
969 roundingTest2(nnf, 0.125, UNUM_FOUND_HALFEVEN, "0.12");
970 roundingTest2(nnf, 0.135, UNUM_ROUND_HALFDOWN, "0.13");
971 roundingTest2(nnf, 0.125, UNUM_ROUND_HALFUP, "0.13");
972 roundingTest2(nnf, 0.135, UNUM_FOUND_HALFEVEN, "0.14");
973 /* The following are exactly represented, and shouldn't round */
974 roundingTest2(nnf, 1.00, UNUM_ROUND_UP, "1");
975 roundingTest2(nnf, 24.25, UNUM_ROUND_UP, "24.25");
976 roundingTest2(nnf, 24.25, UNUM_ROUND_CEILING, "24.25");
977 roundingTest2(nnf, -24.25, UNUM_ROUND_UP, "-24.25");
978
979 /* Differences pretty far out there */
980 roundingTest2(nnf, 1.0000001, UNUM_ROUND_CEILING, "1.01");
981 roundingTest2(nnf, 1.0000001, UNUM_ROUND_FLOOR, "1");
982 roundingTest2(nnf, 1.0000001, UNUM_ROUND_DOWN, "1");
983 roundingTest2(nnf, 1.0000001, UNUM_ROUND_UP, "1.01");
984 roundingTest2(nnf, 1.0000001, UNUM_FOUND_HALFEVEN, "1");
985 roundingTest2(nnf, 1.0000001, UNUM_ROUND_HALFDOWN, "1");
986 roundingTest2(nnf, 1.0000001, UNUM_ROUND_HALFUP, "1");
987
988 roundingTest2(nnf, -1.0000001, UNUM_ROUND_CEILING, "-1");
989 roundingTest2(nnf, -1.0000001, UNUM_ROUND_FLOOR, "-1.01");
990 roundingTest2(nnf, -1.0000001, UNUM_ROUND_DOWN, "-1");
991 roundingTest2(nnf, -1.0000001, UNUM_ROUND_UP, "-1.01");
992 roundingTest2(nnf, -1.0000001, UNUM_FOUND_HALFEVEN, "-1");
993 roundingTest2(nnf, -1.0000001, UNUM_ROUND_HALFDOWN, "-1");
994 roundingTest2(nnf, -1.0000001, UNUM_ROUND_HALFUP, "-1");
995
996 unum_close(nnf);
997}
998
999/*-------------------------------------*/
1000
1001static void roundingTest2(UNumberFormat* nf, double x, int32_t roundingMode, const char* expected)
1002{
1003 UChar *out = NULL;
1004 UChar *res;
1005 UFieldPosition pos;
1006 UErrorCode status;
1007 int32_t lneed;
1008 status=U_ZERO_ERROR;
1009 unum_setAttribute(nf, UNUM_ROUNDING_MODE, roundingMode);
1010 lneed=0;
1011 lneed=unum_formatDouble(nf, x, NULL, lneed, NULL, &status);
1012 if(status==U_BUFFER_OVERFLOW_ERROR){
1013 status=U_ZERO_ERROR;
1014 out=(UChar*)malloc(sizeof(UChar) * (lneed+1) );
1015 pos.field=0;
1016 unum_formatDouble(nf, x, out, lneed+1, &pos, &status);
1017 }
1018 if(U_FAILURE(status)) {
1019 log_err("Error in formatting using unum_formatDouble(.....): %s\n", myErrorName(status) );
1020 }
1021 /*Need to use log_verbose here. Problem with the float*/
1022 /*printf("%f format with %d fraction digits to %s\n", x, maxFractionDigits, austrdup(out) );*/
1023 res=(UChar*)malloc(sizeof(UChar) * (strlen(expected)+1) );
1024 u_uastrcpy(res, expected);
1025 if (u_strcmp(out, res) != 0)
1026 log_err("FAIL: Expected: \"%s\" Got: \"%s\"\n", expected, austrdup(out) );
1027 free(res);
1028 if(out != NULL) {
1029 free(out);
374ca955
A
1030 }
1031}
1032
b75a7d8f 1033#endif /* #if !UCONFIG_NO_FORMATTING */