diff --git a/tests/Algorithm/JobScheduling/JobTest.php b/tests/Algorithm/JobScheduling/JobTest.php new file mode 100644 index 000000000..60912a1b5 --- /dev/null +++ b/tests/Algorithm/JobScheduling/JobTest.php @@ -0,0 +1,35 @@ +getValue()); + self::assertEquals((new \DateTime('now'))->format('Y-m-d'), $item->getStart()->format('Y-m-d')); + self::assertEquals(null, $item->getEnd()); + self::assertEquals('abc', $item->getName()); + } +} diff --git a/tests/Algorithm/JobScheduling/WeightedTest.php b/tests/Algorithm/JobScheduling/WeightedTest.php new file mode 100644 index 000000000..6cc4b6ffa --- /dev/null +++ b/tests/Algorithm/JobScheduling/WeightedTest.php @@ -0,0 +1,52 @@ +getValue(); + $names[] = $job->getName(); + } + + self::assertEqualsWithDelta(250, $value, 0.01); + + self::assertTrue( + \in_array('B', $names) + && \in_array('D', $names) + ); + } +} diff --git a/tests/Algorithm/Knapsack/BackpackTest.php b/tests/Algorithm/Knapsack/BackpackTest.php new file mode 100644 index 000000000..2630d3d5b --- /dev/null +++ b/tests/Algorithm/Knapsack/BackpackTest.php @@ -0,0 +1,47 @@ +getMaxCost()); + self::assertEquals(0.0, $backpack->getValue()); + self::assertEquals(0.0, $backpack->getCost()); + self::assertEquals([], $backpack->getItems()); + } + + public function testGetSet() : void + { + $backpack = new Backpack(3.0); + $backpack->addItem(new Item(2, 1), 2); + $backpack->addItem(new Item(2, 1), 1); + + self::assertEquals(3.0, $backpack->getMaxCost()); + self::assertEquals(6.0, $backpack->getValue()); + self::assertEquals(3.0, $backpack->getCost()); + self::assertEquals(2, \count($backpack->getItems())); + } +} diff --git a/tests/Algorithm/Knapsack/BoundedTest.php b/tests/Algorithm/Knapsack/BoundedTest.php new file mode 100644 index 000000000..3038ca8f8 --- /dev/null +++ b/tests/Algorithm/Knapsack/BoundedTest.php @@ -0,0 +1,81 @@ + new Item(150, 9, 'map'), 'quantity' => 1], + ['item' => new Item(35, 13, 'compass'), 'quantity' => 1], + ['item' => new Item(200, 153, 'water'), 'quantity' => 2], + ['item' => new Item(60, 50, 'sandwich'), 'quantity' => 2], + ['item' => new Item(60, 15, 'glucose'), 'quantity' => 2], + ['item' => new Item(45, 68, 'tin'), 'quantity' => 3], + ['item' => new Item(60, 27, 'banana'), 'quantity' => 3], + ['item' => new Item(40, 39, 'apple'), 'quantity' => 3], + ['item' => new Item(30, 23, 'cheese'), 'quantity' => 1], + ['item' => new Item(10, 52, 'beer'), 'quantity' => 3], + ['item' => new Item(70, 11, 'suntan_cream'), 'quantity' => 1], + ['item' => new Item(30, 32, 'camera'), 'quantity' => 1], + ['item' => new Item(15, 24, 'Tshirt'), 'quantity' => 2], + ['item' => new Item(10, 48, 'trousers'), 'quantity' => 2], + ['item' => new Item(40, 73, 'umbrella'), 'quantity' => 1], + ['item' => new Item(70, 42, 'waterproof_trousers'), 'quantity' => 1], + ['item' => new Item(75, 43, 'waterproof_overclothes'), 'quantity' => 1], + ['item' => new Item(80, 22, 'note_case'), 'quantity' => 1], + ['item' => new Item(20, 7, 'sunglasses'), 'quantity' => 1], + ['item' => new Item(12, 18, 'towel'), 'quantity' => 2], + ['item' => new Item(50, 4, 'socks'), 'quantity' => 1], + ['item' => new Item(10, 30, 'book'), 'quantity' => 2], + ]; + + $backpack = new Backpack(400.0); + $modifiedBackpack = Bounded::solve($items, $backpack); + + self::assertEquals(1010, $modifiedBackpack->getValue()); + self::assertEquals(396, $modifiedBackpack->getCost()); + + $backpackItems = $modifiedBackpack->getItems(); + self::assertEquals(11, \count($backpackItems)); + + $names = []; + foreach ($backpackItems as $backpackItem) { + $names[] = $backpackItem['item']->getName(); + } + + self::assertTrue( + \in_array('map', $names) + && \in_array('compass', $names) + && \in_array('water', $names) + && \in_array('glucose', $names) + && \in_array('banana', $names) + && \in_array('cheese', $names) + && \in_array('suntan_cream', $names) + && \in_array('waterproof_overclothes', $names) + && \in_array('note_case', $names) + && \in_array('sunglasses', $names) + && \in_array('socks', $names) + ); + } +} diff --git a/tests/Algorithm/Knapsack/ContinuousTest.php b/tests/Algorithm/Knapsack/ContinuousTest.php new file mode 100644 index 000000000..f08fcc9a8 --- /dev/null +++ b/tests/Algorithm/Knapsack/ContinuousTest.php @@ -0,0 +1,99 @@ + new Item(36.0, 3.8, 'beef'), 'quantity' => 1], + ['item' => new Item(43.0, 5.4, 'pork'), 'quantity' => 1], + ['item' => new Item(90.0, 3.6, 'ham'), 'quantity' => 1], + ['item' => new Item(45.0, 2.4, 'greaves'), 'quantity' => 1], + ['item' => new Item(30.0, 4.0, 'flitch'), 'quantity' => 1], + ['item' => new Item(56.0, 2.5, 'brawn'), 'quantity' => 1], + ['item' => new Item(67.0, 3.7, 'welt'), 'quantity' => 1], + ['item' => new Item(95.0, 3.0, 'salami'), 'quantity' => 1], + ['item' => new Item(98.0, 5.9, 'sausage'), 'quantity' => 1], + ]; + + $backpack = new Backpack(15.0); + $modifiedBackpack = Continuous::solve($items, $backpack); + + self::assertEquals(95 + 90 + 56 + 45 + 3.5 / 3.7 * 67, $modifiedBackpack->getValue()); + self::assertEquals(3.0 + 3.6 + 2.5 + 2.4 + 3.5, $modifiedBackpack->getCost()); + + $backpackItems = $modifiedBackpack->getItems(); + self::assertEquals(5, \count($backpackItems)); + + $names = []; + foreach ($backpackItems as $backpackItem) { + $names[] = $backpackItem['item']->getName(); + } + + self::assertTrue( + \in_array('salami', $names) + && \in_array('ham', $names) + && \in_array('brawn', $names) + && \in_array('greaves', $names) + && \in_array('welt', $names) + ); + } + + public function testBackpackingAlternative() : void + { + $items = [ + ['item' => new Item(36.0 / 3.8, 1, 'beef'), 'quantity' => 3.8], + ['item' => new Item(43.0 / 5.4, 1, 'pork'), 'quantity' => 5.4], + ['item' => new Item(90.0 / 3.6, 1, 'ham'), 'quantity' => 3.6], + ['item' => new Item(45.0 / 2.4, 1, 'greaves'), 'quantity' => 2.4], + ['item' => new Item(30.0 / 4.0, 1, 'flitch'), 'quantity' => 4.0], + ['item' => new Item(56.0 / 2.5, 1, 'brawn'), 'quantity' => 2.5], + ['item' => new Item(67.0 / 3.7, 1, 'welt'), 'quantity' => 3.7], + ['item' => new Item(95.0 / 3.0, 1, 'salami'), 'quantity' => 3.0], + ['item' => new Item(98.0 / 5.9, 1, 'sausage'), 'quantity' => 5.9], + ]; + + $backpack = new Backpack(15.0); + $modifiedBackpack = Continuous::solve($items, $backpack); + + self::assertEquals(95 + 90 + 56 + 45 + 3.5 / 3.7 * 67, $modifiedBackpack->getValue()); + self::assertEquals(3.0 + 3.6 + 2.5 + 2.4 + 3.5, $modifiedBackpack->getCost()); + + $backpackItems = $modifiedBackpack->getItems(); + self::assertEquals(5, \count($backpackItems)); + + $names = []; + foreach ($backpackItems as $backpackItem) { + $names[] = $backpackItem['item']->getName(); + } + + self::assertTrue( + \in_array('salami', $names) + && \in_array('ham', $names) + && \in_array('brawn', $names) + && \in_array('greaves', $names) + && \in_array('welt', $names) + ); + } +} diff --git a/tests/Algorithm/Knapsack/ItemTest.php b/tests/Algorithm/Knapsack/ItemTest.php new file mode 100644 index 000000000..1d107bcc0 --- /dev/null +++ b/tests/Algorithm/Knapsack/ItemTest.php @@ -0,0 +1,34 @@ +getValue()); + self::assertEquals(2.0, $item->getCost()); + self::assertEquals('abc', $item->getName()); + } +}