001    /*
002     *  Copyright 2001-2005 Stephen Colebourne
003     *
004     *  Licensed under the Apache License, Version 2.0 (the "License");
005     *  you may not use this file except in compliance with the License.
006     *  You may obtain a copy of the License at
007     *
008     *      http://www.apache.org/licenses/LICENSE-2.0
009     *
010     *  Unless required by applicable law or agreed to in writing, software
011     *  distributed under the License is distributed on an "AS IS" BASIS,
012     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     *  See the License for the specific language governing permissions and
014     *  limitations under the License.
015     */
016    package org.joda.time;
017    
018    import junit.framework.TestCase;
019    import junit.framework.TestSuite;
020    
021    import org.joda.time.chrono.GJChronology;
022    import org.joda.time.chrono.ISOChronology;
023    import org.joda.time.chrono.JulianChronology;
024    import org.joda.time.field.FieldUtils;
025    import org.joda.time.field.SkipDateTimeField;
026    
027    /**
028     * Tests IllegalFieldValueException by triggering it from other methods.
029     *
030     * @author Brian S O'Neill
031     */
032    public class TestIllegalFieldValueException extends TestCase {
033        public static void main(String[] args) {
034            junit.textui.TestRunner.run(suite());
035        }
036    
037        public static TestSuite suite() {
038            return new TestSuite(TestIllegalFieldValueException.class);
039        }
040    
041        public TestIllegalFieldValueException(String name) {
042            super(name);
043        }
044    
045        public void testVerifyValueBounds() {
046            try {
047                FieldUtils.verifyValueBounds(ISOChronology.getInstance().monthOfYear(), -5, 1, 31);
048                fail();
049            } catch (IllegalFieldValueException e) {
050                assertEquals(DateTimeFieldType.monthOfYear(), e.getDateTimeFieldType());
051                assertEquals(null, e.getDurationFieldType());
052                assertEquals("monthOfYear", e.getFieldName());
053                assertEquals(new Integer(-5), e.getIllegalNumberValue());
054                assertEquals(null, e.getIllegalStringValue());
055                assertEquals("-5", e.getIllegalValueAsString());
056                assertEquals(new Integer(1), e.getLowerBound());
057                assertEquals(new Integer(31), e.getUpperBound());
058            }
059    
060            try {
061                FieldUtils.verifyValueBounds(DateTimeFieldType.hourOfDay(), 27, 0, 23);
062                fail();
063            } catch (IllegalFieldValueException e) {
064                assertEquals(DateTimeFieldType.hourOfDay(), e.getDateTimeFieldType());
065                assertEquals(null, e.getDurationFieldType());
066                assertEquals("hourOfDay", e.getFieldName());
067                assertEquals(new Integer(27), e.getIllegalNumberValue());
068                assertEquals(null, e.getIllegalStringValue());
069                assertEquals("27", e.getIllegalValueAsString());
070                assertEquals(new Integer(0), e.getLowerBound());
071                assertEquals(new Integer(23), e.getUpperBound());
072            }
073    
074            try {
075                FieldUtils.verifyValueBounds("foo", 1, 2, 3);
076                fail();
077            } catch (IllegalFieldValueException e) {
078                assertEquals(null, e.getDateTimeFieldType());
079                assertEquals(null, e.getDurationFieldType());
080                assertEquals("foo", e.getFieldName());
081                assertEquals(new Integer(1), e.getIllegalNumberValue());
082                assertEquals(null, e.getIllegalStringValue());
083                assertEquals("1", e.getIllegalValueAsString());
084                assertEquals(new Integer(2), e.getLowerBound());
085                assertEquals(new Integer(3), e.getUpperBound());
086            }
087        }
088    
089        public void testSkipDateTimeField() {
090            DateTimeField field = new SkipDateTimeField
091                (ISOChronology.getInstanceUTC(), ISOChronology.getInstanceUTC().year(), 1970);
092            try {
093                field.set(0, 1970);
094                fail();
095            } catch (IllegalFieldValueException e) {
096                assertEquals(DateTimeFieldType.year(), e.getDateTimeFieldType());
097                assertEquals(null, e.getDurationFieldType());
098                assertEquals("year", e.getFieldName());
099                assertEquals(new Integer(1970), e.getIllegalNumberValue());
100                assertEquals(null, e.getIllegalStringValue());
101                assertEquals("1970", e.getIllegalValueAsString());
102                assertEquals(null, e.getLowerBound());
103                assertEquals(null, e.getUpperBound());
104            }
105        }
106    
107        public void testSetText() {
108            try {
109                ISOChronology.getInstanceUTC().year().set(0, null, java.util.Locale.US);
110                fail();
111            } catch (IllegalFieldValueException e) {
112                assertEquals(DateTimeFieldType.year(), e.getDateTimeFieldType());
113                assertEquals(null, e.getDurationFieldType());
114                assertEquals("year", e.getFieldName());
115                assertEquals(null, e.getIllegalNumberValue());
116                assertEquals(null, e.getIllegalStringValue());
117                assertEquals("null", e.getIllegalValueAsString());
118                assertEquals(null, e.getLowerBound());
119                assertEquals(null, e.getUpperBound());
120            }
121    
122            try {
123                ISOChronology.getInstanceUTC().year().set(0, "nineteen seventy", java.util.Locale.US);
124                fail();
125            } catch (IllegalFieldValueException e) {
126                assertEquals(DateTimeFieldType.year(), e.getDateTimeFieldType());
127                assertEquals(null, e.getDurationFieldType());
128                assertEquals("year", e.getFieldName());
129                assertEquals(null, e.getIllegalNumberValue());
130                assertEquals("nineteen seventy", e.getIllegalStringValue());
131                assertEquals("nineteen seventy", e.getIllegalValueAsString());
132                assertEquals(null, e.getLowerBound());
133                assertEquals(null, e.getUpperBound());
134            }
135    
136            try {
137                ISOChronology.getInstanceUTC().era().set(0, "long ago", java.util.Locale.US);
138                fail();
139            } catch (IllegalFieldValueException e) {
140                assertEquals(DateTimeFieldType.era(), e.getDateTimeFieldType());
141                assertEquals(null, e.getDurationFieldType());
142                assertEquals("era", e.getFieldName());
143                assertEquals(null, e.getIllegalNumberValue());
144                assertEquals("long ago", e.getIllegalStringValue());
145                assertEquals("long ago", e.getIllegalValueAsString());
146                assertEquals(null, e.getLowerBound());
147                assertEquals(null, e.getUpperBound());
148            }
149    
150            try {
151                ISOChronology.getInstanceUTC().monthOfYear().set(0, "spring", java.util.Locale.US);
152                fail();
153            } catch (IllegalFieldValueException e) {
154                assertEquals(DateTimeFieldType.monthOfYear(), e.getDateTimeFieldType());
155                assertEquals(null, e.getDurationFieldType());
156                assertEquals("monthOfYear", e.getFieldName());
157                assertEquals(null, e.getIllegalNumberValue());
158                assertEquals("spring", e.getIllegalStringValue());
159                assertEquals("spring", e.getIllegalValueAsString());
160                assertEquals(null, e.getLowerBound());
161                assertEquals(null, e.getUpperBound());
162            }
163    
164            try {
165                ISOChronology.getInstanceUTC().dayOfWeek().set(0, "yesterday", java.util.Locale.US);
166                fail();
167            } catch (IllegalFieldValueException e) {
168                assertEquals(DateTimeFieldType.dayOfWeek(), e.getDateTimeFieldType());
169                assertEquals(null, e.getDurationFieldType());
170                assertEquals("dayOfWeek", e.getFieldName());
171                assertEquals(null, e.getIllegalNumberValue());
172                assertEquals("yesterday", e.getIllegalStringValue());
173                assertEquals("yesterday", e.getIllegalValueAsString());
174                assertEquals(null, e.getLowerBound());
175                assertEquals(null, e.getUpperBound());
176            }
177    
178            try {
179                ISOChronology.getInstanceUTC().halfdayOfDay().set(0, "morning", java.util.Locale.US);
180                fail();
181            } catch (IllegalFieldValueException e) {
182                assertEquals(DateTimeFieldType.halfdayOfDay(), e.getDateTimeFieldType());
183                assertEquals(null, e.getDurationFieldType());
184                assertEquals("halfdayOfDay", e.getFieldName());
185                assertEquals(null, e.getIllegalNumberValue());
186                assertEquals("morning", e.getIllegalStringValue());
187                assertEquals("morning", e.getIllegalValueAsString());
188                assertEquals(null, e.getLowerBound());
189                assertEquals(null, e.getUpperBound());
190            }
191        }
192    
193        public void testZoneTransition() {
194            DateTime dt = new DateTime
195                (2005, 4, 3, 1, 0, 0, 0, DateTimeZone.forID("America/Los_Angeles"));
196            try {
197                dt.hourOfDay().setCopy(2);
198                fail();
199            } catch (IllegalFieldValueException e) {
200                assertEquals(DateTimeFieldType.hourOfDay(), e.getDateTimeFieldType());
201                assertEquals(null, e.getDurationFieldType());
202                assertEquals("hourOfDay", e.getFieldName());
203                assertEquals(new Integer(2), e.getIllegalNumberValue());
204                assertEquals(null, e.getIllegalStringValue());
205                assertEquals("2", e.getIllegalValueAsString());
206                assertEquals(null, e.getLowerBound());
207                assertEquals(null, e.getUpperBound());
208            }
209        }
210    
211        public void testJulianYearZero() {
212            DateTime dt = new DateTime(JulianChronology.getInstanceUTC());
213            try {
214                dt.year().setCopy(0);
215                fail();
216            } catch (IllegalFieldValueException e) {
217                assertEquals(DateTimeFieldType.year(), e.getDateTimeFieldType());
218                assertEquals(null, e.getDurationFieldType());
219                assertEquals("year", e.getFieldName());
220                assertEquals(new Integer(0), e.getIllegalNumberValue());
221                assertEquals(null, e.getIllegalStringValue());
222                assertEquals("0", e.getIllegalValueAsString());
223                assertEquals(null, e.getLowerBound());
224                assertEquals(null, e.getUpperBound());
225            }
226        }
227    
228        public void testGJCutover() {
229            DateTime dt = new DateTime("1582-10-04", GJChronology.getInstanceUTC());
230            try {
231                dt.dayOfMonth().setCopy(5);
232                fail();
233            } catch (IllegalFieldValueException e) {
234                assertEquals(DateTimeFieldType.dayOfMonth(), e.getDateTimeFieldType());
235                assertEquals(null, e.getDurationFieldType());
236                assertEquals("dayOfMonth", e.getFieldName());
237                assertEquals(new Integer(5), e.getIllegalNumberValue());
238                assertEquals(null, e.getIllegalStringValue());
239                assertEquals("5", e.getIllegalValueAsString());
240                assertEquals(null, e.getLowerBound());
241                assertEquals(null, e.getUpperBound());
242            }
243    
244            dt = new DateTime("1582-10-15", GJChronology.getInstanceUTC());
245            try {
246                dt.dayOfMonth().setCopy(14);
247                fail();
248            } catch (IllegalFieldValueException e) {
249                assertEquals(DateTimeFieldType.dayOfMonth(), e.getDateTimeFieldType());
250                assertEquals(null, e.getDurationFieldType());
251                assertEquals("dayOfMonth", e.getFieldName());
252                assertEquals(new Integer(14), e.getIllegalNumberValue());
253                assertEquals(null, e.getIllegalStringValue());
254                assertEquals("14", e.getIllegalValueAsString());
255                assertEquals(null, e.getLowerBound());
256                assertEquals(null, e.getUpperBound());
257            }
258        }
259    
260        public void testReadablePartialValidate() {
261            try {
262                new YearMonthDay(1970, -5, 1);
263                fail();
264            } catch (IllegalFieldValueException e) {
265                assertEquals(DateTimeFieldType.monthOfYear(), e.getDateTimeFieldType());
266                assertEquals(null, e.getDurationFieldType());
267                assertEquals("monthOfYear", e.getFieldName());
268                assertEquals(new Integer(-5), e.getIllegalNumberValue());
269                assertEquals(null, e.getIllegalStringValue());
270                assertEquals("-5", e.getIllegalValueAsString());
271                assertEquals(new Integer(1), e.getLowerBound());
272                assertEquals(null, e.getUpperBound());
273            }
274    
275            try {
276                new YearMonthDay(1970, 500, 1);
277                fail();
278            } catch (IllegalFieldValueException e) {
279                assertEquals(DateTimeFieldType.monthOfYear(), e.getDateTimeFieldType());
280                assertEquals(null, e.getDurationFieldType());
281                assertEquals("monthOfYear", e.getFieldName());
282                assertEquals(new Integer(500), e.getIllegalNumberValue());
283                assertEquals(null, e.getIllegalStringValue());
284                assertEquals("500", e.getIllegalValueAsString());
285                assertEquals(null, e.getLowerBound());
286                assertEquals(new Integer(12), e.getUpperBound());
287            }
288    
289            try {
290                new YearMonthDay(1970, 2, 30);
291                fail();
292            } catch (IllegalFieldValueException e) {
293                assertEquals(DateTimeFieldType.dayOfMonth(), e.getDateTimeFieldType());
294                assertEquals(null, e.getDurationFieldType());
295                assertEquals("dayOfMonth", e.getFieldName());
296                assertEquals(new Integer(30), e.getIllegalNumberValue());
297                assertEquals(null, e.getIllegalStringValue());
298                assertEquals("30", e.getIllegalValueAsString());
299                assertEquals(null, e.getLowerBound());
300                assertEquals(new Integer(28), e.getUpperBound());
301            }
302        }
303    
304        // Test extra constructors not currently called by anything
305        public void testOtherConstructors() {
306            IllegalFieldValueException e = new IllegalFieldValueException
307                (DurationFieldType.days(), new Integer(1), new Integer(2), new Integer(3));
308            assertEquals(null, e.getDateTimeFieldType());
309            assertEquals(DurationFieldType.days(), e.getDurationFieldType());
310            assertEquals("days", e.getFieldName());
311            assertEquals(new Integer(1), e.getIllegalNumberValue());
312            assertEquals(null, e.getIllegalStringValue());
313            assertEquals("1", e.getIllegalValueAsString());
314            assertEquals(new Integer(2), e.getLowerBound());
315            assertEquals(new Integer(3), e.getUpperBound());
316    
317            e = new IllegalFieldValueException(DurationFieldType.months(), "five");
318            assertEquals(null, e.getDateTimeFieldType());
319            assertEquals(DurationFieldType.months(), e.getDurationFieldType());
320            assertEquals("months", e.getFieldName());
321            assertEquals(null, e.getIllegalNumberValue());
322            assertEquals("five", e.getIllegalStringValue());
323            assertEquals("five", e.getIllegalValueAsString());
324            assertEquals(null, e.getLowerBound());
325            assertEquals(null, e.getUpperBound());
326    
327            e = new IllegalFieldValueException("months", "five");
328            assertEquals(null, e.getDateTimeFieldType());
329            assertEquals(null, e.getDurationFieldType());
330            assertEquals("months", e.getFieldName());
331            assertEquals(null, e.getIllegalNumberValue());
332            assertEquals("five", e.getIllegalStringValue());
333            assertEquals("five", e.getIllegalValueAsString());
334            assertEquals(null, e.getLowerBound());
335            assertEquals(null, e.getUpperBound());
336        }
337    }