public override decimal GetAmount(LineItem lineItem, Basket.Basket basket)
 {
     return
         (from c in PerRegionCosts
          where c.DestinationRegion == lineItem.DeliveryRegion
          select c.Amount).Single();
 }
        public decimal CalculateShipping(Basket basket)
        {
            foreach (var lineItem in basket.LineItems)
            {
                lineItem.ShippingAmount = lineItem.Shipping.GetAmount(lineItem, basket);
                lineItem.ShippingDescription = lineItem.Shipping.GetDescription(lineItem, basket);
            }

            return basket.LineItems.Sum(li => li.ShippingAmount);
        }
        public void BasketShippingTotalTest()
        {
            var perRegionShippingOption = new PerRegionShipping()
            {
                PerRegionCosts = new[]
                                                                       {
                                                                           new RegionShippingCost()
                                                                               {
                                                                                   DestinationRegion =
                                                                                       RegionShippingCost.Regions.UK,
                                                                                   Amount = .75m
                                                                               },
                                                                           new RegionShippingCost()
                                                                               {
                                                                                   DestinationRegion =
                                                                                       RegionShippingCost.Regions.Europe,
                                                                                   Amount = 1.5m
                                                                               }
                                                                       },
            };

            var flatRateShippingOption = new FlatRateShipping {FlatRate = 1.1m};

            var basket = new Basket()
                             {
                                 LineItems = new List<LineItem>
                                                 {
                                                     new LineItem()
                                                         {
                                                             DeliveryRegion = RegionShippingCost.Regions.UK,
                                                             Shipping = perRegionShippingOption
                                                         },
                                                     new LineItem()
                                                         {
                                                             DeliveryRegion = RegionShippingCost.Regions.Europe,
                                                             Shipping = perRegionShippingOption
                                                         },
                                                     new LineItem() {Shipping = flatRateShippingOption},
                                                 }
                             };

            var calculator = new ShippingCalculator();

            decimal basketShipping = calculator.CalculateShipping(basket);

            Assert.That(basketShipping, Is.EqualTo(3.35m));
        }
 public override string GetDescription(LineItem lineItem, Basket.Basket basket)
 {
     return "Flat rate shipping";
 }
 public override decimal GetAmount(LineItem lineItem, Basket.Basket basket)
 {
     return FlatRate;
 }
 public abstract string GetDescription(LineItem lineItem, Basket.Basket basket);
 public abstract decimal GetAmount(LineItem lineItem, Basket.Basket basket);
 public override string GetDescription(LineItem lineItem, Basket.Basket basket)
 {
     return string.Format("Shipping to {0}", lineItem.DeliveryRegion);
 }