package net.time4j.range; import net.time4j.PlainDate; import net.time4j.format.expert.ChronoFormatter; import net.time4j.format.expert.ChronoParser; import net.time4j.format.expert.Iso8601Format; import net.time4j.format.expert.IsoDateStyle; import net.time4j.format.expert.ParseLog; import net.time4j.format.expert.PatternType; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import java.io.IOException; import java.text.ParseException; import java.util.Locale; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @RunWith(JUnit4.class) public class DateIntervalFormatTest { @Test public void printTechnicalSymbol() throws IOException { PlainDate start = PlainDate.of(2014, 2, 27); PlainDate end = PlainDate.of(2014, 5, 14); DateInterval interval = DateInterval.between(start, end); ChronoFormatter<PlainDate> startFormat = Iso8601Format.EXTENDED_CALENDAR_DATE; ChronoFormatter<PlainDate> endFormat = ChronoFormatter.ofDatePattern("MM-dd", PatternType.CLDR, Locale.ROOT); StringBuilder sb = new StringBuilder(); interval.print(startFormat, '/', endFormat, BracketPolicy.SHOW_ALWAYS, InfinityStyle.SYMBOL, sb); assertThat( sb.toString(), is("[2014-02-27/05-14]")); interval = DateInterval.since(PlainDate.of(2016, 8, 15)); sb = new StringBuilder(); interval.print(startFormat, '/', endFormat, BracketPolicy.SHOW_ALWAYS, InfinityStyle.SYMBOL, sb); assertThat( sb.toString(), is("[2016-08-15/+\u221E)")); interval = DateInterval.until(PlainDate.of(2016, 8, 15)); sb = new StringBuilder(); interval.print(startFormat, '/', startFormat, BracketPolicy.SHOW_ALWAYS, InfinityStyle.SYMBOL, sb); assertThat( sb.toString(), is("(-\u221E/2016-08-15]")); } @Test public void printTechnicalHyphen() throws IOException { ChronoFormatter<PlainDate> format = Iso8601Format.EXTENDED_CALENDAR_DATE; DateInterval interval = DateInterval.since(PlainDate.of(2016, 8, 15)); StringBuilder sb = new StringBuilder(); interval.print(format, '/', format, BracketPolicy.SHOW_ALWAYS, InfinityStyle.HYPHEN, sb); assertThat( sb.toString(), is("[2016-08-15/-)")); interval = DateInterval.until(PlainDate.of(2016, 8, 15)); sb = new StringBuilder(); interval.print(format, '/', format, BracketPolicy.SHOW_ALWAYS, InfinityStyle.HYPHEN, sb); assertThat( sb.toString(), is("(-/2016-08-15]")); } @Test public void printTechnicalMinMax() throws IOException { ChronoFormatter<PlainDate> format = Iso8601Format.EXTENDED_CALENDAR_DATE; DateInterval interval = DateInterval.since(PlainDate.of(2016, 8, 15)); StringBuilder sb = new StringBuilder(); interval.print(format, '/', format, BracketPolicy.SHOW_ALWAYS, InfinityStyle.MIN_MAX, sb); assertThat( sb.toString(), is("[2016-08-15/+999999999-12-31)")); interval = DateInterval.until(PlainDate.of(2016, 8, 15)); sb = new StringBuilder(); interval.print(format, '/', format, BracketPolicy.SHOW_ALWAYS, InfinityStyle.MIN_MAX, sb); assertThat( sb.toString(), is("(-999999999-01-01/2016-08-15]")); } @Test(expected=IllegalStateException.class) public void printTechnicalAbort() throws IOException { ChronoFormatter<PlainDate> format = Iso8601Format.EXTENDED_CALENDAR_DATE; DateInterval interval = DateInterval.since(PlainDate.of(2016, 8, 15)); interval.print(format, '/', format, BracketPolicy.SHOW_ALWAYS, InfinityStyle.ABORT, new StringBuilder()); } @Test public void printCustom1() { DateInterval interval = DateInterval.since(PlainDate.of(2015, 1, 1)); ChronoFormatter<PlainDate> formatter = ChronoFormatter.ofDatePattern("MMM d, yyyy", PatternType.CLDR, Locale.US); assertThat( interval.print(formatter, "since {0}"), is("since Jan 1, 2015") ); } @Test public void printCustom2() { PlainDate start = PlainDate.of(2014, 2, 27); PlainDate end = PlainDate.of(2014, 5, 14); DateInterval interval = DateInterval.between(start, end); ChronoFormatter<PlainDate> formatter = ChronoFormatter.ofDatePattern("MMM d, yyyy", PatternType.CLDR, Locale.US); assertThat( interval.print(formatter), is("Feb 27, 2014 – May 14, 2014") ); } @Test public void printSHOW_NEVER() { PlainDate start = PlainDate.of(2014, 2, 27); PlainDate end = PlainDate.of(2014, 5, 14); DateInterval interval = DateInterval.between(start, end); ChronoFormatter<PlainDate> formatter = Iso8601Format.BASIC_CALENDAR_DATE; assertThat( interval.print(formatter, BracketPolicy.SHOW_NEVER), is("20140227/20140514")); assertThat( interval.withOpenEnd().print(formatter, BracketPolicy.SHOW_NEVER), is("20140227/20140513")); } @Test public void printSHOW_WHEN_NON_STANDARD() { PlainDate start = PlainDate.of(2014, 2, 27); PlainDate end = PlainDate.of(2014, 5, 14); DateInterval interval = DateInterval.between(start, end); ChronoFormatter<PlainDate> formatter = Iso8601Format.BASIC_CALENDAR_DATE; assertThat( interval.print(formatter, BracketPolicy.SHOW_WHEN_NON_STANDARD), is("20140227/20140514")); assertThat( interval.withOpenEnd().print( formatter, BracketPolicy.SHOW_WHEN_NON_STANDARD), is("[20140227/20140514)")); } @Test public void printSHOW_ALWAYS() { PlainDate start = PlainDate.of(2014, 2, 27); PlainDate end = PlainDate.of(2014, 5, 14); DateInterval interval = DateInterval.between(start, end); ChronoFormatter<PlainDate> formatter = Iso8601Format.BASIC_CALENDAR_DATE; assertThat( interval.print(formatter, BracketPolicy.SHOW_ALWAYS), is("[20140227/20140514]")); } @Test public void printInfinitePastSHOW_ALWAYS() { PlainDate end = PlainDate.of(2014, 5, 14); DateInterval interval = DateInterval.until(end); ChronoFormatter<PlainDate> formatter = Iso8601Format.BASIC_CALENDAR_DATE; assertThat( interval.print(formatter, BracketPolicy.SHOW_ALWAYS), is("(-\u221E/20140514]")); } @Test public void printInfiniteFutureSHOW_ALWAYS() { PlainDate start = PlainDate.of(2014, 5, 14); DateInterval interval = DateInterval.since(start); ChronoFormatter<PlainDate> formatter = Iso8601Format.BASIC_CALENDAR_DATE; assertThat( interval.print(formatter, BracketPolicy.SHOW_ALWAYS), is("[20140514/+\u221E)")); } @Test public void printInfinitePastSHOW_WHEN_NON_STANDARD() { PlainDate end = PlainDate.of(2014, 5, 14); DateInterval interval = DateInterval.until(end); ChronoFormatter<PlainDate> formatter = Iso8601Format.BASIC_CALENDAR_DATE; assertThat( interval.print(formatter, BracketPolicy.SHOW_WHEN_NON_STANDARD), is("(-\u221E/20140514]")); assertThat( interval.withOpenEnd().print( formatter, BracketPolicy.SHOW_WHEN_NON_STANDARD), is("(-\u221E/20140514)")); } @Test public void printInfiniteFutureSHOW_WHEN_NON_STANDARD() { PlainDate start = PlainDate.of(2014, 5, 14); DateInterval interval = DateInterval.since(start); ChronoFormatter<PlainDate> formatter = Iso8601Format.BASIC_CALENDAR_DATE; assertThat( interval.print(formatter, BracketPolicy.SHOW_WHEN_NON_STANDARD), is("[20140514/+\u221E)")); } @Test public void printInfinitePastSHOW_NEVER() { PlainDate end = PlainDate.of(2014, 5, 14); DateInterval interval = DateInterval.until(end); ChronoFormatter<PlainDate> formatter = Iso8601Format.BASIC_CALENDAR_DATE; assertThat( interval.print(formatter, BracketPolicy.SHOW_NEVER), is("-\u221E/20140514")); assertThat( interval.withOpenEnd().print( formatter, BracketPolicy.SHOW_NEVER), is("-\u221E/20140513")); } @Test public void printInfiniteFutureSHOW_NEVER() { PlainDate start = PlainDate.of(2014, 5, 14); DateInterval interval = DateInterval.since(start); ChronoFormatter<PlainDate> formatter = Iso8601Format.BASIC_CALENDAR_DATE; assertThat( interval.print(formatter, BracketPolicy.SHOW_NEVER), is("20140514/+\u221E")); } @Test public void parseBasicCalendarDateSHOW_NEVER() throws ParseException { PlainDate start = PlainDate.of(2014, 2, 27); PlainDate end = PlainDate.of(2014, 5, 14); ChronoInterval<PlainDate> interval = DateInterval.between(start, end); ChronoFormatter<PlainDate> formatter = Iso8601Format.BASIC_CALENDAR_DATE; assertThat( IntervalParser.of( DateIntervalFactory.INSTANCE, formatter, BracketPolicy.SHOW_NEVER ).parse("20140227/20140514"), is(interval)); } @Test(expected=ParseException.class) public void parseBasicCalendarDateExSHOW_NEVER() throws ParseException { IntervalParser.of( DateIntervalFactory.INSTANCE, Iso8601Format.BASIC_CALENDAR_DATE, BracketPolicy.SHOW_NEVER ).parse("[20140227/20140514]"); } @Test(expected=ParseException.class) public void parseBasicCalendarDateExSHOW_WHEN_NON_STANDARD() throws ParseException { IntervalParser.of( DateIntervalFactory.INSTANCE, Iso8601Format.BASIC_CALENDAR_DATE, BracketPolicy.SHOW_WHEN_NON_STANDARD ).parse("[20140227/20140514]"); } @Test(expected=ParseException.class) public void parseBasicCalendarDateExSHOW_ALWAYS() throws ParseException { IntervalParser.of( DateIntervalFactory.INSTANCE, Iso8601Format.BASIC_CALENDAR_DATE, BracketPolicy.SHOW_ALWAYS ).parse("20140227/20140514"); } @Test public void parseBasicCalendarDateSHOW_WHEN_NON_STANDARD() throws ParseException { PlainDate start = PlainDate.of(2014, 2, 27); PlainDate end = PlainDate.of(2014, 5, 14); ChronoInterval<PlainDate> interval = DateInterval.between(start, end); ChronoFormatter<PlainDate> formatter = Iso8601Format.BASIC_CALENDAR_DATE; assertThat( IntervalParser.of( DateIntervalFactory.INSTANCE, formatter, BracketPolicy.SHOW_WHEN_NON_STANDARD ).parse("20140227/20140514"), is(interval)); } @Test public void parseBasicCalendarDateSHOW_ALWAYS() throws ParseException { PlainDate start = PlainDate.of(2014, 2, 27); PlainDate end = PlainDate.of(2014, 5, 14); ChronoInterval<PlainDate> interval = DateInterval.between(start, end); ChronoFormatter<PlainDate> formatter = Iso8601Format.BASIC_CALENDAR_DATE; assertThat( IntervalParser.of( DateIntervalFactory.INSTANCE, formatter, BracketPolicy.SHOW_ALWAYS ).parse("[20140227/20140514]"), is(interval)); } @Test public void parseCustom() throws ParseException { PlainDate start = PlainDate.of(2014, 2, 27); PlainDate end = PlainDate.of(2014, 5, 14); ChronoInterval<PlainDate> interval = DateInterval.between(start, end); ChronoFormatter<PlainDate> formatter = Iso8601Format.BASIC_CALENDAR_DATE; assertThat( DateInterval.parse("20140227 - 20140514", formatter, "{0} - {1}"), is(interval)); } @Test public void parseBasicIsoCalendardate() throws ParseException { PlainDate start = PlainDate.of(2012, 1, 1); PlainDate end = PlainDate.of(2014, 2, 14); DateInterval expected = DateInterval.between(start, end); assertThat( DateInterval.parseISO("20120101/20140214"), is(expected)); } @Test public void parseExtendedIsoCalendardate() throws ParseException { PlainDate start = PlainDate.of(2012, 1, 1); PlainDate end = PlainDate.of(2014, 2, 14); DateInterval expected = DateInterval.between(start, end); assertThat( DateInterval.parseISO("2012-01-01/2014-02-14"), is(expected)); } @Test public void parseBasicIsoOrdinaldate() throws ParseException { PlainDate start = PlainDate.of(2012, 1, 1); PlainDate end = PlainDate.of(2014, 12, 31); DateInterval expected = DateInterval.between(start, end); assertThat( DateInterval.parseISO("2012001/2014365"), is(expected)); } @Test public void parseExtendedIsoOrdinaldate() throws ParseException { PlainDate start = PlainDate.of(2012, 1, 1); PlainDate end = PlainDate.of(2014, 12, 31); DateInterval expected = DateInterval.between(start, end); assertThat( DateInterval.parseISO("2012-001/2014-365"), is(expected)); } @Test public void parseBasicIsoWeekdate() throws ParseException { PlainDate start = PlainDate.of(2012, 1, 2); PlainDate end = PlainDate.of(2014, 1, 30); DateInterval expected = DateInterval.between(start, end); assertThat( DateInterval.parseISO("2012W011/2014W054"), is(expected)); } @Test public void parseExtendedIsoWeekdate() throws ParseException { PlainDate start = PlainDate.of(2012, 1, 2); PlainDate end = PlainDate.of(2014, 1, 30); DateInterval expected = DateInterval.between(start, end); assertThat( DateInterval.parseISO("2012-W01-1/2014-W05-4"), is(expected)); } @Test public void parseIsoOrdinaldateAbbreviated() throws ParseException { PlainDate start = PlainDate.of(2012, 1, 1); PlainDate end = PlainDate.of(2012, 12, 31); DateInterval expected = DateInterval.between(start, end); assertThat( DateInterval.parseISO("2012-001/366"), is(expected)); } @Test public void parseIsoWeekdateAbbreviated1() throws ParseException { PlainDate start = PlainDate.of(2012, 1, 2); PlainDate end = PlainDate.of(2012, 2, 2); DateInterval expected = DateInterval.between(start, end); assertThat( DateInterval.parseISO("2012-W01-1/W05-4"), is(expected)); } @Test public void parseIsoWeekdateAbbreviated2() throws ParseException { PlainDate start = PlainDate.of(2012, 1, 2); PlainDate end = PlainDate.of(2012, 1, 5); DateInterval expected = DateInterval.between(start, end); assertThat( DateInterval.parseISO("2012-W01-1/4"), is(expected)); } @Test public void parseIsoCalendardateAbbreviated1() throws ParseException { PlainDate start = PlainDate.of(2012, 1, 1); PlainDate end = PlainDate.of(2012, 2, 14); DateInterval expected = DateInterval.between(start, end); assertThat( DateInterval.parseISO("2012-01-01/02-14"), is(expected)); } @Test public void parseIsoCalendardateAbbreviated2() throws ParseException { PlainDate start = PlainDate.of(2012, 1, 1); PlainDate end = PlainDate.of(2012, 1, 14); DateInterval expected = DateInterval.between(start, end); assertThat( DateInterval.parseISO("2012-01-01/14"), is(expected)); } @Test(expected=ParseException.class) public void parseBasicIsoWeekdateAbbreviatedMissingWOY() throws ParseException { DateInterval.parseISO("2012W011/2012"); } @Test(expected=ParseException.class) public void parseExtendedIsoOrdinaldateAbbreviatedMissingDOY() throws ParseException { DateInterval.parseISO("2012-001/2012-"); } @Test(expected=ParseException.class) public void parseBasicIsoOrdinaldateAbbreviatedMissingDOY() throws ParseException { DateInterval.parseISO("2012001/2012"); } @Test public void parsePeriodAndCalendarDate1() throws ParseException { PlainDate start = PlainDate.of(2012, 1, 1); DateInterval expected = DateInterval.atomic(start); assertThat( DateInterval.parseISO("P0D/2012-01-01"), is(expected)); } @Test public void parsePeriodAndCalendarDate2() throws ParseException { PlainDate start = PlainDate.of(2012, 1, 1); PlainDate end = PlainDate.of(2012, 1, 14); DateInterval expected = DateInterval.between(start, end); assertThat( DateInterval.parseISO("P13D/2012-01-14"), is(expected)); } @Test public void parsePeriodAndCalendarDate3() throws ParseException { PlainDate start = PlainDate.of(2012, 1, 1); PlainDate end = PlainDate.of(2014, 2, 14); DateInterval expected = DateInterval.between(start, end); assertThat( DateInterval.parseISO("P775D/2014-02-14"), is(expected)); } @Test public void parseCalendarDateAndPeriod() throws ParseException { PlainDate start = PlainDate.of(2012, 1, 1); PlainDate end = PlainDate.of(2014, 2, 14); DateInterval expected = DateInterval.between(start, end); assertThat( DateInterval.parseISO("2012-01-01/P775D"), is(expected)); } @Test public void parsePeriodAndOrdinalDate() throws ParseException { PlainDate start = PlainDate.of(2012, 1, 1); PlainDate end = PlainDate.of(2014, 2, 14); DateInterval expected = DateInterval.between(start, end); assertThat( DateInterval.parseISO("P775D/2014045"), is(expected)); } @Test public void parseOrdinalDateAndPeriod() throws ParseException { PlainDate start = PlainDate.of(2012, 1, 1); PlainDate end = PlainDate.of(2014, 2, 14); DateInterval expected = DateInterval.between(start, end); assertThat( DateInterval.parseISO("2012001/P775D"), is(expected)); } @Test(expected=IndexOutOfBoundsException.class) public void parseEmpty() throws ParseException { DateInterval.parseISO(""); } @Test(expected=ParseException.class) public void parseNoSolidus() throws ParseException { DateInterval.parseISO("2012001P775D"); } @Test(expected=ParseException.class) public void parseTrailingSpace1() throws ParseException { DateInterval.parseISO("20120101/20140214 "); } @Test(expected=ParseException.class) public void parseTrailingSpace2() throws ParseException { DateInterval.parseISO("2012-01-01/2014-02-14 "); } @Test public void parseExtendedOpenCalendardate() throws ParseException { PlainDate start = PlainDate.of(2012, 1, 1); PlainDate end = PlainDate.of(2014, 2, 14); DateInterval parsed = DateInterval.parse( "(2012-01-01/2014-02-14)", Iso8601Format.EXTENDED_CALENDAR_DATE, BracketPolicy.SHOW_ALWAYS); assertThat( parsed.getStart(), is(Boundary.ofOpen(start))); assertThat( parsed.getEnd(), is(Boundary.ofOpen(end))); } @Test(expected=ParseException.class) // open start equals open end public void parseInvalidOpenCalendardate() throws ParseException { DateInterval.parse( "(2012-01-01/2012-01-01)", Iso8601Format.EXTENDED_CALENDAR_DATE, BracketPolicy.SHOW_ALWAYS); } @Test public void parseCustomUS1() throws ParseException { PlainDate start = PlainDate.of(2015, 7, 20); PlainDate end = PlainDate.of(2015, 12, 31); DateInterval interval = DateInterval.between(start, end); ParseLog plog = new ParseLog(); assertThat( DateInterval.parse( "July 20 / 2015 - December 31 / 2015", ChronoFormatter.ofDatePattern("MMMM d / uuuu ", PatternType.CLDR, Locale.US), '-', ChronoFormatter.ofDatePattern(" MMMM d / uuuu", PatternType.CLDR, Locale.US), BracketPolicy.SHOW_WHEN_NON_STANDARD, plog), is(interval)); } @Test public void parseCustomUS2() throws ParseException { PlainDate start = PlainDate.of(2015, 7, 20); PlainDate end = PlainDate.of(2015, 12, 31); DateInterval interval = DateInterval.between(start, end); assertThat( DateInterval.parse( "July 20 / 2015 – December 31 / 2015", ChronoFormatter.ofDatePattern("MMMM d / uuuu", PatternType.CLDR, Locale.US)), is(interval)); } @Test(expected=ParseException.class) public void parseCustomStartAfterEnd() throws ParseException { DateInterval.parse( "July 20 / 2016 – December 31 / 2015", ChronoFormatter.ofDatePattern("MMMM d / uuuu", PatternType.CLDR, Locale.US)); } @Test public void parseMultiPattern() throws ParseException { String multiPattern = "{0} - {1}|since {0}|until {1}"; ChronoParser<PlainDate> parser = ChronoFormatter.ofDatePattern("MMMM d / uuuu", PatternType.CLDR, Locale.US); PlainDate start = PlainDate.of(2015, 7, 20); PlainDate end = PlainDate.of(2015, 12, 31); assertThat( DateInterval.parse( "July 20 / 2015 - December 31 / 2015", parser, multiPattern), is(DateInterval.between(start, end))); assertThat( DateInterval.parse( "since July 20 / 2015", parser, multiPattern), is(DateInterval.since(start))); assertThat( DateInterval.parse( "until December 31 / 2015", parser, multiPattern), is(DateInterval.until(end))); } @Test public void formatISO() { PlainDate start = PlainDate.of(2014, 2, 27); PlainDate end = PlainDate.of(2014, 5, 14); DateInterval interval = DateInterval.between(start, end); assertThat( interval.formatISO(IsoDateStyle.BASIC_CALENDAR_DATE, InfinityStyle.SYMBOL), is("20140227/20140514")); assertThat( interval.formatISO(IsoDateStyle.BASIC_ORDINAL_DATE, InfinityStyle.SYMBOL), is("2014058/2014134")); assertThat( interval.formatISO(IsoDateStyle.BASIC_WEEK_DATE, InfinityStyle.SYMBOL), is("2014W094/2014W203")); assertThat( interval.formatISO(IsoDateStyle.EXTENDED_CALENDAR_DATE, InfinityStyle.SYMBOL), is("2014-02-27/2014-05-14")); assertThat( interval.formatISO(IsoDateStyle.EXTENDED_ORDINAL_DATE, InfinityStyle.SYMBOL), is("2014-058/2014-134")); assertThat( interval.formatISO(IsoDateStyle.EXTENDED_WEEK_DATE, InfinityStyle.SYMBOL), is("2014-W09-4/2014-W20-3")); } @Test public void formatISOInfinity() { assertThat( DateInterval.since(PlainDate.of(2016, 2, 28)).formatISO( IsoDateStyle.EXTENDED_CALENDAR_DATE, InfinityStyle.SYMBOL), is("2016-02-28/+∞")); assertThat( DateInterval.since(PlainDate.of(2016, 2, 28)).formatISO( IsoDateStyle.EXTENDED_CALENDAR_DATE, InfinityStyle.HYPHEN), is("2016-02-28/-")); assertThat( DateInterval.since(PlainDate.of(2016, 2, 28)).formatISO( IsoDateStyle.EXTENDED_CALENDAR_DATE, InfinityStyle.MIN_MAX), is("2016-02-28/+999999999-12-31")); assertThat( DateInterval.until(PlainDate.of(2016, 2, 28)).formatISO( IsoDateStyle.EXTENDED_CALENDAR_DATE, InfinityStyle.SYMBOL), is("-∞/2016-02-28")); assertThat( DateInterval.until(PlainDate.of(2016, 2, 28)).formatISO( IsoDateStyle.EXTENDED_CALENDAR_DATE, InfinityStyle.HYPHEN), is("-/2016-02-28")); assertThat( DateInterval.until(PlainDate.of(2016, 2, 28)).formatISO( IsoDateStyle.EXTENDED_CALENDAR_DATE, InfinityStyle.MIN_MAX), is("-999999999-01-01/2016-02-28")); } @Test public void formatReduced1() { PlainDate start = PlainDate.of(2014, 2, 27); PlainDate end = PlainDate.of(2015, 5, 14); DateInterval interval = DateInterval.between(start, end); assertThat( interval.formatReduced(IsoDateStyle.BASIC_CALENDAR_DATE, InfinityStyle.SYMBOL), is("20140227/20150514")); assertThat( interval.formatReduced(IsoDateStyle.BASIC_ORDINAL_DATE, InfinityStyle.SYMBOL), is("2014058/2015134")); assertThat( interval.formatReduced(IsoDateStyle.BASIC_WEEK_DATE, InfinityStyle.SYMBOL), is("2014W094/2015W204")); assertThat( interval.formatReduced(IsoDateStyle.EXTENDED_CALENDAR_DATE, InfinityStyle.SYMBOL), is("2014-02-27/2015-05-14")); assertThat( interval.formatReduced(IsoDateStyle.EXTENDED_ORDINAL_DATE, InfinityStyle.SYMBOL), is("2014-058/2015-134")); assertThat( interval.formatReduced(IsoDateStyle.EXTENDED_WEEK_DATE, InfinityStyle.SYMBOL), is("2014-W09-4/2015-W20-4")); } @Test public void formatReduced2() { PlainDate start = PlainDate.of(2016, 2, 29); PlainDate end = PlainDate.of(2016, 3, 13); DateInterval interval = DateInterval.between(start, end); assertThat( interval.formatReduced(IsoDateStyle.BASIC_CALENDAR_DATE, InfinityStyle.SYMBOL), is("20160229/0313")); assertThat( interval.formatReduced(IsoDateStyle.BASIC_ORDINAL_DATE, InfinityStyle.SYMBOL), is("2016060/073")); assertThat( interval.formatReduced(IsoDateStyle.BASIC_WEEK_DATE, InfinityStyle.SYMBOL), is("2016W091/W107")); assertThat( interval.formatReduced(IsoDateStyle.EXTENDED_CALENDAR_DATE, InfinityStyle.SYMBOL), is("2016-02-29/03-13")); assertThat( interval.formatReduced(IsoDateStyle.EXTENDED_ORDINAL_DATE, InfinityStyle.SYMBOL), is("2016-060/073")); assertThat( interval.formatReduced(IsoDateStyle.EXTENDED_WEEK_DATE, InfinityStyle.SYMBOL), is("2016-W09-1/W10-7")); } @Test public void formatReduced3() { PlainDate start = PlainDate.of(2016, 2, 22); PlainDate end = PlainDate.of(2016, 2, 28); DateInterval interval = DateInterval.between(start, end); assertThat( interval.formatReduced(IsoDateStyle.BASIC_CALENDAR_DATE, InfinityStyle.SYMBOL), is("20160222/28")); assertThat( interval.formatReduced(IsoDateStyle.BASIC_ORDINAL_DATE, InfinityStyle.SYMBOL), is("2016053/059")); assertThat( interval.formatReduced(IsoDateStyle.BASIC_WEEK_DATE, InfinityStyle.SYMBOL), is("2016W081/7")); assertThat( interval.formatReduced(IsoDateStyle.EXTENDED_CALENDAR_DATE, InfinityStyle.SYMBOL), is("2016-02-22/28")); assertThat( interval.formatReduced(IsoDateStyle.EXTENDED_ORDINAL_DATE, InfinityStyle.SYMBOL), is("2016-053/059")); assertThat( interval.formatReduced(IsoDateStyle.EXTENDED_WEEK_DATE, InfinityStyle.SYMBOL), is("2016-W08-1/7")); } @Test public void formatReducedInfinity() { assertThat( DateInterval.since(PlainDate.of(2016, 2, 28)).formatReduced( IsoDateStyle.EXTENDED_CALENDAR_DATE, InfinityStyle.SYMBOL), is("2016-02-28/+∞")); assertThat( DateInterval.since(PlainDate.of(2016, 2, 28)).formatReduced( IsoDateStyle.EXTENDED_CALENDAR_DATE, InfinityStyle.HYPHEN), is("2016-02-28/-")); assertThat( DateInterval.since(PlainDate.of(2016, 2, 28)).formatReduced( IsoDateStyle.EXTENDED_CALENDAR_DATE, InfinityStyle.MIN_MAX), is("2016-02-28/+999999999-12-31")); assertThat( DateInterval.until(PlainDate.of(2016, 2, 28)).formatReduced( IsoDateStyle.EXTENDED_CALENDAR_DATE, InfinityStyle.SYMBOL), is("-∞/2016-02-28")); assertThat( DateInterval.until(PlainDate.of(2016, 2, 28)).formatReduced( IsoDateStyle.EXTENDED_CALENDAR_DATE, InfinityStyle.HYPHEN), is("-/2016-02-28")); assertThat( DateInterval.until(PlainDate.of(2016, 2, 28)).formatReduced( IsoDateStyle.EXTENDED_CALENDAR_DATE, InfinityStyle.MIN_MAX), is("-999999999-01-01/2016-02-28")); } @Test public void parseInfinity() throws ParseException { assertThat( DateInterval.parseISO("2015-01-01/+∞"), is(DateInterval.since(PlainDate.of(2015, 1, 1))) ); assertThat( DateInterval.parse("[2015-01-01/+∞)", Iso8601Format.EXTENDED_CALENDAR_DATE, BracketPolicy.SHOW_ALWAYS), is(DateInterval.since(PlainDate.of(2015, 1, 1))) ); assertThat( DateInterval.parseISO("-∞/2015-01-01"), is(DateInterval.until(PlainDate.of(2015, 1, 1))) ); assertThat( DateInterval.parse("(-∞/2015-01-01]", Iso8601Format.EXTENDED_CALENDAR_DATE, BracketPolicy.SHOW_ALWAYS), is(DateInterval.until(PlainDate.of(2015, 1, 1))) ); assertThat( DateInterval.parseISO("2015001/-"), is(DateInterval.since(PlainDate.of(2015, 1, 1))) ); assertThat( DateInterval.parse("[2015001/-)", Iso8601Format.BASIC_ORDINAL_DATE, BracketPolicy.SHOW_ALWAYS), is(DateInterval.since(PlainDate.of(2015, 1, 1))) ); assertThat( DateInterval.parseISO("-/2015001"), is(DateInterval.until(PlainDate.of(2015, 1, 1))) ); assertThat( DateInterval.parse("(-/2015001]", Iso8601Format.BASIC_ORDINAL_DATE, BracketPolicy.SHOW_ALWAYS), is(DateInterval.until(PlainDate.of(2015, 1, 1))) ); assertThat( DateInterval.parseISO("2015001/+999999999365"), is(DateInterval.since(PlainDate.of(2015, 1, 1))) ); assertThat( DateInterval.parse( "[2015001/+999999999365)", Iso8601Format.BASIC_ORDINAL_DATE, BracketPolicy.SHOW_ALWAYS), is(DateInterval.since(PlainDate.of(2015, 1, 1))) ); assertThat( DateInterval.parseISO("-9999999990101/20150101"), is(DateInterval.until(PlainDate.of(2015, 1, 1))) ); assertThat( DateInterval.parse( "(-9999999990101/20150101]", Iso8601Format.BASIC_CALENDAR_DATE, BracketPolicy.SHOW_ALWAYS), is(DateInterval.until(PlainDate.of(2015, 1, 1))) ); } @Test public void parseAlways() throws ParseException { DateInterval always = DateIntervalFactory.INSTANCE.between(Boundary.infinitePast(), Boundary.infiniteFuture()); assertThat( DateInterval.parseISO("-/-"), is(always)); assertThat( DateInterval.parse( "(-/-)", Iso8601Format.EXTENDED_CALENDAR_DATE, BracketPolicy.SHOW_WHEN_NON_STANDARD), is(always)); assertThat( DateInterval.parseISO("-∞/+∞"), is(always)); assertThat( DateInterval.parse( "(-∞/+∞)", Iso8601Format.EXTENDED_CALENDAR_DATE, BracketPolicy.SHOW_WHEN_NON_STANDARD), is(always)); assertThat( DateInterval.parseISO("-999999999-01-01/+999999999-12-31"), is(always)); assertThat( DateInterval.parse( "(-999999999-01-01/+999999999-12-31)", Iso8601Format.EXTENDED_CALENDAR_DATE, BracketPolicy.SHOW_WHEN_NON_STANDARD), is(always)); } @Test(expected=ParseException.class) public void parseInfinityAndPeriod() throws ParseException { DateInterval.parseISO("-∞/P3Y4M45D"); } @Test(expected=ParseException.class) public void parsePeriodAndInfinity() throws ParseException { DateInterval.parseISO("P3Y4M45D/+∞"); } @Test(expected=ParseException.class) public void parseMixedInfinitySymbols1() throws ParseException { DateInterval.parseISO("-/+∞"); } @Test(expected=ParseException.class) public void parseMixedInfinitySymbols2() throws ParseException { DateInterval.parseISO("-∞/-"); } }