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