1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT:
3fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius * Copyright (c) 1997-2014, 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"
2959d709d503bab6e2b61931737e662dd293b40578ccornelius#include "unicode/unumsys.h"
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h"
31fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#include "unicode/udisplaycontext.h"
3227f654740f2a26ad62a5c155af9199af9e69b889claireho
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cintltst.h"
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cnumtst.h"
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h"
3659d709d503bab6e2b61931737e662dd293b40578ccornelius#include "cstring.h"
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "putilimp.h"
3854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#include <stdio.h>
39fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#include <stdlib.h>
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define LENGTH(arr) (sizeof(arr)/sizeof(arr[0]))
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
4354dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic const char *tagAssert(const char *f, int32_t l, const char *msg) {
4454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    static char _fileline[1000];
4554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    sprintf(_fileline, "%s:%d: ASSERT_TRUE(%s)", f, l, msg);
4654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    return _fileline;
4754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}
4854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
4954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#define ASSERT_TRUE(x)   assertTrue(tagAssert(__FILE__, __LINE__, #x), (x))
5054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addNumForTest(TestNode** root);
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestTextAttributeCrash(void);
53c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustatic void TestNBSPInPattern(void);
5427f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestInt64Parse(void);
55b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestParseCurrency(void);
5654dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic void TestMaxInt(void);
5754dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic void TestNoExponent(void);
5859d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic void TestUFormattable(void);
5959d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic void TestUNumberingSystem(void);
60fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusstatic void TestCurrencyIsoPluralFormat(void);
61fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusstatic void TestContext(void);
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TESTCASE(x) addTest(root, &x, "tsformat/cnumtst/" #x)
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addNumForTest(TestNode** root)
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestNumberFormat);
68b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    TESTCASE(TestSpelloutNumberParse);
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestSignificantDigits);
7027f654740f2a26ad62a5c155af9199af9e69b889claireho    TESTCASE(TestSigDigRounding);
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestNumberFormatPadding);
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestInt64Format);
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestNonExistentCurrency);
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestCurrencyRegression);
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestTextAttributeCrash);
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestRBNFFormat);
77c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    TESTCASE(TestNBSPInPattern);
7827f654740f2a26ad62a5c155af9199af9e69b889claireho    TESTCASE(TestInt64Parse);
79b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TESTCASE(TestParseZero);
80b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TESTCASE(TestParseCurrency);
81103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    TESTCASE(TestCloneWithRBNF);
8254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    TESTCASE(TestMaxInt);
8354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    TESTCASE(TestNoExponent);
8459d709d503bab6e2b61931737e662dd293b40578ccornelius    TESTCASE(TestUFormattable);
8559d709d503bab6e2b61931737e662dd293b40578ccornelius    TESTCASE(TestUNumberingSystem);
86fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE(TestCurrencyIsoPluralFormat);
87fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TESTCASE(TestContext);
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
9027f654740f2a26ad62a5c155af9199af9e69b889claireho/* test Parse int 64 */
9127f654740f2a26ad62a5c155af9199af9e69b889claireho
9227f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestInt64Parse()
9327f654740f2a26ad62a5c155af9199af9e69b889claireho{
9427f654740f2a26ad62a5c155af9199af9e69b889claireho
9527f654740f2a26ad62a5c155af9199af9e69b889claireho    UErrorCode st = U_ZERO_ERROR;
9627f654740f2a26ad62a5c155af9199af9e69b889claireho    UErrorCode* status = &st;
97b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
9827f654740f2a26ad62a5c155af9199af9e69b889claireho    const char* st1 = "009223372036854775808";
9927f654740f2a26ad62a5c155af9199af9e69b889claireho    const int size = 21;
10027f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar text[21];
101b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
102b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
10327f654740f2a26ad62a5c155af9199af9e69b889claireho    UNumberFormat* nf;
10427f654740f2a26ad62a5c155af9199af9e69b889claireho
10527f654740f2a26ad62a5c155af9199af9e69b889claireho    int64_t a;
10627f654740f2a26ad62a5c155af9199af9e69b889claireho
10727f654740f2a26ad62a5c155af9199af9e69b889claireho    u_charsToUChars(st1, text, size);
10827f654740f2a26ad62a5c155af9199af9e69b889claireho    nf = unum_open(UNUM_DEFAULT, NULL, -1, NULL, NULL, status);
10927f654740f2a26ad62a5c155af9199af9e69b889claireho
11027f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(*status))
11127f654740f2a26ad62a5c155af9199af9e69b889claireho    {
11227f654740f2a26ad62a5c155af9199af9e69b889claireho        log_data_err("Error in unum_open() %s \n", myErrorName(*status));
11327f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
11427f654740f2a26ad62a5c155af9199af9e69b889claireho    }
11527f654740f2a26ad62a5c155af9199af9e69b889claireho
11627f654740f2a26ad62a5c155af9199af9e69b889claireho    log_verbose("About to test unum_parseInt64() with out of range number\n");
11727f654740f2a26ad62a5c155af9199af9e69b889claireho
11827f654740f2a26ad62a5c155af9199af9e69b889claireho    a = unum_parseInt64(nf, text, size, 0, status);
11959d709d503bab6e2b61931737e662dd293b40578ccornelius    (void)a;     /* Suppress set but not used warning. */
120b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
12127f654740f2a26ad62a5c155af9199af9e69b889claireho
12227f654740f2a26ad62a5c155af9199af9e69b889claireho    if(!U_FAILURE(*status))
12327f654740f2a26ad62a5c155af9199af9e69b889claireho    {
12427f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err("Error in unum_parseInt64(): %s \n", myErrorName(*status));
12527f654740f2a26ad62a5c155af9199af9e69b889claireho    }
12627f654740f2a26ad62a5c155af9199af9e69b889claireho    else
12727f654740f2a26ad62a5c155af9199af9e69b889claireho    {
12827f654740f2a26ad62a5c155af9199af9e69b889claireho        log_verbose("unum_parseInt64() successful\n");
12927f654740f2a26ad62a5c155af9199af9e69b889claireho    }
13027f654740f2a26ad62a5c155af9199af9e69b889claireho
13127f654740f2a26ad62a5c155af9199af9e69b889claireho    unum_close(nf);
13227f654740f2a26ad62a5c155af9199af9e69b889claireho    return;
13327f654740f2a26ad62a5c155af9199af9e69b889claireho}
13427f654740f2a26ad62a5c155af9199af9e69b889claireho
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* test Number Format API */
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestNumberFormat()
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *result=NULL;
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar temp1[512];
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar temp2[512];
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar temp[5];
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar prefix[5];
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar suffix[5];
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar symbol[20];
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t resultlength;
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t resultlengthneeded;
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t parsepos;
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double d1 = -1.0;
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t l1;
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double d = -10456.37;
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double a = 1234.56, a1 = 1235.0;
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t l = 100000000;
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UFieldPosition pos1;
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UFieldPosition pos2;
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t numlocales;
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UNumberFormatAttribute attr;
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UNumberFormatSymbol symType = UNUM_DECIMAL_SEPARATOR_SYMBOL;
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t newvalue;
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status=U_ZERO_ERROR;
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UNumberFormatStyle style= UNUM_DEFAULT;
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UNumberFormat *pattern;
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UNumberFormat *def, *fr, *cur_def, *cur_fr, *per_def, *per_fr,
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  *cur_frpattern, *myclone, *spellout_def;
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Testing unum_open() with various Numberformat styles and locales*/
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Testing  unum_open() with default style and locale\n");
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    def=unum_open(style, NULL,0,NULL, NULL,&status);
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Might as well pack it in now if we can't even get a default NumberFormat... */
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1776d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_data_err("Error in creating default NumberFormat using unum_open(): %s (Are you missing data?)\n", myErrorName(status));
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_open() with french locale and default style(decimal)\n");
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fr=unum_open(style,NULL,0, "fr_FR",NULL, &status);
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error: could not create NumberFormat (french): %s\n", myErrorName(status));
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_open(currency,NULL,status)\n");
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    style=UNUM_CURRENCY;
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Can't hardcode the result to assume the default locale is "en_US". */
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cur_def=unum_open(style, NULL,0,"en_US", NULL, &status);
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error: could not create NumberFormat using \n unum_open(currency, NULL, &status) %s\n",
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        myErrorName(status) );
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_open(currency, frenchlocale, status)\n");
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cur_fr=unum_open(style,NULL,0, "fr_FR", NULL, &status);
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
197b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err("Error: could not create NumberFormat using unum_open(currency, french, &status): %s\n",
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                myErrorName(status));
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_open(percent, NULL, status)\n");
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    style=UNUM_PERCENT;
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    per_def=unum_open(style,NULL,0, NULL,NULL, &status);
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error: could not create NumberFormat using unum_open(percent, NULL, &status): %s\n", myErrorName(status));
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_open(percent,frenchlocale, status)\n");
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    per_fr=unum_open(style, NULL,0,"fr_FR", NULL,&status);
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error: could not create NumberFormat using unum_open(percent, french, &status): %s\n", myErrorName(status));
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_open(spellout, NULL, status)");
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    style=UNUM_SPELLOUT;
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    spellout_def=unum_open(style, NULL, 0, "en_US", NULL, &status);
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error: could not create NumberFormat using unum_open(spellout, NULL, &status): %s\n", myErrorName(status));
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Testing unum_clone(..) */
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_clone(fmt, status)");
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    myclone = unum_clone(def,&status);
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error: could not clone unum_clone(def, &status): %s\n", myErrorName(status));
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("unum_clone() successful\n");
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*Testing unum_getAvailable() and unum_countAvailable()*/
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting getAvailableLocales and countAvailable()\n");
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    numlocales=unum_countAvailable();
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(numlocales < 0)
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in countAvailable");
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else{
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("unum_countAvialable() successful\n");
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("The no: of locales where number formattting is applicable is %d\n", numlocales);
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0;i<numlocales;i++)
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("%s\n", unum_getAvailable(i));
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (unum_getAvailable(i) == 0)
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("No locale for which number formatting patterns are applicable\n");
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("A locale %s for which number formatting patterns are applicable\n",unum_getAvailable(i));
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*Testing unum_format() and unum_formatdouble()*/
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(temp1, "$100,000,000.00");
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_format() \n");
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=0;
252103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    pos1.field = UNUM_INTEGER_FIELD;
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlengthneeded=unum_format(cur_def, l, NULL, resultlength, &pos1, &status);
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR)
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=resultlengthneeded+1;
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result=(UChar*)malloc(sizeof(UChar) * resultlength);
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*        for (i = 0; i < 100000; i++) */
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            unum_format(cur_def, l, result, resultlength, &pos1, &status);
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error in formatting using unum_format(.....): %s\n", myErrorName(status) );
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(u_strcmp(result, temp1)==0)
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: Number formatting using unum_format() successful\n");
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Fail: Error in number Formatting using unum_format()\n");
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(pos1.beginIndex == 1 && pos1.endIndex == 12)
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: Complete number formatting using unum_format() successful\n");
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Fail: Error in complete number Formatting using unum_format()\nGot: b=%d end=%d\nExpected: b=1 end=12\n",
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                pos1.beginIndex, pos1.endIndex);
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
27954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    free(result);
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = 0;
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_formatDouble()\n");
28359d709d503bab6e2b61931737e662dd293b40578ccornelius    u_uastrcpy(temp1, "-$10,456.37");
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=0;
285103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    pos2.field = UNUM_FRACTION_FIELD;
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlengthneeded=unum_formatDouble(cur_def, d, NULL, resultlength, &pos2, &status);
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR)
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=resultlengthneeded+1;
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result=(UChar*)malloc(sizeof(UChar) * resultlength);
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*        for (i = 0; i < 100000; i++) */
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            unum_formatDouble(cur_def, d, result, resultlength, &pos2, &status);
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error in formatting using unum_formatDouble(.....): %s\n", myErrorName(status));
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(result && u_strcmp(result, temp1)==0)
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: Number Formatting using unum_formatDouble() Successful\n");
30359d709d503bab6e2b61931737e662dd293b40578ccornelius    else {
30459d709d503bab6e2b61931737e662dd293b40578ccornelius      log_err("FAIL: Error in number formatting using unum_formatDouble() - got '%s' expected '%s'\n",
30559d709d503bab6e2b61931737e662dd293b40578ccornelius              aescstrdup(result, -1), aescstrdup(temp1, -1));
30659d709d503bab6e2b61931737e662dd293b40578ccornelius    }
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(pos2.beginIndex == 9 && pos2.endIndex == 11)
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: Complete number formatting using unum_format() successful\n");
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Fail: Error in complete number Formatting using unum_formatDouble()\nGot: b=%d end=%d\nExpected: b=9 end=11",
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                pos1.beginIndex, pos1.endIndex);
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Testing unum_parse() and unum_parseDouble() */
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_parseDouble()\n");
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*    for (i = 0; i < 100000; i++)*/
31754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    parsepos=0;
31854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if (result != NULL) {
31954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      d1=unum_parseDouble(cur_def, result, u_strlen(result), &parsepos, &status);
32054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    } else {
32154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      log_err("result is NULL\n");
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
32354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(status)) {
32454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius      log_err("parse of '%s' failed. Parsepos=%d. The error is  : %s\n", aescstrdup(result,u_strlen(result)),parsepos, myErrorName(status));
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(d1!=d)
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Fail: Error in parsing\n");
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: parsing successful\n");
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (result)
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(result);
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = 0;
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
33554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    status = U_ZERO_ERROR;
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Testing unum_formatDoubleCurrency / unum_parseDoubleCurrency */
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_formatDoubleCurrency\n");
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(temp1, "Y1,235");
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp1[0] = 0xA5; /* Yen sign */
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(temp, "JPY");
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=0;
342103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    pos2.field = UNUM_INTEGER_FIELD;
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlengthneeded=unum_formatDoubleCurrency(cur_def, a, temp, NULL, resultlength, &pos2, &status);
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (status==U_BUFFER_OVERFLOW_ERROR) {
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=resultlengthneeded+1;
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result=(UChar*)malloc(sizeof(UChar) * resultlength);
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_formatDoubleCurrency(cur_def, a, temp, result, resultlength, &pos2, &status);
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
35159d709d503bab6e2b61931737e662dd293b40578ccornelius        log_err("Error in formatting using unum_formatDoubleCurrency(.....): %s\n", myErrorName(status));
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (result && u_strcmp(result, temp1)==0) {
35459d709d503bab6e2b61931737e662dd293b40578ccornelius        log_verbose("Pass: Number Formatting using unum_formatDoubleCurrency() Successful\n");
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
35659d709d503bab6e2b61931737e662dd293b40578ccornelius        log_err("FAIL: Error in number formatting using unum_formatDoubleCurrency() - got '%s' expected '%s'\n",
35759d709d503bab6e2b61931737e662dd293b40578ccornelius                aescstrdup(result, -1), aescstrdup(temp1, -1));
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (pos2.beginIndex == 1 && pos2.endIndex == 6) {
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: Complete number formatting using unum_format() successful\n");
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Fail: Error in complete number Formatting using unum_formatDouble()\nGot: b=%d end=%d\nExpected: b=1 end=6\n",
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                pos1.beginIndex, pos1.endIndex);
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_parseDoubleCurrency\n");
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    parsepos=0;
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (result == NULL) {
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("result is NULL\n");
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        d1=unum_parseDoubleCurrency(cur_def, result, u_strlen(result), &parsepos, temp2, &status);
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
37454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius          log_err("parseDoubleCurrency '%s' failed. The error is  : %s\n", aescstrdup(result, u_strlen(result)), myErrorName(status));
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Note: a==1234.56, but on parse expect a1=1235.0 */
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (d1!=a1) {
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Fail: Error in parsing currency, got %f, expected %f\n", d1, a1);
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
38059d709d503bab6e2b61931737e662dd293b40578ccornelius            log_verbose("Pass: parsed currency amount successfully\n");
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (u_strcmp(temp2, temp)==0) {
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("Pass: parsed correct currency\n");
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Fail: parsed incorrect currency\n");
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
38854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    status = U_ZERO_ERROR; /* reset */
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
39054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    free(result);
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result = 0;
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* performance testing */
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(temp1, "$462.12345");
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=u_strlen(temp1);
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*    for (i = 0; i < 100000; i++) */
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        parsepos=0;
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        d1=unum_parseDouble(cur_def, temp1, resultlength, &parsepos, &status);
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
40454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("parseDouble('%s') failed. The error is  : %s\n", aescstrdup(temp1, resultlength), myErrorName(status));
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
40727f654740f2a26ad62a5c155af9199af9e69b889claireho    /*
408b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Note: "for strict standard conformance all operations and constants are now supposed to be
40927f654740f2a26ad62a5c155af9199af9e69b889claireho              evaluated in precision of long double".  So,  we assign a1 before comparing to a double. Bug #7932.
41027f654740f2a26ad62a5c155af9199af9e69b889claireho     */
41127f654740f2a26ad62a5c155af9199af9e69b889claireho    a1 = 462.12345;
41227f654740f2a26ad62a5c155af9199af9e69b889claireho
41327f654740f2a26ad62a5c155af9199af9e69b889claireho    if(d1!=a1)
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Fail: Error in parsing\n");
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: parsing successful\n");
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querufree(result);
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(temp1, "($10,456.3E1])");
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    parsepos=0;
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    d1=unum_parseDouble(cur_def, temp1, u_strlen(temp1), &parsepos, &status);
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status))
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error in unum_parseDouble(..., %s, ...): %s\n", temp1, myErrorName(status));
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_format()\n");
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status=U_ZERO_ERROR;
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=0;
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    parsepos=0;
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlengthneeded=unum_format(per_fr, l, NULL, resultlength, &pos1, &status);
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR)
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=resultlengthneeded+1;
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result=(UChar*)malloc(sizeof(UChar) * resultlength);
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*        for (i = 0; i < 100000; i++)*/
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            unum_format(per_fr, l, result, resultlength, &pos1, &status);
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error in formatting using unum_format(.....): %s\n", myErrorName(status));
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_parse()\n");
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*    for (i = 0; i < 100000; i++) */
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        parsepos=0;
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        l1=unum_parse(per_fr, result, u_strlen(result), &parsepos, &status);
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("parse failed. The error is  : %s\n", myErrorName(status));
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(l1!=l)
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Fail: Error in parsing\n");
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: parsing successful\n");
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querufree(result);
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* create a number format using unum_openPattern(....)*/
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_openPattern()\n");
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(temp1, "#,##0.0#;(#,##0.0#)");
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern=unum_open(UNUM_IGNORE,temp1, u_strlen(temp1), NULL, NULL,&status);
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in unum_openPattern(): %s\n", myErrorName(status) );;
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: unum_openPattern() works fine\n");
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*test for unum_toPattern()*/
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_toPattern()\n");
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=0;
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlengthneeded=unum_toPattern(pattern, FALSE, NULL, resultlength, &status);
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR)
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=resultlengthneeded+1;
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result=(UChar*)malloc(sizeof(UChar) * resultlength);
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_toPattern(pattern, FALSE, result, resultlength, &status);
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in extracting the pattern from UNumberFormat: %s\n", myErrorName(status));
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(u_strcmp(result, temp1)!=0)
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: Error in extracting the pattern using unum_toPattern()\n");
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("Pass: extracted the pattern correctly using unum_toPattern()\n");
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querufree(result);
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*Testing unum_getSymbols() and unum_setSymbols()*/
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_getSymbols and unum_setSymbols()\n");
505b13da9df870a61b11249bf741347908dbea0edd8Jean-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 */
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=0;
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlengthneeded=unum_toPattern(cur_def, FALSE, NULL, resultlength, &status);
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR)
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=resultlengthneeded+1;
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result=(UChar*)malloc(sizeof(UChar) * resultlength);
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_toPattern(cur_def, FALSE, result, resultlength, &status);
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in extracting the pattern from UNumberFormat: %s\n", myErrorName(status));
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status=U_ZERO_ERROR;
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cur_frpattern=unum_open(UNUM_IGNORE,result, u_strlen(result), "fr_FR",NULL, &status);
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in unum_openPattern(): %s\n", myErrorName(status));
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querufree(result);
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*getting the symbols of cur_def */
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*set the symbols of cur_frpattern to cur_def */
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (symType = UNUM_DECIMAL_SEPARATOR_SYMBOL; symType < UNUM_FORMAT_SYMBOL_COUNT; symType++) {
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_getSymbol(cur_def, symType, temp1, sizeof(temp1), &status);
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_setSymbol(cur_frpattern, symType, temp1, -1, &status);
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status))
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error in get/set symbols: %s\n", myErrorName(status));
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*format to check the result */
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=0;
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlengthneeded=unum_format(cur_def, l, NULL, resultlength, &pos1, &status);
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR)
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=resultlengthneeded+1;
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result=(UChar*)malloc(sizeof(UChar) * resultlength);
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_format(cur_def, l, result, resultlength, &pos1, &status);
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error in formatting using unum_format(.....): %s\n", myErrorName(status));
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Fail: error in unum_setSymbols: %s\n", myErrorName(status));
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_applyPattern(cur_frpattern, FALSE, result, u_strlen(result),NULL,NULL);
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (symType = UNUM_DECIMAL_SEPARATOR_SYMBOL; symType < UNUM_FORMAT_SYMBOL_COUNT; symType++) {
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_getSymbol(cur_def, symType, temp1, sizeof(temp1), &status);
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_getSymbol(cur_frpattern, symType, temp2, sizeof(temp2), &status);
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status) || u_strcmp(temp1, temp2) != 0)
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Fail: error in getting symbols\n");
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("Pass: get and set symbols successful\n");
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*format and check with the previous result */
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=0;
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlengthneeded=unum_format(cur_frpattern, l, NULL, resultlength, &pos1, &status);
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR)
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=resultlengthneeded+1;
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_format(cur_frpattern, l, temp1, resultlength, &pos1, &status);
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error in formatting using unum_format(.....): %s\n", myErrorName(status));
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
587b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* TODO:
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * This test fails because we have not called unum_applyPattern().
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Currently, such an applyPattern() does not exist on the C API, and
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * we have jitterbug 411 for it.
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Since it is close to the 1.5 release, I (markus) am disabling this test just
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * for this release (I added the test itself only last week).
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * For the next release, we need to fix this.
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Then, remove the uprv_strcmp("1.5", ...) and this comment, and the include "cstring.h" at the beginning of this file.
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(u_strcmp(result, temp1) != 0) {
597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Formatting failed after setting symbols. result=%s temp1=%s\n", result, temp1);
598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*----------- */
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querufree(result);
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Testing unum_get/setSymbol() */
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i < UNUM_FORMAT_SYMBOL_COUNT; ++i) {
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        symbol[0] = (UChar)(0x41 + i);
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        symbol[1] = (UChar)(0x61 + i);
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_setSymbol(cur_frpattern, (UNumberFormatSymbol)i, symbol, 2, &status);
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)) {
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error from unum_setSymbol(%d): %s\n", i, myErrorName(status));
612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i < UNUM_FORMAT_SYMBOL_COUNT; ++i) {
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength = unum_getSymbol(cur_frpattern, (UNumberFormatSymbol)i, symbol, sizeof(symbol)/U_SIZEOF_UCHAR, &status);
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)) {
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error from unum_getSymbol(%d): %s\n", i, myErrorName(status));
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(resultlength != 2 || symbol[0] != 0x41 + i || symbol[1] != 0x61 + i) {
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Failure in unum_getSymbol(%d): got unexpected symbol\n", i);
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*try getting from a bogus symbol*/
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_getSymbol(cur_frpattern, (UNumberFormatSymbol)i, symbol, sizeof(symbol)/U_SIZEOF_UCHAR, &status);
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status)){
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error : Expected U_ILLEGAL_ARGUMENT_ERROR for bogus symbol");
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status != U_ILLEGAL_ARGUMENT_ERROR){
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error: Expected U_ILLEGAL_ARGUMENT_ERROR for bogus symbol, Got %s\n", myErrorName(status));
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status=U_ZERO_ERROR;
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Testing unum_getTextAttribute() and unum_setTextAttribute()*/
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting getting and setting text attributes\n");
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=5;
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_getTextAttribute(cur_fr, UNUM_NEGATIVE_SUFFIX, temp, resultlength, &status);
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Failure in gettting the Text attributes of number format: %s\n", myErrorName(status));
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_setTextAttribute(cur_def, UNUM_NEGATIVE_SUFFIX, temp, u_strlen(temp), &status);
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Failure in gettting the Text attributes of number format: %s\n", myErrorName(status));
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_getTextAttribute(cur_def, UNUM_NEGATIVE_SUFFIX, suffix, resultlength, &status);
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Failure in gettting the Text attributes of number format: %s\n", myErrorName(status));
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(u_strcmp(suffix,temp)!=0)
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Fail:Error in setTextAttribute or getTextAttribute in setting and getting suffix\n");
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: setting and getting suffix works fine\n");
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*set it back to normal */
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(temp,"$");
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_setTextAttribute(cur_def, UNUM_NEGATIVE_SUFFIX, temp, u_strlen(temp), &status);
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*checking some more text setter conditions */
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(prefix, "+");
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_setTextAttribute(def, UNUM_POSITIVE_PREFIX, prefix, u_strlen(prefix) , &status);
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in setting the text attributes : %s\n", myErrorName(status));
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_getTextAttribute(def, UNUM_POSITIVE_PREFIX, temp, resultlength, &status);
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in getting the text attributes : %s\n", myErrorName(status));
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
676b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(u_strcmp(prefix, temp)!=0)
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ERROR: get and setTextAttributes with positive prefix failed\n");
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: get and setTextAttributes with positive prefix works fine\n");
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(prefix, "+");
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_setTextAttribute(def, UNUM_NEGATIVE_PREFIX, prefix, u_strlen(prefix), &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    unum_getTextAttribute(def, UNUM_NEGATIVE_PREFIX, temp, resultlength, &status);
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in getting the text attributes : %s\n", myErrorName(status));
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
692b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(u_strcmp(prefix, temp)!=0)
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ERROR: get and setTextAttributes with negative prefix failed\n");
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: get and setTextAttributes with negative prefix works fine\n");
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(suffix, "+");
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_setTextAttribute(def, UNUM_NEGATIVE_SUFFIX, suffix, u_strlen(suffix) , &status);
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in setting the text attributes: %s\n", myErrorName(status));
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_getTextAttribute(def, UNUM_NEGATIVE_SUFFIX, temp, resultlength, &status);
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in getting the text attributes : %s\n", myErrorName(status));
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
709b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(u_strcmp(suffix, temp)!=0)
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ERROR: get and setTextAttributes with negative suffix failed\n");
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: get and settextAttributes with negative suffix works fine\n");
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(suffix, "++");
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_setTextAttribute(def, UNUM_POSITIVE_SUFFIX, suffix, u_strlen(suffix) , &status);
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in setting the text attributes: %s\n", myErrorName(status));
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_getTextAttribute(def, UNUM_POSITIVE_SUFFIX, temp, resultlength, &status);
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in getting the text attributes : %s\n", myErrorName(status));
725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
726b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(u_strcmp(suffix, temp)!=0)
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ERROR: get and setTextAttributes with negative suffix failed\n");
728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: get and settextAttributes with negative suffix works fine\n");
730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*Testing unum_getAttribute and  unum_setAttribute() */
732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting get and set Attributes\n");
733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    attr=UNUM_GROUPING_SIZE;
734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    newvalue=unum_getAttribute(def, attr);
735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    newvalue=2;
736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_setAttribute(def, attr, newvalue);
737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(unum_getAttribute(def,attr)!=2)
738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Fail: error in setting and getting attributes for UNUM_GROUPING_SIZE\n");
739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: setting and getting attributes for UNUM_GROUPING_SIZE works fine\n");
741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    attr=UNUM_MULTIPLIER;
743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    newvalue=unum_getAttribute(def, attr);
744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    newvalue=8;
745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_setAttribute(def, attr, newvalue);
746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(unum_getAttribute(def,attr) != 8)
747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in setting and getting attributes for UNUM_MULTIPLIER\n");
748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass:setting and getting attributes for UNUM_MULTIPLIER works fine\n");
750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    attr=UNUM_SECONDARY_GROUPING_SIZE;
752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    newvalue=unum_getAttribute(def, attr);
753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    newvalue=2;
754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_setAttribute(def, attr, newvalue);
755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(unum_getAttribute(def,attr) != 2)
756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in setting and getting attributes for UNUM_SECONDARY_GROUPING_SIZE\n");
757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass:setting and getting attributes for UNUM_SECONDARY_GROUPING_SIZE works fine\n");
759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*testing set and get Attributes extensively */
761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting get and set attributes extensively\n");
762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(attr=UNUM_PARSE_INT_ONLY; attr<= UNUM_PADDING_POSITION; attr=(UNumberFormatAttribute)((int32_t)attr + 1) )
763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        newvalue=unum_getAttribute(fr, attr);
765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_setAttribute(def, attr, newvalue);
766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(unum_getAttribute(def,attr)!=unum_getAttribute(fr, attr))
767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error in setting and getting attributes\n");
768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("Pass: attributes set and retrieved successfully\n");
770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*testing spellout format to make sure we can use it successfully.*/
773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting spellout format\n");
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (spellout_def)
775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const int32_t values[] = { 0, -5, 105, 1005, 105050 };
777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i = 0; i < LENGTH(values); ++i) {
778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UChar buffer[128];
779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t len;
780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t value = values[i];
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            len = unum_format(spellout_def, value, buffer, LENGTH(buffer), NULL, &status);
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(U_FAILURE(status)) {
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Error in formatting using unum_format(spellout_fmt, ...): %s\n", myErrorName(status));
785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                int32_t pp = 0;
787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                int32_t parseResult;
78854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                /*ustrToAstr(buffer, len, logbuf, LENGTH(logbuf));*/
78954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                log_verbose("formatted %d as '%s', length: %d\n", value, aescstrdup(buffer, len), len);
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                parseResult = unum_parse(spellout_def, buffer, len, &pp, &status);
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (U_FAILURE(status)) {
793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("Error in parsing using unum_format(spellout_fmt, ...): %s\n", myErrorName(status));
794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                } else if (parseResult != value) {
795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("unum_format result %d != value %d\n", parseResult, value);
796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Spellout format is unavailable\n");
802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
80450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    {    /* Test for ticket #7079 */
80550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UNumberFormat* dec_en;
80650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UChar groupingSep[] = { 0 };
80750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UChar numPercent[] = { 0x0031, 0x0032, 0x0025, 0 }; /* "12%" */
80850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        double parseResult = 0.0;
809b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
81050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status=U_ZERO_ERROR;
81150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        dec_en = unum_open(UNUM_DECIMAL, NULL, 0, "en_US", NULL, &status);
81250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        unum_setAttribute(dec_en, UNUM_LENIENT_PARSE, 0);
81350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        unum_setSymbol(dec_en, UNUM_GROUPING_SEPARATOR_SYMBOL, groupingSep, 0, &status);
81450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        parseResult = unum_parseDouble(dec_en, numPercent, -1, NULL, &status);
81550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /* Without the fix in #7079, the above call will hang */
81650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if ( U_FAILURE(status) || parseResult != 12.0 ) {
81750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            log_err("unum_parseDouble with empty groupingSep: status %s, parseResult %f not 12.0\n",
81850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                    myErrorName(status), parseResult);
81950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        } else {
82050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            log_verbose("unum_parseDouble with empty groupingSep: no hang, OK\n");
82150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
82250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        unum_close(dec_en);
82350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
824b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
82527f654740f2a26ad62a5c155af9199af9e69b889claireho    {   /* Test parse & format of big decimals.  Use a number with too many digits to fit in a double,
82627f654740f2a26ad62a5c155af9199af9e69b889claireho                                         to verify that it is taking the pure decimal path. */
82727f654740f2a26ad62a5c155af9199af9e69b889claireho        UNumberFormat *fmt;
828b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        const char *bdpattern = "#,##0.#########";
829b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        const char *numInitial     = "12345678900987654321.1234567896";
83027f654740f2a26ad62a5c155af9199af9e69b889claireho        const char *numFormatted  = "12,345,678,900,987,654,321.12345679";
83127f654740f2a26ad62a5c155af9199af9e69b889claireho        const char *parseExpected = "12345678900987654321.12345679";
83227f654740f2a26ad62a5c155af9199af9e69b889claireho        int32_t resultSize    = 0;
83327f654740f2a26ad62a5c155af9199af9e69b889claireho        int32_t parsePos      = 0;     /* Output parameter for Parse operations. */
83427f654740f2a26ad62a5c155af9199af9e69b889claireho        #define DESTCAPACITY 100
83527f654740f2a26ad62a5c155af9199af9e69b889claireho        UChar dest[DESTCAPACITY];
83627f654740f2a26ad62a5c155af9199af9e69b889claireho        char  desta[DESTCAPACITY];
83727f654740f2a26ad62a5c155af9199af9e69b889claireho        UFieldPosition fieldPos = {0};
83827f654740f2a26ad62a5c155af9199af9e69b889claireho
83927f654740f2a26ad62a5c155af9199af9e69b889claireho        /* Format */
84027f654740f2a26ad62a5c155af9199af9e69b889claireho
84127f654740f2a26ad62a5c155af9199af9e69b889claireho        status = U_ZERO_ERROR;
84227f654740f2a26ad62a5c155af9199af9e69b889claireho        u_uastrcpy(dest, bdpattern);
84327f654740f2a26ad62a5c155af9199af9e69b889claireho        fmt = unum_open(UNUM_PATTERN_DECIMAL, dest, -1, "en", NULL /*parseError*/, &status);
84427f654740f2a26ad62a5c155af9199af9e69b889claireho        if (U_FAILURE(status)) log_err("File %s, Line %d, status = %s\n", __FILE__, __LINE__, u_errorName(status));
84527f654740f2a26ad62a5c155af9199af9e69b889claireho
846b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        resultSize = unum_formatDecimal(fmt, numInitial, -1, dest, DESTCAPACITY, NULL, &status);
84727f654740f2a26ad62a5c155af9199af9e69b889claireho        if (U_FAILURE(status)) {
84827f654740f2a26ad62a5c155af9199af9e69b889claireho            log_err("File %s, Line %d, status = %s\n", __FILE__, __LINE__, u_errorName(status));
84927f654740f2a26ad62a5c155af9199af9e69b889claireho        }
85027f654740f2a26ad62a5c155af9199af9e69b889claireho        u_austrncpy(desta, dest, DESTCAPACITY);
85127f654740f2a26ad62a5c155af9199af9e69b889claireho        if (strcmp(numFormatted, desta) != 0) {
85227f654740f2a26ad62a5c155af9199af9e69b889claireho            log_err("File %s, Line %d, (expected, acutal) =  (\"%s\", \"%s\")\n",
85327f654740f2a26ad62a5c155af9199af9e69b889claireho                    __FILE__, __LINE__, numFormatted, desta);
85427f654740f2a26ad62a5c155af9199af9e69b889claireho        }
85527f654740f2a26ad62a5c155af9199af9e69b889claireho        if (strlen(numFormatted) != resultSize) {
856b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err("File %s, Line %d, (expected, actual) = (%d, %d)\n",
85727f654740f2a26ad62a5c155af9199af9e69b889claireho                     __FILE__, __LINE__, strlen(numFormatted), resultSize);
85827f654740f2a26ad62a5c155af9199af9e69b889claireho        }
85927f654740f2a26ad62a5c155af9199af9e69b889claireho
86027f654740f2a26ad62a5c155af9199af9e69b889claireho        /* Format with a FieldPosition parameter */
86127f654740f2a26ad62a5c155af9199af9e69b889claireho
862103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        fieldPos.field = UNUM_DECIMAL_SEPARATOR_FIELD;
863b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        resultSize = unum_formatDecimal(fmt, numInitial, -1, dest, DESTCAPACITY, &fieldPos, &status);
86427f654740f2a26ad62a5c155af9199af9e69b889claireho        if (U_FAILURE(status)) {
86527f654740f2a26ad62a5c155af9199af9e69b889claireho            log_err("File %s, Line %d, status = %s\n", __FILE__, __LINE__, u_errorName(status));
86627f654740f2a26ad62a5c155af9199af9e69b889claireho        }
86727f654740f2a26ad62a5c155af9199af9e69b889claireho        u_austrncpy(desta, dest, DESTCAPACITY);
86827f654740f2a26ad62a5c155af9199af9e69b889claireho        if (strcmp(numFormatted, desta) != 0) {
86927f654740f2a26ad62a5c155af9199af9e69b889claireho            log_err("File %s, Line %d, (expected, acutal) =  (\"%s\", \"%s\")\n",
87027f654740f2a26ad62a5c155af9199af9e69b889claireho                    __FILE__, __LINE__, numFormatted, desta);
87127f654740f2a26ad62a5c155af9199af9e69b889claireho        }
87227f654740f2a26ad62a5c155af9199af9e69b889claireho        if (fieldPos.beginIndex != 26) {  /* index of "." in formatted number */
87327f654740f2a26ad62a5c155af9199af9e69b889claireho            log_err("File %s, Line %d, (expected, acutal) =  (%d, %d)\n",
87427f654740f2a26ad62a5c155af9199af9e69b889claireho                    __FILE__, __LINE__, 0, fieldPos.beginIndex);
87527f654740f2a26ad62a5c155af9199af9e69b889claireho        }
87627f654740f2a26ad62a5c155af9199af9e69b889claireho        if (fieldPos.endIndex != 27) {
87727f654740f2a26ad62a5c155af9199af9e69b889claireho            log_err("File %s, Line %d, (expected, acutal) =  (%d, %d)\n",
87827f654740f2a26ad62a5c155af9199af9e69b889claireho                    __FILE__, __LINE__, 0, fieldPos.endIndex);
87927f654740f2a26ad62a5c155af9199af9e69b889claireho        }
880b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
88127f654740f2a26ad62a5c155af9199af9e69b889claireho        /* Parse */
88227f654740f2a26ad62a5c155af9199af9e69b889claireho
88327f654740f2a26ad62a5c155af9199af9e69b889claireho        status = U_ZERO_ERROR;
88427f654740f2a26ad62a5c155af9199af9e69b889claireho        u_uastrcpy(dest, numFormatted);   /* Parse the expected output of the formatting test */
88527f654740f2a26ad62a5c155af9199af9e69b889claireho        resultSize = unum_parseDecimal(fmt, dest, -1, NULL, desta, DESTCAPACITY, &status);
88627f654740f2a26ad62a5c155af9199af9e69b889claireho        if (U_FAILURE(status)) {
88727f654740f2a26ad62a5c155af9199af9e69b889claireho            log_err("File %s, Line %d, status = %s\n", __FILE__, __LINE__, u_errorName(status));
88827f654740f2a26ad62a5c155af9199af9e69b889claireho        }
88927f654740f2a26ad62a5c155af9199af9e69b889claireho        if (strcmp(parseExpected, desta) != 0) {
89027f654740f2a26ad62a5c155af9199af9e69b889claireho            log_err("File %s, Line %d, (expected, actual) = (\"%s\", \"%s\")\n",
89127f654740f2a26ad62a5c155af9199af9e69b889claireho                    __FILE__, __LINE__, parseExpected, desta);
89227f654740f2a26ad62a5c155af9199af9e69b889claireho        }
89327f654740f2a26ad62a5c155af9199af9e69b889claireho        if (strlen(parseExpected) != resultSize) {
89427f654740f2a26ad62a5c155af9199af9e69b889claireho            log_err("File %s, Line %d, (expected, actual) = (%d, %d)\n",
89527f654740f2a26ad62a5c155af9199af9e69b889claireho                    __FILE__, __LINE__, strlen(parseExpected), resultSize);
89627f654740f2a26ad62a5c155af9199af9e69b889claireho        }
89727f654740f2a26ad62a5c155af9199af9e69b889claireho
89827f654740f2a26ad62a5c155af9199af9e69b889claireho        /* Parse with a parsePos parameter */
899b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
90027f654740f2a26ad62a5c155af9199af9e69b889claireho        status = U_ZERO_ERROR;
90127f654740f2a26ad62a5c155af9199af9e69b889claireho        u_uastrcpy(dest, numFormatted);   /* Parse the expected output of the formatting test */
90227f654740f2a26ad62a5c155af9199af9e69b889claireho        parsePos = 3;                 /*      12,345,678,900,987,654,321.12345679         */
90327f654740f2a26ad62a5c155af9199af9e69b889claireho                                      /* start parsing at the the third char              */
90427f654740f2a26ad62a5c155af9199af9e69b889claireho        resultSize = unum_parseDecimal(fmt, dest, -1, &parsePos, desta, DESTCAPACITY, &status);
90527f654740f2a26ad62a5c155af9199af9e69b889claireho        if (U_FAILURE(status)) {
90627f654740f2a26ad62a5c155af9199af9e69b889claireho            log_err("File %s, Line %d, status = %s\n", __FILE__, __LINE__, u_errorName(status));
90727f654740f2a26ad62a5c155af9199af9e69b889claireho        }
90827f654740f2a26ad62a5c155af9199af9e69b889claireho        if (strcmp(parseExpected+2, desta) != 0) {   /*  "345678900987654321.12345679" */
90927f654740f2a26ad62a5c155af9199af9e69b889claireho            log_err("File %s, Line %d, (expected, actual) = (\"%s\", \"%s\")\n",
91027f654740f2a26ad62a5c155af9199af9e69b889claireho                    __FILE__, __LINE__, parseExpected+2, desta);
91127f654740f2a26ad62a5c155af9199af9e69b889claireho        }
91227f654740f2a26ad62a5c155af9199af9e69b889claireho        if (strlen(numFormatted) != parsePos) {
91327f654740f2a26ad62a5c155af9199af9e69b889claireho            log_err("File %s, Line %d, parsePos (expected, actual) = (\"%d\", \"%d\")\n",
91427f654740f2a26ad62a5c155af9199af9e69b889claireho                    __FILE__, __LINE__, strlen(parseExpected), parsePos);
91527f654740f2a26ad62a5c155af9199af9e69b889claireho        }
91627f654740f2a26ad62a5c155af9199af9e69b889claireho
91727f654740f2a26ad62a5c155af9199af9e69b889claireho        unum_close(fmt);
91827f654740f2a26ad62a5c155af9199af9e69b889claireho    }
91927f654740f2a26ad62a5c155af9199af9e69b889claireho
920b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    status = U_ZERO_ERROR;
921b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* Test invalid symbol argument */
922b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    {
923b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t badsymbolLarge = UNUM_FORMAT_SYMBOL_COUNT + 1;
924b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t badsymbolSmall = -1;
925b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UChar value[10];
926b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t valueLength = 10;
927b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UNumberFormat *fmt = unum_open(UNUM_DEFAULT, NULL, 0, NULL, NULL, &status);
928b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (U_FAILURE(status)) {
929b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err("File %s, Line %d, status = %s\n", __FILE__, __LINE__, u_errorName(status));
930b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        } else {
931b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            unum_getSymbol(fmt, (UNumberFormatSymbol)badsymbolLarge, NULL, 0, &status);
932b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (U_SUCCESS(status)) log_err("unum_getSymbol()'s status should be ILLEGAL_ARGUMENT with invalid symbol (> UNUM_FORMAT_SYMBOL_COUNT) argument\n");
933b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
934b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            status = U_ZERO_ERROR;
935b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            unum_getSymbol(fmt, (UNumberFormatSymbol)badsymbolSmall, NULL, 0, &status);
936b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (U_SUCCESS(status)) log_err("unum_getSymbol()'s status should be ILLEGAL_ARGUMENT with invalid symbol (less than 0) argument\n");
937b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
938b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            status = U_ZERO_ERROR;
939b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            unum_setSymbol(fmt, (UNumberFormatSymbol)badsymbolLarge, value, valueLength, &status);
940b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (U_SUCCESS(status)) log_err("unum_setSymbol()'s status should be ILLEGAL_ARGUMENT with invalid symbol (> UNUM_FORMAT_SYMBOL_COUNT) argument\n");
941b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
942b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            status = U_ZERO_ERROR;
943b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            unum_setSymbol(fmt, (UNumberFormatSymbol)badsymbolSmall, value, valueLength, &status);
944b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (U_SUCCESS(status)) log_err("unum_setSymbol()'s status should be ILLEGAL_ARGUMENT with invalid symbol (less than 0) argument\n");
945b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
946b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            unum_close(fmt);
947b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
948b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
949b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
95050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*closing the NumberFormat() using unum_close(UNumberFormat*)")*/
952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(def);
953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(fr);
954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(cur_def);
955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(cur_fr);
956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(per_def);
957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(per_fr);
958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(spellout_def);
959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(pattern);
960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(cur_frpattern);
961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(myclone);
962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
965b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestParseZero(void)
966b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{
967b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UErrorCode errorCode = U_ZERO_ERROR;
968b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UChar input[] = {0x30, 0};   /*  Input text is decimal '0' */
969b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UChar pat[] = {0x0023,0x003b,0x0023,0}; /*  {'#', ';', '#', 0}; */
970b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    double  dbl;
971b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
972b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#if 0
973b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UNumberFormat* unum = unum_open( UNUM_DECIMAL /*or UNUM_DEFAULT*/, NULL, -1, NULL, NULL, &errorCode);
974b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#else
975b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UNumberFormat* unum = unum_open( UNUM_PATTERN_DECIMAL /*needs pattern*/, pat, -1, NULL, NULL, &errorCode);
976b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#endif
977b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
978b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    dbl = unum_parseDouble( unum, input, -1 /*u_strlen(input)*/, 0 /* 0 = start */, &errorCode );
979b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (U_FAILURE(errorCode)) {
980b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_data_err("Result - %s\n", u_errorName(errorCode));
981b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } else {
982b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_verbose("Double: %f\n", dbl);
983b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
984b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    unum_close(unum);
985b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
986b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
987b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar dollars2Sym[] = { 0x24,0x32,0x2E,0x30,0x30,0 }; /* $2.00 */
988b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar dollars4Sym[] = { 0x24,0x34,0 }; /* $4 */
989b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar dollars9Sym[] = { 0x39,0xA0,0x24,0 }; /* 9 $ */
990b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar pounds3Sym[]  = { 0xA3,0x33,0x2E,0x30,0x30,0 }; /* [POUND]3.00 */
991b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar pounds5Sym[]  = { 0xA3,0x35,0 }; /* [POUND]5 */
992b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar pounds7Sym[]  = { 0x37,0xA0,0xA3,0 }; /* 7 [POUND] */
993b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar euros4Sym[]   = { 0x34,0x2C,0x30,0x30,0xA0,0x20AC,0 }; /* 4,00 [EURO] */
994b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar euros6Sym[]   = { 0x36,0xA0,0x20AC,0 }; /* 6 [EURO] */
995b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar euros8Sym[]   = { 0x20AC,0x38,0 }; /* [EURO]8 */
996b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar dollars4PluEn[] = { 0x34,0x20,0x55,0x53,0x20,0x64,0x6F,0x6C,0x6C,0x61,0x72,0x73,0 }; /* 4 US dollars*/
997b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic 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 */
998b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar euros8PluEn[]   = { 0x38,0x20,0x65,0x75,0x72,0x6F,0x73,0 }; /* 8 euros*/
999b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const UChar euros6PluFr[]   = { 0x36,0x20,0x65,0x75,0x72,0x6F,0x73,0 }; /* 6 euros*/
1000b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1001b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehotypedef struct {
1002b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const char *  locale;
1003b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const char *  descrip;
1004b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const UChar * currStr;
1005b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const UChar * plurStr;
1006b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UErrorCode    parsDoubExpectErr;
1007b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t       parsDoubExpectPos;
1008b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    double        parsDoubExpectVal;
1009b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UErrorCode    parsCurrExpectErr;
1010b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t       parsCurrExpectPos;
1011b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    double        parsCurrExpectVal;
1012b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const char *  parsCurrExpectCurr;
1013b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} ParseCurrencyItem;
1014b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1015b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const ParseCurrencyItem parseCurrencyItems[] = {
1016b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en_US", "dollars2", dollars2Sym, NULL,          U_ZERO_ERROR,  5, 2.0, U_ZERO_ERROR,  5, 2.0, "USD" },
1017b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en_US", "dollars4", dollars4Sym, dollars4PluEn, U_ZERO_ERROR,  2, 4.0, U_ZERO_ERROR,  2, 4.0, "USD" },
1018b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en_US", "dollars9", dollars9Sym, NULL,          U_PARSE_ERROR, 1, 0.0, U_PARSE_ERROR, 1, 0.0, ""    },
1019b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en_US", "pounds3",  pounds3Sym,  NULL,          U_PARSE_ERROR, 0, 0.0, U_ZERO_ERROR,  5, 3.0, "GBP" },
1020b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en_US", "pounds5",  pounds5Sym,  pounds5PluEn,  U_PARSE_ERROR, 0, 0.0, U_ZERO_ERROR,  2, 5.0, "GBP" },
1021b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en_US", "pounds7",  pounds7Sym,  NULL,          U_PARSE_ERROR, 1, 0.0, U_PARSE_ERROR, 1, 0.0, ""    },
1022b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en_US", "euros8",   euros8Sym,   euros8PluEn,   U_PARSE_ERROR, 0, 0.0, U_ZERO_ERROR,  2, 8.0, "EUR" },
1023b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1024b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en_GB", "pounds3",  pounds3Sym,  NULL,          U_ZERO_ERROR,  5, 3.0, U_ZERO_ERROR,  5, 3.0, "GBP" },
1025b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en_GB", "pounds5",  pounds5Sym,  pounds5PluEn,  U_ZERO_ERROR,  2, 5.0, U_ZERO_ERROR,  2, 5.0, "GBP" },
1026b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en_GB", "pounds7",  pounds7Sym,  NULL,          U_PARSE_ERROR, 1, 0.0, U_PARSE_ERROR, 1, 0.0, ""    },
1027b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en_GB", "euros4",   euros4Sym,   NULL,          U_PARSE_ERROR, 4, 0.0, U_PARSE_ERROR, 4, 0.0, ""    },
1028b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en_GB", "euros6",   euros6Sym,   NULL,          U_PARSE_ERROR, 1, 0.0, U_PARSE_ERROR, 1, 0.0, ""    },
1029b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en_GB", "euros8",   euros8Sym,   euros8PluEn,   U_PARSE_ERROR, 0, 0.0, U_ZERO_ERROR,  2, 8.0, "EUR" },
1030b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "en_GB", "dollars4", dollars4Sym, dollars4PluEn, U_PARSE_ERROR, 0, 0.0, U_ZERO_ERROR,  2, 4.0, "USD" },
1031b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1032b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "fr_FR", "euros4",   euros4Sym,   NULL,          U_ZERO_ERROR,  6, 4.0, U_ZERO_ERROR,  6, 4.0, "EUR" },
1033b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "fr_FR", "euros6",   euros6Sym,   euros6PluFr,   U_ZERO_ERROR,  3, 6.0, U_ZERO_ERROR,  3, 6.0, "EUR" },
1034b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "fr_FR", "euros8",   euros8Sym,   NULL,          U_PARSE_ERROR, 0, 0.0, U_PARSE_ERROR, 0, 0.0, ""    },
1035b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "fr_FR", "dollars2", dollars2Sym, NULL,          U_PARSE_ERROR, 0, 0.0, U_PARSE_ERROR, 0, 0.0, ""    },
1036b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { "fr_FR", "dollars4", dollars4Sym, NULL,          U_PARSE_ERROR, 0, 0.0, U_PARSE_ERROR, 0, 0.0, ""    },
1037b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1038b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    { NULL,    NULL,       NULL,        NULL,          0,             0, 0.0, 0,             0, 0.0, NULL  }
1039b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
1040b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1041b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestParseCurrency()
1042b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{
1043b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const ParseCurrencyItem * itemPtr;
1044b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for (itemPtr = parseCurrencyItems; itemPtr->locale != NULL; ++itemPtr) {
1045b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UNumberFormat* unum;
1046b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UErrorCode status;
1047b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        double parseVal;
1048b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t parsePos;
1049b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UChar parseCurr[4];
1050b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        char parseCurrB[4];
1051b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1052b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        status = U_ZERO_ERROR;
1053b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        unum = unum_open(UNUM_CURRENCY, NULL, 0, itemPtr->locale, NULL, &status);
1054b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (U_SUCCESS(status)) {
1055b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            status = U_ZERO_ERROR;
1056b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            parsePos = 0;
1057b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            parseVal = unum_parseDouble(unum, itemPtr->currStr, -1, &parsePos, &status);
1058b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (status != itemPtr->parsDoubExpectErr || parsePos != itemPtr->parsDoubExpectPos || parseVal != itemPtr->parsDoubExpectVal) {
1059b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                log_err("UNUM_CURRENCY parseDouble %s/%s, expect %s pos %d val %.1f, get %s pos %d val %.1f\n",
1060b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        itemPtr->locale, itemPtr->descrip,
1061b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        u_errorName(itemPtr->parsDoubExpectErr), itemPtr->parsDoubExpectPos, itemPtr->parsDoubExpectVal,
1062b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        u_errorName(status), parsePos, parseVal );
1063b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
1064b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            status = U_ZERO_ERROR;
1065b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            parsePos = 0;
1066b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            parseCurr[0] = 0;
1067b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            parseVal = unum_parseDoubleCurrency(unum, itemPtr->currStr, -1, &parsePos, parseCurr, &status);
1068b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            u_austrncpy(parseCurrB, parseCurr, 4);
1069b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (status != itemPtr->parsCurrExpectErr || parsePos != itemPtr->parsCurrExpectPos || parseVal != itemPtr->parsCurrExpectVal ||
1070b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    strncmp(parseCurrB, itemPtr->parsCurrExpectCurr, 4) != 0) {
1071b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                log_err("UNUM_CURRENCY parseDoubleCurrency %s/%s, expect %s pos %d val %.1f cur %s, get %s pos %d val %.1f cur %s\n",
1072b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        itemPtr->locale, itemPtr->descrip,
1073b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        u_errorName(itemPtr->parsCurrExpectErr), itemPtr->parsCurrExpectPos, itemPtr->parsCurrExpectVal, itemPtr->parsCurrExpectCurr,
1074b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        u_errorName(status), parsePos, parseVal, parseCurrB );
1075b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
1076b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            unum_close(unum);
1077b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        } else {
1078b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_data_err("unexpected error in unum_open UNUM_CURRENCY for locale %s: '%s'\n", itemPtr->locale, u_errorName(status));
1079b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
1080b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1081b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (itemPtr->plurStr != NULL) {
1082b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            status = U_ZERO_ERROR;
1083b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            unum = unum_open(UNUM_CURRENCY_PLURAL, NULL, 0, itemPtr->locale, NULL, &status);
1084b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (U_SUCCESS(status)) {
1085b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                status = U_ZERO_ERROR;
1086b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                parsePos = 0;
1087b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                parseVal = unum_parseDouble(unum, itemPtr->plurStr, -1, &parsePos, &status);
1088b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                if (status != itemPtr->parsDoubExpectErr || parseVal != itemPtr->parsDoubExpectVal) {
1089b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    log_err("UNUM_CURRENCY parseDouble %s/%s, expect %s val %.1f, get %s val %.1f\n",
1090b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            itemPtr->locale, itemPtr->descrip,
1091b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            u_errorName(itemPtr->parsDoubExpectErr), itemPtr->parsDoubExpectVal,
1092b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            u_errorName(status), parseVal );
1093b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                }
1094b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                status = U_ZERO_ERROR;
1095b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                parsePos = 0;
1096b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                parseCurr[0] = 0;
1097b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                parseVal = unum_parseDoubleCurrency(unum, itemPtr->plurStr, -1, &parsePos, parseCurr, &status);
1098b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                u_austrncpy(parseCurrB, parseCurr, 4);
1099b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                if (status != itemPtr->parsCurrExpectErr || parseVal != itemPtr->parsCurrExpectVal ||
1100b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                        strncmp(parseCurrB, itemPtr->parsCurrExpectCurr, 4) != 0) {
1101b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    log_err("UNUM_CURRENCY parseDoubleCurrency %s/%s, expect %s val %.1f cur %s, get %s val %.1f cur %s\n",
1102b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            itemPtr->locale, itemPtr->descrip,
1103b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            u_errorName(itemPtr->parsCurrExpectErr), itemPtr->parsCurrExpectVal, itemPtr->parsCurrExpectCurr,
1104b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                            u_errorName(status), parseVal, parseCurrB );
1105b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                }
1106b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                unum_close(unum);
1107b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            } else {
1108b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                log_data_err("unexpected error in unum_open UNUM_CURRENCY_PLURAL for locale %s: '%s'\n", itemPtr->locale, u_errorName(status));
1109b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
1110b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
1111b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
1112b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
1113b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1114b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querutypedef struct {
1115b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const char *  testname;
1116b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const char *  locale;
1117b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const UChar * source;
1118b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t       startPos;
1119b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t       value;
1120b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    int32_t       endPos;
1121b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UErrorCode    status;
1122b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} SpelloutParseTest;
1123b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1124b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const UChar ustr_en0[]   = {0x7A, 0x65, 0x72, 0x6F, 0}; /* zero */
1125b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const UChar ustr_123[]   = {0x31, 0x32, 0x33, 0};       /* 123 */
1126b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const UChar ustr_en123[] = {0x6f, 0x6e, 0x65, 0x20, 0x68, 0x75, 0x6e, 0x64, 0x72, 0x65, 0x64,
1127b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                   0x20, 0x74, 0x77, 0x65, 0x6e, 0x74, 0x79,
1128b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                   0x2d, 0x74, 0x68, 0x72, 0x65, 0x65, 0}; /* one hundred twenty-three */
112959d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar ustr_fr123[] = {0x63, 0x65, 0x6e, 0x74, 0x20, 0x76, 0x69, 0x6e, 0x67, 0x74, 0x2d,
113059d709d503bab6e2b61931737e662dd293b40578ccornelius                                   0x74, 0x72, 0x6f, 0x69, 0x73, 0};       /* cent vingt-trois */
1131b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const UChar ustr_ja123[] = {0x767e, 0x4e8c, 0x5341, 0x4e09, 0};     /* kanji 100(+)2(*)10(+)3 */
1132b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1133b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const SpelloutParseTest spelloutParseTests[] = {
1134b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    /* name    loc   src       start val  end status */
1135b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "en0",   "en", ustr_en0,    0,   0,  4, U_ZERO_ERROR },
1136b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "en0",   "en", ustr_en0,    2,   0,  2, U_PARSE_ERROR },
1137b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "en0",   "ja", ustr_en0,    0,   0,  0, U_PARSE_ERROR },
1138b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "123",   "en", ustr_123,    0, 123,  3, U_ZERO_ERROR },
1139b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "en123", "en", ustr_en123,  0, 123, 24, U_ZERO_ERROR },
1140b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "en123", "en", ustr_en123, 12,  23, 24, U_ZERO_ERROR },
1141b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "en123", "fr", ustr_en123, 16,   0, 16, U_PARSE_ERROR },
1142b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "fr123", "fr", ustr_fr123,  0, 123, 16, U_ZERO_ERROR },
1143b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "fr123", "fr", ustr_fr123,  5,  23, 16, U_ZERO_ERROR },
1144b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "fr123", "en", ustr_fr123,  0,   0,  0, U_PARSE_ERROR },
1145b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "ja123", "ja", ustr_ja123,  0, 123,  4, U_ZERO_ERROR },
1146b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "ja123", "ja", ustr_ja123,  1,  23,  4, U_ZERO_ERROR },
1147b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { "ja123", "fr", ustr_ja123,  0,   0,  0, U_PARSE_ERROR },
1148b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    { NULL,    NULL, NULL,        0,   0,  0, 0 } /* terminator */
1149b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru};
1150b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1151b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void TestSpelloutNumberParse()
1152b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{
1153b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const SpelloutParseTest * testPtr;
1154b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for (testPtr = spelloutParseTests; testPtr->testname != NULL; ++testPtr) {
1155b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1156b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        int32_t	value, position = testPtr->startPos;
1157b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UNumberFormat *nf = unum_open(UNUM_SPELLOUT, NULL, 0, testPtr->locale, NULL, &status);
1158b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if (U_FAILURE(status)) {
11596d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_err_status(status, "unum_open fails for UNUM_SPELLOUT with locale %s, status %s\n", testPtr->locale, myErrorName(status));
1160b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            continue;
1161b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
1162b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        value = unum_parse(nf, testPtr->source, -1, &position, &status);
1163b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if ( value != testPtr->value || position != testPtr->endPos || status != testPtr->status ) {
1164b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-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",
1165b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    testPtr->locale, testPtr->testname, testPtr->startPos,
1166b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    testPtr->value, testPtr->endPos, myErrorName(testPtr->status),
1167b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    value, position, myErrorName(status) );
1168b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
1169b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        unum_close(nf);
1170b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
1171b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
1172b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestSignificantDigits()
1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar temp[128];
1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t resultlengthneeded;
1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t resultlength;
1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *result = NULL;
1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UNumberFormat* fmt;
1181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double d = 123456.789;
1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(temp, "###0.0#");
1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt=unum_open(UNUM_IGNORE, temp, -1, NULL, NULL,&status);
1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1186b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_data_err("got unexpected error for unum_open: '%s'\n", u_errorName(status));
1187c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return;
1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_setAttribute(fmt, UNUM_SIGNIFICANT_DIGITS_USED, TRUE);
1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_setAttribute(fmt, UNUM_MAX_SIGNIFICANT_DIGITS, 6);
1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(temp, "123457");
1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=0;
1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlengthneeded=unum_formatDouble(fmt, d, NULL, resultlength, NULL, &status);
1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR)
1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=resultlengthneeded+1;
1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result=(UChar*)malloc(sizeof(UChar) * resultlength);
1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_formatDouble(fmt, d, result, resultlength, NULL, &status);
1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error in formatting using unum_formatDouble(.....): %s\n", myErrorName(status));
1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(u_strcmp(result, temp)==0)
1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: Number Formatting using unum_formatDouble() Successful\n");
1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Error in number formatting using unum_formatDouble()\n");
1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(result);
1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(fmt);
1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
121527f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestSigDigRounding()
121627f654740f2a26ad62a5c155af9199af9e69b889claireho{
121727f654740f2a26ad62a5c155af9199af9e69b889claireho    UErrorCode status = U_ZERO_ERROR;
121827f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar expected[128];
121927f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar result[128];
122027f654740f2a26ad62a5c155af9199af9e69b889claireho    char		temp1[128];
122127f654740f2a26ad62a5c155af9199af9e69b889claireho    char		temp2[128];
122227f654740f2a26ad62a5c155af9199af9e69b889claireho    UNumberFormat* fmt;
122327f654740f2a26ad62a5c155af9199af9e69b889claireho    double d = 123.4;
122427f654740f2a26ad62a5c155af9199af9e69b889claireho
122527f654740f2a26ad62a5c155af9199af9e69b889claireho    fmt=unum_open(UNUM_DECIMAL, NULL, 0, NULL /* "en_US"*/, NULL, &status);
122627f654740f2a26ad62a5c155af9199af9e69b889claireho    if (U_FAILURE(status)) {
122727f654740f2a26ad62a5c155af9199af9e69b889claireho        log_data_err("got unexpected error for unum_open: '%s'\n", u_errorName(status));
122827f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
122927f654740f2a26ad62a5c155af9199af9e69b889claireho    }
123027f654740f2a26ad62a5c155af9199af9e69b889claireho    unum_setAttribute(fmt, UNUM_LENIENT_PARSE, FALSE);
123127f654740f2a26ad62a5c155af9199af9e69b889claireho    unum_setAttribute(fmt, UNUM_SIGNIFICANT_DIGITS_USED, TRUE);
123227f654740f2a26ad62a5c155af9199af9e69b889claireho    unum_setAttribute(fmt, UNUM_MAX_SIGNIFICANT_DIGITS, 2);
123327f654740f2a26ad62a5c155af9199af9e69b889claireho    /* unum_setAttribute(fmt, UNUM_MAX_FRACTION_DIGITS, 0); */
123427f654740f2a26ad62a5c155af9199af9e69b889claireho
123527f654740f2a26ad62a5c155af9199af9e69b889claireho    unum_setAttribute(fmt, UNUM_ROUNDING_MODE, UNUM_ROUND_UP);
123627f654740f2a26ad62a5c155af9199af9e69b889claireho    unum_setDoubleAttribute(fmt, UNUM_ROUNDING_INCREMENT, 20.0);
123727f654740f2a26ad62a5c155af9199af9e69b889claireho
123827f654740f2a26ad62a5c155af9199af9e69b889claireho    (void)unum_formatDouble(fmt, d, result, sizeof(result) / sizeof(result[0]), NULL, &status);
123927f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(status))
124027f654740f2a26ad62a5c155af9199af9e69b889claireho    {
124127f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err("Error in formatting using unum_formatDouble(.....): %s\n", myErrorName(status));
124227f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
124327f654740f2a26ad62a5c155af9199af9e69b889claireho    }
124427f654740f2a26ad62a5c155af9199af9e69b889claireho
124527f654740f2a26ad62a5c155af9199af9e69b889claireho    u_uastrcpy(expected, "140");
124627f654740f2a26ad62a5c155af9199af9e69b889claireho    if(u_strcmp(result, expected)!=0)
124727f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err("FAIL: Error in unum_formatDouble result %s instead of %s\n", u_austrcpy(temp1, result), u_austrcpy(temp2, expected) );
1248b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
124927f654740f2a26ad62a5c155af9199af9e69b889claireho    unum_close(fmt);
125027f654740f2a26ad62a5c155af9199af9e69b889claireho}
125127f654740f2a26ad62a5c155af9199af9e69b889claireho
1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestNumberFormatPadding()
1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *result=NULL;
1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar temp1[512];
1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status=U_ZERO_ERROR;
1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t resultlength;
1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t resultlengthneeded;
1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UNumberFormat *pattern;
1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double d1;
1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double d = -10456.37;
1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UFieldPosition pos1;
1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t parsepos;
1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* create a number format using unum_openPattern(....)*/
1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting unum_openPattern() with padding\n");
1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(temp1, "*#,##0.0#*;(#,##0.0#)");
1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status=U_ZERO_ERROR;
1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern=unum_open(UNUM_IGNORE,temp1, u_strlen(temp1), NULL, NULL,&status);
1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status))
1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
12736d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err("error in unum_openPattern(%s): %s\n", temp1, myErrorName(status) );
1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_close(pattern);
1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*    u_uastrcpy(temp1, "*x#,###,###,##0.0#;(*x#,###,###,##0.0#)"); */
1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(temp1, "*x#,###,###,##0.0#;*x(###,###,##0.0#)");
1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status=U_ZERO_ERROR;
1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern=unum_open(UNUM_IGNORE,temp1, u_strlen(temp1), "en_US",NULL, &status);
1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
12866d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "error in padding unum_openPattern(%s): %s\n", temp1, myErrorName(status) );;
1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pass: padding unum_openPattern() works fine\n");
1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*test for unum_toPattern()*/
1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\nTesting padding unum_toPattern()\n");
1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=0;
1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlengthneeded=unum_toPattern(pattern, FALSE, NULL, resultlength, &status);
1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status==U_BUFFER_OVERFLOW_ERROR)
1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status=U_ZERO_ERROR;
1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            resultlength=resultlengthneeded+1;
1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result=(UChar*)malloc(sizeof(UChar) * resultlength);
1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            unum_toPattern(pattern, FALSE, result, resultlength, &status);
1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status))
1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error in extracting the padding pattern from UNumberFormat: %s\n", myErrorName(status));
1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(u_strcmp(result, temp1)!=0)
1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("FAIL: Error in extracting the padding pattern using unum_toPattern()\n");
1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else
1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_verbose("Pass: extracted the padding pattern correctly using unum_toPattern()\n");
1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querufree(result);
1313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*        u_uastrcpy(temp1, "(xxxxxxx10,456.37)"); */
1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrcpy(temp1, "xxxxx(10,456.37)");
1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=0;
1317103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        pos1.field = UNUM_FRACTION_FIELD;
1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlengthneeded=unum_formatDouble(pattern, d, NULL, resultlength, &pos1, &status);
1319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status==U_BUFFER_OVERFLOW_ERROR)
1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status=U_ZERO_ERROR;
1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            resultlength=resultlengthneeded+1;
1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result=(UChar*)malloc(sizeof(UChar) * resultlength);
1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            unum_formatDouble(pattern, d, result, resultlength, NULL, &status);
1325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status))
1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("Error in formatting using unum_formatDouble(.....) with padding : %s\n", myErrorName(status));
1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(u_strcmp(result, temp1)==0)
1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_verbose("Pass: Number Formatting using unum_formatDouble() padding Successful\n");
1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else
133527f654740f2a26ad62a5c155af9199af9e69b889claireho                log_data_err("FAIL: Error in number formatting using unum_formatDouble() with padding\n");
1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(pos1.beginIndex == 13 && pos1.endIndex == 15)
1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_verbose("Pass: Complete number formatting using unum_formatDouble() successful\n");
1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else
1339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Fail: Error in complete number Formatting using unum_formatDouble()\nGot: b=%d end=%d\nExpected: b=13 end=15\n",
1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        pos1.beginIndex, pos1.endIndex);
1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* Testing unum_parse() and unum_parseDouble() */
1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("\nTesting padding unum_parseDouble()\n");
1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            parsepos=0;
1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            d1=unum_parseDouble(pattern, result, u_strlen(result), &parsepos, &status);
1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(U_FAILURE(status))
1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            {
1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("padding parse failed. The error is : %s\n", myErrorName(status));
1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(d1!=d)
1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("Fail: Error in padding parsing\n");
1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else
1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_verbose("Pass: padding parsing successful\n");
1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querufree(result);
1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(pattern);
1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool
1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruwithinErr(double a, double b, double err) {
1365b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    return uprv_fabs(a - b) < uprv_fabs(a * err);
1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestInt64Format() {
1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar temp1[512];
1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar result[512];
1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UNumberFormat *fmt;
1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const double doubleInt64Max = (double)U_INT64_MAX;
1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const double doubleInt64Min = (double)U_INT64_MIN;
1375b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const double doubleBig = 10.0 * (double)U_INT64_MAX;
1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t val32;
1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int64_t val64;
1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double  valDouble;
1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t parsepos;
1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* create a number format using unum_openPattern(....) */
1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting Int64Format\n");
1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(temp1, "#.#E0");
1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt = unum_open(UNUM_IGNORE, temp1, u_strlen(temp1), NULL, NULL, &status);
1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
1386b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_data_err("error in unum_openPattern() - %s\n", myErrorName(status));
1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_setAttribute(fmt, UNUM_MAX_FRACTION_DIGITS, 20);
1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_formatInt64(fmt, U_INT64_MAX, result, 512, NULL, &status);
1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error in unum_format(): %s\n", myErrorName(status));
1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("format int64max: '%s'\n", result);
1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            parsepos = 0;
1395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            val32 = unum_parse(fmt, result, u_strlen(result), &parsepos, &status);
1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (status != U_INVALID_FORMAT_ERROR) {
1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parse didn't report error: %s\n", myErrorName(status));
1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else if (val32 != INT32_MAX) {
1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parse didn't pin return value, got: %d\n", val32);
1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            parsepos = 0;
1404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            val64 = unum_parseInt64(fmt, result, u_strlen(result), &parsepos, &status);
1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status)) {
1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parseInt64 returned error: %s\n", myErrorName(status));
1407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else if (val64 != U_INT64_MAX) {
1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parseInt64 returned incorrect value, got: %ld\n", val64);
1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            parsepos = 0;
1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            valDouble = unum_parseDouble(fmt, result, u_strlen(result), &parsepos, &status);
1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status)) {
1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parseDouble returned error: %s\n", myErrorName(status));
1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else if (valDouble != doubleInt64Max) {
1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parseDouble returned incorrect value, got: %g\n", valDouble);
1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_formatInt64(fmt, U_INT64_MIN, result, 512, NULL, &status);
1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error in unum_format(): %s\n", myErrorName(status));
1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("format int64min: '%s'\n", result);
1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            parsepos = 0;
1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            val32 = unum_parse(fmt, result, u_strlen(result), &parsepos, &status);
1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (status != U_INVALID_FORMAT_ERROR) {
1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parse didn't report error: %s\n", myErrorName(status));
1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else if (val32 != INT32_MIN) {
1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parse didn't pin return value, got: %d\n", val32);
1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            parsepos = 0;
1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            val64 = unum_parseInt64(fmt, result, u_strlen(result), &parsepos, &status);
1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status)) {
1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parseInt64 returned error: %s\n", myErrorName(status));
1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else if (val64 != U_INT64_MIN) {
1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parseInt64 returned incorrect value, got: %ld\n", val64);
1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            parsepos = 0;
1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            valDouble = unum_parseDouble(fmt, result, u_strlen(result), &parsepos, &status);
1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status)) {
1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parseDouble returned error: %s\n", myErrorName(status));
1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else if (valDouble != doubleInt64Min) {
1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parseDouble returned incorrect value, got: %g\n", valDouble);
1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_formatDouble(fmt, doubleBig, result, 512, NULL, &status);
1454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error in unum_format(): %s\n", myErrorName(status));
1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("format doubleBig: '%s'\n", result);
1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            parsepos = 0;
1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            val32 = unum_parse(fmt, result, u_strlen(result), &parsepos, &status);
1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (status != U_INVALID_FORMAT_ERROR) {
1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parse didn't report error: %s\n", myErrorName(status));
1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else if (val32 != INT32_MAX) {
1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parse didn't pin return value, got: %d\n", val32);
1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            parsepos = 0;
1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            val64 = unum_parseInt64(fmt, result, u_strlen(result), &parsepos, &status);
1469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (status != U_INVALID_FORMAT_ERROR) {
1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parseInt64 didn't report error error: %s\n", myErrorName(status));
1471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else if (val64 != U_INT64_MAX) {
1472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parseInt64 returned incorrect value, got: %ld\n", val64);
1473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
1476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            parsepos = 0;
1477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            valDouble = unum_parseDouble(fmt, result, u_strlen(result), &parsepos, &status);
1478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status)) {
1479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parseDouble returned error: %s\n", myErrorName(status));
1480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else if (!withinErr(valDouble, doubleBig, 1e-15)) {
1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("parseDouble returned incorrect value, got: %g\n", valDouble);
1482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1484b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1485b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho		u_uastrcpy(result, "5.06e-27");
1486b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        parsepos = 0;
1487b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        valDouble = unum_parseDouble(fmt, result, u_strlen(result), &parsepos, &status);
1488b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (U_FAILURE(status)) {
1489b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err("parseDouble() returned error: %s\n", myErrorName(status));
1490b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        } else if (!withinErr(valDouble, 5.06e-27, 1e-15)) {
1491b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err("parseDouble() returned incorrect value, got: %g\n", valDouble);
1492b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
1493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(fmt);
1495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void test_fmt(UNumberFormat* fmt, UBool isDecimal) {
1499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char temp[512];
1500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar buffer[512];
1501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t BUFSIZE = sizeof(buffer)/sizeof(buffer[0]);
1502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double vals[] = {
1503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        -.2, 0, .2, 5.5, 15.2, 250, 123456789
1504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int i;
1506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < sizeof(vals)/sizeof(vals[0]); ++i) {
1508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_formatDouble(fmt, vals[i], buffer, BUFSIZE, NULL, &status);
1510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
1511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("failed to format: %g, returned %s\n", vals[i], u_errorName(status));
1512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
1513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_austrcpy(temp, buffer);
1514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("formatting %g returned '%s'\n", vals[i], temp);
1515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* check APIs now */
1519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UParseError perr;
1522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_uastrcpy(buffer, "#,##0.0#");
1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_applyPattern(fmt, FALSE, buffer, -1, &perr, &status);
1524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (isDecimal ? U_FAILURE(status) : (status != U_UNSUPPORTED_ERROR)) {
1525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("got unexpected error for applyPattern: '%s'\n", u_errorName(status));
1526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int isLenient = unum_getAttribute(fmt, UNUM_LENIENT_PARSE);
1531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("lenient: 0x%x\n", isLenient);
1532b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (isLenient != FALSE) {
1533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("didn't expect lenient value: %d\n", isLenient);
1534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_setAttribute(fmt, UNUM_LENIENT_PARSE, TRUE);
1537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        isLenient = unum_getAttribute(fmt, UNUM_LENIENT_PARSE);
1538b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (isLenient != TRUE) {
1539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("didn't expect lenient value after set: %d\n", isLenient);
1540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        double val2;
1545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        double val = unum_getDoubleAttribute(fmt, UNUM_LENIENT_PARSE);
1546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (val != -1) {
1547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("didn't expect double attribute\n");
1548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        val = unum_getDoubleAttribute(fmt, UNUM_ROUNDING_INCREMENT);
1550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ((val == -1) == isDecimal) {
1551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("didn't expect -1 rounding increment\n");
1552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_setDoubleAttribute(fmt, UNUM_ROUNDING_INCREMENT, val+.5);
1554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        val2 = unum_getDoubleAttribute(fmt, UNUM_ROUNDING_INCREMENT);
1555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (isDecimal && (val2 - val != .5)) {
1556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("set rounding increment had no effect on decimal format");
1557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int len = unum_getTextAttribute(fmt, UNUM_DEFAULT_RULESET, buffer, BUFSIZE, &status);
1563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (isDecimal ? (status != U_UNSUPPORTED_ERROR) : U_FAILURE(status)) {
1564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("got unexpected error for get default ruleset: '%s'\n", u_errorName(status));
1565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_SUCCESS(status)) {
1567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_austrcpy(temp, buffer);
1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("default ruleset: '%s'\n", temp);
1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        len = unum_getTextAttribute(fmt, UNUM_PUBLIC_RULESETS, buffer, BUFSIZE, &status);
1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (isDecimal ? (status != U_UNSUPPORTED_ERROR) : U_FAILURE(status)) {
1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("got unexpected error for get public rulesets: '%s'\n", u_errorName(status));
1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_SUCCESS(status)) {
1577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_austrcpy(temp, buffer);
1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("public rulesets: '%s'\n", temp);
1579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* set the default ruleset to the first one found, and retry */
1581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (len > 0) {
1583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                for (i = 0; i < len && temp[i] != ';'; ++i){};
1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (i < len) {
1585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    buffer[i] = 0;
1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    unum_setTextAttribute(fmt, UNUM_DEFAULT_RULESET, buffer, -1, &status);
1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if (U_FAILURE(status)) {
1588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        log_err("unexpected error setting default ruleset: '%s'\n", u_errorName(status));
1589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    } else {
1590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        int len2 = unum_getTextAttribute(fmt, UNUM_DEFAULT_RULESET, buffer, BUFSIZE, &status);
1591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        if (U_FAILURE(status)) {
1592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            log_err("could not fetch default ruleset: '%s'\n", u_errorName(status));
1593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        } else if (len2 != i) {
1594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            u_austrcpy(temp, buffer);
1595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            log_err("unexpected ruleset len: %d ex: %d val: %s\n", len2, i, temp);
1596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        } else {
1597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            for (i = 0; i < sizeof(vals)/sizeof(vals[0]); ++i) {
1598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                status = U_ZERO_ERROR;
1599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                unum_formatDouble(fmt, vals[i], buffer, BUFSIZE, NULL, &status);
1600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                if (U_FAILURE(status)) {
1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    log_err("failed to format: %g, returned %s\n", vals[i], u_errorName(status));
1602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                } else {
1603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    u_austrcpy(temp, buffer);
1604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    log_verbose("formatting %g returned '%s'\n", vals[i], temp);
1605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                }
1606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            }
1607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        }
1608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
1609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_toPattern(fmt, FALSE, buffer, BUFSIZE, &status);
1617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_SUCCESS(status)) {
1618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u_austrcpy(temp, buffer);
1619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("pattern: '%s'\n", temp);
1620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if (status != U_BUFFER_OVERFLOW_ERROR) {
1621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("toPattern failed unexpectedly: %s\n", u_errorName(status));
1622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
1623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("pattern too long to display\n");
1624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int len = unum_getSymbol(fmt, UNUM_CURRENCY_SYMBOL, buffer, BUFSIZE, &status);
1630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (isDecimal ? U_FAILURE(status) : (status != U_UNSUPPORTED_ERROR)) {
1631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("unexpected error getting symbol: '%s'\n", u_errorName(status));
1632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_setSymbol(fmt, UNUM_CURRENCY_SYMBOL, buffer, len, &status);
1635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (isDecimal ? U_FAILURE(status) : (status != U_UNSUPPORTED_ERROR)) {
1636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("unexpected error setting symbol: '%s'\n", u_errorName(status));
1637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestNonExistentCurrency() {
1642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UNumberFormat *format;
1643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar currencySymbol[8];
1645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar QQQ[] = {0x51, 0x51, 0x51, 0};
1646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Get a non-existent currency and make sure it returns the correct currency code. */
1648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    format = unum_open(UNUM_CURRENCY, NULL, 0, "th_TH@currency=QQQ", NULL, &status);
1649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (format == NULL || U_FAILURE(status)) {
16506d5deb12725f146643d443090dfa11b206df528aJean-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));
1651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
1653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_getSymbol(format,
1654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UNUM_CURRENCY_SYMBOL,
1655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                currencySymbol,
1656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                sizeof(currencySymbol)/sizeof(currencySymbol[0]),
1657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                &status);
1658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (u_strcmp(currencySymbol, QQQ) != 0) {
1659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("unum_open set the currency to QQQ\n");
1660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(format);
1663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestRBNFFormat() {
1666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status;
1667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UParseError perr;
1668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar pat[1024];
1669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar tempUChars[512];
1670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UNumberFormat *formats[5];
1671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int COUNT = sizeof(formats)/sizeof(formats[0]);
1672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int i;
1673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < COUNT; ++i) {
1675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        formats[i] = 0;
1676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* instantiation */
1679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(pat, "#,##0.0#;(#,##0.0#)");
1681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    formats[0] = unum_open(UNUM_PATTERN_DECIMAL, pat, -1, "en_US", &perr, &status);
1682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
16836d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "unable to open decimal pattern -> %s\n", u_errorName(status));
168427f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
1685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    formats[1] = unum_open(UNUM_SPELLOUT, NULL, 0, "en_US", &perr, &status);
1689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
16906d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "unable to open spellout -> %s\n", u_errorName(status));
169127f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
1692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    formats[2] = unum_open(UNUM_ORDINAL, NULL, 0, "en_US", &perr, &status);
1696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
16976d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "unable to open ordinal -> %s\n", u_errorName(status));
169827f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
1699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    formats[3] = unum_open(UNUM_DURATION, NULL, 0, "en_US", &perr, &status);
1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
17046d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "unable to open duration %s\n", u_errorName(status));
170527f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(pat,
1710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "%standard:\n"
1711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "-x: minus >>;\n"
1712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "x.x: << point >>;\n"
1713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "zero; one; two; three; four; five; six; seven; eight; nine;\n"
1714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "ten; eleven; twelve; thirteen; fourteen; fifteen; sixteen;\n"
1715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "seventeen; eighteen; nineteen;\n"
1716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "20: twenty[->>];\n"
1717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "30: thirty[->>];\n"
1718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "40: forty[->>];\n"
1719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "50: fifty[->>];\n"
1720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "60: sixty[->>];\n"
1721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "70: seventy[->>];\n"
1722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "80: eighty[->>];\n"
1723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "90: ninety[->>];\n"
1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "100: =#,##0=;\n");
1725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(tempUChars,
1726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "%simple:\n"
1727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "=%standard=;\n"
1728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "20: twenty[ and change];\n"
1729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "30: thirty[ and change];\n"
1730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "40: forty[ and change];\n"
1731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "50: fifty[ and change];\n"
1732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "60: sixty[ and change];\n"
1733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "70: seventy[ and change];\n"
1734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "80: eighty[ and change];\n"
1735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "90: ninety[ and change];\n"
1736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "100: =#,##0=;\n"
1737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "%bogus:\n"
1738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "0.x: tiny;\n"
1739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "x.x: << point something;\n"
1740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "=%standard=;\n"
1741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "20: some reasonable number;\n"
1742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "100: some substantial number;\n"
1743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "100,000,000: some huge number;\n");
1744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* This is to get around some compiler warnings about char * string length. */
1745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_strcat(pat, tempUChars);
1746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    formats[4] = unum_open(UNUM_PATTERN_RULEBASED, pat, -1, "en_US", &perr, &status);
1747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
17486d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "unable to open rulebased pattern -> %s\n", u_errorName(status));
1749c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
1750c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (U_FAILURE(status)) {
17516d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_err_status(status, "Something failed with %s\n", u_errorName(status));
1752c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return;
1753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < COUNT; ++i) {
1756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("\n\ntesting format %d\n", i);
1757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        test_fmt(formats[i], (UBool)(i == 0));
1758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1760b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    #define FORMAT_BUF_CAPACITY 64
1761b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    {
1762b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UChar fmtbuf[FORMAT_BUF_CAPACITY];
1763b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t len;
1764b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        double nanvalue = uprv_getNaN();
1765b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        status = U_ZERO_ERROR;
1766b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        len = unum_formatDouble(formats[1], nanvalue, fmtbuf, FORMAT_BUF_CAPACITY, NULL, &status);
1767b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (U_FAILURE(status)) {
1768b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            log_err_status(status, "unum_formatDouble NAN failed with %s\n", u_errorName(status));
1769b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        } else {
1770b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            UChar nansym[] = { 0x4E, 0x61, 0x4E, 0 }; /* NaN */
1771b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if ( len != 3 || u_strcmp(fmtbuf, nansym) != 0 ) {
1772b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                log_err("unum_formatDouble NAN produced wrong answer for en_US\n");
1773b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
1774b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
1775b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
1776b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < COUNT; ++i) {
1778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_close(formats[i]);
1779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestCurrencyRegression(void) {
1783b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/*
1784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru I've found a case where unum_parseDoubleCurrency is not doing what I
1785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruexpect.  The value I pass in is $1234567890q123460000.00 and this
1786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querureturns with a status of zero error & a parse pos of 22 (I would
1787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruexpect a parse error at position 11).
1788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruI stepped into DecimalFormat::subparse() and it looks like it parses
1790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruthe first 10 digits and then stops parsing at the q but doesn't set an
1791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruerror. Then later in DecimalFormat::parse() the value gets crammed
1792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinto a long (which greatly truncates the value).
1793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruThis is very problematic for me 'cause I try to remove chars that are
1795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinvalid but this allows my users to enter bad chars and truncates
1796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutheir data!
1797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
1798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar buf[1024];
1800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar currency[8];
1801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char acurrency[16];
1802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double d;
1803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UNumberFormat *cur;
1804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t pos;
1805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status  = U_ZERO_ERROR;
1806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const int32_t expected = 11;
1807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    currency[0]=0;
1809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(buf, "$1234567890q643210000.00");
1810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cur = unum_open(UNUM_CURRENCY, NULL,0,"en_US", NULL, &status);
1811b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
18136d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_data_err("unum_open failed: %s (Are you missing data?)\n", u_errorName(status));
1814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1816b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR; /* so we can test it later. */
1818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos = 0;
1819b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    d = unum_parseDoubleCurrency(cur,
1821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         buf,
1822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         -1,
1823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &pos, /* 0 = start */
1824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         currency,
1825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         &status);
1826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_austrcpy(acurrency, currency);
1828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status) || (pos != expected)) {
1830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("unum_parseDoubleCurrency should have failed with pos %d, but gave: value %.9f, err %s, pos=%d, currency [%s]\n",
1831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            expected, d, u_errorName(status), pos, acurrency);
1832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("unum_parseDoubleCurrency failed, value %.9f err %s, pos %d, currency [%s]\n", d, u_errorName(status), pos, acurrency);
1834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1835b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(cur);
1837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestTextAttributeCrash(void) {
1840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar ubuffer[64] = {0x0049,0x004E,0x0052,0};
1841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar expectedNeg[] = {0x0049,0x004E,0x0052,0x0031,0x0032,0x0033,0x0034,0x002E,0x0035,0};
1842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar expectedPos[] = {0x0031,0x0032,0x0033,0x0034,0x002E,0x0035,0};
1843b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t used;
1844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1845b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UNumberFormat *nf = unum_open(UNUM_CURRENCY, NULL, 0, "en_US", NULL, &status);
1846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
18476d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_data_err("FAILED 1 -> %s (Are you missing data?)\n", u_errorName(status));
1848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_setTextAttribute(nf, UNUM_CURRENCY_CODE, ubuffer, 3, &status);
1851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
1852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * the usual negative prefix and suffix seem to be '($' and ')' at this point
1853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * also crashes if UNUM_NEGATIVE_SUFFIX is substituted for UNUM_NEGATIVE_PREFIX here
1854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
1855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    used = unum_getTextAttribute(nf, UNUM_NEGATIVE_PREFIX, ubuffer, 64, &status);
1856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_setTextAttribute(nf, UNUM_NEGATIVE_PREFIX, ubuffer, used, &status);
1857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAILED 2\n"); exit(1);
1859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("attempting to format...\n");
1861b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    used = unum_formatDouble(nf, -1234.5, ubuffer, 64, NULL, &status);
1862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) || 64 < used) {
1863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Failed formatting %s\n", u_errorName(status));
1864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(expectedNeg, ubuffer) == 0) {
1867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Didn't get expected negative result\n");
1868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1869b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    used = unum_formatDouble(nf, 1234.5, ubuffer, 64, NULL, &status);
1870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status) || 64 < used) {
1871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Failed formatting %s\n", u_errorName(status));
1872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (u_strcmp(expectedPos, ubuffer) == 0) {
1875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Didn't get expected positive result\n");
1876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    unum_close(nf);
1878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1880103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic void TestNBSPPatternRtNum(const char *testcase, int line, UNumberFormat *nf, double myNumber) {
1881c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1882c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UChar myString[20];
1883c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    char tmpbuf[200];
1884c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    double aNumber = -1.0;
1885c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    unum_formatDouble(nf, myNumber, myString, 20, NULL, &status);
1886103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    log_verbose("%s:%d: formatted %.2f into %s\n", testcase, line, myNumber, u_austrcpy(tmpbuf, myString));
1887c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if(U_FAILURE(status)) {
1888103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      log_err("%s:%d: failed format of %.2g with %s\n", testcase, line, myNumber, u_errorName(status));
1889c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return;
1890c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
1891c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    aNumber = unum_parse(nf, myString, -1, NULL, &status);
1892c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if(U_FAILURE(status)) {
1893103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      log_err("%s:%d: failed parse with %s\n", testcase, line, u_errorName(status));
1894c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return;
1895c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
1896c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if(uprv_fabs(aNumber-myNumber)>.001) {
1897103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      log_err("FAIL: %s:%d formatted %.2f, parsed into %.2f\n", testcase, line, myNumber, aNumber);
1898c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    } else {
1899103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      log_verbose("PASS: %s:%d formatted %.2f, parsed into %.2f\n", testcase, line, myNumber, aNumber);
1900c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
1901c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
1902c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
1903c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustatic void TestNBSPPatternRT(const char *testcase, UNumberFormat *nf) {
1904103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  TestNBSPPatternRtNum(testcase, __LINE__, nf, 12345.);
1905103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  TestNBSPPatternRtNum(testcase, __LINE__, nf, -12345.);
1906c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
1907c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
1908c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustatic void TestNBSPInPattern(void) {
1909c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1910c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UNumberFormat* nf = NULL;
1911c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    const char *testcase;
1912b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1913b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1914c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    testcase="ar_AE UNUM_CURRENCY";
1915c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    nf  = unum_open(UNUM_CURRENCY, NULL, -1, "ar_AE", NULL, &status);
19166d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if(U_FAILURE(status) || nf == NULL) {
1917103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      log_data_err("%s:%d: %s: unum_open failed with %s (Are you missing data?)\n", __FILE__, __LINE__, testcase, u_errorName(status));
19186d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
1919c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
1920c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    TestNBSPPatternRT(testcase, nf);
1921b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1922c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    /* if we don't have CLDR 1.6 data, bring out the problem anyways */
1923c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    {
1924c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define SPECIAL_PATTERN "\\u00A4\\u00A4'\\u062f.\\u0625.\\u200f\\u00a0'###0.00"
1925c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UChar pat[200];
1926c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        testcase = "ar_AE special pattern: " SPECIAL_PATTERN;
1927c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        u_unescape(SPECIAL_PATTERN, pat, sizeof(pat)/sizeof(pat[0]));
1928c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        unum_applyPattern(nf, FALSE, pat, -1, NULL, &status);
1929b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if(U_FAILURE(status)) {
1930c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            log_err("%s: unum_applyPattern failed with %s\n", testcase, u_errorName(status));
1931c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        } else {
1932c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            TestNBSPPatternRT(testcase, nf);
1933c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
1934c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#undef SPECIAL_PATTERN
1935c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
1936c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    unum_close(nf); status = U_ZERO_ERROR;
1937b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1938c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    testcase="ar_AE UNUM_DECIMAL";
1939c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    nf  = unum_open(UNUM_DECIMAL, NULL, -1, "ar_AE", NULL, &status);
1940c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if(U_FAILURE(status)) {
1941c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        log_err("%s: unum_open failed with %s\n", testcase, u_errorName(status));
1942c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
1943c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    TestNBSPPatternRT(testcase, nf);
1944c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    unum_close(nf); status = U_ZERO_ERROR;
1945b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1946c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    testcase="ar_AE UNUM_PERCENT";
1947c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    nf  = unum_open(UNUM_PERCENT, NULL, -1, "ar_AE", NULL, &status);
1948c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if(U_FAILURE(status)) {
1949c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        log_err("%s: unum_open failed with %s\n", testcase, u_errorName(status));
1950b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
1951b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TestNBSPPatternRT(testcase, nf);
1952c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    unum_close(nf); status = U_ZERO_ERROR;
1953b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1954b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1955b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1956c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
1957103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic void TestCloneWithRBNF(void) {
1958103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UChar pattern[1024];
1959103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UChar pat2[512];
1960103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UErrorCode status = U_ZERO_ERROR;
1961103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UChar buffer[256];
1962103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UChar buffer_cloned[256];
1963103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    char temp1[256];
1964103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    char temp2[256];
1965103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UNumberFormat *pform_cloned;
1966103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UNumberFormat *pform;
1967103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
1968103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    u_uastrcpy(pattern,
1969103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "%main:\n"
1970103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "0.x: >%%millis-only>;\n"
1971103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "x.0: <%%duration<;\n"
1972103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "x.x: <%%durationwithmillis<>%%millis-added>;\n"
1973103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "-x: ->>;%%millis-only:\n"
1974103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "1000: 00:00.<%%millis<;\n"
1975103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "%%millis-added:\n"
1976103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "1000: .<%%millis<;\n"
1977103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "%%millis:\n"
1978103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "0: =000=;\n"
1979103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "%%duration:\n"
1980103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "0: =%%seconds-only=;\n"
1981103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "60: =%%min-sec=;\n"
1982103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "3600: =%%hr-min-sec=;\n"
1983103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "86400/86400: <%%ddaayyss<[, >>];\n"
1984103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "%%durationwithmillis:\n"
1985103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "0: =%%seconds-only=;\n"
1986103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "60: =%%min-sec=;\n"
1987103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "3600: =%%hr-min-sec=;\n"
1988103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "86400/86400: <%%ddaayyss<, >>;\n");
1989103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    u_uastrcpy(pat2,
1990103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "%%seconds-only:\n"
1991103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "0: 0:00:=00=;\n"
1992103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "%%min-sec:\n"
1993103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "0: :=00=;\n"
1994103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "0/60: 0:<00<>>;\n"
1995103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "%%hr-min-sec:\n"
1996103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "0: :=00=;\n"
1997103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "60/60: <00<>>;\n"
1998103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "3600/60: <0<:>>>;\n"
1999103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "%%ddaayyss:\n"
2000103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "0 days;\n"
2001103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "1 day;\n"
2002103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        "=0= days;");
2003103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2004103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /* This is to get around some compiler warnings about char * string length. */
2005103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    u_strcat(pattern, pat2);
2006103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2007103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    pform = unum_open(UNUM_PATTERN_RULEBASED, pattern, -1, "en_US", NULL, &status);
2008103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    unum_formatDouble(pform, 3600, buffer, 256, NULL, &status);
2009c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
2010103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    pform_cloned = unum_clone(pform,&status);
2011103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    unum_formatDouble(pform_cloned, 3600, buffer_cloned, 256, NULL, &status);
2012103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2013103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    unum_close(pform);
2014103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    unum_close(pform_cloned);
2015103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2016103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (u_strcmp(buffer,buffer_cloned)) {
2017103e9ffba2cba345d0078eb8b8db33249f81840aCraig 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));
2018103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
2019103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius}
202054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
202154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
202254dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic void TestNoExponent(void) {
202354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UErrorCode status = U_ZERO_ERROR;
202454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UChar str[100];
202554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    const char *cstr;
202654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UNumberFormat *fmt;
202754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    int32_t pos;
202854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    int32_t expect = 0;
202954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    int32_t num;
203054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
203154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    fmt = unum_open(UNUM_DECIMAL, NULL, -1, "en_US", NULL, &status);
203254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
203354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(status) || fmt == NULL) {
203454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_data_err("%s:%d: unum_open failed with %s (Are you missing data?)\n", __FILE__, __LINE__, u_errorName(status));
203554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        return;
203654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
203754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
203854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    cstr = "10E6";
203954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    u_uastrcpy(str, cstr);
204054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    expect = 10000000;
204154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    pos = 0;
204254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    num = unum_parse(fmt, str, -1, &pos, &status);
204354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    ASSERT_TRUE(pos==4);
204454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(status)) {
204554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_data_err("%s:%d: unum_parse failed with %s for %s (Are you missing data?)\n", __FILE__, __LINE__, u_errorName(status), cstr);
204654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    } else if(expect!=num) {
204754dcd9b6a06071f647dac967e9e267abb9410720Craig 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);
204854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    } else {
204954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_verbose("%s:%d: unum_parse returned %d for '%s'\n", __FILE__, __LINE__, num, cstr);
205054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
205154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
205254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    ASSERT_TRUE(unum_getAttribute(fmt, UNUM_PARSE_NO_EXPONENT)==0);
205354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
205454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    unum_setAttribute(fmt, UNUM_PARSE_NO_EXPONENT, 1); /* no error code */
205554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    log_verbose("set UNUM_PARSE_NO_EXPONENT\n");
205654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
205754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    ASSERT_TRUE(unum_getAttribute(fmt, UNUM_PARSE_NO_EXPONENT)==1);
205854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
205954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    pos = 0;
206054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    expect=10;
206154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    num = unum_parse(fmt, str, -1, &pos, &status);
206254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(num==10000000) {
206354dcd9b6a06071f647dac967e9e267abb9410720Craig 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);
206454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    } else if(num==expect) {
206554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_verbose("%s:%d: unum_parse gave %d for %s - good.\n", __FILE__, __LINE__, num, cstr);
206654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
206754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    ASSERT_TRUE(pos==2);
206854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
206954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    status = U_ZERO_ERROR;
207054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
207154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    unum_close(fmt);
207254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
207354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    /* ok, now try scientific */
207454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    fmt = unum_open(UNUM_SCIENTIFIC, NULL, -1, "en_US", NULL, &status);
207554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    assertSuccess("unum_open(UNUM_SCIENTIFIC, ...)", &status);
207654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
207754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    ASSERT_TRUE(unum_getAttribute(fmt, UNUM_PARSE_NO_EXPONENT)==0);
207854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
207954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    cstr = "10E6";
208054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    u_uastrcpy(str, cstr);
208154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    expect = 10000000;
208254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    pos = 0;
208354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    num = unum_parse(fmt, str, -1, &pos, &status);
208454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    ASSERT_TRUE(pos==4);
208554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(status)) {
208654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_data_err("%s:%d: unum_parse failed with %s for %s (Are you missing data?)\n", __FILE__, __LINE__, u_errorName(status), cstr);
208754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    } else if(expect!=num) {
208854dcd9b6a06071f647dac967e9e267abb9410720Craig 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);
208954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    } else {
209054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_verbose("%s:%d: unum_parse returned %d for '%s'\n", __FILE__, __LINE__, num, cstr);
209154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
209254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
209354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    unum_setAttribute(fmt, UNUM_PARSE_NO_EXPONENT, 1); /* no error code */
209454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    log_verbose("set UNUM_PARSE_NO_EXPONENT\n");
209554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
209654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    ASSERT_TRUE(unum_getAttribute(fmt, UNUM_PARSE_NO_EXPONENT)==1);
209754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
209854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
209954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    cstr = "10E6";
210054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    u_uastrcpy(str, cstr);
210154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    expect = 10000000;
210254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    pos = 0;
210354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    num = unum_parse(fmt, str, -1, &pos, &status);
210454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    ASSERT_TRUE(pos==4);
210554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(status)) {
210654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_data_err("%s:%d: unum_parse failed with %s for %s (Are you missing data?)\n", __FILE__, __LINE__, u_errorName(status), cstr);
210754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    } else if(expect!=num) {
210854dcd9b6a06071f647dac967e9e267abb9410720Craig 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);
210954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    } else {
211054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_verbose("%s:%d: unum_parse returned %d for '%s'\n", __FILE__, __LINE__, num, cstr);
211154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
211254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
211354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    unum_close(fmt);
211454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}
211554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
211654dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic void TestMaxInt(void) {
211754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UErrorCode status = U_ZERO_ERROR;
211854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UChar pattern_hash[] = { 0x23, 0x00 }; /* "#" */
211954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UChar result1[1024] = { 0 }, result2[1024] = { 0 };
212054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    int32_t len1, len2;
212154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UChar expect[] = { 0x0039, 0x0037, 0 };
212254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UNumberFormat *fmt = unum_open(
212354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                  UNUM_PATTERN_DECIMAL,      /* style         */
212454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                  &pattern_hash[0],          /* pattern       */
212554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                  u_strlen(pattern_hash),    /* patternLength */
212654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                  0,
212754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                  0,                         /* parseErr      */
212854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                  &status);
212954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(status) || fmt == NULL) {
213054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_data_err("%s:%d: %s: unum_open failed with %s (Are you missing data?)\n", __FILE__, __LINE__, "TestMaxInt", u_errorName(status));
213154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        return;
213254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
213354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
213454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    unum_setAttribute(fmt, UNUM_MAX_INTEGER_DIGITS, 2);
213554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
213654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    status = U_ZERO_ERROR;
213754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    /* #1 */
213854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    len1 = unum_formatInt64(fmt, 1997, result1, 1024, NULL, &status);
213954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    result1[len1]=0;
214054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(status) || u_strcmp(expect, result1)) {
214154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("unum_formatInt64 Expected %s but got %s status %s\n", austrdup(expect), austrdup(result1), u_errorName(status));
214254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
214354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
214454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    status = U_ZERO_ERROR;
214554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    /* #2 */
214654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    len2 = unum_formatDouble(fmt, 1997.0, result2, 1024, NULL, &status);
214754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    result2[len2]=0;
214854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(status) || u_strcmp(expect, result2)) {
214954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("unum_formatDouble Expected %s but got %s status %s\n", austrdup(expect), austrdup(result2), u_errorName(status));
215054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
215154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
215254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
215354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
215454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    /* test UNUM_FORMAT_FAIL_IF_MORE_THAN_MAX_DIGITS */
215554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    ASSERT_TRUE(unum_getAttribute(fmt, UNUM_FORMAT_FAIL_IF_MORE_THAN_MAX_DIGITS)==0);
215654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
215754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    unum_setAttribute(fmt, UNUM_FORMAT_FAIL_IF_MORE_THAN_MAX_DIGITS, 1);
215854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    /* test UNUM_FORMAT_FAIL_IF_MORE_THAN_MAX_DIGITS */
215954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    ASSERT_TRUE(unum_getAttribute(fmt, UNUM_FORMAT_FAIL_IF_MORE_THAN_MAX_DIGITS)==1);
216054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
216154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    status = U_ZERO_ERROR;
216254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    /* max int digits still '2' */
216354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    len1 = unum_formatInt64(fmt, 1997, result1, 1024, NULL, &status);
216454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    ASSERT_TRUE(status==U_ILLEGAL_ARGUMENT_ERROR);
216554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    status = U_ZERO_ERROR;
216654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
216754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    /* But, formatting 97->'97' works fine. */
216854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
216954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    /* #1 */
217054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    len1 = unum_formatInt64(fmt, 97, result1, 1024, NULL, &status);
217154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    result1[len1]=0;
217254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(status) || u_strcmp(expect, result1)) {
217354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("unum_formatInt64 Expected %s but got %s status %s\n", austrdup(expect), austrdup(result1), u_errorName(status));
217454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
217554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
217654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    status = U_ZERO_ERROR;
217754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    /* #2 */
217854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    len2 = unum_formatDouble(fmt, 97.0, result2, 1024, NULL, &status);
217954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    result2[len2]=0;
218054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if(U_FAILURE(status) || u_strcmp(expect, result2)) {
218154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        log_err("unum_formatDouble Expected %s but got %s status %s\n", austrdup(expect), austrdup(result2), u_errorName(status));
218254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
218354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
218454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
218554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    unum_close(fmt);
218654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}
218754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
218859d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic void TestUFormattable(void) {
218959d709d503bab6e2b61931737e662dd293b40578ccornelius  UChar out2k[2048];
219059d709d503bab6e2b61931737e662dd293b40578ccornelius  // simple test for API docs
219159d709d503bab6e2b61931737e662dd293b40578ccornelius  {
219259d709d503bab6e2b61931737e662dd293b40578ccornelius    UErrorCode status = U_ZERO_ERROR;
219359d709d503bab6e2b61931737e662dd293b40578ccornelius    UNumberFormat *unum = unum_open(UNUM_DEFAULT, NULL, -1, "en_US_POSIX", NULL, &status);
219459d709d503bab6e2b61931737e662dd293b40578ccornelius    if(assertSuccessCheck("calling unum_open()", &status, TRUE)) {
219559d709d503bab6e2b61931737e662dd293b40578ccornelius      //! [unum_parseToUFormattable]
219659d709d503bab6e2b61931737e662dd293b40578ccornelius      const UChar str[] = { 0x0031, 0x0032, 0x0033, 0x0000 }; /* 123 */
219759d709d503bab6e2b61931737e662dd293b40578ccornelius      int32_t result = 0;
219859d709d503bab6e2b61931737e662dd293b40578ccornelius      UFormattable *ufmt = ufmt_open(&status);
219959d709d503bab6e2b61931737e662dd293b40578ccornelius      unum_parseToUFormattable(unum, ufmt, str, -1, NULL, &status);
220059d709d503bab6e2b61931737e662dd293b40578ccornelius      if (ufmt_isNumeric(ufmt)) {
220159d709d503bab6e2b61931737e662dd293b40578ccornelius          result = ufmt_getLong(ufmt, &status); /* == 123 */
220259d709d503bab6e2b61931737e662dd293b40578ccornelius      } /* else { ... } */
220359d709d503bab6e2b61931737e662dd293b40578ccornelius      ufmt_close(ufmt);
220459d709d503bab6e2b61931737e662dd293b40578ccornelius      //! [unum_parseToUFormattable]
220559d709d503bab6e2b61931737e662dd293b40578ccornelius      assertTrue("result == 123", (result == 123));
220659d709d503bab6e2b61931737e662dd293b40578ccornelius    }
220759d709d503bab6e2b61931737e662dd293b40578ccornelius    unum_close(unum);
220859d709d503bab6e2b61931737e662dd293b40578ccornelius  }
220959d709d503bab6e2b61931737e662dd293b40578ccornelius  // test with explicitly created ufmt_open
221059d709d503bab6e2b61931737e662dd293b40578ccornelius  {
221159d709d503bab6e2b61931737e662dd293b40578ccornelius    UChar buffer[2048];
221259d709d503bab6e2b61931737e662dd293b40578ccornelius    UErrorCode status = U_ZERO_ERROR;
221359d709d503bab6e2b61931737e662dd293b40578ccornelius    UFormattable *ufmt;
221459d709d503bab6e2b61931737e662dd293b40578ccornelius    UNumberFormat *unum;
221559d709d503bab6e2b61931737e662dd293b40578ccornelius    const char *pattern = "";
221659d709d503bab6e2b61931737e662dd293b40578ccornelius
221759d709d503bab6e2b61931737e662dd293b40578ccornelius    ufmt = ufmt_open(&status);
221859d709d503bab6e2b61931737e662dd293b40578ccornelius    unum = unum_open(UNUM_DEFAULT, NULL, -1, "en_US_POSIX", NULL, &status);
221959d709d503bab6e2b61931737e662dd293b40578ccornelius    if(assertSuccessCheck("calling ufmt_open() || unum_open()", &status, TRUE)) {
222059d709d503bab6e2b61931737e662dd293b40578ccornelius
222159d709d503bab6e2b61931737e662dd293b40578ccornelius      pattern = "31337";
222259d709d503bab6e2b61931737e662dd293b40578ccornelius      log_verbose("-- pattern: %s\n", pattern);
222359d709d503bab6e2b61931737e662dd293b40578ccornelius      u_uastrcpy(buffer, pattern);
222459d709d503bab6e2b61931737e662dd293b40578ccornelius      unum_parseToUFormattable(unum, ufmt, buffer, -1, NULL, &status);
222559d709d503bab6e2b61931737e662dd293b40578ccornelius      if(assertSuccess("unum_parseToUFormattable(31337)", &status)) {
222659d709d503bab6e2b61931737e662dd293b40578ccornelius        assertTrue("ufmt_getLong()=31337", ufmt_getLong(ufmt, &status) == 31337);
222759d709d503bab6e2b61931737e662dd293b40578ccornelius        assertTrue("ufmt_getType()=UFMT_LONG", ufmt_getType(ufmt, &status) == UFMT_LONG);
222859d709d503bab6e2b61931737e662dd293b40578ccornelius        log_verbose("long = %d\n", ufmt_getLong(ufmt, &status));
222959d709d503bab6e2b61931737e662dd293b40578ccornelius        assertSuccess("ufmt_getLong()", &status);
223059d709d503bab6e2b61931737e662dd293b40578ccornelius      }
223159d709d503bab6e2b61931737e662dd293b40578ccornelius      unum_formatUFormattable(unum, ufmt, out2k, 2048, NULL, &status);
223259d709d503bab6e2b61931737e662dd293b40578ccornelius      if(assertSuccess("unum_formatUFormattable(31337)", &status)) {
223359d709d503bab6e2b61931737e662dd293b40578ccornelius        assertEquals("unum_formatUFormattable r/t", austrdup(buffer), austrdup(out2k));
223459d709d503bab6e2b61931737e662dd293b40578ccornelius      }
223559d709d503bab6e2b61931737e662dd293b40578ccornelius
223659d709d503bab6e2b61931737e662dd293b40578ccornelius      pattern = "3.14159";
223759d709d503bab6e2b61931737e662dd293b40578ccornelius      log_verbose("-- pattern: %s\n", pattern);
223859d709d503bab6e2b61931737e662dd293b40578ccornelius      u_uastrcpy(buffer, pattern);
223959d709d503bab6e2b61931737e662dd293b40578ccornelius      unum_parseToUFormattable(unum, ufmt, buffer, -1, NULL, &status);
224059d709d503bab6e2b61931737e662dd293b40578ccornelius      if(assertSuccess("unum_parseToUFormattable(3.14159)", &status)) {
224159d709d503bab6e2b61931737e662dd293b40578ccornelius        assertTrue("ufmt_getDouble()==3.14159", withinErr(ufmt_getDouble(ufmt, &status), 3.14159, 1e-15));
224259d709d503bab6e2b61931737e662dd293b40578ccornelius        assertSuccess("ufmt_getDouble()", &status);
224359d709d503bab6e2b61931737e662dd293b40578ccornelius        assertTrue("ufmt_getType()=UFMT_DOUBLE", ufmt_getType(ufmt, &status) == UFMT_DOUBLE);
224459d709d503bab6e2b61931737e662dd293b40578ccornelius        log_verbose("double = %g\n", ufmt_getDouble(ufmt, &status));
224559d709d503bab6e2b61931737e662dd293b40578ccornelius      }
224659d709d503bab6e2b61931737e662dd293b40578ccornelius      unum_formatUFormattable(unum, ufmt, out2k, 2048, NULL, &status);
224759d709d503bab6e2b61931737e662dd293b40578ccornelius      if(assertSuccess("unum_formatUFormattable(3.14159)", &status)) {
224859d709d503bab6e2b61931737e662dd293b40578ccornelius        assertEquals("unum_formatUFormattable r/t", austrdup(buffer), austrdup(out2k));
224959d709d503bab6e2b61931737e662dd293b40578ccornelius      }
225059d709d503bab6e2b61931737e662dd293b40578ccornelius    }
225159d709d503bab6e2b61931737e662dd293b40578ccornelius    ufmt_close(ufmt);
225259d709d503bab6e2b61931737e662dd293b40578ccornelius    unum_close(unum);
225359d709d503bab6e2b61931737e662dd293b40578ccornelius  }
225459d709d503bab6e2b61931737e662dd293b40578ccornelius
225559d709d503bab6e2b61931737e662dd293b40578ccornelius  // test with auto-generated ufmt
225659d709d503bab6e2b61931737e662dd293b40578ccornelius  {
225759d709d503bab6e2b61931737e662dd293b40578ccornelius    UChar buffer[2048];
225859d709d503bab6e2b61931737e662dd293b40578ccornelius    UErrorCode status = U_ZERO_ERROR;
225959d709d503bab6e2b61931737e662dd293b40578ccornelius    UFormattable *ufmt = NULL;
226059d709d503bab6e2b61931737e662dd293b40578ccornelius    UNumberFormat *unum;
226159d709d503bab6e2b61931737e662dd293b40578ccornelius    const char *pattern = "73476730924573500000000"; // weight of the moon, kg
226259d709d503bab6e2b61931737e662dd293b40578ccornelius
226359d709d503bab6e2b61931737e662dd293b40578ccornelius    log_verbose("-- pattern: %s (testing auto-opened UFormattable)\n", pattern);
226459d709d503bab6e2b61931737e662dd293b40578ccornelius    u_uastrcpy(buffer, pattern);
226559d709d503bab6e2b61931737e662dd293b40578ccornelius
226659d709d503bab6e2b61931737e662dd293b40578ccornelius    unum = unum_open(UNUM_DEFAULT, NULL, -1, "en_US_POSIX", NULL, &status);
226759d709d503bab6e2b61931737e662dd293b40578ccornelius    if(assertSuccessCheck("calling unum_open()", &status, TRUE)) {
226859d709d503bab6e2b61931737e662dd293b40578ccornelius
226959d709d503bab6e2b61931737e662dd293b40578ccornelius      ufmt = unum_parseToUFormattable(unum, NULL, /* will be ufmt_open()'ed for us */
227059d709d503bab6e2b61931737e662dd293b40578ccornelius                                   buffer, -1, NULL, &status);
227159d709d503bab6e2b61931737e662dd293b40578ccornelius      if(assertSuccess("unum_parseToUFormattable(weight of the moon)", &status)) {
227259d709d503bab6e2b61931737e662dd293b40578ccornelius        log_verbose("new formattable allocated at %p\n", (void*)ufmt);
227359d709d503bab6e2b61931737e662dd293b40578ccornelius        assertTrue("ufmt_isNumeric() TRUE", ufmt_isNumeric(ufmt));
227459d709d503bab6e2b61931737e662dd293b40578ccornelius        unum_formatUFormattable(unum, ufmt, out2k, 2048, NULL, &status);
227559d709d503bab6e2b61931737e662dd293b40578ccornelius        if(assertSuccess("unum_formatUFormattable(3.14159)", &status)) {
227659d709d503bab6e2b61931737e662dd293b40578ccornelius          assertEquals("unum_formatUFormattable r/t", austrdup(buffer), austrdup(out2k));
227759d709d503bab6e2b61931737e662dd293b40578ccornelius        }
227859d709d503bab6e2b61931737e662dd293b40578ccornelius
227959d709d503bab6e2b61931737e662dd293b40578ccornelius        log_verbose("double: %g\n",  ufmt_getDouble(ufmt, &status));
228059d709d503bab6e2b61931737e662dd293b40578ccornelius        assertSuccess("ufmt_getDouble()", &status);
228159d709d503bab6e2b61931737e662dd293b40578ccornelius
228259d709d503bab6e2b61931737e662dd293b40578ccornelius        log_verbose("long: %ld\n", ufmt_getLong(ufmt, &status));
228359d709d503bab6e2b61931737e662dd293b40578ccornelius        assertTrue("failure on ufmt_getLong() for huge number:", U_FAILURE(status));
228459d709d503bab6e2b61931737e662dd293b40578ccornelius        // status is now a failure due to ufmt_getLong() above.
228559d709d503bab6e2b61931737e662dd293b40578ccornelius        // the intltest does extensive r/t testing of Formattable vs. UFormattable.
228659d709d503bab6e2b61931737e662dd293b40578ccornelius      }
228759d709d503bab6e2b61931737e662dd293b40578ccornelius    }
228859d709d503bab6e2b61931737e662dd293b40578ccornelius
228959d709d503bab6e2b61931737e662dd293b40578ccornelius    unum_close(unum);
229059d709d503bab6e2b61931737e662dd293b40578ccornelius    ufmt_close(ufmt); // was implicitly opened for us by the first unum_parseToUFormattable()
229159d709d503bab6e2b61931737e662dd293b40578ccornelius  }
229259d709d503bab6e2b61931737e662dd293b40578ccornelius}
229359d709d503bab6e2b61931737e662dd293b40578ccornelius
229459d709d503bab6e2b61931737e662dd293b40578ccorneliustypedef struct {
229559d709d503bab6e2b61931737e662dd293b40578ccornelius    const char*  locale;
229659d709d503bab6e2b61931737e662dd293b40578ccornelius    const char*  numsys;
229759d709d503bab6e2b61931737e662dd293b40578ccornelius    int32_t      radix;
229859d709d503bab6e2b61931737e662dd293b40578ccornelius    UBool        isAlgorithmic;
229959d709d503bab6e2b61931737e662dd293b40578ccornelius    const UChar* description;
230059d709d503bab6e2b61931737e662dd293b40578ccornelius} NumSysTestItem;
230159d709d503bab6e2b61931737e662dd293b40578ccornelius
230259d709d503bab6e2b61931737e662dd293b40578ccornelius
230359d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar latnDesc[]    = {0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0}; // 0123456789
230459d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar romanDesc[]   = {0x25,0x72,0x6F,0x6D,0x61,0x6E,0x2D,0x75,0x70,0x70,0x65,0x72,0}; // %roman-upper
230559d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar arabDesc[]    = {0x0660,0x0661,0x0662,0x0663,0x0664,0x0665,0x0666,0x0667,0x0668,0x0669,0}; //
230659d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar arabextDesc[] = {0x06F0,0x06F1,0x06F2,0x06F3,0x06F4,0x06F5,0x06F6,0x06F7,0x06F8,0x06F9,0}; //
230759d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar hanidecDesc[] = {0x3007,0x4E00,0x4E8C,0x4E09,0x56DB,0x4E94,0x516D,0x4E03,0x516B,0x4E5D,0}; //
230859d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar hantDesc[]    = {0x7A,0x68,0x5F,0x48,0x61,0x6E,0x74,0x2F,0x53,0x70,0x65,0x6C,0x6C,0x6F,0x75,0x74,
230959d709d503bab6e2b61931737e662dd293b40578ccornelius                                    0x52,0x75,0x6C,0x65,0x73,0x2F,0x25,0x73,0x70,0x65,0x6C,0x6C,0x6F,0x75,0x74,0x2D,
231059d709d503bab6e2b61931737e662dd293b40578ccornelius                                    0x63,0x61,0x72,0x64,0x69,0x6E,0x61,0x6C,0}; // zh_Hant/SpelloutRules/%spellout-cardinal
231159d709d503bab6e2b61931737e662dd293b40578ccornelius
231259d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const NumSysTestItem numSysTestItems[] = {
231359d709d503bab6e2b61931737e662dd293b40578ccornelius    //locale                         numsys    radix isAlgo  description
231459d709d503bab6e2b61931737e662dd293b40578ccornelius    { "en",                          "latn",    10,  FALSE,  latnDesc },
231559d709d503bab6e2b61931737e662dd293b40578ccornelius    { "en@numbers=roman",            "roman",   10,  TRUE,   romanDesc },
231659d709d503bab6e2b61931737e662dd293b40578ccornelius    { "en@numbers=finance",          "latn",    10,  FALSE,  latnDesc },
231759d709d503bab6e2b61931737e662dd293b40578ccornelius    { "ar",                          "arab",    10,  FALSE,  arabDesc },
231859d709d503bab6e2b61931737e662dd293b40578ccornelius    { "fa",                          "arabext", 10,  FALSE,  arabextDesc },
231959d709d503bab6e2b61931737e662dd293b40578ccornelius    { "zh_Hans@numbers=hanidec",     "hanidec", 10,  FALSE,  hanidecDesc },
232059d709d503bab6e2b61931737e662dd293b40578ccornelius    { "zh_Hant@numbers=traditional", "hant",    10,  TRUE,   hantDesc },
232159d709d503bab6e2b61931737e662dd293b40578ccornelius    { NULL,                          NULL,       0,  FALSE,  NULL },
232259d709d503bab6e2b61931737e662dd293b40578ccornelius};
232359d709d503bab6e2b61931737e662dd293b40578ccorneliusenum { kNumSysDescripBufMax = 64 };
232459d709d503bab6e2b61931737e662dd293b40578ccornelius
232559d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic void TestUNumberingSystem(void) {
232659d709d503bab6e2b61931737e662dd293b40578ccornelius    const NumSysTestItem * itemPtr;
232759d709d503bab6e2b61931737e662dd293b40578ccornelius    UNumberingSystem * unumsys;
232859d709d503bab6e2b61931737e662dd293b40578ccornelius    UEnumeration * uenum;
232959d709d503bab6e2b61931737e662dd293b40578ccornelius    const char * numsys;
233059d709d503bab6e2b61931737e662dd293b40578ccornelius    UErrorCode status;
233159d709d503bab6e2b61931737e662dd293b40578ccornelius
233259d709d503bab6e2b61931737e662dd293b40578ccornelius    for (itemPtr = numSysTestItems; itemPtr->locale != NULL; itemPtr++) {
233359d709d503bab6e2b61931737e662dd293b40578ccornelius        status = U_ZERO_ERROR;
233459d709d503bab6e2b61931737e662dd293b40578ccornelius        unumsys = unumsys_open(itemPtr->locale, &status);
233559d709d503bab6e2b61931737e662dd293b40578ccornelius        if ( U_SUCCESS(status) ) {
233659d709d503bab6e2b61931737e662dd293b40578ccornelius            UChar ubuf[kNumSysDescripBufMax];
233759d709d503bab6e2b61931737e662dd293b40578ccornelius            int32_t ulen, radix = unumsys_getRadix(unumsys);
233859d709d503bab6e2b61931737e662dd293b40578ccornelius            UBool isAlgorithmic = unumsys_isAlgorithmic(unumsys);
233959d709d503bab6e2b61931737e662dd293b40578ccornelius            numsys = unumsys_getName(unumsys);
234059d709d503bab6e2b61931737e662dd293b40578ccornelius            if ( uprv_strcmp(numsys, itemPtr->numsys) != 0 || radix != itemPtr->radix || !isAlgorithmic != !itemPtr->isAlgorithmic ) {
234159d709d503bab6e2b61931737e662dd293b40578ccornelius                log_data_err("unumsys name/radix/isAlgorithmic for locale %s, expected %s/%d/%d, got %s/%d/%d\n",
234259d709d503bab6e2b61931737e662dd293b40578ccornelius                        itemPtr->locale, itemPtr->numsys, itemPtr->radix, itemPtr->isAlgorithmic, numsys, radix, isAlgorithmic);
234359d709d503bab6e2b61931737e662dd293b40578ccornelius            }
234459d709d503bab6e2b61931737e662dd293b40578ccornelius            ulen = unumsys_getDescription(unumsys, ubuf, kNumSysDescripBufMax, &status);
2345fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            (void)ulen;   // Suppress variable not used warning.
234659d709d503bab6e2b61931737e662dd293b40578ccornelius            if ( U_FAILURE(status) || u_strcmp(ubuf, itemPtr->description) != 0 ) {
234759d709d503bab6e2b61931737e662dd293b40578ccornelius                log_data_err("unumsys description for locale %s, description unexpected and/or status %\n", myErrorName(status));
234859d709d503bab6e2b61931737e662dd293b40578ccornelius            }
234959d709d503bab6e2b61931737e662dd293b40578ccornelius            unumsys_close(unumsys);
235059d709d503bab6e2b61931737e662dd293b40578ccornelius        } else {
235159d709d503bab6e2b61931737e662dd293b40578ccornelius            log_data_err("unumsys_open for locale %s fails with status %s\n", itemPtr->locale, myErrorName(status));
235259d709d503bab6e2b61931737e662dd293b40578ccornelius        }
235359d709d503bab6e2b61931737e662dd293b40578ccornelius    }
235459d709d503bab6e2b61931737e662dd293b40578ccornelius
235559d709d503bab6e2b61931737e662dd293b40578ccornelius    status = U_ZERO_ERROR;
235659d709d503bab6e2b61931737e662dd293b40578ccornelius    uenum = unumsys_openAvailableNames(&status);
235759d709d503bab6e2b61931737e662dd293b40578ccornelius    if ( U_SUCCESS(status) ) {
235859d709d503bab6e2b61931737e662dd293b40578ccornelius        int32_t numsysCount = 0;
235959d709d503bab6e2b61931737e662dd293b40578ccornelius        // sanity check for a couple of number systems that must be in the enumeration
236059d709d503bab6e2b61931737e662dd293b40578ccornelius        UBool foundLatn = FALSE;
236159d709d503bab6e2b61931737e662dd293b40578ccornelius        UBool foundArab = FALSE;
236259d709d503bab6e2b61931737e662dd293b40578ccornelius        while ( (numsys = uenum_next(uenum, NULL, &status)) != NULL && U_SUCCESS(status) ) {
236359d709d503bab6e2b61931737e662dd293b40578ccornelius            status = U_ZERO_ERROR;
236459d709d503bab6e2b61931737e662dd293b40578ccornelius            unumsys = unumsys_openByName(numsys, &status);
236559d709d503bab6e2b61931737e662dd293b40578ccornelius            if ( U_SUCCESS(status) ) {
236659d709d503bab6e2b61931737e662dd293b40578ccornelius                numsysCount++;
236759d709d503bab6e2b61931737e662dd293b40578ccornelius                if ( uprv_strcmp(numsys, "latn") ) foundLatn = TRUE;
236859d709d503bab6e2b61931737e662dd293b40578ccornelius                if ( uprv_strcmp(numsys, "arab") ) foundArab = TRUE;
236959d709d503bab6e2b61931737e662dd293b40578ccornelius                unumsys_close(unumsys);
237059d709d503bab6e2b61931737e662dd293b40578ccornelius            } else {
237159d709d503bab6e2b61931737e662dd293b40578ccornelius                log_err("unumsys_openAvailableNames includes %s but unumsys_openByName on it fails with status %s\n",
237259d709d503bab6e2b61931737e662dd293b40578ccornelius                        numsys, myErrorName(status));
237359d709d503bab6e2b61931737e662dd293b40578ccornelius            }
237459d709d503bab6e2b61931737e662dd293b40578ccornelius        }
237559d709d503bab6e2b61931737e662dd293b40578ccornelius        uenum_close(uenum);
237659d709d503bab6e2b61931737e662dd293b40578ccornelius        if ( numsysCount < 40 || !foundLatn || !foundArab ) {
237759d709d503bab6e2b61931737e662dd293b40578ccornelius            log_err("unumsys_openAvailableNames results incomplete: numsysCount %d, foundLatn %d, foundArab %d\n",
237859d709d503bab6e2b61931737e662dd293b40578ccornelius                    numsysCount, foundLatn, foundArab);
237959d709d503bab6e2b61931737e662dd293b40578ccornelius        }
238059d709d503bab6e2b61931737e662dd293b40578ccornelius    } else {
238159d709d503bab6e2b61931737e662dd293b40578ccornelius        log_data_err("unumsys_openAvailableNames fails with status %s\n", myErrorName(status));
238259d709d503bab6e2b61931737e662dd293b40578ccornelius    }
238359d709d503bab6e2b61931737e662dd293b40578ccornelius}
238459d709d503bab6e2b61931737e662dd293b40578ccornelius
2385fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius/* plain-C version of test in numfmtst.cpp */
2386fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusenum { kUBufMax = 64 };
2387fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusstatic void TestCurrencyIsoPluralFormat(void) {
2388fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    static const char* DATA[][6] = {
2389fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        // the data are:
2390fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        // locale,
2391fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        // currency amount to be formatted,
2392fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        // currency ISO code to be formatted,
2393fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        // format result using CURRENCYSTYLE,
2394fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        // format result using ISOCURRENCYSTYLE,
2395fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        // format result using PLURALCURRENCYSTYLE,
2396fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
2397fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        {"en_US", "1", "USD", "$1.00", "USD1.00", "1.00 US dollars"},
2398fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        {"en_US", "1234.56", "USD", "$1,234.56", "USD1,234.56", "1,234.56 US dollars"},
2399fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        {"en_US", "-1234.56", "USD", "-$1,234.56", "-USD1,234.56", "-1,234.56 US dollars"},
2400fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        {"zh_CN", "1", "USD", "US$\\u00A01.00", "USD\\u00A01.00", "1.00\\u7F8E\\u5143"},
2401fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        {"zh_CN", "1234.56", "USD", "US$\\u00A01,234.56", "USD\\u00A01,234.56", "1,234.56\\u7F8E\\u5143"},
2402fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        // wrong ISO code {"zh_CN", "1", "CHY", "CHY1.00", "CHY1.00", "1.00 CHY"},
2403fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        // wrong ISO code {"zh_CN", "1234.56", "CHY", "CHY1,234.56", "CHY1,234.56", "1,234.56 CHY"},
2404fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        {"zh_CN", "1", "CNY", "\\uFFE5\\u00A01.00", "CNY\\u00A01.00", "1.00\\u4EBA\\u6C11\\u5E01"},
2405fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        {"zh_CN", "1234.56", "CNY", "\\uFFE5\\u00A01,234.56", "CNY\\u00A01,234.56", "1,234.56\\u4EBA\\u6C11\\u5E01"},
2406fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        {"ru_RU", "1", "RUB", "1,00\\u00A0\\u0440\\u0443\\u0431.", "1,00\\u00A0RUB", "1,00 \\u0440\\u043E\\u0441\\u0441\\u0438\\u0439\\u0441\\u043A\\u043E\\u0433\\u043E \\u0440\\u0443\\u0431\\u043B\\u044F"},
2407fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        {"ru_RU", "2", "RUB", "2,00\\u00A0\\u0440\\u0443\\u0431.", "2,00\\u00A0RUB", "2,00 \\u0440\\u043E\\u0441\\u0441\\u0438\\u0439\\u0441\\u043A\\u043E\\u0433\\u043E \\u0440\\u0443\\u0431\\u043B\\u044F"},
2408fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        {"ru_RU", "5", "RUB", "5,00\\u00A0\\u0440\\u0443\\u0431.", "5,00\\u00A0RUB", "5,00 \\u0440\\u043E\\u0441\\u0441\\u0438\\u0439\\u0441\\u043A\\u043E\\u0433\\u043E \\u0440\\u0443\\u0431\\u043B\\u044F"},
2409fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        // test locale without currency information
2410fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        {"root", "-1.23", "USD", "-US$\\u00A01.23", "-USD\\u00A01.23", "-1.23 USD"},
2411fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        // test choice format
2412fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        {"es_AR", "1", "INR", "INR1,00", "INR1,00", "1,00 rupia india"},
2413fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    };
2414fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    static const UNumberFormatStyle currencyStyles[] = {
2415fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        UNUM_CURRENCY,
2416fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        UNUM_CURRENCY_ISO,
2417fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        UNUM_CURRENCY_PLURAL
2418fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    };
2419fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
2420fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    int32_t i, sIndex;
2421fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
2422fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    for (i=0; i<LENGTH(DATA); ++i) {
2423fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius      const char* localeString = DATA[i][0];
2424fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius      double numberToBeFormat = atof(DATA[i][1]);
2425fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius      const char* currencyISOCode = DATA[i][2];
2426fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius      for (sIndex = 0; sIndex < LENGTH(currencyStyles); ++sIndex) {
2427fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        UNumberFormatStyle style = currencyStyles[sIndex];
2428fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        UErrorCode status = U_ZERO_ERROR;
2429fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        UChar currencyCode[4];
2430fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        UChar ubufResult[kUBufMax];
2431fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        UChar ubufExpected[kUBufMax];
2432fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        int32_t ulenRes;
2433fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
2434fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        UNumberFormat* unumFmt = unum_open(style, NULL, 0, localeString, NULL, &status);
2435fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        if (U_FAILURE(status)) {
2436fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            log_data_err("FAIL: unum_open, locale %s, style %d - %s\n", localeString, (int)style, myErrorName(status));
2437fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            continue;
2438fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        }
2439fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        u_charsToUChars(currencyISOCode, currencyCode, 4);
2440fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        unum_setTextAttribute(unumFmt, UNUM_CURRENCY_CODE, currencyCode, 3, &status);
2441fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        if (U_FAILURE(status)) {
2442fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            log_err("FAIL: unum_setTextAttribute, locale %s, UNUM_CURRENCY_CODE %s\n", localeString, currencyISOCode);
2443fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        }
2444fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        ulenRes = unum_formatDouble(unumFmt, numberToBeFormat, ubufResult, kUBufMax, NULL, &status);
2445fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        if (U_FAILURE(status)) {
2446fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            log_err("FAIL: unum_formatDouble, locale %s, UNUM_CURRENCY_CODE %s - %s\n", localeString, currencyISOCode, myErrorName(status));
2447fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        } else {
2448fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            int32_t ulenExp = u_unescape(DATA[i][3 + sIndex], ubufExpected, kUBufMax);
2449fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            if (ulenRes != ulenExp || u_strncmp(ubufResult, ubufExpected, ulenExp) != 0) {
2450fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                log_err("FAIL: unum_formatDouble, locale %s, UNUM_CURRENCY_CODE %s, expected %s, got something else\n",
2451fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                        localeString, currencyISOCode, DATA[i][3 + sIndex]);
2452fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            }
2453fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        }
2454fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        unum_close(unumFmt);
2455fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius      }
2456fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
2457fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius}
2458fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
2459fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliustypedef struct {
2460fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    const char * locale;
2461fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UNumberFormatStyle style;
2462fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UDisplayContext context;
2463fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    const char * expectedResult;
2464fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius} TestContextItem;
2465fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
2466fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius/* currently no locales have contextTransforms data for "symbol" type */
2467fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusstatic const TestContextItem tcItems[] = { /* results for 123.45 */
2468fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    { "sv", UNUM_SPELLOUT, UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE,    "ett\\u00ADhundra\\u00ADtjugo\\u00ADtre komma fyra fem" },
2469fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    { "sv", UNUM_SPELLOUT, UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE, "Ett\\u00ADhundra\\u00ADtjugo\\u00ADtre komma fyra fem" },
2470fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    { "sv", UNUM_SPELLOUT, UDISPCTX_CAPITALIZATION_FOR_UI_LIST_OR_MENU,       "ett\\u00ADhundra\\u00ADtjugo\\u00ADtre komma fyra fem" },
2471fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    { "sv", UNUM_SPELLOUT, UDISPCTX_CAPITALIZATION_FOR_STANDALONE,            "ett\\u00ADhundra\\u00ADtjugo\\u00ADtre komma fyra fem" },
2472fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    { "en", UNUM_SPELLOUT, UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE,    "one hundred twenty-three point four five" },
2473fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    { "en", UNUM_SPELLOUT, UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE, "One hundred twenty-three point four five" },
2474fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    { "en", UNUM_SPELLOUT, UDISPCTX_CAPITALIZATION_FOR_UI_LIST_OR_MENU,       "One hundred twenty-three point four five" },
2475fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    { "en", UNUM_SPELLOUT, UDISPCTX_CAPITALIZATION_FOR_STANDALONE,            "One hundred twenty-three point four five" },
2476fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    { NULL, (UNumberFormatStyle)0, (UDisplayContext)0, NULL }
2477fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius};
2478fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
2479fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusstatic void TestContext(void) {
2480fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UErrorCode status = U_ZERO_ERROR;
2481fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    const TestContextItem* itemPtr;
2482fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
2483fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UNumberFormat *unum = unum_open(UNUM_SPELLOUT, NULL, 0, "en", NULL, &status);
2484fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if ( U_SUCCESS(status) ) {
2485fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        UDisplayContext context = unum_getContext(unum, UDISPCTX_TYPE_CAPITALIZATION, &status);
2486fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        if ( U_FAILURE(status) || context != UDISPCTX_CAPITALIZATION_NONE) {
2487fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            log_err("FAIL: Initial unum_getContext is not UDISPCTX_CAPITALIZATION_NONE\n");
2488fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            status = U_ZERO_ERROR;
2489fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        }
2490fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        unum_setContext(unum, UDISPCTX_CAPITALIZATION_FOR_STANDALONE, &status);
2491fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        context = unum_getContext(unum, UDISPCTX_TYPE_CAPITALIZATION, &status);
2492fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        if ( U_FAILURE(status) || context != UDISPCTX_CAPITALIZATION_FOR_STANDALONE) {
2493fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            log_err("FAIL: unum_getContext does not return the value set, UDISPCTX_CAPITALIZATION_FOR_STANDALONE\n");
2494fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        }
2495fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        unum_close(unum);
2496fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    } else {
2497fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        log_data_err("unum_open UNUM_SPELLOUT for en fails with status %s\n", myErrorName(status));
2498fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
2499fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#if !UCONFIG_NO_NORMALIZATION && !UCONFIG_NO_BREAK_ITERATION
2500fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    for (itemPtr = tcItems; itemPtr->locale != NULL; itemPtr++) {
2501fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        UChar ubufResult[kUBufMax];
2502fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        int32_t ulenRes;
2503fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
2504fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        status = U_ZERO_ERROR;
2505fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        unum = unum_open(itemPtr->style, NULL, 0, itemPtr->locale, NULL, &status);
2506fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        if (U_FAILURE(status)) {
2507fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            log_data_err("FAIL: unum_open, locale %s, style %d - %s\n",
2508fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                        itemPtr->locale, (int)itemPtr->style, myErrorName(status));
2509fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            continue;
2510fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        }
2511fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        unum_setContext(unum, itemPtr->context, &status);
2512fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        ulenRes = unum_formatDouble(unum, 123.45, ubufResult, kUBufMax, NULL, &status);
2513fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        if (U_FAILURE(status)) {
2514fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            log_err("FAIL: unum_formatDouble, locale %s, style %d, context %d - %s\n",
2515fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                    itemPtr->locale, (int)itemPtr->style, (int)itemPtr->context, myErrorName(status));
2516fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        } else {
2517fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            UChar ubufExpected[kUBufMax];
2518fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            int32_t ulenExp = u_unescape(itemPtr->expectedResult, ubufExpected, kUBufMax);
2519fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            if (ulenRes != ulenExp || u_strncmp(ubufResult, ubufExpected, ulenExp) != 0) {
2520fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                char bbuf[kUBufMax*2];
2521fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                u_austrncpy(bbuf, ubufResult, sizeof(bbuf));
2522fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                log_err("FAIL: unum_formatDouble, locale %s, style %d, context %d, expected %d:\"%s\", got %d:\"%s\"\n",
2523fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                        itemPtr->locale, (int)itemPtr->style, (int)itemPtr->context, ulenExp,
2524fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                        itemPtr->expectedResult, ulenRes, bbuf);
2525fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            }
2526fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        }
2527fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        unum_close(unum);
2528fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
2529fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#endif /* #if !UCONFIG_NO_NORMALIZATION && !UCONFIG_NO_BREAK_ITERATION */
2530fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius}
2531fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
2532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */
2533