Skip to content

Commit

Permalink
Extend Item interface to add a flag to say if the item should be kept…
Browse files Browse the repository at this point in the history
… flat or not (not yet used)
  • Loading branch information
dvdoug committed May 30, 2016
1 parent 7638bb1 commit b63d39f
Show file tree
Hide file tree
Showing 8 changed files with 183 additions and 138 deletions.
11 changes: 10 additions & 1 deletion Item.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,13 @@ public function getWeight();
* @return int
*/
public function getVolume();
}

/**
* Does this item need to be kept flat?
* XXX not yet used, all items are kept flat
* @return bool
*/
public function getKeepFlat();

}

6 changes: 3 additions & 3 deletions tests/ItemListTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ class ItemListTest extends \PHPUnit_Framework_TestCase
function testCompare()
{

$box1 = new TestItem('Small', 20, 20, 2, 100);
$box2 = new TestItem('Large', 200, 200, 20, 1000);
$box3 = new TestItem('Medium', 100, 100, 10, 500);
$box1 = new TestItem('Small', 20, 20, 2, 100, true);
$box2 = new TestItem('Large', 200, 200, 20, 1000, true);
$box3 = new TestItem('Medium', 100, 100, 10, 500, true);

$list = new ItemList;
$list->insert($box1);
Expand Down
4 changes: 2 additions & 2 deletions tests/PackedBoxListTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class PackedBoxListTest extends \PHPUnit_Framework_TestCase
function testVolumeUtilisation()
{
$box = new TestBox('Box', 10, 10, 10, 10, 10, 10, 10, 10);
$item = new TestItem('Item', 5, 10, 10, 10);
$item = new TestItem('Item', 5, 10, 10, 10, true);

$boxItems = new ItemList();
$boxItems->insert($item);
Expand All @@ -28,7 +28,7 @@ function testVolumeUtilisation()
function testWeightVariance()
{
$box = new TestBox('Box', 10, 10, 10, 10, 10, 10, 10, 10);
$item = new TestItem('Item', 5, 10, 10, 10);
$item = new TestItem('Item', 5, 10, 10, 10, true);

$boxItems = new ItemList();
$boxItems->insert($item);
Expand Down
4 changes: 2 additions & 2 deletions tests/PackedBoxTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class PackedBoxTest extends \PHPUnit_Framework_TestCase
function testGetters()
{
$box = new TestBox('Box', 370, 375, 60, 140, 364, 374, 40, 3000);
$item = new TestItem('Item', 230, 330, 6, 320);
$item = new TestItem('Item', 230, 330, 6, 320, true);

$boxItems = new ItemList();
$boxItems->insert($item);
Expand All @@ -28,7 +28,7 @@ function testGetters()
function testVolumeUtilisation()
{
$box = new TestBox('Box', 10, 10, 10, 10, 10, 10, 10, 10);
$item = new TestItem('Item', 5, 10, 10, 10);
$item = new TestItem('Item', 5, 10, 10, 10, true);

$boxItems = new ItemList();
$boxItems->insert($item);
Expand Down
84 changes: 42 additions & 42 deletions tests/PackerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ public function testPackThreeItemsFitEasilyInSmallerOfTwoBoxes()
$box1 = new TestBox('Le petite box', 300, 300, 10, 10, 296, 296, 8, 1000);
$box2 = new TestBox('Le grande box', 3000, 3000, 100, 100, 2960, 2960, 80, 10000);

$item1 = new TestItem('Item 1', 250, 250, 2, 200);
$item2 = new TestItem('Item 2', 250, 250, 2, 200);
$item3 = new TestItem('Item 3', 250, 250, 2, 200);
$item1 = new TestItem('Item 1', 250, 250, 2, 200, true);
$item2 = new TestItem('Item 2', 250, 250, 2, 200, true);
$item3 = new TestItem('Item 3', 250, 250, 2, 200, true);

$packer = new Packer();
$packer->addBox($box1);
Expand All @@ -39,9 +39,9 @@ public function testPackThreeItemsFitEasilyInLargerOfTwoBoxes()
$box1 = new TestBox('Le petite box', 300, 300, 10, 10, 296, 296, 8, 1000);
$box2 = new TestBox('Le grande box', 3000, 3000, 100, 100, 2960, 2960, 80, 10000);

$item1 = new TestItem('Item 1', 2500, 2500, 20, 2000);
$item2 = new TestItem('Item 2', 2500, 2500, 20, 2000);
$item3 = new TestItem('Item 3', 2500, 2500, 20, 2000);
$item1 = new TestItem('Item 1', 2500, 2500, 20, 2000, true);
$item2 = new TestItem('Item 2', 2500, 2500, 20, 2000, true);
$item3 = new TestItem('Item 3', 2500, 2500, 20, 2000, true);

$packer = new Packer();
$packer->addBox($box1);
Expand All @@ -63,11 +63,11 @@ public function testPackFiveItemsTwoLargeOneSmallBox()
$box1 = new TestBox('Le petite box', 600, 600, 10, 10, 596, 596, 8, 1000);
$box2 = new TestBox('Le grande box', 3000, 3000, 50, 100, 2960, 2960, 40, 10000);

$item1 = new TestItem('Item 1', 2500, 2500, 20, 500);
$item2 = new TestItem('Item 2', 550, 550, 2, 500);
$item3 = new TestItem('Item 3', 2500, 2500, 20, 500);
$item4 = new TestItem('Item 4', 2500, 2500, 20, 500);
$item5 = new TestItem('Item 5', 2500, 2500, 20, 500);
$item1 = new TestItem('Item 1', 2500, 2500, 20, 500, true);
$item2 = new TestItem('Item 2', 550, 550, 2, 500, true);
$item3 = new TestItem('Item 3', 2500, 2500, 20, 500, true);
$item4 = new TestItem('Item 4', 2500, 2500, 20, 500, true);
$item5 = new TestItem('Item 5', 2500, 2500, 20, 500, true);

$packer = new Packer();
$packer->addBox($box1);
Expand Down Expand Up @@ -104,11 +104,11 @@ public function testPackFiveItemsTwoLargeOneSmallBoxButThreeAfterRepack()
$box1 = new TestBox('Le petite box', 600, 600, 10, 10, 596, 596, 8, 1000);
$box2 = new TestBox('Le grande box', 3000, 3000, 50, 100, 2960, 2960, 40, 10000);

$item1 = new TestItem('Item 1', 2500, 2500, 20, 2000);
$item2 = new TestItem('Item 2', 550, 550, 2, 200);
$item3 = new TestItem('Item 3', 2500, 2500, 20, 2000);
$item4 = new TestItem('Item 4', 2500, 2500, 20, 2000);
$item5 = new TestItem('Item 5', 2500, 2500, 20, 2000);
$item1 = new TestItem('Item 1', 2500, 2500, 20, 2000, true);
$item2 = new TestItem('Item 2', 550, 550, 2, 200, true);
$item3 = new TestItem('Item 3', 2500, 2500, 20, 2000, true);
$item4 = new TestItem('Item 4', 2500, 2500, 20, 2000, true);
$item5 = new TestItem('Item 5', 2500, 2500, 20, 2000, true);

$packer = new Packer();
$packer->addBox($box1);
Expand Down Expand Up @@ -148,9 +148,9 @@ public function testPackThreeItemsOneDoesntFitInAnyBox()
$box1 = new TestBox('Le petite box', 300, 300, 10, 10, 296, 296, 8, 1000);
$box2 = new TestBox('Le grande box', 3000, 3000, 100, 100, 2960, 2960, 80, 10000);

$item1 = new TestItem('Item 1', 2500, 2500, 20, 2000);
$item2 = new TestItem('Item 2', 25000, 2500, 20, 2000);
$item3 = new TestItem('Item 3', 2500, 2500, 20, 2000);
$item1 = new TestItem('Item 1', 2500, 2500, 20, 2000, true);
$item2 = new TestItem('Item 2', 25000, 2500, 20, 2000, true);
$item3 = new TestItem('Item 3', 2500, 2500, 20, 2000, true);

$packer = new Packer();
$packer->addBox($box1);
Expand All @@ -167,9 +167,9 @@ public function testPackThreeItemsOneDoesntFitInAnyBox()
public function testPackWithoutBox()
{

$item1 = new TestItem('Item 1', 2500, 2500, 20, 2000);
$item2 = new TestItem('Item 2', 25000, 2500, 20, 2000);
$item3 = new TestItem('Item 3', 2500, 2500, 20, 2000);
$item1 = new TestItem('Item 1', 2500, 2500, 20, 2000, true);
$item2 = new TestItem('Item 2', 25000, 2500, 20, 2000, true);
$item3 = new TestItem('Item 3', 2500, 2500, 20, 2000, true);

$packer = new Packer();
$packer->addItem($item1);
Expand All @@ -184,8 +184,8 @@ public function testIssue1()
$packer = new Packer();
$packer->addBox(new TestBox('Le petite box', 292, 336, 60, 10, 292, 336, 60, 9000));
$packer->addBox(new TestBox('Le grande box', 421, 548, 335, 100, 421, 548, 335, 10000));
$packer->addItem(new TestItem('Item 1', 226, 200, 40, 440));
$packer->addItem(new TestItem('Item 2', 200, 200, 155, 1660));
$packer->addItem(new TestItem('Item 1', 226, 200, 40, 440, true));
$packer->addItem(new TestItem('Item 2', 200, 200, 155, 1660, true));
$packedBoxes = $packer->pack();

self::assertEquals(1, $packedBoxes->count());
Expand All @@ -197,7 +197,7 @@ public function testIssue3()
$packer = new Packer();
$packer->addBox(new TestBox('OW Box 1', 51, 33, 33, 0.6, 51, 33, 33, 0.6));
$packer->addBox(new TestBox('OW Box 2', 50, 40, 40, 0.95, 50, 40, 40, 0.95));
$packer->addItem(new TestItem('Product', 28, 19, 9, 0), 6);
$packer->addItem(new TestItem('Product', 28, 19, 9, 0, true), 6);
$packedBoxes = $packer->pack();

self::assertEquals(1, $packedBoxes->count());
Expand All @@ -209,9 +209,9 @@ public function testIssue6()
$packer = new Packer();
$packer->addBox(new TestBox('Package 22', 675, 360, 210, 2, 670, 355, 204, 1000));
$packer->addBox(new TestBox('Package 2', 330, 130, 102, 2, 335, 135, 107, 1000));
$packer->addItem(new TestItem('Item 3', 355.6, 335.28, 127, 1.5));
$packer->addItem(new TestItem('Item 7', 330.2, 127, 101.6, 1));
$packer->addItem(new TestItem('Item 7', 330.2, 127, 101.6, 1));
$packer->addItem(new TestItem('Item 3', 355.6, 335.28, 127, 1.5, true));
$packer->addItem(new TestItem('Item 7', 330.2, 127, 101.6, 1, true));
$packer->addItem(new TestItem('Item 7', 330.2, 127, 101.6, 1, true));
$packedBoxes = $packer->pack();

self::assertEquals(1, $packedBoxes->count());
Expand All @@ -223,7 +223,7 @@ public function testIssue9()
$packer = new Packer();
$packer->addBox(new TestBox('24x24x24Box', 24, 24, 24, 24, 24, 24, 24, 100));

$packer->addItem(new TestItem('6x6x6Item', 6, 6, 6, 1), 64);
$packer->addItem(new TestItem('6x6x6Item', 6, 6, 6, 1, true), 64);
$packedBoxes = $packer->pack();

self::assertEquals(1, $packedBoxes->count());
Expand All @@ -234,8 +234,8 @@ public function testIssue11()
$packer = new Packer();
$packer->addBox(new TestBox('4x4x4Box', 4, 4, 4, 4, 4, 4, 4, 100));

$packer->addItem(new TestItem('BigItem', 2, 2, 4, 1), 2);
$packer->addItem(new TestItem('SmallItem', 1, 1, 1, 1), 32);
$packer->addItem(new TestItem('BigItem', 2, 2, 4, 1, true), 2);
$packer->addItem(new TestItem('SmallItem', 1, 1, 1, 1, true), 32);
$packedBoxes = $packer->pack();

self::assertEquals(1, $packedBoxes->count());
Expand All @@ -246,9 +246,9 @@ public function testIssue13()
$packer = new Packer();
$packer->addBox(new TestBox('Le petite box', 12, 12, 12, 10, 10, 10, 10, 1000));

$packer->addItem(new TestItem('Item 1', 5, 3, 2, 2));
$packer->addItem(new TestItem('Item 2', 5, 3, 2, 2));
$packer->addItem(new TestItem('Item 3', 3, 3, 3, 3));
$packer->addItem(new TestItem('Item 1', 5, 3, 2, 2, true));
$packer->addItem(new TestItem('Item 2', 5, 3, 2, 2, true));
$packer->addItem(new TestItem('Item 3', 3, 3, 3, 3, true));
$packedBoxes = $packer->pack();

self::assertEquals(1, $packedBoxes->count());
Expand All @@ -258,10 +258,10 @@ public function testIssue14()
{
$packer = new Packer();
$packer->addBox(new TestBox('29x1x23Box', 29, 1, 23, 0, 29, 1, 23, 100));
$packer->addItem(new TestItem('13x1x10Item', 13, 1, 10, 1));
$packer->addItem(new TestItem('9x1x6Item', 9, 1, 6, 1));
$packer->addItem(new TestItem('9x1x6Item', 9, 1, 6, 1));
$packer->addItem(new TestItem('9x1x6Item', 9, 1, 6, 1));
$packer->addItem(new TestItem('13x1x10Item', 13, 1, 10, 1, true));
$packer->addItem(new TestItem('9x1x6Item', 9, 1, 6, 1, true));
$packer->addItem(new TestItem('9x1x6Item', 9, 1, 6, 1, true));
$packer->addItem(new TestItem('9x1x6Item', 9, 1, 6, 1, true));
$packedBoxes = $packer->pack();

self::assertEquals(1, $packedBoxes->count());
Expand All @@ -270,7 +270,7 @@ public function testIssue14()
public function testPackerPacksRotatedBoxesInNewRow()
{
$packer = new Packer();
$packer->addItem(new TestItem('30x10x30item', 30, 10, 30, 0), 9);
$packer->addItem(new TestItem('30x10x30item', 30, 10, 30, 0, true), 9);

//Box can hold 7 items in a row and then is completely full, so 9 items won't fit
$packer->addBox(new TestBox('30x70x30InternalBox', 30, 70, 30, 0, 30, 70, 30, 0, 1000));
Expand All @@ -288,14 +288,14 @@ public function testPackerPacksRotatedBoxesInNewRow()
// ++++++++
//
$packer = new Packer();
$packer->addItem(new TestItem('30x10x30item', 30, 10, 30, 0), 9);
$packer->addItem(new TestItem('30x10x30item', 30, 10, 30, 0, true), 9);
$packer->addBox(new TestBox('40x70x30InternalBox', 40, 70, 30, 0, 40, 70, 30, 0, 1000));
$packedBoxes = $packer->pack();
self::assertEquals(1, $packedBoxes->count());

// Make sure that it doesn't try to fit in a 10th item
$packer = new Packer();
$packer->addItem(new TestItem('30x10x30item', 30, 10, 30, 0), 10);
$packer->addItem(new TestItem('30x10x30item', 30, 10, 30, 0, true), 10);
$packer->addBox(new TestBox('40x70x30InternalBox', 40, 70, 30, 0, 40, 70, 30, 0, 1000));
$packedBoxes = $packer->pack();
self::assertEquals(2, $packedBoxes->count());
Expand All @@ -322,7 +322,7 @@ public function testCanPackRepresentativeLargerSamples(
}
foreach ($items as $item) {
$packer->addItem(new TestItem($item['name'], $item['width'], $item['length'], $item['depth'],
$item['weight']), $item['qty']);
$item['weight'], true), $item['qty']);
$expectedItemCount += $item['qty'];
}
$packedBoxes = $packer->pack();
Expand Down
46 changes: 23 additions & 23 deletions tests/VolumePackerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ public function testPackBoxThreeItemsFitEasily()
$box = new TestBox('Le box', 300, 300, 10, 10, 296, 296, 8, 1000);

$items = new ItemList;
$items->insert(new TestItem('Item 1', 250, 250, 2, 200));
$items->insert(new TestItem('Item 2', 250, 250, 2, 200));
$items->insert(new TestItem('Item 3', 250, 250, 2, 200));
$items->insert(new TestItem('Item 1', 250, 250, 2, 200, false));
$items->insert(new TestItem('Item 2', 250, 250, 2, 200, false));
$items->insert(new TestItem('Item 3', 250, 250, 2, 200, false));

$packer = new VolumePacker($box, $items);
$packedBox = $packer->pack();
Expand All @@ -31,9 +31,9 @@ public function testPackBoxThreeItemsFitExactly()
$box = new TestBox('Le box', 300, 300, 10, 10, 296, 296, 8, 1000);

$items = new ItemList;
$items->insert(new TestItem('Item 1', 296, 296, 2, 200));
$items->insert(new TestItem('Item 2', 296, 296, 2, 500));
$items->insert(new TestItem('Item 3', 296, 296, 4, 290));
$items->insert(new TestItem('Item 1', 296, 296, 2, 200, false));
$items->insert(new TestItem('Item 2', 296, 296, 2, 500, false));
$items->insert(new TestItem('Item 3', 296, 296, 4, 290, false));

$packer = new VolumePacker($box, $items);
$packedBox = $packer->pack();
Expand All @@ -47,8 +47,8 @@ public function testPackBoxThreeItemsFitExactlyNoRotation()
$box = new TestBox('Le box', 300, 300, 10, 10, 296, 296, 8, 1000);

$items = new ItemList;
$items->insert(new TestItem('Item 1', 296, 148, 2, 200));
$items->insert(new TestItem('Item 2', 296, 148, 2, 500));
$items->insert(new TestItem('Item 1', 296, 148, 2, 200, false));
$items->insert(new TestItem('Item 2', 296, 148, 2, 500, false));

$packer = new VolumePacker($box, $items);
$packedBox = $packer->pack();
Expand All @@ -62,9 +62,9 @@ public function testPackBoxThreeItemsFitSizeButOverweight()
$box = new TestBox('Le box', 300, 300, 10, 10, 296, 296, 8, 1000);

$items = new ItemList;
$items->insert(new TestItem('Item 1', 250, 250, 2, 400));
$items->insert(new TestItem('Item 2', 250, 250, 2, 500));
$items->insert(new TestItem('Item 3', 250, 250, 2, 200));
$items->insert(new TestItem('Item 1', 250, 250, 2, 400, false));
$items->insert(new TestItem('Item 2', 250, 250, 2, 500, false));
$items->insert(new TestItem('Item 3', 250, 250, 2, 200, false));

$packer = new VolumePacker($box, $items);
$packedBox = $packer->pack();
Expand All @@ -78,9 +78,9 @@ public function testPackBoxThreeItemsFitWeightBut2Oversize()
$box = new TestBox('Le box', 300, 300, 10, 10, 296, 296, 8, 1000);

$items = new ItemList;
$items->insert(new TestItem('Item 1', 297, 296, 2, 200));
$items->insert(new TestItem('Item 2', 297, 296, 2, 500));
$items->insert(new TestItem('Item 3', 296, 296, 4, 290));
$items->insert(new TestItem('Item 1', 297, 296, 2, 200, false));
$items->insert(new TestItem('Item 2', 297, 296, 2, 500, false));
$items->insert(new TestItem('Item 3', 296, 296, 4, 290, false));

$packer = new VolumePacker($box, $items);
$packedBox = $packer->pack();
Expand All @@ -94,8 +94,8 @@ public function testPackTwoItemsFitExactlySideBySide()
$box = new TestBox('Le box', 300, 400, 10, 10, 296, 496, 8, 1000);

$items = new ItemList;
$items->insert(new TestItem('Item 1', 296, 248, 8, 200));
$items->insert(new TestItem('Item 2', 248, 296, 8, 200));
$items->insert(new TestItem('Item 1', 296, 248, 8, 200, false));
$items->insert(new TestItem('Item 2', 248, 296, 8, 200, false));

$packer = new VolumePacker($box, $items);
$packedBox = $packer->pack();
Expand All @@ -109,9 +109,9 @@ public function testPackThreeItemsBottom2FitSideBySideOneExactlyOnTop()
$box = new TestBox('Le box', 300, 300, 10, 10, 296, 296, 8, 1000);

$items = new ItemList;
$items->insert(new TestItem('Item 1', 248, 148, 4, 200));
$items->insert(new TestItem('Item 2', 148, 248, 4, 200));
$items->insert(new TestItem('Item 3', 296, 296, 4, 200));
$items->insert(new TestItem('Item 1', 248, 148, 4, 200, false));
$items->insert(new TestItem('Item 2', 148, 248, 4, 200, false));
$items->insert(new TestItem('Item 3', 296, 296, 4, 200, false));

$packer = new VolumePacker($box, $items);
$packedBox = $packer->pack();
Expand All @@ -125,9 +125,9 @@ public function testPackThreeItemsBottom2FitSideBySideWithSpareSpaceOneOverhangS
$box = new TestBox('Le box', 250, 250, 10, 10, 248, 248, 8, 1000);

$items = new ItemList;
$items->insert(new TestItem('Item 1', 200, 200, 4, 200));
$items->insert(new TestItem('Item 2', 110, 110, 4, 200));
$items->insert(new TestItem('Item 3', 110, 110, 4, 200));
$items->insert(new TestItem('Item 1', 200, 200, 4, 200, false));
$items->insert(new TestItem('Item 2', 110, 110, 4, 200, false));
$items->insert(new TestItem('Item 3', 110, 110, 4, 200, false));

$packer = new VolumePacker($box, $items);
$packedBox = $packer->pack();
Expand All @@ -141,7 +141,7 @@ public function testPackSingleItemFitsBetterRotated()
$box = new TestBox('Le box', 400, 300, 10, 10, 396, 296, 8, 1000);

$items = new ItemList;
$items->insert(new TestItem('Item 1', 250, 290, 2, 200));
$items->insert(new TestItem('Item 1', 250, 290, 2, 200, false));

$packer = new VolumePacker($box, $items);
$packedBox = $packer->pack();
Expand Down
10 changes: 5 additions & 5 deletions tests/WeightRedistributorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ public function testWeightRedistribution()
$boxList = new BoxList();
$boxList->insert($box);

$item1 = new TestItem('Item #1', 230, 330, 6, 320);
$item2 = new TestItem('Item #2', 210, 297, 5, 187);
$item3 = new TestItem('Item #3', 210, 297, 11, 674);
$item4 = new TestItem('Item #4', 210, 297, 3, 82);
$item5 = new TestItem('Item #5', 206, 295, 4, 217);
$item1 = new TestItem('Item #1', 230, 330, 6, 320, true);
$item2 = new TestItem('Item #2', 210, 297, 5, 187, true);
$item3 = new TestItem('Item #3', 210, 297, 11, 674, true);
$item4 = new TestItem('Item #4', 210, 297, 3, 82, true);
$item5 = new TestItem('Item #5', 206, 295, 4, 217, true);

$box1Items = new ItemList();
$box1Items->insert(clone $item1);
Expand Down
Loading

0 comments on commit b63d39f

Please sign in to comment.