test/java/time/tck/java/time/format/TCKDateTimeFormatter.java
Print this page
*** 58,67 ****
--- 58,69 ----
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package tck.java.time.format;
import static java.time.temporal.ChronoField.DAY_OF_MONTH;
+ import static java.time.temporal.ChronoField.DAY_OF_WEEK;
+ import static java.time.temporal.ChronoField.DAY_OF_YEAR;
import static java.time.temporal.ChronoField.HOUR_OF_DAY;
import static java.time.temporal.ChronoField.MONTH_OF_YEAR;
import static java.time.temporal.ChronoField.YEAR;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNull;
*** 69,110 ****
import static org.testng.Assert.fail;
import java.text.Format;
import java.text.ParseException;
import java.text.ParsePosition;
- import java.util.Locale;
-
import java.time.DateTimeException;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.chrono.ThaiBuddhistChronology;
import java.time.format.DateTimeFormatSymbols;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.DateTimeParseException;
import java.time.format.SignStyle;
! import java.time.chrono.Chronology;
! import java.time.chrono.IsoChronology;
! import java.time.OffsetDateTime;
! import java.time.OffsetTime;
! import java.time.temporal.Temporal;
import java.time.temporal.TemporalAccessor;
import java.time.temporal.TemporalQuery;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
/**
* Test DateTimeFormatter.
*/
! @Test(groups={"tck"})
public class TCKDateTimeFormatter {
private static final ZoneOffset OFFSET_PONE = ZoneOffset.ofHours(1);
private static final ZoneOffset OFFSET_PTHREE = ZoneOffset.ofHours(3);
private static final ZoneId ZONE_PARIS = ZoneId.of("Europe/Paris");
--- 71,120 ----
import static org.testng.Assert.fail;
import java.text.Format;
import java.text.ParseException;
import java.text.ParsePosition;
import java.time.DateTimeException;
+ import java.time.DayOfWeek;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
+ import java.time.OffsetDateTime;
+ import java.time.OffsetTime;
+ import java.time.YearMonth;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
+ import java.time.chrono.ChronoZonedDateTime;
+ import java.time.chrono.Chronology;
+ import java.time.chrono.IsoChronology;
import java.time.chrono.ThaiBuddhistChronology;
+ import java.time.chrono.ThaiBuddhistDate;
import java.time.format.DateTimeFormatSymbols;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.DateTimeParseException;
import java.time.format.SignStyle;
! import java.time.temporal.IsoFields;
import java.time.temporal.TemporalAccessor;
+ import java.time.temporal.TemporalField;
import java.time.temporal.TemporalQuery;
+ import java.time.temporal.UnsupportedTemporalTypeException;
+ import java.util.Arrays;
+ import java.util.HashSet;
+ import java.util.Locale;
+ import java.util.Set;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
/**
* Test DateTimeFormatter.
*/
! @Test
public class TCKDateTimeFormatter {
private static final ZoneOffset OFFSET_PONE = ZoneOffset.ofHours(1);
private static final ZoneOffset OFFSET_PTHREE = ZoneOffset.ofHours(3);
private static final ZoneId ZONE_PARIS = ZoneId.of("Europe/Paris");
*** 158,248 ****
test = test.withZone(null);
assertEquals(test.getZone(), null);
}
//-----------------------------------------------------------------------
! // print
//-----------------------------------------------------------------------
! @DataProvider(name="print")
! Object[][] data_format() {
LocalDate ld = LocalDate.of(2008, 6, 30);
LocalTime lt = LocalTime.of(11, 30);
LocalDateTime ldt = LocalDateTime.of(2008, 6, 30, 11, 30);
OffsetTime ot = OffsetTime.of(LocalTime.of(11, 30), OFFSET_PONE);
OffsetDateTime odt = OffsetDateTime.of(LocalDateTime.of(2008, 6, 30, 11, 30), OFFSET_PONE);
ZonedDateTime zdt = ZonedDateTime.of(LocalDateTime.of(2008, 6, 30, 11, 30), ZONE_PARIS);
Instant instant = Instant.ofEpochSecond(3600);
return new Object[][] {
! {null, null, ld, "2008::"},
! {null, null, lt, ":11:"},
! {null, null, ldt, "2008:11:"},
! {null, null, ot, ":11:+01:00"},
! {null, null, odt, "2008:11:+01:00"},
! {null, null, zdt, "2008:11:+02:00Europe/Paris"},
! {null, null, instant, "::"},
!
! {null, ZONE_PARIS, ld, "2008::"},
! {null, ZONE_PARIS, lt, ":11:"},
! {null, ZONE_PARIS, ldt, "2008:11:"},
! {null, ZONE_PARIS, ot, ":11:+01:00"},
! {null, ZONE_PARIS, odt, "2008:12:+02:00Europe/Paris"},
! {null, ZONE_PARIS, zdt, "2008:11:+02:00Europe/Paris"},
! {null, ZONE_PARIS, instant, "1970:02:+01:00Europe/Paris"},
!
! {null, OFFSET_PTHREE, ld, "2008::"},
! {null, OFFSET_PTHREE, lt, ":11:"},
! {null, OFFSET_PTHREE, ldt, "2008:11:"},
! {null, OFFSET_PTHREE, ot, ":11:+01:00"},
! {null, OFFSET_PTHREE, odt, "2008:13:+03:00"},
! {null, OFFSET_PTHREE, zdt, "2008:12:+03:00"},
! {null, OFFSET_PTHREE, instant, "1970:04:+03:00"},
!
! {ThaiBuddhistChronology.INSTANCE, null, ld, "2551::"},
! {ThaiBuddhistChronology.INSTANCE, null, lt, ":11:"},
! {ThaiBuddhistChronology.INSTANCE, null, ldt, "2551:11:"},
! {ThaiBuddhistChronology.INSTANCE, null, ot, ":11:+01:00"},
! {ThaiBuddhistChronology.INSTANCE, null, odt, "2551:11:+01:00"},
! {ThaiBuddhistChronology.INSTANCE, null, zdt, "2551:11:+02:00Europe/Paris"},
! {ThaiBuddhistChronology.INSTANCE, null, instant, "::"},
!
! {ThaiBuddhistChronology.INSTANCE, ZONE_PARIS, ld, "2551::"},
! {ThaiBuddhistChronology.INSTANCE, ZONE_PARIS, lt, ":11:"},
! {ThaiBuddhistChronology.INSTANCE, ZONE_PARIS, ldt, "2551:11:"},
! {ThaiBuddhistChronology.INSTANCE, ZONE_PARIS, ot, ":11:+01:00"},
! {ThaiBuddhistChronology.INSTANCE, ZONE_PARIS, odt, "2551:12:+02:00Europe/Paris"},
! {ThaiBuddhistChronology.INSTANCE, ZONE_PARIS, zdt, "2551:11:+02:00Europe/Paris"},
! {ThaiBuddhistChronology.INSTANCE, ZONE_PARIS, instant, "1970:02:+01:00Europe/Paris"},
};
}
! @Test(dataProvider="print")
! public void test_print_Temporal(Chronology overrideChrono, ZoneId overrideZone, Temporal temporal, String expected) {
DateTimeFormatter test = new DateTimeFormatterBuilder()
.optionalStart().appendValue(YEAR, 4).optionalEnd()
.appendLiteral(':').optionalStart().appendValue(HOUR_OF_DAY, 2).optionalEnd()
! .appendLiteral(':').optionalStart().appendOffsetId().optionalStart().appendZoneRegionId().optionalEnd().optionalEnd()
.toFormatter(Locale.ENGLISH)
.withChronology(overrideChrono).withZone(overrideZone);
String result = test.format(temporal);
assertEquals(result, expected);
}
@Test
! public void test_print_Temporal_simple() throws Exception {
DateTimeFormatter test = fmt.withLocale(Locale.ENGLISH).withSymbols(DateTimeFormatSymbols.STANDARD);
String result = test.format(LocalDate.of(2008, 6, 30));
assertEquals(result, "ONE30");
}
! @Test(expectedExceptions=DateTimeException.class)
! public void test_print_Temporal_noSuchField() throws Exception {
DateTimeFormatter test = fmt.withLocale(Locale.ENGLISH).withSymbols(DateTimeFormatSymbols.STANDARD);
test.format(LocalTime.of(11, 30));
}
! @Test(expectedExceptions=NullPointerException.class)
! public void test_print_Temporal_null() throws Exception {
DateTimeFormatter test = fmt.withLocale(Locale.ENGLISH).withSymbols(DateTimeFormatSymbols.STANDARD);
test.format((TemporalAccessor) null);
}
//-----------------------------------------------------------------------
--- 168,412 ----
test = test.withZone(null);
assertEquals(test.getZone(), null);
}
//-----------------------------------------------------------------------
! @Test
! public void test_resolverFields_selectOneDateResolveYMD() throws Exception {
! DateTimeFormatter base = new DateTimeFormatterBuilder()
! .appendValue(YEAR).appendLiteral('-').appendValue(MONTH_OF_YEAR).appendLiteral('-')
! .appendValue(DAY_OF_MONTH).appendLiteral('-').appendValue(DAY_OF_YEAR).toFormatter();
! DateTimeFormatter f = base.withResolverFields(YEAR, MONTH_OF_YEAR, DAY_OF_MONTH);
! try {
! base.parse("2012-6-30-321", LocalDate::from); // wrong day-of-year
! fail();
! } catch (DateTimeException ex) {
! // expected, fails as it produces two different dates
! }
! LocalDate parsed = f.parse("2012-6-30-321", LocalDate::from); // ignored day-of-year
! assertEquals(parsed, LocalDate.of(2012, 6, 30));
! }
!
! @Test
! public void test_resolverFields_selectOneDateResolveYD() throws Exception {
! DateTimeFormatter base = new DateTimeFormatterBuilder()
! .appendValue(YEAR).appendLiteral('-').appendValue(MONTH_OF_YEAR).appendLiteral('-')
! .appendValue(DAY_OF_MONTH).appendLiteral('-').appendValue(DAY_OF_YEAR).toFormatter();
! DateTimeFormatter f = base.withResolverFields(YEAR, DAY_OF_YEAR);
! assertEquals(f.getResolverFields(), new HashSet<>(Arrays.asList(YEAR, DAY_OF_YEAR)));
! try {
! base.parse("2012-6-30-321", LocalDate::from); // wrong month/day-of-month
! fail();
! } catch (DateTimeException ex) {
! // expected, fails as it produces two different dates
! }
! LocalDate parsed = f.parse("2012-6-30-321", LocalDate::from); // ignored month/day-of-month
! assertEquals(parsed, LocalDate.of(2012, 11, 16));
! }
!
! @Test
! public void test_resolverFields_ignoreCrossCheck() throws Exception {
! DateTimeFormatter base = new DateTimeFormatterBuilder()
! .appendValue(YEAR).appendLiteral('-').appendValue(DAY_OF_YEAR).appendLiteral('-')
! .appendValue(DAY_OF_WEEK).toFormatter();
! DateTimeFormatter f = base.withResolverFields(YEAR, DAY_OF_YEAR);
! try {
! base.parse("2012-321-1", LocalDate::from); // wrong day-of-week
! fail();
! } catch (DateTimeException ex) {
! // expected, should fail in cross-check of day-of-week
! }
! LocalDate parsed = f.parse("2012-321-1", LocalDate::from); // ignored wrong day-of-week
! assertEquals(parsed, LocalDate.of(2012, 11, 16));
! }
!
! @Test
! public void test_resolverFields_emptyList() throws Exception {
! DateTimeFormatter f = new DateTimeFormatterBuilder()
! .appendValue(YEAR).toFormatter().withResolverFields();
! TemporalAccessor parsed = f.parse("2012");
! assertEquals(parsed.isSupported(YEAR), false); // not in the list of resolverFields
! }
!
! @Test
! public void test_resolverFields_listOfOneMatching() throws Exception {
! DateTimeFormatter f = new DateTimeFormatterBuilder()
! .appendValue(YEAR).toFormatter().withResolverFields(YEAR);
! TemporalAccessor parsed = f.parse("2012");
! assertEquals(parsed.isSupported(YEAR), true);
! }
!
! @Test
! public void test_resolverFields_listOfOneNotMatching() throws Exception {
! DateTimeFormatter f = new DateTimeFormatterBuilder()
! .appendValue(YEAR).toFormatter().withResolverFields(MONTH_OF_YEAR);
! TemporalAccessor parsed = f.parse("2012");
! assertEquals(parsed.isSupported(YEAR), false); // not in the list of resolverFields
! assertEquals(parsed.isSupported(MONTH_OF_YEAR), false);
! }
!
! @Test
! public void test_resolverFields_listOfOneNull() throws Exception {
! DateTimeFormatter f = new DateTimeFormatterBuilder()
! .appendValue(YEAR).toFormatter().withResolverFields((TemporalField) null);
! TemporalAccessor parsed = f.parse("2012");
! assertEquals(parsed.isSupported(YEAR), false); // not in the list of resolverFields
! }
!
! @Test(expectedExceptions = NullPointerException.class)
! public void test_resolverFields_Array_null() throws Exception {
! DateTimeFormatter.ISO_DATE.withResolverFields((TemporalField[]) null);
! }
!
! @Test(expectedExceptions = NullPointerException.class)
! public void test_resolverFields_Set_null() throws Exception {
! DateTimeFormatter.ISO_DATE.withResolverFields((Set<TemporalField>) null);
! }
!
! //-----------------------------------------------------------------------
! // format
//-----------------------------------------------------------------------
! @DataProvider(name="formatWithZoneWithChronology")
! Object[][] data_format_withZone_withChronology() {
! YearMonth ym = YearMonth.of(2008, 6);
LocalDate ld = LocalDate.of(2008, 6, 30);
LocalTime lt = LocalTime.of(11, 30);
LocalDateTime ldt = LocalDateTime.of(2008, 6, 30, 11, 30);
OffsetTime ot = OffsetTime.of(LocalTime.of(11, 30), OFFSET_PONE);
OffsetDateTime odt = OffsetDateTime.of(LocalDateTime.of(2008, 6, 30, 11, 30), OFFSET_PONE);
ZonedDateTime zdt = ZonedDateTime.of(LocalDateTime.of(2008, 6, 30, 11, 30), ZONE_PARIS);
+ ChronoZonedDateTime<ThaiBuddhistDate> thaiZdt = ThaiBuddhistChronology.INSTANCE.zonedDateTime(zdt);
Instant instant = Instant.ofEpochSecond(3600);
return new Object[][] {
! {null, null, DayOfWeek.MONDAY, "::::"},
! {null, null, ym, "2008::::ISO"},
! {null, null, ld, "2008::::ISO"},
! {null, null, lt, ":11:::"},
! {null, null, ldt, "2008:11:::ISO"},
! {null, null, ot, ":11:+01:00::"},
! {null, null, odt, "2008:11:+01:00::ISO"},
! {null, null, zdt, "2008:11:+02:00:Europe/Paris:ISO"},
! {null, null, instant, "::::"},
!
! {IsoChronology.INSTANCE, null, DayOfWeek.MONDAY, "::::ISO"},
! {IsoChronology.INSTANCE, null, ym, "2008::::ISO"},
! {IsoChronology.INSTANCE, null, ld, "2008::::ISO"},
! {IsoChronology.INSTANCE, null, lt, ":11:::ISO"},
! {IsoChronology.INSTANCE, null, ldt, "2008:11:::ISO"},
! {IsoChronology.INSTANCE, null, ot, ":11:+01:00::ISO"},
! {IsoChronology.INSTANCE, null, odt, "2008:11:+01:00::ISO"},
! {IsoChronology.INSTANCE, null, zdt, "2008:11:+02:00:Europe/Paris:ISO"},
! {IsoChronology.INSTANCE, null, instant, "::::ISO"},
!
! {null, ZONE_PARIS, DayOfWeek.MONDAY, ":::Europe/Paris:"},
! {null, ZONE_PARIS, ym, "2008:::Europe/Paris:ISO"},
! {null, ZONE_PARIS, ld, "2008:::Europe/Paris:ISO"},
! {null, ZONE_PARIS, lt, ":11::Europe/Paris:"},
! {null, ZONE_PARIS, ldt, "2008:11::Europe/Paris:ISO"},
! {null, ZONE_PARIS, ot, ":11:+01:00:Europe/Paris:"},
! {null, ZONE_PARIS, odt, "2008:12:+02:00:Europe/Paris:ISO"},
! {null, ZONE_PARIS, zdt, "2008:11:+02:00:Europe/Paris:ISO"},
! {null, ZONE_PARIS, instant, "1970:02:+01:00:Europe/Paris:ISO"},
!
! {null, OFFSET_PTHREE, DayOfWeek.MONDAY, ":::+03:00:"},
! {null, OFFSET_PTHREE, ym, "2008:::+03:00:ISO"},
! {null, OFFSET_PTHREE, ld, "2008:::+03:00:ISO"},
! {null, OFFSET_PTHREE, lt, ":11::+03:00:"},
! {null, OFFSET_PTHREE, ldt, "2008:11::+03:00:ISO"},
! {null, OFFSET_PTHREE, ot, null}, // offset and zone clash
! {null, OFFSET_PTHREE, odt, "2008:13:+03:00:+03:00:ISO"},
! {null, OFFSET_PTHREE, zdt, "2008:12:+03:00:+03:00:ISO"},
! {null, OFFSET_PTHREE, instant, "1970:04:+03:00:+03:00:ISO"},
!
! {ThaiBuddhistChronology.INSTANCE, null, DayOfWeek.MONDAY, null}, // not a complete date
! {ThaiBuddhistChronology.INSTANCE, null, ym, null}, // not a complete date
! {ThaiBuddhistChronology.INSTANCE, null, ld, "2551::::ThaiBuddhist"},
! {ThaiBuddhistChronology.INSTANCE, null, lt, ":11:::ThaiBuddhist"},
! {ThaiBuddhistChronology.INSTANCE, null, ldt, "2551:11:::ThaiBuddhist"},
! {ThaiBuddhistChronology.INSTANCE, null, ot, ":11:+01:00::ThaiBuddhist"},
! {ThaiBuddhistChronology.INSTANCE, null, odt, "2551:11:+01:00::ThaiBuddhist"},
! {ThaiBuddhistChronology.INSTANCE, null, zdt, "2551:11:+02:00:Europe/Paris:ThaiBuddhist"},
! {ThaiBuddhistChronology.INSTANCE, null, instant, "::::ThaiBuddhist"},
!
! {ThaiBuddhistChronology.INSTANCE, null, DayOfWeek.MONDAY, null}, // not a complete date
! {ThaiBuddhistChronology.INSTANCE, ZONE_PARIS, ym, null}, // not a complete date
! {ThaiBuddhistChronology.INSTANCE, ZONE_PARIS, ld, "2551:::Europe/Paris:ThaiBuddhist"},
! {ThaiBuddhistChronology.INSTANCE, ZONE_PARIS, lt, ":11::Europe/Paris:ThaiBuddhist"},
! {ThaiBuddhistChronology.INSTANCE, ZONE_PARIS, ldt, "2551:11::Europe/Paris:ThaiBuddhist"},
! {ThaiBuddhistChronology.INSTANCE, ZONE_PARIS, ot, ":11:+01:00:Europe/Paris:ThaiBuddhist"},
! {ThaiBuddhistChronology.INSTANCE, ZONE_PARIS, odt, "2551:12:+02:00:Europe/Paris:ThaiBuddhist"},
! {ThaiBuddhistChronology.INSTANCE, ZONE_PARIS, zdt, "2551:11:+02:00:Europe/Paris:ThaiBuddhist"},
! {ThaiBuddhistChronology.INSTANCE, ZONE_PARIS, instant, "2513:02:+01:00:Europe/Paris:ThaiBuddhist"},
!
! {null, ZONE_PARIS, thaiZdt, "2551:11:+02:00:Europe/Paris:ThaiBuddhist"},
! {ThaiBuddhistChronology.INSTANCE, ZONE_PARIS, thaiZdt, "2551:11:+02:00:Europe/Paris:ThaiBuddhist"},
! {IsoChronology.INSTANCE, ZONE_PARIS, thaiZdt, "2008:11:+02:00:Europe/Paris:ISO"},
};
}
! @Test(dataProvider="formatWithZoneWithChronology")
! public void test_format_withZone_withChronology(Chronology overrideChrono, ZoneId overrideZone, TemporalAccessor temporal, String expected) {
DateTimeFormatter test = new DateTimeFormatterBuilder()
.optionalStart().appendValue(YEAR, 4).optionalEnd()
.appendLiteral(':').optionalStart().appendValue(HOUR_OF_DAY, 2).optionalEnd()
! .appendLiteral(':').optionalStart().appendOffsetId().optionalEnd()
! .appendLiteral(':').optionalStart().appendZoneId().optionalEnd()
! .appendLiteral(':').optionalStart().appendChronologyId().optionalEnd()
.toFormatter(Locale.ENGLISH)
.withChronology(overrideChrono).withZone(overrideZone);
+ if (expected != null) {
String result = test.format(temporal);
assertEquals(result, expected);
+ } else {
+ try {
+ test.format(temporal);
+ fail("Formatting should have failed");
+ } catch (DateTimeException ex) {
+ // expected
+ }
+ }
}
@Test
! public void test_format_withChronology_nonChronoFieldMapLink() {
! TemporalAccessor temporal = new TemporalAccessor() {
! @Override
! public boolean isSupported(TemporalField field) {
! return field == IsoFields.WEEK_BASED_YEAR;
! }
! @Override
! public long getLong(TemporalField field) {
! if (field == IsoFields.WEEK_BASED_YEAR) {
! return 2345;
! }
! throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
! }
! };
! DateTimeFormatter test = new DateTimeFormatterBuilder()
! .appendValue(IsoFields.WEEK_BASED_YEAR, 4)
! .toFormatter(Locale.ENGLISH)
! .withChronology(IsoChronology.INSTANCE);
! String result = test.format(temporal);
! assertEquals(result, "2345");
! }
!
! //-----------------------------------------------------------------------
! @Test
! public void test_format_TemporalAccessor_simple() {
DateTimeFormatter test = fmt.withLocale(Locale.ENGLISH).withSymbols(DateTimeFormatSymbols.STANDARD);
String result = test.format(LocalDate.of(2008, 6, 30));
assertEquals(result, "ONE30");
}
! @Test(expectedExceptions = DateTimeException.class)
! public void test_format_TemporalAccessor_noSuchField() {
DateTimeFormatter test = fmt.withLocale(Locale.ENGLISH).withSymbols(DateTimeFormatSymbols.STANDARD);
test.format(LocalTime.of(11, 30));
}
! @Test(expectedExceptions = NullPointerException.class)
! public void test_format_TemporalAccessor_null() {
DateTimeFormatter test = fmt.withLocale(Locale.ENGLISH).withSymbols(DateTimeFormatSymbols.STANDARD);
test.format((TemporalAccessor) null);
}
//-----------------------------------------------------------------------