static void Main(string[] args) { //var promotions = new Promotion[] //{ // new Promotion("Additional Sale test", "Orange", PromotionType.AdditionalSale, 2, 0, 0.5f, DateTime.UtcNow.AddDays(-2), DateTime.UtcNow.AddDays(1), null) //}; //var json = JsonConvert.SerializeObject(promotions); //System.Console.WriteLine(json); var products = new FileReader("Files/items.txt") .Read() .Split("\n") .Where(s => !string.IsNullOrWhiteSpace(s)) .Select(s => s.Trim()); var productRepository = new ProductRepository(new FileReader("Files/products.json"), new JsonTextSerializer()); var promotionRepository = new PromotionRepository(new FileReader("Files/promotions.json"), new JsonTextSerializer()); var saleService = new SaleService(productRepository, new PriceResolver(promotionRepository)); var sale = saleService.Checkout(products.ToArray()); var receiptService = new ReceiptService(); receiptService.Print(sale); System.Console.Read(); }
public void Checkout() { var mockProductRepository = new Mock <IProductRepository>(); mockProductRepository.Setup(m => m.Find("Apple")).Returns(new Data.Models.Product("Apple", 2)); mockProductRepository.Setup(m => m.Find("Orange")).Returns(new Data.Models.Product("Orange", 3)); var mockPriceResolver = new Mock <IPriceResolver>(); mockPriceResolver.Setup(p => p.Resolve("Apple", 2, 1, PricingStrategy.Lowest)).Returns(2); mockPriceResolver.Setup(p => p.Resolve("Apple", 2, 2, PricingStrategy.Lowest)).Returns(4); mockPriceResolver.Setup(p => p.Resolve("Orange", 3, 1, PricingStrategy.Lowest)).Returns(3); var saleService = new SaleService(mockProductRepository.Object, mockPriceResolver.Object); var sale = saleService.Checkout(new string[] { "Apple" }); Assert.NotNull(sale); Assert.Single(sale.SaleItems); Assert.Equal("Apple", sale.SaleItems.ElementAt(0).ProductName); Assert.Equal(2, sale.SaleItems.ElementAt(0).Amount); Assert.Equal(1, sale.SaleItems.ElementAt(0).Quantity); Assert.Equal(2, sale.Total); sale = saleService.Checkout(new string[] { "Apple", "Apple" }); Assert.NotNull(sale); Assert.Single(sale.SaleItems); Assert.Equal("Apple", sale.SaleItems.ElementAt(0).ProductName); Assert.Equal(4, sale.SaleItems.ElementAt(0).Amount); Assert.Equal(2, sale.SaleItems.ElementAt(0).Quantity); Assert.Equal(4, sale.Total); sale = saleService.Checkout(new string[] { "Apple", "Apple", "Orange" }); Assert.NotNull(sale); Assert.Equal(2, sale.SaleItems.Count()); Assert.Contains(sale.SaleItems, s => s.ProductName == "Apple"); Assert.Contains(sale.SaleItems, s => s.ProductName == "Orange"); Assert.Equal(7, sale.Total); Assert.Throws <ProductNotFoundException>(() => saleService.Checkout(new string[] { "Banana" })); }