1   /*
2    * Copyright 2006-2010 the original author or authors.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package net.sourceforge.domian.specification;
17  
18  
19  import static org.junit.Assert.assertEquals;
20  import static org.junit.Assert.assertFalse;
21  import static org.junit.Assert.assertSame;
22  import static org.junit.Assert.assertTrue;
23  import static org.junit.Assert.fail;
24  import org.junit.Test;
25  
26  
27  public class DateStringSpecificationTest {
28  
29      final static String nullString                = null;
30      final static String emptyString               = "";
31      final static String blankString               = "   ";
32      final static String whitespaceString          = "\t\r\n";
33  
34      final static String nonNumericDateString1     = "ddMMyyyy";
35      final static String nonNumericDateString2     = "01MM2007";
36      final static String nonNumericDateString3     = "0101yyyy";
37      final static String nonNumericDateString4     = "0a0b200c";
38      final static String nonNumericDateString5     = "010b200c";
39      final static String nonNumericDateString6     = "0a012007";
40      final static String nonNumericDateString7     = "0101200c";
41      final static String nonNumericDateString8     = "0101.2007";
42      final static String tooShortDateString        = "0101200";
43      final static String tooLongDateString         = "010120000";
44      final static String highDateString1           = "32032007";
45      final static String highDateString2           = "31042007";
46      final static String highMonthString           = "01132007";
47      final static String illegalLeapYearDateString = "29022007";
48  
49      final static String okDateString              = "01012007";
50  
51  
52      @Test
53      public void shouldNotAcceptNullDatePattern() {
54          try {
55              new DateStringSpecification(nullString);
56              fail("Should have thrown exception");
57  
58          } catch (IllegalArgumentException e) {
59              String expectedMessage = "Date pattern parameter cannot be null";
60              assertEquals(expectedMessage, e.getMessage());
61          }
62      }
63  
64  
65      @Test
66      public void shouldNotAcceptEmptyDatePattern() {
67          try {
68              new DateStringSpecification(emptyString);
69              fail("Should have thrown exception");
70  
71          } catch (IllegalArgumentException e) {
72              String expectedMessage = "Date pattern parameter cannot be empty";
73              assertEquals(expectedMessage, e.getMessage());
74          }
75      }
76  
77  
78      @Test
79      public void shouldNotAcceptBlankDatePattern() {
80          try {
81              new DateStringSpecification(blankString);
82              fail("Should have thrown exception");
83  
84          } catch (IllegalArgumentException e) {
85              String expectedMessage = "Date pattern parameter cannot be blank";
86              assertEquals(expectedMessage, e.getMessage());
87          }
88      }
89  
90  
91      @Test
92      public void shouldNotAcceptIllegalDatePattern() {
93          try {
94              new DateStringSpecification("abc");
95              fail("Should have thrown exception");
96  
97          } catch (IllegalArgumentException e) {
98              String expectedMessage = "\"abc\" is not a valid date pattern";
99              assertEquals(expectedMessage, e.getMessage());
100         }
101     }
102 
103 
104     @Test
105     public void testSpecificationType() {
106         Specification<String> spec = new DateStringSpecification(okDateString);
107         assertSame(String.class, spec.getType());
108 
109         assertSame(String.class, new DateStringSpecification(okDateString).getType());
110     }
111 
112 
113     @Test
114     public void testGetDatePattern() {
115         DateStringSpecification spec = new DateStringSpecification("ddMMyyyy");
116         assertSame(String.class, spec.getType());
117         assertEquals("ddMMyyyy", spec.getValue());
118     }
119 
120 
121     @Test
122     public void testDateStringSpecification() {
123         Specification<String> spec = new DateStringSpecification("ddMMyyyy");
124 
125         assertFalse(spec.isSatisfiedBy(nullString));
126         assertFalse(spec.isSatisfiedBy(emptyString));
127         assertFalse(spec.isSatisfiedBy(blankString));
128         assertFalse(spec.isSatisfiedBy(whitespaceString));
129         assertFalse(spec.isSatisfiedBy(nonNumericDateString1));
130         assertFalse(spec.isSatisfiedBy(nonNumericDateString2));
131         assertFalse(spec.isSatisfiedBy(nonNumericDateString3));
132         assertFalse(spec.isSatisfiedBy(nonNumericDateString4));
133         assertFalse(spec.isSatisfiedBy(nonNumericDateString5));
134         assertFalse(spec.isSatisfiedBy(nonNumericDateString6));
135         assertFalse(spec.isSatisfiedBy(nonNumericDateString7));
136         assertFalse(spec.isSatisfiedBy(nonNumericDateString8));
137         assertFalse(spec.isSatisfiedBy(tooShortDateString));
138         assertFalse(spec.isSatisfiedBy(tooLongDateString));
139         assertFalse(spec.isSatisfiedBy(highDateString1));
140         assertFalse(spec.isSatisfiedBy(highDateString2));
141         assertFalse(spec.isSatisfiedBy(highMonthString));
142         assertFalse(spec.isSatisfiedBy(illegalLeapYearDateString));
143 
144         assertTrue(spec.isSatisfiedBy(okDateString));
145     }
146 
147 
148     @Test
149     public void testDateStringSpecificationWithDatePatternContainingCharacters() {
150         Specification<String> spec = new DateStringSpecification("yyyy.MM.dd");
151         assertFalse(spec.isSatisfiedBy(nullString));
152         assertFalse(spec.isSatisfiedBy(emptyString));
153         assertFalse(spec.isSatisfiedBy(blankString));
154         assertFalse(spec.isSatisfiedBy(whitespaceString));
155         assertFalse(spec.isSatisfiedBy(nonNumericDateString1));
156         assertFalse(spec.isSatisfiedBy(nonNumericDateString2));
157         assertFalse(spec.isSatisfiedBy(nonNumericDateString3));
158         assertFalse(spec.isSatisfiedBy(nonNumericDateString4));
159         assertFalse(spec.isSatisfiedBy(nonNumericDateString5));
160         assertFalse(spec.isSatisfiedBy(nonNumericDateString6));
161         assertFalse(spec.isSatisfiedBy(nonNumericDateString7));
162         assertFalse(spec.isSatisfiedBy(nonNumericDateString8));
163         assertFalse(spec.isSatisfiedBy(tooShortDateString));
164         assertFalse(spec.isSatisfiedBy(tooLongDateString));
165         assertFalse(spec.isSatisfiedBy(highDateString1));
166         assertFalse(spec.isSatisfiedBy(highDateString2));
167         assertFalse(spec.isSatisfiedBy(highMonthString));
168         assertFalse(spec.isSatisfiedBy(illegalLeapYearDateString));
169         assertTrue(spec.isSatisfiedBy("2007.10.25"));
170 
171         spec = new DateStringSpecification("yyyy-MM-dd");
172         assertTrue(spec.isSatisfiedBy("2007-10-25"));
173 
174         spec = new DateStringSpecification("yyyy/MM/dd");
175         assertTrue(spec.isSatisfiedBy("2007/10/25"));
176     }
177 
178 
179     @Test
180     public void testDateStringSpecification_YearFrom1To9() {
181         Specification<String> spec = new DateStringSpecification("y.MM.dd");
182         assertFalse(spec.isSatisfiedBy("0.10.25"));
183         assertTrue(spec.isSatisfiedBy("2.10.25"));
184     }
185 
186 
187     /* Nope, this just won't work... */
188     public void XtestDateStringSpecification_YearFrom10To99() {
189         Specification<String> spec = new DateStringSpecification("yyyy/MM/dd");
190         assertFalse(spec.isSatisfiedBy("99.10.25"));
191         assertTrue(spec.isSatisfiedBy("99/10/25")); // Just won't work
192 
193         spec = new DateStringSpecification("yy/MM/dd");
194         assertFalse(spec.isSatisfiedBy("99.10.25"));
195         assertTrue(spec.isSatisfiedBy("99/10/25")); // Just won't work
196 
197         spec = new DateStringSpecification("yy/MM/dd");
198         assertFalse(spec.isSatisfiedBy("0099.10.25"));
199         assertTrue(spec.isSatisfiedBy("0099/10/25")); // Just won't work
200     }
201 
202 
203     @Test
204     public void testDateStringSpecification_YearFrom100To999() {
205         Specification<String> spec = new DateStringSpecification("yyy.MM.dd");
206         assertTrue(spec.isSatisfiedBy("200.10.25"));
207     }
208 
209 
210     @Test
211     public void testDateStringSpecification_YearFrom10000To99999() {
212         Specification<String> spec = new DateStringSpecification("yyyyy-MM-dd");
213         assertTrue(spec.isSatisfiedBy("10000-10-25"));
214     }
215 }