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