package net.time4j.format.expert; import net.time4j.Month; import net.time4j.PlainDate; import net.time4j.PlainTime; import java.text.ParseException; import java.util.Locale; import net.time4j.PlainTimestamp; import net.time4j.SystemClock; import net.time4j.format.Attributes; import net.time4j.format.Leniency; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @RunWith(JUnit4.class) public class DefaultValueTest { @Test public void missingYear1() throws ParseException { ChronoFormatter<PlainDate> fmt = ChronoFormatter.setUp(PlainDate.class, Locale.ROOT) .addPattern("MM-dd", PatternType.CLDR).build() .withDefault(PlainDate.YEAR, 2012); PlainDate date = fmt.parse("05-21"); assertThat(date, is(PlainDate.of(2012, 5, 21))); } @Test public void missingYear2() throws ParseException { ChronoFormatter<PlainDate> fmt = ChronoFormatter.setUp(PlainDate.class, Locale.ROOT) .addPattern("dd", PatternType.CLDR) .setDefault(PlainDate.YEAR, 2012) .setDefaultSupplier(PlainDate.MONTH_AS_NUMBER, () -> 5) .build(); PlainDate date = fmt.parse("21"); assertThat(date, is(PlainDate.of(2012, 5, 21))); } @Test public void missingToday() throws ParseException { ChronoFormatter<PlainTimestamp> fmt = ChronoFormatter.ofTimestampPattern("HH:mm", PatternType.CLDR, Locale.ROOT) .withDefaultSupplier(PlainDate.COMPONENT, () -> SystemClock.inLocalView().today()); PlainTimestamp tsp = fmt.parse("14:45"); assertThat(tsp, is(SystemClock.inLocalView().today().atTime(14, 45))); } @Test(expected=IllegalArgumentException.class) public void dateFormatWithDefaultHour() throws ParseException { ChronoFormatter.setUp(PlainDate.class, Locale.ROOT) .addPattern("MM-dd", PatternType.CLDR).build() .withDefault(PlainTime.DIGITAL_HOUR_OF_DAY, 12); } @Test public void missingMonth() throws ParseException { ChronoFormatter<PlainDate> fmt = ChronoFormatter.setUp(PlainDate.class, Locale.ROOT) .addPattern("yyyy-dd", PatternType.CLDR).build() .withDefault(PlainDate.MONTH_AS_NUMBER, 11); PlainDate date = fmt.parse("2012-21"); assertThat(date, is(PlainDate.of(2012, 11, 21))); } @Test(expected=ParseException.class) public void noReplaceMonth() throws ParseException { ChronoFormatter<PlainDate> fmt = ChronoFormatter.setUp(PlainDate.class, Locale.US) .addPattern("MMM[/]dd[/]yyyy", PatternType.CLDR).build() .withDefault(PlainDate.MONTH_OF_YEAR, Month.NOVEMBER); fmt.parse("21/2012"); } @Test public void replaceWithDefaultMonth() throws ParseException { ChronoFormatter<PlainDate> fmt = ChronoFormatter.setUp(PlainDate.class, Locale.US) .startSection(Attributes.PROTECTED_CHARACTERS, 8) .addText(PlainDate.MONTH_OF_YEAR) .endSection() .addPattern("[/]dd[/]yyyy", PatternType.CLDR) .build() .withDefault(PlainDate.MONTH_OF_YEAR, Month.NOVEMBER); PlainDate date = fmt.parse("21/2012"); assertThat(date, is(PlainDate.of(2012, 11, 21))); } @Test(expected=ParseException.class) public void noReplaceOfWrongYear() throws ParseException { ChronoFormatter<PlainDate> fmt = ChronoFormatter.setUp(PlainDate.class, Locale.ROOT) .addPattern("uuuu[-]MM[-]dd", PatternType.CLDR).build() .withDefault(PlainDate.YEAR, 1985); fmt.parse("10-21"); // 10 is not a valid year } @Test public void replaceWrongYear() throws ParseException { ChronoFormatter<PlainDate> fmt = ChronoFormatter.setUp(PlainDate.class, Locale.ROOT) .startSection(Attributes.PROTECTED_CHARACTERS, 6) .addInteger( PlainDate.YEAR, 4, 9, SignPolicy.SHOW_WHEN_BIG_NUMBER) .endSection() .addPattern("[-]MM[-]dd", PatternType.CLDR) .build() .withDefault(PlainDate.YEAR, 1985); PlainDate date = fmt.parse("10-21"); assertThat(date, is(PlainDate.of(1985, 10, 21))); } @Test(expected=ParseException.class) public void noReplaceOfHour() throws ParseException { ChronoFormatter<PlainTime> fmt = ChronoFormatter.setUp(PlainTime.class, Locale.ROOT) .addPattern("HH[:]mm[:]ss", PatternType.CLDR).build() .withDefault(PlainTime.DIGITAL_HOUR_OF_DAY, 15); PlainTime time = fmt.parse("10:21"); assertThat(time, is(PlainTime.of(15, 10, 21))); } @Test public void replaceOfMissingHour() throws ParseException { ChronoFormatter<PlainTime> fmt = ChronoFormatter.setUp(PlainTime.class, Locale.ROOT) .startSection(Attributes.PROTECTED_CHARACTERS, 6) .addFixedInteger(PlainTime.DIGITAL_HOUR_OF_DAY, 2) .endSection() .startOptionalSection() .addLiteral(':') .endSection() .addFixedInteger(PlainTime.MINUTE_OF_HOUR, 2) .startOptionalSection() .addLiteral(':') .endSection() .addFixedInteger(PlainTime.SECOND_OF_MINUTE, 2) .build() .withDefault(PlainTime.DIGITAL_HOUR_OF_DAY, 15); PlainTime time = fmt.parse("10:21"); assertThat(time, is(PlainTime.of(15, 10, 21))); } @Test public void doubleElementForMonth1() throws ParseException { ChronoFormatter<PlainDate> ff = ChronoFormatter.setUp(PlainDate.axis(), Locale.ROOT) .addFixedInteger(PlainDate.YEAR, 4) .startOptionalSection() .addFixedNumerical(PlainDate.MONTH_OF_YEAR, 2) .addPattern("[dd]]", PatternType.CLDR) .build() .withDefault(PlainDate.MONTH_AS_NUMBER, 1) .withDefault(PlainDate.DAY_OF_MONTH, 1).with(Leniency.STRICT); assertThat(ff.parse("20160504"), is(PlainDate.of(2016, 5, 4))); } @Test public void doubleElementForMonth2() throws ParseException { ChronoFormatter<PlainDate> ff = ChronoFormatter.setUp(PlainDate.axis(), Locale.ROOT) .addFixedInteger(PlainDate.YEAR, 4) .startOptionalSection() .addFixedInteger(PlainDate.MONTH_AS_NUMBER, 2) .addPattern("[dd]]", PatternType.CLDR) .build() .withDefault(PlainDate.MONTH_OF_YEAR, Month.JANUARY) .withDefault(PlainDate.DAY_OF_MONTH, 1).with(Leniency.STRICT); assertThat(ff.parse("20160504"), is(PlainDate.of(2016, 5, 4))); } @Test public void doubleElementForHour24() throws ParseException { ChronoFormatter<PlainTime> ff = ChronoFormatter.ofTimePattern("HH:mm:ss", PatternType.CLDR, Locale.ROOT) .withDefault(PlainTime.ISO_HOUR, 0).with(Leniency.STRICT); assertThat(ff.parse("21:15:04"), is(PlainTime.of(21, 15, 4))); } }