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_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_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 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_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_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_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_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)