2 *******************************************************************************
\r
3 * Copyright (C) 2004-2010, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
7 package com.ibm.icu.dev.test.format;
\r
9 import java.util.Locale;
\r
11 import com.ibm.icu.dev.test.TestFmwk;
\r
12 import com.ibm.icu.text.RuleBasedNumberFormat;
\r
13 import com.ibm.icu.util.ULocale;
\r
15 public class RBNFParseTest extends TestFmwk {
\r
16 public static void main(String[] args) {
\r
17 new RBNFParseTest().run(args);
\r
20 public void TestParse() {
\r
22 // these rules make no sense but behave rationally
\r
23 String[] okrules = {
\r
51 String[] exceptrules = {
\r
65 "10:", // formatting any value with a one's digit will fail
\r
66 "11: << x", // formating a multiple of 10 causes rollback rule to fail
\r
67 "%%foo: 0 foo; 10: =%%bar=; %%bar: 0: bar; 10: =%%foo=;",
\r
70 String[][] allrules = {
\r
75 for (int j = 0; j < allrules.length; ++j) {
\r
76 String[] tests = allrules[j];
\r
77 boolean except = tests == exceptrules;
\r
78 for (int i = 0; i < tests.length; ++i) {
\r
79 logln("----------");
\r
80 logln("rules: '" + tests[i] + "'");
\r
81 boolean caughtException = false;
\r
83 RuleBasedNumberFormat fmt = new RuleBasedNumberFormat(tests[i], Locale.US);
\r
84 logln("1.23: " + fmt.format(20));
\r
85 logln("-123: " + fmt.format(-123));
\r
86 logln(".123: " + fmt.format(.123));
\r
87 logln(" 123: " + fmt.format(123));
\r
89 catch (Exception e) {
\r
91 errln("Unexpected exception: " + e.getMessage());
\r
93 caughtException = true;
\r
96 if (except && !caughtException) {
\r
97 errln("expected exception but didn't get one!");
\r
103 private void parseFormat(RuleBasedNumberFormat rbnf, String s, String target) {
\r
105 Number n = rbnf.parse(s);
\r
106 String t = rbnf.format(n);
\r
107 assertEquals(rbnf.getLocale(ULocale.ACTUAL_LOCALE) + ": " + s + " : " + n, target, t);
\r
108 } catch (java.text.ParseException e){
\r
109 fail("exception:" + e);
\r
113 private void parseList(RuleBasedNumberFormat rbnf_en, RuleBasedNumberFormat rbnf_fr, String[][] lists) {
\r
114 for (int i = 0; i < lists.length; ++i) {
\r
115 String[] list = lists[i];
\r
116 String s = list[0];
\r
117 String target_en = list[1];
\r
118 String target_fr = list[2];
\r
120 parseFormat(rbnf_en, s, target_en);
\r
121 parseFormat(rbnf_fr, s, target_fr);
\r
125 public void TestLenientParse() throws Exception {
\r
126 RuleBasedNumberFormat rbnf_en, rbnf_fr;
\r
128 // TODO: this still passes, but setLenientParseMode should have no effect now.
\r
129 // Did it ever test what it was supposed to?
\r
130 rbnf_en = new RuleBasedNumberFormat(Locale.ENGLISH, RuleBasedNumberFormat.SPELLOUT);
\r
131 rbnf_en.setLenientParseMode(true);
\r
132 rbnf_fr = new RuleBasedNumberFormat(Locale.FRENCH, RuleBasedNumberFormat.SPELLOUT);
\r
133 rbnf_fr.setLenientParseMode(true);
\r
135 Number n = rbnf_en.parse("1,2 million");
\r
136 logln(n.toString());
\r
138 String[][] lists = {
\r
139 { "1,2", "twelve", "un virgule deux" },
\r
140 { "1,2 million", "twelve million", "un virgule deux" },
\r
141 { "1,2 millions", "twelve million", "un million deux-cents-mille" },
\r
142 { "1.2", "one point two", "douze" },
\r
143 { "1.2 million", "one million two hundred thousand", "douze" },
\r
144 { "1.2 millions", "one million two hundred thousand", "douze millions" },
\r
147 Locale.setDefault(Locale.FRANCE);
\r
148 logln("Default locale:" + Locale.getDefault());
\r
149 logln("rbnf_en:" + rbnf_en.getDefaultRuleSetName());
\r
150 logln("rbnf_fr:" + rbnf_en.getDefaultRuleSetName());
\r
151 parseList(rbnf_en, rbnf_fr, lists);
\r
153 Locale.setDefault(Locale.US);
\r
154 logln("Default locale:" + Locale.getDefault());
\r
155 logln("rbnf_en:" + rbnf_en.getDefaultRuleSetName());
\r
156 logln("rbnf_fr:" + rbnf_en.getDefaultRuleSetName());
\r
157 parseList(rbnf_en, rbnf_fr, lists);
\r