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);
        }
예제 #2
0
        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");
        }
예제 #4
0
        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);
        }