From 0392d9106db3d1515f000910ce3c18352afb2a81 Mon Sep 17 00:00:00 2001 From: oblonski <4sschroeder@gmail.com> Date: Tue, 1 Jul 2014 23:11:22 +0200 Subject: [PATCH] added skills --- .../jsprit/core/problem/vehicle/Vehicle.java | 9 ++- .../core/problem/vehicle/VehicleImpl.java | 25 +++----- .../state/UpdateRequiredSkillsTest.java | 62 +++++++++++++++++++ .../java/jsprit/core/problem/SkillsTest.java | 39 ++++++++++++ .../jsprit/core/problem/job/DeliveryTest.java | 18 ++++-- .../jsprit/core/problem/job/PickupTest.java | 19 ++++-- .../jsprit/core/problem/job/ServiceTest.java | 27 ++++---- .../jsprit/core/problem/job/ShipmentTest.java | 23 ++++--- .../core/problem/vehicle/VehicleImplTest.java | 14 ++--- 9 files changed, 182 insertions(+), 54 deletions(-) create mode 100644 jsprit-core/src/test/java/jsprit/core/algorithm/state/UpdateRequiredSkillsTest.java create mode 100644 jsprit-core/src/test/java/jsprit/core/problem/SkillsTest.java diff --git a/jsprit-core/src/main/java/jsprit/core/problem/vehicle/Vehicle.java b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/Vehicle.java index 37c7a755..c7c40a91 100644 --- a/jsprit-core/src/main/java/jsprit/core/problem/vehicle/Vehicle.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/Vehicle.java @@ -18,6 +18,7 @@ package jsprit.core.problem.vehicle; import java.util.Set; +import jsprit.core.problem.Skills; import jsprit.core.util.Coordinate; /** @@ -85,7 +86,11 @@ public interface Vehicle { */ public abstract Coordinate getEndLocationCoordinate(); - public abstract Set getSkills(); + /** + * Returns skills. + * + * @return + */ + public abstract Skills getSkills(); - public abstract boolean hasSkill(String string); } diff --git a/jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleImpl.java b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleImpl.java index f2fff84f..b2edec3e 100644 --- a/jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleImpl.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/vehicle/VehicleImpl.java @@ -20,6 +20,7 @@ import java.util.Collections; import java.util.HashSet; import java.util.Set; +import jsprit.core.problem.Skills; import jsprit.core.util.Coordinate; import org.apache.log4j.Logger; @@ -77,8 +78,8 @@ public class VehicleImpl implements Vehicle { private boolean returnToDepot = true; private VehicleType type = VehicleTypeImpl.Builder.newInstance("default").build(); - - private Set skills = new HashSet(); + + private Skills.Builder skillBuilder = Skills.Builder.newInstance(); /** * Constructs the builder with the vehicleId. @@ -235,13 +236,13 @@ public class VehicleImpl implements Vehicle { public static Builder newInstance(String vehicleId){ return new Builder(vehicleId); } /** - * Adds skill and returns build. + * Adds skill and returns builder. * * @param skill * @return */ public Builder addSkill(String skill) { - this.skills.add(skill.toLowerCase()); + skillBuilder.addSkill(skill); return this; } @@ -284,7 +285,7 @@ public class VehicleImpl implements Vehicle { private final String startLocationId; - private final Set skills; + private final Skills skills; private VehicleImpl(Builder builder){ id = builder.id; @@ -296,7 +297,7 @@ public class VehicleImpl implements Vehicle { startLocationCoord = builder.startLocationCoord; endLocationId = builder.endLocationId; endLocationCoord = builder.endLocationCoord; - skills = builder.skills; + skills = builder.skillBuilder.build(); } /** @@ -429,16 +430,8 @@ public class VehicleImpl implements Vehicle { } @Override - public Set getSkills() { - return Collections.unmodifiableSet(skills); + public Skills getSkills() { + return skills; } - @Override - public boolean hasSkill(String skill) { - return skills.contains(skill.toLowerCase()); - } - - - - } diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/state/UpdateRequiredSkillsTest.java b/jsprit-core/src/test/java/jsprit/core/algorithm/state/UpdateRequiredSkillsTest.java new file mode 100644 index 00000000..d018be5a --- /dev/null +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/state/UpdateRequiredSkillsTest.java @@ -0,0 +1,62 @@ +package jsprit.core.algorithm.state; + +import jsprit.core.problem.Skills; +import jsprit.core.problem.cost.VehicleRoutingTransportCosts; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.state.StateFactory; +import jsprit.core.problem.vehicle.Vehicle; +import junit.framework.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +/** + * Created by schroeder on 01.07.14. + */ +public class UpdateRequiredSkillsTest { + + private VehicleRoute route; + + private StateManager stateManager; + + @Before + public void doBefore(){ + Vehicle vehicle = mock(Vehicle.class); + Service service = mock(Service.class); + Service service2 = mock(Service.class); + Service service3 = mock(Service.class); + when(service.getRequiredSkills()).thenReturn(Skills.Builder.newInstance().addSkill("skill1").build()); + when(service2.getRequiredSkills()).thenReturn(Skills.Builder.newInstance().addSkill("skill1").addSkill("skill2") + .addSkill("skill3").build()); + when(service3.getRequiredSkills()).thenReturn(Skills.Builder.newInstance().addSkill("skill4") + .addSkill("skill5").build()); + route = VehicleRoute.Builder.newInstance(vehicle).addService(service).addService(service2).addService(service3).build(); + stateManager = new StateManager(mock(VehicleRoutingTransportCosts.class)); + stateManager.addStateUpdater(new UpdateSkills(stateManager)); + } + + @Test + public void whenUpdatingRoute_skillsAtRouteLevelShouldContainAllSkills(){ + stateManager.update(route); + Skills skills = stateManager.getRouteState(route, StateFactory.SKILLS, Skills.class); + assertNotNull(skills); + Assert.assertEquals(5,skills.values().size()); + assertTrue(skills.containsSkill("skill1")); + assertTrue(skills.containsSkill("skill2")); + assertTrue(skills.containsSkill("skill3")); + assertTrue(skills.containsSkill("skill4")); + assertTrue(skills.containsSkill("skill5")); + } + + +} diff --git a/jsprit-core/src/test/java/jsprit/core/problem/SkillsTest.java b/jsprit-core/src/test/java/jsprit/core/problem/SkillsTest.java new file mode 100644 index 00000000..38628a8f --- /dev/null +++ b/jsprit-core/src/test/java/jsprit/core/problem/SkillsTest.java @@ -0,0 +1,39 @@ +package jsprit.core.problem; + +import org.junit.Test; + +import java.util.HashSet; +import java.util.Set; + +import static org.junit.Assert.assertTrue; + +/** + * Created by schroeder on 01.07.14. + */ +public class SkillsTest { + + @Test + public void whenSkillsAdded_theyShouldBeinSkillSet(){ + Skills skills = Skills.Builder.newInstance().addSkill("skill1").addSkill("skill2").build(); + assertTrue(skills.containsSkill("skill1")); + assertTrue(skills.containsSkill("skill2")); + } + + @Test + public void whenSkillsAddedCaseInsensitive_theyShouldBeinSkillSet(){ + Skills skills = Skills.Builder.newInstance().addSkill("skill1").addSkill("skill2").build(); + assertTrue(skills.containsSkill("skilL1")); + assertTrue(skills.containsSkill("skIll2")); + } + + @Test + public void whenSkillsAddedThroughAddAll_theyShouldBeinSkillSet(){ + Set skillSet = new HashSet(); + skillSet.add("skill1"); + skillSet.add("skill2"); + Skills skills = Skills.Builder.newInstance().addAllSkills(skillSet).build(); + assertTrue(skills.containsSkill("skill1")); + assertTrue(skills.containsSkill("skill2")); + } + +} diff --git a/jsprit-core/src/test/java/jsprit/core/problem/job/DeliveryTest.java b/jsprit-core/src/test/java/jsprit/core/problem/job/DeliveryTest.java index 6855e992..adb920d1 100644 --- a/jsprit-core/src/test/java/jsprit/core/problem/job/DeliveryTest.java +++ b/jsprit-core/src/test/java/jsprit/core/problem/job/DeliveryTest.java @@ -1,6 +1,7 @@ package jsprit.core.problem.job; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.junit.Test; @@ -44,18 +45,25 @@ public class DeliveryTest { public void whenAddingSkills_theyShouldBeAddedCorrectly(){ Delivery s = (Delivery) Delivery.Builder.newInstance("s").setLocationId("loc") .addSkill("drill").addSkill("screwdriver").build(); - assertTrue(s.getRequiredSkills().contains("drill")); - assertTrue(s.requiresSkill("drill")); - assertTrue(s.requiresSkill("ScrewDriver")); + assertTrue(s.getRequiredSkills().containsSkill("drill")); + assertTrue(s.getRequiredSkills().containsSkill("ScrewDriver")); } @Test public void whenAddingSkillsCaseSens_theyShouldBeAddedCorrectly(){ Delivery s = (Delivery) Delivery.Builder.newInstance("s").setLocationId("loc") .addSkill("DriLl").addSkill("screwDriver").build(); - assertTrue(s.getRequiredSkills().contains("drill")); - assertTrue(s.requiresSkill("drilL")); + assertTrue(s.getRequiredSkills().containsSkill("drill")); + assertTrue(s.getRequiredSkills().containsSkill("drilL")); } + @Test + public void whenAddingSkillsCaseSensV2_theyShouldBeAddedCorrectly(){ + Delivery s = (Delivery) Delivery.Builder.newInstance("s").setLocationId("loc") + .addSkill("screwDriver").build(); + assertFalse(s.getRequiredSkills().containsSkill("drill")); + assertFalse(s.getRequiredSkills().containsSkill("drilL")); + } + } diff --git a/jsprit-core/src/test/java/jsprit/core/problem/job/PickupTest.java b/jsprit-core/src/test/java/jsprit/core/problem/job/PickupTest.java index 5987c4f1..ae76970c 100644 --- a/jsprit-core/src/test/java/jsprit/core/problem/job/PickupTest.java +++ b/jsprit-core/src/test/java/jsprit/core/problem/job/PickupTest.java @@ -1,6 +1,7 @@ package jsprit.core.problem.job; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.junit.Test; @@ -44,18 +45,26 @@ public class PickupTest { public void whenAddingSkills_theyShouldBeAddedCorrectly(){ Pickup s = (Pickup) Pickup.Builder.newInstance("s").setLocationId("loc") .addSkill("drill").addSkill("screwdriver").build(); - assertTrue(s.getRequiredSkills().contains("drill")); - assertTrue(s.requiresSkill("drill")); - assertTrue(s.requiresSkill("ScrewDriver")); + assertTrue(s.getRequiredSkills().containsSkill("drill")); + assertTrue(s.getRequiredSkills().containsSkill("drill")); + assertTrue(s.getRequiredSkills().containsSkill("ScrewDriver")); } @Test public void whenAddingSkillsCaseSens_theyShouldBeAddedCorrectly(){ Pickup s = (Pickup) Pickup.Builder.newInstance("s").setLocationId("loc") .addSkill("DriLl").addSkill("screwDriver").build(); - assertTrue(s.getRequiredSkills().contains("drill")); - assertTrue(s.requiresSkill("drilL")); + assertTrue(s.getRequiredSkills().containsSkill("drill")); + assertTrue(s.getRequiredSkills().containsSkill("drilL")); } + @Test + public void whenAddingSkillsCaseSensV2_theyShouldBeAddedCorrectly(){ + Pickup s = (Pickup) Pickup.Builder.newInstance("s").setLocationId("loc") + .addSkill("screwDriver").build(); + assertFalse(s.getRequiredSkills().containsSkill("drill")); + assertFalse(s.getRequiredSkills().containsSkill("drilL")); + } + } diff --git a/jsprit-core/src/test/java/jsprit/core/problem/job/ServiceTest.java b/jsprit-core/src/test/java/jsprit/core/problem/job/ServiceTest.java index b215408b..2a71d9c3 100644 --- a/jsprit-core/src/test/java/jsprit/core/problem/job/ServiceTest.java +++ b/jsprit-core/src/test/java/jsprit/core/problem/job/ServiceTest.java @@ -16,12 +16,6 @@ ******************************************************************************/ package jsprit.core.problem.job; -import static org.junit.Assert.assertEquals; - -import static org.junit.Assert.assertNotNull; - -import static org.junit.Assert.assertTrue; - import java.util.HashSet; import java.util.Set; @@ -30,6 +24,9 @@ import jsprit.core.util.Coordinate; import org.junit.Test; +import static org.junit.Assert.*; +import static org.junit.Assert.assertFalse; + public class ServiceTest { @Test @@ -151,17 +148,25 @@ public class ServiceTest { public void whenAddingSkills_theyShouldBeAddedCorrectly(){ Service s = Service.Builder.newInstance("s").setLocationId("loc") .addSkill("drill").addSkill("screwdriver").build(); - assertTrue(s.getRequiredSkills().contains("drill")); - assertTrue(s.requiresSkill("drill")); - assertTrue(s.requiresSkill("ScrewDriver")); + assertTrue(s.getRequiredSkills().containsSkill("drill")); + assertTrue(s.getRequiredSkills().containsSkill("drill")); + assertTrue(s.getRequiredSkills().containsSkill("ScrewDriver")); } @Test public void whenAddingSkillsCaseSens_theyShouldBeAddedCorrectly(){ Service s = Service.Builder.newInstance("s").setLocationId("loc") .addSkill("DriLl").addSkill("screwDriver").build(); - assertTrue(s.getRequiredSkills().contains("drill")); - assertTrue(s.requiresSkill("drilL")); + assertTrue(s.getRequiredSkills().containsSkill("drill")); + assertTrue(s.getRequiredSkills().containsSkill("drilL")); } + @Test + public void whenAddingSkillsCaseSensV2_theyShouldBeAddedCorrectly(){ + Service s = Service.Builder.newInstance("s").setLocationId("loc") + .addSkill("screwDriver").build(); + assertFalse(s.getRequiredSkills().containsSkill("drill")); + assertFalse(s.getRequiredSkills().containsSkill("drilL")); + } + } diff --git a/jsprit-core/src/test/java/jsprit/core/problem/job/ShipmentTest.java b/jsprit-core/src/test/java/jsprit/core/problem/job/ShipmentTest.java index 5aa3d039..79bda2a3 100644 --- a/jsprit-core/src/test/java/jsprit/core/problem/job/ShipmentTest.java +++ b/jsprit-core/src/test/java/jsprit/core/problem/job/ShipmentTest.java @@ -1,13 +1,12 @@ package jsprit.core.problem.job; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; import jsprit.core.problem.solution.route.activity.TimeWindow; import jsprit.core.util.Coordinate; import org.junit.Test; +import static org.junit.Assert.*; + public class ShipmentTest { @Test @@ -236,16 +235,24 @@ public class ShipmentTest { public void whenAddingSkills_theyShouldBeAddedCorrectly(){ Shipment s = Shipment.Builder.newInstance("s").setPickupLocation("loc").setDeliveryLocation("delLoc") .addSkill("drill").addSkill("screwdriver").build(); - assertTrue(s.getRequiredSkills().contains("drill")); - assertTrue(s.requiresSkill("drill")); - assertTrue(s.requiresSkill("ScrewDriver")); + assertTrue(s.getRequiredSkills().containsSkill("drill")); + assertTrue(s.getRequiredSkills().containsSkill("drill")); + assertTrue(s.getRequiredSkills().containsSkill("ScrewDriver")); } @Test public void whenAddingSkillsCaseSens_theyShouldBeAddedCorrectly(){ Delivery s = (Delivery) Delivery.Builder.newInstance("s").setLocationId("loc") .addSkill("DriLl").addSkill("screwDriver").build(); - assertTrue(s.getRequiredSkills().contains("drill")); - assertTrue(s.requiresSkill("drilL")); + assertTrue(s.getRequiredSkills().containsSkill("drill")); + assertTrue(s.getRequiredSkills().containsSkill("drilL")); } + + @Test + public void whenAddingSkillsCaseSensV2_theyShouldBeAddedCorrectly(){ + Delivery s = (Delivery) Delivery.Builder.newInstance("s").setLocationId("loc") + .addSkill("screwDriver").build(); + assertFalse(s.getRequiredSkills().containsSkill("drill")); + assertFalse(s.getRequiredSkills().containsSkill("drilL")); + } } diff --git a/jsprit-core/src/test/java/jsprit/core/problem/vehicle/VehicleImplTest.java b/jsprit-core/src/test/java/jsprit/core/problem/vehicle/VehicleImplTest.java index 3564c77a..df3dfafd 100644 --- a/jsprit-core/src/test/java/jsprit/core/problem/vehicle/VehicleImplTest.java +++ b/jsprit-core/src/test/java/jsprit/core/problem/vehicle/VehicleImplTest.java @@ -192,9 +192,9 @@ public class VehicleImplTest { VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("type").build(); Vehicle v = VehicleImpl.Builder.newInstance("v").setStartLocationId("start").setType(type1).setEndLocationId("start") .addSkill("drill").addSkill("screwdriver").build(); - assertTrue(v.getSkills().contains("drill")); - assertTrue(v.hasSkill("drill")); - assertTrue(v.hasSkill("screwdriver")); + assertTrue(v.getSkills().containsSkill("drill")); + assertTrue(v.getSkills().containsSkill("drill")); + assertTrue(v.getSkills().containsSkill("screwdriver")); } @Test @@ -202,9 +202,9 @@ public class VehicleImplTest { VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("type").build(); Vehicle v = VehicleImpl.Builder.newInstance("v").setStartLocationId("start").setType(type1).setEndLocationId("start") .addSkill("drill").addSkill("screwdriver").build(); - assertTrue(v.getSkills().contains("drill")); - assertTrue(v.hasSkill("dRill")); - assertTrue(v.hasSkill("ScrewDriver")); + assertTrue(v.getSkills().containsSkill("drill")); + assertTrue(v.getSkills().containsSkill("dRill")); + assertTrue(v.getSkills().containsSkill("ScrewDriver")); } @Test @@ -212,7 +212,7 @@ public class VehicleImplTest { VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("type").build(); Vehicle v = VehicleImpl.Builder.newInstance("v").setStartLocationId("start").setType(type1).setEndLocationId("start") .addSkill("drill").build(); - assertFalse(v.hasSkill("ScrewDriver")); + assertFalse(v.getSkills().containsSkill("ScrewDriver")); }