164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// Copyright (C) 2016 and later: Unicode, Inc. and others. 264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html 3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ******************************************************************************* 58de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert * Copyright (C) 1996-2016, International Business Machines Corporation and 68de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert * others. All Rights Reserved. 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ******************************************************************************* 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h" 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "itrbnf.h" 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/umachine.h" 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/tblcoll.h" 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/coleitr.h" 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ures.h" 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h" 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/decimfmt.h" 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/udata.h" 248de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert#include "cmemory.h" 25c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#include "putilimp.h" 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "testutil.h" 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <string.h> 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// import com.ibm.text.RuleBasedNumberFormat; 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// import com.ibm.test.TestFmwk; 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// import java.util.Locale; 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// import java.text.NumberFormat; 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// current macro not in icu1.8.1 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TESTCASE(id,test) \ 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case id: \ 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name = #test; \ 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (exec) { \ 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(#test "---"); \ 4250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho logln(); \ 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test(); \ 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } \ 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTestRBNF::runIndexedTest(int32_t index, UBool exec, const char* &name, char* /*par*/) 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (exec) logln("TestSuite RuleBasedNumberFormat"); 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (index) { 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if U_HAVE_RBNF 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(0, TestEnglishSpellout); 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(1, TestOrdinalAbbreviations); 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(2, TestDurations); 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(3, TestSpanishSpellout); 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(4, TestFrenchSpellout); 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(5, TestSwissFrenchSpellout); 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(6, TestItalianSpellout); 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(7, TestGermanSpellout); 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(8, TestThaiSpellout); 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(9, TestAPI); 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(10, TestFractionalRuleSet); 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(11, TestSwedishSpellout); 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(12, TestBelgianFrenchSpellout); 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(13, TestSmallValues); 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(14, TestLocalizations); 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(15, TestAllLocales); 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(16, TestHebrewFraction); 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(17, TestPortugueseSpellout); 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(18, TestMultiplierSubstitution); 71103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius TESTCASE(19, TestSetDecimalFormatSymbols); 72f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius TESTCASE(20, TestPluralRules); 731b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert TESTCASE(21, TestMultiplePluralRules); 74c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert TESTCASE(22, TestInfinityNaN); 75c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert TESTCASE(23, TestVariableDecimalPoint); 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(0, TestRBNFDisabled); 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name = ""; 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if U_HAVE_RBNF 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTestRBNF::TestHebrewFraction() { 88b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // this is the expected output for 123.45, with no '<' in it. 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar text1[] = { 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x05de, 0x05d0, 0x05d4, 0x0020, 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x05e2, 0x05e9, 0x05e8, 0x05d9, 0x05dd, 0x0020, 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x05d5, 0x05e9, 0x05dc, 0x05d5, 0x05e9, 0x0020, 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x05e0, 0x05e7, 0x05d5, 0x05d3, 0x05d4, 0x0020, 95b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 0x05d0, 0x05e8, 0x05d1, 0x05e2, 0x0020, 96b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 0x05d7, 0x05de, 0x05e9, 0x0000, 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar text2[] = { 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x05DE, 0x05D0, 0x05D4, 0x0020, 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x05E2, 0x05E9, 0x05E8, 0x05D9, 0x05DD, 0x0020, 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x05D5, 0x05E9, 0x05DC, 0x05D5, 0x05E9, 0x0020, 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x05E0, 0x05E7, 0x05D5, 0x05D3, 0x05D4, 0x0020, 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x05D0, 0x05E4, 0x05E1, 0x0020, 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x05D0, 0x05E4, 0x05E1, 0x0020, 105b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 0x05D0, 0x05E8, 0x05D1, 0x05E2, 0x0020, 106b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 0x05D7, 0x05DE, 0x05E9, 0x0000, 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedNumberFormat* formatter = new RuleBasedNumberFormat(URBNF_SPELLOUT, "he_IL", status); 1106d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (status == U_MISSING_RESOURCE_ERROR || status == U_FILE_ACCESS_ERROR) { 1116d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "Failed in constructing RuleBasedNumberFormat - %s", u_errorName(status)); 1126d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru delete formatter; 1136d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru return; 1146d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString result; 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Formattable parseResult; 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ParsePosition pp(0); 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString expected(text1); 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter->format(123.45, result); 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (result != expected) { 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"expected '" + TestUtility::hex(expected) + "'\nbut got: '" + TestUtility::hex(result) + "'"); 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 124b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// formatter->parse(result, parseResult, pp); 125b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// if (parseResult.getDouble() != 123.45) { 126b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// errln("expected 123.45 but got: %g", parseResult.getDouble()); 127b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// } 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString expected(text2); 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.remove(); 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter->format(123.0045, result); 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (result != expected) { 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"expected '" + TestUtility::hex(expected) + "'\nbut got: '" + TestUtility::hex(result) + "'"); 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pp.setIndex(0); 138b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// formatter->parse(result, parseResult, pp); 139b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// if (parseResult.getDouble() != 123.0045) { 140b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// errln("expected 123.0045 but got: %g", parseResult.getDouble()); 141b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// } 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestAPI() { 149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // This test goes through the APIs that were not tested before. 150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // These tests are too small to have separate test classes/functions 151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedNumberFormat* formatter 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale::getUS(), status); 1556d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (status == U_MISSING_RESOURCE_ERROR || status == U_FILE_ACCESS_ERROR) { 1566d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("Unable to create formatter. - %s", u_errorName(status)); 1576d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru delete formatter; 1586d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru return; 1596d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("RBNF API test starting"); 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test clone 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Testing Clone"); 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedNumberFormat* rbnfClone = (RuleBasedNumberFormat *)formatter->clone(); 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(rbnfClone != NULL) { 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!(*rbnfClone == *formatter)) { 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Clone should be semantically equivalent to the original!"); 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete rbnfClone; 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Cloning failed!"); 173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test assignment 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Testing assignment operator"); 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedNumberFormat assignResult(URBNF_SPELLOUT, Locale("es", "ES", ""), status); 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assignResult = *formatter; 181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!(assignResult == *formatter)) { 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Assignment result should be semantically equivalent to the original!"); 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test rule constructor 187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Testing rule constructor"); 18950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalUResourceBundlePointer en(ures_open(U_ICUDATA_NAME U_TREE_SEPARATOR_STRING "rbnf", "en", &status)); 190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Unable to access resource bundle with data!"); 192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t ruleLen = 0; 194b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t len = 0; 19550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalUResourceBundlePointer rbnfRules(ures_getByKey(en.getAlias(), "RBNFRules", NULL, &status)); 19650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho LocalUResourceBundlePointer ruleSets(ures_getByKey(rbnfRules.getAlias(), "SpelloutRules", NULL, &status)); 197b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UnicodeString desc; 19850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho while (ures_hasNext(ruleSets.getAlias())) { 19950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UChar* currentString = ures_getNextString(ruleSets.getAlias(), &len, NULL, &status); 200b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ruleLen += len; 201b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru desc.append(currentString); 202b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 203b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 204b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UChar *spelloutRules = desc.getTerminatedBuffer(); 205b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status) || ruleLen == 0 || spelloutRules == NULL) { 207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Unable to access the rules string!"); 208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError perror; 210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedNumberFormat ruleCtorResult(spelloutRules, Locale::getUS(), perror, status); 211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!(ruleCtorResult == *formatter)) { 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Formatter constructed from the original rules should be semantically equivalent to the original!"); 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Jitterbug 4452, for coverage 216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedNumberFormat nf(spelloutRules, (UnicodeString)"", Locale::getUS(), perror, status); 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!(nf == *formatter)) { 218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Formatter constructed from the original rules should be semantically equivalent to the original!"); 219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test getRules 225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Testing getRules function"); 227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rules = formatter->getRules(); 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError perror; 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedNumberFormat fromRulesResult(rules, Locale::getUS(), perror, status); 230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!(fromRulesResult == *formatter)) { 232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Formatter constructed from rules obtained by getRules should be semantically equivalent to the original!"); 233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Testing copy constructor"); 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedNumberFormat copyCtorResult(*formatter); 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!(copyCtorResult == *formatter)) { 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Copy constructor result result should be semantically equivalent to the original!"); 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test ruleset names 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Testing getNumberOfRuleSetNames, getRuleSetName and format using rule set names"); 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t noOfRuleSetNames = formatter->getNumberOfRuleSetNames(); 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(noOfRuleSetNames == 0) { 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Number of rule set names should be more than zero"); 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString ruleSetName; 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i = 0; 255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t intFormatNum = 34567; 256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double doubleFormatNum = 893411.234; 257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("number of rule set names is %i", noOfRuleSetNames); 258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i < noOfRuleSetNames; i++) { 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition pos1, pos2; 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString intFormatResult, doubleFormatResult; 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Formattable intParseResult, doubleParseResult; 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ruleSetName = formatter->getRuleSetName(i); 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log("Rule set name %i is ", i); 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log(ruleSetName); 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(". Format results are: "); 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru intFormatResult = formatter->format(intFormatNum, ruleSetName, intFormatResult, pos1, status); 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doubleFormatResult = formatter->format(doubleFormatNum, ruleSetName, doubleFormatResult, pos2, status); 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Format using a rule set failed"); 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(intFormatResult); 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(doubleFormatResult); 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter->setLenient(TRUE); 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter->parse(intFormatResult, intParseResult, status); 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter->parse(doubleFormatResult, doubleParseResult, status); 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Parse results for lenient = TRUE, %i, %f", intParseResult.getLong(), doubleParseResult.getDouble()); 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter->setLenient(FALSE); 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter->parse(intFormatResult, intParseResult, status); 283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter->parse(doubleFormatResult, doubleParseResult, status); 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Parse results for lenient = FALSE, %i, %f", intParseResult.getLong(), doubleParseResult.getDouble()); 286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Error during parsing"); 289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru intFormatResult = formatter->format(intFormatNum, "BLABLA", intFormatResult, pos1, status); 292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Using invalid rule set name should have failed"); 294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doubleFormatResult = formatter->format(doubleFormatNum, "TRUC", doubleFormatResult, pos2, status); 298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Using invalid rule set name should have failed"); 300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test API 309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString expected("four point five",""); 310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Testing format(double)"); 311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString result; 312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter->format(4.5,result); 313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(result != expected) { 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Formatted 4.5, expected " + expected + " got " + result); 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Formatted 4.5, expected " + expected + " got " + result); 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.remove(); 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expected = "four"; 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter->format((int32_t)4,result); 321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(result != expected) { 322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Formatted 4, expected " + expected + " got " + result); 323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Formatted 4, expected " + expected + " got " + result); 325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.remove(); 328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition pos; 329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter->format((int64_t)4, result, pos, status = U_ZERO_ERROR); 330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(result != expected) { 331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Formatted 4 int64_t, expected " + expected + " got " + result); 332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Formatted 4 int64_t, expected " + expected + " got " + result); 334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //Jitterbug 4452, for coverage 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.remove(); 338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition pos2; 339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter->format((int64_t)4, formatter->getRuleSetName(0), result, pos2, status = U_ZERO_ERROR); 340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(result != expected) { 341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Formatted 4 int64_t, expected " + expected + " got " + result); 342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Formatted 4 int64_t, expected " + expected + " got " + result); 344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // clean up 347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Cleaning up"); 348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3511b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert/** 3521b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert * Perform a simple spot check on the parsing going into an infinite loop for alternate rules. 3531b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert */ 3541b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubertvoid IntlTestRBNF::TestMultiplePluralRules() { 3551b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert // This is trying to model the feminine form, but don't worry about the details too much. 3561b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert // We're trying to test the plural rules where there are different prefixes. 3571b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert UnicodeString rules("%spellout-cardinal-feminine-genitive:" 3581b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert "0: zero;" 3591b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert "1: ono;" 360c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert "2: two;" 3611b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert "1000: << $(cardinal,one{thousand}few{thousanF}other{thousanO})$[ >>];" 3621b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert "%spellout-cardinal-feminine:" 363c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert "x.x: [<< $(cardinal,one{singleton}other{plurality})$ ]>%%fractions>;" 3641b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert "0: zero;" 3651b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert "1: one;" 366c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert "2: two;" 367c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert "1000: << $(cardinal,one{thousand}few{thousanF}other{thousanO})$[ >>];" 368c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert "%%fractions:" 369c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert "10: <%spellout-cardinal-feminine< $(cardinal,one{oneth}other{tenth})$;" 370c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert "100: <%spellout-cardinal-feminine< $(cardinal,one{1hundredth}other{hundredth})$;"); 3711b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert UErrorCode status = U_ZERO_ERROR; 3721b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert UParseError pError; 3731b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert RuleBasedNumberFormat formatter(rules, Locale("ru"), pError, status); 3741b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert Formattable result; 3751b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert UnicodeString resultStr; 3761b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert FieldPosition pos; 3771b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert 3781b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert if (U_FAILURE(status)) { 3791b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert dataerrln("Unable to create formatter - %s", u_errorName(status)); 3801b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert return; 3811b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 3821b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert 3831b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert formatter.parse(formatter.format(1000.0, resultStr, pos, status), result, status); 3841b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert if (1000 != result.getLong() || resultStr != UNICODE_STRING_SIMPLE("one thousand")) { 3851b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert errln("RuleBasedNumberFormat did not return the correct value. Got: %d", result.getLong()); 3861b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert errln(resultStr); 3871b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 3881b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert resultStr.remove(); 3891b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert formatter.parse(formatter.format(1000.0, UnicodeString("%spellout-cardinal-feminine-genitive"), resultStr, pos, status), result, status); 3901b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert if (1000 != result.getLong() || resultStr != UNICODE_STRING_SIMPLE("ono thousand")) { 3911b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert errln("RuleBasedNumberFormat(cardinal-feminine-genitive) did not return the correct value. Got: %d", result.getLong()); 3921b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert errln(resultStr); 3931b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 3941b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert resultStr.remove(); 3951b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert formatter.parse(formatter.format(1000.0, UnicodeString("%spellout-cardinal-feminine"), resultStr, pos, status), result, status); 3961b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert if (1000 != result.getLong() || resultStr != UNICODE_STRING_SIMPLE("one thousand")) { 3971b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert errln("RuleBasedNumberFormat(spellout-cardinal-feminine) did not return the correct value. Got: %d", result.getLong()); 3981b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert errln(resultStr); 3991b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 400c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert static const char* const testData[][2] = { 401c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert { "0", "zero" }, 402c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert { "1", "one" }, 403c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert { "2", "two" }, 404c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert { "0.1", "one oneth" }, 405c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert { "0.2", "two tenth" }, 406c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert { "1.1", "one singleton one oneth" }, 407c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert { "1.2", "one singleton two tenth" }, 408c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert { "2.1", "two plurality one oneth" }, 409c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert { "2.2", "two plurality two tenth" }, 410c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert { "0.01", "one 1hundredth" }, 411c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert { "0.02", "two hundredth" }, 412c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert { NULL, NULL } 413c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert }; 414c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert doTest(&formatter, testData, TRUE); 4151b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert} 4161b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert 417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTestRBNF::TestFractionalRuleSet() 418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString fracRules( 420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "%main:\n" 421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // this rule formats the number if it's 1 or more. It formats 422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // the integral part using a DecimalFormat ("#,##0" puts 423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // thousands separators in the right places) and the fractional 424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // part using %%frac. If there is no fractional part, it 425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // just shows the integral part. 426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " x.0: <#,##0<[ >%%frac>];\n" 427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // this rule formats the number if it's between 0 and 1. It 428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // shows only the fractional part (0.5 shows up as "1/2," not 429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // "0 1/2") 430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " 0.x: >%%frac>;\n" 431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // the fraction rule set. This works the same way as the one in the 432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // preceding example: We multiply the fractional part of the number 433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // being formatted by each rule's base value and use the rule that 434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // produces the result closest to 0 (or the first rule that produces 0). 435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Since we only provide rules for the numbers from 2 to 10, we know 436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // we'll get a fraction with a denominator between 2 and 10. 437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // "<0<" causes the numerator of the fraction to be formatted 438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // using numerals 439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "%%frac:\n" 440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " 2: 1/2;\n" 441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " 3: <0</3;\n" 442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " 4: <0</4;\n" 443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " 5: <0</5;\n" 444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " 6: <0</6;\n" 445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " 7: <0</7;\n" 446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " 8: <0</8;\n" 447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " 9: <0</9;\n" 448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " 10: <0</10;\n"); 449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // mondo hack 451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int len = fracRules.length(); 452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int change = 2; 453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int i = 0; i < len; ++i) { 454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar ch = fracRules.charAt(i); 455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ch == '\n') { 456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru change = 2; // change ok 457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (ch == ':') { 458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru change = 1; // change, but once we hit a non-space char, don't change 459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (ch == ' ') { 460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (change != 0) { 461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fracRules.setCharAt(i, (UChar)0x200e); 462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (change == 1) { 465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru change = 0; 466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError perror; 472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedNumberFormat formatter(fracRules, Locale::getEnglish(), perror, status); 473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 4746d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "FAIL: could not construct formatter - %s", u_errorName(status)); 475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* const testData[][2] = { 477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "0", "0" }, 478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { ".1", "1/10" }, 479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { ".11", "1/9" }, 480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { ".125", "1/8" }, 481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { ".1428", "1/7" }, 482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { ".1667", "1/6" }, 483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { ".2", "1/5" }, 484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { ".25", "1/4" }, 485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { ".333", "1/3" }, 486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { ".5", "1/2" }, 487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "1.1", "1 1/10" }, 488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "2.11", "2 1/9" }, 489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "3.125", "3 1/8" }, 490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "4.1428", "4 1/7" }, 491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "5.1667", "5 1/6" }, 492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "6.2", "6 1/5" }, 493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "7.25", "7 1/4" }, 494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "8.333", "8 1/3" }, 495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "9.5", "9 1/2" }, 496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { ".2222", "2/9" }, 497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { ".4444", "4/9" }, 498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { ".5555", "5/9" }, 499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "1.2856", "1 2/7" }, 500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { NULL, NULL } 501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 502c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert doTest(&formatter, testData, FALSE); // exact values aren't parsable from fractions 503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0 507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define LLAssert(a) \ 508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!(a)) errln("FAIL: " #a) 509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTestRBNF::TestLLongConstructors() 511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Testing constructors"); 513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // constant (shouldn't really be public) 515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(llong::kD32).asDouble() == llong::kD32); 516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // internal constructor (shouldn't really be public) 518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0, 1).asDouble() == 1); 519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(1, 0).asDouble() == llong::kD32); 520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((uint32_t)-1, (uint32_t)-1).asDouble() == -1); 521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // public empty constructor 523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong().asDouble() == 0); 524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // public int32_t constructor 526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((int32_t)0).asInt() == (int32_t)0); 527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((int32_t)1).asInt() == (int32_t)1); 528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((int32_t)-1).asInt() == (int32_t)-1); 529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((int32_t)0x7fffffff).asInt() == (int32_t)0x7fffffff); 530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((int32_t)0xffffffff).asInt() == (int32_t)-1); 531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((int32_t)0x80000000).asInt() == (int32_t)0x80000000); 532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // public int16_t constructor 534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((int16_t)0).asInt() == (int16_t)0); 535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((int16_t)1).asInt() == (int16_t)1); 536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((int16_t)-1).asInt() == (int16_t)-1); 537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((int16_t)0x7fff).asInt() == (int16_t)0x7fff); 538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((int16_t)0xffff).asInt() == (int16_t)0xffff); 539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((int16_t)0x8000).asInt() == (int16_t)0x8000); 540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // public int8_t constructor 542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((int8_t)0).asInt() == (int8_t)0); 543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((int8_t)1).asInt() == (int8_t)1); 544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((int8_t)-1).asInt() == (int8_t)-1); 545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((int8_t)0x7f).asInt() == (int8_t)0x7f); 546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((int8_t)0xff).asInt() == (int8_t)0xff); 547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((int8_t)0x80).asInt() == (int8_t)0x80); 548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // public uint16_t constructor 550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((uint16_t)0).asUInt() == (uint16_t)0); 551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((uint16_t)1).asUInt() == (uint16_t)1); 552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((uint16_t)-1).asUInt() == (uint16_t)-1); 553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((uint16_t)0x7fff).asUInt() == (uint16_t)0x7fff); 554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((uint16_t)0xffff).asUInt() == (uint16_t)0xffff); 555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((uint16_t)0x8000).asUInt() == (uint16_t)0x8000); 556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // public uint32_t constructor 558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((uint32_t)0).asUInt() == (uint32_t)0); 559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((uint32_t)1).asUInt() == (uint32_t)1); 560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((uint32_t)-1).asUInt() == (uint32_t)-1); 561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((uint32_t)0x7fffffff).asUInt() == (uint32_t)0x7fffffff); 562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((uint32_t)0xffffffff).asUInt() == (uint32_t)-1); 563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((uint32_t)0x80000000).asUInt() == (uint32_t)0x80000000); 564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // public double constructor 566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((double)0).asDouble() == (double)0); 567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((double)1).asDouble() == (double)1); 568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((double)0x7fffffff).asDouble() == (double)0x7fffffff); 569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((double)0x80000000).asDouble() == (double)0x80000000); 570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((double)0x80000001).asDouble() == (double)0x80000001); 571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // can't access uprv_maxmantissa, so fake it 573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double maxmantissa = (llong((int32_t)1) << 40).asDouble(); 574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(maxmantissa).asDouble() == maxmantissa); 575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(-maxmantissa).asDouble() == -maxmantissa); 576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // copy constructor 578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(llong(0, 1)).asDouble() == 1); 579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(llong(1, 0)).asDouble() == llong::kD32); 580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(llong(-1, (uint32_t)-1)).asDouble() == -1); 581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // asInt - test unsigned to signed narrowing conversion 583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((uint32_t)-1).asInt() == (int32_t)0x7fffffff); 584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(-1, 0).asInt() == (int32_t)0x80000000); 585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // asUInt - test signed to unsigned narrowing conversion 587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((int32_t)-1).asUInt() == (uint32_t)-1); 588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((int32_t)0x80000000).asUInt() == (uint32_t)0x80000000); 589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // asDouble already tested 591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTestRBNF::TestLLongSimpleOperators() 595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Testing simple operators"); 597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator== 599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong() == llong(0, 0)); 600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(1,0) == llong(1, 0)); 601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0,1) == llong(0, 1)); 602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator!= 604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(1,0) != llong(1,1)); 605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0,1) != llong(1,1)); 606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0xffffffff,0xffffffff) != llong(0x7fffffff, 0xffffffff)); 607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // unsigned > 609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((int32_t)-1).ugt(llong(0x7fffffff, 0xffffffff))); 610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // unsigned < 612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0x7fffffff, 0xffffffff).ult(llong((int32_t)-1))); 613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // unsigned >= 615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((int32_t)-1).uge(llong(0x7fffffff, 0xffffffff))); 616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((int32_t)-1).uge(llong((int32_t)-1))); 617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // unsigned <= 619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0x7fffffff, 0xffffffff).ule(llong((int32_t)-1))); 620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong((int32_t)-1).ule(llong((int32_t)-1))); 621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator> 623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(1, 1) > llong(1, 0)); 624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0, 0x80000000) > llong(0, 0x7fffffff)); 625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0x80000000, 1) > llong(0x80000000, 0)); 626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(1, 0) > llong(0, 0x7fffffff)); 627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(1, 0) > llong(0, 0xffffffff)); 628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0, 0) > llong(0x80000000, 1)); 629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator< 631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(1, 0) < llong(1, 1)); 632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0, 0x7fffffff) < llong(0, 0x80000000)); 633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0x80000000, 0) < llong(0x80000000, 1)); 634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0, 0x7fffffff) < llong(1, 0)); 635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0, 0xffffffff) < llong(1, 0)); 636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0x80000000, 1) < llong(0, 0)); 637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator>= 639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(1, 1) >= llong(1, 0)); 640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0, 0x80000000) >= llong(0, 0x7fffffff)); 641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0x80000000, 1) >= llong(0x80000000, 0)); 642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(1, 0) >= llong(0, 0x7fffffff)); 643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(1, 0) >= llong(0, 0xffffffff)); 644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0, 0) >= llong(0x80000000, 1)); 645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong() >= llong(0, 0)); 646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(1,0) >= llong(1, 0)); 647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0,1) >= llong(0, 1)); 648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator<= 650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(1, 0) <= llong(1, 1)); 651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0, 0x7fffffff) <= llong(0, 0x80000000)); 652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0x80000000, 0) <= llong(0x80000000, 1)); 653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0, 0x7fffffff) <= llong(1, 0)); 654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0, 0xffffffff) <= llong(1, 0)); 655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0x80000000, 1) <= llong(0, 0)); 656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong() <= llong(0, 0)); 657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(1,0) <= llong(1, 0)); 658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0,1) <= llong(0, 1)); 659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator==(int32) 661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong() == (int32_t)0); 662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0,1) == (int32_t)1); 663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator!=(int32) 665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(1,0) != (int32_t)0); 666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0,1) != (int32_t)2); 667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0,0xffffffff) != (int32_t)-1); 668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru llong negOne(0xffffffff, 0xffffffff); 670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator>(int32) 672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0, 0x80000000) > (int32_t)0x7fffffff); 673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(negOne > (int32_t)-2); 674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(1, 0) > (int32_t)0x7fffffff); 675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0, 0) > (int32_t)-1); 676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator<(int32) 678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0, 0x7ffffffe) < (int32_t)0x7fffffff); 679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0xffffffff, 0xfffffffe) < (int32_t)-1); 680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator>=(int32) 682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0, 0x80000000) >= (int32_t)0x7fffffff); 683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(negOne >= (int32_t)-2); 684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(1, 0) >= (int32_t)0x7fffffff); 685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0, 0) >= (int32_t)-1); 686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong() >= (int32_t)0); 687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0,1) >= (int32_t)1); 688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator<=(int32) 690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0, 0x7ffffffe) <= (int32_t)0x7fffffff); 691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0xffffffff, 0xfffffffe) <= (int32_t)-1); 692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong() <= (int32_t)0); 693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0,1) <= (int32_t)1); 694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator= 696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(2,3) = llong((uint32_t)-1)).asUInt() == (uint32_t)-1); 697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator <<= 699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(1, 1) <<= 0) == llong(1, 1)); 700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(1, 1) <<= 31) == llong(0x80000000, 0x80000000)); 701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(1, 1) <<= 32) == llong(1, 0)); 702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(1, 1) <<= 63) == llong(0x80000000, 0)); 703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(1, 1) <<= 64) == llong(1, 1)); // only lower 6 bits are used 704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(1, 1) <<= -1) == llong(0x80000000, 0)); // only lower 6 bits are used 705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator << 707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong((int32_t)1) << 5).asUInt() == 32); 708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator >>= (sign extended) 710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(0x7fffa0a0, 0xbcbcdfdf) >>= 16) == llong(0x7fff,0xa0a0bcbc)); 711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(0x8000789a, 0xbcde0000) >>= 16) == llong(0xffff8000,0x789abcde)); 712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(0x80000000, 0) >>= 63) == llong(0xffffffff, 0xffffffff)); 713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(0x80000000, 0) >>= 47) == llong(0xffffffff, 0xffff0000)); 714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(0x80000000, 0x80000000) >> 64) == llong(0x80000000, 0x80000000)); // only lower 6 bits are used 715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(0x80000000, 0) >>= -1) == llong(0xffffffff, 0xffffffff)); // only lower 6 bits are used 716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator >> sign extended) 718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(0x8000789a, 0xbcde0000) >> 16) == llong(0xffff8000,0x789abcde)); 719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // ushr (right shift without sign extension) 721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0x7fffa0a0, 0xbcbcdfdf).ushr(16) == llong(0x7fff,0xa0a0bcbc)); 722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0x8000789a, 0xbcde0000).ushr(16) == llong(0x00008000,0x789abcde)); 723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0x80000000, 0).ushr(63) == llong(0, 1)); 724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0x80000000, 0).ushr(47) == llong(0, 0x10000)); 725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0x80000000, 0x80000000).ushr(64) == llong(0x80000000, 0x80000000)); // only lower 6 bits are used 726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0x80000000, 0).ushr(-1) == llong(0, 1)); // only lower 6 bits are used 727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator&(llong) 729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(0x55555555, 0x55555555) & llong(0xaaaaffff, 0xffffaaaa)) == llong(0x00005555, 0x55550000)); 730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator|(llong) 732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(0x55555555, 0x55555555) | llong(0xaaaaffff, 0xffffaaaa)) == llong(0xffffffff, 0xffffffff)); 733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator^(llong) 735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(0x55555555, 0x55555555) ^ llong(0xaaaaffff, 0xffffaaaa)) == llong(0xffffaaaa, 0xaaaaffff)); 736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator&(uint32) 738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(0x55555555, 0x55555555) & (uint32_t)0xffffaaaa) == llong(0, 0x55550000)); 739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator|(uint32) 741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(0x55555555, 0x55555555) | (uint32_t)0xffffaaaa) == llong(0x55555555, 0xffffffff)); 742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator^(uint32) 744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(0x55555555, 0x55555555) ^ (uint32_t)0xffffaaaa) == llong(0x55555555, 0xaaaaffff)); 745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator~ 747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(~llong(0x55555555, 0x55555555) == llong(0xaaaaaaaa, 0xaaaaaaaa)); 748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator&=(llong) 750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(0x55555555, 0x55555555) &= llong(0xaaaaffff, 0xffffaaaa)) == llong(0x00005555, 0x55550000)); 751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator|=(llong) 753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(0x55555555, 0x55555555) |= llong(0xaaaaffff, 0xffffaaaa)) == llong(0xffffffff, 0xffffffff)); 754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator^=(llong) 756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(0x55555555, 0x55555555) ^= llong(0xaaaaffff, 0xffffaaaa)) == llong(0xffffaaaa, 0xaaaaffff)); 757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator&=(uint32) 759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(0x55555555, 0x55555555) &= (uint32_t)0xffffaaaa) == llong(0, 0x55550000)); 760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator|=(uint32) 762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(0x55555555, 0x55555555) |= (uint32_t)0xffffaaaa) == llong(0x55555555, 0xffffffff)); 763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator^=(uint32) 765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(0x55555555, 0x55555555) ^= (uint32_t)0xffffaaaa) == llong(0x55555555, 0xaaaaffff)); 766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // prefix inc 768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(1, 0) == ++llong(0,0xffffffff)); 769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // prefix dec 771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0,0xffffffff) == --llong(1, 0)); 772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // postfix inc 774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru llong n(0, 0xffffffff); 776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0, 0xffffffff) == n++); 777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(1, 0) == n); 778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // postfix dec 781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru llong n(1, 0); 783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(1, 0) == n--); 784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0, 0xffffffff) == n); 785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // unary minus 788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0, 0) == -llong(0, 0)); 789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0xffffffff, 0xffffffff) == -llong(0, 1)); 790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0, 1) == -llong(0xffffffff, 0xffffffff)); 791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0x7fffffff, 0xffffffff) == -llong(0x80000000, 1)); 792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0x80000000, 0) == -llong(0x80000000, 0)); // !!! we don't handle overflow 793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator-= 795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru llong n; 797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((n -= llong(0, 1)) == llong(0xffffffff, 0xffffffff)); 798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(n == llong(0xffffffff, 0xffffffff)); 799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru n = llong(1, 0); 801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((n -= llong(0, 1)) == llong(0, 0xffffffff)); 802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(n == llong(0, 0xffffffff)); 803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator- 806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru llong n; 808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((n - llong(0, 1)) == llong(0xffffffff, 0xffffffff)); 809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(n == llong(0, 0)); 810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru n = llong(1, 0); 812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((n - llong(0, 1)) == llong(0, 0xffffffff)); 813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(n == llong(1, 0)); 814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator+= 817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru llong n(0xffffffff, 0xffffffff); 819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((n += llong(0, 1)) == llong(0, 0)); 820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(n == llong(0, 0)); 821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru n = llong(0, 0xffffffff); 823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((n += llong(0, 1)) == llong(1, 0)); 824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(n == llong(1, 0)); 825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator+ 828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru llong n(0xffffffff, 0xffffffff); 830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((n + llong(0, 1)) == llong(0, 0)); 831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(n == llong(0xffffffff, 0xffffffff)); 832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru n = llong(0, 0xffffffff); 834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((n + llong(0, 1)) == llong(1, 0)); 835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(n == llong(0, 0xffffffff)); 836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTestRBNF::TestLLong() 841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Starting TestLLong"); 843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestLLongConstructors(); 845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TestLLongSimpleOperators(); 847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Testing operator*=, operator*"); 849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator*=, operator* 851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // small and large values, positive, &NEGative, zero 852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // also test commutivity 853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong ZERO; 855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong ONE(0, 1); 856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong NEG_ONE((int32_t)-1); 857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong THREE(0, 3); 858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong NEG_THREE((int32_t)-3); 859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong TWO_TO_16(0, 0x10000); 860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong NEG_TWO_TO_16 = -TWO_TO_16; 861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong TWO_TO_32(1, 0); 862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong NEG_TWO_TO_32 = -TWO_TO_32; 863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong NINE(0, 9); 865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong NEG_NINE = -NINE; 866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong TWO_TO_16X3(0, 0x00030000); 868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong NEG_TWO_TO_16X3 = -TWO_TO_16X3; 869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong TWO_TO_32X3(3, 0); 871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong NEG_TWO_TO_32X3 = -TWO_TO_32X3; 872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong TWO_TO_48(0x10000, 0); 874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong NEG_TWO_TO_48 = -TWO_TO_48; 875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const int32_t VALUE_WIDTH = 9; 877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong* values[VALUE_WIDTH] = { 878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &ZERO, &ONE, &NEG_ONE, &THREE, &NEG_THREE, &TWO_TO_16, &NEG_TWO_TO_16, &TWO_TO_32, &NEG_TWO_TO_32 879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong* answers[VALUE_WIDTH*VALUE_WIDTH] = { 882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &ZERO, &ZERO, &ZERO, &ZERO, &ZERO, &ZERO, &ZERO, &ZERO, &ZERO, 883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &ZERO, &ONE, &NEG_ONE, &THREE, &NEG_THREE, &TWO_TO_16, &NEG_TWO_TO_16, &TWO_TO_32, &NEG_TWO_TO_32, 884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &ZERO, &NEG_ONE, &ONE, &NEG_THREE, &THREE, &NEG_TWO_TO_16, &TWO_TO_16, &NEG_TWO_TO_32, &TWO_TO_32, 885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &ZERO, &THREE, &NEG_THREE, &NINE, &NEG_NINE, &TWO_TO_16X3, &NEG_TWO_TO_16X3, &TWO_TO_32X3, &NEG_TWO_TO_32X3, 886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &ZERO, &NEG_THREE, &THREE, &NEG_NINE, &NINE, &NEG_TWO_TO_16X3, &TWO_TO_16X3, &NEG_TWO_TO_32X3, &TWO_TO_32X3, 887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &ZERO, &TWO_TO_16, &NEG_TWO_TO_16, &TWO_TO_16X3, &NEG_TWO_TO_16X3, &TWO_TO_32, &NEG_TWO_TO_32, &TWO_TO_48, &NEG_TWO_TO_48, 888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &ZERO, &NEG_TWO_TO_16, &TWO_TO_16, &NEG_TWO_TO_16X3, &TWO_TO_16X3, &NEG_TWO_TO_32, &TWO_TO_32, &NEG_TWO_TO_48, &TWO_TO_48, 889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &ZERO, &TWO_TO_32, &NEG_TWO_TO_32, &TWO_TO_32X3, &NEG_TWO_TO_32X3, &TWO_TO_48, &NEG_TWO_TO_48, &ZERO, &ZERO, 890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &ZERO, &NEG_TWO_TO_32, &TWO_TO_32, &NEG_TWO_TO_32X3, &TWO_TO_32X3, &NEG_TWO_TO_48, &TWO_TO_48, &ZERO, &ZERO 891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int i = 0; i < VALUE_WIDTH; ++i) { 894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int j = 0; j < VALUE_WIDTH; ++j) { 895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru llong lhs = *values[i]; 896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru llong rhs = *values[j]; 897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru llong ans = *answers[i*VALUE_WIDTH + j]; 898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru llong n = lhs; 900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((n *= rhs) == ans); 902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(n == ans); 903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru n = lhs; 905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((n * rhs) == ans); 906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(n == lhs); 907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Testing operator/=, operator/"); 912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // operator/=, operator/ 913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // test num = 0, div = 0, pos/neg, > 2^32, div > num 914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong ZERO; 916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong ONE(0, 1); 917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong NEG_ONE = -ONE; 918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong MAX(0x7fffffff, 0xffffffff); 919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong MIN(0x80000000, 0); 920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong TWO(0, 2); 921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong NEG_TWO = -TWO; 922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong FIVE(0, 5); 923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong NEG_FIVE = -FIVE; 924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong TWO_TO_32(1, 0); 925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong NEG_TWO_TO_32 = -TWO_TO_32; 926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong TWO_TO_32d5 = llong(TWO_TO_32.asDouble()/5.0); 927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong NEG_TWO_TO_32d5 = -TWO_TO_32d5; 928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong TWO_TO_32X5 = TWO_TO_32 * FIVE; 929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong NEG_TWO_TO_32X5 = -TWO_TO_32X5; 930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong* tuples[] = { // lhs, rhs, ans 932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &ZERO, &ZERO, &ZERO, 933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &ONE, &ZERO,&MAX, 934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &NEG_ONE, &ZERO, &MIN, 935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &ONE, &ONE, &ONE, 936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &ONE, &NEG_ONE, &NEG_ONE, 937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &NEG_ONE, &ONE, &NEG_ONE, 938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &NEG_ONE, &NEG_ONE, &ONE, 939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &FIVE, &TWO, &TWO, 940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &FIVE, &NEG_TWO, &NEG_TWO, 941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &NEG_FIVE, &TWO, &NEG_TWO, 942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &NEG_FIVE, &NEG_TWO, &TWO, 943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &TWO, &FIVE, &ZERO, 944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &TWO, &NEG_FIVE, &ZERO, 945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &NEG_TWO, &FIVE, &ZERO, 946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &NEG_TWO, &NEG_FIVE, &ZERO, 947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &TWO_TO_32, &TWO_TO_32, &ONE, 948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &TWO_TO_32, &NEG_TWO_TO_32, &NEG_ONE, 949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &NEG_TWO_TO_32, &TWO_TO_32, &NEG_ONE, 950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &NEG_TWO_TO_32, &NEG_TWO_TO_32, &ONE, 951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &TWO_TO_32, &FIVE, &TWO_TO_32d5, 952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &TWO_TO_32, &NEG_FIVE, &NEG_TWO_TO_32d5, 953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &NEG_TWO_TO_32, &FIVE, &NEG_TWO_TO_32d5, 954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &NEG_TWO_TO_32, &NEG_FIVE, &TWO_TO_32d5, 955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &TWO_TO_32X5, &FIVE, &TWO_TO_32, 956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &TWO_TO_32X5, &NEG_FIVE, &NEG_TWO_TO_32, 957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &NEG_TWO_TO_32X5, &FIVE, &NEG_TWO_TO_32, 958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &NEG_TWO_TO_32X5, &NEG_FIVE, &TWO_TO_32, 959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &TWO_TO_32X5, &TWO_TO_32, &FIVE, 960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &TWO_TO_32X5, &NEG_TWO_TO_32, &NEG_FIVE, 961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &NEG_TWO_TO_32X5, &NEG_TWO_TO_32, &FIVE, 962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &NEG_TWO_TO_32X5, &TWO_TO_32, &NEG_FIVE 963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const int TUPLE_WIDTH = 3; 9658de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert const int TUPLE_COUNT = UPRV_LENGTHOF(tuples)/TUPLE_WIDTH; 966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int i = 0; i < TUPLE_COUNT; ++i) { 967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong lhs = *tuples[i*TUPLE_WIDTH+0]; 968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong rhs = *tuples[i*TUPLE_WIDTH+1]; 969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong ans = *tuples[i*TUPLE_WIDTH+2]; 970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru llong n = lhs; 972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!((n /= rhs) == ans)) { 973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("fail: (n /= rhs) == ans"); 974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(n == ans); 976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru n = lhs; 978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((n / rhs) == ans); 979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(n == lhs); 980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Testing operator%%=, operator%%"); 984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //operator%=, operator% 985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong ZERO; 987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong ONE(0, 1); 988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong TWO(0, 2); 989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong THREE(0,3); 990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong FOUR(0, 4); 991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong FIVE(0, 5); 992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong SIX(0, 6); 993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong NEG_ONE = -ONE; 995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong NEG_TWO = -TWO; 996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong NEG_THREE = -THREE; 997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong NEG_FOUR = -FOUR; 998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong NEG_FIVE = -FIVE; 999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong NEG_SIX = -SIX; 1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong NINETY_NINE(0, 99); 1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong HUNDRED(0, 100); 1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong HUNDRED_ONE(0, 101); 1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong BIG(0x12345678, 0x9abcdef0); 1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong BIG_FIVE(BIG * FIVE); 1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong BIG_FIVEm1 = BIG_FIVE - ONE; 1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong BIG_FIVEp1 = BIG_FIVE + ONE; 1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong* tuples[] = { 1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &ZERO, &FIVE, &ZERO, 1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &ONE, &FIVE, &ONE, 1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &TWO, &FIVE, &TWO, 1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &THREE, &FIVE, &THREE, 1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &FOUR, &FIVE, &FOUR, 1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &FIVE, &FIVE, &ZERO, 1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &SIX, &FIVE, &ONE, 1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &ZERO, &NEG_FIVE, &ZERO, 1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &ONE, &NEG_FIVE, &ONE, 1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &TWO, &NEG_FIVE, &TWO, 1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &THREE, &NEG_FIVE, &THREE, 1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &FOUR, &NEG_FIVE, &FOUR, 1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &FIVE, &NEG_FIVE, &ZERO, 1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &SIX, &NEG_FIVE, &ONE, 1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &NEG_ONE, &FIVE, &NEG_ONE, 1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &NEG_TWO, &FIVE, &NEG_TWO, 1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &NEG_THREE, &FIVE, &NEG_THREE, 1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &NEG_FOUR, &FIVE, &NEG_FOUR, 1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &NEG_FIVE, &FIVE, &ZERO, 1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &NEG_SIX, &FIVE, &NEG_ONE, 1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &NEG_ONE, &NEG_FIVE, &NEG_ONE, 1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &NEG_TWO, &NEG_FIVE, &NEG_TWO, 1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &NEG_THREE, &NEG_FIVE, &NEG_THREE, 1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &NEG_FOUR, &NEG_FIVE, &NEG_FOUR, 1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &NEG_FIVE, &NEG_FIVE, &ZERO, 1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &NEG_SIX, &NEG_FIVE, &NEG_ONE, 1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &NINETY_NINE, &FIVE, &FOUR, 1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &HUNDRED, &FIVE, &ZERO, 1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &HUNDRED_ONE, &FIVE, &ONE, 1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &BIG_FIVEm1, &FIVE, &FOUR, 1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &BIG_FIVE, &FIVE, &ZERO, 1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &BIG_FIVEp1, &FIVE, &ONE 1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const int TUPLE_WIDTH = 3; 10458de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert const int TUPLE_COUNT = UPRV_LENGTHOF(tuples)/TUPLE_WIDTH; 1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int i = 0; i < TUPLE_COUNT; ++i) { 1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong lhs = *tuples[i*TUPLE_WIDTH+0]; 1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong rhs = *tuples[i*TUPLE_WIDTH+1]; 1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong ans = *tuples[i*TUPLE_WIDTH+2]; 1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru llong n = lhs; 1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!((n %= rhs) == ans)) { 1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("fail: (n %= rhs) == ans"); 1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(n == ans); 1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru n = lhs; 1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((n % rhs) == ans); 1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(n == lhs); 1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Testing pow"); 1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // pow 1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0, 0).pow(0) == llong(0, 0)); 1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0, 0).pow(2) == llong(0, 0)); 1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0, 2).pow(0) == llong(0, 1)); 1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0, 2).pow(2) == llong(0, 4)); 1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0, 2).pow(32) == llong(1, 0)); 1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong(0, 5).pow(10) == llong((double)5.0 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5 * 5)); 1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // absolute value 1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const llong n(0xffffffff,0xffffffff); 1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(n.abs() == llong(0, 1)); 1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef RBNF_DEBUG 1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Testing atoll"); 1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // atoll 1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char empty[] = ""; 1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char zero[] = "0"; 1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char neg_one[] = "-1"; 1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char neg_12345[] = "-12345"; 1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char big1[] = "123456789abcdef0"; 1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char big2[] = "fFfFfFfFfFfFfFfF"; 1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong::atoll(empty) == llong(0, 0)); 1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong::atoll(zero) == llong(0, 0)); 1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong::atoll(neg_one) == llong(0xffffffff, 0xffffffff)); 1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong::atoll(neg_12345) == -llong(0, 12345)); 1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong::atoll(big1, 16) == llong(0x12345678, 0x9abcdef0)); 1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong::atoll(big2, 16) == llong(0xffffffff, 0xffffffff)); 1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // u_atoll 1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar uempty[] = { 0 }; 1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar uzero[] = { 0x30, 0 }; 1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar uneg_one[] = { 0x2d, 0x31, 0 }; 1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar uneg_12345[] = { 0x2d, 0x31, 0x32, 0x33, 0x34, 0x35, 0 }; 1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar ubig1[] = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x30, 0 }; 1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar ubig2[] = { 0x66, 0x46, 0x66, 0x46, 0x66, 0x46, 0x66, 0x46, 0x66, 0x46, 0x66, 0x46, 0x66, 0x46, 0x66, 0x46, 0 }; 1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong::utoll(uempty) == llong(0, 0)); 1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong::utoll(uzero) == llong(0, 0)); 1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong::utoll(uneg_one) == llong(0xffffffff, 0xffffffff)); 1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong::utoll(uneg_12345) == -llong(0, 12345)); 1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong::utoll(ubig1, 16) == llong(0x12345678, 0x9abcdef0)); 1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(llong::utoll(ubig2, 16) == llong(0xffffffff, 0xffffffff)); 1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef RBNF_DEBUG 1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Testing lltoa"); 1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // lltoa 1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char buf[64]; // ascii 1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(0, 0).lltoa(buf, (uint32_t)sizeof(buf)) == 1) && (strcmp(buf, zero) == 0)); 1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(0xffffffff, 0xffffffff).lltoa(buf, (uint32_t)sizeof(buf)) == 2) && (strcmp(buf, neg_one) == 0)); 1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(((-llong(0, 12345)).lltoa(buf, (uint32_t)sizeof(buf)) == 6) && (strcmp(buf, neg_12345) == 0)); 1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(0x12345678, 0x9abcdef0).lltoa(buf, (uint32_t)sizeof(buf), 16) == 16) && (strcmp(buf, big1) == 0)); 1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Testing u_lltoa"); 1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // u_lltoa 1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar buf[64]; 1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(0, 0).lltou(buf, (uint32_t)sizeof(buf)) == 1) && (u_strcmp(buf, uzero) == 0)); 1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(0xffffffff, 0xffffffff).lltou(buf, (uint32_t)sizeof(buf)) == 2) && (u_strcmp(buf, uneg_one) == 0)); 1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert(((-llong(0, 12345)).lltou(buf, (uint32_t)sizeof(buf)) == 6) && (u_strcmp(buf, uneg_12345) == 0)); 1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru LLAssert((llong(0x12345678, 0x9abcdef0).lltou(buf, (uint32_t)sizeof(buf), 16) == 16) && (u_strcmp(buf, ubig1) == 0)); 1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* if 0 */ 1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestEnglishSpellout() 1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedNumberFormat* formatter 1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale::getUS(), status); 1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 11426d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "FAIL: could not construct formatter - %s", u_errorName(status)); 1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* const testData[][2] = { 1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "1", "one" }, 1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "2", "two" }, 1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "15", "fifteen" }, 1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "20", "twenty" }, 1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "23", "twenty-three" }, 1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "73", "seventy-three" }, 1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "88", "eighty-eight" }, 1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "100", "one hundred" }, 1153b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "106", "one hundred six" }, 1154b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "127", "one hundred twenty-seven" }, 1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "200", "two hundred" }, 1156b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "579", "five hundred seventy-nine" }, 1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "1,000", "one thousand" }, 1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "2,000", "two thousand" }, 1159b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "3,004", "three thousand four" }, 1160b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "4,567", "four thousand five hundred sixty-seven" }, 1161b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "15,943", "fifteen thousand nine hundred forty-three" }, 1162b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "2,345,678", "two million three hundred forty-five thousand six hundred seventy-eight" }, 1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "-36", "minus thirty-six" }, 1164b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "234.567", "two hundred thirty-four point five six seven" }, 1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { NULL, NULL} 1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(formatter, testData, TRUE); 1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION 11718de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert formatter->setLenient(TRUE); 11728de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert static const char* lpTestData[][2] = { 1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "fifty-7", "57" }, 1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { " fifty-7", "57" }, 1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { " fifty-7", "57" }, 1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "2 thousand six HUNDRED fifty-7", "2,657" }, 1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "fifteen hundred and zero", "1,500" }, 1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "FOurhundred thiRTY six", "436" }, 1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { NULL, NULL} 11808de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert }; 11818de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert doLenientParseTest(formatter, lpTestData); 1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestOrdinalAbbreviations() 1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedNumberFormat* formatter 1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru = new RuleBasedNumberFormat(URBNF_ORDINAL, Locale::getUS(), status); 1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 11956d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "FAIL: could not construct formatter - %s", u_errorName(status)); 1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* const testData[][2] = { 1198b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "1", "1st" }, 1199b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "2", "2nd" }, 1200b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "3", "3rd" }, 1201b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "4", "4th" }, 1202b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "7", "7th" }, 1203b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "10", "10th" }, 1204b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "11", "11th" }, 1205b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "13", "13th" }, 1206b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "20", "20th" }, 1207b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "21", "21st" }, 1208b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "22", "22nd" }, 1209b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "23", "23rd" }, 1210b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "24", "24th" }, 1211b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "33", "33rd" }, 1212b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "102", "102nd" }, 1213b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "312", "312th" }, 1214b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { "12,345", "12,345th" }, 1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { NULL, NULL} 1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(formatter, testData, FALSE); 1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestDurations() 1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedNumberFormat* formatter 1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru = new RuleBasedNumberFormat(URBNF_DURATION, Locale::getUS(), status); 1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 12316d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "FAIL: could not construct formatter - %s", u_errorName(status)); 1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* const testData[][2] = { 1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "3,600", "1:00:00" }, //move me and I fail 1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "0", "0 sec." }, 1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "1", "1 sec." }, 1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "24", "24 sec." }, 1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "60", "1:00" }, 1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "73", "1:13" }, 1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "145", "2:25" }, 1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "666", "11:06" }, 1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // { "3,600", "1:00:00" }, 1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "3,740", "1:02:20" }, 1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "10,293", "2:51:33" }, 1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { NULL, NULL} 1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(formatter, testData, TRUE); 1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION 1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter->setLenient(TRUE); 1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* lpTestData[][2] = { 1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "2-51-33", "10,293" }, 1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { NULL, NULL} 1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doLenientParseTest(formatter, lpTestData); 1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestSpanishSpellout() 1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedNumberFormat* formatter 1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale("es", "ES", ""), status); 1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 12706d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "FAIL: could not construct formatter - %s", u_errorName(status)); 1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* const testData[][2] = { 1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "1", "uno" }, 1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "6", "seis" }, 1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "16", "diecis\\u00e9is" }, 1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "20", "veinte" }, 1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "24", "veinticuatro" }, 1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "26", "veintis\\u00e9is" }, 1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "73", "setenta y tres" }, 1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "88", "ochenta y ocho" }, 1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "100", "cien" }, 1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "106", "ciento seis" }, 1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "127", "ciento veintisiete" }, 1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "200", "doscientos" }, 1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "579", "quinientos setenta y nueve" }, 1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "1,000", "mil" }, 1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "2,000", "dos mil" }, 1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "3,004", "tres mil cuatro" }, 1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "4,567", "cuatro mil quinientos sesenta y siete" }, 1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "15,943", "quince mil novecientos cuarenta y tres" }, 1291b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "2,345,678", "dos millones trescientos cuarenta y cinco mil seiscientos setenta y ocho"}, 1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "-36", "menos treinta y seis" }, 1293b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "234.567", "doscientos treinta y cuatro coma cinco seis siete" }, 1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { NULL, NULL} 1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(formatter, testData, TRUE); 1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestFrenchSpellout() 1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedNumberFormat* formatter 1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale::getFrance(), status); 1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 13106d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "FAIL: could not construct formatter - %s", u_errorName(status)); 1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* const testData[][2] = { 1313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "1", "un" }, 1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "15", "quinze" }, 1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "20", "vingt" }, 1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "21", "vingt-et-un" }, 1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "23", "vingt-trois" }, 1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "62", "soixante-deux" }, 1319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "70", "soixante-dix" }, 1320b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "71", "soixante-et-onze" }, 1321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "73", "soixante-treize" }, 1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "80", "quatre-vingts" }, 1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "88", "quatre-vingt-huit" }, 1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "100", "cent" }, 132559d709d503bab6e2b61931737e662dd293b40578ccornelius { "106", "cent six" }, 132659d709d503bab6e2b61931737e662dd293b40578ccornelius { "127", "cent vingt-sept" }, 132759d709d503bab6e2b61931737e662dd293b40578ccornelius { "200", "deux cents" }, 132859d709d503bab6e2b61931737e662dd293b40578ccornelius { "579", "cinq cent soixante-dix-neuf" }, 1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "1,000", "mille" }, 133059d709d503bab6e2b61931737e662dd293b40578ccornelius { "1,123", "mille cent vingt-trois" }, 133159d709d503bab6e2b61931737e662dd293b40578ccornelius { "1,594", "mille cinq cent quatre-vingt-quatorze" }, 133259d709d503bab6e2b61931737e662dd293b40578ccornelius { "2,000", "deux mille" }, 133359d709d503bab6e2b61931737e662dd293b40578ccornelius { "3,004", "trois mille quatre" }, 133459d709d503bab6e2b61931737e662dd293b40578ccornelius { "4,567", "quatre mille cinq cent soixante-sept" }, 133559d709d503bab6e2b61931737e662dd293b40578ccornelius { "15,943", "quinze mille neuf cent quarante-trois" }, 133659d709d503bab6e2b61931737e662dd293b40578ccornelius { "2,345,678", "deux millions trois cent quarante-cinq mille six cent soixante-dix-huit" }, 1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "-36", "moins trente-six" }, 133859d709d503bab6e2b61931737e662dd293b40578ccornelius { "234.567", "deux cent trente-quatre virgule cinq six sept" }, 1339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { NULL, NULL} 1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(formatter, testData, TRUE); 1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION 1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter->setLenient(TRUE); 1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* lpTestData[][2] = { 1347b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "trente-et-un", "31" }, 1348b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "un cent quatre vingt dix huit", "198" }, 1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { NULL, NULL} 1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doLenientParseTest(formatter, lpTestData); 1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* const swissFrenchTestData[][2] = { 1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "1", "un" }, 1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "15", "quinze" }, 1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "20", "vingt" }, 1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "21", "vingt-et-un" }, 1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "23", "vingt-trois" }, 1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "62", "soixante-deux" }, 1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "70", "septante" }, 1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "71", "septante-et-un" }, 1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "73", "septante-trois" }, 1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "80", "huitante" }, 1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "88", "huitante-huit" }, 1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "100", "cent" }, 137059d709d503bab6e2b61931737e662dd293b40578ccornelius { "106", "cent six" }, 137159d709d503bab6e2b61931737e662dd293b40578ccornelius { "127", "cent vingt-sept" }, 137259d709d503bab6e2b61931737e662dd293b40578ccornelius { "200", "deux cents" }, 137359d709d503bab6e2b61931737e662dd293b40578ccornelius { "579", "cinq cent septante-neuf" }, 1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "1,000", "mille" }, 137559d709d503bab6e2b61931737e662dd293b40578ccornelius { "1,123", "mille cent vingt-trois" }, 137659d709d503bab6e2b61931737e662dd293b40578ccornelius { "1,594", "mille cinq cent nonante-quatre" }, 137759d709d503bab6e2b61931737e662dd293b40578ccornelius { "2,000", "deux mille" }, 137859d709d503bab6e2b61931737e662dd293b40578ccornelius { "3,004", "trois mille quatre" }, 137959d709d503bab6e2b61931737e662dd293b40578ccornelius { "4,567", "quatre mille cinq cent soixante-sept" }, 138059d709d503bab6e2b61931737e662dd293b40578ccornelius { "15,943", "quinze mille neuf cent quarante-trois" }, 138159d709d503bab6e2b61931737e662dd293b40578ccornelius { "2,345,678", "deux millions trois cent quarante-cinq mille six cent septante-huit" }, 1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "-36", "moins trente-six" }, 138359d709d503bab6e2b61931737e662dd293b40578ccornelius { "234.567", "deux cent trente-quatre virgule cinq six sept" }, 1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { NULL, NULL} 1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestSwissFrenchSpellout() 1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedNumberFormat* formatter 1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale("fr", "CH", ""), status); 1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 13956d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "FAIL: could not construct formatter - %s", u_errorName(status)); 1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(formatter, swissFrenchTestData, TRUE); 1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1402b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const char* const belgianFrenchTestData[][2] = { 1403b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "1", "un" }, 1404b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "15", "quinze" }, 1405b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "20", "vingt" }, 1406b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "21", "vingt-et-un" }, 1407b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "23", "vingt-trois" }, 1408b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "62", "soixante-deux" }, 1409b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "70", "septante" }, 1410b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "71", "septante-et-un" }, 1411b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "73", "septante-trois" }, 1412b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "80", "quatre-vingts" }, 141359d709d503bab6e2b61931737e662dd293b40578ccornelius { "88", "quatre-vingt huit" }, 1414b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "90", "nonante" }, 1415b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "91", "nonante-et-un" }, 1416b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "95", "nonante-cinq" }, 1417b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "100", "cent" }, 141859d709d503bab6e2b61931737e662dd293b40578ccornelius { "106", "cent six" }, 141959d709d503bab6e2b61931737e662dd293b40578ccornelius { "127", "cent vingt-sept" }, 142059d709d503bab6e2b61931737e662dd293b40578ccornelius { "200", "deux cents" }, 142159d709d503bab6e2b61931737e662dd293b40578ccornelius { "579", "cinq cent septante-neuf" }, 1422b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "1,000", "mille" }, 142359d709d503bab6e2b61931737e662dd293b40578ccornelius { "1,123", "mille cent vingt-trois" }, 142459d709d503bab6e2b61931737e662dd293b40578ccornelius { "1,594", "mille cinq cent nonante-quatre" }, 142559d709d503bab6e2b61931737e662dd293b40578ccornelius { "2,000", "deux mille" }, 142659d709d503bab6e2b61931737e662dd293b40578ccornelius { "3,004", "trois mille quatre" }, 142759d709d503bab6e2b61931737e662dd293b40578ccornelius { "4,567", "quatre mille cinq cent soixante-sept" }, 142859d709d503bab6e2b61931737e662dd293b40578ccornelius { "15,943", "quinze mille neuf cent quarante-trois" }, 142959d709d503bab6e2b61931737e662dd293b40578ccornelius { "2,345,678", "deux millions trois cent quarante-cinq mille six cent septante-huit" }, 1430b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "-36", "moins trente-six" }, 143159d709d503bab6e2b61931737e662dd293b40578ccornelius { "234.567", "deux cent trente-quatre virgule cinq six sept" }, 1432b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { NULL, NULL} 1433b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}; 1434b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1435b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestBelgianFrenchSpellout() 1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedNumberFormat* formatter 1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale("fr", "BE", ""), status); 1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 14446d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "rbnf status: 0x%x (%s)\n", status, u_errorName(status)); 14456d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "FAIL: could not construct formatter - %s", u_errorName(status)); 1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Belgian french should match Swiss french. 1448b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru doTest(formatter, belgianFrenchTestData, TRUE); 1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 1454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestItalianSpellout() 1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedNumberFormat* formatter 1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale::getItalian(), status); 1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 14616d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "FAIL: could not construct formatter - %s", u_errorName(status)); 1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* const testData[][2] = { 1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "1", "uno" }, 1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "15", "quindici" }, 1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "20", "venti" }, 1467b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "23", "venti\\u00ADtr\\u00E9" }, 1468b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "73", "settanta\\u00ADtr\\u00E9" }, 1469b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "88", "ottant\\u00ADotto" }, 1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "100", "cento" }, 147154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius { "101", "cento\\u00ADuno" }, 1472b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "103", "cento\\u00ADtr\\u00E9" }, 1473b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "106", "cento\\u00ADsei" }, 1474b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "108", "cent\\u00ADotto" }, 1475b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "127", "cento\\u00ADventi\\u00ADsette" }, 1476b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "181", "cent\\u00ADottant\\u00ADuno" }, 1477b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "200", "due\\u00ADcento" }, 1478b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "579", "cinque\\u00ADcento\\u00ADsettanta\\u00ADnove" }, 1479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "1,000", "mille" }, 1480b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "2,000", "due\\u00ADmila" }, 1481b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "3,004", "tre\\u00ADmila\\u00ADquattro" }, 1482b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "4,567", "quattro\\u00ADmila\\u00ADcinque\\u00ADcento\\u00ADsessanta\\u00ADsette" }, 1483b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "15,943", "quindici\\u00ADmila\\u00ADnove\\u00ADcento\\u00ADquaranta\\u00ADtr\\u00E9" }, 1484b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "-36", "meno trenta\\u00ADsei" }, 1485b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "234.567", "due\\u00ADcento\\u00ADtrenta\\u00ADquattro virgola cinque sei sette" }, 1486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { NULL, NULL} 1487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(formatter, testData, TRUE); 1490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 1492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 1495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestPortugueseSpellout() 1496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedNumberFormat* formatter 1499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale("pt","BR",""), status); 1500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 15026d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "FAIL: could not construct formatter - %s", u_errorName(status)); 1503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* const testData[][2] = { 1505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "1", "um" }, 1506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "15", "quinze" }, 1507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "20", "vinte" }, 1508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "23", "vinte e tr\\u00EAs" }, 1509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "73", "setenta e tr\\u00EAs" }, 1510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "88", "oitenta e oito" }, 1511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "100", "cem" }, 1512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "106", "cento e seis" }, 1513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "108", "cento e oito" }, 1514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "127", "cento e vinte e sete" }, 1515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "181", "cento e oitenta e um" }, 151654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius { "200", "duzentos" }, 1517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "579", "quinhentos e setenta e nove" }, 1518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "1,000", "mil" }, 1519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "2,000", "dois mil" }, 1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "3,004", "tr\\u00EAs mil e quatro" }, 1521b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "4,567", "quatro mil e quinhentos e sessenta e sete" }, 1522b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "15,943", "quinze mil e novecentos e quarenta e tr\\u00EAs" }, 1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "-36", "menos trinta e seis" }, 152454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius { "234.567", "duzentos e trinta e quatro v\\u00EDrgula cinco seis sete" }, 1525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { NULL, NULL} 1526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(formatter, testData, TRUE); 1529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 1531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 1533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestGermanSpellout() 1534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedNumberFormat* formatter 1537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale::getGermany(), status); 1538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 15406d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "FAIL: could not construct formatter - %s", u_errorName(status)); 1541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* const testData[][2] = { 1543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "1", "eins" }, 1544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "15", "f\\u00fcnfzehn" }, 1545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "20", "zwanzig" }, 1546b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "23", "drei\\u00ADund\\u00ADzwanzig" }, 1547b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "73", "drei\\u00ADund\\u00ADsiebzig" }, 1548b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "88", "acht\\u00ADund\\u00ADachtzig" }, 1549b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "100", "ein\\u00ADhundert" }, 1550b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "106", "ein\\u00ADhundert\\u00ADsechs" }, 1551b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "127", "ein\\u00ADhundert\\u00ADsieben\\u00ADund\\u00ADzwanzig" }, 1552b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "200", "zwei\\u00ADhundert" }, 1553b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "579", "f\\u00fcnf\\u00ADhundert\\u00ADneun\\u00ADund\\u00ADsiebzig" }, 1554b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "1,000", "ein\\u00ADtausend" }, 1555b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "2,000", "zwei\\u00ADtausend" }, 1556b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "3,004", "drei\\u00ADtausend\\u00ADvier" }, 1557b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "4,567", "vier\\u00ADtausend\\u00ADf\\u00fcnf\\u00ADhundert\\u00ADsieben\\u00ADund\\u00ADsechzig" }, 1558b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "15,943", "f\\u00fcnfzehn\\u00ADtausend\\u00ADneun\\u00ADhundert\\u00ADdrei\\u00ADund\\u00ADvierzig" }, 1559b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "2,345,678", "zwei Millionen drei\\u00ADhundert\\u00ADf\\u00fcnf\\u00ADund\\u00ADvierzig\\u00ADtausend\\u00ADsechs\\u00ADhundert\\u00ADacht\\u00ADund\\u00ADsiebzig" }, 1560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { NULL, NULL} 1561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(formatter, testData, TRUE); 1564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION 1566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter->setLenient(TRUE); 1567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* lpTestData[][2] = { 1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "ein Tausend sechs Hundert fuenfunddreissig", "1,635" }, 1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { NULL, NULL} 1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doLenientParseTest(formatter, lpTestData); 1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestThaiSpellout() 1579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedNumberFormat* formatter 1582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale("th"), status); 1583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 15856d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "FAIL: could not construct formatter - %s", u_errorName(status)); 1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* const testData[][2] = { 1588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "0", "\\u0e28\\u0e39\\u0e19\\u0e22\\u0e4c" }, 1589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "1", "\\u0e2b\\u0e19\\u0e36\\u0e48\\u0e07" }, 1590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "10", "\\u0e2a\\u0e34\\u0e1a" }, 1591b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "11", "\\u0e2a\\u0e34\\u0e1a\\u200b\\u0e40\\u0e2d\\u0e47\\u0e14" }, 1592b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "21", "\\u0e22\\u0e35\\u0e48\\u200b\\u0e2a\\u0e34\\u0e1a\\u200b\\u0e40\\u0e2d\\u0e47\\u0e14" }, 1593b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "101", "\\u0e2b\\u0e19\\u0e36\\u0e48\\u0e07\\u200b\\u0e23\\u0e49\\u0e2d\\u0e22\\u200b\\u0e2b\\u0e19\\u0e36\\u0e48\\u0e07" }, 1594b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "1.234", "\\u0e2b\\u0e19\\u0e36\\u0e48\\u0e07\\u200b\\u0e08\\u0e38\\u0e14\\u200b\\u0e2a\\u0e2d\\u0e07\\u0e2a\\u0e32\\u0e21\\u0e2a\\u0e35\\u0e48" }, 1595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { NULL, NULL} 1596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(formatter, testData, TRUE); 1599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 1604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestSwedishSpellout() 1605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedNumberFormat* formatter 1608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale("sv"), status); 1609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 16116d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "FAIL: could not construct formatter - %s", u_errorName(status)); 1612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* testDataDefault[][2] = { 1614b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "101", "ett\\u00adhundra\\u00adett" }, 1615b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "123", "ett\\u00adhundra\\u00adtjugo\\u00adtre" }, 161627f654740f2a26ad62a5c155af9199af9e69b889claireho { "1,001", "et\\u00adtusen ett" }, 161727f654740f2a26ad62a5c155af9199af9e69b889claireho { "1,100", "et\\u00adtusen ett\\u00adhundra" }, 161827f654740f2a26ad62a5c155af9199af9e69b889claireho { "1,101", "et\\u00adtusen ett\\u00adhundra\\u00adett" }, 161927f654740f2a26ad62a5c155af9199af9e69b889claireho { "1,234", "et\\u00adtusen tv\\u00e5\\u00adhundra\\u00adtrettio\\u00adfyra" }, 1620b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "10,001", "tio\\u00adtusen ett" }, 1621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "11,000", "elva\\u00adtusen" }, 1622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "12,000", "tolv\\u00adtusen" }, 162327f654740f2a26ad62a5c155af9199af9e69b889claireho { "20,000", "tjugo\\u00adtusen" }, 162427f654740f2a26ad62a5c155af9199af9e69b889claireho { "21,000", "tjugo\\u00adet\\u00adtusen" }, 162527f654740f2a26ad62a5c155af9199af9e69b889claireho { "21,001", "tjugo\\u00adet\\u00adtusen ett" }, 162627f654740f2a26ad62a5c155af9199af9e69b889claireho { "200,000", "tv\\u00e5\\u00adhundra\\u00adtusen" }, 162727f654740f2a26ad62a5c155af9199af9e69b889claireho { "201,000", "tv\\u00e5\\u00adhundra\\u00adet\\u00adtusen" }, 162827f654740f2a26ad62a5c155af9199af9e69b889claireho { "200,200", "tv\\u00e5\\u00adhundra\\u00adtusen tv\\u00e5\\u00adhundra" }, 1629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "2,002,000", "tv\\u00e5 miljoner tv\\u00e5\\u00adtusen" }, 163027f654740f2a26ad62a5c155af9199af9e69b889claireho { "12,345,678", "tolv miljoner tre\\u00adhundra\\u00adfyrtio\\u00adfem\\u00adtusen sex\\u00adhundra\\u00adsjuttio\\u00ad\\u00e5tta" }, 163127f654740f2a26ad62a5c155af9199af9e69b889claireho { "123,456.789", "ett\\u00adhundra\\u00adtjugo\\u00adtre\\u00adtusen fyra\\u00adhundra\\u00adfemtio\\u00adsex komma sju \\u00e5tta nio" }, 1632b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "-12,345.678", "minus tolv\\u00adtusen tre\\u00adhundra\\u00adfyrtio\\u00adfem komma sex sju \\u00e5tta" }, 1633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { NULL, NULL } 1634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(formatter, testDataDefault, TRUE); 1636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1637b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru static const char* testDataNeutrum[][2] = { 163854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius { "101", "ett\\u00adhundra\\u00adett" }, 163954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius { "1,001", "et\\u00adtusen ett" }, 164054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius { "1,101", "et\\u00adtusen ett\\u00adhundra\\u00adett" }, 164154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius { "10,001", "tio\\u00adtusen ett" }, 164254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius { "21,001", "tjugo\\u00adet\\u00adtusen ett" }, 1643b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { NULL, NULL } 1644b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }; 1645b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 164654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius formatter->setDefaultRuleSet("%spellout-cardinal-neuter", status); 1647b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_SUCCESS(status)) { 164854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius logln(" testing spellout-cardinal-neuter rules"); 1649b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru doTest(formatter, testDataNeutrum, TRUE); 1650b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1651b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru else { 165254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius errln("Can't test spellout-cardinal-neuter rules"); 1653b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* testDataYear[][2] = { 1656b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "101", "ett\\u00adhundra\\u00adett" }, 1657b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "900", "nio\\u00adhundra" }, 165827f654740f2a26ad62a5c155af9199af9e69b889claireho { "1,001", "et\\u00adtusen ett" }, 1659b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "1,100", "elva\\u00adhundra" }, 1660b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "1,101", "elva\\u00adhundra\\u00adett" }, 1661b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "1,234", "tolv\\u00adhundra\\u00adtrettio\\u00adfyra" }, 1662b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "2,001", "tjugo\\u00adhundra\\u00adett" }, 1663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "10,001", "tio\\u00adtusen ett" }, 1664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { NULL, NULL } 1665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 166754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius status = U_ZERO_ERROR; 1668b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru formatter->setDefaultRuleSet("%spellout-numbering-year", status); 1669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(status)) { 1670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("testing year rules"); 1671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(formatter, testDataYear, TRUE); 1672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 1674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Can't test year rules"); 1675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 1679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 1682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestSmallValues() 1683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedNumberFormat* formatter 1686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale("en_US"), status); 1687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 16896d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "FAIL: could not construct formatter - %s", u_errorName(status)); 1690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* const testDataDefault[][2] = { 1692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "0.001", "zero point zero zero one" }, 1693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "0.0001", "zero point zero zero zero one" }, 1694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "0.00001", "zero point zero zero zero zero one" }, 1695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "0.000001", "zero point zero zero zero zero zero one" }, 1696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "0.0000001", "zero point zero zero zero zero zero zero one" }, 1697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "0.00000001", "zero point zero zero zero zero zero zero zero one" }, 1698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "0.000000001", "zero point zero zero zero zero zero zero zero zero one" }, 1699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "0.0000000001", "zero point zero zero zero zero zero zero zero zero zero one" }, 1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "0.00000000001", "zero point zero zero zero zero zero zero zero zero zero zero one" }, 1701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "0.000000000001", "zero point zero zero zero zero zero zero zero zero zero zero zero one" }, 1702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "0.0000000000001", "zero point zero zero zero zero zero zero zero zero zero zero zero zero one" }, 1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "0.00000000000001", "zero point zero zero zero zero zero zero zero zero zero zero zero zero zero one" }, 1704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "0.000000000000001", "zero point zero zero zero zero zero zero zero zero zero zero zero zero zero zero one" }, 1705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "10,000,000.001", "ten million point zero zero one" }, 1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "10,000,000.0001", "ten million point zero zero zero one" }, 1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "10,000,000.00001", "ten million point zero zero zero zero one" }, 1708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "10,000,000.000001", "ten million point zero zero zero zero zero one" }, 1709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "10,000,000.0000001", "ten million point zero zero zero zero zero zero one" }, 1710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// { "10,000,000.00000001", "ten million point zero zero zero zero zero zero zero one" }, 1711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// { "10,000,000.000000002", "ten million point zero zero zero zero zero zero zero zero two" }, 1712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "10,000,000", "ten million" }, 1713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// { "1,234,567,890.0987654", "one billion, two hundred and thirty-four million, five hundred and sixty-seven thousand, eight hundred and ninety point zero nine eight seven six five four" }, 1714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// { "123,456,789.9876543", "one hundred and twenty-three million, four hundred and fifty-six thousand, seven hundred and eighty-nine point nine eight seven six five four three" }, 1715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// { "12,345,678.87654321", "twelve million, three hundred and forty-five thousand, six hundred and seventy-eight point eight seven six five four three two one" }, 1716b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "1,234,567.7654321", "one million two hundred thirty-four thousand five hundred sixty-seven point seven six five four three two one" }, 1717b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "123,456.654321", "one hundred twenty-three thousand four hundred fifty-six point six five four three two one" }, 1718b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "12,345.54321", "twelve thousand three hundred forty-five point five four three two one" }, 1719b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "1,234.4321", "one thousand two hundred thirty-four point four three two one" }, 1720b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { "123.321", "one hundred twenty-three point three two one" }, 1721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "0.0000000011754944", "zero point zero zero zero zero zero zero zero zero one one seven five four nine four four" }, 1722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "0.000001175494351", "zero point zero zero zero zero zero one one seven five four nine four three five one" }, 1723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { NULL, NULL } 1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(formatter, testDataDefault, TRUE); 1727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 1729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 1733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestLocalizations(void) 1734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i; 1736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rules("%main:0:no;1:some;100:a lot;1000:tons;\n" 1737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "%other:0:nada;1:yah, some;100:plenty;1000:more'n you'll ever need"); 1738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError perror; 1741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedNumberFormat formatter(rules, perror, status); 1742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 17436d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "FAIL: could not construct formatter - %s", u_errorName(status)); 1744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* const testData[][2] = { 1747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "0", "nada" }, 1748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "5", "yah, some" }, 1749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "423", "plenty" }, 1750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "12345", "more'n you'll ever need" }, 1751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { NULL, NULL } 1752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(&formatter, testData, FALSE); 1754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString loc("<<%main, %other>,<en, Main, Other>,<fr, leMain, leOther>,<de, 'das Main', 'etwas anderes'>>"); 1758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* const testData[][2] = { 1759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "0", "no" }, 1760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "5", "some" }, 1761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "423", "a lot" }, 1762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { "12345", "tons" }, 1763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { NULL, NULL } 1764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedNumberFormat formatter0(rules, loc, perror, status); 1766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 1767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("failed to build second formatter"); 1768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru doTest(&formatter0, testData, FALSE); 1770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // exercise localization info 1773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale locale0("en__VALLEY@turkey=gobblegobble"); 1774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale locale1("de_DE_FOO"); 1775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale locale2("ja_JP"); 1776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString name = formatter0.getRuleSetName(0); 1777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ( formatter0.getRuleSetDisplayName(0, locale0) == "Main" 1778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru && formatter0.getRuleSetDisplayName(0, locale1) == "das Main" 1779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru && formatter0.getRuleSetDisplayName(0, locale2) == "%main" 1780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru && formatter0.getRuleSetDisplayName(name, locale0) == "Main" 1781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru && formatter0.getRuleSetDisplayName(name, locale1) == "das Main" 1782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru && formatter0.getRuleSetDisplayName(name, locale2) == "%main"){ 1783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("getRuleSetDisplayName tested"); 1784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else { 1785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("failed to getRuleSetDisplayName"); 1786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < formatter0.getNumberOfRuleSetDisplayNameLocales(); ++i) { 1790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale locale = formatter0.getRuleSetDisplayNameLocale(i, status); 1791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(status)) { 1792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int j = 0; j < formatter0.getNumberOfRuleSetNames(); ++j) { 1793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString name = formatter0.getRuleSetName(j); 1794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString lname = formatter0.getRuleSetDisplayName(j, locale); 1795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString msg = locale.getName(); 1796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg.append(": "); 1797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg.append(name); 1798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg.append(" = "); 1799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg.append(lname); 1800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(msg); 1801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* goodLocs[] = { 1809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "", // zero-length ok, same as providing no localization data 1810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<<>>", // no public rule sets ok 1811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<<%main>>", // no localizations ok 1812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<<%main,>,<en, Main,>>", // comma before close angle ok 1813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<<%main>,<en, ',<>\" '>>", // quotes everything until next quote 1814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<<%main>,<'en', \"it's ok\">>", // double quotes work too 1815b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho " \n <\n <\n %main\n >\n , \t <\t en\t , \tfoo \t\t > \n\n > \n ", // Pattern_White_Space ok 1816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 18178de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert int32_t goodLocsLen = UPRV_LENGTHOF(goodLocs); 1818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* badLocs[] = { 1820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " ", // non-zero length 1821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<>", // empty array 1822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<", // unclosed outer array 1823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<<", // unclosed inner array 1824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<<,>>", // unexpected comma 1825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<<''>>", // empty string 1826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " x<<%main>>", // first non space char not open angle bracket 1827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<%main>", // missing inner array 1828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<<%main %other>>", // elements missing separating commma (spaces must be quoted) 1829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<<%main><en, Main>>", // arrays missing separating comma 1830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<<%main>,<en, main, foo>>", // too many elements in locale data 1831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<<%main>,<en>>", // too few elements in locale data 1832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<<<%main>>>", // unexpected open angle 1833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<<%main<>>>", // unexpected open angle 1834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<<%main, %other>,<en,,>>", // implicit empty strings 1835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<<%main>,<en,''>>", // empty string 1836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<<%main>, < en, '>>", // unterminated quote 1837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<<%main>, < en, \"<>>", // unterminated quote 1838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<<%main\">>", // quote in string 1839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<<%main'>>", // quote in string 1840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<<%main<>>", // open angle in string 1841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<<%main>> x", // extra non-space text at end 1842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 18448de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert int32_t badLocsLen = UPRV_LENGTHOF(badLocs); 1845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < goodLocsLen; ++i) { 1847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("[%d] '%s'", i, goodLocs[i]); 1848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString loc(goodLocs[i]); 1850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedNumberFormat fmt(rules, loc, perror, status); 1851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 1852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Failed parse of good localization string: '%s'", goodLocs[i]); 1853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < badLocsLen; ++i) { 1857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("[%d] '%s'", i, badLocs[i]); 1858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString loc(badLocs[i]); 1860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedNumberFormat fmt(rules, loc, perror, status); 1861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(status)) { 1862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Successful parse of bad localization string: '%s'", badLocs[i]); 1863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 1870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestAllLocales() 1871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1872b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const char* names[] = { 1873b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru " (spellout) ", 1874f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius " (ordinal) " 1875f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius // " (duration) " // This is English only, and it's not really supported in CLDR anymore. 1876b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru }; 1877b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru double numbers[] = {45.678, 1, 2, 10, 11, 100, 110, 200, 1000, 1111, -1111}; 1878b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1879b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t count = 0; 1880b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const Locale* locales = Locale::getAvailableLocales(count); 1881b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for (int i = 0; i < count; ++i) { 1882b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const Locale* loc = &locales[i]; 1883b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1884f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius for (int j = 0; j < 2; ++j) { 1885b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1886b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru RuleBasedNumberFormat* f = new RuleBasedNumberFormat((URBNFRuleSetTag)j, *loc, status); 1887f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 1888f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if (status == U_USING_DEFAULT_WARNING || status == U_USING_FALLBACK_WARNING) { 1889f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius // Skip it. 1890f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius delete f; 1891f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius break; 1892f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 1893b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_FAILURE(status)) { 1894b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errln(UnicodeString(loc->getName()) + names[j] 1895b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru + "ERROR could not instantiate -> " + u_errorName(status)); 1896b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru continue; 1897b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 189850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_COLLATION 18998de051c3d18a56cc126f0f44e368495a52f9148cFredrik Roubert for (unsigned int numidx = 0; numidx < UPRV_LENGTHOF(numbers); numidx++) { 1900b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru double n = numbers[numidx]; 1901b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UnicodeString str; 1902b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru f->format(n, str); 1903b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1904f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if (verbose) { 1905f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius logln(UnicodeString(loc->getName()) + names[j] 1906f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius + "success: " + n + " -> " + str); 1907f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 1908b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1909f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius // We do not validate the result in this test case, 1910f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius // because there are cases which do not round trip by design. 1911f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius Formattable num; 1912b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1913f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius // regular parse 1914f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius status = U_ZERO_ERROR; 1915f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius f->setLenient(FALSE); 1916f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius f->parse(str, num, status); 1917f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if (U_FAILURE(status)) { 1918f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius errln(UnicodeString(loc->getName()) + names[j] 1919f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius + "ERROR could not parse '" + str + "' -> " + u_errorName(status)); 1920f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 1921f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius // We only check the spellout. The behavior is undefined for numbers < 1 and fractional numbers. 1922f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if (j == 0) { 1923f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if (num.getType() == Formattable::kLong && num.getLong() != n) { 1924f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius errln(UnicodeString(loc->getName()) + names[j] 1925f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius + UnicodeString("ERROR could not roundtrip ") + n 1926f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius + UnicodeString(" -> ") + str + UnicodeString(" -> ") + num.getLong()); 1927b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1928f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius else if (num.getType() == Formattable::kDouble && (int64_t)(num.getDouble() * 1000) != (int64_t)(n*1000)) { 1929f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius // The epsilon difference is too high. 1930f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius errln(UnicodeString(loc->getName()) + names[j] 1931f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius + UnicodeString("ERROR could not roundtrip ") + n 1932f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius + UnicodeString(" -> ") + str + UnicodeString(" -> ") + num.getDouble()); 1933f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 1934f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 1935f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if (!quick && !logKnownIssue("9503") ) { 1936b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // lenient parse 1937b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru status = U_ZERO_ERROR; 1938b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru f->setLenient(TRUE); 1939b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru f->parse(str, num, status); 1940b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_FAILURE(status)) { 1941f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius errln(UnicodeString(loc->getName()) + names[j] 1942f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius + "ERROR could not parse(lenient) '" + str + "' -> " + u_errorName(status)); 1943f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 1944f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius // We only check the spellout. The behavior is undefined for numbers < 1 and fractional numbers. 1945f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if (j == 0) { 1946f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if (num.getType() == Formattable::kLong && num.getLong() != n) { 1947b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru errln(UnicodeString(loc->getName()) + names[j] 1948f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius + UnicodeString("ERROR could not roundtrip ") + n 1949f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius + UnicodeString(" -> ") + str + UnicodeString(" -> ") + num.getLong()); 1950f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 1951f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius else if (num.getType() == Formattable::kDouble && (int64_t)(num.getDouble() * 1000) != (int64_t)(n*1000)) { 1952f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius // The epsilon difference is too high. 1953f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius errln(UnicodeString(loc->getName()) + names[j] 1954f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius + UnicodeString("ERROR could not roundtrip ") + n 1955f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius + UnicodeString(" -> ") + str + UnicodeString(" -> ") + num.getDouble()); 1956b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1957b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1958b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1959b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 196050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 1961b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru delete f; 1962b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 1967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestMultiplierSubstitution(void) { 1968f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius UnicodeString rules("=#,##0=;1,000,000: <##0.###< million;"); 1969f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius UErrorCode status = U_ZERO_ERROR; 1970f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius UParseError parse_error; 1971f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius RuleBasedNumberFormat *rbnf = 1972f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius new RuleBasedNumberFormat(rules, Locale::getUS(), parse_error, status); 1973f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if (U_SUCCESS(status)) { 1974f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius UnicodeString res; 1975f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius FieldPosition pos; 1976f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius double n = 1234000.0; 1977f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius rbnf->format(n, res, pos); 1978f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius delete rbnf; 1979f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 1980f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius UnicodeString expected(UNICODE_STRING_SIMPLE("1.234 million")); 1981f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if (expected != res) { 1982f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius UnicodeString msg = "Expected: "; 1983f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius msg.append(expected); 1984f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius msg.append(" but got "); 1985f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius msg.append(res); 1986f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius errln(msg); 1987f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 1988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1991103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusvoid 1992103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusIntlTestRBNF::TestSetDecimalFormatSymbols() { 1993103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UErrorCode status = U_ZERO_ERROR; 1994103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1995103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius RuleBasedNumberFormat rbnf(URBNF_ORDINAL, Locale::getEnglish(), status); 1996103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (U_FAILURE(status)) { 1997103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius dataerrln("Unable to create RuleBasedNumberFormat - " + UnicodeString(u_errorName(status))); 1998103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return; 1999103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 2000103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 2001103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius DecimalFormatSymbols dfs(Locale::getEnglish(), status); 2002103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (U_FAILURE(status)) { 2003103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius errln("Unable to create DecimalFormatSymbols - " + UnicodeString(u_errorName(status))); 2004103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return; 2005103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 2006103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 2007103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UnicodeString expected[] = { 2008103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UnicodeString("1,001st"), 2009103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UnicodeString("1&001st") 2010103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius }; 2011103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 2012103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius double number = 1001; 2013103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 2014103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UnicodeString result; 2015103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 2016103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius rbnf.format(number, result); 2017103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (result != expected[0]) { 2018103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius errln("Format Error - Got: " + result + " Expected: " + expected[0]); 2019103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 2020103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 2021103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius result.remove(); 2022103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 2023103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* Set new symbol for testing */ 2024103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius dfs.setSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol, UnicodeString("&"), TRUE); 2025103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius rbnf.setDecimalFormatSymbols(dfs); 2026103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 2027103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius rbnf.format(number, result); 2028103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (result != expected[1]) { 2029103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius errln("Format Error - Got: " + result + " Expected: " + expected[1]); 2030103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 2031103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 2032103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 2033f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusvoid IntlTestRBNF::TestPluralRules() { 2034f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius UErrorCode status = U_ZERO_ERROR; 2035f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius UnicodeString enRules("%digits-ordinal:-x: ->>;0: =#,##0=$(ordinal,one{st}two{nd}few{rd}other{th})$;"); 2036f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius UParseError parseError; 2037f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius RuleBasedNumberFormat enFormatter(enRules, Locale::getEnglish(), parseError, status); 2038f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if (U_FAILURE(status)) { 2039f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius dataerrln("Unable to create RuleBasedNumberFormat - " + UnicodeString(u_errorName(status))); 2040f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius return; 2041f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 2042f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius const char* const enTestData[][2] = { 2043f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { "1", "1st" }, 2044f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { "2", "2nd" }, 2045f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { "3", "3rd" }, 2046f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { "4", "4th" }, 2047f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { "11", "11th" }, 2048f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { "12", "12th" }, 2049f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { "13", "13th" }, 2050f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { "14", "14th" }, 2051f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { "21", "21st" }, 2052f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { "22", "22nd" }, 2053f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { "23", "23rd" }, 2054f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { "24", "24th" }, 2055f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { NULL, NULL } 2056f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius }; 2057f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 2058f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius doTest(&enFormatter, enTestData, TRUE); 2059f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 2060f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius // This is trying to model the feminine form, but don't worry about the details too much. 2061f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius // We're trying to test the plural rules. 2062f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius UnicodeString ruRules("%spellout-numbering:" 2063f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "-x: minus >>;" 2064f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "x.x: << point >>;" 2065f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "0: zero;" 2066f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "1: one;" 2067f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "2: two;" 2068f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "3: three;" 2069f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "4: four;" 2070f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "5: five;" 2071f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "6: six;" 2072f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "7: seven;" 2073f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "8: eight;" 2074f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "9: nine;" 2075f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "10: ten;" 2076f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "11: eleven;" 2077f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "12: twelve;" 2078f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "13: thirteen;" 2079f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "14: fourteen;" 2080f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "15: fifteen;" 2081f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "16: sixteen;" 2082f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "17: seventeen;" 2083f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "18: eighteen;" 2084f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "19: nineteen;" 2085f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "20: twenty[->>];" 2086f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "30: thirty[->>];" 2087f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "40: forty[->>];" 2088f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "50: fifty[->>];" 2089f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "60: sixty[->>];" 2090f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "70: seventy[->>];" 2091f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "80: eighty[->>];" 2092f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "90: ninety[->>];" 2093f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "100: hundred[ >>];" 2094f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "200: << hundred[ >>];" 2095f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "300: << hundreds[ >>];" 2096f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "500: << hundredss[ >>];" 2097f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "1000: << $(cardinal,one{thousand}few{thousands}other{thousandss})$[ >>];" 2098f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius "1000000: << $(cardinal,one{million}few{millions}other{millionss})$[ >>];"); 2099f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius RuleBasedNumberFormat ruFormatter(ruRules, Locale("ru"), parseError, status); 2100f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius const char* const ruTestData[][2] = { 2101f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { "1", "one" }, 2102f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { "100", "hundred" }, 2103f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { "125", "hundred twenty-five" }, 2104f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { "399", "three hundreds ninety-nine" }, 2105f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { "1,000", "one thousand" }, 2106f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { "1,001", "one thousand one" }, 2107f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { "2,000", "two thousands" }, 2108f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { "2,001", "two thousands one" }, 2109f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { "2,002", "two thousands two" }, 2110f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { "3,333", "three thousands three hundreds thirty-three" }, 2111f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { "5,000", "five thousandss" }, 2112f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { "11,000", "eleven thousandss" }, 2113f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { "21,000", "twenty-one thousand" }, 2114f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { "22,000", "twenty-two thousands" }, 2115f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { "25,001", "twenty-five thousandss one" }, 2116f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { NULL, NULL } 2117f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius }; 2118f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 2119f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if (U_FAILURE(status)) { 2120f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius errln("Unable to create RuleBasedNumberFormat - " + UnicodeString(u_errorName(status))); 2121f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius return; 2122f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 2123f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius doTest(&ruFormatter, ruTestData, TRUE); 2124f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 2125f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius // Make sure there are no divide by 0 errors. 2126f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius UnicodeString result; 212764339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert RuleBasedNumberFormat(ruRules, Locale("ru"), parseError, status).format((int32_t)21000, result); 2128f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if (result.compare(UNICODE_STRING_SIMPLE("twenty-one thousand")) != 0) { 2129f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius errln("Got " + result + " for 21000"); 2130f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 2131f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 2132f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius} 2133103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 2134c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertvoid IntlTestRBNF::TestInfinityNaN() { 2135c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UErrorCode status = U_ZERO_ERROR; 2136c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UParseError parseError; 2137c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString enRules("%default:" 2138c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert "-x: minus >>;" 2139c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert "Inf: infinite;" 2140c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert "NaN: not a number;" 2141c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert "0: =#,##0=;"); 2142c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert RuleBasedNumberFormat enFormatter(enRules, Locale::getEnglish(), parseError, status); 2143c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert const char * const enTestData[][2] = { 2144c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert {"1", "1"}, 2145c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert {"\\u221E", "infinite"}, 2146c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert {"-\\u221E", "minus infinite"}, 2147c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert {"NaN", "not a number"}, 2148c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert { NULL, NULL } 2149c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert }; 2150c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if (U_FAILURE(status)) { 2151c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert dataerrln("Unable to create RuleBasedNumberFormat - " + UnicodeString(u_errorName(status))); 2152c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert return; 2153c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 2154c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 2155c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert doTest(&enFormatter, enTestData, true); 2156c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 2157c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // Test the default behavior when the rules are undefined. 2158c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString enRules2("%default:" 2159c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert "-x: ->>;" 2160c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert "0: =#,##0=;"); 2161c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert RuleBasedNumberFormat enFormatter2(enRules2, Locale::getEnglish(), parseError, status); 2162c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if (U_FAILURE(status)) { 2163c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert errln("Unable to create RuleBasedNumberFormat - " + UnicodeString(u_errorName(status))); 2164c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert return; 2165c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 2166c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert const char * const enDefaultTestData[][2] = { 2167c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert {"1", "1"}, 2168c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert {"\\u221E", "\\u221E"}, 2169c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert {"-\\u221E", "-\\u221E"}, 2170c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert {"NaN", "NaN"}, 2171c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert { NULL, NULL } 2172c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert }; 2173c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 2174c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert doTest(&enFormatter2, enDefaultTestData, true); 2175c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert} 2176c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 2177c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertvoid IntlTestRBNF::TestVariableDecimalPoint() { 2178c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UErrorCode status = U_ZERO_ERROR; 2179c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UParseError parseError; 2180c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString enRules("%spellout-numbering:" 2181c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert "-x: minus >>;" 2182c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert "x.x: << point >>;" 2183c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert "x,x: << comma >>;" 2184c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert "0.x: xpoint >>;" 2185c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert "0,x: xcomma >>;" 2186c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert "0: zero;" 2187c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert "1: one;" 2188c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert "2: two;" 2189c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert "3: three;" 2190c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert "4: four;" 2191c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert "5: five;" 2192c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert "6: six;" 2193c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert "7: seven;" 2194c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert "8: eight;" 2195c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert "9: nine;"); 2196c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert RuleBasedNumberFormat enFormatter(enRules, Locale::getEnglish(), parseError, status); 2197c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert const char * const enTestPointData[][2] = { 2198c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert {"1.1", "one point one"}, 2199c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert {"1.23", "one point two three"}, 2200c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert {"0.4", "xpoint four"}, 2201c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert { NULL, NULL } 2202c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert }; 2203c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if (U_FAILURE(status)) { 2204c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert dataerrln("Unable to create RuleBasedNumberFormat - " + UnicodeString(u_errorName(status))); 2205c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert return; 2206c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 2207c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert doTest(&enFormatter, enTestPointData, true); 2208c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 2209c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert DecimalFormatSymbols decimalFormatSymbols(Locale::getEnglish(), status); 2210c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert decimalFormatSymbols.setSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol, UNICODE_STRING_SIMPLE(",")); 2211c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert enFormatter.setDecimalFormatSymbols(decimalFormatSymbols); 2212c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert const char * const enTestCommaData[][2] = { 2213c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert {"1.1", "one comma one"}, 2214c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert {"1.23", "one comma two three"}, 2215c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert {"0.4", "xcomma four"}, 2216c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert { NULL, NULL } 2217c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert }; 2218c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert doTest(&enFormatter, enTestCommaData, true); 2219c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert} 2220c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 2221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 2222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::doTest(RuleBasedNumberFormat* formatter, const char* const testData[][2], UBool testParsing) 2223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 2224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // man, error reporting would be easier with printf-style syntax for unicode string and formattable 2225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormatSymbols dfs("en", status); 2228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // NumberFormat* decFmt = NumberFormat::createInstance(Locale::getUS(), status); 2229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat decFmt("#,###.################", dfs, status); 2230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 22316d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "FAIL: could not create NumberFormat - %s", u_errorName(status)); 2232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 2233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int i = 0; testData[i][0]; ++i) { 2234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* numString = testData[i][0]; 2235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* expectedWords = testData[i][1]; 2236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log("[%i] %s = ", i, numString); 2238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Formattable expectedNumber; 2239c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString escapedNumString = UnicodeString(numString, -1, US_INV).unescape(); 2240c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert decFmt.parse(escapedNumString, expectedNumber, status); 2241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 2242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: decFmt could not parse %s", numString); 2243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 2244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 2245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString actualString; 2246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition pos; 2247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter->format(expectedNumber, actualString/* , pos*/, status); 2248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 2249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString msg = "Fail: formatter could not format "; 2250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru decFmt.format(expectedNumber, msg, status); 2251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(msg); 2252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 2253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 2254c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString expectedString = UnicodeString(expectedWords, -1, US_INV).unescape(); 2255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (actualString != expectedString) { 2256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString msg = "FAIL: check failed for "; 2257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru decFmt.format(expectedNumber, msg, status); 2258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg.append(", expected "); 2259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg.append(expectedString); 2260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg.append(" but got "); 2261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg.append(actualString); 2262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(msg); 2263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 2264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 2265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(actualString); 2266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (testParsing) { 2267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Formattable parsedNumber; 2268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter->parse(actualString, parsedNumber, status); 2269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 2270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString msg = "FAIL: formatter could not parse "; 2271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg.append(actualString); 2272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg.append(" status code: " ); 2273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg.append(u_errorName(status)); 2274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(msg); 2275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 2276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 2277c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if (parsedNumber != expectedNumber 2278c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert && (!uprv_isNaN(parsedNumber.getDouble()) || !uprv_isNaN(expectedNumber.getDouble()))) 2279c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert { 2280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString msg = "FAIL: parse failed for "; 2281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg.append(actualString); 2282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg.append(", expected "); 2283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru decFmt.format(expectedNumber, msg, status); 2284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg.append(", but got "); 2285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru decFmt.format(parsedNumber, msg, status); 2286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(msg); 2287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 2288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 2299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::doLenientParseTest(RuleBasedNumberFormat* formatter, const char* testData[][2]) 2300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 2301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat* decFmt = NumberFormat::createInstance(Locale::getUS(), status); 2303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 23046d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "FAIL: could not create NumberFormat - %s", u_errorName(status)); 2305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 2306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int i = 0; testData[i][0]; ++i) { 2307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* spelledNumber = testData[i][0]; // spelled-out number 2308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* asciiUSNumber = testData[i][1]; // number as ascii digits formatted for US locale 2309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString spelledNumberString = UnicodeString(spelledNumber).unescape(); 2311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Formattable actualNumber; 2312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter->parse(spelledNumberString, actualNumber, status); 2313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 2314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString msg = "FAIL: formatter could not parse "; 2315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg.append(spelledNumberString); 2316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(msg); 2317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 2318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 2319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // I changed the logic of this test somewhat from Java-- instead of comparing the 2320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // strings, I compare the Formattables. Hmmm, but the Formattables don't compare, 2321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // so change it back. 2322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString asciiUSNumberString = asciiUSNumber; 2324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Formattable expectedNumber; 2325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru decFmt->parse(asciiUSNumberString, expectedNumber, status); 2326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 2327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString msg = "FAIL: decFmt could not parse "; 2328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg.append(asciiUSNumberString); 2329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(msg); 2330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 2331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 2332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString actualNumberString; 2333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString expectedNumberString; 2334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru decFmt->format(actualNumber, actualNumberString, status); 2335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru decFmt->format(expectedNumber, expectedNumberString, status); 2336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (actualNumberString != expectedNumberString) { 2337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString msg = "FAIL: parsing"; 2338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg.append(asciiUSNumberString); 2339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg.append("\n"); 2340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg.append(" lenient parse failed for "); 2341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg.append(spelledNumberString); 2342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg.append(", expected "); 2343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg.append(expectedNumberString); 2344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg.append(", but got "); 2345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru msg.append(actualNumberString); 2346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(msg); 2347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 2348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete decFmt; 2353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* U_HAVE_RBNF */ 2357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 2358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 2360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestRBNFDisabled() { 2361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("*** RBNF currently disabled on this platform ***\n"); 2362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* U_HAVE_RBNF */ 2365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 2366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */ 2368