• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package com.fasterxml.jackson.databind.util;
2 
3 import com.fasterxml.jackson.databind.BaseMapTest;
4 
5 import java.text.ParseException;
6 import java.text.ParsePosition;
7 import java.util.Calendar;
8 import java.util.Date;
9 import java.util.GregorianCalendar;
10 import java.util.TimeZone;
11 import java.util.concurrent.TimeUnit;
12 
13 @SuppressWarnings("deprecation")
14 public class ISO8601UtilsTest extends BaseMapTest
15 {
16     private Date date;
17     private Date dateWithoutTime;
18     private Date dateZeroMillis;
19     private Date dateZeroSecondAndMillis;
20 
21     @Override
setUp()22     public void setUp() {
23         Calendar cal = new GregorianCalendar(2007, 8 - 1, 13, 19, 51, 23);
24         cal.setTimeZone(TimeZone.getTimeZone("GMT"));
25         cal.set(Calendar.MILLISECOND, 789);
26         date = cal.getTime();
27         cal.set(Calendar.MILLISECOND, 0);
28         dateZeroMillis = cal.getTime();
29         cal.set(Calendar.SECOND, 0);
30         dateZeroSecondAndMillis = cal.getTime();
31 
32         cal = new GregorianCalendar(2007, 8 - 1, 13, 0, 0, 0);
33         cal.set(Calendar.MILLISECOND, 0);
34         cal.setTimeZone(TimeZone.getTimeZone("GMT"));
35         dateWithoutTime = cal.getTime();
36 
37     }
38 
testFormat()39     public void testFormat() {
40         String result = ISO8601Utils.format(date);
41         assertEquals("2007-08-13T19:51:23Z", result);
42     }
43 
testFormatMillis()44     public void testFormatMillis() {
45         String result = ISO8601Utils.format(date, true);
46         assertEquals("2007-08-13T19:51:23.789Z", result);
47 
48         result = ISO8601Utils.format(date, false);
49         assertEquals("2007-08-13T19:51:23Z", result);
50     }
51 
testFormatTimeZone()52     public void testFormatTimeZone() {
53         String result = ISO8601Utils.format(date, false, TimeZone.getTimeZone("GMT+02:00"));
54         assertEquals("2007-08-13T21:51:23+02:00", result);
55         result = ISO8601Utils.format(date, true, TimeZone.getTimeZone("GMT+02:00"));
56         assertEquals("2007-08-13T21:51:23.789+02:00", result);
57         result = ISO8601Utils.format(date, true, TimeZone.getTimeZone("GMT"));
58         assertEquals("2007-08-13T19:51:23.789Z", result);
59     }
60 
testParse()61     public void testParse() throws java.text.ParseException {
62         Date d = ISO8601Utils.parse("2007-08-13T19:51:23.789Z", new ParsePosition(0));
63         assertEquals(date, d);
64 
65         d = ISO8601Utils.parse("2007-08-13T19:51:23Z", new ParsePosition(0));
66         assertEquals(dateZeroMillis, d);
67 
68         d = ISO8601Utils.parse("2007-08-13T21:51:23.789+02:00", new ParsePosition(0));
69         assertEquals(date, d);
70     }
71 
testParseShortDate()72     public void testParseShortDate() throws java.text.ParseException {
73         Date d = ISO8601Utils.parse("20070813T19:51:23.789Z", new ParsePosition(0));
74         assertEquals(date, d);
75 
76         d = ISO8601Utils.parse("20070813T19:51:23Z", new ParsePosition(0));
77         assertEquals(dateZeroMillis, d);
78 
79         d = ISO8601Utils.parse("20070813T21:51:23.789+02:00", new ParsePosition(0));
80         assertEquals(date, d);
81     }
82 
testParseShortTime()83     public void testParseShortTime() throws java.text.ParseException {
84         Date d = ISO8601Utils.parse("2007-08-13T195123.789Z", new ParsePosition(0));
85         assertEquals(date, d);
86 
87         d = ISO8601Utils.parse("2007-08-13T195123Z", new ParsePosition(0));
88         assertEquals(dateZeroMillis, d);
89 
90         d = ISO8601Utils.parse("2007-08-13T215123.789+02:00", new ParsePosition(0));
91         assertEquals(date, d);
92     }
93 
testParseShortDateTime()94     public void testParseShortDateTime() throws java.text.ParseException {
95         Date d = ISO8601Utils.parse("20070813T195123.789Z", new ParsePosition(0));
96         assertEquals(date, d);
97 
98         d = ISO8601Utils.parse("20070813T195123Z", new ParsePosition(0));
99         assertEquals(dateZeroMillis, d);
100 
101         d = ISO8601Utils.parse("20070813T215123.789+02:00", new ParsePosition(0));
102         assertEquals(date, d);
103     }
104 
testParseWithoutTime()105     public void testParseWithoutTime() throws ParseException {
106         Date d = ISO8601Utils.parse("2007-08-13Z", new ParsePosition(0));
107         assertEquals(dateWithoutTime, d);
108 
109         d = ISO8601Utils.parse("20070813Z", new ParsePosition(0));
110         assertEquals(dateWithoutTime, d);
111 
112         d = ISO8601Utils.parse("2007-08-13+00:00", new ParsePosition(0));
113         assertEquals(dateWithoutTime, d);
114 
115         d = ISO8601Utils.parse("20070813+00:00", new ParsePosition(0));
116         assertEquals(dateWithoutTime, d);
117     }
118 
testParseOptional()119     public void testParseOptional() throws java.text.ParseException {
120         Date d = ISO8601Utils.parse("2007-08-13T19:51Z", new ParsePosition(0));
121         assertEquals(dateZeroSecondAndMillis, d);
122 
123         d = ISO8601Utils.parse("2007-08-13T1951Z", new ParsePosition(0));
124         assertEquals(dateZeroSecondAndMillis, d);
125 
126         d = ISO8601Utils.parse("2007-08-13T21:51+02:00", new ParsePosition(0));
127         assertEquals(dateZeroSecondAndMillis, d);
128     }
129 
testParseRfc3339Examples()130     public void testParseRfc3339Examples() throws java.text.ParseException {
131         // Two digit milliseconds.
132         Date d = ISO8601Utils.parse("1985-04-12T23:20:50.52Z", new ParsePosition(0));
133         assertEquals(newDate(1985, 4, 12, 23, 20, 50, 520, 0), d);
134 
135         d = ISO8601Utils.parse("1996-12-19T16:39:57-08:00", new ParsePosition(0));
136         assertEquals(newDate(1996, 12, 19, 16, 39, 57, 0, -8 * 60), d);
137 
138         // Truncated leap second.
139         d = ISO8601Utils.parse("1990-12-31T23:59:60Z", new ParsePosition(0));
140         assertEquals(newDate(1990, 12, 31, 23, 59, 59, 0, 0), d);
141 
142         // Truncated leap second.
143         d = ISO8601Utils.parse("1990-12-31T15:59:60-08:00", new ParsePosition(0));
144         assertEquals(newDate(1990, 12, 31, 15, 59, 59, 0, -8 * 60), d);
145 
146         // Two digit milliseconds.
147         d = ISO8601Utils.parse("1937-01-01T12:00:27.87+00:20", new ParsePosition(0));
148         assertEquals(newDate(1937, 1, 1, 12, 0, 27, 870, 20), d);
149     }
150 
testFractionalSeconds()151     public void testFractionalSeconds() throws java.text.ParseException {
152         Date d = ISO8601Utils.parse("1970-01-01T00:00:00.9Z", new ParsePosition(0));
153         assertEquals(newDate(1970, 1, 1, 0, 0, 0, 900, 0), d);
154 
155         d = ISO8601Utils.parse("1970-01-01T00:00:00.09Z", new ParsePosition(0));
156         assertEquals(newDate(1970, 1, 1, 0, 0, 0, 90, 0), d);
157 
158         d = ISO8601Utils.parse("1970-01-01T00:00:00.009Z", new ParsePosition(0));
159         assertEquals(newDate(1970, 1, 1, 0, 0, 0, 9, 0), d);
160 
161         d = ISO8601Utils.parse("1970-01-01T00:00:00.0009Z", new ParsePosition(0));
162         assertEquals(newDate(1970, 1, 1, 0, 0, 0, 0, 0), d);
163 
164         d = ISO8601Utils.parse("1970-01-01T00:00:00.2147483647Z", new ParsePosition(0));
165         assertEquals(newDate(1970, 1, 1, 0, 0, 0, 214, 0), d);
166 
167         d = ISO8601Utils.parse("1970-01-01T00:00:00.2147483648Z", new ParsePosition(0));
168         assertEquals(newDate(1970, 1, 1, 0, 0, 0, 214, 0), d);
169 
170         d = ISO8601Utils.parse("1970-01-01T00:00:00.9+02:00", new ParsePosition(0));
171         assertEquals(newDate(1970, 1, 1, 0, 0, 0, 900, 2 * 60), d);
172 
173         d = ISO8601Utils.parse("1970-01-01T00:00:00.09+02:00", new ParsePosition(0));
174         assertEquals(newDate(1970, 1, 1, 0, 0, 0, 90, 2 * 60), d);
175 
176         d = ISO8601Utils.parse("1970-01-01T00:00:00.009+02:00", new ParsePosition(0));
177         assertEquals(newDate(1970, 1, 1, 0, 0, 0, 9, 2 * 60), d);
178 
179         d = ISO8601Utils.parse("1970-01-01T00:00:00.0009+02:00", new ParsePosition(0));
180         assertEquals(newDate(1970, 1, 1, 0, 0, 0, 0, 2 * 60), d);
181 
182         d = ISO8601Utils.parse("1970-01-01T00:00:00.2147483648+02:00", new ParsePosition(0));
183         assertEquals(newDate(1970, 1, 1, 0, 0, 0, 214, 2 * 60), d);
184     }
185 
testDecimalWithoutDecimalPointButNoFractionalSeconds()186     public void testDecimalWithoutDecimalPointButNoFractionalSeconds() throws java.text.ParseException {
187         try {
188             ISO8601Utils.parse("1970-01-01T00:00:00.Z", new ParsePosition(0));
189             fail();
190         } catch (ParseException expected) {
191         }
192     }
193 
newDate(int year, int month, int day, int hour, int minute, int second, int millis, int timezoneOffsetMinutes)194     private Date newDate(int year, int month, int day, int hour,
195                          int minute, int second, int millis, int timezoneOffsetMinutes) {
196         Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
197         calendar.set(year, month - 1, day, hour, minute, second);
198         calendar.set(Calendar.MILLISECOND, millis);
199         return new Date(calendar.getTimeInMillis() - TimeUnit.MINUTES.toMillis(timezoneOffsetMinutes));
200     }
201 }
202