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