60 package tck.java.time.format;
61
62 import static java.time.temporal.ChronoField.DAY_OF_MONTH;
63 import static java.time.temporal.ChronoField.DAY_OF_WEEK;
64 import static java.time.temporal.ChronoField.DAY_OF_YEAR;
65 import static java.time.temporal.ChronoField.HOUR_OF_DAY;
66 import static java.time.temporal.ChronoField.MINUTE_OF_HOUR;
67 import static java.time.temporal.ChronoField.MONTH_OF_YEAR;
68 import static java.time.temporal.ChronoField.NANO_OF_SECOND;
69 import static java.time.temporal.ChronoField.OFFSET_SECONDS;
70 import static java.time.temporal.ChronoField.SECOND_OF_MINUTE;
71 import static java.time.temporal.ChronoField.YEAR;
72 import static org.testng.Assert.assertEquals;
73 import static org.testng.Assert.assertTrue;
74 import static org.testng.Assert.fail;
75
76 import java.text.ParsePosition;
77 import java.time.DateTimeException;
78 import java.time.LocalDate;
79 import java.time.LocalDateTime;
80 import java.time.Year;
81 import java.time.YearMonth;
82 import java.time.ZoneId;
83 import java.time.ZoneOffset;
84 import java.time.ZonedDateTime;
85 import java.time.chrono.Chronology;
86 import java.time.format.DateTimeFormatter;
87 import java.time.format.DateTimeParseException;
88 import java.time.temporal.IsoFields;
89 import java.time.temporal.Queries;
90 import java.time.temporal.TemporalAccessor;
91 import java.time.temporal.TemporalField;
92 import java.time.temporal.TemporalQuery;
93 import java.util.HashMap;
94 import java.util.Iterator;
95 import java.util.Locale;
96 import java.util.Map;
97
98 import org.testng.annotations.BeforeMethod;
99 import org.testng.annotations.DataProvider;
100 import org.testng.annotations.Test;
101
102 /**
103 * Test DateTimeFormatter.
104 */
105 @Test
106 public class TCKDateTimeFormatters {
107
108 @BeforeMethod
109 public void setUp() {
110 }
111
112 //-----------------------------------------------------------------------
113 @Test(expectedExceptions=NullPointerException.class, groups={"tck"})
114 public void test_print_nullCalendrical() {
115 DateTimeFormatter.ISO_DATE.format((TemporalAccessor) null);
116 }
117
118 //-----------------------------------------------------------------------
119 //-----------------------------------------------------------------------
120 //-----------------------------------------------------------------------
121 @Test(groups={"tck"})
122 public void test_pattern_String() {
123 DateTimeFormatter test = DateTimeFormatter.ofPattern("d MMM yyyy");
124 assertEquals(test.toString(), "Value(DayOfMonth)' 'Text(MonthOfYear,SHORT)' 'Value(Year,4,19,EXCEEDS_PAD)");
125 assertEquals(test.getLocale(), Locale.getDefault());
126 }
127
128 @Test(expectedExceptions=IllegalArgumentException.class, groups={"tck"})
129 public void test_pattern_String_invalid() {
130 DateTimeFormatter.ofPattern("p");
131 }
132
133 @Test(expectedExceptions=NullPointerException.class, groups={"tck"})
134 public void test_pattern_String_null() {
135 DateTimeFormatter.ofPattern(null);
136 }
137
138 //-----------------------------------------------------------------------
139 //-----------------------------------------------------------------------
140 //-----------------------------------------------------------------------
141 @Test(groups={"tck"})
142 public void test_pattern_StringLocale() {
143 DateTimeFormatter test = DateTimeFormatter.ofPattern("d MMM yyyy", Locale.UK);
144 assertEquals(test.toString(), "Value(DayOfMonth)' 'Text(MonthOfYear,SHORT)' 'Value(Year,4,19,EXCEEDS_PAD)");
145 assertEquals(test.getLocale(), Locale.UK);
146 }
147
148 @Test(expectedExceptions=IllegalArgumentException.class, groups={"tck"})
149 public void test_pattern_StringLocale_invalid() {
150 DateTimeFormatter.ofPattern("p", Locale.UK);
151 }
152
153 @Test(expectedExceptions=NullPointerException.class, groups={"tck"})
154 public void test_pattern_StringLocale_nullPattern() {
155 DateTimeFormatter.ofPattern(null, Locale.UK);
156 }
157
158 @Test(expectedExceptions=NullPointerException.class, groups={"tck"})
159 public void test_pattern_StringLocale_nullLocale() {
160 DateTimeFormatter.ofPattern("yyyy", null);
161 }
162
163 //-----------------------------------------------------------------------
164 //-----------------------------------------------------------------------
165 //-----------------------------------------------------------------------
166 @DataProvider(name="sample_isoLocalDate")
167 Object[][] provider_sample_isoLocalDate() {
168 return new Object[][]{
169 {2008, null, null, null, null, null, DateTimeException.class},
170 {null, 6, null, null, null, null, DateTimeException.class},
171 {null, null, 30, null, null, null, DateTimeException.class},
172 {null, null, null, "+01:00", null, null, DateTimeException.class},
173 {null, null, null, null, "Europe/Paris", null, DateTimeException.class},
174 {2008, 6, null, null, null, null, DateTimeException.class},
175 {null, 6, 30, null, null, null, DateTimeException.class},
176
177 {2008, 6, 30, null, null, "2008-06-30", null},
178 {2008, 6, 30, "+01:00", null, "2008-06-30", null},
179 {2008, 6, 30, "+01:00", "Europe/Paris", "2008-06-30", null},
180 {2008, 6, 30, null, "Europe/Paris", "2008-06-30", null},
181
182 {123456, 6, 30, null, null, "+123456-06-30", null},
183 };
184 }
185
186 @Test(dataProvider="sample_isoLocalDate", groups={"tck"})
187 public void test_print_isoLocalDate(
188 Integer year, Integer month, Integer day, String offsetId, String zoneId,
189 String expected, Class<?> expectedEx) {
190 TemporalAccessor test = buildAccessor(year, month, day, null, null, null, null, offsetId, zoneId);
191 if (expectedEx == null) {
192 assertEquals(DateTimeFormatter.ISO_LOCAL_DATE.format(test), expected);
193 } else {
194 try {
195 DateTimeFormatter.ISO_LOCAL_DATE.format(test);
196 fail();
197 } catch (Exception ex) {
198 assertTrue(expectedEx.isInstance(ex));
199 }
200 }
201 }
202
203 @Test(dataProvider="sample_isoLocalDate", groups={"tck"})
204 public void test_parse_isoLocalDate(
205 Integer year, Integer month, Integer day, String offsetId, String zoneId,
206 String input, Class<?> invalid) {
207 if (input != null) {
208 Expected expected = createDate(year, month, day);
209 // offset/zone not expected to be parsed
210 assertParseMatch(DateTimeFormatter.ISO_LOCAL_DATE.parseUnresolved(input, new ParsePosition(0)), expected);
211 }
212 }
213
214 @Test(groups={"tck"})
215 public void test_parse_isoLocalDate_999999999() {
216 Expected expected = createDate(999999999, 8, 6);
217 assertParseMatch(DateTimeFormatter.ISO_LOCAL_DATE.parseUnresolved("+999999999-08-06", new ParsePosition(0)), expected);
218 assertEquals(LocalDate.parse("+999999999-08-06"), LocalDate.of(999999999, 8, 6));
219 }
220
221 @Test(groups={"tck"})
222 public void test_parse_isoLocalDate_1000000000() {
223 Expected expected = createDate(1000000000, 8, 6);
224 assertParseMatch(DateTimeFormatter.ISO_LOCAL_DATE.parseUnresolved("+1000000000-08-06", new ParsePosition(0)), expected);
225 }
226
227 @Test(expectedExceptions = DateTimeException.class, groups={"tck"})
228 public void test_parse_isoLocalDate_1000000000_failedCreate() {
229 LocalDate.parse("+1000000000-08-06");
230 }
231
232 @Test(groups={"tck"})
233 public void test_parse_isoLocalDate_M999999999() {
234 Expected expected = createDate(-999999999, 8, 6);
235 assertParseMatch(DateTimeFormatter.ISO_LOCAL_DATE.parseUnresolved("-999999999-08-06", new ParsePosition(0)), expected);
236 assertEquals(LocalDate.parse("-999999999-08-06"), LocalDate.of(-999999999, 8, 6));
237 }
238
239 @Test(groups={"tck"})
240 public void test_parse_isoLocalDate_M1000000000() {
241 Expected expected = createDate(-1000000000, 8, 6);
242 assertParseMatch(DateTimeFormatter.ISO_LOCAL_DATE.parseUnresolved("-1000000000-08-06", new ParsePosition(0)), expected);
243 }
244
245 @Test(expectedExceptions = DateTimeException.class, groups={"tck"})
246 public void test_parse_isoLocalDate_M1000000000_failedCreate() {
247 LocalDate.parse("-1000000000-08-06");
248 }
249
250 //-----------------------------------------------------------------------
251 //-----------------------------------------------------------------------
252 //-----------------------------------------------------------------------
253 @DataProvider(name="sample_isoOffsetDate")
254 Object[][] provider_sample_isoOffsetDate() {
255 return new Object[][]{
256 {2008, null, null, null, null, null, DateTimeException.class},
257 {null, 6, null, null, null, null, DateTimeException.class},
258 {null, null, 30, null, null, null, DateTimeException.class},
259 {null, null, null, "+01:00", null, null, DateTimeException.class},
260 {null, null, null, null, "Europe/Paris", null, DateTimeException.class},
261 {2008, 6, null, null, null, null, DateTimeException.class},
262 {null, 6, 30, null, null, null, DateTimeException.class},
263
264 {2008, 6, 30, null, null, null, DateTimeException.class},
265 {2008, 6, 30, "+01:00", null, "2008-06-30+01:00", null},
266 {2008, 6, 30, "+01:00", "Europe/Paris", "2008-06-30+01:00", null},
267 {2008, 6, 30, null, "Europe/Paris", null, DateTimeException.class},
268
269 {123456, 6, 30, "+01:00", null, "+123456-06-30+01:00", null},
270 };
271 }
272
273 @Test(dataProvider="sample_isoOffsetDate", groups={"tck"})
274 public void test_print_isoOffsetDate(
275 Integer year, Integer month, Integer day, String offsetId, String zoneId,
276 String expected, Class<?> expectedEx) {
277 TemporalAccessor test = buildAccessor(year, month, day, null, null, null, null, offsetId, zoneId);
278 if (expectedEx == null) {
279 assertEquals(DateTimeFormatter.ISO_OFFSET_DATE.format(test), expected);
280 } else {
281 try {
282 DateTimeFormatter.ISO_OFFSET_DATE.format(test);
283 fail();
284 } catch (Exception ex) {
285 assertTrue(expectedEx.isInstance(ex));
286 }
287 }
288 }
289
290 @Test(dataProvider="sample_isoOffsetDate", groups={"tck"})
291 public void test_parse_isoOffsetDate(
292 Integer year, Integer month, Integer day, String offsetId, String zoneId,
293 String input, Class<?> invalid) {
294 if (input != null) {
295 Expected expected = createDate(year, month, day);
296 buildCalendrical(expected, offsetId, null); // zone not expected to be parsed
297 assertParseMatch(DateTimeFormatter.ISO_OFFSET_DATE.parseUnresolved(input, new ParsePosition(0)), expected);
298 }
299 }
300
301 //-----------------------------------------------------------------------
302 //-----------------------------------------------------------------------
303 //-----------------------------------------------------------------------
304 @DataProvider(name="sample_isoDate")
305 Object[][] provider_sample_isoDate() {
306 return new Object[][]{
307 {2008, null, null, null, null, null, DateTimeException.class},
308 {null, 6, null, null, null, null, DateTimeException.class},
309 {null, null, 30, null, null, null, DateTimeException.class},
310 {null, null, null, "+01:00", null, null, DateTimeException.class},
311 {null, null, null, null, "Europe/Paris", null, DateTimeException.class},
312 {2008, 6, null, null, null, null, DateTimeException.class},
313 {null, 6, 30, null, null, null, DateTimeException.class},
314
315 {2008, 6, 30, null, null, "2008-06-30", null},
316 {2008, 6, 30, "+01:00", null, "2008-06-30+01:00", null},
317 {2008, 6, 30, "+01:00", "Europe/Paris", "2008-06-30+01:00", null},
318 {2008, 6, 30, null, "Europe/Paris", "2008-06-30", null},
319
320 {123456, 6, 30, "+01:00", "Europe/Paris", "+123456-06-30+01:00", null},
321 };
322 }
323
324 @Test(dataProvider="sample_isoDate", groups={"tck"})
325 public void test_print_isoDate(
326 Integer year, Integer month, Integer day, String offsetId, String zoneId,
327 String expected, Class<?> expectedEx) {
328 TemporalAccessor test = buildAccessor(year, month, day, null, null, null, null, offsetId, zoneId);
329 if (expectedEx == null) {
330 assertEquals(DateTimeFormatter.ISO_DATE.format(test), expected);
331 } else {
332 try {
333 DateTimeFormatter.ISO_DATE.format(test);
334 fail();
335 } catch (Exception ex) {
336 assertTrue(expectedEx.isInstance(ex));
337 }
338 }
339 }
340
341 @Test(dataProvider="sample_isoDate", groups={"tck"})
342 public void test_parse_isoDate(
343 Integer year, Integer month, Integer day, String offsetId, String zoneId,
344 String input, Class<?> invalid) {
345 if (input != null) {
346 Expected expected = createDate(year, month, day);
347 if (offsetId != null) {
348 expected.add(ZoneOffset.of(offsetId));
349 }
350 assertParseMatch(DateTimeFormatter.ISO_DATE.parseUnresolved(input, new ParsePosition(0)), expected);
351 }
352 }
353
354 //-----------------------------------------------------------------------
355 //-----------------------------------------------------------------------
356 //-----------------------------------------------------------------------
357 @DataProvider(name="sample_isoLocalTime")
358 Object[][] provider_sample_isoLocalTime() {
359 return new Object[][]{
360 {11, null, null, null, null, null, null, DateTimeException.class},
361 {null, 5, null, null, null, null, null, DateTimeException.class},
362 {null, null, 30, null, null, null, null, DateTimeException.class},
363 {null, null, null, 1, null, null, null, DateTimeException.class},
364 {null, null, null, null, "+01:00", null, null, DateTimeException.class},
365 {null, null, null, null, null, "Europe/Paris", null, DateTimeException.class},
366
367 {11, 5, null, null, null, null, "11:05", null},
368 {11, 5, 30, null, null, null, "11:05:30", null},
369 {11, 5, 30, 500000000, null, null, "11:05:30.5", null},
370 {11, 5, 30, 1, null, null, "11:05:30.000000001", null},
371
372 {11, 5, null, null, "+01:00", null, "11:05", null},
373 {11, 5, 30, null, "+01:00", null, "11:05:30", null},
374 {11, 5, 30, 500000000, "+01:00", null, "11:05:30.5", null},
375 {11, 5, 30, 1, "+01:00", null, "11:05:30.000000001", null},
376
377 {11, 5, null, null, "+01:00", "Europe/Paris", "11:05", null},
378 {11, 5, 30, null, "+01:00", "Europe/Paris", "11:05:30", null},
379 {11, 5, 30, 500000000, "+01:00", "Europe/Paris", "11:05:30.5", null},
380 {11, 5, 30, 1, "+01:00", "Europe/Paris", "11:05:30.000000001", null},
381
382 {11, 5, null, null, null, "Europe/Paris", "11:05", null},
383 {11, 5, 30, null, null, "Europe/Paris", "11:05:30", null},
384 {11, 5, 30, 500000000, null, "Europe/Paris", "11:05:30.5", null},
385 {11, 5, 30, 1, null, "Europe/Paris", "11:05:30.000000001", null},
386 };
387 }
388
389 @Test(dataProvider="sample_isoLocalTime", groups={"tck"})
390 public void test_print_isoLocalTime(
391 Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId,
392 String expected, Class<?> expectedEx) {
393 TemporalAccessor test = buildAccessor(null, null, null, hour, min, sec, nano, offsetId, zoneId);
394 if (expectedEx == null) {
395 assertEquals(DateTimeFormatter.ISO_LOCAL_TIME.format(test), expected);
396 } else {
397 try {
398 DateTimeFormatter.ISO_LOCAL_TIME.format(test);
399 fail();
400 } catch (Exception ex) {
401 assertTrue(expectedEx.isInstance(ex));
402 }
403 }
404 }
405
406 @Test(dataProvider="sample_isoLocalTime", groups={"tck"})
407 public void test_parse_isoLocalTime(
408 Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId,
409 String input, Class<?> invalid) {
410 if (input != null) {
411 Expected expected = createTime(hour, min, sec, nano);
412 // offset/zone not expected to be parsed
413 assertParseMatch(DateTimeFormatter.ISO_LOCAL_TIME.parseUnresolved(input, new ParsePosition(0)), expected);
414 }
415 }
416
417 //-----------------------------------------------------------------------
418 //-----------------------------------------------------------------------
419 //-----------------------------------------------------------------------
420 @DataProvider(name="sample_isoOffsetTime")
421 Object[][] provider_sample_isoOffsetTime() {
422 return new Object[][]{
423 {11, null, null, null, null, null, null, DateTimeException.class},
424 {null, 5, null, null, null, null, null, DateTimeException.class},
425 {null, null, 30, null, null, null, null, DateTimeException.class},
426 {null, null, null, 1, null, null, null, DateTimeException.class},
427 {null, null, null, null, "+01:00", null, null, DateTimeException.class},
428 {null, null, null, null, null, "Europe/Paris", null, DateTimeException.class},
429
430 {11, 5, null, null, null, null, null, DateTimeException.class},
431 {11, 5, 30, null, null, null, null, DateTimeException.class},
432 {11, 5, 30, 500000000, null, null, null, DateTimeException.class},
433 {11, 5, 30, 1, null, null, null, DateTimeException.class},
434
435 {11, 5, null, null, "+01:00", null, "11:05+01:00", null},
436 {11, 5, 30, null, "+01:00", null, "11:05:30+01:00", null},
437 {11, 5, 30, 500000000, "+01:00", null, "11:05:30.5+01:00", null},
438 {11, 5, 30, 1, "+01:00", null, "11:05:30.000000001+01:00", null},
439
440 {11, 5, null, null, "+01:00", "Europe/Paris", "11:05+01:00", null},
441 {11, 5, 30, null, "+01:00", "Europe/Paris", "11:05:30+01:00", null},
442 {11, 5, 30, 500000000, "+01:00", "Europe/Paris", "11:05:30.5+01:00", null},
443 {11, 5, 30, 1, "+01:00", "Europe/Paris", "11:05:30.000000001+01:00", null},
444
445 {11, 5, null, null, null, "Europe/Paris", null, DateTimeException.class},
446 {11, 5, 30, null, null, "Europe/Paris", null, DateTimeException.class},
447 {11, 5, 30, 500000000, null, "Europe/Paris", null, DateTimeException.class},
448 {11, 5, 30, 1, null, "Europe/Paris", null, DateTimeException.class},
449 };
450 }
451
452 @Test(dataProvider="sample_isoOffsetTime", groups={"tck"})
453 public void test_print_isoOffsetTime(
454 Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId,
455 String expected, Class<?> expectedEx) {
456 TemporalAccessor test = buildAccessor(null, null, null, hour, min, sec, nano, offsetId, zoneId);
457 if (expectedEx == null) {
458 assertEquals(DateTimeFormatter.ISO_OFFSET_TIME.format(test), expected);
459 } else {
460 try {
461 DateTimeFormatter.ISO_OFFSET_TIME.format(test);
462 fail();
463 } catch (Exception ex) {
464 assertTrue(expectedEx.isInstance(ex));
465 }
466 }
467 }
468
469 @Test(dataProvider="sample_isoOffsetTime", groups={"tck"})
470 public void test_parse_isoOffsetTime(
471 Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId,
472 String input, Class<?> invalid) {
473 if (input != null) {
474 Expected expected = createTime(hour, min, sec, nano);
475 buildCalendrical(expected, offsetId, null); // zoneId is not expected from parse
476 assertParseMatch(DateTimeFormatter.ISO_OFFSET_TIME.parseUnresolved(input, new ParsePosition(0)), expected);
477 }
478 }
479
480 //-----------------------------------------------------------------------
481 //-----------------------------------------------------------------------
482 //-----------------------------------------------------------------------
483 @DataProvider(name="sample_isoTime")
484 Object[][] provider_sample_isoTime() {
485 return new Object[][]{
486 {11, null, null, null, null, null, null, DateTimeException.class},
487 {null, 5, null, null, null, null, null, DateTimeException.class},
488 {null, null, 30, null, null, null, null, DateTimeException.class},
489 {null, null, null, 1, null, null, null, DateTimeException.class},
490 {null, null, null, null, "+01:00", null, null, DateTimeException.class},
491 {null, null, null, null, null, "Europe/Paris", null, DateTimeException.class},
492
493 {11, 5, null, null, null, null, "11:05", null},
494 {11, 5, 30, null, null, null, "11:05:30", null},
495 {11, 5, 30, 500000000, null, null, "11:05:30.5", null},
496 {11, 5, 30, 1, null, null, "11:05:30.000000001", null},
497
498 {11, 5, null, null, "+01:00", null, "11:05+01:00", null},
499 {11, 5, 30, null, "+01:00", null, "11:05:30+01:00", null},
500 {11, 5, 30, 500000000, "+01:00", null, "11:05:30.5+01:00", null},
501 {11, 5, 30, 1, "+01:00", null, "11:05:30.000000001+01:00", null},
502
503 {11, 5, null, null, "+01:00", "Europe/Paris", "11:05+01:00", null},
504 {11, 5, 30, null, "+01:00", "Europe/Paris", "11:05:30+01:00", null},
505 {11, 5, 30, 500000000, "+01:00", "Europe/Paris", "11:05:30.5+01:00", null},
506 {11, 5, 30, 1, "+01:00", "Europe/Paris", "11:05:30.000000001+01:00", null},
507
508 {11, 5, null, null, null, "Europe/Paris", "11:05", null},
509 {11, 5, 30, null, null, "Europe/Paris", "11:05:30", null},
510 {11, 5, 30, 500000000, null, "Europe/Paris", "11:05:30.5", null},
511 {11, 5, 30, 1, null, "Europe/Paris", "11:05:30.000000001", null},
512 };
513 }
514
515 @Test(dataProvider="sample_isoTime", groups={"tck"})
516 public void test_print_isoTime(
517 Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId,
518 String expected, Class<?> expectedEx) {
519 TemporalAccessor test = buildAccessor(null, null, null, hour, min, sec, nano, offsetId, zoneId);
520 if (expectedEx == null) {
521 assertEquals(DateTimeFormatter.ISO_TIME.format(test), expected);
522 } else {
523 try {
524 DateTimeFormatter.ISO_TIME.format(test);
525 fail();
526 } catch (Exception ex) {
527 assertTrue(expectedEx.isInstance(ex));
528 }
529 }
530 }
531
532 @Test(dataProvider="sample_isoTime", groups={"tck"})
533 public void test_parse_isoTime(
534 Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId,
535 String input, Class<?> invalid) {
536 if (input != null) {
537 Expected expected = createTime(hour, min, sec, nano);
538 if (offsetId != null) {
539 expected.add(ZoneOffset.of(offsetId));
540 }
541 assertParseMatch(DateTimeFormatter.ISO_TIME.parseUnresolved(input, new ParsePosition(0)), expected);
542 }
543 }
544
545 //-----------------------------------------------------------------------
546 //-----------------------------------------------------------------------
547 //-----------------------------------------------------------------------
548 @DataProvider(name="sample_isoLocalDateTime")
549 Object[][] provider_sample_isoLocalDateTime() {
550 return new Object[][]{
551 {2008, null, null, null, null, null, null, null, null, null, DateTimeException.class},
552 {null, 6, null, null, null, null, null, null, null, null, DateTimeException.class},
553 {null, null, 30, null, null, null, null, null, null, null, DateTimeException.class},
554 {null, null, null, 11, null, null, null, null, null, null, DateTimeException.class},
555 {null, null, null, null, 5, null, null, null, null, null, DateTimeException.class},
556 {null, null, null, null, null, null, null, "+01:00", null, null, DateTimeException.class},
557 {null, null, null, null, null, null, null, null, "Europe/Paris", null, DateTimeException.class},
558 {2008, 6, 30, 11, null, null, null, null, null, null, DateTimeException.class},
559 {2008, 6, 30, null, 5, null, null, null, null, null, DateTimeException.class},
560 {2008, 6, null, 11, 5, null, null, null, null, null, DateTimeException.class},
561 {2008, null, 30, 11, 5, null, null, null, null, null, DateTimeException.class},
562 {null, 6, 30, 11, 5, null, null, null, null, null, DateTimeException.class},
563
564 {2008, 6, 30, 11, 5, null, null, null, null, "2008-06-30T11:05", null},
568
569 {2008, 6, 30, 11, 5, null, null, "+01:00", null, "2008-06-30T11:05", null},
570 {2008, 6, 30, 11, 5, 30, null, "+01:00", null, "2008-06-30T11:05:30", null},
571 {2008, 6, 30, 11, 5, 30, 500000000, "+01:00", null, "2008-06-30T11:05:30.5", null},
572 {2008, 6, 30, 11, 5, 30, 1, "+01:00", null, "2008-06-30T11:05:30.000000001", null},
573
574 {2008, 6, 30, 11, 5, null, null, "+01:00", "Europe/Paris", "2008-06-30T11:05", null},
575 {2008, 6, 30, 11, 5, 30, null, "+01:00", "Europe/Paris", "2008-06-30T11:05:30", null},
576 {2008, 6, 30, 11, 5, 30, 500000000, "+01:00", "Europe/Paris", "2008-06-30T11:05:30.5", null},
577 {2008, 6, 30, 11, 5, 30, 1, "+01:00", "Europe/Paris", "2008-06-30T11:05:30.000000001", null},
578
579 {2008, 6, 30, 11, 5, null, null, null, "Europe/Paris", "2008-06-30T11:05", null},
580 {2008, 6, 30, 11, 5, 30, null, null, "Europe/Paris", "2008-06-30T11:05:30", null},
581 {2008, 6, 30, 11, 5, 30, 500000000, null, "Europe/Paris", "2008-06-30T11:05:30.5", null},
582 {2008, 6, 30, 11, 5, 30, 1, null, "Europe/Paris", "2008-06-30T11:05:30.000000001", null},
583
584 {123456, 6, 30, 11, 5, null, null, null, null, "+123456-06-30T11:05", null},
585 };
586 }
587
588 @Test(dataProvider="sample_isoLocalDateTime", groups={"tck"})
589 public void test_print_isoLocalDateTime(
590 Integer year, Integer month, Integer day,
591 Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId,
592 String expected, Class<?> expectedEx) {
593 TemporalAccessor test = buildAccessor(year, month, day, hour, min, sec, nano, offsetId, zoneId);
594 if (expectedEx == null) {
595 assertEquals(DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(test), expected);
596 } else {
597 try {
598 DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(test);
599 fail();
600 } catch (Exception ex) {
601 assertTrue(expectedEx.isInstance(ex));
602 }
603 }
604 }
605
606 @Test(dataProvider="sample_isoLocalDateTime", groups={"tck"})
607 public void test_parse_isoLocalDateTime(
608 Integer year, Integer month, Integer day,
609 Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId,
610 String input, Class<?> invalid) {
611 if (input != null) {
612 Expected expected = createDateTime(year, month, day, hour, min, sec, nano);
613 assertParseMatch(DateTimeFormatter.ISO_LOCAL_DATE_TIME.parseUnresolved(input, new ParsePosition(0)), expected);
614 }
615 }
616
617 //-----------------------------------------------------------------------
618 //-----------------------------------------------------------------------
619 //-----------------------------------------------------------------------
620 @DataProvider(name="sample_isoOffsetDateTime")
621 Object[][] provider_sample_isoOffsetDateTime() {
622 return new Object[][]{
623 {2008, null, null, null, null, null, null, null, null, null, DateTimeException.class},
624 {null, 6, null, null, null, null, null, null, null, null, DateTimeException.class},
625 {null, null, 30, null, null, null, null, null, null, null, DateTimeException.class},
626 {null, null, null, 11, null, null, null, null, null, null, DateTimeException.class},
627 {null, null, null, null, 5, null, null, null, null, null, DateTimeException.class},
628 {null, null, null, null, null, null, null, "+01:00", null, null, DateTimeException.class},
629 {null, null, null, null, null, null, null, null, "Europe/Paris", null, DateTimeException.class},
630 {2008, 6, 30, 11, null, null, null, null, null, null, DateTimeException.class},
631 {2008, 6, 30, null, 5, null, null, null, null, null, DateTimeException.class},
632 {2008, 6, null, 11, 5, null, null, null, null, null, DateTimeException.class},
633 {2008, null, 30, 11, 5, null, null, null, null, null, DateTimeException.class},
634 {null, 6, 30, 11, 5, null, null, null, null, null, DateTimeException.class},
635
636 {2008, 6, 30, 11, 5, null, null, null, null, null, DateTimeException.class},
640
641 {2008, 6, 30, 11, 5, null, null, "+01:00", null, "2008-06-30T11:05+01:00", null},
642 {2008, 6, 30, 11, 5, 30, null, "+01:00", null, "2008-06-30T11:05:30+01:00", null},
643 {2008, 6, 30, 11, 5, 30, 500000000, "+01:00", null, "2008-06-30T11:05:30.5+01:00", null},
644 {2008, 6, 30, 11, 5, 30, 1, "+01:00", null, "2008-06-30T11:05:30.000000001+01:00", null},
645
646 {2008, 6, 30, 11, 5, null, null, "+01:00", "Europe/Paris", "2008-06-30T11:05+01:00", null},
647 {2008, 6, 30, 11, 5, 30, null, "+01:00", "Europe/Paris", "2008-06-30T11:05:30+01:00", null},
648 {2008, 6, 30, 11, 5, 30, 500000000, "+01:00", "Europe/Paris", "2008-06-30T11:05:30.5+01:00", null},
649 {2008, 6, 30, 11, 5, 30, 1, "+01:00", "Europe/Paris", "2008-06-30T11:05:30.000000001+01:00", null},
650
651 {2008, 6, 30, 11, 5, null, null, null, "Europe/Paris", null, DateTimeException.class},
652 {2008, 6, 30, 11, 5, 30, null, null, "Europe/Paris", null, DateTimeException.class},
653 {2008, 6, 30, 11, 5, 30, 500000000, null, "Europe/Paris", null, DateTimeException.class},
654 {2008, 6, 30, 11, 5, 30, 1, null, "Europe/Paris", null, DateTimeException.class},
655
656 {123456, 6, 30, 11, 5, null, null, "+01:00", null, "+123456-06-30T11:05+01:00", null},
657 };
658 }
659
660 @Test(dataProvider="sample_isoOffsetDateTime", groups={"tck"})
661 public void test_print_isoOffsetDateTime(
662 Integer year, Integer month, Integer day,
663 Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId,
664 String expected, Class<?> expectedEx) {
665 TemporalAccessor test = buildAccessor(year, month, day, hour, min, sec, nano, offsetId, zoneId);
666 if (expectedEx == null) {
667 assertEquals(DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(test), expected);
668 } else {
669 try {
670 DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(test);
671 fail();
672 } catch (Exception ex) {
673 assertTrue(expectedEx.isInstance(ex));
674 }
675 }
676 }
677
678 @Test(dataProvider="sample_isoOffsetDateTime", groups={"tck"})
679 public void test_parse_isoOffsetDateTime(
680 Integer year, Integer month, Integer day,
681 Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId,
682 String input, Class<?> invalid) {
683 if (input != null) {
684 Expected expected = createDateTime(year, month, day, hour, min, sec, nano);
685 buildCalendrical(expected, offsetId, null); // zone not expected to be parsed
686 assertParseMatch(DateTimeFormatter.ISO_OFFSET_DATE_TIME.parseUnresolved(input, new ParsePosition(0)), expected);
687 }
688 }
689
690 //-----------------------------------------------------------------------
691 //-----------------------------------------------------------------------
692 //-----------------------------------------------------------------------
693 @DataProvider(name="sample_isoZonedDateTime")
694 Object[][] provider_sample_isoZonedDateTime() {
695 return new Object[][]{
696 {2008, null, null, null, null, null, null, null, null, null, DateTimeException.class},
697 {null, 6, null, null, null, null, null, null, null, null, DateTimeException.class},
698 {null, null, 30, null, null, null, null, null, null, null, DateTimeException.class},
699 {null, null, null, 11, null, null, null, null, null, null, DateTimeException.class},
700 {null, null, null, null, 5, null, null, null, null, null, DateTimeException.class},
701 {null, null, null, null, null, null, null, "+01:00", null, null, DateTimeException.class},
702 {null, null, null, null, null, null, null, null, "Europe/Paris", null, DateTimeException.class},
703 {2008, 6, 30, 11, null, null, null, null, null, null, DateTimeException.class},
704 {2008, 6, 30, null, 5, null, null, null, null, null, DateTimeException.class},
705 {2008, 6, null, 11, 5, null, null, null, null, null, DateTimeException.class},
706 {2008, null, 30, 11, 5, null, null, null, null, null, DateTimeException.class},
707 {null, 6, 30, 11, 5, null, null, null, null, null, DateTimeException.class},
708
709 {2008, 6, 30, 11, 5, null, null, null, null, null, DateTimeException.class},
722 {2008, 6, 30, 11, 5, 30, null, "+01:00", "+01:00", "2008-06-30T11:05:30+01:00", null},
723 {2008, 6, 30, 11, 5, 30, 500000000, "+01:00", "+01:00", "2008-06-30T11:05:30.5+01:00", null},
724 {2008, 6, 30, 11, 5, 30, 1, "+01:00", "+01:00", "2008-06-30T11:05:30.000000001+01:00", null},
725
726 // ZonedDateTime with ZoneId of ZoneRegion
727 {2008, 6, 30, 11, 5, null, null, "+01:00", "Europe/Paris", "2008-06-30T11:05+01:00[Europe/Paris]", null},
728 {2008, 6, 30, 11, 5, 30, null, "+01:00", "Europe/Paris", "2008-06-30T11:05:30+01:00[Europe/Paris]", null},
729 {2008, 6, 30, 11, 5, 30, 500000000, "+01:00", "Europe/Paris", "2008-06-30T11:05:30.5+01:00[Europe/Paris]", null},
730 {2008, 6, 30, 11, 5, 30, 1, "+01:00", "Europe/Paris", "2008-06-30T11:05:30.000000001+01:00[Europe/Paris]", null},
731
732 // offset required
733 {2008, 6, 30, 11, 5, null, null, null, "Europe/Paris", null, DateTimeException.class},
734 {2008, 6, 30, 11, 5, 30, null, null, "Europe/Paris", null, DateTimeException.class},
735 {2008, 6, 30, 11, 5, 30, 500000000, null, "Europe/Paris", null, DateTimeException.class},
736 {2008, 6, 30, 11, 5, 30, 1, null, "Europe/Paris", null, DateTimeException.class},
737
738 {123456, 6, 30, 11, 5, null, null, "+01:00", "Europe/Paris", "+123456-06-30T11:05+01:00[Europe/Paris]", null},
739 };
740 }
741
742 @Test(dataProvider="sample_isoZonedDateTime", groups={"tck"})
743 public void test_print_isoZonedDateTime(
744 Integer year, Integer month, Integer day,
745 Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId,
746 String expected, Class<?> expectedEx) {
747 TemporalAccessor test = buildAccessor(year, month, day, hour, min, sec, nano, offsetId, zoneId);
748 if (expectedEx == null) {
749 assertEquals(DateTimeFormatter.ISO_ZONED_DATE_TIME.format(test), expected);
750 } else {
751 try {
752 DateTimeFormatter.ISO_ZONED_DATE_TIME.format(test);
753 fail(test.toString());
754 } catch (Exception ex) {
755 assertTrue(expectedEx.isInstance(ex));
756 }
757 }
758 }
759
760 @Test(dataProvider="sample_isoZonedDateTime", groups={"tck"})
761 public void test_parse_isoZonedDateTime(
762 Integer year, Integer month, Integer day,
763 Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId,
764 String input, Class<?> invalid) {
765 if (input != null) {
766 Expected expected = createDateTime(year, month, day, hour, min, sec, nano);
767 if (offsetId.equals(zoneId)) {
768 buildCalendrical(expected, offsetId, null);
769 } else {
770 buildCalendrical(expected, offsetId, zoneId);
771 }
772 assertParseMatch(DateTimeFormatter.ISO_ZONED_DATE_TIME.parseUnresolved(input, new ParsePosition(0)), expected);
773 }
774 }
775
776 //-----------------------------------------------------------------------
777 //-----------------------------------------------------------------------
778 //-----------------------------------------------------------------------
779 @DataProvider(name="sample_isoDateTime")
780 Object[][] provider_sample_isoDateTime() {
781 return new Object[][]{
782 {2008, null, null, null, null, null, null, null, null, null, DateTimeException.class},
783 {null, 6, null, null, null, null, null, null, null, null, DateTimeException.class},
784 {null, null, 30, null, null, null, null, null, null, null, DateTimeException.class},
785 {null, null, null, 11, null, null, null, null, null, null, DateTimeException.class},
786 {null, null, null, null, 5, null, null, null, null, null, DateTimeException.class},
787 {null, null, null, null, null, null, null, "+01:00", null, null, DateTimeException.class},
788 {null, null, null, null, null, null, null, null, "Europe/Paris", null, DateTimeException.class},
789 {2008, 6, 30, 11, null, null, null, null, null, null, DateTimeException.class},
790 {2008, 6, 30, null, 5, null, null, null, null, null, DateTimeException.class},
791 {2008, 6, null, 11, 5, null, null, null, null, null, DateTimeException.class},
792 {2008, null, 30, 11, 5, null, null, null, null, null, DateTimeException.class},
793 {null, 6, 30, 11, 5, null, null, null, null, null, DateTimeException.class},
794
795 {2008, 6, 30, 11, 5, null, null, null, null, "2008-06-30T11:05", null},
799
800 {2008, 6, 30, 11, 5, null, null, "+01:00", null, "2008-06-30T11:05+01:00", null},
801 {2008, 6, 30, 11, 5, 30, null, "+01:00", null, "2008-06-30T11:05:30+01:00", null},
802 {2008, 6, 30, 11, 5, 30, 500000000, "+01:00", null, "2008-06-30T11:05:30.5+01:00", null},
803 {2008, 6, 30, 11, 5, 30, 1, "+01:00", null, "2008-06-30T11:05:30.000000001+01:00", null},
804
805 {2008, 6, 30, 11, 5, null, null, "+01:00", "Europe/Paris", "2008-06-30T11:05+01:00[Europe/Paris]", null},
806 {2008, 6, 30, 11, 5, 30, null, "+01:00", "Europe/Paris", "2008-06-30T11:05:30+01:00[Europe/Paris]", null},
807 {2008, 6, 30, 11, 5, 30, 500000000, "+01:00", "Europe/Paris", "2008-06-30T11:05:30.5+01:00[Europe/Paris]", null},
808 {2008, 6, 30, 11, 5, 30, 1, "+01:00", "Europe/Paris", "2008-06-30T11:05:30.000000001+01:00[Europe/Paris]", null},
809
810 {2008, 6, 30, 11, 5, null, null, null, "Europe/Paris", "2008-06-30T11:05", null},
811 {2008, 6, 30, 11, 5, 30, null, null, "Europe/Paris", "2008-06-30T11:05:30", null},
812 {2008, 6, 30, 11, 5, 30, 500000000, null, "Europe/Paris", "2008-06-30T11:05:30.5", null},
813 {2008, 6, 30, 11, 5, 30, 1, null, "Europe/Paris", "2008-06-30T11:05:30.000000001", null},
814
815 {123456, 6, 30, 11, 5, null, null, null, null, "+123456-06-30T11:05", null},
816 };
817 }
818
819 @Test(dataProvider="sample_isoDateTime", groups={"tck"})
820 public void test_print_isoDateTime(
821 Integer year, Integer month, Integer day,
822 Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId,
823 String expected, Class<?> expectedEx) {
824 TemporalAccessor test = buildAccessor(year, month, day, hour, min, sec, nano, offsetId, zoneId);
825 if (expectedEx == null) {
826 assertEquals(DateTimeFormatter.ISO_DATE_TIME.format(test), expected);
827 } else {
828 try {
829 DateTimeFormatter.ISO_DATE_TIME.format(test);
830 fail();
831 } catch (Exception ex) {
832 assertTrue(expectedEx.isInstance(ex));
833 }
834 }
835 }
836
837 @Test(dataProvider="sample_isoDateTime", groups={"tck"})
838 public void test_parse_isoDateTime(
839 Integer year, Integer month, Integer day,
840 Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId,
841 String input, Class<?> invalid) {
842 if (input != null) {
843 Expected expected = createDateTime(year, month, day, hour, min, sec, nano);
844 if (offsetId != null) {
845 expected.add(ZoneOffset.of(offsetId));
846 if (zoneId != null) {
847 expected.zone = ZoneId.of(zoneId);
848 }
849 }
850 assertParseMatch(DateTimeFormatter.ISO_DATE_TIME.parseUnresolved(input, new ParsePosition(0)), expected);
851 }
852 }
853
854 //-----------------------------------------------------------------------
855 //-----------------------------------------------------------------------
856 //-----------------------------------------------------------------------
857 @Test(groups={"tck"})
858 public void test_print_isoOrdinalDate() {
859 TemporalAccessor test = buildAccessor(LocalDateTime.of(2008, 6, 3, 11, 5, 30), null, null);
860 assertEquals(DateTimeFormatter.ISO_ORDINAL_DATE.format(test), "2008-155");
861 }
862
863 @Test(groups={"tck"})
864 public void test_print_isoOrdinalDate_offset() {
865 TemporalAccessor test = buildAccessor(LocalDateTime.of(2008, 6, 3, 11, 5, 30), "Z", null);
866 assertEquals(DateTimeFormatter.ISO_ORDINAL_DATE.format(test), "2008-155Z");
867 }
868
869 @Test(groups={"tck"})
870 public void test_print_isoOrdinalDate_zoned() {
871 TemporalAccessor test = buildAccessor(LocalDateTime.of(2008, 6, 3, 11, 5, 30), "+02:00", "Europe/Paris");
872 assertEquals(DateTimeFormatter.ISO_ORDINAL_DATE.format(test), "2008-155+02:00");
873 }
874
875 @Test(groups={"tck"})
876 public void test_print_isoOrdinalDate_zoned_largeYear() {
877 TemporalAccessor test = buildAccessor(LocalDateTime.of(123456, 6, 3, 11, 5, 30), "Z", null);
878 assertEquals(DateTimeFormatter.ISO_ORDINAL_DATE.format(test), "+123456-155Z");
879 }
880
881 @Test
882 public void test_print_isoOrdinalDate_fields() {
883 // mock for testing that does not fully comply with TemporalAccessor contract
884 TemporalAccessor test = new TemporalAccessor() {
885 @Override
886 public boolean isSupported(TemporalField field) {
887 return field == YEAR || field == DAY_OF_YEAR;
888 }
889 @Override
890 public long getLong(TemporalField field) {
891 if (field == YEAR) {
892 return 2008;
893 }
894 if (field == DAY_OF_YEAR) {
895 return 231;
896 }
897 throw new DateTimeException("Unsupported");
898 }
899 };
900 assertEquals(DateTimeFormatter.ISO_ORDINAL_DATE.format(test), "2008-231");
901 }
902
903 @Test(expectedExceptions=DateTimeException.class)
904 public void test_print_isoOrdinalDate_missingField() {
905 TemporalAccessor test = Year.of(2008);
906 DateTimeFormatter.ISO_ORDINAL_DATE.format(test);
907 }
908
909 //-----------------------------------------------------------------------
910 @Test(groups={"tck"})
911 public void test_parse_isoOrdinalDate() {
912 Expected expected = new Expected(YEAR, 2008, DAY_OF_YEAR, 123);
913 assertParseMatch(DateTimeFormatter.ISO_ORDINAL_DATE.parseUnresolved("2008-123", new ParsePosition(0)), expected);
914 }
915
916 @Test(groups={"tck"})
917 public void test_parse_isoOrdinalDate_largeYear() {
918 Expected expected = new Expected(YEAR, 123456, DAY_OF_YEAR, 123);
919 assertParseMatch(DateTimeFormatter.ISO_ORDINAL_DATE.parseUnresolved("+123456-123", new ParsePosition(0)), expected);
920 }
921
922 //-----------------------------------------------------------------------
923 //-----------------------------------------------------------------------
924 //-----------------------------------------------------------------------
925 @Test(groups={"tck"})
926 public void test_print_basicIsoDate() {
927 TemporalAccessor test = buildAccessor(LocalDateTime.of(2008, 6, 3, 11, 5, 30), null, null);
928 assertEquals(DateTimeFormatter.BASIC_ISO_DATE.format(test), "20080603");
929 }
930
931 @Test(groups={"tck"})
932 public void test_print_basicIsoDate_offset() {
933 TemporalAccessor test = buildAccessor(LocalDateTime.of(2008, 6, 3, 11, 5, 30), "Z", null);
934 assertEquals(DateTimeFormatter.BASIC_ISO_DATE.format(test), "20080603Z");
935 }
936
937 @Test(groups={"tck"})
938 public void test_print_basicIsoDate_zoned() {
939 TemporalAccessor test = buildAccessor(LocalDateTime.of(2008, 6, 3, 11, 5, 30), "+02:00", "Europe/Paris");
940 assertEquals(DateTimeFormatter.BASIC_ISO_DATE.format(test), "20080603+0200");
941 }
942
943 @Test(expectedExceptions=DateTimeException.class, groups={"tck"})
944 public void test_print_basicIsoDate_largeYear() {
945 TemporalAccessor test = buildAccessor(LocalDateTime.of(123456, 6, 3, 11, 5, 30), "Z", null);
946 DateTimeFormatter.BASIC_ISO_DATE.format(test);
947 }
948
949 @Test(groups={"tck"})
950 public void test_print_basicIsoDate_fields() {
951 TemporalAccessor test = buildAccessor(LocalDate.of(2008, 6, 3), null, null);
952 assertEquals(DateTimeFormatter.BASIC_ISO_DATE.format(test), "20080603");
953 }
954
955 @Test(expectedExceptions=DateTimeException.class, groups={"tck"})
956 public void test_print_basicIsoDate_missingField() {
957 TemporalAccessor test = YearMonth.of(2008, 6);
958 DateTimeFormatter.BASIC_ISO_DATE.format(test);
959 }
960
961 //-----------------------------------------------------------------------
962 @Test(groups={"tck"})
963 public void test_parse_basicIsoDate() {
964 LocalDate expected = LocalDate.of(2008, 6, 3);
965 assertEquals(DateTimeFormatter.BASIC_ISO_DATE.parse("20080603", LocalDate::from), expected);
966 }
967
968 @Test(expectedExceptions=DateTimeParseException.class, groups={"tck"})
969 public void test_parse_basicIsoDate_largeYear() {
970 try {
971 LocalDate expected = LocalDate.of(123456, 6, 3);
972 assertEquals(DateTimeFormatter.BASIC_ISO_DATE.parse("+1234560603", LocalDate::from), expected);
973 } catch (DateTimeParseException ex) {
974 assertEquals(ex.getErrorIndex(), 0);
975 assertEquals(ex.getParsedString(), "+1234560603");
976 throw ex;
977 }
978 }
979
980 //-----------------------------------------------------------------------
981 //-----------------------------------------------------------------------
982 //-----------------------------------------------------------------------
983 @DataProvider(name="weekDate")
984 Iterator<Object[]> weekDate() {
985 return new Iterator<Object[]>() {
986 private ZonedDateTime date = ZonedDateTime.of(LocalDateTime.of(2003, 12, 29, 11, 5, 30), ZoneId.of("Europe/Paris"));
987 private ZonedDateTime endDate = date.withYear(2005).withMonth(1).withDayOfMonth(2);
988 private int week = 1;
989 private int day = 1;
990
991 public boolean hasNext() {
992 return !date.isAfter(endDate);
993 }
994 public Object[] next() {
995 StringBuilder sb = new StringBuilder("2004-W");
996 if (week < 10) {
997 sb.append('0');
998 }
999 sb.append(week).append('-').append(day).append(date.getOffset());
1000 Object[] ret = new Object[] {date, sb.toString()};
1001 date = date.plusDays(1);
1002 day += 1;
1003 if (day == 8) {
1004 day = 1;
1005 week++;
1006 }
1007 return ret;
1008 }
1009 public void remove() {
1010 throw new UnsupportedOperationException();
1011 }
1012 };
1013 }
1014
1015 @Test(dataProvider="weekDate", groups={"tck"})
1016 public void test_print_isoWeekDate(TemporalAccessor test, String expected) {
1017 assertEquals(DateTimeFormatter.ISO_WEEK_DATE.format(test), expected);
1018 }
1019
1020 @Test(groups={"tck"})
1021 public void test_print_isoWeekDate_zoned_largeYear() {
1022 TemporalAccessor test = buildAccessor(LocalDateTime.of(123456, 6, 3, 11, 5, 30), "Z", null);
1023 assertEquals(DateTimeFormatter.ISO_WEEK_DATE.format(test), "+123456-W23-2Z");
1024 }
1025
1026 @Test(groups={"tck"})
1027 public void test_print_isoWeekDate_fields() {
1028 TemporalAccessor test = buildAccessor(LocalDate.of(2004, 1, 27), null, null);
1029 assertEquals(DateTimeFormatter.ISO_WEEK_DATE.format(test), "2004-W05-2");
1030 }
1031
1032 @Test(expectedExceptions=DateTimeException.class, groups={"tck"})
1033 public void test_print_isoWeekDate_missingField() {
1034 TemporalAccessor test = YearMonth.of(2008, 6);
1035 DateTimeFormatter.ISO_WEEK_DATE.format(test);
1036 }
1037
1038 //-----------------------------------------------------------------------
1039 @Test(groups={"tck"})
1040 public void test_parse_weekDate() {
1041 LocalDate expected = LocalDate.of(2004, 1, 28);
1042 assertEquals(DateTimeFormatter.ISO_WEEK_DATE.parse("2004-W05-3", LocalDate::from), expected);
1043 }
1044
1045 @Test(groups={"tck"})
1046 public void test_parse_weekDate_largeYear() {
1047 TemporalAccessor parsed = DateTimeFormatter.ISO_WEEK_DATE.parseUnresolved("+123456-W04-5", new ParsePosition(0));
1048 assertEquals(parsed.getLong(IsoFields.WEEK_BASED_YEAR), 123456L);
1049 assertEquals(parsed.getLong(IsoFields.WEEK_OF_WEEK_BASED_YEAR), 4L);
1050 assertEquals(parsed.getLong(DAY_OF_WEEK), 5L);
1051 }
1052
1053 //-----------------------------------------------------------------------
1054 //-----------------------------------------------------------------------
1055 //-----------------------------------------------------------------------
1056 @DataProvider(name="rfc")
1057 Object[][] data_rfc() {
1058 return new Object[][] {
1059 {LocalDateTime.of(2008, 6, 3, 11, 5, 30), "Z", "Tue, 3 Jun 2008 11:05:30 GMT"},
1060 {LocalDateTime.of(2008, 6, 30, 11, 5, 30), "Z", "Mon, 30 Jun 2008 11:05:30 GMT"},
1061 {LocalDateTime.of(2008, 6, 3, 11, 5, 30), "+02:00", "Tue, 3 Jun 2008 11:05:30 +0200"},
1062 {LocalDateTime.of(2008, 6, 30, 11, 5, 30), "-03:00", "Mon, 30 Jun 2008 11:05:30 -0300"},
1063 };
1064 }
1065
1066 @Test(groups={"tck"}, dataProvider="rfc")
1067 public void test_print_rfc1123(LocalDateTime base, String offsetId, String expected) {
1068 TemporalAccessor test = buildAccessor(base, offsetId, null);
1069 assertEquals(DateTimeFormatter.RFC_1123_DATE_TIME.format(test), expected);
1070 }
1071
1072 @Test(groups={"tck"}, dataProvider="rfc")
1073 public void test_print_rfc1123_french(LocalDateTime base, String offsetId, String expected) {
1074 TemporalAccessor test = buildAccessor(base, offsetId, null);
1075 assertEquals(DateTimeFormatter.RFC_1123_DATE_TIME.withLocale(Locale.FRENCH).format(test), expected);
1076 }
1077
1078 @Test(groups={"tck"}, expectedExceptions=DateTimeException.class)
1079 public void test_print_rfc1123_missingField() {
1080 TemporalAccessor test = YearMonth.of(2008, 6);
1081 DateTimeFormatter.RFC_1123_DATE_TIME.format(test);
1082 }
1083
1084 //-----------------------------------------------------------------------
1085 //-----------------------------------------------------------------------
1086 //-----------------------------------------------------------------------
1087 private Expected createDate(Integer year, Integer month, Integer day) {
1088 Expected test = new Expected();
1089 if (year != null) {
1090 test.fieldValues.put(YEAR, (long) year);
1091 }
1092 if (month != null) {
1093 test.fieldValues.put(MONTH_OF_YEAR, (long) month);
1094 }
1095 if (day != null) {
1096 test.fieldValues.put(DAY_OF_MONTH, (long) day);
1097 }
1098 return test;
1099 }
1100
1101 private Expected createTime(Integer hour, Integer min, Integer sec, Integer nano) {
1102 Expected test = new Expected();
1103 if (hour != null) {
1187 mock.setFields(base);
1188 mock.setOffset(offsetId);
1189 mock.setZone(zoneId);
1190 return mock;
1191 }
1192
1193 private void buildCalendrical(Expected expected, String offsetId, String zoneId) {
1194 if (offsetId != null) {
1195 expected.add(ZoneOffset.of(offsetId));
1196 }
1197 if (zoneId != null) {
1198 expected.zone = ZoneId.of(zoneId);
1199 }
1200 }
1201
1202 private void assertParseMatch(TemporalAccessor parsed, Expected expected) {
1203 for (TemporalField field : expected.fieldValues.keySet()) {
1204 assertEquals(parsed.isSupported(field), true);
1205 parsed.getLong(field);
1206 }
1207 assertEquals(parsed.query(Queries.chronology()), expected.chrono);
1208 assertEquals(parsed.query(Queries.zoneId()), expected.zone);
1209 }
1210
1211 //-------------------------------------------------------------------------
1212 Map<TemporalField, Long> fields = new HashMap<>();
1213 ZoneId zoneId;
1214 static class MockAccessor implements TemporalAccessor {
1215 Map<TemporalField, Long> fields = new HashMap<>();
1216 ZoneId zoneId;
1217
1218 void setFields(LocalDate dt) {
1219 if (dt != null) {
1220 fields.put(YEAR, (long) dt.getYear());
1221 fields.put(MONTH_OF_YEAR, (long) dt.getMonthValue());
1222 fields.put(DAY_OF_MONTH, (long) dt.getDayOfMonth());
1223 fields.put(DAY_OF_YEAR, (long) dt.getDayOfYear());
1224 fields.put(DAY_OF_WEEK, (long) dt.getDayOfWeek().getValue());
1225 fields.put(IsoFields.WEEK_BASED_YEAR, dt.getLong(IsoFields.WEEK_BASED_YEAR));
1226 fields.put(IsoFields.WEEK_OF_WEEK_BASED_YEAR, dt.getLong(IsoFields.WEEK_OF_WEEK_BASED_YEAR));
1227 }
1228 }
1229
1230 void setFields(LocalDateTime dt) {
1231 if (dt != null) {
1232 fields.put(YEAR, (long) dt.getYear());
1233 fields.put(MONTH_OF_YEAR, (long) dt.getMonthValue());
1255 }
1256 }
1257
1258 @Override
1259 public boolean isSupported(TemporalField field) {
1260 return fields.containsKey(field);
1261 }
1262
1263 @Override
1264 public long getLong(TemporalField field) {
1265 try {
1266 return fields.get(field);
1267 } catch (NullPointerException ex) {
1268 throw new DateTimeException("Field missing: " + field);
1269 }
1270 }
1271
1272 @SuppressWarnings("unchecked")
1273 @Override
1274 public <R> R query(TemporalQuery<R> query) {
1275 if (query == Queries.zoneId()) {
1276 return (R) zoneId;
1277 }
1278 return TemporalAccessor.super.query(query);
1279 }
1280
1281 @Override
1282 public String toString() {
1283 return fields + (zoneId != null ? " " + zoneId : "");
1284 }
1285 }
1286
1287 //-----------------------------------------------------------------------
1288 static class Expected {
1289 Map<TemporalField, Long> fieldValues = new HashMap<>();
1290 ZoneId zone;
1291 Chronology chrono;
1292
1293 Expected() {
1294 }
1295
|
60 package tck.java.time.format;
61
62 import static java.time.temporal.ChronoField.DAY_OF_MONTH;
63 import static java.time.temporal.ChronoField.DAY_OF_WEEK;
64 import static java.time.temporal.ChronoField.DAY_OF_YEAR;
65 import static java.time.temporal.ChronoField.HOUR_OF_DAY;
66 import static java.time.temporal.ChronoField.MINUTE_OF_HOUR;
67 import static java.time.temporal.ChronoField.MONTH_OF_YEAR;
68 import static java.time.temporal.ChronoField.NANO_OF_SECOND;
69 import static java.time.temporal.ChronoField.OFFSET_SECONDS;
70 import static java.time.temporal.ChronoField.SECOND_OF_MINUTE;
71 import static java.time.temporal.ChronoField.YEAR;
72 import static org.testng.Assert.assertEquals;
73 import static org.testng.Assert.assertTrue;
74 import static org.testng.Assert.fail;
75
76 import java.text.ParsePosition;
77 import java.time.DateTimeException;
78 import java.time.LocalDate;
79 import java.time.LocalDateTime;
80 import java.time.Month;
81 import java.time.Year;
82 import java.time.YearMonth;
83 import java.time.ZoneId;
84 import java.time.ZoneOffset;
85 import java.time.ZonedDateTime;
86 import java.time.chrono.Chronology;
87 import java.time.chrono.IsoChronology;
88 import java.time.format.DateTimeFormatter;
89 import java.time.format.DateTimeParseException;
90 import java.time.format.FormatStyle;
91 import java.time.format.ResolverStyle;
92 import java.time.format.TextStyle;
93 import java.time.temporal.IsoFields;
94 import java.time.temporal.TemporalAccessor;
95 import java.time.temporal.TemporalField;
96 import java.time.temporal.TemporalQuery;
97 import java.util.HashMap;
98 import java.util.Iterator;
99 import java.util.Locale;
100 import java.util.Map;
101
102 import org.testng.annotations.BeforeMethod;
103 import org.testng.annotations.DataProvider;
104 import org.testng.annotations.Test;
105
106 /**
107 * Test DateTimeFormatter.
108 */
109 @Test
110 public class TCKDateTimeFormatters {
111
112 @BeforeMethod
113 public void setUp() {
114 }
115
116 //-----------------------------------------------------------------------
117 @Test(expectedExceptions=NullPointerException.class)
118 public void test_format_nullTemporalAccessor() {
119 DateTimeFormatter.ISO_DATE.format((TemporalAccessor) null);
120 }
121
122 //-----------------------------------------------------------------------
123 //-----------------------------------------------------------------------
124 //-----------------------------------------------------------------------
125 @Test
126 public void test_pattern_String() {
127 DateTimeFormatter test = DateTimeFormatter.ofPattern("d MMM yyyy");
128 assertEquals(test.format(LocalDate.of(2012, 6, 30)), "30 " +
129 Month.JUNE.getDisplayName(TextStyle.SHORT, Locale.getDefault()) + " 2012");
130 assertEquals(test.getLocale(), Locale.getDefault());
131 }
132
133 @Test(expectedExceptions=IllegalArgumentException.class)
134 public void test_pattern_String_invalid() {
135 DateTimeFormatter.ofPattern("p");
136 }
137
138 @Test(expectedExceptions=NullPointerException.class)
139 public void test_pattern_String_null() {
140 DateTimeFormatter.ofPattern(null);
141 }
142
143 //-----------------------------------------------------------------------
144 //-----------------------------------------------------------------------
145 //-----------------------------------------------------------------------
146 @Test
147 public void test_pattern_StringLocale() {
148 DateTimeFormatter test = DateTimeFormatter.ofPattern("d MMM yyyy", Locale.UK);
149 assertEquals(test.format(LocalDate.of(2012, 6, 30)), "30 Jun 2012");
150 assertEquals(test.getLocale(), Locale.UK);
151 }
152
153 @Test(expectedExceptions=IllegalArgumentException.class)
154 public void test_pattern_StringLocale_invalid() {
155 DateTimeFormatter.ofPattern("p", Locale.UK);
156 }
157
158 @Test(expectedExceptions=NullPointerException.class)
159 public void test_pattern_StringLocale_nullPattern() {
160 DateTimeFormatter.ofPattern(null, Locale.UK);
161 }
162
163 @Test(expectedExceptions=NullPointerException.class)
164 public void test_pattern_StringLocale_nullLocale() {
165 DateTimeFormatter.ofPattern("yyyy", null);
166 }
167
168 //-----------------------------------------------------------------------
169 //-----------------------------------------------------------------------
170 //-----------------------------------------------------------------------
171 @Test
172 public void test_ofLocalizedDate_basics() {
173 assertEquals(DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).getChronology(), IsoChronology.INSTANCE);
174 assertEquals(DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).getZone(), null);
175 assertEquals(DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).getResolverStyle(), ResolverStyle.SMART);
176 }
177
178 @Test
179 public void test_ofLocalizedTime_basics() {
180 assertEquals(DateTimeFormatter.ofLocalizedTime(FormatStyle.FULL).getChronology(), IsoChronology.INSTANCE);
181 assertEquals(DateTimeFormatter.ofLocalizedTime(FormatStyle.FULL).getZone(), null);
182 assertEquals(DateTimeFormatter.ofLocalizedTime(FormatStyle.FULL).getResolverStyle(), ResolverStyle.SMART);
183 }
184
185 @Test
186 public void test_ofLocalizedDateTime1_basics() {
187 assertEquals(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL).getChronology(), IsoChronology.INSTANCE);
188 assertEquals(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL).getZone(), null);
189 assertEquals(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL).getResolverStyle(), ResolverStyle.SMART);
190 }
191
192 @Test
193 public void test_ofLocalizedDateTime2_basics() {
194 assertEquals(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL, FormatStyle.MEDIUM).getChronology(), IsoChronology.INSTANCE);
195 assertEquals(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL, FormatStyle.MEDIUM).getZone(), null);
196 assertEquals(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL, FormatStyle.MEDIUM).getResolverStyle(), ResolverStyle.SMART);
197 }
198
199 //-----------------------------------------------------------------------
200 //-----------------------------------------------------------------------
201 //-----------------------------------------------------------------------
202 @DataProvider(name="sample_isoLocalDate")
203 Object[][] provider_sample_isoLocalDate() {
204 return new Object[][]{
205 {2008, null, null, null, null, null, DateTimeException.class},
206 {null, 6, null, null, null, null, DateTimeException.class},
207 {null, null, 30, null, null, null, DateTimeException.class},
208 {null, null, null, "+01:00", null, null, DateTimeException.class},
209 {null, null, null, null, "Europe/Paris", null, DateTimeException.class},
210 {2008, 6, null, null, null, null, DateTimeException.class},
211 {null, 6, 30, null, null, null, DateTimeException.class},
212
213 {2008, 6, 30, null, null, "2008-06-30", null},
214 {2008, 6, 30, "+01:00", null, "2008-06-30", null},
215 {2008, 6, 30, "+01:00", "Europe/Paris", "2008-06-30", null},
216 {2008, 6, 30, null, "Europe/Paris", "2008-06-30", null},
217
218 {123456, 6, 30, null, null, "+123456-06-30", null},
219 };
220 }
221
222 @Test(dataProvider="sample_isoLocalDate")
223 public void test_print_isoLocalDate(
224 Integer year, Integer month, Integer day, String offsetId, String zoneId,
225 String expected, Class<?> expectedEx) {
226 TemporalAccessor test = buildAccessor(year, month, day, null, null, null, null, offsetId, zoneId);
227 if (expectedEx == null) {
228 assertEquals(DateTimeFormatter.ISO_LOCAL_DATE.format(test), expected);
229 } else {
230 try {
231 DateTimeFormatter.ISO_LOCAL_DATE.format(test);
232 fail();
233 } catch (Exception ex) {
234 assertTrue(expectedEx.isInstance(ex));
235 }
236 }
237 }
238
239 @Test(dataProvider="sample_isoLocalDate")
240 public void test_parse_isoLocalDate(
241 Integer year, Integer month, Integer day, String offsetId, String zoneId,
242 String input, Class<?> invalid) {
243 if (input != null) {
244 Expected expected = createDate(year, month, day);
245 // offset/zone not expected to be parsed
246 assertParseMatch(DateTimeFormatter.ISO_LOCAL_DATE.parseUnresolved(input, new ParsePosition(0)), expected);
247 }
248 }
249
250 @Test
251 public void test_parse_isoLocalDate_999999999() {
252 Expected expected = createDate(999999999, 8, 6);
253 assertParseMatch(DateTimeFormatter.ISO_LOCAL_DATE.parseUnresolved("+999999999-08-06", new ParsePosition(0)), expected);
254 assertEquals(LocalDate.parse("+999999999-08-06"), LocalDate.of(999999999, 8, 6));
255 }
256
257 @Test
258 public void test_parse_isoLocalDate_1000000000() {
259 Expected expected = createDate(1000000000, 8, 6);
260 assertParseMatch(DateTimeFormatter.ISO_LOCAL_DATE.parseUnresolved("+1000000000-08-06", new ParsePosition(0)), expected);
261 }
262
263 @Test(expectedExceptions = DateTimeException.class)
264 public void test_parse_isoLocalDate_1000000000_failedCreate() {
265 LocalDate.parse("+1000000000-08-06");
266 }
267
268 @Test
269 public void test_parse_isoLocalDate_M999999999() {
270 Expected expected = createDate(-999999999, 8, 6);
271 assertParseMatch(DateTimeFormatter.ISO_LOCAL_DATE.parseUnresolved("-999999999-08-06", new ParsePosition(0)), expected);
272 assertEquals(LocalDate.parse("-999999999-08-06"), LocalDate.of(-999999999, 8, 6));
273 }
274
275 @Test
276 public void test_parse_isoLocalDate_M1000000000() {
277 Expected expected = createDate(-1000000000, 8, 6);
278 assertParseMatch(DateTimeFormatter.ISO_LOCAL_DATE.parseUnresolved("-1000000000-08-06", new ParsePosition(0)), expected);
279 }
280
281 @Test(expectedExceptions = DateTimeException.class)
282 public void test_parse_isoLocalDate_M1000000000_failedCreate() {
283 LocalDate.parse("-1000000000-08-06");
284 }
285
286 @Test
287 public void test_isoLocalDate_basics() {
288 assertEquals(DateTimeFormatter.ISO_LOCAL_DATE.getChronology(), IsoChronology.INSTANCE);
289 assertEquals(DateTimeFormatter.ISO_LOCAL_DATE.getZone(), null);
290 assertEquals(DateTimeFormatter.ISO_LOCAL_DATE.getResolverStyle(), ResolverStyle.STRICT);
291 }
292
293 //-----------------------------------------------------------------------
294 //-----------------------------------------------------------------------
295 //-----------------------------------------------------------------------
296 @DataProvider(name="sample_isoOffsetDate")
297 Object[][] provider_sample_isoOffsetDate() {
298 return new Object[][]{
299 {2008, null, null, null, null, null, DateTimeException.class},
300 {null, 6, null, null, null, null, DateTimeException.class},
301 {null, null, 30, null, null, null, DateTimeException.class},
302 {null, null, null, "+01:00", null, null, DateTimeException.class},
303 {null, null, null, null, "Europe/Paris", null, DateTimeException.class},
304 {2008, 6, null, null, null, null, DateTimeException.class},
305 {null, 6, 30, null, null, null, DateTimeException.class},
306
307 {2008, 6, 30, null, null, null, DateTimeException.class},
308 {2008, 6, 30, "+01:00", null, "2008-06-30+01:00", null},
309 {2008, 6, 30, "+01:00", "Europe/Paris", "2008-06-30+01:00", null},
310 {2008, 6, 30, null, "Europe/Paris", null, DateTimeException.class},
311
312 {123456, 6, 30, "+01:00", null, "+123456-06-30+01:00", null},
313 };
314 }
315
316 @Test(dataProvider="sample_isoOffsetDate")
317 public void test_print_isoOffsetDate(
318 Integer year, Integer month, Integer day, String offsetId, String zoneId,
319 String expected, Class<?> expectedEx) {
320 TemporalAccessor test = buildAccessor(year, month, day, null, null, null, null, offsetId, zoneId);
321 if (expectedEx == null) {
322 assertEquals(DateTimeFormatter.ISO_OFFSET_DATE.format(test), expected);
323 } else {
324 try {
325 DateTimeFormatter.ISO_OFFSET_DATE.format(test);
326 fail();
327 } catch (Exception ex) {
328 assertTrue(expectedEx.isInstance(ex));
329 }
330 }
331 }
332
333 @Test(dataProvider="sample_isoOffsetDate")
334 public void test_parse_isoOffsetDate(
335 Integer year, Integer month, Integer day, String offsetId, String zoneId,
336 String input, Class<?> invalid) {
337 if (input != null) {
338 Expected expected = createDate(year, month, day);
339 buildCalendrical(expected, offsetId, null); // zone not expected to be parsed
340 assertParseMatch(DateTimeFormatter.ISO_OFFSET_DATE.parseUnresolved(input, new ParsePosition(0)), expected);
341 }
342 }
343
344 @Test
345 public void test_isoOffsetDate_basics() {
346 assertEquals(DateTimeFormatter.ISO_OFFSET_DATE.getChronology(), IsoChronology.INSTANCE);
347 assertEquals(DateTimeFormatter.ISO_OFFSET_DATE.getZone(), null);
348 assertEquals(DateTimeFormatter.ISO_OFFSET_DATE.getResolverStyle(), ResolverStyle.STRICT);
349 }
350
351 //-----------------------------------------------------------------------
352 //-----------------------------------------------------------------------
353 //-----------------------------------------------------------------------
354 @DataProvider(name="sample_isoDate")
355 Object[][] provider_sample_isoDate() {
356 return new Object[][]{
357 {2008, null, null, null, null, null, DateTimeException.class},
358 {null, 6, null, null, null, null, DateTimeException.class},
359 {null, null, 30, null, null, null, DateTimeException.class},
360 {null, null, null, "+01:00", null, null, DateTimeException.class},
361 {null, null, null, null, "Europe/Paris", null, DateTimeException.class},
362 {2008, 6, null, null, null, null, DateTimeException.class},
363 {null, 6, 30, null, null, null, DateTimeException.class},
364
365 {2008, 6, 30, null, null, "2008-06-30", null},
366 {2008, 6, 30, "+01:00", null, "2008-06-30+01:00", null},
367 {2008, 6, 30, "+01:00", "Europe/Paris", "2008-06-30+01:00", null},
368 {2008, 6, 30, null, "Europe/Paris", "2008-06-30", null},
369
370 {123456, 6, 30, "+01:00", "Europe/Paris", "+123456-06-30+01:00", null},
371 };
372 }
373
374 @Test(dataProvider="sample_isoDate")
375 public void test_print_isoDate(
376 Integer year, Integer month, Integer day, String offsetId, String zoneId,
377 String expected, Class<?> expectedEx) {
378 TemporalAccessor test = buildAccessor(year, month, day, null, null, null, null, offsetId, zoneId);
379 if (expectedEx == null) {
380 assertEquals(DateTimeFormatter.ISO_DATE.format(test), expected);
381 } else {
382 try {
383 DateTimeFormatter.ISO_DATE.format(test);
384 fail();
385 } catch (Exception ex) {
386 assertTrue(expectedEx.isInstance(ex));
387 }
388 }
389 }
390
391 @Test(dataProvider="sample_isoDate")
392 public void test_parse_isoDate(
393 Integer year, Integer month, Integer day, String offsetId, String zoneId,
394 String input, Class<?> invalid) {
395 if (input != null) {
396 Expected expected = createDate(year, month, day);
397 if (offsetId != null) {
398 expected.add(ZoneOffset.of(offsetId));
399 }
400 assertParseMatch(DateTimeFormatter.ISO_DATE.parseUnresolved(input, new ParsePosition(0)), expected);
401 }
402 }
403
404 @Test
405 public void test_isoDate_basics() {
406 assertEquals(DateTimeFormatter.ISO_DATE.getChronology(), IsoChronology.INSTANCE);
407 assertEquals(DateTimeFormatter.ISO_DATE.getZone(), null);
408 assertEquals(DateTimeFormatter.ISO_DATE.getResolverStyle(), ResolverStyle.STRICT);
409 }
410
411 //-----------------------------------------------------------------------
412 //-----------------------------------------------------------------------
413 //-----------------------------------------------------------------------
414 @DataProvider(name="sample_isoLocalTime")
415 Object[][] provider_sample_isoLocalTime() {
416 return new Object[][]{
417 {11, null, null, null, null, null, null, DateTimeException.class},
418 {null, 5, null, null, null, null, null, DateTimeException.class},
419 {null, null, 30, null, null, null, null, DateTimeException.class},
420 {null, null, null, 1, null, null, null, DateTimeException.class},
421 {null, null, null, null, "+01:00", null, null, DateTimeException.class},
422 {null, null, null, null, null, "Europe/Paris", null, DateTimeException.class},
423
424 {11, 5, null, null, null, null, "11:05", null},
425 {11, 5, 30, null, null, null, "11:05:30", null},
426 {11, 5, 30, 500000000, null, null, "11:05:30.5", null},
427 {11, 5, 30, 1, null, null, "11:05:30.000000001", null},
428
429 {11, 5, null, null, "+01:00", null, "11:05", null},
430 {11, 5, 30, null, "+01:00", null, "11:05:30", null},
431 {11, 5, 30, 500000000, "+01:00", null, "11:05:30.5", null},
432 {11, 5, 30, 1, "+01:00", null, "11:05:30.000000001", null},
433
434 {11, 5, null, null, "+01:00", "Europe/Paris", "11:05", null},
435 {11, 5, 30, null, "+01:00", "Europe/Paris", "11:05:30", null},
436 {11, 5, 30, 500000000, "+01:00", "Europe/Paris", "11:05:30.5", null},
437 {11, 5, 30, 1, "+01:00", "Europe/Paris", "11:05:30.000000001", null},
438
439 {11, 5, null, null, null, "Europe/Paris", "11:05", null},
440 {11, 5, 30, null, null, "Europe/Paris", "11:05:30", null},
441 {11, 5, 30, 500000000, null, "Europe/Paris", "11:05:30.5", null},
442 {11, 5, 30, 1, null, "Europe/Paris", "11:05:30.000000001", null},
443 };
444 }
445
446 @Test(dataProvider="sample_isoLocalTime")
447 public void test_print_isoLocalTime(
448 Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId,
449 String expected, Class<?> expectedEx) {
450 TemporalAccessor test = buildAccessor(null, null, null, hour, min, sec, nano, offsetId, zoneId);
451 if (expectedEx == null) {
452 assertEquals(DateTimeFormatter.ISO_LOCAL_TIME.format(test), expected);
453 } else {
454 try {
455 DateTimeFormatter.ISO_LOCAL_TIME.format(test);
456 fail();
457 } catch (Exception ex) {
458 assertTrue(expectedEx.isInstance(ex));
459 }
460 }
461 }
462
463 @Test(dataProvider="sample_isoLocalTime")
464 public void test_parse_isoLocalTime(
465 Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId,
466 String input, Class<?> invalid) {
467 if (input != null) {
468 Expected expected = createTime(hour, min, sec, nano);
469 // offset/zone not expected to be parsed
470 assertParseMatch(DateTimeFormatter.ISO_LOCAL_TIME.parseUnresolved(input, new ParsePosition(0)), expected);
471 }
472 }
473
474 @Test
475 public void test_isoLocalTime_basics() {
476 assertEquals(DateTimeFormatter.ISO_LOCAL_TIME.getChronology(), null);
477 assertEquals(DateTimeFormatter.ISO_LOCAL_TIME.getZone(), null);
478 assertEquals(DateTimeFormatter.ISO_LOCAL_TIME.getResolverStyle(), ResolverStyle.STRICT);
479 }
480
481 //-----------------------------------------------------------------------
482 //-----------------------------------------------------------------------
483 //-----------------------------------------------------------------------
484 @DataProvider(name="sample_isoOffsetTime")
485 Object[][] provider_sample_isoOffsetTime() {
486 return new Object[][]{
487 {11, null, null, null, null, null, null, DateTimeException.class},
488 {null, 5, null, null, null, null, null, DateTimeException.class},
489 {null, null, 30, null, null, null, null, DateTimeException.class},
490 {null, null, null, 1, null, null, null, DateTimeException.class},
491 {null, null, null, null, "+01:00", null, null, DateTimeException.class},
492 {null, null, null, null, null, "Europe/Paris", null, DateTimeException.class},
493
494 {11, 5, null, null, null, null, null, DateTimeException.class},
495 {11, 5, 30, null, null, null, null, DateTimeException.class},
496 {11, 5, 30, 500000000, null, null, null, DateTimeException.class},
497 {11, 5, 30, 1, null, null, null, DateTimeException.class},
498
499 {11, 5, null, null, "+01:00", null, "11:05+01:00", null},
500 {11, 5, 30, null, "+01:00", null, "11:05:30+01:00", null},
501 {11, 5, 30, 500000000, "+01:00", null, "11:05:30.5+01:00", null},
502 {11, 5, 30, 1, "+01:00", null, "11:05:30.000000001+01:00", null},
503
504 {11, 5, null, null, "+01:00", "Europe/Paris", "11:05+01:00", null},
505 {11, 5, 30, null, "+01:00", "Europe/Paris", "11:05:30+01:00", null},
506 {11, 5, 30, 500000000, "+01:00", "Europe/Paris", "11:05:30.5+01:00", null},
507 {11, 5, 30, 1, "+01:00", "Europe/Paris", "11:05:30.000000001+01:00", null},
508
509 {11, 5, null, null, null, "Europe/Paris", null, DateTimeException.class},
510 {11, 5, 30, null, null, "Europe/Paris", null, DateTimeException.class},
511 {11, 5, 30, 500000000, null, "Europe/Paris", null, DateTimeException.class},
512 {11, 5, 30, 1, null, "Europe/Paris", null, DateTimeException.class},
513 };
514 }
515
516 @Test(dataProvider="sample_isoOffsetTime")
517 public void test_print_isoOffsetTime(
518 Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId,
519 String expected, Class<?> expectedEx) {
520 TemporalAccessor test = buildAccessor(null, null, null, hour, min, sec, nano, offsetId, zoneId);
521 if (expectedEx == null) {
522 assertEquals(DateTimeFormatter.ISO_OFFSET_TIME.format(test), expected);
523 } else {
524 try {
525 DateTimeFormatter.ISO_OFFSET_TIME.format(test);
526 fail();
527 } catch (Exception ex) {
528 assertTrue(expectedEx.isInstance(ex));
529 }
530 }
531 }
532
533 @Test(dataProvider="sample_isoOffsetTime")
534 public void test_parse_isoOffsetTime(
535 Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId,
536 String input, Class<?> invalid) {
537 if (input != null) {
538 Expected expected = createTime(hour, min, sec, nano);
539 buildCalendrical(expected, offsetId, null); // zoneId is not expected from parse
540 assertParseMatch(DateTimeFormatter.ISO_OFFSET_TIME.parseUnresolved(input, new ParsePosition(0)), expected);
541 }
542 }
543
544 @Test
545 public void test_isoOffsetTime_basics() {
546 assertEquals(DateTimeFormatter.ISO_OFFSET_TIME.getChronology(), null);
547 assertEquals(DateTimeFormatter.ISO_OFFSET_TIME.getZone(), null);
548 assertEquals(DateTimeFormatter.ISO_OFFSET_TIME.getResolverStyle(), ResolverStyle.STRICT);
549 }
550
551 //-----------------------------------------------------------------------
552 //-----------------------------------------------------------------------
553 //-----------------------------------------------------------------------
554 @DataProvider(name="sample_isoTime")
555 Object[][] provider_sample_isoTime() {
556 return new Object[][]{
557 {11, null, null, null, null, null, null, DateTimeException.class},
558 {null, 5, null, null, null, null, null, DateTimeException.class},
559 {null, null, 30, null, null, null, null, DateTimeException.class},
560 {null, null, null, 1, null, null, null, DateTimeException.class},
561 {null, null, null, null, "+01:00", null, null, DateTimeException.class},
562 {null, null, null, null, null, "Europe/Paris", null, DateTimeException.class},
563
564 {11, 5, null, null, null, null, "11:05", null},
565 {11, 5, 30, null, null, null, "11:05:30", null},
566 {11, 5, 30, 500000000, null, null, "11:05:30.5", null},
567 {11, 5, 30, 1, null, null, "11:05:30.000000001", null},
568
569 {11, 5, null, null, "+01:00", null, "11:05+01:00", null},
570 {11, 5, 30, null, "+01:00", null, "11:05:30+01:00", null},
571 {11, 5, 30, 500000000, "+01:00", null, "11:05:30.5+01:00", null},
572 {11, 5, 30, 1, "+01:00", null, "11:05:30.000000001+01:00", null},
573
574 {11, 5, null, null, "+01:00", "Europe/Paris", "11:05+01:00", null},
575 {11, 5, 30, null, "+01:00", "Europe/Paris", "11:05:30+01:00", null},
576 {11, 5, 30, 500000000, "+01:00", "Europe/Paris", "11:05:30.5+01:00", null},
577 {11, 5, 30, 1, "+01:00", "Europe/Paris", "11:05:30.000000001+01:00", null},
578
579 {11, 5, null, null, null, "Europe/Paris", "11:05", null},
580 {11, 5, 30, null, null, "Europe/Paris", "11:05:30", null},
581 {11, 5, 30, 500000000, null, "Europe/Paris", "11:05:30.5", null},
582 {11, 5, 30, 1, null, "Europe/Paris", "11:05:30.000000001", null},
583 };
584 }
585
586 @Test(dataProvider="sample_isoTime")
587 public void test_print_isoTime(
588 Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId,
589 String expected, Class<?> expectedEx) {
590 TemporalAccessor test = buildAccessor(null, null, null, hour, min, sec, nano, offsetId, zoneId);
591 if (expectedEx == null) {
592 assertEquals(DateTimeFormatter.ISO_TIME.format(test), expected);
593 } else {
594 try {
595 DateTimeFormatter.ISO_TIME.format(test);
596 fail();
597 } catch (Exception ex) {
598 assertTrue(expectedEx.isInstance(ex));
599 }
600 }
601 }
602
603 @Test(dataProvider="sample_isoTime")
604 public void test_parse_isoTime(
605 Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId,
606 String input, Class<?> invalid) {
607 if (input != null) {
608 Expected expected = createTime(hour, min, sec, nano);
609 if (offsetId != null) {
610 expected.add(ZoneOffset.of(offsetId));
611 }
612 assertParseMatch(DateTimeFormatter.ISO_TIME.parseUnresolved(input, new ParsePosition(0)), expected);
613 }
614 }
615
616 @Test
617 public void test_isoTime_basics() {
618 assertEquals(DateTimeFormatter.ISO_TIME.getChronology(), null);
619 assertEquals(DateTimeFormatter.ISO_TIME.getZone(), null);
620 assertEquals(DateTimeFormatter.ISO_TIME.getResolverStyle(), ResolverStyle.STRICT);
621 }
622
623 //-----------------------------------------------------------------------
624 //-----------------------------------------------------------------------
625 //-----------------------------------------------------------------------
626 @DataProvider(name="sample_isoLocalDateTime")
627 Object[][] provider_sample_isoLocalDateTime() {
628 return new Object[][]{
629 {2008, null, null, null, null, null, null, null, null, null, DateTimeException.class},
630 {null, 6, null, null, null, null, null, null, null, null, DateTimeException.class},
631 {null, null, 30, null, null, null, null, null, null, null, DateTimeException.class},
632 {null, null, null, 11, null, null, null, null, null, null, DateTimeException.class},
633 {null, null, null, null, 5, null, null, null, null, null, DateTimeException.class},
634 {null, null, null, null, null, null, null, "+01:00", null, null, DateTimeException.class},
635 {null, null, null, null, null, null, null, null, "Europe/Paris", null, DateTimeException.class},
636 {2008, 6, 30, 11, null, null, null, null, null, null, DateTimeException.class},
637 {2008, 6, 30, null, 5, null, null, null, null, null, DateTimeException.class},
638 {2008, 6, null, 11, 5, null, null, null, null, null, DateTimeException.class},
639 {2008, null, 30, 11, 5, null, null, null, null, null, DateTimeException.class},
640 {null, 6, 30, 11, 5, null, null, null, null, null, DateTimeException.class},
641
642 {2008, 6, 30, 11, 5, null, null, null, null, "2008-06-30T11:05", null},
646
647 {2008, 6, 30, 11, 5, null, null, "+01:00", null, "2008-06-30T11:05", null},
648 {2008, 6, 30, 11, 5, 30, null, "+01:00", null, "2008-06-30T11:05:30", null},
649 {2008, 6, 30, 11, 5, 30, 500000000, "+01:00", null, "2008-06-30T11:05:30.5", null},
650 {2008, 6, 30, 11, 5, 30, 1, "+01:00", null, "2008-06-30T11:05:30.000000001", null},
651
652 {2008, 6, 30, 11, 5, null, null, "+01:00", "Europe/Paris", "2008-06-30T11:05", null},
653 {2008, 6, 30, 11, 5, 30, null, "+01:00", "Europe/Paris", "2008-06-30T11:05:30", null},
654 {2008, 6, 30, 11, 5, 30, 500000000, "+01:00", "Europe/Paris", "2008-06-30T11:05:30.5", null},
655 {2008, 6, 30, 11, 5, 30, 1, "+01:00", "Europe/Paris", "2008-06-30T11:05:30.000000001", null},
656
657 {2008, 6, 30, 11, 5, null, null, null, "Europe/Paris", "2008-06-30T11:05", null},
658 {2008, 6, 30, 11, 5, 30, null, null, "Europe/Paris", "2008-06-30T11:05:30", null},
659 {2008, 6, 30, 11, 5, 30, 500000000, null, "Europe/Paris", "2008-06-30T11:05:30.5", null},
660 {2008, 6, 30, 11, 5, 30, 1, null, "Europe/Paris", "2008-06-30T11:05:30.000000001", null},
661
662 {123456, 6, 30, 11, 5, null, null, null, null, "+123456-06-30T11:05", null},
663 };
664 }
665
666 @Test(dataProvider="sample_isoLocalDateTime")
667 public void test_print_isoLocalDateTime(
668 Integer year, Integer month, Integer day,
669 Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId,
670 String expected, Class<?> expectedEx) {
671 TemporalAccessor test = buildAccessor(year, month, day, hour, min, sec, nano, offsetId, zoneId);
672 if (expectedEx == null) {
673 assertEquals(DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(test), expected);
674 } else {
675 try {
676 DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(test);
677 fail();
678 } catch (Exception ex) {
679 assertTrue(expectedEx.isInstance(ex));
680 }
681 }
682 }
683
684 @Test(dataProvider="sample_isoLocalDateTime")
685 public void test_parse_isoLocalDateTime(
686 Integer year, Integer month, Integer day,
687 Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId,
688 String input, Class<?> invalid) {
689 if (input != null) {
690 Expected expected = createDateTime(year, month, day, hour, min, sec, nano);
691 assertParseMatch(DateTimeFormatter.ISO_LOCAL_DATE_TIME.parseUnresolved(input, new ParsePosition(0)), expected);
692 }
693 }
694
695 @Test
696 public void test_isoLocalDateTime_basics() {
697 assertEquals(DateTimeFormatter.ISO_LOCAL_DATE_TIME.getChronology(), IsoChronology.INSTANCE);
698 assertEquals(DateTimeFormatter.ISO_LOCAL_DATE_TIME.getZone(), null);
699 assertEquals(DateTimeFormatter.ISO_LOCAL_DATE_TIME.getResolverStyle(), ResolverStyle.STRICT);
700 }
701
702 //-----------------------------------------------------------------------
703 //-----------------------------------------------------------------------
704 //-----------------------------------------------------------------------
705 @DataProvider(name="sample_isoOffsetDateTime")
706 Object[][] provider_sample_isoOffsetDateTime() {
707 return new Object[][]{
708 {2008, null, null, null, null, null, null, null, null, null, DateTimeException.class},
709 {null, 6, null, null, null, null, null, null, null, null, DateTimeException.class},
710 {null, null, 30, null, null, null, null, null, null, null, DateTimeException.class},
711 {null, null, null, 11, null, null, null, null, null, null, DateTimeException.class},
712 {null, null, null, null, 5, null, null, null, null, null, DateTimeException.class},
713 {null, null, null, null, null, null, null, "+01:00", null, null, DateTimeException.class},
714 {null, null, null, null, null, null, null, null, "Europe/Paris", null, DateTimeException.class},
715 {2008, 6, 30, 11, null, null, null, null, null, null, DateTimeException.class},
716 {2008, 6, 30, null, 5, null, null, null, null, null, DateTimeException.class},
717 {2008, 6, null, 11, 5, null, null, null, null, null, DateTimeException.class},
718 {2008, null, 30, 11, 5, null, null, null, null, null, DateTimeException.class},
719 {null, 6, 30, 11, 5, null, null, null, null, null, DateTimeException.class},
720
721 {2008, 6, 30, 11, 5, null, null, null, null, null, DateTimeException.class},
725
726 {2008, 6, 30, 11, 5, null, null, "+01:00", null, "2008-06-30T11:05+01:00", null},
727 {2008, 6, 30, 11, 5, 30, null, "+01:00", null, "2008-06-30T11:05:30+01:00", null},
728 {2008, 6, 30, 11, 5, 30, 500000000, "+01:00", null, "2008-06-30T11:05:30.5+01:00", null},
729 {2008, 6, 30, 11, 5, 30, 1, "+01:00", null, "2008-06-30T11:05:30.000000001+01:00", null},
730
731 {2008, 6, 30, 11, 5, null, null, "+01:00", "Europe/Paris", "2008-06-30T11:05+01:00", null},
732 {2008, 6, 30, 11, 5, 30, null, "+01:00", "Europe/Paris", "2008-06-30T11:05:30+01:00", null},
733 {2008, 6, 30, 11, 5, 30, 500000000, "+01:00", "Europe/Paris", "2008-06-30T11:05:30.5+01:00", null},
734 {2008, 6, 30, 11, 5, 30, 1, "+01:00", "Europe/Paris", "2008-06-30T11:05:30.000000001+01:00", null},
735
736 {2008, 6, 30, 11, 5, null, null, null, "Europe/Paris", null, DateTimeException.class},
737 {2008, 6, 30, 11, 5, 30, null, null, "Europe/Paris", null, DateTimeException.class},
738 {2008, 6, 30, 11, 5, 30, 500000000, null, "Europe/Paris", null, DateTimeException.class},
739 {2008, 6, 30, 11, 5, 30, 1, null, "Europe/Paris", null, DateTimeException.class},
740
741 {123456, 6, 30, 11, 5, null, null, "+01:00", null, "+123456-06-30T11:05+01:00", null},
742 };
743 }
744
745 @Test(dataProvider="sample_isoOffsetDateTime")
746 public void test_print_isoOffsetDateTime(
747 Integer year, Integer month, Integer day,
748 Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId,
749 String expected, Class<?> expectedEx) {
750 TemporalAccessor test = buildAccessor(year, month, day, hour, min, sec, nano, offsetId, zoneId);
751 if (expectedEx == null) {
752 assertEquals(DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(test), expected);
753 } else {
754 try {
755 DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(test);
756 fail();
757 } catch (Exception ex) {
758 assertTrue(expectedEx.isInstance(ex));
759 }
760 }
761 }
762
763 @Test(dataProvider="sample_isoOffsetDateTime")
764 public void test_parse_isoOffsetDateTime(
765 Integer year, Integer month, Integer day,
766 Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId,
767 String input, Class<?> invalid) {
768 if (input != null) {
769 Expected expected = createDateTime(year, month, day, hour, min, sec, nano);
770 buildCalendrical(expected, offsetId, null); // zone not expected to be parsed
771 assertParseMatch(DateTimeFormatter.ISO_OFFSET_DATE_TIME.parseUnresolved(input, new ParsePosition(0)), expected);
772 }
773 }
774
775 @Test
776 public void test_isoOffsetDateTime_basics() {
777 assertEquals(DateTimeFormatter.ISO_OFFSET_DATE_TIME.getChronology(), IsoChronology.INSTANCE);
778 assertEquals(DateTimeFormatter.ISO_OFFSET_DATE_TIME.getZone(), null);
779 assertEquals(DateTimeFormatter.ISO_OFFSET_DATE_TIME.getResolverStyle(), ResolverStyle.STRICT);
780 }
781
782 //-----------------------------------------------------------------------
783 //-----------------------------------------------------------------------
784 //-----------------------------------------------------------------------
785 @DataProvider(name="sample_isoZonedDateTime")
786 Object[][] provider_sample_isoZonedDateTime() {
787 return new Object[][]{
788 {2008, null, null, null, null, null, null, null, null, null, DateTimeException.class},
789 {null, 6, null, null, null, null, null, null, null, null, DateTimeException.class},
790 {null, null, 30, null, null, null, null, null, null, null, DateTimeException.class},
791 {null, null, null, 11, null, null, null, null, null, null, DateTimeException.class},
792 {null, null, null, null, 5, null, null, null, null, null, DateTimeException.class},
793 {null, null, null, null, null, null, null, "+01:00", null, null, DateTimeException.class},
794 {null, null, null, null, null, null, null, null, "Europe/Paris", null, DateTimeException.class},
795 {2008, 6, 30, 11, null, null, null, null, null, null, DateTimeException.class},
796 {2008, 6, 30, null, 5, null, null, null, null, null, DateTimeException.class},
797 {2008, 6, null, 11, 5, null, null, null, null, null, DateTimeException.class},
798 {2008, null, 30, 11, 5, null, null, null, null, null, DateTimeException.class},
799 {null, 6, 30, 11, 5, null, null, null, null, null, DateTimeException.class},
800
801 {2008, 6, 30, 11, 5, null, null, null, null, null, DateTimeException.class},
814 {2008, 6, 30, 11, 5, 30, null, "+01:00", "+01:00", "2008-06-30T11:05:30+01:00", null},
815 {2008, 6, 30, 11, 5, 30, 500000000, "+01:00", "+01:00", "2008-06-30T11:05:30.5+01:00", null},
816 {2008, 6, 30, 11, 5, 30, 1, "+01:00", "+01:00", "2008-06-30T11:05:30.000000001+01:00", null},
817
818 // ZonedDateTime with ZoneId of ZoneRegion
819 {2008, 6, 30, 11, 5, null, null, "+01:00", "Europe/Paris", "2008-06-30T11:05+01:00[Europe/Paris]", null},
820 {2008, 6, 30, 11, 5, 30, null, "+01:00", "Europe/Paris", "2008-06-30T11:05:30+01:00[Europe/Paris]", null},
821 {2008, 6, 30, 11, 5, 30, 500000000, "+01:00", "Europe/Paris", "2008-06-30T11:05:30.5+01:00[Europe/Paris]", null},
822 {2008, 6, 30, 11, 5, 30, 1, "+01:00", "Europe/Paris", "2008-06-30T11:05:30.000000001+01:00[Europe/Paris]", null},
823
824 // offset required
825 {2008, 6, 30, 11, 5, null, null, null, "Europe/Paris", null, DateTimeException.class},
826 {2008, 6, 30, 11, 5, 30, null, null, "Europe/Paris", null, DateTimeException.class},
827 {2008, 6, 30, 11, 5, 30, 500000000, null, "Europe/Paris", null, DateTimeException.class},
828 {2008, 6, 30, 11, 5, 30, 1, null, "Europe/Paris", null, DateTimeException.class},
829
830 {123456, 6, 30, 11, 5, null, null, "+01:00", "Europe/Paris", "+123456-06-30T11:05+01:00[Europe/Paris]", null},
831 };
832 }
833
834 @Test(dataProvider="sample_isoZonedDateTime")
835 public void test_print_isoZonedDateTime(
836 Integer year, Integer month, Integer day,
837 Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId,
838 String expected, Class<?> expectedEx) {
839 TemporalAccessor test = buildAccessor(year, month, day, hour, min, sec, nano, offsetId, zoneId);
840 if (expectedEx == null) {
841 assertEquals(DateTimeFormatter.ISO_ZONED_DATE_TIME.format(test), expected);
842 } else {
843 try {
844 DateTimeFormatter.ISO_ZONED_DATE_TIME.format(test);
845 fail(test.toString());
846 } catch (Exception ex) {
847 assertTrue(expectedEx.isInstance(ex));
848 }
849 }
850 }
851
852 @Test(dataProvider="sample_isoZonedDateTime")
853 public void test_parse_isoZonedDateTime(
854 Integer year, Integer month, Integer day,
855 Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId,
856 String input, Class<?> invalid) {
857 if (input != null) {
858 Expected expected = createDateTime(year, month, day, hour, min, sec, nano);
859 if (offsetId.equals(zoneId)) {
860 buildCalendrical(expected, offsetId, null);
861 } else {
862 buildCalendrical(expected, offsetId, zoneId);
863 }
864 assertParseMatch(DateTimeFormatter.ISO_ZONED_DATE_TIME.parseUnresolved(input, new ParsePosition(0)), expected);
865 }
866 }
867
868 @Test
869 public void test_isoZonedDateTime_basics() {
870 assertEquals(DateTimeFormatter.ISO_ZONED_DATE_TIME.getChronology(), IsoChronology.INSTANCE);
871 assertEquals(DateTimeFormatter.ISO_ZONED_DATE_TIME.getZone(), null);
872 assertEquals(DateTimeFormatter.ISO_ZONED_DATE_TIME.getResolverStyle(), ResolverStyle.STRICT);
873 }
874
875 //-----------------------------------------------------------------------
876 //-----------------------------------------------------------------------
877 //-----------------------------------------------------------------------
878 @DataProvider(name="sample_isoDateTime")
879 Object[][] provider_sample_isoDateTime() {
880 return new Object[][]{
881 {2008, null, null, null, null, null, null, null, null, null, DateTimeException.class},
882 {null, 6, null, null, null, null, null, null, null, null, DateTimeException.class},
883 {null, null, 30, null, null, null, null, null, null, null, DateTimeException.class},
884 {null, null, null, 11, null, null, null, null, null, null, DateTimeException.class},
885 {null, null, null, null, 5, null, null, null, null, null, DateTimeException.class},
886 {null, null, null, null, null, null, null, "+01:00", null, null, DateTimeException.class},
887 {null, null, null, null, null, null, null, null, "Europe/Paris", null, DateTimeException.class},
888 {2008, 6, 30, 11, null, null, null, null, null, null, DateTimeException.class},
889 {2008, 6, 30, null, 5, null, null, null, null, null, DateTimeException.class},
890 {2008, 6, null, 11, 5, null, null, null, null, null, DateTimeException.class},
891 {2008, null, 30, 11, 5, null, null, null, null, null, DateTimeException.class},
892 {null, 6, 30, 11, 5, null, null, null, null, null, DateTimeException.class},
893
894 {2008, 6, 30, 11, 5, null, null, null, null, "2008-06-30T11:05", null},
898
899 {2008, 6, 30, 11, 5, null, null, "+01:00", null, "2008-06-30T11:05+01:00", null},
900 {2008, 6, 30, 11, 5, 30, null, "+01:00", null, "2008-06-30T11:05:30+01:00", null},
901 {2008, 6, 30, 11, 5, 30, 500000000, "+01:00", null, "2008-06-30T11:05:30.5+01:00", null},
902 {2008, 6, 30, 11, 5, 30, 1, "+01:00", null, "2008-06-30T11:05:30.000000001+01:00", null},
903
904 {2008, 6, 30, 11, 5, null, null, "+01:00", "Europe/Paris", "2008-06-30T11:05+01:00[Europe/Paris]", null},
905 {2008, 6, 30, 11, 5, 30, null, "+01:00", "Europe/Paris", "2008-06-30T11:05:30+01:00[Europe/Paris]", null},
906 {2008, 6, 30, 11, 5, 30, 500000000, "+01:00", "Europe/Paris", "2008-06-30T11:05:30.5+01:00[Europe/Paris]", null},
907 {2008, 6, 30, 11, 5, 30, 1, "+01:00", "Europe/Paris", "2008-06-30T11:05:30.000000001+01:00[Europe/Paris]", null},
908
909 {2008, 6, 30, 11, 5, null, null, null, "Europe/Paris", "2008-06-30T11:05", null},
910 {2008, 6, 30, 11, 5, 30, null, null, "Europe/Paris", "2008-06-30T11:05:30", null},
911 {2008, 6, 30, 11, 5, 30, 500000000, null, "Europe/Paris", "2008-06-30T11:05:30.5", null},
912 {2008, 6, 30, 11, 5, 30, 1, null, "Europe/Paris", "2008-06-30T11:05:30.000000001", null},
913
914 {123456, 6, 30, 11, 5, null, null, null, null, "+123456-06-30T11:05", null},
915 };
916 }
917
918 @Test(dataProvider="sample_isoDateTime")
919 public void test_print_isoDateTime(
920 Integer year, Integer month, Integer day,
921 Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId,
922 String expected, Class<?> expectedEx) {
923 TemporalAccessor test = buildAccessor(year, month, day, hour, min, sec, nano, offsetId, zoneId);
924 if (expectedEx == null) {
925 assertEquals(DateTimeFormatter.ISO_DATE_TIME.format(test), expected);
926 } else {
927 try {
928 DateTimeFormatter.ISO_DATE_TIME.format(test);
929 fail();
930 } catch (Exception ex) {
931 assertTrue(expectedEx.isInstance(ex));
932 }
933 }
934 }
935
936 @Test(dataProvider="sample_isoDateTime")
937 public void test_parse_isoDateTime(
938 Integer year, Integer month, Integer day,
939 Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId,
940 String input, Class<?> invalid) {
941 if (input != null) {
942 Expected expected = createDateTime(year, month, day, hour, min, sec, nano);
943 if (offsetId != null) {
944 expected.add(ZoneOffset.of(offsetId));
945 if (zoneId != null) {
946 expected.zone = ZoneId.of(zoneId);
947 }
948 }
949 assertParseMatch(DateTimeFormatter.ISO_DATE_TIME.parseUnresolved(input, new ParsePosition(0)), expected);
950 }
951 }
952
953 @Test
954 public void test_isoDateTime_basics() {
955 assertEquals(DateTimeFormatter.ISO_DATE_TIME.getChronology(), IsoChronology.INSTANCE);
956 assertEquals(DateTimeFormatter.ISO_DATE_TIME.getZone(), null);
957 assertEquals(DateTimeFormatter.ISO_DATE_TIME.getResolverStyle(), ResolverStyle.STRICT);
958 }
959
960 //-----------------------------------------------------------------------
961 //-----------------------------------------------------------------------
962 //-----------------------------------------------------------------------
963 @Test
964 public void test_print_isoOrdinalDate() {
965 TemporalAccessor test = buildAccessor(LocalDateTime.of(2008, 6, 3, 11, 5, 30), null, null);
966 assertEquals(DateTimeFormatter.ISO_ORDINAL_DATE.format(test), "2008-155");
967 }
968
969 @Test
970 public void test_print_isoOrdinalDate_offset() {
971 TemporalAccessor test = buildAccessor(LocalDateTime.of(2008, 6, 3, 11, 5, 30), "Z", null);
972 assertEquals(DateTimeFormatter.ISO_ORDINAL_DATE.format(test), "2008-155Z");
973 }
974
975 @Test
976 public void test_print_isoOrdinalDate_zoned() {
977 TemporalAccessor test = buildAccessor(LocalDateTime.of(2008, 6, 3, 11, 5, 30), "+02:00", "Europe/Paris");
978 assertEquals(DateTimeFormatter.ISO_ORDINAL_DATE.format(test), "2008-155+02:00");
979 }
980
981 @Test
982 public void test_print_isoOrdinalDate_zoned_largeYear() {
983 TemporalAccessor test = buildAccessor(LocalDateTime.of(123456, 6, 3, 11, 5, 30), "Z", null);
984 assertEquals(DateTimeFormatter.ISO_ORDINAL_DATE.format(test), "+123456-155Z");
985 }
986
987 @Test
988 public void test_print_isoOrdinalDate_fields() {
989 // mock for testing that does not fully comply with TemporalAccessor contract
990 TemporalAccessor test = new TemporalAccessor() {
991 @Override
992 public boolean isSupported(TemporalField field) {
993 return field == YEAR || field == DAY_OF_YEAR;
994 }
995 @Override
996 public long getLong(TemporalField field) {
997 if (field == YEAR) {
998 return 2008;
999 }
1000 if (field == DAY_OF_YEAR) {
1001 return 231;
1002 }
1003 throw new DateTimeException("Unsupported");
1004 }
1005 };
1006 assertEquals(DateTimeFormatter.ISO_ORDINAL_DATE.format(test), "2008-231");
1007 }
1008
1009 @Test(expectedExceptions=DateTimeException.class)
1010 public void test_print_isoOrdinalDate_missingField() {
1011 TemporalAccessor test = Year.of(2008);
1012 DateTimeFormatter.ISO_ORDINAL_DATE.format(test);
1013 }
1014
1015 //-----------------------------------------------------------------------
1016 @Test
1017 public void test_parse_isoOrdinalDate() {
1018 Expected expected = new Expected(YEAR, 2008, DAY_OF_YEAR, 123);
1019 assertParseMatch(DateTimeFormatter.ISO_ORDINAL_DATE.parseUnresolved("2008-123", new ParsePosition(0)), expected);
1020 }
1021
1022 @Test
1023 public void test_parse_isoOrdinalDate_largeYear() {
1024 Expected expected = new Expected(YEAR, 123456, DAY_OF_YEAR, 123);
1025 assertParseMatch(DateTimeFormatter.ISO_ORDINAL_DATE.parseUnresolved("+123456-123", new ParsePosition(0)), expected);
1026 }
1027
1028 @Test
1029 public void test_isoOrdinalDate_basics() {
1030 assertEquals(DateTimeFormatter.ISO_ORDINAL_DATE.getChronology(), IsoChronology.INSTANCE);
1031 assertEquals(DateTimeFormatter.ISO_ORDINAL_DATE.getZone(), null);
1032 assertEquals(DateTimeFormatter.ISO_ORDINAL_DATE.getResolverStyle(), ResolverStyle.STRICT);
1033 }
1034
1035 //-----------------------------------------------------------------------
1036 //-----------------------------------------------------------------------
1037 //-----------------------------------------------------------------------
1038 @Test
1039 public void test_print_basicIsoDate() {
1040 TemporalAccessor test = buildAccessor(LocalDateTime.of(2008, 6, 3, 11, 5, 30), null, null);
1041 assertEquals(DateTimeFormatter.BASIC_ISO_DATE.format(test), "20080603");
1042 }
1043
1044 @Test
1045 public void test_print_basicIsoDate_offset() {
1046 TemporalAccessor test = buildAccessor(LocalDateTime.of(2008, 6, 3, 11, 5, 30), "Z", null);
1047 assertEquals(DateTimeFormatter.BASIC_ISO_DATE.format(test), "20080603Z");
1048 }
1049
1050 @Test
1051 public void test_print_basicIsoDate_zoned() {
1052 TemporalAccessor test = buildAccessor(LocalDateTime.of(2008, 6, 3, 11, 5, 30), "+02:00", "Europe/Paris");
1053 assertEquals(DateTimeFormatter.BASIC_ISO_DATE.format(test), "20080603+0200");
1054 }
1055
1056 @Test(expectedExceptions=DateTimeException.class)
1057 public void test_print_basicIsoDate_largeYear() {
1058 TemporalAccessor test = buildAccessor(LocalDateTime.of(123456, 6, 3, 11, 5, 30), "Z", null);
1059 DateTimeFormatter.BASIC_ISO_DATE.format(test);
1060 }
1061
1062 @Test
1063 public void test_print_basicIsoDate_fields() {
1064 TemporalAccessor test = buildAccessor(LocalDate.of(2008, 6, 3), null, null);
1065 assertEquals(DateTimeFormatter.BASIC_ISO_DATE.format(test), "20080603");
1066 }
1067
1068 @Test(expectedExceptions=DateTimeException.class)
1069 public void test_print_basicIsoDate_missingField() {
1070 TemporalAccessor test = YearMonth.of(2008, 6);
1071 DateTimeFormatter.BASIC_ISO_DATE.format(test);
1072 }
1073
1074 //-----------------------------------------------------------------------
1075 @Test
1076 public void test_parse_basicIsoDate() {
1077 LocalDate expected = LocalDate.of(2008, 6, 3);
1078 assertEquals(DateTimeFormatter.BASIC_ISO_DATE.parse("20080603", LocalDate::from), expected);
1079 }
1080
1081 @Test(expectedExceptions=DateTimeParseException.class)
1082 public void test_parse_basicIsoDate_largeYear() {
1083 try {
1084 LocalDate expected = LocalDate.of(123456, 6, 3);
1085 assertEquals(DateTimeFormatter.BASIC_ISO_DATE.parse("+1234560603", LocalDate::from), expected);
1086 } catch (DateTimeParseException ex) {
1087 assertEquals(ex.getErrorIndex(), 0);
1088 assertEquals(ex.getParsedString(), "+1234560603");
1089 throw ex;
1090 }
1091 }
1092
1093 @Test
1094 public void test_basicIsoDate_basics() {
1095 assertEquals(DateTimeFormatter.BASIC_ISO_DATE.getChronology(), IsoChronology.INSTANCE);
1096 assertEquals(DateTimeFormatter.BASIC_ISO_DATE.getZone(), null);
1097 assertEquals(DateTimeFormatter.BASIC_ISO_DATE.getResolverStyle(), ResolverStyle.STRICT);
1098 }
1099
1100 //-----------------------------------------------------------------------
1101 //-----------------------------------------------------------------------
1102 //-----------------------------------------------------------------------
1103 @DataProvider(name="weekDate")
1104 Iterator<Object[]> weekDate() {
1105 return new Iterator<Object[]>() {
1106 private ZonedDateTime date = ZonedDateTime.of(LocalDateTime.of(2003, 12, 29, 11, 5, 30), ZoneId.of("Europe/Paris"));
1107 private ZonedDateTime endDate = date.withYear(2005).withMonth(1).withDayOfMonth(2);
1108 private int week = 1;
1109 private int day = 1;
1110
1111 public boolean hasNext() {
1112 return !date.isAfter(endDate);
1113 }
1114 public Object[] next() {
1115 StringBuilder sb = new StringBuilder("2004-W");
1116 if (week < 10) {
1117 sb.append('0');
1118 }
1119 sb.append(week).append('-').append(day).append(date.getOffset());
1120 Object[] ret = new Object[] {date, sb.toString()};
1121 date = date.plusDays(1);
1122 day += 1;
1123 if (day == 8) {
1124 day = 1;
1125 week++;
1126 }
1127 return ret;
1128 }
1129 public void remove() {
1130 throw new UnsupportedOperationException();
1131 }
1132 };
1133 }
1134
1135 @Test(dataProvider="weekDate")
1136 public void test_print_isoWeekDate(TemporalAccessor test, String expected) {
1137 assertEquals(DateTimeFormatter.ISO_WEEK_DATE.format(test), expected);
1138 }
1139
1140 @Test
1141 public void test_print_isoWeekDate_zoned_largeYear() {
1142 TemporalAccessor test = buildAccessor(LocalDateTime.of(123456, 6, 3, 11, 5, 30), "Z", null);
1143 assertEquals(DateTimeFormatter.ISO_WEEK_DATE.format(test), "+123456-W23-2Z");
1144 }
1145
1146 @Test
1147 public void test_print_isoWeekDate_fields() {
1148 TemporalAccessor test = buildAccessor(LocalDate.of(2004, 1, 27), null, null);
1149 assertEquals(DateTimeFormatter.ISO_WEEK_DATE.format(test), "2004-W05-2");
1150 }
1151
1152 @Test(expectedExceptions=DateTimeException.class)
1153 public void test_print_isoWeekDate_missingField() {
1154 TemporalAccessor test = YearMonth.of(2008, 6);
1155 DateTimeFormatter.ISO_WEEK_DATE.format(test);
1156 }
1157
1158 //-----------------------------------------------------------------------
1159 @Test
1160 public void test_parse_weekDate() {
1161 LocalDate expected = LocalDate.of(2004, 1, 28);
1162 assertEquals(DateTimeFormatter.ISO_WEEK_DATE.parse("2004-W05-3", LocalDate::from), expected);
1163 }
1164
1165 @Test
1166 public void test_parse_weekDate_largeYear() {
1167 TemporalAccessor parsed = DateTimeFormatter.ISO_WEEK_DATE.parseUnresolved("+123456-W04-5", new ParsePosition(0));
1168 assertEquals(parsed.getLong(IsoFields.WEEK_BASED_YEAR), 123456L);
1169 assertEquals(parsed.getLong(IsoFields.WEEK_OF_WEEK_BASED_YEAR), 4L);
1170 assertEquals(parsed.getLong(DAY_OF_WEEK), 5L);
1171 }
1172
1173 @Test
1174 public void test_isoWeekDate_basics() {
1175 assertEquals(DateTimeFormatter.ISO_WEEK_DATE.getChronology(), IsoChronology.INSTANCE);
1176 assertEquals(DateTimeFormatter.ISO_WEEK_DATE.getZone(), null);
1177 assertEquals(DateTimeFormatter.ISO_WEEK_DATE.getResolverStyle(), ResolverStyle.STRICT);
1178 }
1179
1180 //-----------------------------------------------------------------------
1181 //-----------------------------------------------------------------------
1182 //-----------------------------------------------------------------------
1183 @Test
1184 public void test_isoInstant_basics() {
1185 assertEquals(DateTimeFormatter.ISO_INSTANT.getChronology(), null);
1186 assertEquals(DateTimeFormatter.ISO_INSTANT.getZone(), null);
1187 assertEquals(DateTimeFormatter.ISO_INSTANT.getResolverStyle(), ResolverStyle.STRICT);
1188 }
1189
1190 //-----------------------------------------------------------------------
1191 //-----------------------------------------------------------------------
1192 //-----------------------------------------------------------------------
1193 @DataProvider(name="rfc")
1194 Object[][] data_rfc() {
1195 return new Object[][] {
1196 {LocalDateTime.of(2008, 6, 3, 11, 5, 30), "Z", "Tue, 3 Jun 2008 11:05:30 GMT"},
1197 {LocalDateTime.of(2008, 6, 30, 11, 5, 30), "Z", "Mon, 30 Jun 2008 11:05:30 GMT"},
1198 {LocalDateTime.of(2008, 6, 3, 11, 5, 30), "+02:00", "Tue, 3 Jun 2008 11:05:30 +0200"},
1199 {LocalDateTime.of(2008, 6, 30, 11, 5, 30), "-03:00", "Mon, 30 Jun 2008 11:05:30 -0300"},
1200 };
1201 }
1202
1203 @Test(dataProvider="rfc")
1204 public void test_print_rfc1123(LocalDateTime base, String offsetId, String expected) {
1205 TemporalAccessor test = buildAccessor(base, offsetId, null);
1206 assertEquals(DateTimeFormatter.RFC_1123_DATE_TIME.format(test), expected);
1207 }
1208
1209 @Test(dataProvider="rfc")
1210 public void test_print_rfc1123_french(LocalDateTime base, String offsetId, String expected) {
1211 TemporalAccessor test = buildAccessor(base, offsetId, null);
1212 assertEquals(DateTimeFormatter.RFC_1123_DATE_TIME.withLocale(Locale.FRENCH).format(test), expected);
1213 }
1214
1215 @Test(expectedExceptions=DateTimeException.class)
1216 public void test_print_rfc1123_missingField() {
1217 TemporalAccessor test = YearMonth.of(2008, 6);
1218 DateTimeFormatter.RFC_1123_DATE_TIME.format(test);
1219 }
1220
1221 @Test
1222 public void test_rfc1123_basics() {
1223 assertEquals(DateTimeFormatter.RFC_1123_DATE_TIME.getChronology(), IsoChronology.INSTANCE);
1224 assertEquals(DateTimeFormatter.RFC_1123_DATE_TIME.getZone(), null);
1225 assertEquals(DateTimeFormatter.RFC_1123_DATE_TIME.getResolverStyle(), ResolverStyle.SMART);
1226 }
1227
1228 //-----------------------------------------------------------------------
1229 //-----------------------------------------------------------------------
1230 //-----------------------------------------------------------------------
1231 private Expected createDate(Integer year, Integer month, Integer day) {
1232 Expected test = new Expected();
1233 if (year != null) {
1234 test.fieldValues.put(YEAR, (long) year);
1235 }
1236 if (month != null) {
1237 test.fieldValues.put(MONTH_OF_YEAR, (long) month);
1238 }
1239 if (day != null) {
1240 test.fieldValues.put(DAY_OF_MONTH, (long) day);
1241 }
1242 return test;
1243 }
1244
1245 private Expected createTime(Integer hour, Integer min, Integer sec, Integer nano) {
1246 Expected test = new Expected();
1247 if (hour != null) {
1331 mock.setFields(base);
1332 mock.setOffset(offsetId);
1333 mock.setZone(zoneId);
1334 return mock;
1335 }
1336
1337 private void buildCalendrical(Expected expected, String offsetId, String zoneId) {
1338 if (offsetId != null) {
1339 expected.add(ZoneOffset.of(offsetId));
1340 }
1341 if (zoneId != null) {
1342 expected.zone = ZoneId.of(zoneId);
1343 }
1344 }
1345
1346 private void assertParseMatch(TemporalAccessor parsed, Expected expected) {
1347 for (TemporalField field : expected.fieldValues.keySet()) {
1348 assertEquals(parsed.isSupported(field), true);
1349 parsed.getLong(field);
1350 }
1351 assertEquals(parsed.query(TemporalQuery.chronology()), expected.chrono);
1352 assertEquals(parsed.query(TemporalQuery.zoneId()), expected.zone);
1353 }
1354
1355 //-------------------------------------------------------------------------
1356 static class MockAccessor implements TemporalAccessor {
1357 Map<TemporalField, Long> fields = new HashMap<>();
1358 ZoneId zoneId;
1359
1360 void setFields(LocalDate dt) {
1361 if (dt != null) {
1362 fields.put(YEAR, (long) dt.getYear());
1363 fields.put(MONTH_OF_YEAR, (long) dt.getMonthValue());
1364 fields.put(DAY_OF_MONTH, (long) dt.getDayOfMonth());
1365 fields.put(DAY_OF_YEAR, (long) dt.getDayOfYear());
1366 fields.put(DAY_OF_WEEK, (long) dt.getDayOfWeek().getValue());
1367 fields.put(IsoFields.WEEK_BASED_YEAR, dt.getLong(IsoFields.WEEK_BASED_YEAR));
1368 fields.put(IsoFields.WEEK_OF_WEEK_BASED_YEAR, dt.getLong(IsoFields.WEEK_OF_WEEK_BASED_YEAR));
1369 }
1370 }
1371
1372 void setFields(LocalDateTime dt) {
1373 if (dt != null) {
1374 fields.put(YEAR, (long) dt.getYear());
1375 fields.put(MONTH_OF_YEAR, (long) dt.getMonthValue());
1397 }
1398 }
1399
1400 @Override
1401 public boolean isSupported(TemporalField field) {
1402 return fields.containsKey(field);
1403 }
1404
1405 @Override
1406 public long getLong(TemporalField field) {
1407 try {
1408 return fields.get(field);
1409 } catch (NullPointerException ex) {
1410 throw new DateTimeException("Field missing: " + field);
1411 }
1412 }
1413
1414 @SuppressWarnings("unchecked")
1415 @Override
1416 public <R> R query(TemporalQuery<R> query) {
1417 if (query == TemporalQuery.zoneId()) {
1418 return (R) zoneId;
1419 }
1420 return TemporalAccessor.super.query(query);
1421 }
1422
1423 @Override
1424 public String toString() {
1425 return fields + (zoneId != null ? " " + zoneId : "");
1426 }
1427 }
1428
1429 //-----------------------------------------------------------------------
1430 static class Expected {
1431 Map<TemporalField, Long> fieldValues = new HashMap<>();
1432 ZoneId zone;
1433 Chronology chrono;
1434
1435 Expected() {
1436 }
1437
|