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