]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/main/tests/core/src/com/ibm/icu/dev/test/format/RBNFParseTest.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / main / tests / core / src / com / ibm / icu / dev / test / format / RBNFParseTest.java
1 /*\r
2  *******************************************************************************\r
3  * Copyright (C) 2004-2010, International Business Machines Corporation and    *\r
4  * others. All Rights Reserved.                                                *\r
5  *******************************************************************************\r
6  */\r
7 package com.ibm.icu.dev.test.format;\r
8 \r
9 import java.util.Locale;\r
10 \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
14 \r
15 public class RBNFParseTest extends TestFmwk {\r
16     public static void main(String[] args) {\r
17         new RBNFParseTest().run(args);\r
18     }\r
19 \r
20     public void TestParse() {\r
21 \r
22         // these rules make no sense but behave rationally\r
23         String[] okrules = {\r
24             "random text",\r
25             "%foo:bar",\r
26             "%foo: bar",\r
27             "0:",\r
28             "0::",\r
29             "%%foo:;",\r
30             "-",\r
31             "-1",\r
32             "-:",\r
33             ".",\r
34             ".1",\r
35             "[",\r
36             "]",\r
37             "[]",\r
38             "[foo]",\r
39             "[[]",\r
40             "[]]",\r
41             "[[]]",\r
42             "[][]",\r
43             "<",\r
44             ">",\r
45             "=",\r
46             "==",\r
47             "===",\r
48             "=foo=",\r
49         };\r
50 \r
51         String[] exceptrules = {\r
52             "",\r
53             ";",\r
54             ";;",\r
55             ":",\r
56             "::",\r
57             ":1",\r
58             ":;",\r
59             ":;:;",\r
60             "<<",\r
61             "<<<",\r
62             "10:;9:;",\r
63             ">>",\r
64             ">>>",\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
68         };\r
69 \r
70         String[][] allrules = {\r
71             okrules,\r
72             exceptrules,\r
73         };\r
74 \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
82                 try {\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
88                 }\r
89                 catch (Exception e) {\r
90                     if (!except) {\r
91                         errln("Unexpected exception: " + e.getMessage());\r
92                     } else {\r
93                         caughtException = true;\r
94                     }\r
95                 }\r
96                 if (except && !caughtException) {\r
97                     errln("expected exception but didn't get one!");\r
98                 }\r
99             }\r
100         }\r
101     }\r
102 \r
103     private void parseFormat(RuleBasedNumberFormat rbnf, String s, String target) {\r
104         try {\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
110         }\r
111     }\r
112 \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
119 \r
120             parseFormat(rbnf_en, s, target_en);\r
121             parseFormat(rbnf_fr, s, target_fr);\r
122         }\r
123     }\r
124 \r
125     public void TestLenientParse() throws Exception {\r
126         RuleBasedNumberFormat rbnf_en, rbnf_fr;\r
127 \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
134 \r
135         Number n = rbnf_en.parse("1,2 million");\r
136         logln(n.toString());\r
137 \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
145         };\r
146 \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
152 \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
158     }\r
159 }\r