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