package net.time4j.format.expert; import net.time4j.Moment; import net.time4j.PlainDate; import net.time4j.tz.ZonalOffset; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; 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 OrFormatTest { @Test public void format1() throws ParseException { ChronoFormatter<PlainDate> f = ChronoFormatter.ofDatePattern( "E, dd.MM.uuuu|E, MM/dd/uuuu|EEEE, d. MMMM uuuu", PatternType.CLDR, Locale.ENGLISH); PlainDate date = PlainDate.of(2015, 12, 31); assertThat(f.format(date), is("Thu, 31.12.2015")); } @Test public void format2() throws ParseException { ChronoFormatter<PlainDate> f = ChronoFormatter.ofDatePattern( "E, MM/dd/uuuu|E, dd.MM.uuuu|EEEE, d. MMMM uuuu", PatternType.CLDR, Locale.ENGLISH); PlainDate date = PlainDate.of(2015, 12, 31); assertThat(f.format(date), is("Thu, 12/31/2015")); } @Test public void parse() throws ParseException { ChronoFormatter<PlainDate> f = ChronoFormatter.ofDatePattern( "E, dd.MM.uuuu|E, MM/dd/uuuu|EEEE, d. MMMM uuuu", PatternType.CLDR, Locale.ENGLISH); PlainDate expected = PlainDate.of(2015, 12, 31); assertThat(f.parse("Thu, 31.12.2015"), is(expected)); assertThat(f.parse("Thu, 12/31/2015"), is(expected)); assertThat(f.parse("Thursday, 31. December 2015"), is(expected)); } @Test public void parseWithOrInsideOptional() throws ParseException { ChronoFormatter<PlainDate> f = ChronoFormatter.ofDatePattern( "E, [dd.MM.|MM/dd/]uuuu", PatternType.CLDR, Locale.ENGLISH); PlainDate expected = PlainDate.of(2015, 12, 31); assertThat(f.parse("Thu, 31.12.2015"), is(expected)); assertThat(f.parse("Thu, 12/31/2015"), is(expected)); } @Test(expected=ParseException.class) public void parseUnexpectedTrailingChars() throws ParseException { ChronoFormatter<PlainDate> f = ChronoFormatter.ofDatePattern("dd.MM.uuuu|MM/dd/uuuu", PatternType.CLDR, Locale.ROOT); f.parse("31.12.2015|12/31/2015"); } @Test(expected=ParseException.class) public void parseUnexpectedLanguage() throws ParseException { ChronoFormatter<PlainDate> f = ChronoFormatter.ofDatePattern("dd.MM.uuuu|MM/dd/uuuu|d. MMMM uuuu", PatternType.CLDR, Locale.ENGLISH); f.parse("31. diciembre 2015"); // spanish was not set up } @Test(expected=IndexOutOfBoundsException.class) public void parseEmptyString() throws ParseException { ChronoFormatter<PlainDate> f = ChronoFormatter.ofDatePattern("dd.MM.uuuu|MM/dd/uuuu|d. MMMM uuuu", PatternType.CLDR, Locale.ENGLISH); f.parse(""); } @Test(expected=NullPointerException.class) public void parseNull() throws ParseException { ChronoFormatter<PlainDate> f = ChronoFormatter.ofDatePattern("dd.MM.uuuu|MM/dd/uuuu|d. MMMM uuuu", PatternType.CLDR, Locale.ENGLISH); f.parse(null); } @Test(expected=IllegalArgumentException.class) public void parseDoubleOr() throws ParseException { ChronoFormatter.ofDatePattern("dd.MM.uuuu||MM/dd/uuuu", PatternType.CLDR, Locale.ENGLISH); } @Test(expected=IllegalArgumentException.class) public void parseTrailingOr1() throws ParseException { ChronoFormatter.ofDatePattern("dd.MM.uuuu|MM/dd/uuuu|", PatternType.CLDR, Locale.ENGLISH); } @Test(expected=IllegalArgumentException.class) public void parseTrailingOr2() throws ParseException { ChronoFormatter.ofDatePattern("E, [dd.MM.|MM/dd/|]uuuu", PatternType.CLDR, Locale.ENGLISH); } @Test(expected=IllegalArgumentException.class) public void parseLeadingOr1() throws ParseException { ChronoFormatter.ofDatePattern("|dd.MM.uuuu|MM/dd/uuuu", PatternType.CLDR, Locale.ENGLISH); } @Test(expected=IllegalArgumentException.class) public void parseLeadingOr2() throws ParseException { ChronoFormatter.ofDatePattern("E, [|dd.MM.|MM/dd/]uuuu", PatternType.CLDR, Locale.ENGLISH); } @Test public void parseWildcards1() throws ParseException { String input = "****-04-01T00:00:00Z/****-04-06T11:55:00Z"; int slash = input.indexOf('/'); PlainDate d = PlainDate.of(2016, 3, 31); ChronoFormatter<Moment> f = ChronoFormatter.ofMomentPattern( "[uuuu|****]-[MM|**]-[dd|**]'T'HH:mm:ssX", PatternType.CLDR, Locale.ROOT, ZonalOffset.UTC) .withDefault(PlainDate.YEAR, d.getYear()) .withDefault(PlainDate.MONTH_AS_NUMBER, d.getMonth()) .withDefault(PlainDate.DAY_OF_MONTH, d.getDayOfMonth()); Moment start = f.parse(input.substring(0, slash)); Moment end = f.parse(input.substring(slash + 1)); assertThat( start + "/" + end, is("2016-04-01T00:00:00Z/2016-04-06T11:55:00Z")); } @Test public void parseWildcards2() throws ParseException { String input = "****-04-01T00:00:00Z/****-04-06T11:55:00Z"; int slash = input.indexOf('/'); PlainDate d = PlainDate.of(2016, 3, 31); ChronoFormatter<Moment> f = ChronoFormatter.setUp(Moment.axis(), Locale.ROOT) .addPattern("[uuuu|", PatternType.CLDR) .skipUnknown((c) -> c == '*', 4) .addPattern("]-[MM|", PatternType.CLDR) .skipUnknown((c) -> c == '*', 2) .addPattern("]-[dd|", PatternType.CLDR) .skipUnknown((c) -> c == '*', 2) .addPattern("]'T'HH:mm:ssX", PatternType.CLDR) .build() .withDefault(PlainDate.YEAR, d.getYear()) .withDefault(PlainDate.MONTH_AS_NUMBER, d.getMonth()) .withDefault(PlainDate.DAY_OF_MONTH, d.getDayOfMonth()); Moment start = f.parse(input.substring(0, slash)); Moment end = f.parse(input.substring(slash + 1)); assertThat( start + "/" + end, is("2016-04-01T00:00:00Z/2016-04-06T11:55:00Z")); } }