import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; public class RucksackProblemTest { @Before public void setUp() throws Exception { PackingObject.reset(); } //////////////////////////////////////////////// // Tests for Rucksack object @Test public void rucksackCreation() { int capacity = 50; Rucksack rucksack = new Rucksack(capacity); assertEquals(capacity, rucksack.getTotalCapacity()); assertEquals(capacity, rucksack.getAvailableCapacity()); assertEquals(0, rucksack.getTotalWeight()); assertEquals(0, rucksack.getTotalValue()); } @Test public void rucksackPutObjectContains() { int weight1 = 5; int value1 = 4; int weight2 = 15; int value2 = 14; int capacity = 40; PackingObject obj1 = new PackingObject(value1, weight1); PackingObject obj2 = new PackingObject(value2, weight2); Rucksack rucksack = new Rucksack(capacity); assertFalse(rucksack.contains(obj1)); rucksack.putObject(obj1); assertTrue(rucksack.contains(obj1)); assertEquals(weight1, rucksack.getTotalWeight()); assertEquals(value1, rucksack.getTotalValue()); assertEquals(capacity - weight1, rucksack.getAvailableCapacity()); assertFalse(rucksack.contains(obj2)); rucksack.putObject(obj2); assertTrue(rucksack.contains(obj2)); assertEquals(weight1 + weight2, rucksack.getTotalWeight()); assertEquals(value1 + value2, rucksack.getTotalValue()); assertEquals(capacity - weight1 - weight2, rucksack.getAvailableCapacity()); try { rucksack.putObject(obj2); assertTrue("Adding an object already present should throw a ObjectAlreadyPresentException!", false); } catch (ObjectAlreadyPresentException e) { } } @Test public void rucksackExceedCapacity() { int weight1 = 5; int value1 = 4; int weight2 = 15; int value2 = 14; int capacity = 15; PackingObject obj1 = new PackingObject(value1, weight1); PackingObject obj2 = new PackingObject(value2, weight2); Rucksack rucksack = new Rucksack(capacity); rucksack.putObject(obj1); try { rucksack.putObject(obj2); assertTrue("Adding an object above capacity should throw a CapacityExceededException!", false); } catch (CapacityExceededException e) { } } @Test public void rucksackRemoveObjectContains() { int weight1 = 5; int value1 = 4; int weight2 = 15; int value2 = 14; int capacity = 20; PackingObject obj1 = new PackingObject(value1, weight1); PackingObject obj2 = new PackingObject(value2, weight2); Rucksack rucksack = new Rucksack(capacity); rucksack.putObject(obj1); rucksack.putObject(obj2); rucksack.removeObject(obj2); assertEquals(value1, rucksack.getTotalValue()); assertFalse(rucksack.contains(obj2)); try { rucksack.removeObject(obj2); assertTrue("Removing object not present should throw ObjectNotPresentException!", false); } catch (ObjectNotPresentException e) { } } @Test public void rucksackCopyFrom() { int capacity1 = 20; PackingObject obj1 = new PackingObject(1,1); PackingObject obj2 = new PackingObject(2,2); Rucksack rucksack1 = new Rucksack(capacity1); Rucksack rucksack2 = new Rucksack(5); rucksack1.putObject(obj1); rucksack2.copyFrom(rucksack1); assertEquals(capacity1, rucksack2.getTotalCapacity()); assertTrue(rucksack2.contains(obj1)); rucksack1.removeObject(obj1); assertFalse(rucksack1.contains(obj1)); assertTrue(rucksack2.contains(obj1)); rucksack2.putObject(obj2); assertFalse(rucksack1.contains(obj2)); assertTrue(rucksack2.contains(obj2)); } /////////////////////////////////////////////////////////////// // Tests for RucksackProblem private int calculateValue(RucksackProblem problem, Rucksack rucksack) { int result = 0; for (PackingObject object : problem.getAllObjects()) { if (rucksack.contains(object)) { result += object.getValue(); } } return result; } private int calculateWeight(RucksackProblem problem, Rucksack rucksack) { int result = 0; for (PackingObject object : problem.getAllObjects()) { if (rucksack.contains(object)) { result += object.getWeight(); } } return result; } private PackingObject[] createPackingObjects(int[] values, int[] weights) { PackingObject[] objects = new PackingObject[weights.length]; for (int i=0; i