Basic sales tax is applicable at a rate of 10% on all goods, except books, food, and medical products that are exempt. Import duty is an additional sales tax applicable on all imported goods at a rate of 5%, with no exemptions. When I purchase items I receive a receipt which lists the name of all the items and their price (including tax), finishing with the total cost of the items, and the total amounts of sales taxes paid. The rounding rules for sales tax are that for a tax rate of n%, a shelf price of p contains (np/100 rounded up to the nearest 0.05) amount of sales tax. Write an application that prints out the receipt details for these shopping baskets...
Input 1:
1 book at 12.49
1 music CD at 14.99
1 chocolate bar at 0.85
Input 2:
1 imported box of chocolates at 10.00
1 imported bottle of perfume at 47.50
Input 3:
1 imported bottle of perfume at 27.99
1 bottle of perfume at 18.99
1 packet of headache pills at 9.75
1 box of imported chocolates at 11.25
Output 1:
1 book : 12.49
1 music CD: 16.49
1 chocolate bar: 0.85
Sales Taxes: 1.50
Total: 29.83
Output 2:
1 imported box of chocolates: 10.50
1 imported bottle of perfume: 54.65
Sales Taxes: 7.65
Total: 65.15
Output 3:
1 imported bottle of perfume: 32.19
1 bottle of perfume: 20.89
1 packet of headache pills: 9.75
1 imported box of chocolates: 11.85
Sales Taxes: 6.70
Total: 74.68
Note: For information on how to run the build, refer to the Build.md file
Normal developer instinct would dictate that you straight away write the implementation without the test case, but that is not the way how Test Driven Development (TDD) works...
The basic premise of TDD is that you write a test before writing the code that actually provides the implementation, and then you refactor that implementation as needed.
When TDD practitioners need to implement a feature, they first write a failing test that describes, or specifies, that feature. Next, they write just enough code to make the test pass. Finally, they refactor the code to help ensure that it will be easy to maintain.
Let us see how can apply these TDD techniques to fulfil the requirements given above.
Before we even start any coding, I recommend we look at the requirements and try and deduce the test scenarios.
Items | Receipt | Tax | Test Scenario |
---|---|---|---|
1 book at 12.49 | 12.49 | 0.00 | Item exempt from Sales Tax |
1 music at 14.99 | 16.49 | 1.50 | Taxable Item |
1 chocolate box at 0.85 | 0.85 | 0.00 | Item exempt from Sales Tax |
Items | Receipt | Tax | Test Scenario |
---|---|---|---|
1 imported box of chocolates at 10.00 | 10.50 | 0.50 | Imported and tax exempt item |
1 imported bottle of perfume at 47.50 | 54.65 | 7.15 | Imported and taxable item |
Items | Receipt | Tax | Test Scenario |
---|---|---|---|
1 imported bottle of perfume at 27.99 | 32.19 | 4.20 | Imported and taxable item |
1 bottle of perfume at 18.99 | 20.89 | 1.90 | Taxable Item |
1 packet of headache pills at 9.75 | 9.75 | 0.00 | Item exempt from Sales Tax |
1 box of imported chocolates at 11.25 | 11.85 | 0.60 | Imported and tax exempt item |
There are clearly four test scenarios that need to be considered, namely:
- Item exempt from Sales Tax
- Taxable Item
- Imported and taxable item
- Imported and tax exempt item
Before we start with the test cases, lets do a preliminary domain design.