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