blob: e370521b7f096f0ecd9ea104c817a19e174449e3 [file] [log] [blame]
/*
* 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.TemporalQueries;
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");
Locale fmtLocale = Locale.getDefault(Locale.Category.FORMAT);
assertEquals(test.format(LocalDate.of(2012, 6, 30)), "30 " +
Month.JUNE.getDisplayName(TextStyle.SHORT, fmtLocale) + " 2012");
assertEquals(test.getLocale(), fmtLocale, "Locale.Category.FORMAT");
}
@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(TemporalQueries.chronology()), expected.chrono);
assertEquals(parsed.query(TemporalQueries.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 == TemporalQueries.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());
}
}
}