1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ******************************************************************************* 350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Copyright (C) 2004-2009, International Business Machines Corporation and * 4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved. * 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ******************************************************************************* 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h" 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "itrbnfp.h" 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/umachine.h" 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/tblcoll.h" 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/coleitr.h" 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ures.h" 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h" 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/decimfmt.h" 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <string.h> 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// current macro not in icu1.8.1 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TESTCASE(id,test) \ 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case id: \ 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name = #test; \ 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (exec) { \ 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(#test "---"); \ 3050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho logln(); \ 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru test(); \ 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } \ 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlTestRBNFParse::runIndexedTest(int32_t index, UBool exec, const char* &name, char* /*par*/) 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (exec) logln("TestSuite RuleBasedNumberFormatParse"); 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (index) { 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if U_HAVE_RBNF 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(0, TestParse); 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TESTCASE(0, TestRBNFParseDisabled); 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru name = ""; 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if U_HAVE_RBNF 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNFParse::TestParse() { 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Try various rule parsing errors. Shouldn't crash. 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("RBNF Parse test starting"); 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // these rules make no sense but behave rationally 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* okrules[] = { 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "", 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "random text", 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "%foo:bar", 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "%foo: bar", 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "0:", 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "0::", 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ";", 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ";;", 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "%%foo:;", 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ":", 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "::", 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ":1", 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ":;", 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ":;:;", 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "-", 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "-1", 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "-:", 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ".", 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ".1", 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[", 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "]", 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[]", 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[foo]", 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[[]", 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[]]", 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[[]]", 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "[][]", 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<", 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<<", 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "<<<", 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "10:;9:;", 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ">", 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ">>", 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ">>>", 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "=", 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "==", 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "===", 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "=foo=", 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL, 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // these rules would throw exceptions when formatting, if we could throw exceptions 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* exceptrules[] = { 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "10:", // formatting any value with a one's digit will fail 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "11: << x", // formating a multiple of 10 causes rollback rule to fail 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "%%foo: 0 foo; 10: =%%bar=; %%bar: 0: bar; 10: =%%foo=;", 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL, 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // none of these rules should crash the formatter 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char** allrules[] = { 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru okrules, 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru exceptrules, 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL, 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int j = 0; allrules[j]; ++j) { 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char** rules = allrules[j]; 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int i = 0; rules[i]; ++i) { 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* rule = rules[i]; 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("rule[%d] \"%s\"", i, rule); 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError perr; 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RuleBasedNumberFormat* formatter = new RuleBasedNumberFormat(rule, Locale::getUS(), perr, status); 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(status)) { 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // format some values 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testfmt(formatter, 20, status); 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testfmt(formatter, 1.23, status); 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testfmt(formatter, -123, status); 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testfmt(formatter, .123, status); 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testfmt(formatter, 123, status); 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (status == U_PARSE_ERROR) { 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("perror line: %x offset: %x context: %s|%s", perr.line, perr.offset, perr.preContext, perr.postContext); 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNFParse::testfmt(RuleBasedNumberFormat* formatter, double val, UErrorCode& status) { 147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString us; 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter->format((const Formattable)val, us, status); 149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(status)) { 150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru us.insert(0, (UChar)'"'); 151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru us.append((UChar)'"'); 152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(us); 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("error: could not format %g, returned status: %d", val, status); 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNFParse::testfmt(RuleBasedNumberFormat* formatter, int val, UErrorCode& status) { 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString us; 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter->format((const Formattable)(int32_t)val, us, status); 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(status)) { 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru us.insert(0, (UChar)'"'); 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru us.append((UChar)'"'); 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(us); 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("error: could not format %d, returned status: %d", val, status); 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* U_HAVE_RBNF */ 173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlTestRBNF::TestRBNFParseDisabled() { 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("*** RBNF currently disabled on this platform ***\n"); 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* U_HAVE_RBNF */ 181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */ 184