class TestCart(TestCase):
    def setUp(self) -> None:
        self.blackCat = 'black cat'
        self.hsinchu = 'hsinchu'
        self.postOffice = 'post office'
        self.cart = Cart()

    def test_black_cat_with_light_weight(self):
        shipping_fee = self.shipping_fee(self.blackCat, 30, 20, 10, 5)
        self.feeShouldBe(150, shipping_fee)

    def test_black_cat_with_heavy_weight(self):
        shipping_fee = self.shipping_fee(self.blackCat, 30, 20, 10, 50)
        self.feeShouldBe(500, shipping_fee)

    def test_hsinchu_with_small_size(self):
        shipping_fee = self.shipping_fee(self.hsinchu, 30, 20, 10, 50)
        self.feeShouldBe(144, shipping_fee)

    def test_hsinchu_with_huge_size(self):
        shipping_fee = self.shipping_fee(self.hsinchu, 100, 20, 10, 50)
        self.feeShouldBe(480, shipping_fee)

    def test_post_office_by_weight(self):
        shipping_fee = self.shipping_fee(self.postOffice, 100, 20, 10, 3)
        self.feeShouldBe(110, shipping_fee)

    def test_post_office_by_size(self):
        shipping_fee = self.shipping_fee(self.postOffice, 100, 20, 10, 300)
        self.feeShouldBe(440, shipping_fee)

    def shipping_fee(self, shipper, length, width, height, weight):
        shipping_fee = self.cart.shipping_fee(shipper, length, width, height,
                                              weight)
        return shipping_fee

    def feeShouldBe(self, expected, actual_fee):
        self.assertEqual(expected, actual_fee)