From dd7b7f1a11744874ec3d79ec35db8da3d8231dbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Tue, 7 Jul 2009 14:01:05 +0200 Subject: [PATCH] ItEr16S12CreacionProxectoPlanificacion: Creating entities without mapping and associated tests. --- .../business/planner/entities/Dependency.java | 49 ++++++++++++ .../business/planner/entities/Task.java | 37 +++++++++ .../planner/entities/TaskElement.java | 71 +++++++++++++++++ .../business/planner/entities/TaskGroup.java | 24 ++++++ .../business/test/planner/DependencyTest.java | 55 ++++++++++++++ .../test/planner/TaskElementTest.java | 76 +++++++++++++++++++ .../business/test/planner/TaskGroupTest.java | 45 +++++++++++ .../business/test/planner/TaskTest.java | 49 ++++++++++++ 8 files changed, 406 insertions(+) create mode 100644 navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Dependency.java create mode 100644 navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Task.java create mode 100644 navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskElement.java create mode 100644 navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskGroup.java create mode 100644 navalplanner-business/src/test/java/org/navalplanner/business/test/planner/DependencyTest.java create mode 100644 navalplanner-business/src/test/java/org/navalplanner/business/test/planner/TaskElementTest.java create mode 100644 navalplanner-business/src/test/java/org/navalplanner/business/test/planner/TaskGroupTest.java create mode 100644 navalplanner-business/src/test/java/org/navalplanner/business/test/planner/TaskTest.java diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Dependency.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Dependency.java new file mode 100644 index 000000000..078a95e5b --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Dependency.java @@ -0,0 +1,49 @@ +package org.navalplanner.business.planner.entities; + +/** + * @author Óscar González Fernández + */ +public class Dependency { + + public enum Type { + END_START, START_START, END_END, START_END; + } + + public static Dependency createDependency(TaskElement origin, + TaskElement destination, Type type) { + Dependency dependency = new Dependency(origin, destination, type); + origin.add(dependency); + destination.add(dependency); + return dependency; + } + + private TaskElement origin; + + private TaskElement destination; + + private Type type; + + /** + * It's needed by Hibernate. DO NOT USE. + */ + public Dependency() { + } + + private Dependency(TaskElement origin, TaskElement end, Type type) { + this.origin = origin; + this.destination = end; + this.type = type; + } + + public TaskElement getOrigin() { + return origin; + } + + public TaskElement getDestination() { + return destination; + } + + public Type getType() { + return type; + } +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Task.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Task.java new file mode 100644 index 000000000..9adf6c86f --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/Task.java @@ -0,0 +1,37 @@ +package org.navalplanner.business.planner.entities; + +import org.apache.commons.lang.Validate; +import org.navalplanner.business.orders.entities.HoursGroup; + +/** + * @author Óscar González Fernández + */ +public class Task extends TaskElement { + + public static Task createTask(HoursGroup hoursGroup) { + return new Task(hoursGroup); + } + + private HoursGroup hoursGroup; + + /** + * For hibernate, DO NOT USE + */ + public Task() { + + } + + private Task(HoursGroup hoursGroup) { + Validate.notNull(hoursGroup); + this.hoursGroup = hoursGroup; + } + + public HoursGroup getHoursGroup() { + return this.hoursGroup; + } + + public Integer getHours() { + return hoursGroup.getWorkingHours(); + } + +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskElement.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskElement.java new file mode 100644 index 000000000..45d1cf83d --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskElement.java @@ -0,0 +1,71 @@ +package org.navalplanner.business.planner.entities; + +import java.util.Collections; +import java.util.Date; +import java.util.HashSet; +import java.util.Set; + +import org.apache.commons.lang.Validate; +import org.navalplanner.business.orders.entities.OrderElement; + +/** + * @author Óscar González Fernández + */ +public abstract class TaskElement { + private Date startDate; + + private Date endDate; + + private OrderElement orderElement; + + private Set dependenciesWithThisOrigin = new HashSet(); + + private Set dependenciesWithThisDestination = new HashSet(); + + public void setOrderElement(OrderElement orderElement) + throws IllegalArgumentException, IllegalStateException { + Validate.notNull(orderElement, "orderElement must be not null"); + if (this.orderElement != null) + throw new IllegalStateException( + "once a orderElement is set, it cannot be changed"); + this.orderElement = orderElement; + } + + public OrderElement getOrderElement() { + return orderElement; + } + + public Set getDependenciesWithThisOrigin() { + return Collections.unmodifiableSet(dependenciesWithThisOrigin); + } + + public Set getDependenciesWithThisDestination() { + return Collections.unmodifiableSet(dependenciesWithThisDestination); + } + + public Date getStartDate() { + return startDate; + } + + public void setStartDate(Date startDate) { + this.startDate = startDate; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + void add(Dependency dependency) { + if (this.equals(dependency.getOrigin())) { + dependenciesWithThisOrigin.add(dependency); + } + if (this.equals(dependency.getDestination())) { + dependenciesWithThisDestination.add(dependency); + } + } + +} diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskGroup.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskGroup.java new file mode 100644 index 000000000..99e30ba25 --- /dev/null +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/entities/TaskGroup.java @@ -0,0 +1,24 @@ +package org.navalplanner.business.planner.entities; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.lang.Validate; + +/** + * @author Óscar González Fernández + */ +public class TaskGroup extends TaskElement { + + private List taskElements = new ArrayList(); + + public List getTaskElements() { + return taskElements; + } + + public void addTaskElement(TaskElement task) { + Validate.notNull(task); + taskElements.add(task); + } + +} diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/DependencyTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/DependencyTest.java new file mode 100644 index 000000000..8670640d8 --- /dev/null +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/DependencyTest.java @@ -0,0 +1,55 @@ +package org.navalplanner.business.test.planner; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.navalplanner.business.planner.entities.Dependency; +import org.navalplanner.business.planner.entities.TaskElement; +import org.navalplanner.business.planner.entities.Dependency.Type; + +/** + * @author Óscar González Fernández + */ +public class DependencyTest { + private Dependency dependency; + private TaskElement origin; + private TaskElement destination; + private Type type; + + public DependencyTest() { + origin = TaskTest.createValidTask(); + destination = TaskTest.createValidTask(); + type = Type.END_START; + dependency = Dependency.createDependency(origin, destination, type); + } + + @Test + public void dependencyHasOriginProperty() { + assertThat(dependency.getOrigin(), equalTo(origin)); + } + + @Test + public void dependencyHasDestinationProperty() { + assertThat(dependency.getDestination(), equalTo(destination)); + } + + @Test + public void dependencyHasTypeProperty() { + assertThat(dependency.getType(), equalTo(type)); + } + + @Test + public void creatingDependencyImpliesAssociatingItWithTheRelatedTasks() { + assertFalse(origin.getDependenciesWithThisDestination().contains( + dependency)); + assertTrue(origin.getDependenciesWithThisOrigin().contains(dependency)); + + assertTrue(destination.getDependenciesWithThisDestination().contains( + dependency)); + assertFalse(destination.getDependenciesWithThisOrigin().contains( + dependency)); + } +} diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/TaskElementTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/TaskElementTest.java new file mode 100644 index 000000000..d44d536b7 --- /dev/null +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/TaskElementTest.java @@ -0,0 +1,76 @@ +package org.navalplanner.business.test.planner; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +import java.util.Date; + +import org.junit.Test; +import org.navalplanner.business.orders.entities.OrderLine; +import org.navalplanner.business.planner.entities.Dependency; +import org.navalplanner.business.planner.entities.Task; +import org.navalplanner.business.planner.entities.TaskElement; +import org.navalplanner.business.planner.entities.Dependency.Type; + +/** + * @author Óscar González Fernández + */ +public class TaskElementTest { + + private TaskElement task = new Task(); + + private TaskElement taskWithOrderLine; + + private Dependency exampleDependency; + + public TaskElementTest() { + this.taskWithOrderLine = new Task(); + this.taskWithOrderLine.setOrderElement(new OrderLine()); + this.exampleDependency = Dependency.createDependency(new Task(), + new Task(), Type.END_START); + } + + @Test + public void taskElementHasAOneToOneRelationshipWithOrderElement() { + OrderLine order = new OrderLine(); + task.setOrderElement(order); + assertSame(order, task.getOrderElement()); + } + + @Test(expected = IllegalArgumentException.class) + public void orderElementCannotBeSetToNull() { + task.setOrderElement(null); + } + + @Test(expected = IllegalStateException.class) + public void onceSetOrderElementCannotBeChanged() { + taskWithOrderLine.setOrderElement(new OrderLine()); + } + + @Test + public void initiallyAssociatedDependenciesAreEmpty() { + assertTrue(task.getDependenciesWithThisDestination().isEmpty()); + assertTrue(task.getDependenciesWithThisOrigin().isEmpty()); + } + + @Test(expected = UnsupportedOperationException.class) + public void dependenciesWithThisOriginCollectionCannotBeModified() { + task.getDependenciesWithThisOrigin().add(exampleDependency); + } + + @Test(expected = UnsupportedOperationException.class) + public void dependenciesWithThisDestinationCollectionCannotBeModified() { + task.getDependenciesWithThisDestination().add(exampleDependency); + } + + @Test + public void taskElementHasStartDateProperty() { + Date now = new Date(); + task.setStartDate(now); + assertThat(task.getStartDate(), equalTo(now)); + task.setEndDate(now); + assertThat(task.getEndDate(), equalTo(now)); + } +} diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/TaskGroupTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/TaskGroupTest.java new file mode 100644 index 000000000..824843733 --- /dev/null +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/TaskGroupTest.java @@ -0,0 +1,45 @@ +package org.navalplanner.business.test.planner; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +import java.util.Arrays; +import java.util.List; + +import org.junit.Test; +import org.navalplanner.business.planner.entities.Task; +import org.navalplanner.business.planner.entities.TaskElement; +import org.navalplanner.business.planner.entities.TaskGroup; + +/** + * @author Óscar González Fernández + */ +public class TaskGroupTest { + private TaskGroup taskGroup = new TaskGroup(); + + @Test + public void taskGroupIsAnInstanceOfTaskElement() { + assertTrue(taskGroup instanceof TaskElement); + } + + @Test + public void taskGroupHasManyTaskElements() { + List tasks = taskGroup.getTaskElements(); + assertTrue("a task group has no task elements initially", tasks + .isEmpty()); + TaskElement child1 = new Task(); + taskGroup.addTaskElement(child1); + TaskGroup child2 = new TaskGroup(); + taskGroup.addTaskElement(child2); + List taskElements = taskGroup.getTaskElements(); + assertThat(taskElements.size(), equalTo(2)); + assertThat(taskGroup.getTaskElements(), equalTo(Arrays.asList(child1, + child2))); + } + + @Test(expected = IllegalArgumentException.class) + public void cantAndNullTaskElement() { + taskGroup.addTaskElement(null); + } +} diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/TaskTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/TaskTest.java new file mode 100644 index 000000000..70de8019d --- /dev/null +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/TaskTest.java @@ -0,0 +1,49 @@ +package org.navalplanner.business.test.planner; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.navalplanner.business.orders.entities.HoursGroup; +import org.navalplanner.business.planner.entities.Task; +import org.navalplanner.business.planner.entities.TaskElement; + +/** + * @author Óscar González Fernández + */ +public class TaskTest { + + private Task task; + private HoursGroup hoursGroup; + + public TaskTest() { + hoursGroup = new HoursGroup(); + hoursGroup.setWorkingHours(3); + task = Task.createTask(hoursGroup); + } + + @Test + public void taskIsASubclassOfTaskElement() { + assertTrue(task instanceof TaskElement); + } + + @Test + public void taskHasNumberOfHours() { + assertThat(task.getHours(), equalTo(hoursGroup.getWorkingHours())); + } + + @Test + public void taskMustHaveOneHoursGroup() { + HoursGroup hoursGroup = task.getHoursGroup(); + assertNotNull(hoursGroup); + } + + public static TaskElement createValidTask() { + HoursGroup hours = new HoursGroup(); + hours.setWorkingHours(20); + return Task.createTask(hours); + } + +}