From 7d61c709cbddb8383954ac5001036dae72f65bd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Tue, 15 Sep 2009 23:58:25 +0200 Subject: [PATCH] ItEr25S07CUAsignacionGrupoRecursosAPlanificacionItEr24S08: Adding allocation capabilities to SpecificResourceAllocation. --- .../entities/SpecificResourceAllocation.java | 40 ++++++-- .../SpecificResourceAllocationTest.java | 92 +++++++++++++++++++ 2 files changed, 125 insertions(+), 7 deletions(-) create mode 100644 navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/SpecificResourceAllocationTest.java diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/SpecificResourceAllocation.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/SpecificResourceAllocation.java index 42e0544d3..bb5eb0c10 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/SpecificResourceAllocation.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/SpecificResourceAllocation.java @@ -1,19 +1,21 @@ package org.navalplanner.business.planner.entities; -import java.util.Collections; +import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; +import org.apache.commons.lang.Validate; import org.hibernate.validator.NotNull; +import org.joda.time.LocalDate; import org.navalplanner.business.resources.entities.Worker; /** * Represents the relation between {@link Task} and a specific {@link Worker}. - * * @author Manuel Rego Casasnovas */ -public class SpecificResourceAllocation extends ResourceAllocation { +public class SpecificResourceAllocation extends ResourceAllocation implements + IAllocatable { public static SpecificResourceAllocation create(Task task) { return (SpecificResourceAllocation) create(new SpecificResourceAllocation( @@ -55,12 +57,36 @@ public class SpecificResourceAllocation extends ResourceAllocation { this.worker = worker; } - public Set getSpecificDaysAssigment() { - return Collections.unmodifiableSet(specificDaysAssigment); + @Override + public List getAssignments() { + return DayAssigment.orderedByDay(specificDaysAssigment); + } + + private void setAssignments(List assignments) { + this.specificDaysAssigment = new HashSet( + assignments); } @Override - protected List getAssignments() { - return DayAssigment.orderedByDay(specificDaysAssigment); + public void allocate(ResourcesPerDay resourcesPerDay) { + Validate.notNull(resourcesPerDay); + Validate.notNull(worker); + AssignmentsAllocation assignmentsAllocation = new AssignmentsAllocation() { + + @Override + protected List distributeForDay( + LocalDate day, int totalHours) { + return Arrays.asList(SpecificDayAssigment.create(day, + totalHours, worker)); + } + + @Override + protected void resetAssignmentsTo( + List assignments) { + setAssignments(assignments); + } + }; + + assignmentsAllocation.allocate(resourcesPerDay); } } diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/SpecificResourceAllocationTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/SpecificResourceAllocationTest.java new file mode 100644 index 000000000..77de71fa2 --- /dev/null +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/entities/SpecificResourceAllocationTest.java @@ -0,0 +1,92 @@ +package org.navalplanner.business.test.planner.entities; + +import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.isA; +import static org.easymock.classextension.EasyMock.createNiceMock; +import static org.easymock.classextension.EasyMock.replay; +import static org.junit.Assert.assertThat; +import static org.navalplanner.business.test.planner.entities.DayAssigmentMatchers.consecutiveDays; +import static org.navalplanner.business.test.planner.entities.DayAssigmentMatchers.from; + +import org.joda.time.LocalDate; +import org.junit.Test; +import org.navalplanner.business.calendars.entities.BaseCalendar; +import org.navalplanner.business.calendars.entities.ResourceCalendar; +import org.navalplanner.business.planner.entities.ResourcesPerDay; +import org.navalplanner.business.planner.entities.SpecificResourceAllocation; +import org.navalplanner.business.planner.entities.Task; +import org.navalplanner.business.resources.entities.Worker; + +public class SpecificResourceAllocationTest { + + private BaseCalendar baseCalendar; + + private Task task; + + private SpecificResourceAllocation specificResourceAllocation; + + private Worker worker; + + private ResourceCalendar calendar; + + private int assignedHours = 0; + + private void givenAssignedHours(int assignedHours){ + this.assignedHours = assignedHours; + } + + private void givenWorker(){ + this.worker = createNiceMock(Worker.class); + expect(this.worker.getCalendar()).andReturn(calendar).anyTimes(); + expect(this.worker.getAssignedHours(isA(LocalDate.class))).andReturn(assignedHours).anyTimes(); + replay(this.worker); + } + + private void givenTask(LocalDate start, LocalDate end) { + task = createNiceMock(Task.class); + expect(task.getCalendar()).andReturn(baseCalendar).anyTimes(); + expect(task.getStartDate()).andReturn( + start.toDateTimeAtStartOfDay().toDate()).anyTimes(); + expect(task.getEndDate()).andReturn( + end.toDateTimeAtStartOfDay().toDate()).anyTimes(); + replay(task); + } + + private void givenSpecificResourceAllocation(LocalDate start, LocalDate end) { + givenWorker(); + givenTask(start, end); + specificResourceAllocation = SpecificResourceAllocation.create(task); + specificResourceAllocation.setWorker(worker); + } + + private void givenSpecificResourceAllocation(LocalDate start, int days) { + givenSpecificResourceAllocation(start, start.plusDays(days)); + } + + @Test + public void theAllocationsDoneAreOrderedByDay() { + givenSpecificResourceAllocation(new LocalDate(2000, 2, 4), 2); + specificResourceAllocation.allocate(ResourcesPerDay.amount(1)); + assertThat(specificResourceAllocation.getAssignments(), + consecutiveDays(2)); + } + + @Test + public void theAllocationStartsAtTheStartDate() { + LocalDate start = new LocalDate(2000, 2, 4); + givenSpecificResourceAllocation(start, 2); + specificResourceAllocation.allocate(ResourcesPerDay.amount(1)); + assertThat(specificResourceAllocation.getAssignments(), from(start)); + } + + @Test + public void theAllocationIsDoneEvenIfThereisOvertime() { + givenAssignedHours(4); + LocalDate start = new LocalDate(2000, 2, 4); + givenSpecificResourceAllocation(start, 2); + specificResourceAllocation.allocate(ResourcesPerDay.amount(1)); + assertThat(specificResourceAllocation.getAssignments(), + DayAssigmentMatchers.haveHours(8, 8)); + } + +}