class ShoppingCart(object): def __init__(self): self.items = [] def add(self, item, price): for cart_item in self.items: # Since we found the item, we increment # instead of append if cart_item.item == item: cart_item.q += 1 return self # If we didn't find, then we append self.items.append(Item(item, price)) return self def item(self, index): return self.items[index - 1].item def price(self, index): return self.items[index - 1].price * self.items[index - 1].q def total(self, sales_tax): sum_price = sum([item.price * item.q for item in self.items]) return sum_price * (1.0 + sales_tax / 100.0) def __len__(self): return sum([item.q for item in self.items]) class Item(object): def __init__(self, item, price, q=1): self.item = item self.price = price self.q = q import unittest #from cart import * class ShoppingCartTest(unittest.TestCase): def setUp(self): self.cart = ShoppingCart().add("tuna sandwich", 15.00) \ .add("tuna sandwich", 15.00) def test_length(self): self.assertEquals(2, len(self.cart)) def test_item(self): self.assertEquals("tuna sandwich", self.cart.item(1)) def test_price(self): self.assertEquals(30.00, self.cart.price(1)) def test_total_with_sales_tax(self): self.assertAlmostEquals(32.78, self.cart.total(9.25), 2) def test_total_should_fail(self): self.assertNotEqual(13.00, self.cart.total(10), 2) def test_should_have_index_error(self): self.assertRaises(IndexError, self.cart.item, 5) if __name__ == "__main__": unittest.main()