package net.time4j.range;
import net.time4j.ClockUnit;
import net.time4j.PlainTimestamp;
import net.time4j.format.expert.Iso8601Format;
import net.time4j.format.expert.IsoDateStyle;
import net.time4j.format.expert.IsoDecimalStyle;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import java.text.ParseException;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
@RunWith(JUnit4.class)
public class TimestampIntervalFormatTest {
@Test
public void parseAbbreviatedWithoutDate() throws ParseException {
PlainTimestamp start = PlainTimestamp.of(2012, 4, 30, 14, 15);
PlainTimestamp end = PlainTimestamp.of(2012, 4, 30, 16, 0);
TimestampInterval expected = TimestampInterval.between(start, end);
assertThat(
TimestampInterval.parseISO("2012-04-30T14:15/T16:00"),
is(expected));
}
@Test
public void parseAbbreviatedWithoutDateAnd24Hour() throws ParseException {
PlainTimestamp start = PlainTimestamp.of(2012, 4, 30, 14, 15);
PlainTimestamp end = PlainTimestamp.of(2012, 5, 1, 0, 0);
TimestampInterval expected = TimestampInterval.between(start, end);
assertThat(
TimestampInterval.parseISO("2012-04-30T14:15/T24:00"),
is(expected));
}
@Test
public void parseAbbreviatedWithoutDateOrT() throws ParseException {
PlainTimestamp start = PlainTimestamp.of(2012, 4, 30, 14, 15);
PlainTimestamp end = PlainTimestamp.of(2012, 4, 30, 16, 0);
TimestampInterval expected = TimestampInterval.between(start, end);
assertThat(
TimestampInterval.parseISO("2012-04-30T14:15/16:00"),
is(expected));
}
@Test
public void parseAbbreviatedExtendedOrdinalDate() throws ParseException {
PlainTimestamp start = PlainTimestamp.of(2012, 4, 1, 14, 15);
PlainTimestamp end = PlainTimestamp.of(2012, 4, 5, 16, 0);
TimestampInterval expected = TimestampInterval.between(start, end);
assertThat(
TimestampInterval.parseISO("2012-092T14:15/096T16:00"),
is(expected));
}
@Test
public void parseAbbreviatedExtendedWeekDate() throws ParseException {
PlainTimestamp start = PlainTimestamp.of(2012, 4, 1, 14, 15);
PlainTimestamp end = PlainTimestamp.of(2012, 4, 5, 16, 0);
TimestampInterval expected = TimestampInterval.between(start, end);
assertThat(
TimestampInterval.parseISO("2012-W13-7T14:15/W14-4T16:00"),
is(expected));
}
@Test
public void parseAbbreviatedBasicOrdinalDate() throws ParseException {
PlainTimestamp start = PlainTimestamp.of(2012, 4, 1, 14, 15);
PlainTimestamp end = PlainTimestamp.of(2012, 4, 5, 16, 0);
TimestampInterval expected = TimestampInterval.between(start, end);
assertThat(
TimestampInterval.parseISO("2012092T1415/096T1600"),
is(expected));
}
@Test
public void parseAbbreviatedBasicWeekDate() throws ParseException {
PlainTimestamp start = PlainTimestamp.of(2012, 4, 1, 14, 15);
PlainTimestamp end = PlainTimestamp.of(2012, 4, 5, 16, 0);
TimestampInterval expected = TimestampInterval.between(start, end);
assertThat(
TimestampInterval.parseISO("2012W137T1415/W144T1600"),
is(expected));
}
@Test
public void parseExtendedOrdinalDate() throws ParseException {
PlainTimestamp start = PlainTimestamp.of(2012, 4, 1, 14, 15);
PlainTimestamp end = PlainTimestamp.of(2012, 4, 5, 16, 0);
TimestampInterval expected = TimestampInterval.between(start, end);
assertThat(
TimestampInterval.parseISO("2012-092T14:15/2012-096T16:00"),
is(expected));
}
@Test
public void parseExtendedWeekDate() throws ParseException {
PlainTimestamp start = PlainTimestamp.of(2012, 4, 1, 14, 15);
PlainTimestamp end = PlainTimestamp.of(2012, 4, 5, 16, 0);
TimestampInterval expected = TimestampInterval.between(start, end);
assertThat(
TimestampInterval.parseISO("2012-W13-7T14:15/2012-W14-4T16:00"),
is(expected));
}
@Test
public void parseBasicOrdinalDate() throws ParseException {
PlainTimestamp start = PlainTimestamp.of(2012, 4, 1, 14, 15);
PlainTimestamp end = PlainTimestamp.of(2012, 4, 5, 16, 0);
TimestampInterval expected = TimestampInterval.between(start, end);
assertThat(
TimestampInterval.parseISO("2012092T1415/2012096T1600"),
is(expected));
}
@Test
public void parseBasicWeekDate() throws ParseException {
PlainTimestamp start = PlainTimestamp.of(2012, 4, 1, 14, 15);
PlainTimestamp end = PlainTimestamp.of(2012, 4, 5, 16, 0);
TimestampInterval expected = TimestampInterval.between(start, end);
assertThat(
TimestampInterval.parseISO("2012W137T1415/2012W144T1600"),
is(expected));
}
@Test
public void parseExtendedCalendarDateAndPeriod() throws ParseException {
PlainTimestamp start = PlainTimestamp.of(2012, 4, 1, 14, 15);
PlainTimestamp end = PlainTimestamp.of(2012, 4, 5, 16, 0);
TimestampInterval expected = TimestampInterval.between(start, end);
assertThat(
TimestampInterval.parseISO("2012-04-01T14:15/P4DT1H45M"),
is(expected));
}
@Test
public void parseExtendedOrdinalDateAndPeriod() throws ParseException {
PlainTimestamp start = PlainTimestamp.of(2012, 4, 1, 14, 15);
PlainTimestamp end = PlainTimestamp.of(2012, 4, 5, 16, 0);
TimestampInterval expected = TimestampInterval.between(start, end);
assertThat(
TimestampInterval.parseISO("2012-092T14:15/P4DT1H45M"),
is(expected));
}
@Test
public void parseExtendedWeekDateAndPeriod() throws ParseException {
PlainTimestamp start = PlainTimestamp.of(2012, 4, 1, 14, 15);
PlainTimestamp end = PlainTimestamp.of(2012, 4, 5, 16, 0);
TimestampInterval expected = TimestampInterval.between(start, end);
assertThat(
TimestampInterval.parseISO("2012-W13-7T14:15/P0000-00-04T01:45"),
is(expected));
}
@Test
public void parsePeriodAndExtendedCalendarDate() throws ParseException {
PlainTimestamp start = PlainTimestamp.of(2012, 4, 1, 14, 15);
PlainTimestamp end = PlainTimestamp.of(2012, 4, 5, 16, 0);
TimestampInterval expected = TimestampInterval.between(start, end);
assertThat(
TimestampInterval.parseISO("P4DT1H45M/2012-04-05T16:00"),
is(expected));
}
@Test
public void parsePeriodAndExtendedOrdinalDate() throws ParseException {
PlainTimestamp start = PlainTimestamp.of(2012, 4, 1, 14, 15);
PlainTimestamp end = PlainTimestamp.of(2012, 4, 5, 16, 0);
TimestampInterval expected = TimestampInterval.between(start, end);
assertThat(
TimestampInterval.parseISO("P4DT1H45M/2012-096T16:00"),
is(expected));
}
@Test
public void parsePeriodAndExtendedWeekDate() throws ParseException {
PlainTimestamp start = PlainTimestamp.of(2012, 4, 1, 14, 15);
PlainTimestamp end = PlainTimestamp.of(2012, 4, 5, 16, 0);
TimestampInterval expected = TimestampInterval.between(start, end);
assertThat(
TimestampInterval.parseISO("P0000-00-04T01:45/2012-W14-4T16:00"),
is(expected));
}
@Test
public void formatISO() {
PlainTimestamp start = PlainTimestamp.of(2016, 2, 22, 10, 45, 53).plus(120, ClockUnit.MILLIS);
PlainTimestamp end = PlainTimestamp.of(2016, 2, 22, 16, 30);
TimestampInterval interval = TimestampInterval.between(start, end);
assertThat(
interval.formatISO(
IsoDateStyle.BASIC_CALENDAR_DATE, IsoDecimalStyle.DOT, ClockUnit.MILLIS, InfinityStyle.SYMBOL),
is("20160222T104553.120/20160222T163000.000"));
assertThat(
interval.formatISO(
IsoDateStyle.EXTENDED_CALENDAR_DATE, IsoDecimalStyle.DOT, ClockUnit.MILLIS, InfinityStyle.SYMBOL),
is("2016-02-22T10:45:53.120/2016-02-22T16:30:00.000"));
}
@Test
public void formatISOInfinity() {
TimestampInterval since = TimestampInterval.since(PlainTimestamp.of(2016, 2, 28, 13, 20));
TimestampInterval until = TimestampInterval.until(PlainTimestamp.of(2016, 2, 28, 13, 20));
assertThat(
since.formatISO(
IsoDateStyle.EXTENDED_CALENDAR_DATE, IsoDecimalStyle.DOT, ClockUnit.MINUTES, InfinityStyle.SYMBOL),
is("2016-02-28T13:20/+∞"));
assertThat(
since.formatISO(
IsoDateStyle.EXTENDED_CALENDAR_DATE, IsoDecimalStyle.DOT, ClockUnit.MINUTES, InfinityStyle.HYPHEN),
is("2016-02-28T13:20/-"));
assertThat(
since.formatISO(
IsoDateStyle.EXTENDED_CALENDAR_DATE, IsoDecimalStyle.DOT, ClockUnit.MINUTES, InfinityStyle.MIN_MAX),
is("2016-02-28T13:20/+999999999-12-31T23:59"));
assertThat(
until.formatISO(
IsoDateStyle.EXTENDED_CALENDAR_DATE, IsoDecimalStyle.DOT, ClockUnit.MINUTES, InfinityStyle.SYMBOL),
is("-∞/2016-02-28T13:20"));
assertThat(
until.formatISO(
IsoDateStyle.EXTENDED_CALENDAR_DATE, IsoDecimalStyle.DOT, ClockUnit.MINUTES, InfinityStyle.HYPHEN),
is("-/2016-02-28T13:20"));
assertThat(
until.formatISO(
IsoDateStyle.EXTENDED_CALENDAR_DATE, IsoDecimalStyle.DOT, ClockUnit.MINUTES, InfinityStyle.MIN_MAX),
is("-999999999-01-01T00:00/2016-02-28T13:20"));
}
@Test
public void formatReducedSameMonth() {
PlainTimestamp start = PlainTimestamp.of(2016, 2, 22, 10, 45);
PlainTimestamp end = PlainTimestamp.of(2016, 2, 29, 16, 30);
TimestampInterval interval = TimestampInterval.between(start, end);
assertThat(
interval.formatReduced(
IsoDateStyle.BASIC_CALENDAR_DATE, IsoDecimalStyle.DOT, ClockUnit.MINUTES, InfinityStyle.SYMBOL),
is("20160222T1045/29T1630"));
assertThat(
interval.formatReduced(
IsoDateStyle.EXTENDED_CALENDAR_DATE, IsoDecimalStyle.DOT, ClockUnit.MINUTES, InfinityStyle.SYMBOL),
is("2016-02-22T10:45/29T16:30"));
}
@Test
public void formatReducedSameDate() {
PlainTimestamp start = PlainTimestamp.of(2016, 2, 22, 10, 45, 53);
PlainTimestamp end = PlainTimestamp.of(2016, 2, 22, 16, 30);
TimestampInterval interval = TimestampInterval.between(start, end);
assertThat(
interval.formatReduced(
IsoDateStyle.BASIC_CALENDAR_DATE,
IsoDecimalStyle.DOT,
ClockUnit.MINUTES,
InfinityStyle.SYMBOL),
is("20160222T1045/T1630"));
assertThat(
interval.formatReduced(
IsoDateStyle.EXTENDED_CALENDAR_DATE,
IsoDecimalStyle.DOT,
ClockUnit.MINUTES,
InfinityStyle.SYMBOL),
is("2016-02-22T10:45/T16:30"));
}
@Test
public void formatReducedInfinity() {
TimestampInterval since = TimestampInterval.since(PlainTimestamp.of(2016, 2, 28, 13, 20));
TimestampInterval until = TimestampInterval.until(PlainTimestamp.of(2016, 2, 28, 13, 20));
assertThat(
since.formatReduced(
IsoDateStyle.EXTENDED_CALENDAR_DATE, IsoDecimalStyle.DOT, ClockUnit.MINUTES, InfinityStyle.SYMBOL),
is("2016-02-28T13:20/+∞"));
assertThat(
since.formatReduced(
IsoDateStyle.EXTENDED_CALENDAR_DATE, IsoDecimalStyle.DOT, ClockUnit.MINUTES, InfinityStyle.HYPHEN),
is("2016-02-28T13:20/-"));
assertThat(
since.formatReduced(
IsoDateStyle.EXTENDED_CALENDAR_DATE, IsoDecimalStyle.DOT, ClockUnit.MINUTES, InfinityStyle.MIN_MAX),
is("2016-02-28T13:20/+999999999-12-31T23:59"));
assertThat(
until.formatReduced(
IsoDateStyle.EXTENDED_CALENDAR_DATE, IsoDecimalStyle.DOT, ClockUnit.MINUTES, InfinityStyle.SYMBOL),
is("-∞/2016-02-28T13:20"));
assertThat(
until.formatReduced(
IsoDateStyle.EXTENDED_CALENDAR_DATE, IsoDecimalStyle.DOT, ClockUnit.MINUTES, InfinityStyle.HYPHEN),
is("-/2016-02-28T13:20"));
assertThat(
until.formatReduced(
IsoDateStyle.EXTENDED_CALENDAR_DATE, IsoDecimalStyle.DOT, ClockUnit.MINUTES, InfinityStyle.MIN_MAX),
is("-999999999-01-01T00:00/2016-02-28T13:20"));
}
@Test
public void parseInfinity() throws ParseException {
PlainTimestamp tsp = PlainTimestamp.of(2015, 1, 1, 8, 45);
assertThat(
TimestampInterval.parseISO("2015-01-01T08:45/+∞"),
is(TimestampInterval.since(tsp))
);
assertThat(
TimestampInterval.parse(
"[2015-01-01T08:45/+∞)", Iso8601Format.EXTENDED_DATE_TIME, BracketPolicy.SHOW_ALWAYS),
is(TimestampInterval.since(tsp))
);
assertThat(
TimestampInterval.parseISO("-∞/2015-01-01T08:45"),
is(TimestampInterval.until(tsp))
);
assertThat(
TimestampInterval.parse(
"(-∞/2015-01-01T08:45]", Iso8601Format.EXTENDED_DATE_TIME, BracketPolicy.SHOW_ALWAYS),
is(TimestampInterval.until(tsp).withClosedEnd())
);
assertThat(
TimestampInterval.parseISO("2015-01-01T08:45/-"),
is(TimestampInterval.since(tsp))
);
assertThat(
TimestampInterval.parse(
"[2015-01-01T08:45/-)", Iso8601Format.EXTENDED_DATE_TIME, BracketPolicy.SHOW_ALWAYS),
is(TimestampInterval.since(tsp))
);
assertThat(
TimestampInterval.parseISO("-/2015-01-01T08:45"),
is(TimestampInterval.until(tsp))
);
assertThat(
TimestampInterval.parse(
"(-/2015-01-01T08:45]", Iso8601Format.EXTENDED_DATE_TIME, BracketPolicy.SHOW_ALWAYS),
is(TimestampInterval.until(tsp).withClosedEnd())
);
assertThat(
TimestampInterval.parseISO("2015-01-01T08:45/+999999999-12-31T23:59:59,999999999"),
is(TimestampInterval.since(tsp))
);
assertThat(
TimestampInterval.parse(
"[2015-01-01T08:45/+999999999-12-31T23:59:59,999999999)",
Iso8601Format.EXTENDED_DATE_TIME,
BracketPolicy.SHOW_ALWAYS),
is(TimestampInterval.since(tsp))
);
assertThat(
TimestampInterval.parseISO("-999999999-01-01T00:00/2015-01-01T08:45"),
is(TimestampInterval.until(tsp))
);
assertThat(
TimestampInterval.parse(
"(-999999999-01-01T00:00/2015-01-01T08:45]",
Iso8601Format.EXTENDED_DATE_TIME,
BracketPolicy.SHOW_ALWAYS),
is(TimestampInterval.until(tsp).withClosedEnd())
);
}
@Test
public void parseAlways() throws ParseException {
TimestampInterval always =
TimestampIntervalFactory.INSTANCE.between(Boundary.infinitePast(), Boundary.infiniteFuture());
assertThat(
TimestampInterval.parseISO("-/-"),
is(always));
assertThat(
TimestampInterval.parse(
"(-/-)",
Iso8601Format.EXTENDED_DATE_TIME,
BracketPolicy.SHOW_WHEN_NON_STANDARD),
is(always));
assertThat(
TimestampInterval.parseISO("-∞/+∞"),
is(always));
assertThat(
TimestampInterval.parse(
"(-∞/+∞)",
Iso8601Format.EXTENDED_DATE_TIME,
BracketPolicy.SHOW_WHEN_NON_STANDARD),
is(always));
assertThat(
TimestampInterval.parseISO("-999999999-01-01T00:00/+999999999-12-31T23:59:59,999999999"),
is(always));
assertThat(
TimestampInterval.parse(
"(-999999999-01-01T00:00/+999999999-12-31T23:59:59,999999999)",
Iso8601Format.EXTENDED_DATE_TIME,
BracketPolicy.SHOW_WHEN_NON_STANDARD),
is(always));
}
}