public void MixedRequests_CalculatePrice_ShouldGetBestPrice() { var parcelPriceCalculator = new ParcelPriceCalculator(); var parcelPrice = parcelPriceCalculator.CreateParcelPrice("25,25,25,3 25,25,25,3 25,25,25,3 25,25,25,3 25,25,25,3 25,25,25,3"); Assert.AreEqual(32, parcelPrice.Price); }
public void Given_ParcelWithFastDeliveryOption_Should_ReturnValidResultWithCorrectTotalPrice() { //Arrange var parcelMetadataProvider = new Mock <IParcelMetadataProvider>(); parcelMetadataProvider.Setup(x => x.ResolveParcelMetadata(It.IsAny <Parcel>())) .Returns(new ParcelMetadata(ParcelType.Small, 10, 10, 2)); var weightCostCalculator = new Mock <IWeightCostCalculator>(); weightCostCalculator.Setup(y => y.GetCost(It.IsAny <decimal>(), It.IsAny <decimal>(), It.IsAny <decimal>())) .Returns(20); var discountCalculator = new Mock <IDiscountCalculator>(); discountCalculator.Setup(x => x.CalculateDiscount(It.IsAny <IEnumerable <ParcelDeliveryCost> >())) .Returns(new List <DeliveryDiscount>()); var sut = new ParcelPriceCalculator(parcelMetadataProvider.Object, discountCalculator.Object, weightCostCalculator.Object); var parcel = new Parcel(10, 10, 10, 10); //Act var result = sut.Calculate(parcel, d => d.WithFastDelivery()); //Assert result.Should().NotBeNull(); result.DeliveryCost.Should().Be(30); result.TotalCost.Should().Be(60); result.FastDeliveryCost.Should().Be(30); }
public void MixedRequests_CalculatePrice_CorrectResult() { var parcelPriceCalculator = new ParcelPriceCalculator(); var parcelPrice = parcelPriceCalculator.CreateParcelPrice("8,8,8,1 25,25,25,3 88,88,88,6 111,111,111,10 33,33,33,50"); var result = parcelPrice.ToString(); Assert.AreEqual(98, parcelPrice.Price); Assert.AreEqual(196, parcelPrice.SpeedyPrice); Assert.AreEqual(result, "Small Parcel: $3\r\nMedium Parcel: $8\r\nLarge Parcel: $15\r\nExtra Large Parcel: $25\r\nHeavy Parcel: $50\r\nTotal Price: $98\r\nSpeedy Price: $196\r\n"); }
Given_ListOfParcelsWithFastDeliveryOptionAndEligibleDiscounts_Should_ReturnValidResultWithCorrectTotalPrice() { //Arrange var parcel1 = new Parcel(10, 10, 10, 10); var parcel2 = new Parcel(10, 10, 10, 60); var parcelMetadataProvider = new Mock <IParcelMetadataProvider>(); parcelMetadataProvider.Setup(x => x.ResolveParcelMetadata(It.Is <Parcel>(p => p.Weight == parcel1.Weight))) .Returns(new ParcelMetadata(ParcelType.Small, 10, 10, 2)); parcelMetadataProvider.Setup(x => x.ResolveParcelMetadata(It.Is <Parcel>(p => p.Weight == parcel2.Weight))) .Returns(new ParcelMetadata(ParcelType.Heavy, 50, 50, 1)); var weightCostCalculator = new Mock <IWeightCostCalculator>(); weightCostCalculator.Setup(y => y.GetCost(It.IsAny <decimal>(), It.IsAny <decimal>(), It.IsAny <decimal>())) .Returns(20); var discountCalculator = new Mock <IDiscountCalculator>(); discountCalculator.Setup(x => x.CalculateDiscount(It.IsAny <IEnumerable <ParcelDeliveryCost> >())) .Returns(new List <DeliveryDiscount> { new DeliveryDiscount("Delivery Discount for Small Parcel", 5m) }); var sut = new ParcelPriceCalculator(parcelMetadataProvider.Object, discountCalculator.Object, weightCostCalculator.Object); //Act var result = sut.Calculate(new[] { parcel1, parcel2 }, options => options.WithFastDelivery()); //Assert result.Should().NotBeNull(); result.DeliveryDiscounts.Should().HaveCount(1); result.ParcelDeliveryCosts.Should().HaveCount(2) .And.Contain(m => m.ParcelName == "Parcel #0, Small Parcel" && m.ParcelType == ParcelType.Small && m.Cost == 30m) // Parcel + Overweight .And.Contain(m => m.ParcelName == "Parcel #1, Heavy Parcel" && m.ParcelType == ParcelType.Heavy && m.Cost == 70m); // Parcel + Overweight result.FastDeliveryCost.Should().Be(95); result.TotalCost.Should().Be(190); }