1   /*
2    * $Id: CurrencyValidatorTest.java 387398 2006-03-21 04:08:30Z niallp $
3    * $Revision: 387398 $
4    * $Date: 2006-03-21 04:08:30 +0000 (Tue, 21 Mar 2006) $
5    *
6    * ====================================================================
7    * Copyright 2006 The Apache Software Foundation
8    *
9    * Licensed under the Apache License, Version 2.0 (the "License");
10   * you may not use this file except in compliance with the License.
11   * You may obtain a copy of the License at
12   *
13   *     http://www.apache.org/licenses/LICENSE-2.0
14   *
15   * Unless required by applicable law or agreed to in writing, software
16   * distributed under the License is distributed on an "AS IS" BASIS,
17   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18   * See the License for the specific language governing permissions and
19   * limitations under the License.
20   */
21  package org.apache.commons.validator.routines;
22  
23  import junit.framework.TestCase;
24  
25  import java.util.Locale;
26  import java.math.BigDecimal;
27  import java.text.DecimalFormatSymbols;
28  
29  /***
30   * Test Case for CurrencyValidator.
31   * 
32   * @version $Revision: 387398 $ $Date: 2006-03-21 04:08:30 +0000 (Tue, 21 Mar 2006) $
33   */
34  public class CurrencyValidatorTest extends TestCase {
35      
36      private static final char CURRENCY_SYMBOL = '\u00A4';
37  
38      private String US_DOLLAR;
39      private String UK_POUND;
40  
41      /***
42       * Main
43       * @param args arguments
44       */
45      public static void main(String[] args) {
46          junit.textui.TestRunner.run(CurrencyValidatorTest.class);
47      }
48      
49      /***
50       * Constructor
51       * @param name test name
52       */
53      public CurrencyValidatorTest(String name) {
54          super(name);
55      }
56  
57      protected void setUp() throws Exception {
58          super.setUp();
59          US_DOLLAR = (new DecimalFormatSymbols(Locale.US)).getCurrencySymbol();
60          UK_POUND  = (new DecimalFormatSymbols(Locale.UK)).getCurrencySymbol();
61      }
62  
63      /***
64       * Tear down
65       * @throws Exception
66       */
67      protected void tearDown() throws Exception {
68          super.tearDown();
69      }
70  
71      /***
72       * Test Format Type
73       */
74      public void testFormatType() {
75          assertEquals("Format Type A", 1, CurrencyValidator.getInstance().getFormatType());
76          assertEquals("Format Type B", CurrencyValidator.CURRENCY_FORMAT, CurrencyValidator.getInstance().getFormatType());
77      }
78  
79      /***
80       * Test Valid currency values
81       */
82      public void testValid() {
83          // Set the default Locale
84          Locale origDefault = Locale.getDefault();
85          Locale.setDefault(Locale.UK);
86  
87          BigDecimalValidator validator = CurrencyValidator.getInstance();
88          BigDecimal expected   = new BigDecimal("1234.56");
89          BigDecimal negative   = new BigDecimal("-1234.56");
90          BigDecimal noDecimal  = new BigDecimal("1234.00");
91          BigDecimal oneDecimal = new BigDecimal("1234.50");
92  
93          assertEquals("Default locale", expected, validator.validate(UK_POUND + "1,234.56"));
94  
95          assertEquals("UK locale",     expected,   validator.validate(UK_POUND  + "1,234.56",   Locale.UK));
96          assertEquals("UK negative",   negative,   validator.validate("-" + UK_POUND  + "1,234.56",  Locale.UK));
97          assertEquals("UK no decimal", noDecimal,  validator.validate(UK_POUND  + "1,234",      Locale.UK));
98          assertEquals("UK 1 decimal",  oneDecimal, validator.validate(UK_POUND  + "1,234.5",    Locale.UK));
99          assertEquals("UK 3 decimal",  expected,   validator.validate(UK_POUND  + "1,234.567",  Locale.UK));
100         assertEquals("UK no symbol",  expected,   validator.validate("1,234.56",    Locale.UK));
101 
102         assertEquals("US locale",     expected,   validator.validate(US_DOLLAR + "1,234.56",   Locale.US));
103         assertEquals("US negative",   negative,   validator.validate("(" + US_DOLLAR + "1,234.56)", Locale.US));
104         assertEquals("US no decimal", noDecimal,  validator.validate(US_DOLLAR + "1,234",      Locale.US));
105         assertEquals("US 1 decimal",  oneDecimal, validator.validate(US_DOLLAR + "1,234.5",    Locale.US));
106         assertEquals("US 3 decimal",  expected,   validator.validate(US_DOLLAR + "1,234.567",  Locale.US));
107         assertEquals("US no symbol",  expected,   validator.validate("1,234.56",    Locale.US));
108 
109         // Restore the original default
110         Locale.setDefault(origDefault);
111     }
112 
113     /***
114      * Test Invalid currency values
115      */
116     public void testInvalid() {
117         BigDecimalValidator validator = CurrencyValidator.getInstance();
118 
119         // Invalid Missing
120         assertFalse("isValid() Null Value",    validator.isValid(null));
121         assertFalse("isValid() Empty Value",   validator.isValid(""));
122         assertNull("validate() Null Value",    validator.validate(null));
123         assertNull("validate() Empty Value",   validator.validate(""));
124 
125         // Invalid UK
126         assertFalse("UK wrong symbol",    validator.isValid(US_DOLLAR + "1,234.56",   Locale.UK));
127         assertFalse("UK wrong negative",  validator.isValid("(" + UK_POUND  + "1,234.56)", Locale.UK));
128 
129         // Invalid US
130         assertFalse("US wrong symbol",    validator.isValid(UK_POUND + "1,234.56",   Locale.US));
131         assertFalse("US wrong negative",  validator.isValid("-" + US_DOLLAR + "1,234.56",  Locale.US));
132     }
133 
134     /***
135      * Test Valid integer (non-decimal) currency values
136      */
137     public void testIntegerValid() {
138         // Set the default Locale
139         Locale origDefault = Locale.getDefault();
140         Locale.setDefault(Locale.UK);
141 
142         CurrencyValidator validator = new CurrencyValidator();
143         BigDecimal expected = new BigDecimal("1234.00");
144         BigDecimal negative = new BigDecimal("-1234.00");
145 
146         assertEquals("Default locale", expected, validator.validate(UK_POUND +"1,234"));
147 
148         assertEquals("UK locale",      expected, validator.validate(UK_POUND + "1,234",   Locale.UK));
149         assertEquals("UK negative",    negative, validator.validate("-" + UK_POUND + "1,234",  Locale.UK));
150 
151         assertEquals("US locale",      expected, validator.validate(US_DOLLAR + "1,234",   Locale.US));
152         assertEquals("US negative",    negative, validator.validate("(" + US_DOLLAR + "1,234)", Locale.US));
153 
154         // Restore the original default
155         Locale.setDefault(origDefault);
156     }
157 
158     /***
159      * Test Invalid integer (non decimal) currency values
160      */
161     public void testIntegerInvalid() {
162         CurrencyValidator validator = new CurrencyValidator(true, false);
163 
164         // Invalid UK - has decimals
165         assertFalse("UK positive",    validator.isValid(UK_POUND + "1,234.56",   Locale.UK));
166         assertFalse("UK negative",    validator.isValid("-" + UK_POUND + "1,234.56", Locale.UK));
167 
168         // Invalid US - has decimals
169         assertFalse("US positive",    validator.isValid(US_DOLLAR + "1,234.56",   Locale.US));
170         assertFalse("US negative",    validator.isValid("(" + US_DOLLAR + "1,234.56)",  Locale.US));
171     }
172 
173 
174     /***
175      * Test currency values with a pattern
176      */
177     public void testPattern() {
178         // Set the default Locale
179         Locale origDefault = Locale.getDefault();
180         Locale.setDefault(Locale.UK);
181 
182         BigDecimalValidator validator = CurrencyValidator.getInstance();
183         String basicPattern = CURRENCY_SYMBOL + "#,##0.000";
184         String pattern = basicPattern + ";[" + basicPattern +"]";
185         BigDecimal expected   = new BigDecimal("1234.567");
186         BigDecimal negative   = new BigDecimal("-1234.567");
187 
188         // Test Pattern
189         assertEquals("default",        expected,   validator.validate(UK_POUND + "1,234.567", pattern));
190         assertEquals("negative",       negative,   validator.validate("[" + UK_POUND + "1,234.567]", pattern));
191         assertEquals("no symbol +ve",  expected,   validator.validate("1,234.567",    pattern));
192         assertEquals("no symbol -ve",  negative,   validator.validate("[1,234.567]",  pattern));
193 
194         // Test Pattern & Locale
195         assertEquals("default",        expected,   validator.validate(US_DOLLAR + "1,234.567", pattern, Locale.US));
196         assertEquals("negative",       negative,   validator.validate("[" + US_DOLLAR + "1,234.567]", pattern, Locale.US));
197         assertEquals("no symbol +ve",  expected,   validator.validate("1,234.567",    pattern, Locale.US));
198         assertEquals("no symbol -ve",  negative,   validator.validate("[1,234.567]",  pattern, Locale.US));
199 
200         // invalid
201         assertFalse("invalid symbol",  validator.isValid(US_DOLLAR + "1,234.567", pattern));
202         assertFalse("invalid symbol",  validator.isValid(UK_POUND  + "1,234.567", pattern, Locale.US));
203 
204         // Restore the original default
205         Locale.setDefault(origDefault);
206     }
207 }