1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.validator.routines;
18
19 import junit.framework.TestCase;
20
21 import java.util.Locale;
22 import java.math.BigDecimal;
23 import java.text.DecimalFormatSymbols;
24
25
26
27
28
29
30 public class CurrencyValidatorTest extends TestCase {
31
32 private static final char CURRENCY_SYMBOL = '\u00A4';
33
34 private String US_DOLLAR;
35 private String UK_POUND;
36
37
38
39
40
41 public CurrencyValidatorTest(String name) {
42 super(name);
43 }
44
45 @Override
46 protected void setUp() throws Exception {
47 super.setUp();
48 US_DOLLAR = (new DecimalFormatSymbols(Locale.US)).getCurrencySymbol();
49 UK_POUND = (new DecimalFormatSymbols(Locale.UK)).getCurrencySymbol();
50 }
51
52
53
54
55
56 @Override
57 protected void tearDown() throws Exception {
58 super.tearDown();
59 }
60
61
62
63
64 public void testFormatType() {
65 assertEquals("Format Type A", 1, CurrencyValidator.getInstance().getFormatType());
66 assertEquals("Format Type B", AbstractNumberValidator.CURRENCY_FORMAT, CurrencyValidator.getInstance().getFormatType());
67 }
68
69
70
71
72 public void testValid() {
73
74 Locale origDefault = Locale.getDefault();
75 Locale.setDefault(Locale.UK);
76
77 BigDecimalValidator validator = CurrencyValidator.getInstance();
78 BigDecimal expected = new BigDecimal("1234.56");
79 BigDecimal negative = new BigDecimal("-1234.56");
80 BigDecimal noDecimal = new BigDecimal("1234.00");
81 BigDecimal oneDecimal = new BigDecimal("1234.50");
82
83 assertEquals("Default locale", expected, validator.validate(UK_POUND + "1,234.56"));
84
85 assertEquals("UK locale", expected, validator.validate(UK_POUND + "1,234.56", Locale.UK));
86 assertEquals("UK negative", negative, validator.validate("-" + UK_POUND + "1,234.56", Locale.UK));
87 assertEquals("UK no decimal", noDecimal, validator.validate(UK_POUND + "1,234", Locale.UK));
88 assertEquals("UK 1 decimal", oneDecimal, validator.validate(UK_POUND + "1,234.5", Locale.UK));
89 assertEquals("UK 3 decimal", expected, validator.validate(UK_POUND + "1,234.567", Locale.UK));
90 assertEquals("UK no symbol", expected, validator.validate("1,234.56", Locale.UK));
91
92 assertEquals("US locale", expected, validator.validate(US_DOLLAR + "1,234.56", Locale.US));
93 assertEquals("US negative", negative, validator.validate("(" + US_DOLLAR + "1,234.56)", Locale.US));
94 assertEquals("US no decimal", noDecimal, validator.validate(US_DOLLAR + "1,234", Locale.US));
95 assertEquals("US 1 decimal", oneDecimal, validator.validate(US_DOLLAR + "1,234.5", Locale.US));
96 assertEquals("US 3 decimal", expected, validator.validate(US_DOLLAR + "1,234.567", Locale.US));
97 assertEquals("US no symbol", expected, validator.validate("1,234.56", Locale.US));
98
99
100 Locale.setDefault(origDefault);
101 }
102
103
104
105
106 public void testInvalid() {
107 BigDecimalValidator validator = CurrencyValidator.getInstance();
108
109
110 assertFalse("isValid() Null Value", validator.isValid(null));
111 assertFalse("isValid() Empty Value", validator.isValid(""));
112 assertNull("validate() Null Value", validator.validate(null));
113 assertNull("validate() Empty Value", validator.validate(""));
114
115
116 assertFalse("UK wrong symbol", validator.isValid(US_DOLLAR + "1,234.56", Locale.UK));
117 assertFalse("UK wrong negative", validator.isValid("(" + UK_POUND + "1,234.56)", Locale.UK));
118
119
120 assertFalse("US wrong symbol", validator.isValid(UK_POUND + "1,234.56", Locale.US));
121 assertFalse("US wrong negative", validator.isValid("-" + US_DOLLAR + "1,234.56", Locale.US));
122 }
123
124
125
126
127 public void testIntegerValid() {
128
129 Locale origDefault = Locale.getDefault();
130 Locale.setDefault(Locale.UK);
131
132 CurrencyValidator validator = new CurrencyValidator();
133 BigDecimal expected = new BigDecimal("1234.00");
134 BigDecimal negative = new BigDecimal("-1234.00");
135
136 assertEquals("Default locale", expected, validator.validate(UK_POUND +"1,234"));
137
138 assertEquals("UK locale", expected, validator.validate(UK_POUND + "1,234", Locale.UK));
139 assertEquals("UK negative", negative, validator.validate("-" + UK_POUND + "1,234", Locale.UK));
140
141 assertEquals("US locale", expected, validator.validate(US_DOLLAR + "1,234", Locale.US));
142 assertEquals("US negative", negative, validator.validate("(" + US_DOLLAR + "1,234)", Locale.US));
143
144
145 Locale.setDefault(origDefault);
146 }
147
148
149
150
151 public void testIntegerInvalid() {
152 CurrencyValidator validator = new CurrencyValidator(true, false);
153
154
155 assertFalse("UK positive", validator.isValid(UK_POUND + "1,234.56", Locale.UK));
156 assertFalse("UK negative", validator.isValid("-" + UK_POUND + "1,234.56", Locale.UK));
157
158
159 assertFalse("US positive", validator.isValid(US_DOLLAR + "1,234.56", Locale.US));
160 assertFalse("US negative", validator.isValid("(" + US_DOLLAR + "1,234.56)", Locale.US));
161 }
162
163
164
165
166
167 public void testPattern() {
168
169 Locale origDefault = Locale.getDefault();
170 Locale.setDefault(Locale.UK);
171
172 BigDecimalValidator validator = CurrencyValidator.getInstance();
173 String basicPattern = CURRENCY_SYMBOL + "#,##0.000";
174 String pattern = basicPattern + ";[" + basicPattern +"]";
175 BigDecimal expected = new BigDecimal("1234.567");
176 BigDecimal negative = new BigDecimal("-1234.567");
177
178
179 assertEquals("default", expected, validator.validate(UK_POUND + "1,234.567", pattern));
180 assertEquals("negative", negative, validator.validate("[" + UK_POUND + "1,234.567]", pattern));
181 assertEquals("no symbol +ve", expected, validator.validate("1,234.567", pattern));
182 assertEquals("no symbol -ve", negative, validator.validate("[1,234.567]", pattern));
183
184
185 assertEquals("default", expected, validator.validate(US_DOLLAR + "1,234.567", pattern, Locale.US));
186 assertEquals("negative", negative, validator.validate("[" + US_DOLLAR + "1,234.567]", pattern, Locale.US));
187 assertEquals("no symbol +ve", expected, validator.validate("1,234.567", pattern, Locale.US));
188 assertEquals("no symbol -ve", negative, validator.validate("[1,234.567]", pattern, Locale.US));
189
190
191 assertFalse("invalid symbol", validator.isValid(US_DOLLAR + "1,234.567", pattern));
192 assertFalse("invalid symbol", validator.isValid(UK_POUND + "1,234.567", pattern, Locale.US));
193
194
195 Locale.setDefault(origDefault);
196 }
197 }