View Javadoc
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 static org.junit.jupiter.api.Assertions.assertEquals;
20  import static org.junit.jupiter.api.Assertions.assertNotNull;
21  import static org.junit.jupiter.api.Assertions.assertNull;
22  
23  import org.apache.commons.validator.routines.checkdigit.CheckDigit;
24  import org.apache.commons.validator.routines.checkdigit.EAN13CheckDigit;
25  import org.junit.jupiter.api.Test;
26  
27  /**
28   * CodeValidatorTest.java.
29   *
30   * @since 1.4
31   */
32  public class CodeValidatorTest {
33  
34      /**
35       * Test Check Digit.
36       */
37      @Test
38      public void testCheckDigit() {
39          CodeValidator validator = new CodeValidator((String) null, -1, -1, (CheckDigit) null);
40          final String invalidEAN = "9781930110992";
41          final String validEAN = "9781930110991";
42  
43          // Test no CheckDigit (i.e. null)
44          assertNull(validator.getCheckDigit(), "No CheckDigit");
45          assertEquals(invalidEAN, validator.validate(invalidEAN), "No CheckDigit invalid");
46          assertEquals(validEAN, validator.validate(validEAN), "No CheckDigit valid");
47          assertEquals(true, validator.isValid(invalidEAN), "No CheckDigit (is) invalid");
48          assertEquals(true, validator.isValid(validEAN), "No CheckDigit (is) valid");
49  
50          // Use the EAN-13 check digit routine
51          validator = new CodeValidator((String) null, -1, EAN13CheckDigit.EAN13_CHECK_DIGIT);
52  
53          assertNotNull(validator.getCheckDigit(), "EAN CheckDigit");
54          assertEquals(null, validator.validate(invalidEAN), "EAN CheckDigit invalid");
55          assertEquals(validEAN, validator.validate(validEAN), "EAN CheckDigit valid");
56          assertEquals(false, validator.isValid(invalidEAN), "EAN CheckDigit (is) invalid");
57          assertEquals(true, validator.isValid(validEAN), "EAN CheckDigit (is) valid");
58          assertEquals(null, validator.validate("978193011099X"), "EAN CheckDigit ex");
59      }
60  
61      /**
62       * Test Regular Expression.
63       */
64      @Test
65      public void testConstructors() {
66          CodeValidator validator;
67          final RegexValidator regex = new RegexValidator("^[0-9]*$");
68  
69          // Constructor 1
70          validator = new CodeValidator(regex, EAN13CheckDigit.EAN13_CHECK_DIGIT);
71          assertEquals(regex, validator.getRegexValidator(), "Constructor 1 - regex");
72          assertEquals(-1, validator.getMinLength(), "Constructor 1 - min length");
73          assertEquals(-1, validator.getMaxLength(), "Constructor 1 - max length");
74          assertEquals(EAN13CheckDigit.EAN13_CHECK_DIGIT, validator.getCheckDigit(), "Constructor 1 - check digit");
75  
76          // Constructor 2
77          validator = new CodeValidator(regex, 13, EAN13CheckDigit.EAN13_CHECK_DIGIT);
78          assertEquals(regex, validator.getRegexValidator(), "Constructor 2 - regex");
79          assertEquals(13, validator.getMinLength(), "Constructor 2 - min length");
80          assertEquals(13, validator.getMaxLength(), "Constructor 2 - max length");
81          assertEquals(EAN13CheckDigit.EAN13_CHECK_DIGIT, validator.getCheckDigit(), "Constructor 2 - check digit");
82  
83          // Constructor 3
84          validator = new CodeValidator(regex, 10, 20, EAN13CheckDigit.EAN13_CHECK_DIGIT);
85          assertEquals(regex, validator.getRegexValidator(), "Constructor 3 - regex");
86          assertEquals(10, validator.getMinLength(), "Constructor 3 - min length");
87          assertEquals(20, validator.getMaxLength(), "Constructor 3 - max length");
88          assertEquals(EAN13CheckDigit.EAN13_CHECK_DIGIT, validator.getCheckDigit(), "Constructor 3 - check digit");
89  
90          // Constructor 4
91          validator = new CodeValidator("^[0-9]*$", EAN13CheckDigit.EAN13_CHECK_DIGIT);
92          assertEquals(validator.getRegexValidator().toString(), "RegexValidator{^[0-9]*$}", "Constructor 4 - regex");
93          assertEquals(-1, validator.getMinLength(), "Constructor 4 - min length");
94          assertEquals(-1, validator.getMaxLength(), "Constructor 4 - max length");
95          assertEquals(EAN13CheckDigit.EAN13_CHECK_DIGIT, validator.getCheckDigit(), "Constructor 4 - check digit");
96  
97          // Constructor 5
98          validator = new CodeValidator("^[0-9]*$", 13, EAN13CheckDigit.EAN13_CHECK_DIGIT);
99          assertEquals(validator.getRegexValidator().toString(), "RegexValidator{^[0-9]*$}", "Constructor 5 - regex");
100         assertEquals(13, validator.getMinLength(), "Constructor 5 - min length");
101         assertEquals(13, validator.getMaxLength(), "Constructor 5 - max length");
102         assertEquals(EAN13CheckDigit.EAN13_CHECK_DIGIT, validator.getCheckDigit(), "Constructor 5 - check digit");
103 
104         // Constructor 6
105         validator = new CodeValidator("^[0-9]*$", 10, 20, EAN13CheckDigit.EAN13_CHECK_DIGIT);
106         assertEquals(validator.getRegexValidator().toString(), "RegexValidator{^[0-9]*$}", "Constructor 6 - regex");
107         assertEquals(10, validator.getMinLength(), "Constructor 6 - min length");
108         assertEquals(20, validator.getMaxLength(), "Constructor 6 - max length");
109         assertEquals(EAN13CheckDigit.EAN13_CHECK_DIGIT, validator.getCheckDigit(), "Constructor 6 - check digit");
110     }
111 
112     /**
113      * Test the minimum/maximum length
114      */
115     @Test
116     public void testLength() {
117         CodeValidator validator = new CodeValidator((String) null, -1, -1, (CheckDigit) null);
118         final String length_10 = "1234567890";
119         final String length_11 = "12345678901";
120         final String length_12 = "123456789012";
121         final String length_20 = "12345678901234567890";
122         final String length_21 = "123456789012345678901";
123         final String length_22 = "1234567890123456789012";
124 
125         assertEquals(-1, validator.getMinLength(), "No min");
126         assertEquals(-1, validator.getMaxLength(), "No max");
127 
128         assertEquals(length_10, validator.validate(length_10), "No Length 10");
129         assertEquals(length_11, validator.validate(length_11), "No Length 11");
130         assertEquals(length_12, validator.validate(length_12), "No Length 12");
131         assertEquals(length_20, validator.validate(length_20), "No Length 20");
132         assertEquals(length_21, validator.validate(length_21), "No Length 21");
133         assertEquals(length_22, validator.validate(length_22), "No Length 22");
134 
135         validator = new CodeValidator((String) null, 11, -1, (CheckDigit) null);
136         assertEquals(11, validator.getMinLength(), "Min 11 - min");
137         assertEquals(-1, validator.getMaxLength(), "Min 11 - max");
138         assertEquals(null, validator.validate(length_10), "Min 11 - 10");
139         assertEquals(length_11, validator.validate(length_11), "Min 11 - 11");
140         assertEquals(length_12, validator.validate(length_12), "Min 11 - 12");
141         assertEquals(length_20, validator.validate(length_20), "Min 11 - 20");
142         assertEquals(length_21, validator.validate(length_21), "Min 11 - 21");
143         assertEquals(length_22, validator.validate(length_22), "Min 11 - 22");
144 
145         validator = new CodeValidator((String) null, -1, 21, (CheckDigit) null);
146         assertEquals(-1, validator.getMinLength(), "Max 21 - min");
147         assertEquals(21, validator.getMaxLength(), "Max 21 - max");
148         assertEquals(length_10, validator.validate(length_10), "Max 21 - 10");
149         assertEquals(length_11, validator.validate(length_11), "Max 21 - 11");
150         assertEquals(length_12, validator.validate(length_12), "Max 21 - 12");
151         assertEquals(length_20, validator.validate(length_20), "Max 21 - 20");
152         assertEquals(length_21, validator.validate(length_21), "Max 21 - 21");
153         assertEquals(null, validator.validate(length_22), "Max 21 - 22");
154 
155         validator = new CodeValidator((String) null, 11, 21, (CheckDigit) null);
156         assertEquals(11, validator.getMinLength(), "Min 11 / Max 21 - min");
157         assertEquals(21, validator.getMaxLength(), "Min 11 / Max 21 - max");
158         assertEquals(null, validator.validate(length_10), "Min 11 / Max 21 - 10");
159         assertEquals(length_11, validator.validate(length_11), "Min 11 / Max 21 - 11");
160         assertEquals(length_12, validator.validate(length_12), "Min 11 / Max 21 - 12");
161         assertEquals(length_20, validator.validate(length_20), "Min 11 / Max 21 - 20");
162         assertEquals(length_21, validator.validate(length_21), "Min 11 / Max 21 - 21");
163         assertEquals(null, validator.validate(length_22), "Min 11 / Max 21 - 22");
164 
165         validator = new CodeValidator((String) null, 11, 11, (CheckDigit) null);
166         assertEquals(11, validator.getMinLength(), "Exact 11 - min");
167         assertEquals(11, validator.getMaxLength(), "Exact 11 - max");
168         assertEquals(null, validator.validate(length_10), "Exact 11 - 10");
169         assertEquals(length_11, validator.validate(length_11), "Exact 11 - 11");
170         assertEquals(null, validator.validate(length_12), "Exact 11 - 12");
171     }
172 
173     /**
174      * Test Regular Expression.
175      */
176     @Test
177     public void testNoInput() {
178         final CodeValidator validator = new CodeValidator((String) null, -1, -1, (CheckDigit) null);
179         assertEquals(null, validator.validate(null), "Null");
180         assertEquals(null, validator.validate(""), "Zero Length");
181         assertEquals(null, validator.validate("   "), "Spaces");
182         assertEquals(validator.validate(" A  "), "A", "Trimmed");
183     }
184 
185     /**
186      * Test Regular Expression.
187      */
188     @Test
189     public void testRegex() {
190         CodeValidator validator = new CodeValidator((String) null, -1, -1, (CheckDigit) null);
191 
192         final String value2 = "12";
193         final String value3 = "123";
194         final String value4 = "1234";
195         final String value5 = "12345";
196         final String invalid = "12a4";
197 
198         // No Regular Expression
199         assertNull(validator.getRegexValidator(), "No Regex");
200         assertEquals(value2, validator.validate(value2), "No Regex 2");
201         assertEquals(value3, validator.validate(value3), "No Regex 3");
202         assertEquals(value4, validator.validate(value4), "No Regex 4");
203         assertEquals(value5, validator.validate(value5), "No Regex 5");
204         assertEquals(invalid, validator.validate(invalid), "No Regex invalid");
205 
206         // Regular Expression
207         String regex = "^([0-9]{3,4})$";
208         validator = new CodeValidator(regex, -1, -1, (CheckDigit) null);
209         assertNotNull(validator.getRegexValidator(), "No Regex");
210         assertEquals(null, validator.validate(value2), "Regex 2");
211         assertEquals(value3, validator.validate(value3), "Regex 3");
212         assertEquals(value4, validator.validate(value4), "Regex 4");
213         assertEquals(null, validator.validate(value5), "Regex 5");
214         assertEquals(null, validator.validate(invalid), "Regex invalid");
215 
216         // Reformatted
217         regex = "^([0-9]{3})(?:[-\\s])([0-9]{3})$";
218         validator = new CodeValidator(new RegexValidator(regex), 6, (CheckDigit) null);
219         assertEquals(validator.validate("123-456"), "123456", "Reformat 123-456");
220         assertEquals(validator.validate("123 456"), "123456", "Reformat 123 456");
221         assertEquals(null, validator.validate("123456"), "Reformat 123456");
222         assertEquals(null, validator.validate("123.456"), "Reformat 123.456");
223 
224         regex = "^(?:([0-9]{3})(?:[-\\s])([0-9]{3}))|([0-9]{6})$";
225         validator = new CodeValidator(new RegexValidator(regex), 6, (CheckDigit) null);
226         assertEquals(validator.getRegexValidator().toString(), "RegexValidator{" + regex + "}", "Reformat 2 Regex");
227         assertEquals(validator.validate("123-456"), "123456", "Reformat 2 123-456");
228         assertEquals(validator.validate("123 456"), "123456", "Reformat 2 123 456");
229         assertEquals(validator.validate("123456"), "123456", "Reformat 2 123456");
230 
231     }
232 
233     @Test
234     public void testValidator294_1() {
235         CodeValidator validator = new CodeValidator((String) null, 0, -1, (CheckDigit) null);
236         assertEquals(null, validator.validate(null), "Null");
237         validator = new CodeValidator((String) null, -1, 0, (CheckDigit) null);
238         assertEquals(null, validator.validate(null), "Null");
239     }
240 
241     @Test
242     public void testValidator294_2() {
243         final CodeValidator validator = new CodeValidator((String) null, -1, 0, (CheckDigit) null);
244         assertEquals(null, validator.validate(null), "Null");
245     }
246 
247 }