test/java/time/tck/java/time/format/TCKDateTimeFormatters.java

Print this page




  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