Index: icu46/source/test/intltest/itrbnfp.cpp |
=================================================================== |
--- icu46/source/test/intltest/itrbnfp.cpp (revision 0) |
+++ icu46/source/test/intltest/itrbnfp.cpp (revision 0) |
@@ -0,0 +1,183 @@ |
+/* |
+ ******************************************************************************* |
+ * Copyright (C) 2004-2009, International Business Machines Corporation and * |
+ * others. All Rights Reserved. * |
+ ******************************************************************************* |
+ */ |
+ |
+#include "unicode/utypes.h" |
+ |
+#if !UCONFIG_NO_FORMATTING |
+ |
+#include "itrbnfp.h" |
+ |
+#include "unicode/umachine.h" |
+ |
+#include "unicode/tblcoll.h" |
+#include "unicode/coleitr.h" |
+#include "unicode/ures.h" |
+#include "unicode/ustring.h" |
+#include "unicode/decimfmt.h" |
+ |
+#include <string.h> |
+ |
+// current macro not in icu1.8.1 |
+#define TESTCASE(id,test) \ |
+ case id: \ |
+ name = #test; \ |
+ if (exec) { \ |
+ logln(#test "---"); \ |
+ logln(); \ |
+ test(); \ |
+ } \ |
+ break |
+ |
+void IntlTestRBNFParse::runIndexedTest(int32_t index, UBool exec, const char* &name, char* /*par*/) |
+{ |
+ if (exec) logln("TestSuite RuleBasedNumberFormatParse"); |
+ switch (index) { |
+#if U_HAVE_RBNF |
+ TESTCASE(0, TestParse); |
+#else |
+ TESTCASE(0, TestRBNFParseDisabled); |
+#endif |
+ default: |
+ name = ""; |
+ break; |
+ } |
+} |
+ |
+#if U_HAVE_RBNF |
+ |
+void |
+IntlTestRBNFParse::TestParse() { |
+ // Try various rule parsing errors. Shouldn't crash. |
+ |
+ logln("RBNF Parse test starting"); |
+ |
+ // these rules make no sense but behave rationally |
+ const char* okrules[] = { |
+ "", |
+ "random text", |
+ "%foo:bar", |
+ "%foo: bar", |
+ "0:", |
+ "0::", |
+ ";", |
+ ";;", |
+ "%%foo:;", |
+ ":", |
+ "::", |
+ ":1", |
+ ":;", |
+ ":;:;", |
+ "-", |
+ "-1", |
+ "-:", |
+ ".", |
+ ".1", |
+ "[", |
+ "]", |
+ "[]", |
+ "[foo]", |
+ "[[]", |
+ "[]]", |
+ "[[]]", |
+ "[][]", |
+ "<", |
+ "<<", |
+ "<<<", |
+ "10:;9:;", |
+ ">", |
+ ">>", |
+ ">>>", |
+ "=", |
+ "==", |
+ "===", |
+ "=foo=", |
+ |
+ NULL, |
+ }; |
+ |
+ // these rules would throw exceptions when formatting, if we could throw exceptions |
+ const char* exceptrules[] = { |
+ "10:", // formatting any value with a one's digit will fail |
+ "11: << x", // formating a multiple of 10 causes rollback rule to fail |
+ "%%foo: 0 foo; 10: =%%bar=; %%bar: 0: bar; 10: =%%foo=;", |
+ |
+ NULL, |
+ }; |
+ |
+ // none of these rules should crash the formatter |
+ const char** allrules[] = { |
+ okrules, |
+ exceptrules, |
+ NULL, |
+ }; |
+ |
+ for (int j = 0; allrules[j]; ++j) { |
+ const char** rules = allrules[j]; |
+ for (int i = 0; rules[i]; ++i) { |
+ const char* rule = rules[i]; |
+ logln("rule[%d] \"%s\"", i, rule); |
+ UErrorCode status = U_ZERO_ERROR; |
+ UParseError perr; |
+ RuleBasedNumberFormat* formatter = new RuleBasedNumberFormat(rule, Locale::getUS(), perr, status); |
+ |
+ if (U_SUCCESS(status)) { |
+ // format some values |
+ |
+ testfmt(formatter, 20, status); |
+ testfmt(formatter, 1.23, status); |
+ testfmt(formatter, -123, status); |
+ testfmt(formatter, .123, status); |
+ testfmt(formatter, 123, status); |
+ |
+ } else if (status == U_PARSE_ERROR) { |
+ logln("perror line: %x offset: %x context: %s|%s", perr.line, perr.offset, perr.preContext, perr.postContext); |
+ } |
+ |
+ delete formatter; |
+ } |
+ } |
+} |
+ |
+void |
+IntlTestRBNFParse::testfmt(RuleBasedNumberFormat* formatter, double val, UErrorCode& status) { |
+ UnicodeString us; |
+ formatter->format((const Formattable)val, us, status); |
+ if (U_SUCCESS(status)) { |
+ us.insert(0, (UChar)'"'); |
+ us.append((UChar)'"'); |
+ logln(us); |
+ } else { |
+ logln("error: could not format %g, returned status: %d", val, status); |
+ } |
+} |
+ |
+void |
+IntlTestRBNFParse::testfmt(RuleBasedNumberFormat* formatter, int val, UErrorCode& status) { |
+ UnicodeString us; |
+ formatter->format((const Formattable)(int32_t)val, us, status); |
+ if (U_SUCCESS(status)) { |
+ us.insert(0, (UChar)'"'); |
+ us.append((UChar)'"'); |
+ logln(us); |
+ } else { |
+ logln("error: could not format %d, returned status: %d", val, status); |
+ } |
+} |
+ |
+ |
+/* U_HAVE_RBNF */ |
+#else |
+ |
+void |
+IntlTestRBNF::TestRBNFParseDisabled() { |
+ errln("*** RBNF currently disabled on this platform ***\n"); |
+} |
+ |
+/* U_HAVE_RBNF */ |
+#endif |
+ |
+#endif /* #if !UCONFIG_NO_FORMATTING */ |
Property changes on: icu46/source/test/intltest/itrbnfp.cpp |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |