/* * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /* * This file is available under and governed by the GNU General Public * License version 2 only, as published by the Free Software Foundation. * However, the following notice accompanied the original version of this * file: * * 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 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.INSTANT_SECONDS; import static java.time.temporal.ChronoField.MINUTE_OF_HOUR; import static java.time.temporal.ChronoField.MONTH_OF_YEAR; import static java.time.temporal.ChronoField.NANO_OF_SECOND; import static java.time.temporal.ChronoField.OFFSET_SECONDS; import static java.time.temporal.ChronoField.SECOND_OF_MINUTE; import static java.time.temporal.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.Month; import java.time.Year; import java.time.YearMonth; import java.time.ZoneId; import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.time.chrono.Chronology; import java.time.chrono.IsoChronology; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.time.format.FormatStyle; import java.time.format.ResolverStyle; import java.time.format.TextStyle; import java.time.temporal.IsoFields; import java.time.temporal.TemporalAccessor; import java.time.temporal.TemporalField; import java.time.temporal.TemporalQuery; import java.util.HashMap; import java.util.Iterator; import java.util.Locale; import java.util.Map; import org.testng.annotations.BeforeMethod; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; /** * Test DateTimeFormatter. */ @Test public class TCKDateTimeFormatters { @BeforeMethod public void setUp() { } //----------------------------------------------------------------------- @Test(expectedExceptions=NullPointerException.class) public void test_format_nullTemporalAccessor() { DateTimeFormatter.ISO_DATE.format((TemporalAccessor) null); } //----------------------------------------------------------------------- //----------------------------------------------------------------------- //----------------------------------------------------------------------- @Test public void test_pattern_String() { DateTimeFormatter test = DateTimeFormatter.ofPattern("d MMM yyyy"); assertEquals(test.format(LocalDate.of(2012, 6, 30)), "30 " + Month.JUNE.getDisplayName(TextStyle.SHORT, Locale.getDefault()) + " 2012"); assertEquals(test.getLocale(), Locale.getDefault()); } @Test(expectedExceptions=IllegalArgumentException.class) public void test_pattern_String_invalid() { DateTimeFormatter.ofPattern("p"); } @Test(expectedExceptions=NullPointerException.class) public void test_pattern_String_null() { DateTimeFormatter.ofPattern(null); } //----------------------------------------------------------------------- //----------------------------------------------------------------------- //----------------------------------------------------------------------- @Test public void test_pattern_StringLocale() { DateTimeFormatter test = DateTimeFormatter.ofPattern("d MMM yyyy", Locale.UK); assertEquals(test.format(LocalDate.of(2012, 6, 30)), "30 Jun 2012"); assertEquals(test.getLocale(), Locale.UK); } @Test(expectedExceptions=IllegalArgumentException.class) public void test_pattern_StringLocale_invalid() { DateTimeFormatter.ofPattern("p", Locale.UK); } @Test(expectedExceptions=NullPointerException.class) public void test_pattern_StringLocale_nullPattern() { DateTimeFormatter.ofPattern(null, Locale.UK); } @Test(expectedExceptions=NullPointerException.class) public void test_pattern_StringLocale_nullLocale() { DateTimeFormatter.ofPattern("yyyy", null); } //----------------------------------------------------------------------- //----------------------------------------------------------------------- //----------------------------------------------------------------------- @Test public void test_ofLocalizedDate_basics() { assertEquals(DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).getChronology(), IsoChronology.INSTANCE); assertEquals(DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).getZone(), null); assertEquals(DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).getResolverStyle(), ResolverStyle.SMART); } @Test public void test_ofLocalizedTime_basics() { assertEquals(DateTimeFormatter.ofLocalizedTime(FormatStyle.FULL).getChronology(), IsoChronology.INSTANCE); assertEquals(DateTimeFormatter.ofLocalizedTime(FormatStyle.FULL).getZone(), null); assertEquals(DateTimeFormatter.ofLocalizedTime(FormatStyle.FULL).getResolverStyle(), ResolverStyle.SMART); } @Test public void test_ofLocalizedDateTime1_basics() { assertEquals(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL).getChronology(), IsoChronology.INSTANCE); assertEquals(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL).getZone(), null); assertEquals(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL).getResolverStyle(), ResolverStyle.SMART); } @Test public void test_ofLocalizedDateTime2_basics() { assertEquals(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL, FormatStyle.MEDIUM).getChronology(), IsoChronology.INSTANCE); assertEquals(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL, FormatStyle.MEDIUM).getZone(), null); assertEquals(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL, FormatStyle.MEDIUM).getResolverStyle(), ResolverStyle.SMART); } //----------------------------------------------------------------------- //----------------------------------------------------------------------- //----------------------------------------------------------------------- @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") public void test_print_isoLocalDate( Integer year, Integer month, Integer day, String offsetId, String zoneId, String expected, Class<?> expectedEx) { TemporalAccessor test = buildAccessor(year, month, day, null, null, null, null, offsetId, zoneId); if (expectedEx == null) { assertEquals(DateTimeFormatter.ISO_LOCAL_DATE.format(test), expected); } else { try { DateTimeFormatter.ISO_LOCAL_DATE.format(test); fail(); } catch (Exception ex) { assertTrue(expectedEx.isInstance(ex)); } } } @Test(dataProvider="sample_isoLocalDate") public void test_parse_isoLocalDate( Integer year, Integer month, Integer day, String offsetId, String zoneId, String input, Class<?> invalid) { if (input != null) { Expected expected = createDate(year, month, day); // offset/zone not expected to be parsed assertParseMatch(DateTimeFormatter.ISO_LOCAL_DATE.parseUnresolved(input, new ParsePosition(0)), expected); } } @Test public void test_parse_isoLocalDate_999999999() { Expected expected = createDate(999999999, 8, 6); assertParseMatch(DateTimeFormatter.ISO_LOCAL_DATE.parseUnresolved("+999999999-08-06", new ParsePosition(0)), expected); assertEquals(LocalDate.parse("+999999999-08-06"), LocalDate.of(999999999, 8, 6)); } @Test public void test_parse_isoLocalDate_1000000000() { Expected expected = createDate(1000000000, 8, 6); assertParseMatch(DateTimeFormatter.ISO_LOCAL_DATE.parseUnresolved("+1000000000-08-06", new ParsePosition(0)), expected); } @Test(expectedExceptions = DateTimeException.class) public void test_parse_isoLocalDate_1000000000_failedCreate() { LocalDate.parse("+1000000000-08-06"); } @Test public void test_parse_isoLocalDate_M999999999() { Expected expected = createDate(-999999999, 8, 6); assertParseMatch(DateTimeFormatter.ISO_LOCAL_DATE.parseUnresolved("-999999999-08-06", new ParsePosition(0)), expected); assertEquals(LocalDate.parse("-999999999-08-06"), LocalDate.of(-999999999, 8, 6)); } @Test public void test_parse_isoLocalDate_M1000000000() { Expected expected = createDate(-1000000000, 8, 6); assertParseMatch(DateTimeFormatter.ISO_LOCAL_DATE.parseUnresolved("-1000000000-08-06", new ParsePosition(0)), expected); } @Test(expectedExceptions = DateTimeException.class) public void test_parse_isoLocalDate_M1000000000_failedCreate() { LocalDate.parse("-1000000000-08-06"); } @Test public void test_isoLocalDate_basics() { assertEquals(DateTimeFormatter.ISO_LOCAL_DATE.getChronology(), IsoChronology.INSTANCE); assertEquals(DateTimeFormatter.ISO_LOCAL_DATE.getZone(), null); assertEquals(DateTimeFormatter.ISO_LOCAL_DATE.getResolverStyle(), ResolverStyle.STRICT); } //----------------------------------------------------------------------- //----------------------------------------------------------------------- //----------------------------------------------------------------------- @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") public void test_print_isoOffsetDate( Integer year, Integer month, Integer day, String offsetId, String zoneId, String expected, Class<?> expectedEx) { TemporalAccessor test = buildAccessor(year, month, day, null, null, null, null, offsetId, zoneId); if (expectedEx == null) { assertEquals(DateTimeFormatter.ISO_OFFSET_DATE.format(test), expected); } else { try { DateTimeFormatter.ISO_OFFSET_DATE.format(test); fail(); } catch (Exception ex) { assertTrue(expectedEx.isInstance(ex)); } } } @Test(dataProvider="sample_isoOffsetDate") public void test_parse_isoOffsetDate( Integer year, Integer month, Integer day, String offsetId, String zoneId, String input, Class<?> invalid) { if (input != null) { Expected expected = createDate(year, month, day); buildCalendrical(expected, offsetId, null); // zone not expected to be parsed assertParseMatch(DateTimeFormatter.ISO_OFFSET_DATE.parseUnresolved(input, new ParsePosition(0)), expected); } } @Test public void test_isoOffsetDate_basics() { assertEquals(DateTimeFormatter.ISO_OFFSET_DATE.getChronology(), IsoChronology.INSTANCE); assertEquals(DateTimeFormatter.ISO_OFFSET_DATE.getZone(), null); assertEquals(DateTimeFormatter.ISO_OFFSET_DATE.getResolverStyle(), ResolverStyle.STRICT); } //----------------------------------------------------------------------- //----------------------------------------------------------------------- //----------------------------------------------------------------------- @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") public void test_print_isoDate( Integer year, Integer month, Integer day, String offsetId, String zoneId, String expected, Class<?> expectedEx) { TemporalAccessor test = buildAccessor(year, month, day, null, null, null, null, offsetId, zoneId); if (expectedEx == null) { assertEquals(DateTimeFormatter.ISO_DATE.format(test), expected); } else { try { DateTimeFormatter.ISO_DATE.format(test); fail(); } catch (Exception ex) { assertTrue(expectedEx.isInstance(ex)); } } } @Test(dataProvider="sample_isoDate") public void test_parse_isoDate( Integer year, Integer month, Integer day, String offsetId, String zoneId, String input, Class<?> invalid) { if (input != null) { Expected expected = createDate(year, month, day); if (offsetId != null) { expected.add(ZoneOffset.of(offsetId)); } assertParseMatch(DateTimeFormatter.ISO_DATE.parseUnresolved(input, new ParsePosition(0)), expected); } } @Test public void test_isoDate_basics() { assertEquals(DateTimeFormatter.ISO_DATE.getChronology(), IsoChronology.INSTANCE); assertEquals(DateTimeFormatter.ISO_DATE.getZone(), null); assertEquals(DateTimeFormatter.ISO_DATE.getResolverStyle(), ResolverStyle.STRICT); } //----------------------------------------------------------------------- //----------------------------------------------------------------------- //----------------------------------------------------------------------- @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") public void test_print_isoLocalTime( Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId, String expected, Class<?> expectedEx) { TemporalAccessor test = buildAccessor(null, null, null, hour, min, sec, nano, offsetId, zoneId); if (expectedEx == null) { assertEquals(DateTimeFormatter.ISO_LOCAL_TIME.format(test), expected); } else { try { DateTimeFormatter.ISO_LOCAL_TIME.format(test); fail(); } catch (Exception ex) { assertTrue(expectedEx.isInstance(ex)); } } } @Test(dataProvider="sample_isoLocalTime") public void test_parse_isoLocalTime( Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId, String input, Class<?> invalid) { if (input != null) { Expected expected = createTime(hour, min, sec, nano); // offset/zone not expected to be parsed assertParseMatch(DateTimeFormatter.ISO_LOCAL_TIME.parseUnresolved(input, new ParsePosition(0)), expected); } } @Test public void test_isoLocalTime_basics() { assertEquals(DateTimeFormatter.ISO_LOCAL_TIME.getChronology(), null); assertEquals(DateTimeFormatter.ISO_LOCAL_TIME.getZone(), null); assertEquals(DateTimeFormatter.ISO_LOCAL_TIME.getResolverStyle(), ResolverStyle.STRICT); } //----------------------------------------------------------------------- //----------------------------------------------------------------------- //----------------------------------------------------------------------- @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") public void test_print_isoOffsetTime( Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId, String expected, Class<?> expectedEx) { TemporalAccessor test = buildAccessor(null, null, null, hour, min, sec, nano, offsetId, zoneId); if (expectedEx == null) { assertEquals(DateTimeFormatter.ISO_OFFSET_TIME.format(test), expected); } else { try { DateTimeFormatter.ISO_OFFSET_TIME.format(test); fail(); } catch (Exception ex) { assertTrue(expectedEx.isInstance(ex)); } } } @Test(dataProvider="sample_isoOffsetTime") public void test_parse_isoOffsetTime( Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId, String input, Class<?> invalid) { if (input != null) { Expected expected = createTime(hour, min, sec, nano); buildCalendrical(expected, offsetId, null); // zoneId is not expected from parse assertParseMatch(DateTimeFormatter.ISO_OFFSET_TIME.parseUnresolved(input, new ParsePosition(0)), expected); } } @Test public void test_isoOffsetTime_basics() { assertEquals(DateTimeFormatter.ISO_OFFSET_TIME.getChronology(), null); assertEquals(DateTimeFormatter.ISO_OFFSET_TIME.getZone(), null); assertEquals(DateTimeFormatter.ISO_OFFSET_TIME.getResolverStyle(), ResolverStyle.STRICT); } //----------------------------------------------------------------------- //----------------------------------------------------------------------- //----------------------------------------------------------------------- @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") public void test_print_isoTime( Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId, String expected, Class<?> expectedEx) { TemporalAccessor test = buildAccessor(null, null, null, hour, min, sec, nano, offsetId, zoneId); if (expectedEx == null) { assertEquals(DateTimeFormatter.ISO_TIME.format(test), expected); } else { try { DateTimeFormatter.ISO_TIME.format(test); fail(); } catch (Exception ex) { assertTrue(expectedEx.isInstance(ex)); } } } @Test(dataProvider="sample_isoTime") public void test_parse_isoTime( Integer hour, Integer min, Integer sec, Integer nano, String offsetId, String zoneId, String input, Class<?> invalid) { if (input != null) { Expected expected = createTime(hour, min, sec, nano); if (offsetId != null) { expected.add(ZoneOffset.of(offsetId)); } assertParseMatch(DateTimeFormatter.ISO_TIME.parseUnresolved(input, new ParsePosition(0)), expected); } } @Test public void test_isoTime_basics() { assertEquals(DateTimeFormatter.ISO_TIME.getChronology(), null); assertEquals(DateTimeFormatter.ISO_TIME.getZone(), null); assertEquals(DateTimeFormatter.ISO_TIME.getResolverStyle(), ResolverStyle.STRICT); } //----------------------------------------------------------------------- //----------------------------------------------------------------------- //----------------------------------------------------------------------- @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") 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) { TemporalAccessor test = buildAccessor(year, month, day, hour, min, sec, nano, offsetId, zoneId); if (expectedEx == null) { assertEquals(DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(test), expected); } else { try { DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(test); fail(); } catch (Exception ex) { assertTrue(expectedEx.isInstance(ex)); } } } @Test(dataProvider="sample_isoLocalDateTime") 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) { Expected expected = createDateTime(year, month, day, hour, min, sec, nano); assertParseMatch(DateTimeFormatter.ISO_LOCAL_DATE_TIME.parseUnresolved(input, new ParsePosition(0)), expected); } } @Test public void test_isoLocalDateTime_basics() { assertEquals(DateTimeFormatter.ISO_LOCAL_DATE_TIME.getChronology(), IsoChronology.INSTANCE); assertEquals(DateTimeFormatter.ISO_LOCAL_DATE_TIME.getZone(), null); assertEquals(DateTimeFormatter.ISO_LOCAL_DATE_TIME.getResolverStyle(), ResolverStyle.STRICT); } //----------------------------------------------------------------------- //----------------------------------------------------------------------- //----------------------------------------------------------------------- @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") 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) { TemporalAccessor test = buildAccessor(year, month, day, hour, min, sec, nano, offsetId, zoneId); if (expectedEx == null) { assertEquals(DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(test), expected); } else { try { DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(test); fail(); } catch (Exception ex) { assertTrue(expectedEx.isInstance(ex)); } } } @Test(dataProvider="sample_isoOffsetDateTime") 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) { Expected expected = createDateTime(year, month, day, hour, min, sec, nano); buildCalendrical(expected, offsetId, null); // zone not expected to be parsed assertParseMatch(DateTimeFormatter.ISO_OFFSET_DATE_TIME.parseUnresolved(input, new ParsePosition(0)), expected); } } @Test public void test_isoOffsetDateTime_basics() { assertEquals(DateTimeFormatter.ISO_OFFSET_DATE_TIME.getChronology(), IsoChronology.INSTANCE); assertEquals(DateTimeFormatter.ISO_OFFSET_DATE_TIME.getZone(), null); assertEquals(DateTimeFormatter.ISO_OFFSET_DATE_TIME.getResolverStyle(), ResolverStyle.STRICT); } //----------------------------------------------------------------------- //----------------------------------------------------------------------- //----------------------------------------------------------------------- @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") 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) { TemporalAccessor test = buildAccessor(year, month, day, hour, min, sec, nano, offsetId, zoneId); if (expectedEx == null) { assertEquals(DateTimeFormatter.ISO_ZONED_DATE_TIME.format(test), expected); } else { try { DateTimeFormatter.ISO_ZONED_DATE_TIME.format(test); fail(test.toString()); } catch (Exception ex) { assertTrue(expectedEx.isInstance(ex)); } } } @Test(dataProvider="sample_isoZonedDateTime") 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) { Expected expected = createDateTime(year, month, day, hour, min, sec, nano); if (offsetId.equals(zoneId)) { buildCalendrical(expected, offsetId, null); } else { buildCalendrical(expected, offsetId, zoneId); } assertParseMatch(DateTimeFormatter.ISO_ZONED_DATE_TIME.parseUnresolved(input, new ParsePosition(0)), expected); } } @Test public void test_isoZonedDateTime_basics() { assertEquals(DateTimeFormatter.ISO_ZONED_DATE_TIME.getChronology(), IsoChronology.INSTANCE); assertEquals(DateTimeFormatter.ISO_ZONED_DATE_TIME.getZone(), null); assertEquals(DateTimeFormatter.ISO_ZONED_DATE_TIME.getResolverStyle(), ResolverStyle.STRICT); } //----------------------------------------------------------------------- //----------------------------------------------------------------------- //----------------------------------------------------------------------- @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") 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) { TemporalAccessor test = buildAccessor(year, month, day, hour, min, sec, nano, offsetId, zoneId); if (expectedEx == null) { assertEquals(DateTimeFormatter.ISO_DATE_TIME.format(test), expected); } else { try { DateTimeFormatter.ISO_DATE_TIME.format(test); fail(); } catch (Exception ex) { assertTrue(expectedEx.isInstance(ex)); } } } @Test(dataProvider="sample_isoDateTime") 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) { Expected expected = createDateTime(year, month, day, hour, min, sec, nano); if (offsetId != null) { expected.add(ZoneOffset.of(offsetId)); if (zoneId != null) { expected.zone = ZoneId.of(zoneId); } } assertParseMatch(DateTimeFormatter.ISO_DATE_TIME.parseUnresolved(input, new ParsePosition(0)), expected); } } @Test public void test_isoDateTime_basics() { assertEquals(DateTimeFormatter.ISO_DATE_TIME.getChronology(), IsoChronology.INSTANCE); assertEquals(DateTimeFormatter.ISO_DATE_TIME.getZone(), null); assertEquals(DateTimeFormatter.ISO_DATE_TIME.getResolverStyle(), ResolverStyle.STRICT); } //----------------------------------------------------------------------- //----------------------------------------------------------------------- //----------------------------------------------------------------------- @Test public void test_print_isoOrdinalDate() { TemporalAccessor test = buildAccessor(LocalDateTime.of(2008, 6, 3, 11, 5, 30), null, null); assertEquals(DateTimeFormatter.ISO_ORDINAL_DATE.format(test), "2008-155"); } @Test public void test_print_isoOrdinalDate_offset() { TemporalAccessor test = buildAccessor(LocalDateTime.of(2008, 6, 3, 11, 5, 30), "Z", null); assertEquals(DateTimeFormatter.ISO_ORDINAL_DATE.format(test), "2008-155Z"); } @Test public void test_print_isoOrdinalDate_zoned() { TemporalAccessor test = buildAccessor(LocalDateTime.of(2008, 6, 3, 11, 5, 30), "+02:00", "Europe/Paris"); assertEquals(DateTimeFormatter.ISO_ORDINAL_DATE.format(test), "2008-155+02:00"); } @Test public void test_print_isoOrdinalDate_zoned_largeYear() { TemporalAccessor test = buildAccessor(LocalDateTime.of(123456, 6, 3, 11, 5, 30), "Z", null); assertEquals(DateTimeFormatter.ISO_ORDINAL_DATE.format(test), "+123456-155Z"); } @Test public void test_print_isoOrdinalDate_fields() { // mock for testing that does not fully comply with TemporalAccessor contract TemporalAccessor test = new TemporalAccessor() { @Override public boolean isSupported(TemporalField field) { return field == YEAR || field == DAY_OF_YEAR; } @Override public long getLong(TemporalField field) { if (field == YEAR) { return 2008; } if (field == DAY_OF_YEAR) { return 231; } throw new DateTimeException("Unsupported"); } }; assertEquals(DateTimeFormatter.ISO_ORDINAL_DATE.format(test), "2008-231"); } @Test(expectedExceptions=DateTimeException.class) public void test_print_isoOrdinalDate_missingField() { TemporalAccessor test = Year.of(2008); DateTimeFormatter.ISO_ORDINAL_DATE.format(test); } //----------------------------------------------------------------------- @Test public void test_parse_isoOrdinalDate() { Expected expected = new Expected(YEAR, 2008, DAY_OF_YEAR, 123); assertParseMatch(DateTimeFormatter.ISO_ORDINAL_DATE.parseUnresolved("2008-123", new ParsePosition(0)), expected); } @Test public void test_parse_isoOrdinalDate_largeYear() { Expected expected = new Expected(YEAR, 123456, DAY_OF_YEAR, 123); assertParseMatch(DateTimeFormatter.ISO_ORDINAL_DATE.parseUnresolved("+123456-123", new ParsePosition(0)), expected); } @Test public void test_isoOrdinalDate_basics() { assertEquals(DateTimeFormatter.ISO_ORDINAL_DATE.getChronology(), IsoChronology.INSTANCE); assertEquals(DateTimeFormatter.ISO_ORDINAL_DATE.getZone(), null); assertEquals(DateTimeFormatter.ISO_ORDINAL_DATE.getResolverStyle(), ResolverStyle.STRICT); } //----------------------------------------------------------------------- //----------------------------------------------------------------------- //----------------------------------------------------------------------- @Test public void test_print_basicIsoDate() { TemporalAccessor test = buildAccessor(LocalDateTime.of(2008, 6, 3, 11, 5, 30), null, null); assertEquals(DateTimeFormatter.BASIC_ISO_DATE.format(test), "20080603"); } @Test public void test_print_basicIsoDate_offset() { TemporalAccessor test = buildAccessor(LocalDateTime.of(2008, 6, 3, 11, 5, 30), "Z", null); assertEquals(DateTimeFormatter.BASIC_ISO_DATE.format(test), "20080603Z"); } @Test public void test_print_basicIsoDate_zoned() { TemporalAccessor test = buildAccessor(LocalDateTime.of(2008, 6, 3, 11, 5, 30), "+02:00", "Europe/Paris"); assertEquals(DateTimeFormatter.BASIC_ISO_DATE.format(test), "20080603+0200"); } @Test(expectedExceptions=DateTimeException.class) public void test_print_basicIsoDate_largeYear() { TemporalAccessor test = buildAccessor(LocalDateTime.of(123456, 6, 3, 11, 5, 30), "Z", null); DateTimeFormatter.BASIC_ISO_DATE.format(test); } @Test public void test_print_basicIsoDate_fields() { TemporalAccessor test = buildAccessor(LocalDate.of(2008, 6, 3), null, null); assertEquals(DateTimeFormatter.BASIC_ISO_DATE.format(test), "20080603"); } @Test(expectedExceptions=DateTimeException.class) public void test_print_basicIsoDate_missingField() { TemporalAccessor test = YearMonth.of(2008, 6); DateTimeFormatter.BASIC_ISO_DATE.format(test); } //----------------------------------------------------------------------- @Test public void test_parse_basicIsoDate() { LocalDate expected = LocalDate.of(2008, 6, 3); assertEquals(DateTimeFormatter.BASIC_ISO_DATE.parse("20080603", LocalDate::from), expected); } @Test(expectedExceptions=DateTimeParseException.class) public void test_parse_basicIsoDate_largeYear() { try { LocalDate expected = LocalDate.of(123456, 6, 3); assertEquals(DateTimeFormatter.BASIC_ISO_DATE.parse("+1234560603", LocalDate::from), expected); } catch (DateTimeParseException ex) { assertEquals(ex.getErrorIndex(), 0); assertEquals(ex.getParsedString(), "+1234560603"); throw ex; } } @Test public void test_basicIsoDate_basics() { assertEquals(DateTimeFormatter.BASIC_ISO_DATE.getChronology(), IsoChronology.INSTANCE); assertEquals(DateTimeFormatter.BASIC_ISO_DATE.getZone(), null); assertEquals(DateTimeFormatter.BASIC_ISO_DATE.getResolverStyle(), ResolverStyle.STRICT); } //----------------------------------------------------------------------- //----------------------------------------------------------------------- //----------------------------------------------------------------------- @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 = date.withYear(2005).withMonth(1).withDayOfMonth(2); private int week = 1; private int day = 1; public boolean hasNext() { return !date.isAfter(endDate); } public Object[] next() { StringBuilder sb = new StringBuilder("2004-W"); if (week < 10) { sb.append('0'); } sb.append(week).append('-').append(day).append(date.getOffset()); Object[] ret = new Object[] {date, sb.toString()}; date = date.plusDays(1); day += 1; if (day == 8) { day = 1; week++; } return ret; } public void remove() { throw new UnsupportedOperationException(); } }; } @Test(dataProvider="weekDate") public void test_print_isoWeekDate(TemporalAccessor test, String expected) { assertEquals(DateTimeFormatter.ISO_WEEK_DATE.format(test), expected); } @Test public void test_print_isoWeekDate_zoned_largeYear() { TemporalAccessor test = buildAccessor(LocalDateTime.of(123456, 6, 3, 11, 5, 30), "Z", null); assertEquals(DateTimeFormatter.ISO_WEEK_DATE.format(test), "+123456-W23-2Z"); } @Test public void test_print_isoWeekDate_fields() { TemporalAccessor test = buildAccessor(LocalDate.of(2004, 1, 27), null, null); assertEquals(DateTimeFormatter.ISO_WEEK_DATE.format(test), "2004-W05-2"); } @Test(expectedExceptions=DateTimeException.class) public void test_print_isoWeekDate_missingField() { TemporalAccessor test = YearMonth.of(2008, 6); DateTimeFormatter.ISO_WEEK_DATE.format(test); } //----------------------------------------------------------------------- @Test public void test_parse_weekDate() { LocalDate expected = LocalDate.of(2004, 1, 28); assertEquals(DateTimeFormatter.ISO_WEEK_DATE.parse("2004-W05-3", LocalDate::from), expected); } @Test public void test_parse_weekDate_largeYear() { TemporalAccessor parsed = DateTimeFormatter.ISO_WEEK_DATE.parseUnresolved("+123456-W04-5", new ParsePosition(0)); assertEquals(parsed.getLong(IsoFields.WEEK_BASED_YEAR), 123456L); assertEquals(parsed.getLong(IsoFields.WEEK_OF_WEEK_BASED_YEAR), 4L); assertEquals(parsed.getLong(DAY_OF_WEEK), 5L); } @Test public void test_isoWeekDate_basics() { assertEquals(DateTimeFormatter.ISO_WEEK_DATE.getChronology(), IsoChronology.INSTANCE); assertEquals(DateTimeFormatter.ISO_WEEK_DATE.getZone(), null); assertEquals(DateTimeFormatter.ISO_WEEK_DATE.getResolverStyle(), ResolverStyle.STRICT); } //----------------------------------------------------------------------- //----------------------------------------------------------------------- //----------------------------------------------------------------------- @DataProvider(name="sample_isoInstant") Object[][] provider_sample_isoInstant() { return new Object[][]{ {0, 0, "1970-01-01T00:00:00Z", null}, {0, null, "1970-01-01T00:00:00Z", null}, {0, -1, null, DateTimeException.class}, {-1, 0, "1969-12-31T23:59:59Z", null}, {1, 0, "1970-01-01T00:00:01Z", null}, {60, 0, "1970-01-01T00:01:00Z", null}, {3600, 0, "1970-01-01T01:00:00Z", null}, {86400, 0, "1970-01-02T00:00:00Z", null}, {0, 1, "1970-01-01T00:00:00.000000001Z", null}, {0, 2, "1970-01-01T00:00:00.000000002Z", null}, {0, 10, "1970-01-01T00:00:00.000000010Z", null}, {0, 100, "1970-01-01T00:00:00.000000100Z", null}, }; } @Test(dataProvider="sample_isoInstant") public void test_print_isoInstant( long instantSecs, Integer nano, String expected, Class<?> expectedEx) { TemporalAccessor test = buildAccessorInstant(instantSecs, nano); if (expectedEx == null) { assertEquals(DateTimeFormatter.ISO_INSTANT.format(test), expected); } else { try { DateTimeFormatter.ISO_INSTANT.format(test); fail(); } catch (Exception ex) { assertTrue(expectedEx.isInstance(ex)); } } } @Test(dataProvider="sample_isoInstant") public void test_parse_isoInstant( long instantSecs, Integer nano, String input, Class<?> invalid) { if (input != null) { TemporalAccessor parsed = DateTimeFormatter.ISO_INSTANT.parseUnresolved(input, new ParsePosition(0)); assertEquals(parsed.getLong(INSTANT_SECONDS), instantSecs); assertEquals(parsed.getLong(NANO_OF_SECOND), (nano == null ? 0 : nano)); } } @Test public void test_isoInstant_basics() { assertEquals(DateTimeFormatter.ISO_INSTANT.getChronology(), null); assertEquals(DateTimeFormatter.ISO_INSTANT.getZone(), null); assertEquals(DateTimeFormatter.ISO_INSTANT.getResolverStyle(), ResolverStyle.STRICT); } //----------------------------------------------------------------------- //----------------------------------------------------------------------- //----------------------------------------------------------------------- @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(dataProvider="rfc") public void test_print_rfc1123(LocalDateTime base, String offsetId, String expected) { TemporalAccessor test = buildAccessor(base, offsetId, null); assertEquals(DateTimeFormatter.RFC_1123_DATE_TIME.format(test), expected); } @Test(dataProvider="rfc") public void test_print_rfc1123_french(LocalDateTime base, String offsetId, String expected) { TemporalAccessor test = buildAccessor(base, offsetId, null); assertEquals(DateTimeFormatter.RFC_1123_DATE_TIME.withLocale(Locale.FRENCH).format(test), expected); } @Test(expectedExceptions=DateTimeException.class) public void test_print_rfc1123_missingField() { TemporalAccessor test = YearMonth.of(2008, 6); DateTimeFormatter.RFC_1123_DATE_TIME.format(test); } @Test public void test_rfc1123_basics() { assertEquals(DateTimeFormatter.RFC_1123_DATE_TIME.getChronology(), IsoChronology.INSTANCE); assertEquals(DateTimeFormatter.RFC_1123_DATE_TIME.getZone(), null); assertEquals(DateTimeFormatter.RFC_1123_DATE_TIME.getResolverStyle(), ResolverStyle.SMART); } //----------------------------------------------------------------------- //----------------------------------------------------------------------- //----------------------------------------------------------------------- private Expected createDate(Integer year, Integer month, Integer day) { Expected test = new Expected(); if (year != null) { test.fieldValues.put(YEAR, (long) year); } if (month != null) { test.fieldValues.put(MONTH_OF_YEAR, (long) month); } if (day != null) { test.fieldValues.put(DAY_OF_MONTH, (long) day); } return test; } private Expected createTime(Integer hour, Integer min, Integer sec, Integer nano) { Expected test = new Expected(); if (hour != null) { test.fieldValues.put(HOUR_OF_DAY, (long) hour); } if (min != null) { test.fieldValues.put(MINUTE_OF_HOUR, (long) min); } if (sec != null) { test.fieldValues.put(SECOND_OF_MINUTE, (long) sec); } if (nano != null) { test.fieldValues.put(NANO_OF_SECOND, (long) nano); } return test; } private Expected createDateTime( Integer year, Integer month, Integer day, Integer hour, Integer min, Integer sec, Integer nano) { Expected test = new Expected(); if (year != null) { test.fieldValues.put(YEAR, (long) year); } if (month != null) { test.fieldValues.put(MONTH_OF_YEAR, (long) month); } if (day != null) { test.fieldValues.put(DAY_OF_MONTH, (long) day); } if (hour != null) { test.fieldValues.put(HOUR_OF_DAY, (long) hour); } if (min != null) { test.fieldValues.put(MINUTE_OF_HOUR, (long) min); } if (sec != null) { test.fieldValues.put(SECOND_OF_MINUTE, (long) sec); } if (nano != null) { test.fieldValues.put(NANO_OF_SECOND, (long) nano); } return test; } private TemporalAccessor 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 TemporalAccessor buildAccessor(LocalDateTime base, String offsetId, String zoneId) { MockAccessor mock = new MockAccessor(); mock.setFields(base); mock.setOffset(offsetId); mock.setZone(zoneId); return mock; } private TemporalAccessor buildAccessor(LocalDate base, String offsetId, String zoneId) { MockAccessor mock = new MockAccessor(); mock.setFields(base); mock.setOffset(offsetId); mock.setZone(zoneId); return mock; } private TemporalAccessor buildAccessorInstant(long instantSecs, Integer nano) { MockAccessor mock = new MockAccessor(); mock.fields.put(INSTANT_SECONDS, instantSecs); if (nano != null) { mock.fields.put(NANO_OF_SECOND, (long) nano); } return mock; } private void buildCalendrical(Expected expected, String offsetId, String zoneId) { if (offsetId != null) { expected.add(ZoneOffset.of(offsetId)); } if (zoneId != null) { expected.zone = ZoneId.of(zoneId); } } private void assertParseMatch(TemporalAccessor parsed, Expected expected) { for (TemporalField field : expected.fieldValues.keySet()) { assertEquals(parsed.isSupported(field), true); parsed.getLong(field); } assertEquals(parsed.query(TemporalQuery.chronology()), expected.chrono); assertEquals(parsed.query(TemporalQuery.zoneId()), expected.zone); } //------------------------------------------------------------------------- static class MockAccessor implements TemporalAccessor { Map<TemporalField, Long> fields = new HashMap<>(); ZoneId zoneId; void setFields(LocalDate dt) { if (dt != null) { fields.put(YEAR, (long) dt.getYear()); fields.put(MONTH_OF_YEAR, (long) dt.getMonthValue()); fields.put(DAY_OF_MONTH, (long) dt.getDayOfMonth()); fields.put(DAY_OF_YEAR, (long) dt.getDayOfYear()); fields.put(DAY_OF_WEEK, (long) dt.getDayOfWeek().getValue()); fields.put(IsoFields.WEEK_BASED_YEAR, dt.getLong(IsoFields.WEEK_BASED_YEAR)); fields.put(IsoFields.WEEK_OF_WEEK_BASED_YEAR, dt.getLong(IsoFields.WEEK_OF_WEEK_BASED_YEAR)); } } void setFields(LocalDateTime dt) { if (dt != null) { fields.put(YEAR, (long) dt.getYear()); fields.put(MONTH_OF_YEAR, (long) dt.getMonthValue()); fields.put(DAY_OF_MONTH, (long) dt.getDayOfMonth()); fields.put(DAY_OF_YEAR, (long) dt.getDayOfYear()); fields.put(DAY_OF_WEEK, (long) dt.getDayOfWeek().getValue()); fields.put(IsoFields.WEEK_BASED_YEAR, dt.getLong(IsoFields.WEEK_BASED_YEAR)); fields.put(IsoFields.WEEK_OF_WEEK_BASED_YEAR, dt.getLong(IsoFields.WEEK_OF_WEEK_BASED_YEAR)); fields.put(HOUR_OF_DAY, (long) dt.getHour()); fields.put(MINUTE_OF_HOUR, (long) dt.getMinute()); fields.put(SECOND_OF_MINUTE, (long) dt.getSecond()); 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(TemporalField field) { return fields.containsKey(field); } @Override public long getLong(TemporalField field) { try { return fields.get(field); } catch (NullPointerException ex) { throw new DateTimeException("Field missing: " + field); } } @SuppressWarnings("unchecked") @Override public <R> R query(TemporalQuery<R> query) { if (query == TemporalQuery.zoneId()) { return (R) zoneId; } return TemporalAccessor.super.query(query); } @Override public String toString() { return fields + (zoneId != null ? " " + zoneId : ""); } } //----------------------------------------------------------------------- static class Expected { Map<TemporalField, Long> fieldValues = new HashMap<>(); ZoneId zone; Chronology chrono; Expected() { } Expected(TemporalField field1, long value1, TemporalField field2, long value2) { fieldValues.put(field1, value1); fieldValues.put(field2, value2); } void add(ZoneOffset offset) { fieldValues.put(OFFSET_SECONDS, (long) offset.getTotalSeconds()); } } }