1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT:
3103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * Copyright (c) 1997-2012, International Business Machines Corporation and
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved.
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************************
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* File CNUMTST.C
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*     Madhu Katragadda              Creation
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Modification History:
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   Date        Name        Description
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   06/24/99    helena      Integrated Alan's NF enhancements and Java2 bug fixes
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   07/15/99    helena      Ported to HPUX 10/11 CC.
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*********************************************************************************
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* C API TEST FOR NUMBER FORMAT */
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uloc.h"
2727f654740f2a26ad62a5c155af9199af9e69b889claireho#include "unicode/umisc.h"
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/unum.h"
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h"
3027f654740f2a26ad62a5c155af9199af9e69b889claireho
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cintltst.h"
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cnumtst.h"
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h"
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "putilimp.h"
3554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#include <stdio.h>
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define LENGTH(arr) (sizeof(arr)/sizeof(arr[0]))
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3954dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic const char *tagAssert(const char *f, int32_t l, const char *msg) {
4054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    static char _fileline[1000];
4154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    sprintf(_fileline, "%s:%d: ASSERT_TRUE(%s)", f, l, msg);
4254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    return _fileline;
4354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}
4454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
4554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#define ASSERT_TRUE(x)   assertTrue(tagAssert(__FILE__, __LINE__, #x), (x))
4654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addNumForTest(TestNode** root);
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestTextAttributeCrash(void);
49c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustatic void TestNBSPInPattern(void);
5027f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestInt64Parse(void);
51b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestParseCurrency(void);
5254dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic void TestMaxInt(void);
5354dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic void TestNoExponent(void);
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TESTCASE(x) addTest(root, &x, "tsformat/cnumtst/" #x)
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addNumForTest(TestNode** root)
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestNumberFormat);
60b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    TESTCASE(TestSpelloutNumberParse);
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestSignificantDigits);
6227f654740f2a26ad62a5c155af9199af9e69b889claireho    TESTCASE(TestSigDigRounding);
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestNumberFormatPadding);
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestInt64Format);
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestNonExistentCurrency);
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestCurrencyRegression);
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestTextAttributeCrash);
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestRBNFFormat);
69c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    TESTCASE(TestNBSPInPattern);
7027f654740f2a26ad62a5c155af9199af9e69b889claireho    TESTCASE(TestInt64Parse);
71b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TESTCASE(TestParseZero);
72b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TESTCASE(TestParseCurrency);
73103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    TESTCASE(TestCloneWithRBNF);
7454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    TESTCASE(TestMaxInt);
7554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    TESTCASE(TestNoExponent);
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
7827f654740f2a26ad62a5c155af9199af9e69b889claireho/* test Parse int 64 */
7927f654740f2a26ad62a5c155af9199af9e69b889claireho
8027f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestInt64Parse()
8127f654740f2a26ad62a5c155af9199af9e69b889claireho{
8227f654740f2a26ad62a5c155af9199af9e69b889claireho
8327f654740f2a26ad62a5c155af9199af9e69b889claireho    UErrorCode st = U_ZERO_ERROR;
8427f654740f2a26ad62a5c155af9199af9e69b889claireho    UErrorCode* status = &st;
85b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
8627f654740f2a26ad62a5c155af9199af9e69b889claireho    const char* st1 = "009223372036854775808";
8727f654740f2a26ad62a5c155af9199af9e69b889claireho    const int size = 21;
8827f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar text[21];
89b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
90b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
9127f654740f2a26ad62a5c155af9199af9e69b889claireho    UNumberFormat* nf;
9227f654740f2a26ad62a5c155af9199af9e69b889claireho
9327f654740f2a26ad62a5c155af9199af9e69b889claireho    int64_t a;
9427f654740f2a26ad62a5c155af9199af9e69b889claireho
9527f654740f2a26ad62a5c155af9199af9e69b889claireho    u_charsToUChars(st1, text, size);
9627f654740f2a26ad62a5c155af9199af9e69b889claireho    nf = unum_open(UNUM_DEFAULT, NULL, -1, NULL, NULL, status);
9727f654740f2a26ad62a5c155af9199af9e69b889claireho
9827f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(*status))
9927f654740f2a26ad62a5c155af9199af9e69b889claireho    {
10027f654740f2a26ad62a5c155af9199af9e69b889claireho        log_data_err("Error in unum_open() %s \n", myErrorName(*status));
10127f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
10227f654740f2a26ad62a5c155af9199af9e69b889claireho    }
10327f654740f2a26ad62a5c155af9199af9e69b889claireho
10427f654740f2a26ad62a5c155af9199af9e69b889claireho    log_verbose("About to test unum_parseInt64() with out of range number\n");
10527f654740f2a26ad62a5c155af9199af9e69b889claireho
10627f654740f2a26ad62a5c155af9199af9e69b889claireho    a = unum_parseInt64(nf, text, size, 0, status);
107b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
10827f654740f2a26ad62a5c155af9199af9e69b889claireho
10927f654740f2a26ad62a5c155af9199af9e69b889claireho    if(!U_FAILURE(*status))
11027f654740f2a26ad62a5c155af9199af9e69b889claireho    {
11127f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err("Error in unum_parseInt64(): %s \n", myErrorName(*status));
11227f654740f2a26ad62a5c155af9199af9e69b889claireho    }
11327f654740f2a26ad62a5c155af9199af9e69b889claireho    else
11427f654740f2a26ad62a5c155af9199af9e69b889claireho    {
11527f654740f2a26ad62a5c155af9199af9e69b889claireho        log_verbose("unum_parseInt64() successful\n");
11627f654740f2a26ad62a5c155af9199af9e69b889claireho    }
11727f654740f2a26ad62a5c155af9199af9e69b889claireho
11827f654740f2a26ad62a5c155af9199af9e69b889claireho    unum_close(nf);
11927f654740f2a26ad62a5c155af9199af9e69b889claireho    return;
12027f654740f2a26ad62a5c155af9199af9e69b889claireho}
12127f654740f2a26ad62a5c155af9199af9e69b889claireho
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* test Number Format API */
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestNumberFormat()
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *result=NULL;
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar temp1[512];
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar temp2[512];
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar temp[5];
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar prefix[5];
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar suffix[5];
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar symbol[20];
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t resultlength;
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t resultlengthneeded;
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t parsepos;
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double d1 = -1.0;
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t l1;
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double d = -10456.37;
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double a = 1234.56, a1 = 1235.0;
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t l = 100000000;
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UFieldPosition pos1;
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UFieldPosition pos2;
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t numlocales;
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UNumberFormatAttribute attr;
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UNumberFormatSymbol symType = UNUM_DECIMAL_SEPARATOR_SYMBOL;
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t newvalue;
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status=U_ZERO_ERROR;
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UNumberFormatStyle style= UNUM_DEFAULT;
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UNumberFormat *pattern;
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UNumberFormat *def, *fr, *cur_def, *cur_fr, *per_def, *per_fr,
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  *cur_frpattern, *myclone, *spellout_def;
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Testing unum_open() with various Numberformat styles and locales*/
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Testing  unum_open() with default style and locale\n");
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    def=unum_open(style, NULL,0,NULL, NULL,&status);
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Might as well pack it in now if we can't even get a default NumberFormat... */
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1646d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_data_err("Error in creating default NumberFormat using unum_open(): %s (Are you missing data?)\n", myErrorName(status));
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_open() with french locale and default style(decimal)\n");
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fr=unum_open(style,NULL,0, "fr_FR",NULL, &status);
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error: could not create NumberFormat (french): %s\n", myErrorName(status));
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_open(currency,NULL,status)\n");
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    style=UNUM_CURRENCY;
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Can't hardcode the result to assume the default locale is "en_US". */
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cur_def=unum_open(style, NULL,0,"en_US", NULL, &status);
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error: could not create NumberFormat using \n unum_open(currency, NULL, &status) %s\n",
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        myErrorName(status) );
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_open(currency, frenchlocale, status)\n");
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cur_fr=unum_open(style,NULL,0, "fr_FR", NULL, &status);
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
184b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err("Error: could not create NumberFormat using unum_open(currency, french, &status): %s\n",
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                myErrorName(status));
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_open(percent, NULL, status)\n");
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    style=UNUM_PERCENT;
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    per_def=unum_open(style,NULL,0, NULL,NULL, &status);
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error: could not create NumberFormat using unum_open(percent, NULL, &status): %s\n", myErrorName(status));
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_open(percent,frenchlocale, status)\n");
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    per_fr=unum_open(style, NULL,0,"fr_FR", NULL,&status);
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error: could not create NumberFormat using unum_open(percent, french, &status): %s\n", myErrorName(status));
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_open(spellout, NULL, status)");
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    style=UNUM_SPELLOUT;
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    spellout_def=unum_open(style, NULL, 0, "en_US", NULL, &status);
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error: could not create NumberFormat using unum_open(spellout, NULL, &status): %s\n", myErrorName(status));
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Testing unum_clone(..) */
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_clone(fmt, status)");
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    myclone = unum_clone(def,&status);
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error: could not clone unum_clone(def, &status): %s\n", myErrorName(status));
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("unum_clone() successful\n");
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*Testing unum_getAvailable() and unum_countAvailable()*/
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting getAvailableLocales and countAvailable()\n");
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    numlocales=unum_countAvailable();
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(numlocales < 0)
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in countAvailable");
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else{
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("unum_countAvialable() successful\n");
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("The no: of locales where number formattting is applicable is %d\n", numlocales);
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0;i<numlocales;i++)
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("%s\n", unum_getAvailable(i));
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (unum_getAvailable(i) == 0)
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("No locale for which number formatting patterns are applicable\n");
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("A locale %s for which number formatting patterns are applicable\n",unum_getAvailable(i));
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*Testing unum_format() and unum_formatdouble()*/
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(temp1, "$100,000,000.00");
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_format() \n");
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=0;
239103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    pos1.field = UNUM_INTEGER_FIELD;
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlengthneeded=unum_format(cur_def, l, NULL, resultlength, &pos1, &status);
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR)
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=resultlengthneeded+1;
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result=(UChar*)malloc(sizeof(UChar) * resultlength);
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*        for (i = 0; i < 100000; i++) */
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            unum_format(cur_def, l, result, resultlength, &pos1, &status);
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error in formatting using unum_format(.....): %s\n", myErrorName(status) );
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(u_strcmp(result, temp1)==0)
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: Number formatting using unum_format() successful\n");
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Fail: Error in number Formatting using unum_format()\n");
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(pos1.beginIndex == 1 && pos1.endIndex == 12)
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: Complete number formatting using unum_format() successful\n");
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Fail: Error in complete number Formatting using unum_format()\nGot: b=%d end=%d\nExpected: b=1 end=12\n",
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                pos1.beginIndex, pos1.endIndex);
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
26654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    free(result);
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = 0;
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_formatDouble()\n");
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(temp1, "($10,456.37)");
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=0;
272103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    pos2.field = UNUM_FRACTION_FIELD;
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlengthneeded=unum_formatDouble(cur_def, d, NULL, resultlength, &pos2, &status);
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR)
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=resultlengthneeded+1;
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result=(UChar*)malloc(sizeof(UChar) * resultlength);
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*        for (i = 0; i < 100000; i++) */
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            unum_formatDouble(cur_def, d, result, resultlength, &pos2, &status);
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error in formatting using unum_formatDouble(.....): %s\n", myErrorName(status));
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(result && u_strcmp(result, temp1)==0)
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: Number Formatting using unum_formatDouble() Successful\n");
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Error in number formatting using unum_formatDouble()\n");
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(pos2.beginIndex == 9 && pos2.endIndex == 11)
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: Complete number formatting using unum_format() successful\n");
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Fail: Error in complete number Formatting using unum_formatDouble()\nGot: b=%d end=%d\nExpected: b=9 end=11",
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                pos1.beginIndex, pos1.endIndex);
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Testing unum_parse() and unum_parseDouble() */
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_parseDouble()\n");
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*    for (i = 0; i < 100000; i++)*/
30254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    parsepos=0;
30354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if (result != NULL) {
30454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      d1=unum_parseDouble(cur_def, result, u_strlen(result), &parsepos, &status);
30554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    } else {
30654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      log_err("result is NULL\n");
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
30854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(status)) {
30954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      log_err("parse of '%s' failed. Parsepos=%d. The error is  : %s\n", aescstrdup(result,u_strlen(result)),parsepos, myErrorName(status));
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(d1!=d)
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Fail: Error in parsing\n");
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: parsing successful\n");
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (result)
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(result);
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = 0;
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
32054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    status = U_ZERO_ERROR;
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Testing unum_formatDoubleCurrency / unum_parseDoubleCurrency */
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_formatDoubleCurrency\n");
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(temp1, "Y1,235");
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp1[0] = 0xA5; /* Yen sign */
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(temp, "JPY");
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=0;
327103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    pos2.field = UNUM_INTEGER_FIELD;
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlengthneeded=unum_formatDoubleCurrency(cur_def, a, temp, NULL, resultlength, &pos2, &status);
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (status==U_BUFFER_OVERFLOW_ERROR) {
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=resultlengthneeded+1;
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result=(UChar*)malloc(sizeof(UChar) * resultlength);
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_formatDoubleCurrency(cur_def, a, temp, result, resultlength, &pos2, &status);
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error in formatting using unum_formatDouble(.....): %s\n", myErrorName(status));
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (result && u_strcmp(result, temp1)==0) {
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: Number Formatting using unum_formatDouble() Successful\n");
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Error in number formatting using unum_formatDouble()\n");
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (pos2.beginIndex == 1 && pos2.endIndex == 6) {
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: Complete number formatting using unum_format() successful\n");
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Fail: Error in complete number Formatting using unum_formatDouble()\nGot: b=%d end=%d\nExpected: b=1 end=6\n",
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                pos1.beginIndex, pos1.endIndex);
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_parseDoubleCurrency\n");
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    parsepos=0;
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (result == NULL) {
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("result is NULL\n");
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        d1=unum_parseDoubleCurrency(cur_def, result, u_strlen(result), &parsepos, temp2, &status);
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
35854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius          log_err("parseDoubleCurrency '%s' failed. The error is  : %s\n", aescstrdup(result, u_strlen(result)), myErrorName(status));
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Note: a==1234.56, but on parse expect a1=1235.0 */
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (d1!=a1) {
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Fail: Error in parsing currency, got %f, expected %f\n", d1, a1);
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("Pass: parsed currency ammount successfully\n");
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (u_strcmp(temp2, temp)==0) {
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("Pass: parsed correct currency\n");
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Fail: parsed incorrect currency\n");
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
37254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    status = U_ZERO_ERROR; /* reset */
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
37454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    free(result);
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = 0;
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* performance testing */
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(temp1, "$462.12345");
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=u_strlen(temp1);
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*    for (i = 0; i < 100000; i++) */
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        parsepos=0;
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        d1=unum_parseDouble(cur_def, temp1, resultlength, &parsepos, &status);
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
38854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("parseDouble('%s') failed. The error is  : %s\n", aescstrdup(temp1, resultlength), myErrorName(status));
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
39127f654740f2a26ad62a5c155af9199af9e69b889claireho    /*
392b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Note: "for strict standard conformance all operations and constants are now supposed to be
39327f654740f2a26ad62a5c155af9199af9e69b889claireho              evaluated in precision of long double".  So,  we assign a1 before comparing to a double. Bug #7932.
39427f654740f2a26ad62a5c155af9199af9e69b889claireho     */
39527f654740f2a26ad62a5c155af9199af9e69b889claireho    a1 = 462.12345;
39627f654740f2a26ad62a5c155af9199af9e69b889claireho
39727f654740f2a26ad62a5c155af9199af9e69b889claireho    if(d1!=a1)
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Fail: Error in parsing\n");
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: parsing successful\n");
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querufree(result);
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(temp1, "($10,456.3E1])");
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    parsepos=0;
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    d1=unum_parseDouble(cur_def, temp1, u_strlen(temp1), &parsepos, &status);
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status))
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error in unum_parseDouble(..., %s, ...): %s\n", temp1, myErrorName(status));
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_format()\n");
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status=U_ZERO_ERROR;
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=0;
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    parsepos=0;
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlengthneeded=unum_format(per_fr, l, NULL, resultlength, &pos1, &status);
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR)
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=resultlengthneeded+1;
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result=(UChar*)malloc(sizeof(UChar) * resultlength);
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*        for (i = 0; i < 100000; i++)*/
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            unum_format(per_fr, l, result, resultlength, &pos1, &status);
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error in formatting using unum_format(.....): %s\n", myErrorName(status));
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_parse()\n");
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*    for (i = 0; i < 100000; i++) */
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        parsepos=0;
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        l1=unum_parse(per_fr, result, u_strlen(result), &parsepos, &status);
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("parse failed. The error is  : %s\n", myErrorName(status));
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(l1!=l)
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Fail: Error in parsing\n");
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: parsing successful\n");
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querufree(result);
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* create a number format using unum_openPattern(....)*/
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_openPattern()\n");
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(temp1, "#,##0.0#;(#,##0.0#)");
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern=unum_open(UNUM_IGNORE,temp1, u_strlen(temp1), NULL, NULL,&status);
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in unum_openPattern(): %s\n", myErrorName(status) );;
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: unum_openPattern() works fine\n");
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*test for unum_toPattern()*/
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_toPattern()\n");
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=0;
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlengthneeded=unum_toPattern(pattern, FALSE, NULL, resultlength, &status);
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR)
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=resultlengthneeded+1;
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result=(UChar*)malloc(sizeof(UChar) * resultlength);
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_toPattern(pattern, FALSE, result, resultlength, &status);
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in extracting the pattern from UNumberFormat: %s\n", myErrorName(status));
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(u_strcmp(result, temp1)!=0)
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: Error in extracting the pattern using unum_toPattern()\n");
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("Pass: extracted the pattern correctly using unum_toPattern()\n");
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querufree(result);
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*Testing unum_getSymbols() and unum_setSymbols()*/
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_getSymbols and unum_setSymbols()\n");
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*when we try to change the symbols of french to default we need to apply the pattern as well to fetch correct results */
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=0;
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlengthneeded=unum_toPattern(cur_def, FALSE, NULL, resultlength, &status);
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR)
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=resultlengthneeded+1;
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result=(UChar*)malloc(sizeof(UChar) * resultlength);
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_toPattern(cur_def, FALSE, result, resultlength, &status);
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in extracting the pattern from UNumberFormat: %s\n", myErrorName(status));
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status=U_ZERO_ERROR;
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cur_frpattern=unum_open(UNUM_IGNORE,result, u_strlen(result), "fr_FR",NULL, &status);
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in unum_openPattern(): %s\n", myErrorName(status));
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querufree(result);
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*getting the symbols of cur_def */
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*set the symbols of cur_frpattern to cur_def */
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (symType = UNUM_DECIMAL_SEPARATOR_SYMBOL; symType < UNUM_FORMAT_SYMBOL_COUNT; symType++) {
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_getSymbol(cur_def, symType, temp1, sizeof(temp1), &status);
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_setSymbol(cur_frpattern, symType, temp1, -1, &status);
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status))
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error in get/set symbols: %s\n", myErrorName(status));
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*format to check the result */
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=0;
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlengthneeded=unum_format(cur_def, l, NULL, resultlength, &pos1, &status);
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR)
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=resultlengthneeded+1;
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result=(UChar*)malloc(sizeof(UChar) * resultlength);
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_format(cur_def, l, result, resultlength, &pos1, &status);
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error in formatting using unum_format(.....): %s\n", myErrorName(status));
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Fail: error in unum_setSymbols: %s\n", myErrorName(status));
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_applyPattern(cur_frpattern, FALSE, result, u_strlen(result),NULL,NULL);
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (symType = UNUM_DECIMAL_SEPARATOR_SYMBOL; symType < UNUM_FORMAT_SYMBOL_COUNT; symType++) {
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_getSymbol(cur_def, symType, temp1, sizeof(temp1), &status);
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_getSymbol(cur_frpattern, symType, temp2, sizeof(temp2), &status);
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status) || u_strcmp(temp1, temp2) != 0)
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Fail: error in getting symbols\n");
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("Pass: get and set symbols successful\n");
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*format and check with the previous result */
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=0;
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlengthneeded=unum_format(cur_frpattern, l, NULL, resultlength, &pos1, &status);
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR)
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=resultlengthneeded+1;
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_format(cur_frpattern, l, temp1, resultlength, &pos1, &status);
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error in formatting using unum_format(.....): %s\n", myErrorName(status));
570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
571b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* TODO:
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * This test fails because we have not called unum_applyPattern().
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Currently, such an applyPattern() does not exist on the C API, and
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * we have jitterbug 411 for it.
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Since it is close to the 1.5 release, I (markus) am disabling this test just
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * for this release (I added the test itself only last week).
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * For the next release, we need to fix this.
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Then, remove the uprv_strcmp("1.5", ...) and this comment, and the include "cstring.h" at the beginning of this file.
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(u_strcmp(result, temp1) != 0) {
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Formatting failed after setting symbols. result=%s temp1=%s\n", result, temp1);
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*----------- */
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querufree(result);
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Testing unum_get/setSymbol() */
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i < UNUM_FORMAT_SYMBOL_COUNT; ++i) {
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        symbol[0] = (UChar)(0x41 + i);
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        symbol[1] = (UChar)(0x61 + i);
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_setSymbol(cur_frpattern, (UNumberFormatSymbol)i, symbol, 2, &status);
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)) {
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error from unum_setSymbol(%d): %s\n", i, myErrorName(status));
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i < UNUM_FORMAT_SYMBOL_COUNT; ++i) {
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength = unum_getSymbol(cur_frpattern, (UNumberFormatSymbol)i, symbol, sizeof(symbol)/U_SIZEOF_UCHAR, &status);
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)) {
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error from unum_getSymbol(%d): %s\n", i, myErrorName(status));
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(resultlength != 2 || symbol[0] != 0x41 + i || symbol[1] != 0x61 + i) {
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Failure in unum_getSymbol(%d): got unexpected symbol\n", i);
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*try getting from a bogus symbol*/
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_getSymbol(cur_frpattern, (UNumberFormatSymbol)i, symbol, sizeof(symbol)/U_SIZEOF_UCHAR, &status);
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status)){
612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error : Expected U_ILLEGAL_ARGUMENT_ERROR for bogus symbol");
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status != U_ILLEGAL_ARGUMENT_ERROR){
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error: Expected U_ILLEGAL_ARGUMENT_ERROR for bogus symbol, Got %s\n", myErrorName(status));
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status=U_ZERO_ERROR;
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Testing unum_getTextAttribute() and unum_setTextAttribute()*/
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting getting and setting text attributes\n");
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=5;
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_getTextAttribute(cur_fr, UNUM_NEGATIVE_SUFFIX, temp, resultlength, &status);
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Failure in gettting the Text attributes of number format: %s\n", myErrorName(status));
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_setTextAttribute(cur_def, UNUM_NEGATIVE_SUFFIX, temp, u_strlen(temp), &status);
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Failure in gettting the Text attributes of number format: %s\n", myErrorName(status));
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_getTextAttribute(cur_def, UNUM_NEGATIVE_SUFFIX, suffix, resultlength, &status);
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Failure in gettting the Text attributes of number format: %s\n", myErrorName(status));
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(u_strcmp(suffix,temp)!=0)
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Fail:Error in setTextAttribute or getTextAttribute in setting and getting suffix\n");
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: setting and getting suffix works fine\n");
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*set it back to normal */
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(temp,"$");
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_setTextAttribute(cur_def, UNUM_NEGATIVE_SUFFIX, temp, u_strlen(temp), &status);
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*checking some more text setter conditions */
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(prefix, "+");
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_setTextAttribute(def, UNUM_POSITIVE_PREFIX, prefix, u_strlen(prefix) , &status);
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in setting the text attributes : %s\n", myErrorName(status));
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_getTextAttribute(def, UNUM_POSITIVE_PREFIX, temp, resultlength, &status);
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in getting the text attributes : %s\n", myErrorName(status));
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
660b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(u_strcmp(prefix, temp)!=0)
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ERROR: get and setTextAttributes with positive prefix failed\n");
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: get and setTextAttributes with positive prefix works fine\n");
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(prefix, "+");
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_setTextAttribute(def, UNUM_NEGATIVE_PREFIX, prefix, u_strlen(prefix), &status);
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in setting the text attributes : %s\n", myErrorName(status));
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_getTextAttribute(def, UNUM_NEGATIVE_PREFIX, temp, resultlength, &status);
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in getting the text attributes : %s\n", myErrorName(status));
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
676b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(u_strcmp(prefix, temp)!=0)
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ERROR: get and setTextAttributes with negative prefix failed\n");
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: get and setTextAttributes with negative prefix works fine\n");
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(suffix, "+");
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_setTextAttribute(def, UNUM_NEGATIVE_SUFFIX, suffix, u_strlen(suffix) , &status);
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in setting the text attributes: %s\n", myErrorName(status));
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_getTextAttribute(def, UNUM_NEGATIVE_SUFFIX, temp, resultlength, &status);
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in getting the text attributes : %s\n", myErrorName(status));
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
693b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(u_strcmp(suffix, temp)!=0)
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ERROR: get and setTextAttributes with negative suffix failed\n");
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: get and settextAttributes with negative suffix works fine\n");
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(suffix, "++");
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_setTextAttribute(def, UNUM_POSITIVE_SUFFIX, suffix, u_strlen(suffix) , &status);
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in setting the text attributes: %s\n", myErrorName(status));
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_getTextAttribute(def, UNUM_POSITIVE_SUFFIX, temp, resultlength, &status);
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in getting the text attributes : %s\n", myErrorName(status));
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
710b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(u_strcmp(suffix, temp)!=0)
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ERROR: get and setTextAttributes with negative suffix failed\n");
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: get and settextAttributes with negative suffix works fine\n");
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*Testing unum_getAttribute and  unum_setAttribute() */
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting get and set Attributes\n");
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    attr=UNUM_GROUPING_SIZE;
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    newvalue=unum_getAttribute(def, attr);
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    newvalue=2;
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_setAttribute(def, attr, newvalue);
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(unum_getAttribute(def,attr)!=2)
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Fail: error in setting and getting attributes for UNUM_GROUPING_SIZE\n");
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: setting and getting attributes for UNUM_GROUPING_SIZE works fine\n");
725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    attr=UNUM_MULTIPLIER;
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    newvalue=unum_getAttribute(def, attr);
728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    newvalue=8;
729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_setAttribute(def, attr, newvalue);
730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(unum_getAttribute(def,attr) != 8)
731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in setting and getting attributes for UNUM_MULTIPLIER\n");
732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass:setting and getting attributes for UNUM_MULTIPLIER works fine\n");
734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    attr=UNUM_SECONDARY_GROUPING_SIZE;
736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    newvalue=unum_getAttribute(def, attr);
737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    newvalue=2;
738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_setAttribute(def, attr, newvalue);
739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(unum_getAttribute(def,attr) != 2)
740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in setting and getting attributes for UNUM_SECONDARY_GROUPING_SIZE\n");
741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass:setting and getting attributes for UNUM_SECONDARY_GROUPING_SIZE works fine\n");
743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*testing set and get Attributes extensively */
745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting get and set attributes extensively\n");
746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(attr=UNUM_PARSE_INT_ONLY; attr<= UNUM_PADDING_POSITION; attr=(UNumberFormatAttribute)((int32_t)attr + 1) )
747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        newvalue=unum_getAttribute(fr, attr);
749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_setAttribute(def, attr, newvalue);
750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(unum_getAttribute(def,attr)!=unum_getAttribute(fr, attr))
751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error in setting and getting attributes\n");
752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("Pass: attributes set and retrieved successfully\n");
754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*testing spellout format to make sure we can use it successfully.*/
757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting spellout format\n");
758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (spellout_def)
759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const int32_t values[] = { 0, -5, 105, 1005, 105050 };
761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i = 0; i < LENGTH(values); ++i) {
762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UChar buffer[128];
763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t len;
764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t value = values[i];
765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            len = unum_format(spellout_def, value, buffer, LENGTH(buffer), NULL, &status);
767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(U_FAILURE(status)) {
768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Error in formatting using unum_format(spellout_fmt, ...): %s\n", myErrorName(status));
769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                int32_t pp = 0;
771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                int32_t parseResult;
77254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                /*ustrToAstr(buffer, len, logbuf, LENGTH(logbuf));*/
77354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                log_verbose("formatted %d as '%s', length: %d\n", value, aescstrdup(buffer, len), len);
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                parseResult = unum_parse(spellout_def, buffer, len, &pp, &status);
776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (U_FAILURE(status)) {
777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("Error in parsing using unum_format(spellout_fmt, ...): %s\n", myErrorName(status));
778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                } else if (parseResult != value) {
779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("unum_format result %d != value %d\n", parseResult, value);
780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Spellout format is unavailable\n");
786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
78850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {    /* Test for ticket #7079 */
78950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UNumberFormat* dec_en;
79050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UChar groupingSep[] = { 0 };
79150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UChar numPercent[] = { 0x0031, 0x0032, 0x0025, 0 }; /* "12%" */
79250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        double parseResult = 0.0;
793b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
79450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status=U_ZERO_ERROR;
79550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        dec_en = unum_open(UNUM_DECIMAL, NULL, 0, "en_US", NULL, &status);
79650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        unum_setAttribute(dec_en, UNUM_LENIENT_PARSE, 0);
79750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        unum_setSymbol(dec_en, UNUM_GROUPING_SEPARATOR_SYMBOL, groupingSep, 0, &status);
79850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        parseResult = unum_parseDouble(dec_en, numPercent, -1, NULL, &status);
79950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* Without the fix in #7079, the above call will hang */
80050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if ( U_FAILURE(status) || parseResult != 12.0 ) {
80150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            log_err("unum_parseDouble with empty groupingSep: status %s, parseResult %f not 12.0\n",
80250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                    myErrorName(status), parseResult);
80350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        } else {
80450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            log_verbose("unum_parseDouble with empty groupingSep: no hang, OK\n");
80550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
80650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        unum_close(dec_en);
80750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
808b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
80927f654740f2a26ad62a5c155af9199af9e69b889claireho    {   /* Test parse & format of big decimals.  Use a number with too many digits to fit in a double,
81027f654740f2a26ad62a5c155af9199af9e69b889claireho                                         to verify that it is taking the pure decimal path. */
81127f654740f2a26ad62a5c155af9199af9e69b889claireho        UNumberFormat *fmt;
812b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        const char *bdpattern = "#,##0.#########";
813b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        const char *numInitial     = "12345678900987654321.1234567896";
81427f654740f2a26ad62a5c155af9199af9e69b889claireho        const char *numFormatted  = "12,345,678,900,987,654,321.12345679";
81527f654740f2a26ad62a5c155af9199af9e69b889claireho        const char *parseExpected = "12345678900987654321.12345679";
81627f654740f2a26ad62a5c155af9199af9e69b889claireho        int32_t resultSize    = 0;
81727f654740f2a26ad62a5c155af9199af9e69b889claireho        int32_t parsePos      = 0;     /* Output parameter for Parse operations. */
81827f654740f2a26ad62a5c155af9199af9e69b889claireho        #define DESTCAPACITY 100
81927f654740f2a26ad62a5c155af9199af9e69b889claireho        UChar dest[DESTCAPACITY];
82027f654740f2a26ad62a5c155af9199af9e69b889claireho        char  desta[DESTCAPACITY];
82127f654740f2a26ad62a5c155af9199af9e69b889claireho        UFieldPosition fieldPos = {0};
82227f654740f2a26ad62a5c155af9199af9e69b889claireho
82327f654740f2a26ad62a5c155af9199af9e69b889claireho        /* Format */
82427f654740f2a26ad62a5c155af9199af9e69b889claireho
82527f654740f2a26ad62a5c155af9199af9e69b889claireho        status = U_ZERO_ERROR;
82627f654740f2a26ad62a5c155af9199af9e69b889claireho        u_uastrcpy(dest, bdpattern);
82727f654740f2a26ad62a5c155af9199af9e69b889claireho        fmt = unum_open(UNUM_PATTERN_DECIMAL, dest, -1, "en", NULL /*parseError*/, &status);
82827f654740f2a26ad62a5c155af9199af9e69b889claireho        if (U_FAILURE(status)) log_err("File %s, Line %d, status = %s\n", __FILE__, __LINE__, u_errorName(status));
82927f654740f2a26ad62a5c155af9199af9e69b889claireho
830b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        resultSize = unum_formatDecimal(fmt, numInitial, -1, dest, DESTCAPACITY, NULL, &status);
83127f654740f2a26ad62a5c155af9199af9e69b889claireho        if (U_FAILURE(status)) {
83227f654740f2a26ad62a5c155af9199af9e69b889claireho            log_err("File %s, Line %d, status = %s\n", __FILE__, __LINE__, u_errorName(status));
83327f654740f2a26ad62a5c155af9199af9e69b889claireho        }
83427f654740f2a26ad62a5c155af9199af9e69b889claireho        u_austrncpy(desta, dest, DESTCAPACITY);
83527f654740f2a26ad62a5c155af9199af9e69b889claireho        if (strcmp(numFormatted, desta) != 0) {
83627f654740f2a26ad62a5c155af9199af9e69b889claireho            log_err("File %s, Line %d, (expected, acutal) =  (\"%s\", \"%s\")\n",
83727f654740f2a26ad62a5c155af9199af9e69b889claireho                    __FILE__, __LINE__, numFormatted, desta);
83827f654740f2a26ad62a5c155af9199af9e69b889claireho        }
83927f654740f2a26ad62a5c155af9199af9e69b889claireho        if (strlen(numFormatted) != resultSize) {
840b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err("File %s, Line %d, (expected, actual) = (%d, %d)\n",
84127f654740f2a26ad62a5c155af9199af9e69b889claireho                     __FILE__, __LINE__, strlen(numFormatted), resultSize);
84227f654740f2a26ad62a5c155af9199af9e69b889claireho        }
84327f654740f2a26ad62a5c155af9199af9e69b889claireho
84427f654740f2a26ad62a5c155af9199af9e69b889claireho        /* Format with a FieldPosition parameter */
84527f654740f2a26ad62a5c155af9199af9e69b889claireho
846103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        fieldPos.field = UNUM_DECIMAL_SEPARATOR_FIELD;
847b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        resultSize = unum_formatDecimal(fmt, numInitial, -1, dest, DESTCAPACITY, &fieldPos, &status);
84827f654740f2a26ad62a5c155af9199af9e69b889claireho        if (U_FAILURE(status)) {
84927f654740f2a26ad62a5c155af9199af9e69b889claireho            log_err("File %s, Line %d, status = %s\n", __FILE__, __LINE__, u_errorName(status));
85027f654740f2a26ad62a5c155af9199af9e69b889claireho        }
85127f654740f2a26ad62a5c155af9199af9e69b889claireho        u_austrncpy(desta, dest, DESTCAPACITY);
85227f654740f2a26ad62a5c155af9199af9e69b889claireho        if (strcmp(numFormatted, desta) != 0) {
85327f654740f2a26ad62a5c155af9199af9e69b889claireho            log_err("File %s, Line %d, (expected, acutal) =  (\"%s\", \"%s\")\n",
85427f654740f2a26ad62a5c155af9199af9e69b889claireho                    __FILE__, __LINE__, numFormatted, desta);
85527f654740f2a26ad62a5c155af9199af9e69b889claireho        }
85627f654740f2a26ad62a5c155af9199af9e69b889claireho        if (fieldPos.beginIndex != 26) {  /* index of "." in formatted number */
85727f654740f2a26ad62a5c155af9199af9e69b889claireho            log_err("File %s, Line %d, (expected, acutal) =  (%d, %d)\n",
85827f654740f2a26ad62a5c155af9199af9e69b889claireho                    __FILE__, __LINE__, 0, fieldPos.beginIndex);
85927f654740f2a26ad62a5c155af9199af9e69b889claireho        }
86027f654740f2a26ad62a5c155af9199af9e69b889claireho        if (fieldPos.endIndex != 27) {
86127f654740f2a26ad62a5c155af9199af9e69b889claireho            log_err("File %s, Line %d, (expected, acutal) =  (%d, %d)\n",
86227f654740f2a26ad62a5c155af9199af9e69b889claireho                    __FILE__, __LINE__, 0, fieldPos.endIndex);
86327f654740f2a26ad62a5c155af9199af9e69b889claireho        }
864b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
86527f654740f2a26ad62a5c155af9199af9e69b889claireho        /* Parse */
86627f654740f2a26ad62a5c155af9199af9e69b889claireho
86727f654740f2a26ad62a5c155af9199af9e69b889claireho        status = U_ZERO_ERROR;
86827f654740f2a26ad62a5c155af9199af9e69b889claireho        u_uastrcpy(dest, numFormatted);   /* Parse the expected output of the formatting test */
86927f654740f2a26ad62a5c155af9199af9e69b889claireho        resultSize = unum_parseDecimal(fmt, dest, -1, NULL, desta, DESTCAPACITY, &status);
87027f654740f2a26ad62a5c155af9199af9e69b889claireho        if (U_FAILURE(status)) {
87127f654740f2a26ad62a5c155af9199af9e69b889claireho            log_err("File %s, Line %d, status = %s\n", __FILE__, __LINE__, u_errorName(status));
87227f654740f2a26ad62a5c155af9199af9e69b889claireho        }
87327f654740f2a26ad62a5c155af9199af9e69b889claireho        if (strcmp(parseExpected, desta) != 0) {
87427f654740f2a26ad62a5c155af9199af9e69b889claireho            log_err("File %s, Line %d, (expected, actual) = (\"%s\", \"%s\")\n",
87527f654740f2a26ad62a5c155af9199af9e69b889claireho                    __FILE__, __LINE__, parseExpected, desta);
87627f654740f2a26ad62a5c155af9199af9e69b889claireho        }
87727f654740f2a26ad62a5c155af9199af9e69b889claireho        if (strlen(parseExpected) != resultSize) {
87827f654740f2a26ad62a5c155af9199af9e69b889claireho            log_err("File %s, Line %d, (expected, actual) = (%d, %d)\n",
87927f654740f2a26ad62a5c155af9199af9e69b889claireho                    __FILE__, __LINE__, strlen(parseExpected), resultSize);
88027f654740f2a26ad62a5c155af9199af9e69b889claireho        }
88127f654740f2a26ad62a5c155af9199af9e69b889claireho
88227f654740f2a26ad62a5c155af9199af9e69b889claireho        /* Parse with a parsePos parameter */
883b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
88427f654740f2a26ad62a5c155af9199af9e69b889claireho        status = U_ZERO_ERROR;
88527f654740f2a26ad62a5c155af9199af9e69b889claireho        u_uastrcpy(dest, numFormatted);   /* Parse the expected output of the formatting test */
88627f654740f2a26ad62a5c155af9199af9e69b889claireho        parsePos = 3;                 /*      12,345,678,900,987,654,321.12345679         */
88727f654740f2a26ad62a5c155af9199af9e69b889claireho                                      /* start parsing at the the third char              */
88827f654740f2a26ad62a5c155af9199af9e69b889claireho        resultSize = unum_parseDecimal(fmt, dest, -1, &parsePos, desta, DESTCAPACITY, &status);
88927f654740f2a26ad62a5c155af9199af9e69b889claireho        if (U_FAILURE(status)) {
89027f654740f2a26ad62a5c155af9199af9e69b889claireho            log_err("File %s, Line %d, status = %s\n", __FILE__, __LINE__, u_errorName(status));
89127f654740f2a26ad62a5c155af9199af9e69b889claireho        }
89227f654740f2a26ad62a5c155af9199af9e69b889claireho        if (strcmp(parseExpected+2, desta) != 0) {   /*  "345678900987654321.12345679" */
89327f654740f2a26ad62a5c155af9199af9e69b889claireho            log_err("File %s, Line %d, (expected, actual) = (\"%s\", \"%s\")\n",
89427f654740f2a26ad62a5c155af9199af9e69b889claireho                    __FILE__, __LINE__, parseExpected+2, desta);
89527f654740f2a26ad62a5c155af9199af9e69b889claireho        }
89627f654740f2a26ad62a5c155af9199af9e69b889claireho        if (strlen(numFormatted) != parsePos) {
89727f654740f2a26ad62a5c155af9199af9e69b889claireho            log_err("File %s, Line %d, parsePos (expected, actual) = (\"%d\", \"%d\")\n",
89827f654740f2a26ad62a5c155af9199af9e69b889claireho                    __FILE__, __LINE__, strlen(parseExpected), parsePos);
89927f654740f2a26ad62a5c155af9199af9e69b889claireho        }
90027f654740f2a26ad62a5c155af9199af9e69b889claireho
90127f654740f2a26ad62a5c155af9199af9e69b889claireho        unum_close(fmt);
90227f654740f2a26ad62a5c155af9199af9e69b889claireho    }
90327f654740f2a26ad62a5c155af9199af9e69b889claireho
904b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    status = U_ZERO_ERROR;
905b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* Test invalid symbol argument */
906b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    {
907b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t badsymbolLarge = UNUM_FORMAT_SYMBOL_COUNT + 1;
908b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t badsymbolSmall = -1;
909b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UChar value[10];
910b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t valueLength = 10;
911b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UNumberFormat *fmt = unum_open(UNUM_DEFAULT, NULL, 0, NULL, NULL, &status);
912b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (U_FAILURE(status)) {
913b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err("File %s, Line %d, status = %s\n", __FILE__, __LINE__, u_errorName(status));
914b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        } else {
915b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            unum_getSymbol(fmt, (UNumberFormatSymbol)badsymbolLarge, NULL, 0, &status);
916b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (U_SUCCESS(status)) log_err("unum_getSymbol()'s status should be ILLEGAL_ARGUMENT with invalid symbol (> UNUM_FORMAT_SYMBOL_COUNT) argument\n");
917b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
918b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            status = U_ZERO_ERROR;
919b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            unum_getSymbol(fmt, (UNumberFormatSymbol)badsymbolSmall, NULL, 0, &status);
920b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (U_SUCCESS(status)) log_err("unum_getSymbol()'s status should be ILLEGAL_ARGUMENT with invalid symbol (less than 0) argument\n");
921b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
922b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            status = U_ZERO_ERROR;
923b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            unum_setSymbol(fmt, (UNumberFormatSymbol)badsymbolLarge, value, valueLength, &status);
924b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (U_SUCCESS(status)) log_err("unum_setSymbol()'s status should be ILLEGAL_ARGUMENT with invalid symbol (> UNUM_FORMAT_SYMBOL_COUNT) argument\n");
925b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
926b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            status = U_ZERO_ERROR;
927b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            unum_setSymbol(fmt, (UNumberFormatSymbol)badsymbolSmall, value, valueLength, &status);
928b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (U_SUCCESS(status)) log_err("unum_setSymbol()'s status should be ILLEGAL_ARGUMENT with invalid symbol (less than 0) argument\n");
929b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
930b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            unum_close(fmt);
931b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
932b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
933b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
93450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*closing the NumberFormat() using unum_close(UNumberFormat*)")*/
936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(def);
937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(fr);
938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(cur_def);
939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(cur_fr);
940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(per_def);
941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(per_fr);
942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(spellout_def);
943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(pattern);
944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(cur_frpattern);
945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(myclone);
946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
949b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestParseZero(void)
950b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{
951b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UErrorCode errorCode = U_ZERO_ERROR;
952b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UChar input[] = {0x30, 0};   /*  Input text is decimal '0' */
953b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UChar pat[] = {0x0023,0x003b,0x0023,0}; /*  {'#', ';', '#', 0}; */
954b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    double  dbl;
955b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
956b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#if 0
957b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UNumberFormat* unum = unum_open( UNUM_DECIMAL /*or UNUM_DEFAULT*/, NULL, -1, NULL, NULL, &errorCode);
958b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#else
959b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UNumberFormat* unum = unum_open( UNUM_PATTERN_DECIMAL /*needs pattern*/, pat, -1, NULL, NULL, &errorCode);
960b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#endif
961b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
962b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    dbl = unum_parseDouble( unum, input, -1 /*u_strlen(input)*/, 0 /* 0 = start */, &errorCode );
963b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (U_FAILURE(errorCode)) {
964b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_data_err("Result - %s\n", u_errorName(errorCode));
965b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } else {
966b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_verbose("Double: %f\n", dbl);
967b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
968b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    unum_close(unum);
969b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
970b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
971b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar dollars2Sym[] = { 0x24,0x32,0x2E,0x30,0x30,0 }; /* $2.00 */
972b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar dollars4Sym[] = { 0x24,0x34,0 }; /* $4 */
973b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar dollars9Sym[] = { 0x39,0xA0,0x24,0 }; /* 9 $ */
974b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar pounds3Sym[]  = { 0xA3,0x33,0x2E,0x30,0x30,0 }; /* [POUND]3.00 */
975b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar pounds5Sym[]  = { 0xA3,0x35,0 }; /* [POUND]5 */
976b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar pounds7Sym[]  = { 0x37,0xA0,0xA3,0 }; /* 7 [POUND] */
977b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar euros4Sym[]   = { 0x34,0x2C,0x30,0x30,0xA0,0x20AC,0 }; /* 4,00 [EURO] */
978b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar euros6Sym[]   = { 0x36,0xA0,0x20AC,0 }; /* 6 [EURO] */
979b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar euros8Sym[]   = { 0x20AC,0x38,0 }; /* [EURO]8 */
980b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar dollars4PluEn[] = { 0x34,0x20,0x55,0x53,0x20,0x64,0x6F,0x6C,0x6C,0x61,0x72,0x73,0 }; /* 4 US dollars*/
981b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar pounds5PluEn[]  = { 0x35,0x20,0x42,0x72,0x69,0x74,0x69,0x73,0x68,0x20,0x70,0x6F,0x75,0x6E,0x64,0x73,0x20,0x73,0x74,0x65,0x72,0x6C,0x69,0x6E,0x67,0 }; /* 5 British pounds sterling */
982b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar euros8PluEn[]   = { 0x38,0x20,0x65,0x75,0x72,0x6F,0x73,0 }; /* 8 euros*/
983b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar euros6PluFr[]   = { 0x36,0x20,0x65,0x75,0x72,0x6F,0x73,0 }; /* 6 euros*/
984b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
985b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehotypedef struct {
986b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const char *  locale;
987b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const char *  descrip;
988b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const UChar * currStr;
989b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const UChar * plurStr;
990b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UErrorCode    parsDoubExpectErr;
991b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t       parsDoubExpectPos;
992b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    double        parsDoubExpectVal;
993b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UErrorCode    parsCurrExpectErr;
994b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t       parsCurrExpectPos;
995b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    double        parsCurrExpectVal;
996b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const char *  parsCurrExpectCurr;
997b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} ParseCurrencyItem;
998b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
999b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const ParseCurrencyItem parseCurrencyItems[] = {
1000b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en_US", "dollars2", dollars2Sym, NULL,          U_ZERO_ERROR,  5, 2.0, U_ZERO_ERROR,  5, 2.0, "USD" },
1001b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en_US", "dollars4", dollars4Sym, dollars4PluEn, U_ZERO_ERROR,  2, 4.0, U_ZERO_ERROR,  2, 4.0, "USD" },
1002b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en_US", "dollars9", dollars9Sym, NULL,          U_PARSE_ERROR, 1, 0.0, U_PARSE_ERROR, 1, 0.0, ""    },
1003b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en_US", "pounds3",  pounds3Sym,  NULL,          U_PARSE_ERROR, 0, 0.0, U_ZERO_ERROR,  5, 3.0, "GBP" },
1004b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en_US", "pounds5",  pounds5Sym,  pounds5PluEn,  U_PARSE_ERROR, 0, 0.0, U_ZERO_ERROR,  2, 5.0, "GBP" },
1005b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en_US", "pounds7",  pounds7Sym,  NULL,          U_PARSE_ERROR, 1, 0.0, U_PARSE_ERROR, 1, 0.0, ""    },
1006b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en_US", "euros8",   euros8Sym,   euros8PluEn,   U_PARSE_ERROR, 0, 0.0, U_ZERO_ERROR,  2, 8.0, "EUR" },
1007b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1008b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en_GB", "pounds3",  pounds3Sym,  NULL,          U_ZERO_ERROR,  5, 3.0, U_ZERO_ERROR,  5, 3.0, "GBP" },
1009b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en_GB", "pounds5",  pounds5Sym,  pounds5PluEn,  U_ZERO_ERROR,  2, 5.0, U_ZERO_ERROR,  2, 5.0, "GBP" },
1010b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en_GB", "pounds7",  pounds7Sym,  NULL,          U_PARSE_ERROR, 1, 0.0, U_PARSE_ERROR, 1, 0.0, ""    },
1011b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en_GB", "euros4",   euros4Sym,   NULL,          U_PARSE_ERROR, 4, 0.0, U_PARSE_ERROR, 4, 0.0, ""    },
1012b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en_GB", "euros6",   euros6Sym,   NULL,          U_PARSE_ERROR, 1, 0.0, U_PARSE_ERROR, 1, 0.0, ""    },
1013b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en_GB", "euros8",   euros8Sym,   euros8PluEn,   U_PARSE_ERROR, 0, 0.0, U_ZERO_ERROR,  2, 8.0, "EUR" },
1014b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en_GB", "dollars4", dollars4Sym, dollars4PluEn, U_PARSE_ERROR, 0, 0.0, U_ZERO_ERROR,  2, 4.0, "USD" },
1015b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1016b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "fr_FR", "euros4",   euros4Sym,   NULL,          U_ZERO_ERROR,  6, 4.0, U_ZERO_ERROR,  6, 4.0, "EUR" },
1017b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "fr_FR", "euros6",   euros6Sym,   euros6PluFr,   U_ZERO_ERROR,  3, 6.0, U_ZERO_ERROR,  3, 6.0, "EUR" },
1018b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "fr_FR", "euros8",   euros8Sym,   NULL,          U_PARSE_ERROR, 0, 0.0, U_PARSE_ERROR, 0, 0.0, ""    },
1019b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "fr_FR", "dollars2", dollars2Sym, NULL,          U_PARSE_ERROR, 0, 0.0, U_PARSE_ERROR, 0, 0.0, ""    },
1020b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "fr_FR", "dollars4", dollars4Sym, NULL,          U_PARSE_ERROR, 0, 0.0, U_PARSE_ERROR, 0, 0.0, ""    },
1021b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1022b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { NULL,    NULL,       NULL,        NULL,          0,             0, 0.0, 0,             0, 0.0, NULL  }
1023b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
1024b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1025b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestParseCurrency()
1026b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{
1027b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const ParseCurrencyItem * itemPtr;
1028b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for (itemPtr = parseCurrencyItems; itemPtr->locale != NULL; ++itemPtr) {
1029b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UNumberFormat* unum;
1030b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UErrorCode status;
1031b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        double parseVal;
1032b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t parsePos;
1033b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UChar parseCurr[4];
1034b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        char parseCurrB[4];
1035b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1036b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        status = U_ZERO_ERROR;
1037b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        unum = unum_open(UNUM_CURRENCY, NULL, 0, itemPtr->locale, NULL, &status);
1038b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (U_SUCCESS(status)) {
1039b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            status = U_ZERO_ERROR;
1040b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            parsePos = 0;
1041b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            parseVal = unum_parseDouble(unum, itemPtr->currStr, -1, &parsePos, &status);
1042b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (status != itemPtr->parsDoubExpectErr || parsePos != itemPtr->parsDoubExpectPos || parseVal != itemPtr->parsDoubExpectVal) {
1043b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                log_err("UNUM_CURRENCY parseDouble %s/%s, expect %s pos %d val %.1f, get %s pos %d val %.1f\n",
1044b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        itemPtr->locale, itemPtr->descrip,
1045b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        u_errorName(itemPtr->parsDoubExpectErr), itemPtr->parsDoubExpectPos, itemPtr->parsDoubExpectVal,
1046b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        u_errorName(status), parsePos, parseVal );
1047b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
1048b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            status = U_ZERO_ERROR;
1049b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            parsePos = 0;
1050b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            parseCurr[0] = 0;
1051b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            parseVal = unum_parseDoubleCurrency(unum, itemPtr->currStr, -1, &parsePos, parseCurr, &status);
1052b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            u_austrncpy(parseCurrB, parseCurr, 4);
1053b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (status != itemPtr->parsCurrExpectErr || parsePos != itemPtr->parsCurrExpectPos || parseVal != itemPtr->parsCurrExpectVal ||
1054b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    strncmp(parseCurrB, itemPtr->parsCurrExpectCurr, 4) != 0) {
1055b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                log_err("UNUM_CURRENCY parseDoubleCurrency %s/%s, expect %s pos %d val %.1f cur %s, get %s pos %d val %.1f cur %s\n",
1056b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        itemPtr->locale, itemPtr->descrip,
1057b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        u_errorName(itemPtr->parsCurrExpectErr), itemPtr->parsCurrExpectPos, itemPtr->parsCurrExpectVal, itemPtr->parsCurrExpectCurr,
1058b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        u_errorName(status), parsePos, parseVal, parseCurrB );
1059b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
1060b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            unum_close(unum);
1061b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        } else {
1062b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_data_err("unexpected error in unum_open UNUM_CURRENCY for locale %s: '%s'\n", itemPtr->locale, u_errorName(status));
1063b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
1064b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1065b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#if 0
1066b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        /* Hmm, for UNUM_CURRENCY_PLURAL, currently unum_open always sets U_UNSUPPORTED_ERROR, save this test until it is supported */
1067b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (itemPtr->plurStr != NULL) {
1068b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            status = U_ZERO_ERROR;
1069b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            unum = unum_open(UNUM_CURRENCY_PLURAL, NULL, 0, itemPtr->locale, NULL, &status);
1070b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (U_SUCCESS(status)) {
1071b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                status = U_ZERO_ERROR;
1072b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                parsePos = 0;
1073b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                parseVal = unum_parseDouble(unum, itemPtr->plurStr, -1, &parsePos, &status);
1074b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                if (status != itemPtr->parsDoubExpectErr || parseVal != itemPtr->parsDoubExpectVal) {
1075b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    log_err("UNUM_CURRENCY parseDouble %s/%s, expect %s val %.1f, get %s val %.1f\n",
1076b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            itemPtr->locale, itemPtr->descrip,
1077b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            u_errorName(itemPtr->parsDoubExpectErr), itemPtr->parsDoubExpectVal,
1078b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            u_errorName(status), parseVal );
1079b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                }
1080b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                status = U_ZERO_ERROR;
1081b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                parsePos = 0;
1082b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                parseCurr[0] = 0;
1083b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                parseVal = unum_parseDoubleCurrency(unum, itemPtr->plurStr, -1, &parsePos, parseCurr, &status);
1084b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                u_austrncpy(parseCurrB, parseCurr, 4);
1085b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                if (status != itemPtr->parsCurrExpectErr || parseVal != itemPtr->parsCurrExpectVal ||
1086b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        strncmp(parseCurrB, itemPtr->parsCurrExpectCurr, 4) != 0) {
1087b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    log_err("UNUM_CURRENCY parseDoubleCurrency %s/%s, expect %s val %.1f cur %s, get %s val %.1f cur %s\n",
1088b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            itemPtr->locale, itemPtr->descrip,
1089b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            u_errorName(itemPtr->parsCurrExpectErr), itemPtr->parsCurrExpectVal, itemPtr->parsCurrExpectCurr,
1090b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            u_errorName(status), parseVal, parseCurrB );
1091b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                }
1092b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                unum_close(unum);
1093b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            } else {
1094b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                log_data_err("unexpected error in unum_open UNUM_CURRENCY_PLURAL for locale %s: '%s'\n", itemPtr->locale, u_errorName(status));
1095b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
1096b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
1097b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#endif
1098b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
1099b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
1100b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1101b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querutypedef struct {
1102b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const char *  testname;
1103b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const char *  locale;
1104b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const UChar * source;
1105b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t       startPos;
1106b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t       value;
1107b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t       endPos;
1108b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UErrorCode    status;
1109b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} SpelloutParseTest;
1110b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1111b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const UChar ustr_en0[]   = {0x7A, 0x65, 0x72, 0x6F, 0}; /* zero */
1112b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const UChar ustr_123[]   = {0x31, 0x32, 0x33, 0};       /* 123 */
1113b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const UChar ustr_en123[] = {0x6f, 0x6e, 0x65, 0x20, 0x68, 0x75, 0x6e, 0x64, 0x72, 0x65, 0x64,
1114b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                   0x20, 0x74, 0x77, 0x65, 0x6e, 0x74, 0x79,
1115b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                   0x2d, 0x74, 0x68, 0x72, 0x65, 0x65, 0}; /* one hundred twenty-three */
1116b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const UChar ustr_fr123[] = {0x63, 0x65, 0x6e, 0x74, 0x2d, 0x76, 0x69, 0x6e, 0x67, 0x74, 0x2d,
1117b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                   0x74, 0x72, 0x6f, 0x69, 0x73, 0};       /* cent-vingt-trois */
1118b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const UChar ustr_ja123[] = {0x767e, 0x4e8c, 0x5341, 0x4e09, 0};     /* kanji 100(+)2(*)10(+)3 */
1119b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1120b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const SpelloutParseTest spelloutParseTests[] = {
1121b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /* name    loc   src       start val  end status */
1122b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "en0",   "en", ustr_en0,    0,   0,  4, U_ZERO_ERROR },
1123b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "en0",   "en", ustr_en0,    2,   0,  2, U_PARSE_ERROR },
1124b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "en0",   "ja", ustr_en0,    0,   0,  0, U_PARSE_ERROR },
1125b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "123",   "en", ustr_123,    0, 123,  3, U_ZERO_ERROR },
1126b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "en123", "en", ustr_en123,  0, 123, 24, U_ZERO_ERROR },
1127b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "en123", "en", ustr_en123, 12,  23, 24, U_ZERO_ERROR },
1128b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "en123", "fr", ustr_en123, 16,   0, 16, U_PARSE_ERROR },
1129b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "fr123", "fr", ustr_fr123,  0, 123, 16, U_ZERO_ERROR },
1130b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "fr123", "fr", ustr_fr123,  5,  23, 16, U_ZERO_ERROR },
1131b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "fr123", "en", ustr_fr123,  0,   0,  0, U_PARSE_ERROR },
1132b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "ja123", "ja", ustr_ja123,  0, 123,  4, U_ZERO_ERROR },
1133b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "ja123", "ja", ustr_ja123,  1,  23,  4, U_ZERO_ERROR },
1134b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "ja123", "fr", ustr_ja123,  0,   0,  0, U_PARSE_ERROR },
1135b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { NULL,    NULL, NULL,        0,   0,  0, 0 } /* terminator */
1136b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru};
1137b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1138b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void TestSpelloutNumberParse()
1139b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{
1140b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const SpelloutParseTest * testPtr;
1141b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for (testPtr = spelloutParseTests; testPtr->testname != NULL; ++testPtr) {
1142b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1143b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        int32_t	value, position = testPtr->startPos;
1144b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UNumberFormat *nf = unum_open(UNUM_SPELLOUT, NULL, 0, testPtr->locale, NULL, &status);
1145b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if (U_FAILURE(status)) {
11466d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_err_status(status, "unum_open fails for UNUM_SPELLOUT with locale %s, status %s\n", testPtr->locale, myErrorName(status));
1147b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            continue;
1148b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
1149b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        value = unum_parse(nf, testPtr->source, -1, &position, &status);
1150b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if ( value != testPtr->value || position != testPtr->endPos || status != testPtr->status ) {
1151b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            log_err("unum_parse SPELLOUT, locale %s, testname %s, startPos %d: for value / endPos / status, expected %d / %d / %s, got %d / %d / %s\n",
1152b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    testPtr->locale, testPtr->testname, testPtr->startPos,
1153b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    testPtr->value, testPtr->endPos, myErrorName(testPtr->status),
1154b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    value, position, myErrorName(status) );
1155b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
1156b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        unum_close(nf);
1157b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
1158b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
1159b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestSignificantDigits()
1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar temp[128];
1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t resultlengthneeded;
1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t resultlength;
1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *result = NULL;
1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UNumberFormat* fmt;
1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double d = 123456.789;
1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(temp, "###0.0#");
1171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt=unum_open(UNUM_IGNORE, temp, -1, NULL, NULL,&status);
1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1173b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_data_err("got unexpected error for unum_open: '%s'\n", u_errorName(status));
1174c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return;
1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_setAttribute(fmt, UNUM_SIGNIFICANT_DIGITS_USED, TRUE);
1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_setAttribute(fmt, UNUM_MAX_SIGNIFICANT_DIGITS, 6);
1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(temp, "123457");
1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=0;
1181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlengthneeded=unum_formatDouble(fmt, d, NULL, resultlength, NULL, &status);
1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR)
1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=resultlengthneeded+1;
1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result=(UChar*)malloc(sizeof(UChar) * resultlength);
1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_formatDouble(fmt, d, result, resultlength, NULL, &status);
1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error in formatting using unum_formatDouble(.....): %s\n", myErrorName(status));
1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(u_strcmp(result, temp)==0)
1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: Number Formatting using unum_formatDouble() Successful\n");
1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Error in number formatting using unum_formatDouble()\n");
1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(result);
1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(fmt);
1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
120227f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestSigDigRounding()
120327f654740f2a26ad62a5c155af9199af9e69b889claireho{
120427f654740f2a26ad62a5c155af9199af9e69b889claireho    UErrorCode status = U_ZERO_ERROR;
120527f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar expected[128];
120627f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar result[128];
120727f654740f2a26ad62a5c155af9199af9e69b889claireho    char		temp1[128];
120827f654740f2a26ad62a5c155af9199af9e69b889claireho    char		temp2[128];
120927f654740f2a26ad62a5c155af9199af9e69b889claireho    UNumberFormat* fmt;
121027f654740f2a26ad62a5c155af9199af9e69b889claireho    double d = 123.4;
121127f654740f2a26ad62a5c155af9199af9e69b889claireho
121227f654740f2a26ad62a5c155af9199af9e69b889claireho    fmt=unum_open(UNUM_DECIMAL, NULL, 0, NULL /* "en_US"*/, NULL, &status);
121327f654740f2a26ad62a5c155af9199af9e69b889claireho    if (U_FAILURE(status)) {
121427f654740f2a26ad62a5c155af9199af9e69b889claireho        log_data_err("got unexpected error for unum_open: '%s'\n", u_errorName(status));
121527f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
121627f654740f2a26ad62a5c155af9199af9e69b889claireho    }
121727f654740f2a26ad62a5c155af9199af9e69b889claireho    unum_setAttribute(fmt, UNUM_LENIENT_PARSE, FALSE);
121827f654740f2a26ad62a5c155af9199af9e69b889claireho    unum_setAttribute(fmt, UNUM_SIGNIFICANT_DIGITS_USED, TRUE);
121927f654740f2a26ad62a5c155af9199af9e69b889claireho    unum_setAttribute(fmt, UNUM_MAX_SIGNIFICANT_DIGITS, 2);
122027f654740f2a26ad62a5c155af9199af9e69b889claireho    /* unum_setAttribute(fmt, UNUM_MAX_FRACTION_DIGITS, 0); */
122127f654740f2a26ad62a5c155af9199af9e69b889claireho
122227f654740f2a26ad62a5c155af9199af9e69b889claireho    unum_setAttribute(fmt, UNUM_ROUNDING_MODE, UNUM_ROUND_UP);
122327f654740f2a26ad62a5c155af9199af9e69b889claireho    unum_setDoubleAttribute(fmt, UNUM_ROUNDING_INCREMENT, 20.0);
122427f654740f2a26ad62a5c155af9199af9e69b889claireho
122527f654740f2a26ad62a5c155af9199af9e69b889claireho    (void)unum_formatDouble(fmt, d, result, sizeof(result) / sizeof(result[0]), NULL, &status);
122627f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(status))
122727f654740f2a26ad62a5c155af9199af9e69b889claireho    {
122827f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err("Error in formatting using unum_formatDouble(.....): %s\n", myErrorName(status));
122927f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
123027f654740f2a26ad62a5c155af9199af9e69b889claireho    }
123127f654740f2a26ad62a5c155af9199af9e69b889claireho
123227f654740f2a26ad62a5c155af9199af9e69b889claireho    u_uastrcpy(expected, "140");
123327f654740f2a26ad62a5c155af9199af9e69b889claireho    if(u_strcmp(result, expected)!=0)
123427f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err("FAIL: Error in unum_formatDouble result %s instead of %s\n", u_austrcpy(temp1, result), u_austrcpy(temp2, expected) );
1235b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
123627f654740f2a26ad62a5c155af9199af9e69b889claireho    unum_close(fmt);
123727f654740f2a26ad62a5c155af9199af9e69b889claireho}
123827f654740f2a26ad62a5c155af9199af9e69b889claireho
1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestNumberFormatPadding()
1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *result=NULL;
1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar temp1[512];
1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status=U_ZERO_ERROR;
1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t resultlength;
1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t resultlengthneeded;
1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UNumberFormat *pattern;
1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double d1;
1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double d = -10456.37;
1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UFieldPosition pos1;
1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t parsepos;
1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* create a number format using unum_openPattern(....)*/
1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_openPattern() with padding\n");
1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(temp1, "*#,##0.0#*;(#,##0.0#)");
1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status=U_ZERO_ERROR;
1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern=unum_open(UNUM_IGNORE,temp1, u_strlen(temp1), NULL, NULL,&status);
1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status))
1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
12606d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err("error in unum_openPattern(%s): %s\n", temp1, myErrorName(status) );
1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_close(pattern);
1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*    u_uastrcpy(temp1, "*x#,###,###,##0.0#;(*x#,###,###,##0.0#)"); */
1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(temp1, "*x#,###,###,##0.0#;*x(###,###,##0.0#)");
1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status=U_ZERO_ERROR;
1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern=unum_open(UNUM_IGNORE,temp1, u_strlen(temp1), "en_US",NULL, &status);
1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
12736d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "error in padding unum_openPattern(%s): %s\n", temp1, myErrorName(status) );;
1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: padding unum_openPattern() works fine\n");
1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*test for unum_toPattern()*/
1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\nTesting padding unum_toPattern()\n");
1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=0;
1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlengthneeded=unum_toPattern(pattern, FALSE, NULL, resultlength, &status);
1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status==U_BUFFER_OVERFLOW_ERROR)
1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status=U_ZERO_ERROR;
1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            resultlength=resultlengthneeded+1;
1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result=(UChar*)malloc(sizeof(UChar) * resultlength);
1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            unum_toPattern(pattern, FALSE, result, resultlength, &status);
1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status))
1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error in extracting the padding pattern from UNumberFormat: %s\n", myErrorName(status));
1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(u_strcmp(result, temp1)!=0)
1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("FAIL: Error in extracting the padding pattern using unum_toPattern()\n");
1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else
1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_verbose("Pass: extracted the padding pattern correctly using unum_toPattern()\n");
1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querufree(result);
1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*        u_uastrcpy(temp1, "(xxxxxxx10,456.37)"); */
1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrcpy(temp1, "xxxxx(10,456.37)");
1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=0;
1304103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        pos1.field = UNUM_FRACTION_FIELD;
1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlengthneeded=unum_formatDouble(pattern, d, NULL, resultlength, &pos1, &status);
1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status==U_BUFFER_OVERFLOW_ERROR)
1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status=U_ZERO_ERROR;
1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            resultlength=resultlengthneeded+1;
1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result=(UChar*)malloc(sizeof(UChar) * resultlength);
1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            unum_formatDouble(pattern, d, result, resultlength, NULL, &status);
1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status))
1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error in formatting using unum_formatDouble(.....) with padding : %s\n", myErrorName(status));
1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(u_strcmp(result, temp1)==0)
1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_verbose("Pass: Number Formatting using unum_formatDouble() padding Successful\n");
1321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else
132227f654740f2a26ad62a5c155af9199af9e69b889claireho                log_data_err("FAIL: Error in number formatting using unum_formatDouble() with padding\n");
1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(pos1.beginIndex == 13 && pos1.endIndex == 15)
1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_verbose("Pass: Complete number formatting using unum_formatDouble() successful\n");
1325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else
1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Fail: Error in complete number Formatting using unum_formatDouble()\nGot: b=%d end=%d\nExpected: b=13 end=15\n",
1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        pos1.beginIndex, pos1.endIndex);
1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* Testing unum_parse() and unum_parseDouble() */
1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("\nTesting padding unum_parseDouble()\n");
1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            parsepos=0;
1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            d1=unum_parseDouble(pattern, result, u_strlen(result), &parsepos, &status);
1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(U_FAILURE(status))
1335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {
1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("padding parse failed. The error is : %s\n", myErrorName(status));
1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(d1!=d)
1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Fail: Error in padding parsing\n");
1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else
1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_verbose("Pass: padding parsing successful\n");
1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querufree(result);
1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(pattern);
1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool
1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruwithinErr(double a, double b, double err) {
1352b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    return uprv_fabs(a - b) < uprv_fabs(a * err);
1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestInt64Format() {
1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar temp1[512];
1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar result[512];
1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UNumberFormat *fmt;
1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const double doubleInt64Max = (double)U_INT64_MAX;
1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const double doubleInt64Min = (double)U_INT64_MIN;
1362b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const double doubleBig = 10.0 * (double)U_INT64_MAX;
1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t val32;
1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int64_t val64;
1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double  valDouble;
1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t parsepos;
1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* create a number format using unum_openPattern(....) */
1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting Int64Format\n");
1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(temp1, "#.#E0");
1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt = unum_open(UNUM_IGNORE, temp1, u_strlen(temp1), NULL, NULL, &status);
1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
1373b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_data_err("error in unum_openPattern() - %s\n", myErrorName(status));
1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_setAttribute(fmt, UNUM_MAX_FRACTION_DIGITS, 20);
1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_formatInt64(fmt, U_INT64_MAX, result, 512, NULL, &status);
1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error in unum_format(): %s\n", myErrorName(status));
1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("format int64max: '%s'\n", result);
1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            parsepos = 0;
1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            val32 = unum_parse(fmt, result, u_strlen(result), &parsepos, &status);
1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (status != U_INVALID_FORMAT_ERROR) {
1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parse didn't report error: %s\n", myErrorName(status));
1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else if (val32 != INT32_MAX) {
1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parse didn't pin return value, got: %d\n", val32);
1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            parsepos = 0;
1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            val64 = unum_parseInt64(fmt, result, u_strlen(result), &parsepos, &status);
1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status)) {
1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parseInt64 returned error: %s\n", myErrorName(status));
1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else if (val64 != U_INT64_MAX) {
1395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parseInt64 returned incorrect value, got: %ld\n", val64);
1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            parsepos = 0;
1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            valDouble = unum_parseDouble(fmt, result, u_strlen(result), &parsepos, &status);
1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status)) {
1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parseDouble returned error: %s\n", myErrorName(status));
1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else if (valDouble != doubleInt64Max) {
1404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parseDouble returned incorrect value, got: %g\n", valDouble);
1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_formatInt64(fmt, U_INT64_MIN, result, 512, NULL, &status);
1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error in unum_format(): %s\n", myErrorName(status));
1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("format int64min: '%s'\n", result);
1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            parsepos = 0;
1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            val32 = unum_parse(fmt, result, u_strlen(result), &parsepos, &status);
1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (status != U_INVALID_FORMAT_ERROR) {
1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parse didn't report error: %s\n", myErrorName(status));
1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else if (val32 != INT32_MIN) {
1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parse didn't pin return value, got: %d\n", val32);
1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            parsepos = 0;
1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            val64 = unum_parseInt64(fmt, result, u_strlen(result), &parsepos, &status);
1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status)) {
1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parseInt64 returned error: %s\n", myErrorName(status));
1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else if (val64 != U_INT64_MIN) {
1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parseInt64 returned incorrect value, got: %ld\n", val64);
1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            parsepos = 0;
1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            valDouble = unum_parseDouble(fmt, result, u_strlen(result), &parsepos, &status);
1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status)) {
1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parseDouble returned error: %s\n", myErrorName(status));
1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else if (valDouble != doubleInt64Min) {
1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parseDouble returned incorrect value, got: %g\n", valDouble);
1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_formatDouble(fmt, doubleBig, result, 512, NULL, &status);
1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error in unum_format(): %s\n", myErrorName(status));
1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("format doubleBig: '%s'\n", result);
1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            parsepos = 0;
1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            val32 = unum_parse(fmt, result, u_strlen(result), &parsepos, &status);
1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (status != U_INVALID_FORMAT_ERROR) {
1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parse didn't report error: %s\n", myErrorName(status));
1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else if (val32 != INT32_MAX) {
1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parse didn't pin return value, got: %d\n", val32);
1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
1454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            parsepos = 0;
1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            val64 = unum_parseInt64(fmt, result, u_strlen(result), &parsepos, &status);
1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (status != U_INVALID_FORMAT_ERROR) {
1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parseInt64 didn't report error error: %s\n", myErrorName(status));
1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else if (val64 != U_INT64_MAX) {
1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parseInt64 returned incorrect value, got: %ld\n", val64);
1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            parsepos = 0;
1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            valDouble = unum_parseDouble(fmt, result, u_strlen(result), &parsepos, &status);
1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status)) {
1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parseDouble returned error: %s\n", myErrorName(status));
1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else if (!withinErr(valDouble, doubleBig, 1e-15)) {
1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parseDouble returned incorrect value, got: %g\n", valDouble);
1469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1471b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1472b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho		u_uastrcpy(result, "5.06e-27");
1473b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        parsepos = 0;
1474b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        valDouble = unum_parseDouble(fmt, result, u_strlen(result), &parsepos, &status);
1475b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (U_FAILURE(status)) {
1476b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err("parseDouble() returned error: %s\n", myErrorName(status));
1477b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        } else if (!withinErr(valDouble, 5.06e-27, 1e-15)) {
1478b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err("parseDouble() returned incorrect value, got: %g\n", valDouble);
1479b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
1480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(fmt);
1482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void test_fmt(UNumberFormat* fmt, UBool isDecimal) {
1486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char temp[512];
1487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar buffer[512];
1488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t BUFSIZE = sizeof(buffer)/sizeof(buffer[0]);
1489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double vals[] = {
1490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        -.2, 0, .2, 5.5, 15.2, 250, 123456789
1491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int i;
1493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < sizeof(vals)/sizeof(vals[0]); ++i) {
1495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_formatDouble(fmt, vals[i], buffer, BUFSIZE, NULL, &status);
1497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
1498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("failed to format: %g, returned %s\n", vals[i], u_errorName(status));
1499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
1500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_austrcpy(temp, buffer);
1501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("formatting %g returned '%s'\n", vals[i], temp);
1502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* check APIs now */
1506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UParseError perr;
1509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrcpy(buffer, "#,##0.0#");
1510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_applyPattern(fmt, FALSE, buffer, -1, &perr, &status);
1511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (isDecimal ? U_FAILURE(status) : (status != U_UNSUPPORTED_ERROR)) {
1512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("got unexpected error for applyPattern: '%s'\n", u_errorName(status));
1513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int isLenient = unum_getAttribute(fmt, UNUM_LENIENT_PARSE);
1518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("lenient: 0x%x\n", isLenient);
1519b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (isLenient != FALSE) {
1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("didn't expect lenient value: %d\n", isLenient);
1521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_setAttribute(fmt, UNUM_LENIENT_PARSE, TRUE);
1524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        isLenient = unum_getAttribute(fmt, UNUM_LENIENT_PARSE);
1525b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (isLenient != TRUE) {
1526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("didn't expect lenient value after set: %d\n", isLenient);
1527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        double val2;
1532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        double val = unum_getDoubleAttribute(fmt, UNUM_LENIENT_PARSE);
1533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (val != -1) {
1534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("didn't expect double attribute\n");
1535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        val = unum_getDoubleAttribute(fmt, UNUM_ROUNDING_INCREMENT);
1537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ((val == -1) == isDecimal) {
1538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("didn't expect -1 rounding increment\n");
1539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_setDoubleAttribute(fmt, UNUM_ROUNDING_INCREMENT, val+.5);
1541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        val2 = unum_getDoubleAttribute(fmt, UNUM_ROUNDING_INCREMENT);
1542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (isDecimal && (val2 - val != .5)) {
1543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("set rounding increment had no effect on decimal format");
1544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int len = unum_getTextAttribute(fmt, UNUM_DEFAULT_RULESET, buffer, BUFSIZE, &status);
1550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (isDecimal ? (status != U_UNSUPPORTED_ERROR) : U_FAILURE(status)) {
1551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("got unexpected error for get default ruleset: '%s'\n", u_errorName(status));
1552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_SUCCESS(status)) {
1554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_austrcpy(temp, buffer);
1555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("default ruleset: '%s'\n", temp);
1556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        len = unum_getTextAttribute(fmt, UNUM_PUBLIC_RULESETS, buffer, BUFSIZE, &status);
1560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (isDecimal ? (status != U_UNSUPPORTED_ERROR) : U_FAILURE(status)) {
1561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("got unexpected error for get public rulesets: '%s'\n", u_errorName(status));
1562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_SUCCESS(status)) {
1564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_austrcpy(temp, buffer);
1565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("public rulesets: '%s'\n", temp);
1566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* set the default ruleset to the first one found, and retry */
1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (len > 0) {
1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                for (i = 0; i < len && temp[i] != ';'; ++i){};
1571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (i < len) {
1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    buffer[i] = 0;
1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    unum_setTextAttribute(fmt, UNUM_DEFAULT_RULESET, buffer, -1, &status);
1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if (U_FAILURE(status)) {
1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        log_err("unexpected error setting default ruleset: '%s'\n", u_errorName(status));
1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    } else {
1577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        int len2 = unum_getTextAttribute(fmt, UNUM_DEFAULT_RULESET, buffer, BUFSIZE, &status);
1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        if (U_FAILURE(status)) {
1579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            log_err("could not fetch default ruleset: '%s'\n", u_errorName(status));
1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        } else if (len2 != i) {
1581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            u_austrcpy(temp, buffer);
1582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            log_err("unexpected ruleset len: %d ex: %d val: %s\n", len2, i, temp);
1583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        } else {
1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            for (i = 0; i < sizeof(vals)/sizeof(vals[0]); ++i) {
1585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                status = U_ZERO_ERROR;
1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                unum_formatDouble(fmt, vals[i], buffer, BUFSIZE, NULL, &status);
1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                if (U_FAILURE(status)) {
1588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    log_err("failed to format: %g, returned %s\n", vals[i], u_errorName(status));
1589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                } else {
1590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    u_austrcpy(temp, buffer);
1591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    log_verbose("formatting %g returned '%s'\n", vals[i], temp);
1592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                }
1593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            }
1594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        }
1595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
1596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_toPattern(fmt, FALSE, buffer, BUFSIZE, &status);
1604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_SUCCESS(status)) {
1605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_austrcpy(temp, buffer);
1606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("pattern: '%s'\n", temp);
1607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if (status != U_BUFFER_OVERFLOW_ERROR) {
1608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("toPattern failed unexpectedly: %s\n", u_errorName(status));
1609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
1610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("pattern too long to display\n");
1611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int len = unum_getSymbol(fmt, UNUM_CURRENCY_SYMBOL, buffer, BUFSIZE, &status);
1617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (isDecimal ? U_FAILURE(status) : (status != U_UNSUPPORTED_ERROR)) {
1618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("unexpected error getting symbol: '%s'\n", u_errorName(status));
1619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_setSymbol(fmt, UNUM_CURRENCY_SYMBOL, buffer, len, &status);
1622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (isDecimal ? U_FAILURE(status) : (status != U_UNSUPPORTED_ERROR)) {
1623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("unexpected error setting symbol: '%s'\n", u_errorName(status));
1624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestNonExistentCurrency() {
1629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UNumberFormat *format;
1630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar currencySymbol[8];
1632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar QQQ[] = {0x51, 0x51, 0x51, 0};
1633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Get a non-existent currency and make sure it returns the correct currency code. */
1635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    format = unum_open(UNUM_CURRENCY, NULL, 0, "th_TH@currency=QQQ", NULL, &status);
1636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (format == NULL || U_FAILURE(status)) {
16376d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_data_err("unum_open did not return expected result for non-existent requested currency: '%s' (Are you missing data?)\n", u_errorName(status));
1638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
1640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_getSymbol(format,
1641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UNUM_CURRENCY_SYMBOL,
1642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                currencySymbol,
1643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                sizeof(currencySymbol)/sizeof(currencySymbol[0]),
1644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                &status);
1645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (u_strcmp(currencySymbol, QQQ) != 0) {
1646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("unum_open set the currency to QQQ\n");
1647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(format);
1650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestRBNFFormat() {
1653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status;
1654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UParseError perr;
1655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar pat[1024];
1656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar tempUChars[512];
1657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UNumberFormat *formats[5];
1658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int COUNT = sizeof(formats)/sizeof(formats[0]);
1659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int i;
1660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < COUNT; ++i) {
1662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        formats[i] = 0;
1663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* instantiation */
1666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(pat, "#,##0.0#;(#,##0.0#)");
1668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    formats[0] = unum_open(UNUM_PATTERN_DECIMAL, pat, -1, "en_US", &perr, &status);
1669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
16706d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "unable to open decimal pattern -> %s\n", u_errorName(status));
167127f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
1672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    formats[1] = unum_open(UNUM_SPELLOUT, NULL, 0, "en_US", &perr, &status);
1676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
16776d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "unable to open spellout -> %s\n", u_errorName(status));
167827f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
1679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    formats[2] = unum_open(UNUM_ORDINAL, NULL, 0, "en_US", &perr, &status);
1683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
16846d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "unable to open ordinal -> %s\n", u_errorName(status));
168527f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
1686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    formats[3] = unum_open(UNUM_DURATION, NULL, 0, "en_US", &perr, &status);
1690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
16916d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "unable to open duration %s\n", u_errorName(status));
169227f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
1693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(pat,
1697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "%standard:\n"
1698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "-x: minus >>;\n"
1699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "x.x: << point >>;\n"
1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "zero; one; two; three; four; five; six; seven; eight; nine;\n"
1701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "ten; eleven; twelve; thirteen; fourteen; fifteen; sixteen;\n"
1702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "seventeen; eighteen; nineteen;\n"
1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "20: twenty[->>];\n"
1704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "30: thirty[->>];\n"
1705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "40: forty[->>];\n"
1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "50: fifty[->>];\n"
1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "60: sixty[->>];\n"
1708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "70: seventy[->>];\n"
1709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "80: eighty[->>];\n"
1710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "90: ninety[->>];\n"
1711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "100: =#,##0=;\n");
1712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(tempUChars,
1713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "%simple:\n"
1714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "=%standard=;\n"
1715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "20: twenty[ and change];\n"
1716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "30: thirty[ and change];\n"
1717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "40: forty[ and change];\n"
1718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "50: fifty[ and change];\n"
1719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "60: sixty[ and change];\n"
1720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "70: seventy[ and change];\n"
1721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "80: eighty[ and change];\n"
1722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "90: ninety[ and change];\n"
1723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "100: =#,##0=;\n"
1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "%bogus:\n"
1725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "0.x: tiny;\n"
1726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "x.x: << point something;\n"
1727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "=%standard=;\n"
1728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "20: some reasonable number;\n"
1729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "100: some substantial number;\n"
1730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "100,000,000: some huge number;\n");
1731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* This is to get around some compiler warnings about char * string length. */
1732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_strcat(pat, tempUChars);
1733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    formats[4] = unum_open(UNUM_PATTERN_RULEBASED, pat, -1, "en_US", &perr, &status);
1734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
17356d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "unable to open rulebased pattern -> %s\n", u_errorName(status));
1736c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
1737c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (U_FAILURE(status)) {
17386d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Something failed with %s\n", u_errorName(status));
1739c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return;
1740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < COUNT; ++i) {
1743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n\ntesting format %d\n", i);
1744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        test_fmt(formats[i], (UBool)(i == 0));
1745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1747b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    #define FORMAT_BUF_CAPACITY 64
1748b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    {
1749b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UChar fmtbuf[FORMAT_BUF_CAPACITY];
1750b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t len;
1751b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        double nanvalue = uprv_getNaN();
1752b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        status = U_ZERO_ERROR;
1753b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        len = unum_formatDouble(formats[1], nanvalue, fmtbuf, FORMAT_BUF_CAPACITY, NULL, &status);
1754b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (U_FAILURE(status)) {
1755b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err_status(status, "unum_formatDouble NAN failed with %s\n", u_errorName(status));
1756b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        } else {
1757b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            UChar nansym[] = { 0x4E, 0x61, 0x4E, 0 }; /* NaN */
1758b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if ( len != 3 || u_strcmp(fmtbuf, nansym) != 0 ) {
1759b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                log_err("unum_formatDouble NAN produced wrong answer for en_US\n");
1760b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
1761b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
1762b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
1763b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < COUNT; ++i) {
1765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_close(formats[i]);
1766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestCurrencyRegression(void) {
1770b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/*
1771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru I've found a case where unum_parseDoubleCurrency is not doing what I
1772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruexpect.  The value I pass in is $1234567890q123460000.00 and this
1773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querureturns with a status of zero error & a parse pos of 22 (I would
1774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruexpect a parse error at position 11).
1775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruI stepped into DecimalFormat::subparse() and it looks like it parses
1777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruthe first 10 digits and then stops parsing at the q but doesn't set an
1778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruerror. Then later in DecimalFormat::parse() the value gets crammed
1779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinto a long (which greatly truncates the value).
1780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruThis is very problematic for me 'cause I try to remove chars that are
1782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinvalid but this allows my users to enter bad chars and truncates
1783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutheir data!
1784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
1785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar buf[1024];
1787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar currency[8];
1788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char acurrency[16];
1789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double d;
1790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UNumberFormat *cur;
1791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t pos;
1792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status  = U_ZERO_ERROR;
1793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const int32_t expected = 11;
1794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    currency[0]=0;
1796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(buf, "$1234567890q643210000.00");
1797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cur = unum_open(UNUM_CURRENCY, NULL,0,"en_US", NULL, &status);
1798b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
18006d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_data_err("unum_open failed: %s (Are you missing data?)\n", u_errorName(status));
1801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1803b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR; /* so we can test it later. */
1805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos = 0;
1806b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    d = unum_parseDoubleCurrency(cur,
1808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         buf,
1809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         -1,
1810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &pos, /* 0 = start */
1811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         currency,
1812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
1813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_austrcpy(acurrency, currency);
1815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status) || (pos != expected)) {
1817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("unum_parseDoubleCurrency should have failed with pos %d, but gave: value %.9f, err %s, pos=%d, currency [%s]\n",
1818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            expected, d, u_errorName(status), pos, acurrency);
1819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("unum_parseDoubleCurrency failed, value %.9f err %s, pos %d, currency [%s]\n", d, u_errorName(status), pos, acurrency);
1821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1822b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(cur);
1824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestTextAttributeCrash(void) {
1827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar ubuffer[64] = {0x0049,0x004E,0x0052,0};
1828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar expectedNeg[] = {0x0049,0x004E,0x0052,0x0031,0x0032,0x0033,0x0034,0x002E,0x0035,0};
1829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar expectedPos[] = {0x0031,0x0032,0x0033,0x0034,0x002E,0x0035,0};
1830b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t used;
1831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1832b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UNumberFormat *nf = unum_open(UNUM_CURRENCY, NULL, 0, "en_US", NULL, &status);
1833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
18346d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_data_err("FAILED 1 -> %s (Are you missing data?)\n", u_errorName(status));
1835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_setTextAttribute(nf, UNUM_CURRENCY_CODE, ubuffer, 3, &status);
1838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
1839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * the usual negative prefix and suffix seem to be '($' and ')' at this point
1840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * also crashes if UNUM_NEGATIVE_SUFFIX is substituted for UNUM_NEGATIVE_PREFIX here
1841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
1842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    used = unum_getTextAttribute(nf, UNUM_NEGATIVE_PREFIX, ubuffer, 64, &status);
1843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_setTextAttribute(nf, UNUM_NEGATIVE_PREFIX, ubuffer, used, &status);
1844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAILED 2\n"); exit(1);
1846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("attempting to format...\n");
1848b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    used = unum_formatDouble(nf, -1234.5, ubuffer, 64, NULL, &status);
1849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) || 64 < used) {
1850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Failed formatting %s\n", u_errorName(status));
1851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(expectedNeg, ubuffer) == 0) {
1854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Didn't get expected negative result\n");
1855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1856b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    used = unum_formatDouble(nf, 1234.5, ubuffer, 64, NULL, &status);
1857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) || 64 < used) {
1858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Failed formatting %s\n", u_errorName(status));
1859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(expectedPos, ubuffer) == 0) {
1862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Didn't get expected positive result\n");
1863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(nf);
1865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1867103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic void TestNBSPPatternRtNum(const char *testcase, int line, UNumberFormat *nf, double myNumber) {
1868c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1869c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UChar myString[20];
1870c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    char tmpbuf[200];
1871c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    double aNumber = -1.0;
1872c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    unum_formatDouble(nf, myNumber, myString, 20, NULL, &status);
1873103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    log_verbose("%s:%d: formatted %.2f into %s\n", testcase, line, myNumber, u_austrcpy(tmpbuf, myString));
1874c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if(U_FAILURE(status)) {
1875103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      log_err("%s:%d: failed format of %.2g with %s\n", testcase, line, myNumber, u_errorName(status));
1876c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return;
1877c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
1878c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    aNumber = unum_parse(nf, myString, -1, NULL, &status);
1879c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if(U_FAILURE(status)) {
1880103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      log_err("%s:%d: failed parse with %s\n", testcase, line, u_errorName(status));
1881c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return;
1882c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
1883c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if(uprv_fabs(aNumber-myNumber)>.001) {
1884103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      log_err("FAIL: %s:%d formatted %.2f, parsed into %.2f\n", testcase, line, myNumber, aNumber);
1885c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    } else {
1886103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      log_verbose("PASS: %s:%d formatted %.2f, parsed into %.2f\n", testcase, line, myNumber, aNumber);
1887c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
1888c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
1889c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
1890c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustatic void TestNBSPPatternRT(const char *testcase, UNumberFormat *nf) {
1891103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  TestNBSPPatternRtNum(testcase, __LINE__, nf, 12345.);
1892103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  TestNBSPPatternRtNum(testcase, __LINE__, nf, -12345.);
1893c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
1894c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
1895c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustatic void TestNBSPInPattern(void) {
1896c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1897c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UNumberFormat* nf = NULL;
1898c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    const char *testcase;
1899b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1900b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1901c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    testcase="ar_AE UNUM_CURRENCY";
1902c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    nf  = unum_open(UNUM_CURRENCY, NULL, -1, "ar_AE", NULL, &status);
19036d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if(U_FAILURE(status) || nf == NULL) {
1904103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      log_data_err("%s:%d: %s: unum_open failed with %s (Are you missing data?)\n", __FILE__, __LINE__, testcase, u_errorName(status));
19056d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
1906c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
1907c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    TestNBSPPatternRT(testcase, nf);
1908b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1909c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    /* if we don't have CLDR 1.6 data, bring out the problem anyways */
1910c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    {
1911c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define SPECIAL_PATTERN "\\u00A4\\u00A4'\\u062f.\\u0625.\\u200f\\u00a0'###0.00"
1912c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UChar pat[200];
1913c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        testcase = "ar_AE special pattern: " SPECIAL_PATTERN;
1914c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        u_unescape(SPECIAL_PATTERN, pat, sizeof(pat)/sizeof(pat[0]));
1915c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        unum_applyPattern(nf, FALSE, pat, -1, NULL, &status);
1916b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if(U_FAILURE(status)) {
1917c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            log_err("%s: unum_applyPattern failed with %s\n", testcase, u_errorName(status));
1918c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        } else {
1919c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            TestNBSPPatternRT(testcase, nf);
1920c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
1921c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#undef SPECIAL_PATTERN
1922c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
1923c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    unum_close(nf); status = U_ZERO_ERROR;
1924b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1925c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    testcase="ar_AE UNUM_DECIMAL";
1926c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    nf  = unum_open(UNUM_DECIMAL, NULL, -1, "ar_AE", NULL, &status);
1927c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if(U_FAILURE(status)) {
1928c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        log_err("%s: unum_open failed with %s\n", testcase, u_errorName(status));
1929c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
1930c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    TestNBSPPatternRT(testcase, nf);
1931c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    unum_close(nf); status = U_ZERO_ERROR;
1932b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1933c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    testcase="ar_AE UNUM_PERCENT";
1934c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    nf  = unum_open(UNUM_PERCENT, NULL, -1, "ar_AE", NULL, &status);
1935c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if(U_FAILURE(status)) {
1936c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        log_err("%s: unum_open failed with %s\n", testcase, u_errorName(status));
1937b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
1938b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TestNBSPPatternRT(testcase, nf);
1939c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    unum_close(nf); status = U_ZERO_ERROR;
1940b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1941b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1942b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1943c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
1944103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic void TestCloneWithRBNF(void) {
1945103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UChar pattern[1024];
1946103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UChar pat2[512];
1947103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UErrorCode status = U_ZERO_ERROR;
1948103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UChar buffer[256];
1949103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UChar buffer_cloned[256];
1950103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    char temp1[256];
1951103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    char temp2[256];
1952103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UNumberFormat *pform_cloned;
1953103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UNumberFormat *pform;
1954103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
1955103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    u_uastrcpy(pattern,
1956103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "%main:\n"
1957103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "0.x: >%%millis-only>;\n"
1958103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "x.0: <%%duration<;\n"
1959103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "x.x: <%%durationwithmillis<>%%millis-added>;\n"
1960103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "-x: ->>;%%millis-only:\n"
1961103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "1000: 00:00.<%%millis<;\n"
1962103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "%%millis-added:\n"
1963103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "1000: .<%%millis<;\n"
1964103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "%%millis:\n"
1965103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "0: =000=;\n"
1966103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "%%duration:\n"
1967103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "0: =%%seconds-only=;\n"
1968103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "60: =%%min-sec=;\n"
1969103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "3600: =%%hr-min-sec=;\n"
1970103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "86400/86400: <%%ddaayyss<[, >>];\n"
1971103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "%%durationwithmillis:\n"
1972103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "0: =%%seconds-only=;\n"
1973103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "60: =%%min-sec=;\n"
1974103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "3600: =%%hr-min-sec=;\n"
1975103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "86400/86400: <%%ddaayyss<, >>;\n");
1976103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    u_uastrcpy(pat2,
1977103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "%%seconds-only:\n"
1978103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "0: 0:00:=00=;\n"
1979103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "%%min-sec:\n"
1980103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "0: :=00=;\n"
1981103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "0/60: 0:<00<>>;\n"
1982103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "%%hr-min-sec:\n"
1983103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "0: :=00=;\n"
1984103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "60/60: <00<>>;\n"
1985103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "3600/60: <0<:>>>;\n"
1986103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "%%ddaayyss:\n"
1987103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "0 days;\n"
1988103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "1 day;\n"
1989103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "=0= days;");
1990103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
1991103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /* This is to get around some compiler warnings about char * string length. */
1992103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    u_strcat(pattern, pat2);
1993103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
1994103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    pform = unum_open(UNUM_PATTERN_RULEBASED, pattern, -1, "en_US", NULL, &status);
1995103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    unum_formatDouble(pform, 3600, buffer, 256, NULL, &status);
1996c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
1997103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    pform_cloned = unum_clone(pform,&status);
1998103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    unum_formatDouble(pform_cloned, 3600, buffer_cloned, 256, NULL, &status);
1999103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2000103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    unum_close(pform);
2001103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    unum_close(pform_cloned);
2002103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2003103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (u_strcmp(buffer,buffer_cloned)) {
2004103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_data_err("Result from cloned formatter not identical to the original. Original: %s Cloned: %s - (Are you missing data?)",u_austrcpy(temp1, buffer),u_austrcpy(temp2,buffer_cloned));
2005103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
2006103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius}
200754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
200854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
200954dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic void TestNoExponent(void) {
201054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UErrorCode status = U_ZERO_ERROR;
201154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UChar str[100];
201254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    const char *cstr;
201354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UNumberFormat *fmt;
201454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    int32_t pos;
201554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    int32_t expect = 0;
201654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    int32_t num;
201754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
201854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    fmt = unum_open(UNUM_DECIMAL, NULL, -1, "en_US", NULL, &status);
201954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
202054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(status) || fmt == NULL) {
202154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_data_err("%s:%d: unum_open failed with %s (Are you missing data?)\n", __FILE__, __LINE__, u_errorName(status));
202254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        return;
202354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
202454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
202554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    cstr = "10E6";
202654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    u_uastrcpy(str, cstr);
202754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    expect = 10000000;
202854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    pos = 0;
202954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    num = unum_parse(fmt, str, -1, &pos, &status);
203054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    ASSERT_TRUE(pos==4);
203154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(status)) {
203254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_data_err("%s:%d: unum_parse failed with %s for %s (Are you missing data?)\n", __FILE__, __LINE__, u_errorName(status), cstr);
203354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    } else if(expect!=num) {
203454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_data_err("%s:%d: unum_parse failed, got %d expected %d for '%s'(Are you missing data?)\n", __FILE__, __LINE__, num, expect, cstr);
203554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    } else {
203654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_verbose("%s:%d: unum_parse returned %d for '%s'\n", __FILE__, __LINE__, num, cstr);
203754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
203854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
203954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    ASSERT_TRUE(unum_getAttribute(fmt, UNUM_PARSE_NO_EXPONENT)==0);
204054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
204154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    unum_setAttribute(fmt, UNUM_PARSE_NO_EXPONENT, 1); /* no error code */
204254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    log_verbose("set UNUM_PARSE_NO_EXPONENT\n");
204354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
204454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    ASSERT_TRUE(unum_getAttribute(fmt, UNUM_PARSE_NO_EXPONENT)==1);
204554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
204654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    pos = 0;
204754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    expect=10;
204854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    num = unum_parse(fmt, str, -1, &pos, &status);
204954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(num==10000000) {
205054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("%s:%d: FAIL: unum_parse should have returned 10, not 10000000 on %s after UNUM_PARSE_NO_EXPONENT\n", __FILE__, __LINE__, cstr);
205154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    } else if(num==expect) {
205254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_verbose("%s:%d: unum_parse gave %d for %s - good.\n", __FILE__, __LINE__, num, cstr);
205354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
205454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    ASSERT_TRUE(pos==2);
205554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
205654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    status = U_ZERO_ERROR;
205754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
205854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    unum_close(fmt);
205954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
206054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    /* ok, now try scientific */
206154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    fmt = unum_open(UNUM_SCIENTIFIC, NULL, -1, "en_US", NULL, &status);
206254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    assertSuccess("unum_open(UNUM_SCIENTIFIC, ...)", &status);
206354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
206454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    ASSERT_TRUE(unum_getAttribute(fmt, UNUM_PARSE_NO_EXPONENT)==0);
206554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
206654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    cstr = "10E6";
206754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    u_uastrcpy(str, cstr);
206854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    expect = 10000000;
206954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    pos = 0;
207054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    num = unum_parse(fmt, str, -1, &pos, &status);
207154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    ASSERT_TRUE(pos==4);
207254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(status)) {
207354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_data_err("%s:%d: unum_parse failed with %s for %s (Are you missing data?)\n", __FILE__, __LINE__, u_errorName(status), cstr);
207454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    } else if(expect!=num) {
207554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_data_err("%s:%d: unum_parse failed, got %d expected %d for '%s'(Are you missing data?)\n", __FILE__, __LINE__, num, expect, cstr);
207654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    } else {
207754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_verbose("%s:%d: unum_parse returned %d for '%s'\n", __FILE__, __LINE__, num, cstr);
207854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
207954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
208054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    unum_setAttribute(fmt, UNUM_PARSE_NO_EXPONENT, 1); /* no error code */
208154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    log_verbose("set UNUM_PARSE_NO_EXPONENT\n");
208254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
208354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    ASSERT_TRUE(unum_getAttribute(fmt, UNUM_PARSE_NO_EXPONENT)==1);
208454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
208554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
208654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    cstr = "10E6";
208754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    u_uastrcpy(str, cstr);
208854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    expect = 10000000;
208954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    pos = 0;
209054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    num = unum_parse(fmt, str, -1, &pos, &status);
209154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    ASSERT_TRUE(pos==4);
209254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(status)) {
209354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_data_err("%s:%d: unum_parse failed with %s for %s (Are you missing data?)\n", __FILE__, __LINE__, u_errorName(status), cstr);
209454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    } else if(expect!=num) {
209554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_data_err("%s:%d: unum_parse failed, got %d expected %d for '%s'(Are you missing data?)\n", __FILE__, __LINE__, num, expect, cstr);
209654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    } else {
209754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_verbose("%s:%d: unum_parse returned %d for '%s'\n", __FILE__, __LINE__, num, cstr);
209854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
209954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
210054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    unum_close(fmt);
210154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}
210254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
210354dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic void TestMaxInt(void) {
210454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UErrorCode status = U_ZERO_ERROR;
210554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UChar pattern_hash[] = { 0x23, 0x00 }; /* "#" */
210654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UChar result1[1024] = { 0 }, result2[1024] = { 0 };
210754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    int32_t len1, len2;
210854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UChar expect[] = { 0x0039, 0x0037, 0 };
210954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UNumberFormat *fmt = unum_open(
211054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                  UNUM_PATTERN_DECIMAL,      /* style         */
211154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                  &pattern_hash[0],          /* pattern       */
211254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                  u_strlen(pattern_hash),    /* patternLength */
211354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                  0,
211454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                  0,                         /* parseErr      */
211554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                  &status);
211654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(status) || fmt == NULL) {
211754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_data_err("%s:%d: %s: unum_open failed with %s (Are you missing data?)\n", __FILE__, __LINE__, "TestMaxInt", u_errorName(status));
211854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        return;
211954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
212054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
212154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    unum_setAttribute(fmt, UNUM_MAX_INTEGER_DIGITS, 2);
212254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
212354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    status = U_ZERO_ERROR;
212454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    /* #1 */
212554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    len1 = unum_formatInt64(fmt, 1997, result1, 1024, NULL, &status);
212654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    result1[len1]=0;
212754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(status) || u_strcmp(expect, result1)) {
212854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("unum_formatInt64 Expected %s but got %s status %s\n", austrdup(expect), austrdup(result1), u_errorName(status));
212954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
213054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
213154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    status = U_ZERO_ERROR;
213254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    /* #2 */
213354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    len2 = unum_formatDouble(fmt, 1997.0, result2, 1024, NULL, &status);
213454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    result2[len2]=0;
213554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(status) || u_strcmp(expect, result2)) {
213654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("unum_formatDouble Expected %s but got %s status %s\n", austrdup(expect), austrdup(result2), u_errorName(status));
213754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
213854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
213954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
214054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
214154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    /* test UNUM_FORMAT_FAIL_IF_MORE_THAN_MAX_DIGITS */
214254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    ASSERT_TRUE(unum_getAttribute(fmt, UNUM_FORMAT_FAIL_IF_MORE_THAN_MAX_DIGITS)==0);
214354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
214454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    unum_setAttribute(fmt, UNUM_FORMAT_FAIL_IF_MORE_THAN_MAX_DIGITS, 1);
214554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    /* test UNUM_FORMAT_FAIL_IF_MORE_THAN_MAX_DIGITS */
214654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    ASSERT_TRUE(unum_getAttribute(fmt, UNUM_FORMAT_FAIL_IF_MORE_THAN_MAX_DIGITS)==1);
214754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
214854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    status = U_ZERO_ERROR;
214954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    /* max int digits still '2' */
215054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    len1 = unum_formatInt64(fmt, 1997, result1, 1024, NULL, &status);
215154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    ASSERT_TRUE(status==U_ILLEGAL_ARGUMENT_ERROR);
215254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    status = U_ZERO_ERROR;
215354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
215454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    /* But, formatting 97->'97' works fine. */
215554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
215654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    /* #1 */
215754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    len1 = unum_formatInt64(fmt, 97, result1, 1024, NULL, &status);
215854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    result1[len1]=0;
215954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(status) || u_strcmp(expect, result1)) {
216054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("unum_formatInt64 Expected %s but got %s status %s\n", austrdup(expect), austrdup(result1), u_errorName(status));
216154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
216254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
216354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    status = U_ZERO_ERROR;
216454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    /* #2 */
216554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    len2 = unum_formatDouble(fmt, 97.0, result2, 1024, NULL, &status);
216654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    result2[len2]=0;
216754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(status) || u_strcmp(expect, result2)) {
216854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("unum_formatDouble Expected %s but got %s status %s\n", austrdup(expect), austrdup(result2), u_errorName(status));
216954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
217054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
217154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
217254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    unum_close(fmt);
217354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}
217454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
2175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */
2176