Add method to limit an EffortDuration

It considers the start and end values of IntraDayDate.

FEA: ItEr61S08TimeUnitConfigurablePlanning
This commit is contained in:
Óscar González Fernández 2010-10-07 20:54:47 +02:00
parent 5308dab6c3
commit dae8be725c
2 changed files with 47 additions and 1 deletions

View file

@ -147,7 +147,8 @@ public class IntraDayDate implements Comparable<IntraDayDate> {
}
/**
* It's an interval of {@link IntraDayDate}
* It's an interval of {@link IntraDayDate}. It allows to know how much
* effort can be spent in this day.
*/
public static class PartialDay {
@ -158,6 +159,9 @@ public class IntraDayDate implements Comparable<IntraDayDate> {
Validate.notNull(start);
Validate.notNull(end);
Validate.isTrue(end.compareTo(start) >= 0);
Validate.isTrue(start.areSameDay(end.getDate())
|| (start.areSameDay(end.getDate().minusDays(1)) && end
.getEffortDuration().isZero()));
this.start = start;
this.end = end;
}
@ -170,6 +174,28 @@ public class IntraDayDate implements Comparable<IntraDayDate> {
return end;
}
public LocalDate getDate() {
return start.getDate();
}
public EffortDuration limitDuration(EffortDuration duration) {
EffortDuration alreadyElapsedInDay = start.getEffortDuration();
if (alreadyElapsedInDay.isZero()
&& end.getEffortDuration().isZero()) {
return duration;
}
if (end.getEffortDuration().isZero()) {
if (alreadyElapsedInDay.compareTo(duration) >= 0) {
return zero();
}
return duration.minus(alreadyElapsedInDay);
} else {
EffortDuration maximumAvailable = end.getEffortDuration()
.minus(alreadyElapsedInDay);
return EffortDuration.min(maximumAvailable, duration);
}
}
@Override
public String toString() {
return Arrays.toString(new Object[] { start, end });

View file

@ -25,6 +25,8 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.navalplanner.business.workingday.EffortDuration.hours;
import static org.navalplanner.business.workingday.EffortDuration.minutes;
import static org.navalplanner.business.workingday.EffortDuration.zero;
import java.util.ArrayList;
@ -151,6 +153,24 @@ public class IntraDayDateTest {
anotherEnd));
}
@Test
public void aPartialDayCanLimitAnEffortDuration() {
PartialDay day = new PartialDay(IntraDayDate.create(today,
halfHour), IntraDayDate.create(today, oneHour));
assertThat(day.limitDuration(hours(10)), equalTo(minutes(30)));
assertThat(day.limitDuration(minutes(20)), equalTo(minutes(20)));
PartialDay completeDay = new PartialDay(IntraDayDate.startOfDay(today),
IntraDayDate.startOfDay(tomorrow));
assertThat(completeDay.limitDuration(hours(10)), equalTo(hours(10)));
PartialDay startsInTheMiddle = new PartialDay(IntraDayDate.create(
today, EffortDuration.hours(3)),
IntraDayDate.startOfDay(tomorrow));
assertThat(startsInTheMiddle.limitDuration(hours(10)),
equalTo(hours(7)));
assertThat(startsInTheMiddle.limitDuration(hours(3)), equalTo(zero()));
assertThat(startsInTheMiddle.limitDuration(hours(2)), equalTo(zero()));
}
private Matcher<Iterable<PartialDay>> delimitedBy(
final IntraDayDate... dates) {
return new BaseMatcher<Iterable<PartialDay>>() {