The solution was to be assessed, not just on completing the task but also on code quality and design, presence of testing, robustness, maintainability etc.

**Problem Statement**

> 
> Scenario
> 
> 
> Basic sales tax is applicable at a rate of 10% on all goods – except
>  books, food and medical products, which are exempt. Import duty is an
>  additional sales tax applicable on all imported goods at a rate of 5%,
>  with no exemptions. The tax rates or item categories may change in
>  future.
> 
> 
> 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 (n\*p/100 rounded up to the nearest 0.05) amount of
>  sales tax.
> 
> 
> 

**Samples:**

> 
> * Case 1:
> 	+ Input:
> 		- 1 book at 12.49
> 		- 1 music CD at 14.99
> 		- 1 chocolate bar at 0.85
> 	+ Output:
> 		- 1 book: $12.49
> 		- 1 music CD: $16.49
> 		- 1 chocolate bar: $0.85
> 		- Sales Taxes: $1.50
> 		- Total: $29.83
> 
> 
> 
> 
> ---
> 
> 
> * Case 2:
> 	+ Input:
> 		- 1 imported box of chocolates at 10.00
> 		- 1 imported bottle of perfume at 47.50
> 	+ Output:
> 		- 1 imported box of chocolates: 10.50
> 		- 1 imported bottle of perfume: 54.65
> 		- Sales Taxes: 7.65
> 		- Total: 65.15
> 
> 
> 
> 
> ---
> 
> 
> * Case 3:
> 	+ Input:
> 		- 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 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
> 
> 
> 

Here's what I submitted:

```
using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        try
        {
            double totalBill = 0, salesTax = 0;
            List<Product> productList = getProductList();
            foreach (Product prod in productList)
            {
                double tax = prod.ComputeSalesTax();
                salesTax += tax;
                totalBill += tax + (prod.Quantity * prod.ProductPrice);
                Console.WriteLine(string.Format("Item = {0} : Quantity = {1} : Price = {2} : Tax = {3}", prod.ProductName, prod.Quantity, prod.ProductPrice + tax, tax));
            }
            Console.WriteLine("Total Tax : " + salesTax);
            Console.WriteLine("Total Bill : " + totalBill);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        Console.ReadLine();
    }

    private static List<Product> getProductList()
    {
        List<Product> lstProducts = new List<Product>();
        //input 1
        lstProducts.Add(new Product("Book", 12.49, 1, ProductType.ExemptedProduct, false));
        lstProducts.Add(new Product("Music CD", 14.99, 1, ProductType.TaxPaidProduct, false));
        lstProducts.Add(new Product("Chocolate Bar", .85, 1, ProductType.ExemptedProduct, false));

        //input 2
        //lstProducts.Add(new Product("Imported Chocolate", 10, 1, ProductType.ExemptedProduct,true));
        //lstProducts.Add(new Product("Imported Perfume", 47.50, 1, ProductType.TaxPaidProduct,true));

        //input 3
        //lstProducts.Add(new Product("Imported Perfume", 27.99, 1, ProductType.TaxPaidProduct,true));
        //lstProducts.Add(new Product("Perfume", 18.99, 1, ProductType.TaxPaidProduct,false));
        //lstProducts.Add(new Product("Headache Pills", 9.75, 1, ProductType.ExemptedProduct,false));
        //lstProducts.Add(new Product("Imported Chocolate", 11.25, 1, ProductType.ExemptedProduct,true));
        return lstProducts;
    }
}

public enum ProductType
{
    ExemptedProduct = 1,
    TaxPaidProduct = 2,
    //ImportedProduct=3
}

class Product
{
    private ProductType _typeOfProduct = ProductType.TaxPaidProduct;
    private string _productName = string.Empty;
    private double _productPrice;
    private int _quantity;
    private bool _isImportedProduct = false;
    public string ProductName { get { return _productName; } }
    public double ProductPrice { get { return _productPrice; } }
    public int Quantity { get { return _quantity; } }

    public Product(string productName, double productPrice, int quantity, ProductType type, bool isImportedProduct)
    {
        _productName = productName;
        _productPrice = productPrice;
        _quantity = quantity;
        _typeOfProduct = type;
        _isImportedProduct = isImportedProduct;
    }

    public double ComputeSalesTax()
    {
        double tax = 0;
        if (_isImportedProduct) //charge 5% tax directly
            tax += _productPrice * .05;
        switch (_typeOfProduct)
        {
            case ProductType.ExemptedProduct: break;
            case ProductType.TaxPaidProduct:
                tax += _productPrice * .10;
                break;
        }
        return Math.Round(tax, 2);
        //round result before returning
    }
}

```