/* * Copyright (c) 2008-2012, Stephen Colebourne & Michael Nascimento Santos * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * * Neither the name of JSR-310 nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package javax.time.format; import static java.time.calendrical.ChronoField.DAY_OF_MONTH; import static java.time.calendrical.ChronoField.DAY_OF_WEEK; import static java.time.calendrical.ChronoField.DAY_OF_YEAR; import static java.time.calendrical.ChronoField.HOUR_OF_DAY; import static java.time.calendrical.ChronoField.MINUTE_OF_HOUR; import static java.time.calendrical.ChronoField.MONTH_OF_YEAR; import static java.time.calendrical.ChronoField.NANO_OF_SECOND; import static java.time.calendrical.ChronoField.OFFSET_SECONDS; import static java.time.calendrical.ChronoField.SECOND_OF_MINUTE; import static java.time.calendrical.ChronoField.YEAR; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; import java.text.ParsePosition; import java.time.DateTimeException; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.Year; import java.time.YearMonth; import java.time.ZoneId; import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.time.calendrical.DateTimeAccessor; import java.time.calendrical.DateTimeBuilder; import java.time.calendrical.DateTimeField; import java.time.calendrical.ISOWeeks; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatters; import java.time.format.DateTimeParseException; import java.time.format.DateTimePrintException; import java.time.jdk8.DefaultInterfaceDateTimeAccessor; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; import org.testng.annotations.BeforeMethod; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; /** * Test DateTimeFormatters. */ @Test public class TCKDateTimeFormatters { @BeforeMethod public void setUp() { } // ----------------------------------------------------------------------- @Test(expectedExceptions = NullPointerException.class, groups = { "tck" }) public void test_print_nullCalendrical() { DateTimeFormatters.isoDate().print((DateTimeAccessor) null); } // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- @Test(groups = { "tck" }) public void test_pattern_String() { DateTimeFormatter test = DateTimeFormatters.pattern("d MMM yyyy"); assertEquals(test.toString(), "Value(DayOfMonth)' 'Text(MonthOfYear,SHORT)' 'Value(Year,4,19,EXCEEDS_PAD)"); assertEquals(test.getLocale(), Locale.getDefault()); } @Test(expectedExceptions = IllegalArgumentException.class, groups = { "tck" }) public void test_pattern_String_invalid() { DateTimeFormatters.pattern("p"); } @Test(expectedExceptions = NullPointerException.class, groups = { "tck" }) public void test_pattern_String_null() { DateTimeFormatters.pattern(null); } // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- @Test(groups = { "tck" }) public void test_pattern_StringLocale() { DateTimeFormatter test = DateTimeFormatters.pattern("d MMM yyyy", Locale.UK); assertEquals(test.toString(), "Value(DayOfMonth)' 'Text(MonthOfYear,SHORT)' 'Value(Year,4,19,EXCEEDS_PAD)"); assertEquals(test.getLocale(), Locale.UK); } @Test(expectedExceptions = IllegalArgumentException.class, groups = { "tck" }) public void test_pattern_StringLocale_invalid() { DateTimeFormatters.pattern("p", Locale.UK); } @Test(expectedExceptions = NullPointerException.class, groups = { "tck" }) public void test_pattern_StringLocale_nullPattern() { DateTimeFormatters.pattern(null, Locale.UK); } @Test(expectedExceptions = NullPointerException.class, groups = { "tck" }) public void test_pattern_StringLocale_nullLocale() { DateTimeFormatters.pattern("yyyy", null); } // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- @DataProvider(name = "sample_isoLocalDate") Object[][] provider_sample_isoLocalDate() { return new Object[][] { { 2008, null, null, null, null, null, DateTimeException.class }, { null, 6, null, null, null, null, DateTimeException.class }, { null, null, 30, null, null, null, DateTimeException.class }, { null, null, null, "+01:00", null, null, DateTimeException.class }, { null, null, null, null, "Europe/Paris", null, DateTimeException.class }, { 2008, 6, null, null, null, null, DateTimeException.class }, { null, 6, 30, null, null, null, DateTimeException.class }, { 2008, 6, 30, null, null, "2008-06-30", null }, { 2008, 6, 30, "+01:00", null, "2008-06-30", null }, { 2008, 6, 30, "+01:00", "Europe/Paris", "2008-06-30", null }, { 2008, 6, 30, null, "Europe/Paris", "2008-06-30", null }, { 123456, 6, 30, null, null, "+123456-06-30", null }, }; } @Test(dataProvider = "sample_isoLocalDate", groups = { "tck" }) public void test_print_isoLocalDate(Integer year, Integer month, Integer day, String offsetId, String zoneId, String expected, Class<?> expectedEx) { DateTimeAccessor test = buildAccessor(year, month, day, null, null, null, null, offsetId, zoneId); if (expectedEx == null) { assertEquals(DateTimeFormatters.isoLocalDate().print(test), expected); } else { try { DateTimeFormatters.isoLocalDate().print(test); fail(); } catch (Exception ex) { assertTrue(expectedEx.isInstance(ex)); } } } @Test(dataProvider = "sample_isoLocalDate", groups = { "tck" }) public void test_parse_isoLocalDate(Integer year, Integer month, Integer day, String offsetId, String zoneId, String input, Class<?> invalid) { if (input != null) { DateTimeBuilder expected = createDate(year, month, day); // offset/zone not expected to be parsed assertParseMatch(DateTimeFormatters.isoLocalDate().parseToBuilder(input, new ParsePosition(0)), expected); } } @Test(groups = { "tck" }) public void test_parse_isoLocalDate_999999999() { DateTimeBuilder expected = createDate(999999999, 8, 6); assertParseMatch(DateTimeFormatters.isoLocalDate().parseToBuilder("+999999999-08-06", new ParsePosition(0)), expected); assertEquals(LocalDate.parse("+999999999-08-06"), LocalDate.of(999999999, 8, 6)); } @Test(groups = { "tck" }) public void test_parse_isoLocalDate_1000000000() { DateTimeBuilder expected = createDate(1000000000, 8, 6); assertParseMatch(DateTimeFormatters.isoLocalDate().parseToBuilder("+1000000000-08-06", new ParsePosition(0)), expected); } @Test(expectedExceptions = DateTimeException.class, groups = { "tck" }) public void test_parse_isoLocalDate_1000000000_failedCreate() { LocalDate.parse("+1000000000-08-06"); } @Test(groups = { "tck" }) public void test_parse_isoLocalDate_M999999999() { DateTimeBuilder expected = createDate(-999999999, 8, 6); assertParseMatch(DateTimeFormatters.isoLocalDate().parseToBuilder("-999999999-08-06", new ParsePosition(0)), expected); assertEquals(LocalDate.parse("-999999999-08-06"), LocalDate.of(-999999999, 8, 6)); } @Test(groups = { "tck" }) public void test_parse_isoLocalDate_M1000000000() { DateTimeBuilder expected = createDate(-1000000000, 8, 6); assertParseMatch(DateTimeFormatters.isoLocalDate().parseToBuilder("-1000000000-08-06", new ParsePosition(0)), expected); } @Test(expectedExceptions = DateTimeException.class, groups = { "tck" }) public void test_parse_isoLocalDate_M1000000000_failedCreate() { LocalDate.parse("-1000000000-08-06"); } // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- @DataProvider(name = "sample_isoOffsetDate") Object[][] provider_sample_isoOffsetDate() { return new Object[][] { { 2008, null, null, null, null, null, DateTimeException.class }, { null, 6, null, null, null, null, DateTimeException.class }, { null, null, 30, null, null, null, DateTimeException.class }, { null, null, null, "+01:00", null, null, DateTimeException.class }, { null, null, null, null, "Europe/Paris", null, DateTimeException.class }, { 2008, 6, null, null, null, null, DateTimeException.class }, { null, 6, 30, null, null, null, DateTimeException.class }, { 2008, 6, 30, null, null, null, DateTimeException.class }, { 2008, 6, 30, "+01:00", null, "2008-06-30+01:00", null }, { 2008, 6, 30, "+01:00", "Europe/Paris", "2008-06-30+01:00", null }, { 2008, 6, 30, null, "Europe/Paris", null, DateTimeException.class }, { 123456, 6, 30, "+01:00", null, "+123456-06-30+01:00", null }, }; } @Test(dataProvider = "sample_isoOffsetDate", groups = { "tck" }) public void test_print_isoOffsetDate(Integer year, Integer month, Integer day, String offsetId, String zoneId, String expected, Class<?> expectedEx) { DateTimeAccessor test = buildAccessor(year, month, day, null, null, null, null, offsetId, zoneId); if (expectedEx == null) { assertEquals(DateTimeFormatters.isoOffsetDate().print(test), expected); } else { try { DateTimeFormatters.isoOffsetDate().print(test); fail(); } catch (Exception ex) { assertTrue(expectedEx.isInstance(ex)); } } } @Test(dataProvider = "sample_isoOffsetDate", groups = { "tck" }) public void test_parse_isoOffsetDate(Integer year, Integer month, Integer day, String offsetId, String zoneId, String input, Class<?> invalid) { if (input != null) { DateTimeBuilder expected = createDate(year, month, day); buildCalendrical(expected, offsetId, null); // zone not expected to be parsed assertParseMatch(DateTimeFormatters.isoOffsetDate().parseToBuilder(input, new ParsePosition(0)), expected); } } // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- @DataProvider(name = "sample_isoDate") Object[][] provider_sample_isoDate() { return new Object[][] { { 2008, null, null, null, null, null, DateTimeException.class }, { null, 6, null, null, null, null, DateTimeException.class }, { null, null, 30, null, null, null, DateTimeException.class }, { null, null, null, "+01:00", null, null, DateTimeException.class }, { null, null, null, null, "Europe/Paris", null, DateTimeException.class }, { 2008, 6, null, null, null, null, DateTimeException.class }, { null, 6, 30, null, null, null, DateTimeException.class }, { 2008, 6, 30, null, null, "2008-06-30", null }, { 2008, 6, 30, "+01:00", null, "2008-06-30+01:00", null }, { 2008, 6, 30, "+01:00", "Europe/Paris", "2008-06-30+01:00", null }, { 2008, 6, 30, null, "Europe/Paris", "2008-06-30", null }, { 123456, 6, 30, "+01:00", "Europe/Paris", "+123456-06-30+01:00", null }, }; } @Test(dataProvider = "sample_isoDate", groups = { "tck" }) public void test_print_isoDate(Integer year, Integer month, Integer day, String offsetId, String zoneId, String expected, Class<?> expectedEx) { DateTimeAccessor test = buildAccessor(year, month, day, null, null, null, null, offsetId, zoneId); if (expectedEx == null) { assertEquals(DateTimeFormatters.isoDate().print(test), expected); } else { try { DateTimeFormatters.isoDate().print(test); fail(); } catch (Exception ex) { assertTrue(expectedEx.isInstance(ex)); } } } @Test(dataProvider = "sample_isoDate", groups = { "tck" }) public void test_parse_isoDate(Integer year, Integer month, Integer day, String offsetId, String zoneId, String input, Class<?> invalid) { if (input != null) { DateTimeBuilder expected = createDate(year, month, day); if (offsetId != null) { expected.addFieldValue(OFFSET_SECONDS, ZoneOffset.of(offsetId).getTotalSeconds()); } assertParseMatch(DateTimeFormatters.isoDate().parseToBuilder(input, new ParsePosition(0)), expected); } } // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- @DataProvider(name = "sample_isoLocalTime") Object[][] provider_sample_isoLocalTime() { return new Object[][] { { 11, null, null, null, null, null, null, DateTimeException.class }, { null, 5, null, null, null, null, null, DateTimeException.class }, { null, null, 30, null, null, null, null, DateTimeException.class }, { null, null, null, 1, null, null, null, DateTimeException.class }, { null, null, null, null, "+01:00", null, null, DateTimeException.class }, { null, null, null, null, null, "Europe/Paris", null, DateTimeException.class }, { 11, 5, null, null, null, null, "11:05", null }, { 11, 5, 30, null, null, null, "11:05:30", null }, { 11, 5, 30, 500000000, null, null, "11:05:30.5", null }, { 11, 5, 30, 1, null, null, "11:05:30.000000001", null }, { 11, 5, null, null, "+01:00", null, "11:05", null }, { 11, 5, 30, null, "+01:00", null, "11:05:30", null }, { 11, 5, 30, 500000000, "+01:00", null, "11:05:30.5", null }, { 11, 5, 30, 1, "+01:00", null, "11:05:30.000000001", null }, { 11, 5, null, null, "+01:00", "Europe/Paris", "11:05", null }, { 11, 5, 30, null, "+01:00", "Europe/Paris", "11:05:30", null }, { 11, 5, 30, 500000000, "+01:00", "Europe/Paris", "11:05:30.5", null }, { 11, 5, 30, 1, "+01:00", "Europe/Paris", "11:05:30.000000001", null }, { 11, 5, null, null, null, "Europe/Paris", "11:05", null }, { 11, 5, 30, null, null, "Europe/Paris", "11:05:30", null }, { 11, 5, 30, 500000000, null, "Europe/Paris", "11:05:30.5", null }, { 11, 5, 30, 1, null, "Europe/Paris", "11:05:30.000000001", null }, }; } @Test(dataProvider = "sample_isoLocalTime", groups = { "tck" }) public void test_print_isoLocalTime(Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId, String expected, Class<?> expectedEx) { DateTimeAccessor test = buildAccessor(null, null, null, hour, min, sec, nano, offsetId, zoneId); if (expectedEx == null) { assertEquals(DateTimeFormatters.isoLocalTime().print(test), expected); } else { try { DateTimeFormatters.isoLocalTime().print(test); fail(); } catch (Exception ex) { assertTrue(expectedEx.isInstance(ex)); } } } @Test(dataProvider = "sample_isoLocalTime", groups = { "tck" }) public void test_parse_isoLocalTime(Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId, String input, Class<?> invalid) { if (input != null) { DateTimeBuilder expected = createTime(hour, min, sec, nano); // offset/zone not expected to be parsed assertParseMatch(DateTimeFormatters.isoLocalTime().parseToBuilder(input, new ParsePosition(0)), expected); } } // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- @DataProvider(name = "sample_isoOffsetTime") Object[][] provider_sample_isoOffsetTime() { return new Object[][] { { 11, null, null, null, null, null, null, DateTimeException.class }, { null, 5, null, null, null, null, null, DateTimeException.class }, { null, null, 30, null, null, null, null, DateTimeException.class }, { null, null, null, 1, null, null, null, DateTimeException.class }, { null, null, null, null, "+01:00", null, null, DateTimeException.class }, { null, null, null, null, null, "Europe/Paris", null, DateTimeException.class }, { 11, 5, null, null, null, null, null, DateTimeException.class }, { 11, 5, 30, null, null, null, null, DateTimeException.class }, { 11, 5, 30, 500000000, null, null, null, DateTimeException.class }, { 11, 5, 30, 1, null, null, null, DateTimeException.class }, { 11, 5, null, null, "+01:00", null, "11:05+01:00", null }, { 11, 5, 30, null, "+01:00", null, "11:05:30+01:00", null }, { 11, 5, 30, 500000000, "+01:00", null, "11:05:30.5+01:00", null }, { 11, 5, 30, 1, "+01:00", null, "11:05:30.000000001+01:00", null }, { 11, 5, null, null, "+01:00", "Europe/Paris", "11:05+01:00", null }, { 11, 5, 30, null, "+01:00", "Europe/Paris", "11:05:30+01:00", null }, { 11, 5, 30, 500000000, "+01:00", "Europe/Paris", "11:05:30.5+01:00", null }, { 11, 5, 30, 1, "+01:00", "Europe/Paris", "11:05:30.000000001+01:00", null }, { 11, 5, null, null, null, "Europe/Paris", null, DateTimeException.class }, { 11, 5, 30, null, null, "Europe/Paris", null, DateTimeException.class }, { 11, 5, 30, 500000000, null, "Europe/Paris", null, DateTimeException.class }, { 11, 5, 30, 1, null, "Europe/Paris", null, DateTimeException.class }, }; } @Test(dataProvider = "sample_isoOffsetTime", groups = { "tck" }) public void test_print_isoOffsetTime(Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId, String expected, Class<?> expectedEx) { DateTimeAccessor test = buildAccessor(null, null, null, hour, min, sec, nano, offsetId, zoneId); if (expectedEx == null) { assertEquals(DateTimeFormatters.isoOffsetTime().print(test), expected); } else { try { DateTimeFormatters.isoOffsetTime().print(test); fail(); } catch (Exception ex) { assertTrue(expectedEx.isInstance(ex)); } } } @Test(dataProvider = "sample_isoOffsetTime", groups = { "tck" }) public void test_parse_isoOffsetTime(Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId, String input, Class<?> invalid) { if (input != null) { DateTimeBuilder expected = createTime(hour, min, sec, nano); buildCalendrical(expected, offsetId, null); // zoneId is not expected from parse assertParseMatch(DateTimeFormatters.isoOffsetTime().parseToBuilder(input, new ParsePosition(0)), expected); } } // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- @DataProvider(name = "sample_isoTime") Object[][] provider_sample_isoTime() { return new Object[][] { { 11, null, null, null, null, null, null, DateTimeException.class }, { null, 5, null, null, null, null, null, DateTimeException.class }, { null, null, 30, null, null, null, null, DateTimeException.class }, { null, null, null, 1, null, null, null, DateTimeException.class }, { null, null, null, null, "+01:00", null, null, DateTimeException.class }, { null, null, null, null, null, "Europe/Paris", null, DateTimeException.class }, { 11, 5, null, null, null, null, "11:05", null }, { 11, 5, 30, null, null, null, "11:05:30", null }, { 11, 5, 30, 500000000, null, null, "11:05:30.5", null }, { 11, 5, 30, 1, null, null, "11:05:30.000000001", null }, { 11, 5, null, null, "+01:00", null, "11:05+01:00", null }, { 11, 5, 30, null, "+01:00", null, "11:05:30+01:00", null }, { 11, 5, 30, 500000000, "+01:00", null, "11:05:30.5+01:00", null }, { 11, 5, 30, 1, "+01:00", null, "11:05:30.000000001+01:00", null }, { 11, 5, null, null, "+01:00", "Europe/Paris", "11:05+01:00", null }, { 11, 5, 30, null, "+01:00", "Europe/Paris", "11:05:30+01:00", null }, { 11, 5, 30, 500000000, "+01:00", "Europe/Paris", "11:05:30.5+01:00", null }, { 11, 5, 30, 1, "+01:00", "Europe/Paris", "11:05:30.000000001+01:00", null }, { 11, 5, null, null, null, "Europe/Paris", "11:05", null }, { 11, 5, 30, null, null, "Europe/Paris", "11:05:30", null }, { 11, 5, 30, 500000000, null, "Europe/Paris", "11:05:30.5", null }, { 11, 5, 30, 1, null, "Europe/Paris", "11:05:30.000000001", null }, }; } @Test(dataProvider = "sample_isoTime", groups = { "tck" }) public void test_print_isoTime(Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId, String expected, Class<?> expectedEx) { DateTimeAccessor test = buildAccessor(null, null, null, hour, min, sec, nano, offsetId, zoneId); if (expectedEx == null) { assertEquals(DateTimeFormatters.isoTime().print(test), expected); } else { try { DateTimeFormatters.isoTime().print(test); fail(); } catch (Exception ex) { assertTrue(expectedEx.isInstance(ex)); } } } @Test(dataProvider = "sample_isoTime", groups = { "tck" }) public void test_parse_isoTime(Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId, String input, Class<?> invalid) { if (input != null) { DateTimeBuilder expected = createTime(hour, min, sec, nano); if (offsetId != null) { expected.addFieldValue(OFFSET_SECONDS, ZoneOffset.of(offsetId).getTotalSeconds()); } assertParseMatch(DateTimeFormatters.isoTime().parseToBuilder(input, new ParsePosition(0)), expected); } } // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- @DataProvider(name = "sample_isoLocalDateTime") Object[][] provider_sample_isoLocalDateTime() { return new Object[][] { { 2008, null, null, null, null, null, null, null, null, null, DateTimeException.class }, { null, 6, null, null, null, null, null, null, null, null, DateTimeException.class }, { null, null, 30, null, null, null, null, null, null, null, DateTimeException.class }, { null, null, null, 11, null, null, null, null, null, null, DateTimeException.class }, { null, null, null, null, 5, null, null, null, null, null, DateTimeException.class }, { null, null, null, null, null, null, null, "+01:00", null, null, DateTimeException.class }, { null, null, null, null, null, null, null, null, "Europe/Paris", null, DateTimeException.class }, { 2008, 6, 30, 11, null, null, null, null, null, null, DateTimeException.class }, { 2008, 6, 30, null, 5, null, null, null, null, null, DateTimeException.class }, { 2008, 6, null, 11, 5, null, null, null, null, null, DateTimeException.class }, { 2008, null, 30, 11, 5, null, null, null, null, null, DateTimeException.class }, { null, 6, 30, 11, 5, null, null, null, null, null, DateTimeException.class }, { 2008, 6, 30, 11, 5, null, null, null, null, "2008-06-30T11:05", null }, { 2008, 6, 30, 11, 5, 30, null, null, null, "2008-06-30T11:05:30", null }, { 2008, 6, 30, 11, 5, 30, 500000000, null, null, "2008-06-30T11:05:30.5", null }, { 2008, 6, 30, 11, 5, 30, 1, null, null, "2008-06-30T11:05:30.000000001", null }, { 2008, 6, 30, 11, 5, null, null, "+01:00", null, "2008-06-30T11:05", null }, { 2008, 6, 30, 11, 5, 30, null, "+01:00", null, "2008-06-30T11:05:30", null }, { 2008, 6, 30, 11, 5, 30, 500000000, "+01:00", null, "2008-06-30T11:05:30.5", null }, { 2008, 6, 30, 11, 5, 30, 1, "+01:00", null, "2008-06-30T11:05:30.000000001", null }, { 2008, 6, 30, 11, 5, null, null, "+01:00", "Europe/Paris", "2008-06-30T11:05", null }, { 2008, 6, 30, 11, 5, 30, null, "+01:00", "Europe/Paris", "2008-06-30T11:05:30", null }, { 2008, 6, 30, 11, 5, 30, 500000000, "+01:00", "Europe/Paris", "2008-06-30T11:05:30.5", null }, { 2008, 6, 30, 11, 5, 30, 1, "+01:00", "Europe/Paris", "2008-06-30T11:05:30.000000001", null }, { 2008, 6, 30, 11, 5, null, null, null, "Europe/Paris", "2008-06-30T11:05", null }, { 2008, 6, 30, 11, 5, 30, null, null, "Europe/Paris", "2008-06-30T11:05:30", null }, { 2008, 6, 30, 11, 5, 30, 500000000, null, "Europe/Paris", "2008-06-30T11:05:30.5", null }, { 2008, 6, 30, 11, 5, 30, 1, null, "Europe/Paris", "2008-06-30T11:05:30.000000001", null }, { 123456, 6, 30, 11, 5, null, null, null, null, "+123456-06-30T11:05", null }, }; } @Test(dataProvider = "sample_isoLocalDateTime", groups = { "tck" }) public void test_print_isoLocalDateTime(Integer year, Integer month, Integer day, Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId, String expected, Class<?> expectedEx) { DateTimeAccessor test = buildAccessor(year, month, day, hour, min, sec, nano, offsetId, zoneId); if (expectedEx == null) { assertEquals(DateTimeFormatters.isoLocalDateTime().print(test), expected); } else { try { DateTimeFormatters.isoLocalDateTime().print(test); fail(); } catch (Exception ex) { assertTrue(expectedEx.isInstance(ex)); } } } @Test(dataProvider = "sample_isoLocalDateTime", groups = { "tck" }) public void test_parse_isoLocalDateTime(Integer year, Integer month, Integer day, Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId, String input, Class<?> invalid) { if (input != null) { DateTimeBuilder expected = createDateTime(year, month, day, hour, min, sec, nano); assertParseMatch(DateTimeFormatters.isoLocalDateTime().parseToBuilder(input, new ParsePosition(0)), expected); } } // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- @DataProvider(name = "sample_isoOffsetDateTime") Object[][] provider_sample_isoOffsetDateTime() { return new Object[][] { { 2008, null, null, null, null, null, null, null, null, null, DateTimeException.class }, { null, 6, null, null, null, null, null, null, null, null, DateTimeException.class }, { null, null, 30, null, null, null, null, null, null, null, DateTimeException.class }, { null, null, null, 11, null, null, null, null, null, null, DateTimeException.class }, { null, null, null, null, 5, null, null, null, null, null, DateTimeException.class }, { null, null, null, null, null, null, null, "+01:00", null, null, DateTimeException.class }, { null, null, null, null, null, null, null, null, "Europe/Paris", null, DateTimeException.class }, { 2008, 6, 30, 11, null, null, null, null, null, null, DateTimeException.class }, { 2008, 6, 30, null, 5, null, null, null, null, null, DateTimeException.class }, { 2008, 6, null, 11, 5, null, null, null, null, null, DateTimeException.class }, { 2008, null, 30, 11, 5, null, null, null, null, null, DateTimeException.class }, { null, 6, 30, 11, 5, null, null, null, null, null, DateTimeException.class }, { 2008, 6, 30, 11, 5, null, null, null, null, null, DateTimeException.class }, { 2008, 6, 30, 11, 5, 30, null, null, null, null, DateTimeException.class }, { 2008, 6, 30, 11, 5, 30, 500000000, null, null, null, DateTimeException.class }, { 2008, 6, 30, 11, 5, 30, 1, null, null, null, DateTimeException.class }, { 2008, 6, 30, 11, 5, null, null, "+01:00", null, "2008-06-30T11:05+01:00", null }, { 2008, 6, 30, 11, 5, 30, null, "+01:00", null, "2008-06-30T11:05:30+01:00", null }, { 2008, 6, 30, 11, 5, 30, 500000000, "+01:00", null, "2008-06-30T11:05:30.5+01:00", null }, { 2008, 6, 30, 11, 5, 30, 1, "+01:00", null, "2008-06-30T11:05:30.000000001+01:00", null }, { 2008, 6, 30, 11, 5, null, null, "+01:00", "Europe/Paris", "2008-06-30T11:05+01:00", null }, { 2008, 6, 30, 11, 5, 30, null, "+01:00", "Europe/Paris", "2008-06-30T11:05:30+01:00", null }, { 2008, 6, 30, 11, 5, 30, 500000000, "+01:00", "Europe/Paris", "2008-06-30T11:05:30.5+01:00", null }, { 2008, 6, 30, 11, 5, 30, 1, "+01:00", "Europe/Paris", "2008-06-30T11:05:30.000000001+01:00", null }, { 2008, 6, 30, 11, 5, null, null, null, "Europe/Paris", null, DateTimeException.class }, { 2008, 6, 30, 11, 5, 30, null, null, "Europe/Paris", null, DateTimeException.class }, { 2008, 6, 30, 11, 5, 30, 500000000, null, "Europe/Paris", null, DateTimeException.class }, { 2008, 6, 30, 11, 5, 30, 1, null, "Europe/Paris", null, DateTimeException.class }, { 123456, 6, 30, 11, 5, null, null, "+01:00", null, "+123456-06-30T11:05+01:00", null }, }; } @Test(dataProvider = "sample_isoOffsetDateTime", groups = { "tck" }) public void test_print_isoOffsetDateTime(Integer year, Integer month, Integer day, Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId, String expected, Class<?> expectedEx) { DateTimeAccessor test = buildAccessor(year, month, day, hour, min, sec, nano, offsetId, zoneId); if (expectedEx == null) { assertEquals(DateTimeFormatters.isoOffsetDateTime().print(test), expected); } else { try { DateTimeFormatters.isoOffsetDateTime().print(test); fail(); } catch (Exception ex) { assertTrue(expectedEx.isInstance(ex)); } } } @Test(dataProvider = "sample_isoOffsetDateTime", groups = { "tck" }) public void test_parse_isoOffsetDateTime(Integer year, Integer month, Integer day, Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId, String input, Class<?> invalid) { if (input != null) { DateTimeBuilder expected = createDateTime(year, month, day, hour, min, sec, nano); buildCalendrical(expected, offsetId, null); // zone not expected to be parsed assertParseMatch(DateTimeFormatters.isoOffsetDateTime().parseToBuilder(input, new ParsePosition(0)), expected); } } // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- @DataProvider(name = "sample_isoZonedDateTime") Object[][] provider_sample_isoZonedDateTime() { return new Object[][] { { 2008, null, null, null, null, null, null, null, null, null, DateTimeException.class }, { null, 6, null, null, null, null, null, null, null, null, DateTimeException.class }, { null, null, 30, null, null, null, null, null, null, null, DateTimeException.class }, { null, null, null, 11, null, null, null, null, null, null, DateTimeException.class }, { null, null, null, null, 5, null, null, null, null, null, DateTimeException.class }, { null, null, null, null, null, null, null, "+01:00", null, null, DateTimeException.class }, { null, null, null, null, null, null, null, null, "Europe/Paris", null, DateTimeException.class }, { 2008, 6, 30, 11, null, null, null, null, null, null, DateTimeException.class }, { 2008, 6, 30, null, 5, null, null, null, null, null, DateTimeException.class }, { 2008, 6, null, 11, 5, null, null, null, null, null, DateTimeException.class }, { 2008, null, 30, 11, 5, null, null, null, null, null, DateTimeException.class }, { null, 6, 30, 11, 5, null, null, null, null, null, DateTimeException.class }, { 2008, 6, 30, 11, 5, null, null, null, null, null, DateTimeException.class }, { 2008, 6, 30, 11, 5, 30, null, null, null, null, DateTimeException.class }, { 2008, 6, 30, 11, 5, 30, 500000000, null, null, null, DateTimeException.class }, { 2008, 6, 30, 11, 5, 30, 1, null, null, null, DateTimeException.class }, // allow OffsetDateTime (no harm comes of this AFAICT) { 2008, 6, 30, 11, 5, null, null, "+01:00", null, "2008-06-30T11:05+01:00", null }, { 2008, 6, 30, 11, 5, 30, null, "+01:00", null, "2008-06-30T11:05:30+01:00", null }, { 2008, 6, 30, 11, 5, 30, 500000000, "+01:00", null, "2008-06-30T11:05:30.5+01:00", null }, { 2008, 6, 30, 11, 5, 30, 1, "+01:00", null, "2008-06-30T11:05:30.000000001+01:00", null }, // ZonedDateTime with ZoneId of ZoneOffset { 2008, 6, 30, 11, 5, null, null, "+01:00", "+01:00", "2008-06-30T11:05+01:00", null }, { 2008, 6, 30, 11, 5, 30, null, "+01:00", "+01:00", "2008-06-30T11:05:30+01:00", null }, { 2008, 6, 30, 11, 5, 30, 500000000, "+01:00", "+01:00", "2008-06-30T11:05:30.5+01:00", null }, { 2008, 6, 30, 11, 5, 30, 1, "+01:00", "+01:00", "2008-06-30T11:05:30.000000001+01:00", null }, // ZonedDateTime with ZoneId of ZoneRegion { 2008, 6, 30, 11, 5, null, null, "+01:00", "Europe/Paris", "2008-06-30T11:05+01:00[Europe/Paris]", null }, { 2008, 6, 30, 11, 5, 30, null, "+01:00", "Europe/Paris", "2008-06-30T11:05:30+01:00[Europe/Paris]", null }, { 2008, 6, 30, 11, 5, 30, 500000000, "+01:00", "Europe/Paris", "2008-06-30T11:05:30.5+01:00[Europe/Paris]", null }, { 2008, 6, 30, 11, 5, 30, 1, "+01:00", "Europe/Paris", "2008-06-30T11:05:30.000000001+01:00[Europe/Paris]", null }, // offset required { 2008, 6, 30, 11, 5, null, null, null, "Europe/Paris", null, DateTimeException.class }, { 2008, 6, 30, 11, 5, 30, null, null, "Europe/Paris", null, DateTimeException.class }, { 2008, 6, 30, 11, 5, 30, 500000000, null, "Europe/Paris", null, DateTimeException.class }, { 2008, 6, 30, 11, 5, 30, 1, null, "Europe/Paris", null, DateTimeException.class }, { 123456, 6, 30, 11, 5, null, null, "+01:00", "Europe/Paris", "+123456-06-30T11:05+01:00[Europe/Paris]", null }, }; } @Test(dataProvider = "sample_isoZonedDateTime", groups = { "tck" }) public void test_print_isoZonedDateTime(Integer year, Integer month, Integer day, Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId, String expected, Class<?> expectedEx) { DateTimeAccessor test = buildAccessor(year, month, day, hour, min, sec, nano, offsetId, zoneId); if (expectedEx == null) { assertEquals(DateTimeFormatters.isoZonedDateTime().print(test), expected); } else { try { DateTimeFormatters.isoZonedDateTime().print(test); fail(test.toString()); } catch (Exception ex) { assertTrue(expectedEx.isInstance(ex)); } } } @Test(dataProvider = "sample_isoZonedDateTime", groups = { "tck" }) public void test_parse_isoZonedDateTime(Integer year, Integer month, Integer day, Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId, String input, Class<?> invalid) { if (input != null) { DateTimeBuilder expected = createDateTime(year, month, day, hour, min, sec, nano); if (offsetId.equals(zoneId)) { buildCalendrical(expected, offsetId, null); } else { buildCalendrical(expected, offsetId, zoneId); } assertParseMatch(DateTimeFormatters.isoZonedDateTime().parseToBuilder(input, new ParsePosition(0)), expected); } } // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- @DataProvider(name = "sample_isoDateTime") Object[][] provider_sample_isoDateTime() { return new Object[][] { { 2008, null, null, null, null, null, null, null, null, null, DateTimeException.class }, { null, 6, null, null, null, null, null, null, null, null, DateTimeException.class }, { null, null, 30, null, null, null, null, null, null, null, DateTimeException.class }, { null, null, null, 11, null, null, null, null, null, null, DateTimeException.class }, { null, null, null, null, 5, null, null, null, null, null, DateTimeException.class }, { null, null, null, null, null, null, null, "+01:00", null, null, DateTimeException.class }, { null, null, null, null, null, null, null, null, "Europe/Paris", null, DateTimeException.class }, { 2008, 6, 30, 11, null, null, null, null, null, null, DateTimeException.class }, { 2008, 6, 30, null, 5, null, null, null, null, null, DateTimeException.class }, { 2008, 6, null, 11, 5, null, null, null, null, null, DateTimeException.class }, { 2008, null, 30, 11, 5, null, null, null, null, null, DateTimeException.class }, { null, 6, 30, 11, 5, null, null, null, null, null, DateTimeException.class }, { 2008, 6, 30, 11, 5, null, null, null, null, "2008-06-30T11:05", null }, { 2008, 6, 30, 11, 5, 30, null, null, null, "2008-06-30T11:05:30", null }, { 2008, 6, 30, 11, 5, 30, 500000000, null, null, "2008-06-30T11:05:30.5", null }, { 2008, 6, 30, 11, 5, 30, 1, null, null, "2008-06-30T11:05:30.000000001", null }, { 2008, 6, 30, 11, 5, null, null, "+01:00", null, "2008-06-30T11:05+01:00", null }, { 2008, 6, 30, 11, 5, 30, null, "+01:00", null, "2008-06-30T11:05:30+01:00", null }, { 2008, 6, 30, 11, 5, 30, 500000000, "+01:00", null, "2008-06-30T11:05:30.5+01:00", null }, { 2008, 6, 30, 11, 5, 30, 1, "+01:00", null, "2008-06-30T11:05:30.000000001+01:00", null }, { 2008, 6, 30, 11, 5, null, null, "+01:00", "Europe/Paris", "2008-06-30T11:05+01:00[Europe/Paris]", null }, { 2008, 6, 30, 11, 5, 30, null, "+01:00", "Europe/Paris", "2008-06-30T11:05:30+01:00[Europe/Paris]", null }, { 2008, 6, 30, 11, 5, 30, 500000000, "+01:00", "Europe/Paris", "2008-06-30T11:05:30.5+01:00[Europe/Paris]", null }, { 2008, 6, 30, 11, 5, 30, 1, "+01:00", "Europe/Paris", "2008-06-30T11:05:30.000000001+01:00[Europe/Paris]", null }, { 2008, 6, 30, 11, 5, null, null, null, "Europe/Paris", "2008-06-30T11:05", null }, { 2008, 6, 30, 11, 5, 30, null, null, "Europe/Paris", "2008-06-30T11:05:30", null }, { 2008, 6, 30, 11, 5, 30, 500000000, null, "Europe/Paris", "2008-06-30T11:05:30.5", null }, { 2008, 6, 30, 11, 5, 30, 1, null, "Europe/Paris", "2008-06-30T11:05:30.000000001", null }, { 123456, 6, 30, 11, 5, null, null, null, null, "+123456-06-30T11:05", null }, }; } @Test(dataProvider = "sample_isoDateTime", groups = { "tck" }) public void test_print_isoDateTime(Integer year, Integer month, Integer day, Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId, String expected, Class<?> expectedEx) { DateTimeAccessor test = buildAccessor(year, month, day, hour, min, sec, nano, offsetId, zoneId); if (expectedEx == null) { assertEquals(DateTimeFormatters.isoDateTime().print(test), expected); } else { try { DateTimeFormatters.isoDateTime().print(test); fail(); } catch (Exception ex) { assertTrue(expectedEx.isInstance(ex)); } } } @Test(dataProvider = "sample_isoDateTime", groups = { "tck" }) public void test_parse_isoDateTime(Integer year, Integer month, Integer day, Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId, String input, Class<?> invalid) { if (input != null) { DateTimeBuilder expected = createDateTime(year, month, day, hour, min, sec, nano); if (offsetId != null) { expected.addFieldValue(OFFSET_SECONDS, ZoneOffset.of(offsetId).getTotalSeconds()); if (zoneId != null) { expected.addCalendrical(ZoneId.of(zoneId)); } } assertParseMatch(DateTimeFormatters.isoDateTime().parseToBuilder(input, new ParsePosition(0)), expected); } } // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- @Test(groups = { "tck" }) public void test_print_isoOrdinalDate() { DateTimeAccessor test = buildAccessor(LocalDateTime.of(2008, 6, 3, 11, 5, 30), null, null); assertEquals(DateTimeFormatters.isoOrdinalDate().print(test), "2008-155"); } @Test(groups = { "tck" }) public void test_print_isoOrdinalDate_offset() { DateTimeAccessor test = buildAccessor(LocalDateTime.of(2008, 6, 3, 11, 5, 30), "Z", null); assertEquals(DateTimeFormatters.isoOrdinalDate().print(test), "2008-155Z"); } @Test(groups = { "tck" }) public void test_print_isoOrdinalDate_zoned() { DateTimeAccessor test = buildAccessor(LocalDateTime.of(2008, 6, 3, 11, 5, 30), "+02:00", "Europe/Paris"); assertEquals(DateTimeFormatters.isoOrdinalDate().print(test), "2008-155+02:00"); } @Test(groups = { "tck" }) public void test_print_isoOrdinalDate_zoned_largeYear() { DateTimeAccessor test = buildAccessor(LocalDateTime.of(123456, 6, 3, 11, 5, 30), "Z", null); assertEquals(DateTimeFormatters.isoOrdinalDate().print(test), "+123456-155Z"); } @Test(groups = { "tck" }) public void test_print_isoOrdinalDate_fields() { DateTimeAccessor test = new DateTimeBuilder(YEAR, 2008).addFieldValue(DAY_OF_YEAR, 231); assertEquals(DateTimeFormatters.isoOrdinalDate().print(test), "2008-231"); } @Test(expectedExceptions = DateTimeException.class, groups = { "tck" }) public void test_print_isoOrdinalDate_missingField() { DateTimeAccessor test = Year.of(2008); DateTimeFormatters.isoOrdinalDate().print(test); } // ----------------------------------------------------------------------- @Test(groups = { "tck" }) public void test_parse_isoOrdinalDate() { DateTimeBuilder expected = new DateTimeBuilder(YEAR, 2008).addFieldValue(DAY_OF_YEAR, 123); assertParseMatch(DateTimeFormatters.isoOrdinalDate().parseToBuilder("2008-123", new ParsePosition(0)), expected); } @Test(groups = { "tck" }) public void test_parse_isoOrdinalDate_largeYear() { DateTimeBuilder expected = new DateTimeBuilder(YEAR, 123456).addFieldValue(DAY_OF_YEAR, 123); assertParseMatch(DateTimeFormatters.isoOrdinalDate().parseToBuilder("+123456-123", new ParsePosition(0)), expected); } // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- @Test(groups = { "tck" }) public void test_print_basicIsoDate() { DateTimeAccessor test = buildAccessor(LocalDateTime.of(2008, 6, 3, 11, 5, 30), null, null); assertEquals(DateTimeFormatters.basicIsoDate().print(test), "20080603"); } @Test(groups = { "tck" }) public void test_print_basicIsoDate_offset() { DateTimeAccessor test = buildAccessor(LocalDateTime.of(2008, 6, 3, 11, 5, 30), "Z", null); assertEquals(DateTimeFormatters.basicIsoDate().print(test), "20080603Z"); } @Test(groups = { "tck" }) public void test_print_basicIsoDate_zoned() { DateTimeAccessor test = buildAccessor(LocalDateTime.of(2008, 6, 3, 11, 5, 30), "+02:00", "Europe/Paris"); assertEquals(DateTimeFormatters.basicIsoDate().print(test), "20080603+0200"); } @Test(expectedExceptions = DateTimePrintException.class, groups = { "tck" }) public void test_print_basicIsoDate_largeYear() { DateTimeAccessor test = buildAccessor(LocalDateTime.of(123456, 6, 3, 11, 5, 30), "Z", null); DateTimeFormatters.basicIsoDate().print(test); } @Test(groups = { "tck" }) public void test_print_basicIsoDate_fields() { DateTimeAccessor test = buildAccessor(LocalDate.of(2008, 6, 3), null, null); assertEquals(DateTimeFormatters.basicIsoDate().print(test), "20080603"); } @Test(expectedExceptions = DateTimeException.class, groups = { "tck" }) public void test_print_basicIsoDate_missingField() { DateTimeAccessor test = YearMonth.of(2008, 6); DateTimeFormatters.basicIsoDate().print(test); } // ----------------------------------------------------------------------- @Test(groups = { "tck" }) public void test_parse_basicIsoDate() { LocalDate expected = LocalDate.of(2008, 6, 3); assertEquals(DateTimeFormatters.basicIsoDate().parse("20080603", LocalDate.class), expected); } @Test(expectedExceptions = DateTimeParseException.class, groups = { "tck" }) public void test_parse_basicIsoDate_largeYear() { try { LocalDate expected = LocalDate.of(123456, 6, 3); assertEquals(DateTimeFormatters.basicIsoDate().parse("+1234560603", LocalDate.class), expected); } catch (DateTimeParseException ex) { assertEquals(ex.getErrorIndex(), 0); assertEquals(ex.getParsedString(), "+1234560603"); throw ex; } } // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- @DataProvider(name = "weekDate") Iterator<Object[]> weekDate() { return new Iterator<Object[]>() { private ZonedDateTime date = ZonedDateTime.of(LocalDateTime.of(2003, 12, 29, 11, 5, 30), ZoneId.of("Europe/Paris")); private ZonedDateTime endDate = this.date.withYear(2005).withMonth(1).withDayOfMonth(2); private int week = 1; private int day = 1; @Override public boolean hasNext() { return !this.date.isAfter(this.endDate); } @Override public Object[] next() { StringBuilder sb = new StringBuilder("2004-W"); if (this.week < 10) { sb.append('0'); } sb.append(this.week).append('-').append(this.day).append(this.date.getOffset()); Object[] ret = new Object[] { this.date, sb.toString() }; this.date = this.date.plusDays(1); this.day += 1; if (this.day == 8) { this.day = 1; this.week++; } return ret; } @Override public void remove() { throw new UnsupportedOperationException(); } }; } @Test(dataProvider = "weekDate", groups = { "tck" }) public void test_print_isoWeekDate(DateTimeAccessor test, String expected) { assertEquals(DateTimeFormatters.isoWeekDate().print(test), expected); } @Test(groups = { "tck" }) public void test_print_isoWeekDate_zoned_largeYear() { DateTimeAccessor test = buildAccessor(LocalDateTime.of(123456, 6, 3, 11, 5, 30), "Z", null); assertEquals(DateTimeFormatters.isoWeekDate().print(test), "+123456-W23-2Z"); } @Test(groups = { "tck" }) public void test_print_isoWeekDate_fields() { DateTimeAccessor test = buildAccessor(LocalDate.of(2004, 1, 27), null, null); assertEquals(DateTimeFormatters.isoWeekDate().print(test), "2004-W05-2"); } @Test(expectedExceptions = DateTimeException.class, groups = { "tck" }) public void test_print_isoWeekDate_missingField() { DateTimeAccessor test = YearMonth.of(2008, 6); DateTimeFormatters.isoWeekDate().print(test); } // ----------------------------------------------------------------------- @Test(groups = { "tck" }) public void test_parse_weekDate() { LocalDate expected = LocalDate.of(2004, 1, 28); assertEquals(DateTimeFormatters.isoWeekDate().parse("2004-W05-3", LocalDate.class), expected); } @Test(groups = { "tck" }) public void test_parse_weekDate_largeYear() { DateTimeBuilder builder = DateTimeFormatters.isoWeekDate().parseToBuilder("+123456-W04-5", new ParsePosition(0)); assertEquals(builder.getFieldValue(ISOWeeks.WEEK_BASED_YEAR), 123456); assertEquals(builder.getFieldValue(ISOWeeks.WEEK_OF_WEEK_BASED_YEAR), 4); assertEquals(builder.getFieldValue(DAY_OF_WEEK), 5); } // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- @DataProvider(name = "rfc") Object[][] data_rfc() { return new Object[][] { { LocalDateTime.of(2008, 6, 3, 11, 5, 30), "Z", "Tue, 3 Jun 2008 11:05:30 GMT" }, { LocalDateTime.of(2008, 6, 30, 11, 5, 30), "Z", "Mon, 30 Jun 2008 11:05:30 GMT" }, { LocalDateTime.of(2008, 6, 3, 11, 5, 30), "+02:00", "Tue, 3 Jun 2008 11:05:30 +0200" }, { LocalDateTime.of(2008, 6, 30, 11, 5, 30), "-03:00", "Mon, 30 Jun 2008 11:05:30 -0300" }, }; } @Test(groups = { "tck" }, dataProvider = "rfc") public void test_print_rfc1123(LocalDateTime base, String offsetId, String expected) { DateTimeAccessor test = buildAccessor(base, offsetId, null); assertEquals(DateTimeFormatters.rfc1123().print(test), expected); } @Test(groups = { "tck" }, dataProvider = "rfc") public void test_print_rfc1123_french(LocalDateTime base, String offsetId, String expected) { DateTimeAccessor test = buildAccessor(base, offsetId, null); assertEquals(DateTimeFormatters.rfc1123().withLocale(Locale.FRENCH).print(test), expected); } @Test(groups = { "tck" }, expectedExceptions = DateTimeException.class) public void test_print_rfc1123_missingField() { DateTimeAccessor test = YearMonth.of(2008, 6); DateTimeFormatters.rfc1123().print(test); } // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- // ----------------------------------------------------------------------- private DateTimeBuilder createDate(Integer year, Integer month, Integer day) { DateTimeBuilder test = new DateTimeBuilder(); if (year != null) { test.addFieldValue(YEAR, year); } if (month != null) { test.addFieldValue(MONTH_OF_YEAR, month); } if (day != null) { test.addFieldValue(DAY_OF_MONTH, day); } return test; } private DateTimeBuilder createTime(Integer hour, Integer min, Integer sec, Integer nano) { DateTimeBuilder test = new DateTimeBuilder(); if (hour != null) { test.addFieldValue(HOUR_OF_DAY, hour); } if (min != null) { test.addFieldValue(MINUTE_OF_HOUR, min); } if (sec != null) { test.addFieldValue(SECOND_OF_MINUTE, sec); } if (nano != null) { test.addFieldValue(NANO_OF_SECOND, nano); } return test; } private DateTimeBuilder createDateTime(Integer year, Integer month, Integer day, Integer hour, Integer min, Integer sec, Integer nano) { DateTimeBuilder test = new DateTimeBuilder(); if (year != null) { test.addFieldValue(YEAR, year); } if (month != null) { test.addFieldValue(MONTH_OF_YEAR, month); } if (day != null) { test.addFieldValue(DAY_OF_MONTH, day); } if (hour != null) { test.addFieldValue(HOUR_OF_DAY, hour); } if (min != null) { test.addFieldValue(MINUTE_OF_HOUR, min); } if (sec != null) { test.addFieldValue(SECOND_OF_MINUTE, sec); } if (nano != null) { test.addFieldValue(NANO_OF_SECOND, nano); } return test; } private DateTimeAccessor buildAccessor(Integer year, Integer month, Integer day, Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId) { MockAccessor mock = new MockAccessor(); if (year != null) { mock.fields.put(YEAR, (long) year); } if (month != null) { mock.fields.put(MONTH_OF_YEAR, (long) month); } if (day != null) { mock.fields.put(DAY_OF_MONTH, (long) day); } if (hour != null) { mock.fields.put(HOUR_OF_DAY, (long) hour); } if (min != null) { mock.fields.put(MINUTE_OF_HOUR, (long) min); } if (sec != null) { mock.fields.put(SECOND_OF_MINUTE, (long) sec); } if (nano != null) { mock.fields.put(NANO_OF_SECOND, (long) nano); } mock.setOffset(offsetId); mock.setZone(zoneId); return mock; } private DateTimeAccessor buildAccessor(LocalDateTime base, String offsetId, String zoneId) { MockAccessor mock = new MockAccessor(); mock.setFields(base); mock.setOffset(offsetId); mock.setZone(zoneId); return mock; } private DateTimeAccessor buildAccessor(LocalDate base, String offsetId, String zoneId) { MockAccessor mock = new MockAccessor(); mock.setFields(base); mock.setOffset(offsetId); mock.setZone(zoneId); return mock; } private void buildCalendrical(DateTimeBuilder cal, String offsetId, String zoneId) { if (offsetId != null) { cal.addFieldValue(OFFSET_SECONDS, ZoneOffset.of(offsetId).getTotalSeconds()); } if (zoneId != null) { cal.addCalendrical(ZoneId.of(zoneId)); } } private void assertParseMatch(DateTimeBuilder parsed, DateTimeBuilder expected) { Map<DateTimeField, Long> parsedFVMap = parsed.getFieldValueMap(); Map<DateTimeField, Long> expectedFVMap = expected.getFieldValueMap(); assertEquals(parsedFVMap, expectedFVMap); List<Object> parsedCMap = parsed.getCalendricalList(); List<Object> expectedCMap = expected.getCalendricalList(); assertEquals(parsedCMap, expectedCMap); } // ------------------------------------------------------------------------- static class MockAccessor extends DefaultInterfaceDateTimeAccessor { Map<DateTimeField, Long> fields = new HashMap<>(); ZoneId zoneId; void setFields(LocalDate dt) { if (dt != null) { this.fields.put(YEAR, (long) dt.getYear()); this.fields.put(MONTH_OF_YEAR, (long) dt.getMonthValue()); this.fields.put(DAY_OF_MONTH, (long) dt.getDayOfMonth()); this.fields.put(DAY_OF_YEAR, (long) dt.getDayOfYear()); this.fields.put(DAY_OF_WEEK, (long) dt.getDayOfWeek().getValue()); this.fields.put(ISOWeeks.WEEK_BASED_YEAR, dt.getLong(ISOWeeks.WEEK_BASED_YEAR)); this.fields.put(ISOWeeks.WEEK_OF_WEEK_BASED_YEAR, dt.getLong(ISOWeeks.WEEK_OF_WEEK_BASED_YEAR)); } } void setFields(LocalDateTime dt) { if (dt != null) { this.fields.put(YEAR, (long) dt.getYear()); this.fields.put(MONTH_OF_YEAR, (long) dt.getMonthValue()); this.fields.put(DAY_OF_MONTH, (long) dt.getDayOfMonth()); this.fields.put(DAY_OF_YEAR, (long) dt.getDayOfYear()); this.fields.put(DAY_OF_WEEK, (long) dt.getDayOfWeek().getValue()); this.fields.put(ISOWeeks.WEEK_BASED_YEAR, dt.getLong(ISOWeeks.WEEK_BASED_YEAR)); this.fields.put(ISOWeeks.WEEK_OF_WEEK_BASED_YEAR, dt.getLong(ISOWeeks.WEEK_OF_WEEK_BASED_YEAR)); this.fields.put(HOUR_OF_DAY, (long) dt.getHour()); this.fields.put(MINUTE_OF_HOUR, (long) dt.getMinute()); this.fields.put(SECOND_OF_MINUTE, (long) dt.getSecond()); this.fields.put(NANO_OF_SECOND, (long) dt.getNano()); } } void setOffset(String offsetId) { if (offsetId != null) { this.fields.put(OFFSET_SECONDS, (long) ZoneOffset.of(offsetId).getTotalSeconds()); } } void setZone(String zoneId) { if (zoneId != null) { this.zoneId = ZoneId.of(zoneId); } } @Override public boolean isSupported(DateTimeField field) { return this.fields.containsKey(field); } @Override public long getLong(DateTimeField field) { try { return this.fields.get(field); } catch (NullPointerException ex) { throw new DateTimeException("Field missing: " + field); } } @SuppressWarnings("unchecked") @Override public <R> R query(Query<R> query) { if (query == Query.ZONE_ID) { return (R) this.zoneId; } return super.query(query); } @Override public String toString() { return this.fields + (this.zoneId != null ? " " + this.zoneId : ""); } } }