package net.time4j; import net.time4j.engine.Normalizer; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import static net.time4j.ClockUnit.HOURS; import static net.time4j.ClockUnit.NANOS; import static net.time4j.Duration.approximateHours; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @RunWith(JUnit4.class) public class DurationNormalizerTest { @Test public void withNormalizer2010_1_1() { Duration<CalendarUnit> datePeriod = Duration.ofCalendarUnits(2, 14, 33); assertThat( datePeriod.with(PlainDate.of(2010, 1, 1)), is(Duration.ofCalendarUnits(3, 3, 2))); } @Test public void withNormalizer2010_2_1() { Duration<CalendarUnit> datePeriod = Duration.ofCalendarUnits(2, 14, 33); assertThat( datePeriod.with(PlainDate.of(2010, 2, 1)), is(Duration.ofCalendarUnits(3, 3, 3))); } @Test public void withNormalizer2003_12_27() { Duration<CalendarUnit> datePeriod = Duration.ofCalendarUnits(2, 14, 33); assertThat( datePeriod.with(PlainDate.of(2003, 12, 27)), is(Duration.ofCalendarUnits(3, 3, 5))); } @Test public void withSTD_PERIOD() { Duration<IsoUnit> test = Duration.ofZero() .plus(Duration.ofCalendarUnits(2, 14, 30)) .plus(Duration.ofClockUnits(47, 59, 60)) .plus(1075800000, NANOS) .inverse(); assertThat( test.with(Duration.STD_PERIOD), is( Duration.ofNegative().years(3).months(2).days(32) .seconds(1).millis(75).micros(800).build())); } @Test(expected=IllegalArgumentException.class) public void withSTD_PERIOD_unitsOfSameLength() { Duration.ofZero() .plus(1, CalendarUnit.weekBasedYears()) .plus(5, CalendarUnit.CENTURIES) .with(Duration.STD_PERIOD); } @Test public void withSTD_CALENDAR_PERIOD1() { Duration<CalendarUnit> datePeriod = Duration.ofCalendarUnits(2, 15, 3); assertThat( datePeriod.with(Duration.STD_CALENDAR_PERIOD), is(Duration.ofCalendarUnits(3, 3, 3))); } @Test public void withSTD_CALENDAR_PERIOD2() { Duration<CalendarUnit> datePeriod = Duration.ofCalendarUnits(2, 15, 3).plus(3, CalendarUnit.WEEKS); assertThat( datePeriod.with(Duration.STD_CALENDAR_PERIOD), is(Duration.ofCalendarUnits(3, 3, 24))); } @Test public void withSTD_CLOCK_PERIOD() { Duration<ClockUnit> timePeriod = Duration.ofClockUnits(2, 61, 120); assertThat( timePeriod.with(Duration.STD_CLOCK_PERIOD), is(Duration.ofClockUnits(3, 3, 0))); } @Test public void withMinutesOnly() { Duration<ClockUnit> timePeriod = Duration.ofClockUnits(2, 61, 122); assertThat( timePeriod.with(ClockUnit.MINUTES.only()), is(Duration.of(183, ClockUnit.MINUTES))); } @Test public void withNegativeMinutesOnly() { Duration<ClockUnit> timePeriod = Duration.ofClockUnits(4, 55, 0).inverse(); assertThat( timePeriod.with(ClockUnit.MINUTES.only()), is(Duration.of(-295, ClockUnit.MINUTES))); } @Test public void withMinutesOnlyIfEmpty() { Duration<ClockUnit> timePeriod = Duration.ofZero(); assertThat( timePeriod.with(ClockUnit.MINUTES.only()).isEmpty(), is(true)); } @Test public void withApproximatePeriodInRoundedStepsOf24Hours() { Duration<IsoUnit> dur = Duration.ofPositive().years(2).months(13).days(35).minutes(132).build(); assertThat( dur.with(Duration.approximateHours(24)), is(Duration.ofPositive().years(3).months(2).days(4).build())); } @Test public void withApproximatePeriodAppliedOnGeneralDuration() { Duration<IsoUnit> dur = Duration.ofPositive().years(2).months(13).days(35).minutes(132).build(); assertThat( dur.with(Duration.approximateHours(3)), is(Duration.ofPositive().years(3).months(2).days(4).hours(15).build())); assertThat( dur.with(Duration.approximateSeconds(10)), is(Duration.ofPositive().years(3).months(2).days(4).hours(15).minutes(42).seconds(50).build())); } @Test public void withApproximatePeriodInRoundedStepsOf3Hours() { assertThat( Duration.ofPositive().days(3).minutes(270).build().with(Duration.approximateHours(3)), is(Duration.ofPositive().days(3).hours(6).build())); assertThat( Duration.ofPositive().days(3).minutes(269).build().with(Duration.approximateHours(3)), is(Duration.ofPositive().days(3).hours(3).build())); assertThat( Duration.ofPositive().days(3).minutes(90).build().with(Duration.approximateHours(3)), is(Duration.ofPositive().days(3).hours(3).build())); assertThat( Duration.ofPositive().days(3).minutes(89).build().with(Duration.approximateHours(3)), is(Duration.ofPositive().days(3).hours(0).build())); assertThat( Duration.ofPositive().days(3).minutes(0).build().with(Duration.approximateHours(3)), is(Duration.ofPositive().days(3).hours(0).build())); } @Test(expected=IllegalArgumentException.class) public void withApproximatePeriodInNonPositiveRoundedSteps() { Duration<IsoUnit> dur = Duration.ofPositive().years(2).months(13).days(35).minutes(132).build(); dur.with(Duration.approximateMinutes(0)); } @Test public void withApproximateHours() { assertThat( Duration.<IsoUnit>of(7, HOURS).with(approximateHours(3)), is(Duration.of(6, HOURS))); } @Test public void withApproximateMaxUnitOnly() { Normalizer<IsoUnit> n = Duration.approximateMaxUnitOnly(); assertThat( Duration.ofPositive().years(2).months(13).days(35).minutes(132).build().with(n), is(Duration.<IsoUnit>of(3, CalendarUnit.YEARS))); assertThat( Duration.ofPositive().years(2).months(16).days(35).minutes(132).build().with(n), is(Duration.<IsoUnit>of(3, CalendarUnit.YEARS))); assertThat( Duration.ofPositive().years(2).months(17).days(35).minutes(132).build().with(n), is(Duration.<IsoUnit>of(4, CalendarUnit.YEARS))); assertThat( Duration.ofPositive().months(13).days(35).minutes(132).build().with(n), is(Duration.<IsoUnit>of(1, CalendarUnit.YEARS))); assertThat( Duration.ofPositive().days(35).minutes(132).build().with(n), is(Duration.<IsoUnit>of(1, CalendarUnit.MONTHS))); assertThat( Duration.ofPositive().days(7).hours(4).minutes(1).build().with(n), is(Duration.<IsoUnit>of(7, CalendarUnit.DAYS))); assertThat( Duration.ofNegative().hours(4).minutes(1).build().with(n), is(Duration.<IsoUnit>of(-4, ClockUnit.HOURS))); } @Test public void withApproximateMaxUnitOrWeeks() { assertThat( Duration.ofPositive().days(7).hours(4).minutes(1).build().with(Duration.approximateMaxUnitOrWeeks()), is(Duration.<IsoUnit>of(1, CalendarUnit.WEEKS))); assertThat( Duration.ofNegative().days(7).hours(4).minutes(1).build().with(Duration.approximateMaxUnitOrWeeks()), is(Duration.<IsoUnit>of(-1, CalendarUnit.WEEKS))); assertThat( Duration.ofNegative().days(6).hours(4).minutes(1).build().with(Duration.approximateMaxUnitOrWeeks()), is(Duration.<IsoUnit>of(-6, CalendarUnit.DAYS))); assertThat( Duration.ofPositive().days(10).hours(4).minutes(1).build().with(Duration.approximateMaxUnitOrWeeks()), is(Duration.<IsoUnit>of(1, CalendarUnit.WEEKS))); assertThat( Duration.ofPositive().days(11).hours(4).minutes(1).build().with(Duration.approximateMaxUnitOrWeeks()), is(Duration.<IsoUnit>of(2, CalendarUnit.WEEKS))); } @Test public void withTimestampNormalizer1() { Duration<IsoUnit> dur = Duration.ofPositive().years(2).months(13).days(35).minutes(132).build(); assertThat( dur.with(PlainTimestamp.of(2012, 2, 29, 14, 25)), is( Duration.ofPositive().years(3).months(2).days(4) .hours(2).minutes(12).build())); } @Test public void withTimestampNormalizer2() { Duration<CalendarUnit> dur = Duration.of(30, CalendarUnit.DAYS); assertThat( PlainTimestamp.of(2012, 2, 28, 0, 0).normalize(dur), is(Duration.ofPositive().months(1).days(1).build())); } @Test public void withMinutesTruncated() { Duration<ClockUnit> timePeriod = Duration.ofClockUnits(4, 55, 700); assertThat( timePeriod.with(ClockUnit.MINUTES.truncated()), is(Duration.ofClockUnits(4, 55, 0))); } @Test public void withNegativeMinutesTruncated() { Duration<ClockUnit> timePeriod = Duration.ofClockUnits(4, 55, 700).inverse(); assertThat( timePeriod.with(ClockUnit.MINUTES.truncated()), is(Duration.ofClockUnits(4, 55, 0).inverse())); } @Test public void withMinutesTruncatedIfEmpty() { Duration<ClockUnit> timePeriod = Duration.ofZero(); assertThat( timePeriod.with(ClockUnit.MINUTES.truncated()).isEmpty(), is(true)); } @Test public void withMinutesRounded1() { Duration<ClockUnit> timePeriod = Duration.ofClockUnits(4, 55, 89); assertThat( timePeriod.with(ClockUnit.MINUTES.rounded()), is(Duration.ofClockUnits(4, 56, 0))); } @Test public void withMinutesRounded2() { Duration<ClockUnit> timePeriod = Duration.ofClockUnits(4, 55, 90); assertThat( timePeriod.with(ClockUnit.MINUTES.rounded()), is(Duration.ofClockUnits(4, 57, 0))); } @Test public void withNegativeMinutesRounded() { Duration<ClockUnit> timePeriod = Duration.ofClockUnits(4, 55, 90).inverse(); assertThat( timePeriod.with(ClockUnit.MINUTES.rounded()), is(Duration.ofClockUnits(4, 57, 0).inverse())); } @Test public void withMinutesRoundedIfEmpty() { Duration<ClockUnit> timePeriod = Duration.ofZero(); assertThat( timePeriod.with(ClockUnit.MINUTES.rounded()).isEmpty(), is(true)); } @Test public void withNanosRounded() { Duration<ClockUnit> timePeriod = Duration.ofClockUnits(4, 65, 1).plus(500000000, ClockUnit.NANOS); assertThat( timePeriod.with(ClockUnit.NANOS.rounded()), is(Duration.ofClockUnits(5, 5, 1).plus(500000000, ClockUnit.NANOS))); } }