def find_bin( self, package ): #Returns current foreign or non-foreign bin based on package and current values of globals. print('Find the correct bin for package {0}'.format(package)) if (package.length > self.bins[0].length or package.width > self.bins[0].width): raise InvalidArgError('Package will never fit in any bin') if self.foreign == False: if len(self.bins) > self.current_bin: return self.bins[self.current_bin] else: self.bins.append( Bin(self.bins[0].width, self.bins[0].length, self.bins[0].max_layers, False)) self.bins[self.current_bin].bin_id = self.next_bin_id self.next_bin_id = self.next_bin_id + 1 return self.bins[self.current_bin] else: if len(self.bins_foreign) > self.current_bin_foreign: return self.bins_foreign[self.current_bin_foreign] else: self.bins_foreign.append( Bin(self.bins_foreign[0].width, self.bins_foreign[0].length, self.bins_foreign[0].max_layers, True)) self.bins_foreign[ self.current_bin_foreign].bin_id = self.next_bin_id self.next_bin_id = self.next_bin_id + 1 return self.bins_foreign[self.current_bin_foreign]
def test_new_layer_should_change_current_layer_and_append( self ): #Always remember to name your function with a leading 'test_' bin1 = Bin(4, 4, 2) old_current_layer = bin1.current_layer self.assertEqual(len(bin1.layers), 1) bin1.new_layer() self.assertEqual(len(bin1.layers), 2) self.assertNotEqual(old_current_layer, bin1.current_layer)
def test_handle_throws_exception_invalid_colour(self): bin1 = Bin(5, 5, 1) pa = PackingAdvisor(bin1) p1 = Package(width=2, length=2, colour=7) with self.assertRaises(InvalidArgError): pa.handle(p1)
def test_handle_find_bin_for_new_bins(self): bin1 = Bin(width=4, length=4, max_layers=1) p1 = Package(width=4, length=4, height=1, colour=2) p2 = Package(width=4, length=4, height=1, colour=1) p3 = Package(width=4, length=4, height=1, colour=0) p4 = Package(width=4, length=4, height=1, colour=3) pa = PackingAdvisor(bin1) self.assertEqual(len(pa.bins), 1) self.assertEqual(len(pa.bins_foreign), 1) pa.handle(p1) self.assertEqual(len(pa.bins), 1) self.assertEqual(len(pa.bins_foreign), 1) self.assertEqual(pa.find_bin_containing_package(p1), pa.bins_foreign[0]) pa.handle(p2) self.assertEqual(len(pa.bins), 1) self.assertEqual(len(pa.bins_foreign), 2) self.assertEqual(pa.find_bin_containing_package(p2), pa.bins_foreign[1]) pa.handle(p3) self.assertEqual(len(pa.bins), 1) self.assertEqual(len(pa.bins_foreign), 2) self.assertEqual(pa.find_bin_containing_package(p3), pa.bins[0]) pa.handle(p4) self.assertEqual(len(pa.bins), 2) self.assertEqual(len(pa.bins_foreign), 2) self.assertEqual(pa.find_bin_containing_package(p4), pa.bins[1])
def test_handle_package_larger_than_layer(self): bin1 = Bin(width=5, length=10, max_layers=1) p1 = Package(width=6, length=2) p2 = Package(width=2, length=11) pa = PackingAdvisor(bin1) with self.assertRaises(InvalidArgError): pa.handle(p1) with self.assertRaises(InvalidArgError): pa.handle(p2)
def __init__(self, bin): #Initialise internal bin-lists NOTE: two lists of bins - one foreign and one non-foreign bin.bin_id = 1 bin.foreign = False self.bins = [bin] bin2 = Bin(bin.width, bin.length, bin.max_layers) bin2.bin_id = 2 bin2.foreign = True self.bins_foreign = [bin2] # Internal global variables. Strict rules for which methods may assign to these self.x = 0 self.y = 0 self.package_fits = False self.current_bin = 0 self.current_bin_foreign = 0 self.next_bin_id = 3 # Package metadata self.fragile = False #Currently obsolete self.foreign = False self.COLUMN_LENGTH = 2
def test_handle(self): bin1 = Bin(width=8, length=8, max_layers=1) p1 = Package(width=4, length=2) p2 = Package(width=4, length=2) p3 = Package(width=2, length=2) pa = PackingAdvisor(bin1) pa.handle(p1) pa.handle(p2) pa.handle(p3) self.assertEqual(bin1.current_layer.packages[0].position.x, 0) self.assertEqual(bin1.current_layer.packages[0].position.y, 0) self.assertEqual(bin1.current_layer.packages[1].position.x, 0) self.assertEqual(bin1.current_layer.packages[1].position.y, 4) self.assertEqual(bin1.current_layer.packages[2].position.x, 2) self.assertEqual(bin1.current_layer.packages[2].position.y, 0)
def test_airspace_true(self): #Returns true when airspace is empty #Arrange bin1 = Bin(4, 4, 2) pa = PackingAdvisor(bin1) p1 = Package(4, 2) p2 = Package(2, 2) p3 = Package(4, 2) p4 = Package(2, 2) #Act pa.handle(p1) pa.handle(p2) pa.handle(p3) #Assert pa.x = 2 #Is set manually to de-couple the test of airspace from find_x_y_lower_layer pa.y = 2 self.assertTrue(pa.check_airspace(bin1, p4))
def test_airspace_false(self): #Returns false when airspace is not empty #Arrange bin1 = Bin(4, 4, 2) pa = PackingAdvisor(bin1) p1 = Package(3, 2) p2 = Package(4, 2) p3 = Package(4, 2) p4 = Package(1, 2) #Act pa.handle(p1) pa.handle(p2) pa.handle(p3) #Assert pa.x = 0 pa.y = 3 self.assertFalse(pa.check_airspace(bin1, p4))
def test_gravity_capable_of_opening_new_layers(self): bin1 = Bin(4, 4, 4) p1 = Package(4, 2) p2 = Package(4, 2) p3 = Package(4, 2) p4 = Package(width=4, length=2, colour=3) p5 = Package(4, 2) p6 = Package(4, 2) pa = PackingAdvisor(bin1) pa.handle(p1) pa.handle(p2) pa.handle(p3) pa.handle(p4) pa.handle(p5) pa.handle(p6) self.assertEqual(pa.bins[0].current_layer.find_layer_number(), 4)
def test_gravity_check(self): bin1 = Bin(4, 4, 3) pa = PackingAdvisor(bin1) p1 = Package(2, 2) p2 = Package(4, 2) p3 = Package(4, 2) p4 = Package(4, 2) pa.handle(p1) pa.handle(p2) pa.bins[0].new_layer() pa.x = 0 pa.y = 0 self.assertFalse(pa.calc_gravity(pa.bins[0].current_layer, p3) > 0.75) pa.handle(p3) pa.bins[0].new_layer() pa.x = 2 pa.y = 0 self.assertTrue(pa.calc_gravity(pa.bins[0].current_layer, p4) > 0.75)
def test_handle_advanced(self): #The code in this case is the main.py() at the time of every feature working first time (31/10 2016) bin1 = Bin(width=5, length=10, max_layers=3) p1 = Package(width=3, length=2) p2 = Package(width=2, length=2) p3 = Package(width=4, length=2) p4 = Package(width=3, length=2) p5 = Package(width=4, length=2, colour=3) p6 = Package(width=2, length=2) p7 = Package(width=2, length=2) p8 = Package(width=4, length=2) p9 = Package(width=4, length=2) p10 = Package(width=2, length=2, colour=3) p11 = Package(width=4, length=2) p12 = Package(width=4, length=2) p13 = Package(width=2, length=2) p14 = Package(width=4, length=2) p15 = Package(width=3, length=2, colour=2) p16 = Package(width=4, length=2, colour=2) p17 = Package(width=2, length=2, colour=2) pa = PackingAdvisor(bin1) pa.handle(p1) pa.handle(p2) pa.handle(p3) pa.handle(p4) pa.handle(p5) pa.handle(p6) pa.handle(p7) pa.handle(p8) pa.handle(p9) pa.handle(p10) pa.handle(p11) pa.handle(p12) pa.handle(p13) pa.handle(p14) pa.handle(p15) pa.handle(p16) pa.handle(p17) self.assertEqual(p1.position.x, 0) self.assertEqual(p1.position.y, 0) self.assertEqual(p1.position.layer.find_layer_number(), 1) self.assertEqual(p2.position.x, 0) self.assertEqual(p2.position.y, 3) self.assertEqual(p2.position.layer.find_layer_number(), 1) self.assertEqual(p3.position.x, 2) self.assertEqual(p3.position.y, 0) self.assertEqual(p3.position.layer.find_layer_number(), 1) self.assertEqual(p4.position.x, 4) self.assertEqual(p4.position.y, 0) self.assertEqual(p4.position.layer.find_layer_number(), 1) self.assertEqual(p5.position.x, 6) self.assertEqual(p5.position.y, 0) self.assertEqual(p5.position.layer.find_layer_number(), 1) self.assertEqual(p6.position.x, 4) self.assertEqual(p6.position.y, 3) self.assertEqual(p6.position.layer.find_layer_number(), 1) self.assertEqual(p7.position.x, 8) self.assertEqual(p7.position.y, 0) self.assertEqual(p7.position.layer.find_layer_number(), 1) self.assertEqual(p8.position.x, 0) self.assertEqual(p8.position.y, 0) self.assertEqual(p8.position.layer.find_layer_number(), 2) self.assertEqual(p9.position.x, 2) self.assertEqual(p9.position.y, 0) self.assertEqual(p9.position.layer.find_layer_number(), 2) self.assertEqual(p10.position.x, 8) self.assertEqual(p10.position.y, 2) self.assertEqual(p10.position.layer.find_layer_number(), 1) self.assertEqual(p11.position.x, 4) self.assertEqual(p11.position.y, 0) self.assertEqual(p11.position.layer.find_layer_number(), 2) self.assertEqual(p12.position.x, 8) self.assertEqual(p12.position.y, 0) self.assertEqual(p12.position.layer.find_layer_number(), 2) self.assertEqual(p13.position.x, 0) self.assertEqual(p13.position.y, 0) self.assertEqual(p13.position.layer.find_layer_number(), 3) self.assertEqual(p14.position.x, 2) self.assertEqual(p14.position.y, 0) self.assertEqual(p14.position.layer.find_layer_number(), 3) #Last three packages are in foreign destination bin self.assertEqual(p15.position.x, 0) self.assertEqual(p15.position.y, 0) self.assertEqual(p15.position.layer.find_layer_number(), 1) self.assertEqual(p16.position.x, 2) self.assertEqual(p16.position.y, 0) self.assertEqual(p16.position.layer.find_layer_number(), 1) self.assertEqual(p17.position.x, 0) self.assertEqual(p17.position.y, 3) self.assertEqual(p17.position.layer.find_layer_number(), 1) #Lastly the bin_id's are checked self.assertEqual(pa.find_bin_containing_package(p8).bin_id, 1) self.assertEqual(pa.find_bin_containing_package(p15).bin_id, 2)
def test_new_layer_should_fail_if_no_more(self): bin2 = Bin(4, 4, 1) self.assertFalse(bin2.new_layer())