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