public void ProperlyCompute_CompoundOrders(bool isSpeedy, decimal expectedTotal)
        {
            // arrange
            var smallParcelType   = new MockSomethingSmallSizeParcel();
            var weightBasedParcel = new MockWeightBasedParcel();

            _mockParcelClassifier.Setup(p => p.ClassifyParcelBySize(It.IsAny <double>()))
            .Returns(smallParcelType);

            _mockParcelClassifier.Setup(p => p.ClassifyHeavyParcelByWeight(It.IsAny <double>()))
            .Returns(weightBasedParcel);

            var parcelOrder = new ParcelOrder
            {
                Speedy           = isSpeedy,
                ParcelOrderItems = new List <ParcelOrderItem>
                {
                    new ParcelOrderItem(1, 2, CalculationType.BySize),
                    new ParcelOrderItem(1, 1, CalculationType.BySize),
                    new ParcelOrderItem(1, 50, CalculationType.ByWeight),
                    new ParcelOrderItem(1, 51, CalculationType.ByWeight)
                }
            };

            // act
            var order = _parcelBuilder.BuildOrder(parcelOrder);

            // assert
            order.TotalCost.Should().Be(expectedTotal);
        }
        [InlineData(5, 50, false, CalculationType.ByWeight, 100)] // cost would double coz discount is not supported
        public void ProperlyComputeCost(double size, double weight, bool isSpeedy, CalculationType calculationType, decimal expectedTotalCost)
        {
            // arrange
            var smallParcelType   = new MockSomethingSmallSizeParcel();
            var weightBasedParcel = new MockWeightBasedParcel();

            _mockParcelClassifier.Setup(p => p.ClassifyParcelBySize(It.IsAny <double>()))
            .Returns(smallParcelType);

            _mockParcelClassifier.Setup(p => p.ClassifyHeavyParcelByWeight(It.IsAny <double>()))
            .Returns(weightBasedParcel);

            var parcelBuilderWithDiscount = new ParcelOrderBuilder(_mockParcelClassifier.Object, new DiscountCalculator(new List <IDiscount>
            {
                new MockDiscountConfiguration()
            }));

            var parcelOrder = new ParcelOrder
            {
                Speedy          = isSpeedy,
                DiscountToApply = new List <DiscountTypes>
                {
                    DiscountTypes.Small
                },
                ParcelOrderItems = new List <ParcelOrderItem>
                {
                    new ParcelOrderItem(size, weight, calculationType),
                    new ParcelOrderItem(size, weight, calculationType)
                }
            };

            // act
            var order = parcelBuilderWithDiscount.BuildOrder(parcelOrder);

            // assert
            order.TotalCost.Should().Be(expectedTotalCost);
        }