package org.libreplan.business.test.planner.entities.allocationalgorithms; import static org.junit.Assert.assertThat; import static org.libreplan.business.workingday.EffortDuration.hours; import java.util.Arrays; import java.util.List; import org.hamcrest.BaseMatcher; import org.hamcrest.Description; import org.hamcrest.Matcher; import org.junit.Test; import org.libreplan.business.calendars.entities.Capacity; import org.libreplan.business.planner.entities.allocationalgorithms.Distributor; import org.libreplan.business.workingday.EffortDuration; public class DistributorTest { @Test public void theEffortIsDistributedEvenly() { Distributor distributor = Distributor.among(Capacity.create(hours(8)), Capacity.create(hours(8))); assertThat(distributor.distribute(hours(16)), hasEfforts(hours(8), hours(8))); assertThat(distributor.distribute(hours(8)), hasEfforts(hours(4), hours(4))); } @Test public void ifNoOverassignationAllowedNotAllIsDistributed() { Distributor distributor = Distributor.among(Capacity.create(hours(8)) .notOverAssignableWithoutLimit(), Capacity.create(hours(8)) .notOverAssignableWithoutLimit()); assertThat(distributor.distribute(hours(18)), hasEfforts(hours(8), hours(8))); } @Test public void theOverAssignableCapacityGetsTheRest() { Distributor distributor = Distributor.among(Capacity.create(hours(8)) .notOverAssignableWithoutLimit(), Capacity.create(hours(8)) .overAssignableWithoutLimit()); assertThat(distributor.distribute(hours(14)), hasEfforts(hours(7), hours(7))); assertThat(distributor.distribute(hours(16)), hasEfforts(hours(8), hours(8))); assertThat(distributor.distribute(hours(18)), hasEfforts(hours(8), hours(10))); } @Test public void mixingNotOverAssignableAndOverassignableToALimit() { Distributor distributor = Distributor.among(Capacity.create(hours(8)) .withAllowedExtraEffort(hours(2)), Capacity.create(hours(8)) .notOverAssignableWithoutLimit()); assertThat(distributor.distribute(hours(16)), hasEfforts(hours(8), hours(8))); assertThat(distributor.distribute(hours(17)), hasEfforts(hours(9), hours(8))); assertThat(distributor.distribute(hours(18)), hasEfforts(hours(10), hours(8))); assertThat(distributor.distribute(hours(19)), hasEfforts(hours(10), hours(8))); } @Test public void ifNoCapacityItReturnsZeroHours() { Distributor distributor = Distributor.among(Capacity.create(hours(0)).notOverAssignableWithoutLimit()); assertThat(distributor.distribute(hours(4)), hasEfforts(hours(0))); } private Matcher<List<EffortDuration>> hasEfforts(final EffortDuration... efforts) { return new BaseMatcher<List<EffortDuration>>() { @Override public boolean matches(Object arg) { return Arrays.equals(efforts, toArray(arg)); } private EffortDuration[] toArray(Object value) { if ( value instanceof EffortDuration[] ) { return (EffortDuration[]) value; } if ( value instanceof List ) { List<?> list = (List<?>) value; return list.toArray(new EffortDuration[0]); } return null; } @Override public void describeTo(Description description) { description.appendText(Arrays.toString(efforts)); } }; } }