using System.Collections.Generic;
using System.Data.Entity;
public static void Main()
Console.WriteLine("Please enter Product(s) Name like to purchase.");
IProdToPurchase objProdPurchase = Factory.createProdPurchaseInstance();
string p = Console.ReadLine();
ICostCalculater objCostCalc = Factory.createCalculatorInstance();
objCostCalc.calculateCost(objProdPurchase);
public class CostCalculator : ICostCalculater
List<Product> _listAllProducts;
private double _totalSalesTax = 0.0;
private double _totalCost = 0.0;
private void getAllProductsFromDB()
using (ProductDBContext db = new ProductDBContext())
_listAllProducts = db.Products;
public void calculateCost(IProdToPurchase products)
Console.WriteLine("========= INVOICE =========");
foreach (string prodName in products.GetProdsToPurchase())
Product prod = _listAllProducts.Find(p => p.Name == prodName);
double nTaxPerct = SalesTax.GetSalexTax(prod.Category);
double nTaxValue = nQty * prod.Price * nTaxPerct;
double nCostValue = nQty * prod.Price * (1 + nTaxPerct);
_totalSalesTax += nTaxValue;
_totalCost += nCostValue;
Console.WriteLine(string.Format("Product {0} : Sales Tax {1}, Cost {2}", prod.Name, nTaxValue, nCostValue));
Console.WriteLine("========================================");
Console.WriteLine(string.Format("Total Sales Tax {0}", _totalSalesTax));
Console.WriteLine(string.Format("Total Cost including Sales Tax {0}", _totalCost));
Console.WriteLine("========================================");
get { return _totalSalesTax; }
get { return _totalCost; }
public static double GetSalexTax(char category)
public static ICostCalculater createCalculatorInstance()
IUnityContainer _container = new UnityContainer();
_container.RegisterType(typeof(ICostCalculater), typeof(CostCalculator));
ICostCalculater inst = _container.Resolve<ICostCalculater>();
public static IProdToPurchase createProdPurchaseInstance()
IUnityContainer _container = new UnityContainer();
_container.RegisterType(typeof(IProdToPurchase), typeof(ProdsToPurchase));
IProdToPurchase inst = _container.Resolve<IProdToPurchase>();
public interface ICostCalculater
void calculateCost(IProdToPurchase products);
public interface IProdToPurchase
void Add(string sProdName);
List<string> GetProdsToPurchase();
public class ProdsToPurchase : IProdToPurchase
List<string> _listProdsToPurchase = new List<string>();
public void Add(string sProdName)
_listProdsToPurchase.Add(sProdName);
public List<string> GetProdsToPurchase()
return _listProdsToPurchase;
private char _category = ' ';
private string _name = "";
public class ProductDBContext : DbContext
private List<Product> _products = new List<Product>();
public ProductDBContext() : base("name=SampleDB")
public List<Product> Products
_products.Add(new Product() { Name = "Oil", Category = 'A', Price = 130 });
_products.Add(new Product() { Name = "Paste", Category = 'B', Price = 85.50 });
_products.Add(new Product() { Name = "Washing Powder", Category = 'A', Price = 249.90 });
_products.Add(new Product() { Name = "Ketchup", Category = 'c', Price = 110.00 });
_products.Add(new Product() { Name = "Horlicks", Category = 'B', Price = 520.00 });
set { _products = value; }
public class CostCalculatorTest
public void TestMethod1()
ICostCalculater objCostC = Factory.createCalculatorInstance();
var objMock = new Mock<IProdToPurchase>();
objMock.Setup(p => p.GetProdsToPurchase()).Returns(() => { List<string> _lst = new List<string>(); _lst.Add("Oil"); _lst.Add("Paste"); _lst.Add("Horlicks"); return _lst; });
objCostC.calculateCost(objMock.Object);