Completed
Push — 2.x-dev ( 5f5b4d...48a1b4 )
by Doug
61:10 queued 51:42
created

VolumePackerTest   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 198
Duplicated Lines 79.8 %

Coupling/Cohesion

Components 1
Dependencies 9

Importance

Changes 4
Bugs 0 Features 0
Metric Value
dl 158
loc 198
c 4
b 0
f 0
wmc 14
lcom 1
cbo 9
rs 10

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php
2
/**
3
 * Box packing (3D bin packing, knapsack problem).
4
 *
5
 * @author Doug Wright
6
 */
7
8
namespace DVDoug\BoxPacker;
9
10
use DVDoug\BoxPacker\Test\TestBox;
11
use DVDoug\BoxPacker\Test\TestConstrainedTestItem;
12
use DVDoug\BoxPacker\Test\TestItem;
13
use PHPUnit\Framework\TestCase;
14
15
/**
16
 * @covers \DVDoug\BoxPacker\VolumePacker
17
 */
18
class VolumePackerTest extends TestCase
19
{
20
    /**
21
     * From issue #79.
22
     */
23
    public function testUsedDimensionsCalculatedCorrectly()
24
    {
25
        $box = new TestBox('Bundle', 75, 15, 15, 0, 75, 15, 15, 30);
26
        $itemList = new ItemList();
27
        $itemList->insert(new TestItem('Item 1', 14, 12, 2, 2, true));
28
        $itemList->insert(new TestItem('Item 2', 14, 12, 2, 2, true));
29
        $itemList->insert(new TestItem('Item 3', 14, 12, 2, 2, true));
30
        $itemList->insert(new TestItem('Item 4', 14, 12, 2, 2, true));
31
        $itemList->insert(new TestItem('Item 5', 14, 12, 2, 2, true));
32
33
        $packer = new VolumePacker($box, $itemList);
34
        $packedBox = $packer->pack();
35
36
        self::assertEquals(60, $packedBox->getUsedWidth());
37
        self::assertEquals(14, $packedBox->getUsedLength());
38
        self::assertEquals(2, $packedBox->getUsedDepth());
39
    }
40
41
    /**
42
     * From issue #86.
43
     */
44
    public function testUsedWidthAndRemainingWidthHandleRotationsCorrectly()
45
    {
46
        $packer = new Packer();
47
        $packer->addBox(new TestBox('Box', 23, 27, 14, 0, 23, 27, 14, 30));
48
        $packer->addItem(new TestItem('Item 1', 11, 22, 2, 1, true), 3);
49
        $packer->addItem(new TestItem('Item 2', 11, 22, 2, 1, true), 4);
50
        $packer->addItem(new TestItem('Item 3', 6, 17, 2, 1, true), 3);
51
        $packedBoxes = $packer->pack();
52
53
        self::assertEquals(1, $packedBoxes->count());
54
55
        /** @var PackedBox $packedBox */
56
        $packedBox = $packedBoxes->top();
57
        self::assertEquals(22, $packedBox->getUsedWidth());
58
        self::assertEquals(23, $packedBox->getUsedLength());
59
        self::assertEquals(10, $packedBox->getUsedDepth());
60
        self::assertEquals(1, $packedBox->getRemainingWidth());
61
        self::assertEquals(4, $packedBox->getRemainingLength());
62
        self::assertEquals(4, $packedBox->getRemainingDepth());
63
    }
64
65
    /**
66
     * Test that constraint handling works correctly.
67
     */
68
    public function testConstraints()
69
    {
70
        // first a regular item
71
        $packer = new Packer();
72
        $packer->addBox(new TestBox('Box', 10, 10, 10, 0, 10, 10, 10, 0));
73
        $packer->addItem(new TestItem('Item', 1, 1, 1, 0, false), 8);
74
        $packedBoxes = $packer->pack();
75
76
        self::assertEquals(1, $packedBoxes->count());
77
78
        // same dimensions but now constrained by type
79
        TestConstrainedTestItem::$limit = 2;
80
81
        $packer = new Packer();
82
        $packer->addBox(new TestBox('Box', 10, 10, 10, 0, 10, 10, 10, 0));
83
        $packer->addItem(new TestConstrainedTestItem('Item', 1, 1, 1, 0, false), 8);
84
        $packedBoxes = $packer->pack();
85
86
        self::assertEquals(4, $packedBoxes->count());
87
    }
88
89
    /**
90
     * Test an infinite loop doesn't come back.
91
     */
92
    public function testIssue14()
93
    {
94
        $packer = new Packer();
95
        $packer->addBox(new TestBox('29x1x23Box', 29, 1, 23, 0, 29, 1, 23, 100));
96
        $packer->addItem(new TestItem('13x1x10Item', 13, 1, 10, 1, true));
97
        $packer->addItem(new TestItem('9x1x6Item', 9, 1, 6, 1, true));
98
        $packer->addItem(new TestItem('9x1x6Item', 9, 1, 6, 1, true));
99
        $packer->addItem(new TestItem('9x1x6Item', 9, 1, 6, 1, true));
100
        $packedBoxes = $packer->pack();
101
102
        self::assertEquals(1, $packedBoxes->count());
103
    }
104
105
    /**
106
     * Test identical items keep their orientation (with box length > width).
107
     */
108
    public function testIssue47A()
109
    {
110
        $box = new TestBox('165x225x25Box', 165, 225, 25, 0, 165, 225, 25, 100);
111
        $item = new TestItem('20x69x20Item', 20, 69, 20, 0, true);
112
        $itemList = new ItemList();
113
        for ($i = 0; $i < 23; $i++) {
114
            $itemList->insert($item);
115
        }
116
117
        $packer = new VolumePacker($box, $itemList);
118
        $packedBox = $packer->pack();
119
120
        self::assertEquals(23, count($packedBox->getItems()));
121
    }
122
123
    /**
124
     * Test identical items keep their orientation (with box length < width).
125
     */
126
    public function testIssue47B()
127
    {
128
        $box = new TestBox('165x225x25Box', 165, 225, 25, 0, 165, 225, 25, 100);
129
        $item = new TestItem('20x69x20Item', 69, 20, 20, 0, true);
130
        $itemList = new ItemList();
131
        for ($i = 0; $i < 23; $i++) {
132
            $itemList->insert($item);
133
        }
134
135
        $packer = new VolumePacker($box, $itemList);
136
        $packedBox = $packer->pack();
137
138
        self::assertEquals(23, count($packedBox->getItems()));
139
    }
140
141
    /**
142
     * Test that identical orientation doesn't survive change of row
143
     * (7 side by side, then 2 side by side rotated).
144
     */
145
    public function testAllowsRotatedBoxesInNewRow()
146
    {
147
        $box = new TestBox('40x70x30InternalBox', 40, 70, 30, 0, 40, 70, 30, 1000);
148
        $item = new TestItem('30x10x30item', 30, 10, 30, 0, true);
149
        $itemList = new ItemList();
150
        for ($i = 0; $i < 9; $i++) {
151
            $itemList->insert($item);
152
        }
153
154
        $packer = new VolumePacker($box, $itemList);
155
        $packedBox = $packer->pack();
156
157
        self::assertEquals(9, count($packedBox->getItems()));
158
    }
159
}
160