Welcome to your fifth and final unit for this course, dedicated to practicing Test-Driven Development (TDD) utilizing Swift and XCTest. We're going to finish building our ShoppingCart
system by adding even more features to our class.
In this course, emphasis is placed on hands-on practice, where you'll receive requirements through tests, one at a time. Your task is to write tests AND implement code that makes each test pass, simulating a real-world TDD environment. Previously, I wrote the tests for you; this time, it's all up to you!
Remember to use the core concepts of the Red-Green-Refactor cycle while completing these coding exercises. I'm still here to help! Just ask.
- Description: The cart should enforce a maximum quantity limit of 10 for a single type of product, preventing more than the allowed amount from being added.
- Details
- Utilize the
addItem(item: Product, quantity: Int)
method to add products to the cart. - Ensure an exception is raised when adding a quantity that exceeds a limit of
10
for a single product. - The exception message should clearly state, "Maximum quantity exceeded" when the limit is breached.
- Utilize the
- Examples: Attempting to add
11
units ofProduct(id: "1", name: "Book", price: 10)
should raise an exception indicating "Maximum quantity exceeded."
- Description: When a product is added to the cart, it should be possible to retrieve the product details using its ID, which includes the product information and its quantity in the cart.
- Details
- Enable products to be added using an
addItem()
method with specific IDs. - Ensure
getItem(id: String)
returns the correct product details, including the quantity after being added to the cart.
- Enable products to be added using an
- Examples: Adding a product with
Product(id: "1", name: "Book", price: 10)
and retrieving it by ID"1"
should returnProduct(id: "1", name: "Book", price: 10, quantity: 1)
.
- Description: Applying a valid discount code should reduce the total price of products in the cart by the specified discount percentage.
- Details
- Use the
applyDiscountCode(code: String)
method to apply a discount. - Support valid discount codes like
"HOLIDAY25"
for a 25% discount. - Update
getTotal()
to reflect the discounted price.
- Use the
- Examples: Applying the discount code
"HOLIDAY25"
to a productProduct(id: "1", name: "Book", price: 100)
should reduce the total to75
.
- Description: The system should not accept discount codes that are invalid and should raise an appropriate exception when such a code is applied.
- Details
- Ensure
applyDiscountCode(code: String)
checks against a list of valid codes. - Raise an exception with the message "Invalid discount code" if the code is not valid.
- Ensure
- Examples: Applying the discount code
"INVALID"
after adding a product should raise an exception indicating the code is invalid.
- Description: When a product that already exists in the cart is added again, its quantity should increase without duplicates, and the total price should reflect the cumulative price.
- Details
- Allow products to be added again using the
addItem()
method without creating duplicates in the cart. - Ensure
getItem(id: String)
returns the updated quantity after adding the same product. - Update the total price to reflect the price of the added products' cumulative quantities.
- Allow products to be added again using the
- Examples: Adding
Product(id: "1", name: "Book", price: 200)
twice should result in a quantity of2
for that product, with the total updated price reflecting the double addition.
- Description: When an existing product in the cart has more units added to it, the total quantity should not exceed the predefined maximum limit.
- Details
- Utilize the
addItem(item: Product)
method to add to an existing product. - Ensure that adding a quantity that results in exceeding the maximum allowed quantity raises an exception.
- The exception message should be "Maximum quantity exceeded" when the quantity limit is breached.
- Utilize the
- Example: Adding
3
units ofProduct(id: "1", name: "Book", price: 200)
to an existing8
units should raise an exception, as it exceeds the limit.
In this unit, you reviewed descriptions for more advanced test cases to expand the functionality of the ShoppingCart
class, covering features like handling non-existent products, applying discounts, and updating product quantities. With your solidified TDD skills, let's proceed to writing targeted test cases that capture essential functionality for a robust ShoppingCart
class.
As you undertake these exercises, remember to engage in the Red-Green-Refactor cycle. Be sure to practice writing tests first, and do not write implementation code unless the test asks for it.
Red! Green! Refactor!
