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);
        }
        public void ProperlyGenerateOrderLines()
        {
            // arrange
            var smallParcelType = new MockSomethingSmallSizeParcel();

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

            var parcelOrder = new ParcelOrder
            {
                ParcelOrderItems = new List <ParcelOrderItem>
                {
                    new ParcelOrderItem(5, 1, CalculationType.BySize)
                },
            };

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


            // assert
            order.LineItems.Count.Should().Be(1);
            order.LineItems.Single().Cost.Should().Be(smallParcelType.Cost);
            order.LineItems.Single().ParcelType.Should().Be(smallParcelType.ParcelType.ToString());
        }
Ejemplo n.º 3
0
        public ParcelOrderOutput BuildOrder(ParcelOrder parcelOrder)
        {
            if (!parcelOrder.ParcelOrderItems.HaveValidParcelItems())
            {
                throw new Exception("Invalid Process.");
            }

            var parcelOrderOutput = new ParcelOrderOutput
            {
                IsSpeedy = parcelOrder.Speedy
            };

            var parcelBySize   = parcelOrder.ParcelOrderItems.Where(p => p.CalculationType.Equals(CalculationType.BySize));
            var parcelByWeight = parcelOrder.ParcelOrderItems.Where(p => p.CalculationType.Equals(CalculationType.ByWeight));


            if (parcelBySize.Any())
            {
                var(lineItems, totalCost) = ComposeLineItems(parcelBySize, ParcelBySizeSelector());

                parcelOrderOutput.LineItems.AddRange(lineItems);
                parcelOrderOutput.TotalCost += totalCost;
            }

            if (parcelByWeight.Any())
            {
                var(lineItems, totalCost) = ComposeLineItems(parcelByWeight, ParcelByWeightSelector());

                parcelOrderOutput.LineItems.AddRange(lineItems);
                parcelOrderOutput.TotalCost += totalCost;
            }

            // apply discounts
            if (parcelOrder.DiscountToApply.Any())
            {
                AppliedDiscount discount;

                if (parcelOrder.DiscountToApply.Contains(DiscountTypes.Mixed))
                {
                    discount = _discountCalculator.CalculateMixedDiscount(parcelOrderOutput.LineItems);
                }
                else
                {
                    discount = _discountCalculator.CalculateDiscount(parcelOrderOutput.LineItems);
                }

                parcelOrderOutput.TotalCost  = discount.TotalCost;
                parcelOrderOutput.TotalSaved = discount.SavedCost;
            }

            if (parcelOrder.Speedy)
            {
                parcelOrderOutput.TotalCost *= 2;
            }

            return(parcelOrderOutput);
        }
        public IParcelOrder GeneratePacels(IParcelFactory parcelFactory, List<IParcelSettings> parcelSettings, IParcelOrderSettings parcelOrderSettings)
        {
            var parcelOrder = new ParcelOrder(parcelOrderSettings);
            foreach (var setting in parcelSettings)
            {
                parcelOrder.Add(parcelFactory.CreateParcel(setting));
            }
            return parcelOrder;

        }
Ejemplo n.º 5
0
        public void ExecuteOrder(ParcelOrder order)
        {
            try
            {
                _logger.LogInformation("Processing Order.");

                var output = _parcelOrderBuilder.BuildOrder(order);
                PrintOutput(output);
            }
            catch (Exception e)
            {
                _logger.LogError("Failed to Process Order.", e);
            }
        }
Ejemplo n.º 6
0
        public void ShouldApplyOneMediumDiscount()
        {
            var testParcels = new List <Parcel>
            {
                new Parcel(45, 45, 45, 3),
                new Parcel(45, 45, 45, 3),
                new Parcel(45, 45, 45, 4),
            };

            var newParcelOrder = new ParcelOrder(testParcels);

            Assert.Equal(testParcels.Count(), newParcelOrder.Parcels.Count());
            Assert.Single(newParcelOrder.Discounts);
            Assert.Equal(8, newParcelOrder.TotalDiscount);
        }
Ejemplo n.º 7
0
        public void ShouldApplyOneSmallDiscount()
        {
            var testParcels = new List <Parcel>
            {
                new Parcel(1, 1, 1, 0),
                new Parcel(1, 1, 1, 0),
                new Parcel(1, 1, 1, 0),
                new Parcel(1, 1, 1, 2)
            };

            var newParcelOrder = new ParcelOrder(testParcels);

            Assert.Equal(testParcels.Count(), newParcelOrder.Parcels.Count());
            Assert.Single(newParcelOrder.Discounts);
            Assert.Equal(3, newParcelOrder.TotalDiscount);
        }
Ejemplo n.º 8
0
        public void ShouldCreateAParcelOrderAndSetTheTotalCost(ParcelSize result, int length, int width, int heigth, double weigth)
        {
            //Arrange
            //The test values are defined on the attribute "InlineDate"
            var testParcel = new Parcel(length, width, heigth, weigth);

            //Act
            var testParcelOrder = new ParcelOrder(testParcel);

            //Assert
            Assert.Single(testParcelOrder.Parcels);
            Assert.Equal(SizeCost.GetCost(result), testParcelOrder.TotalCost);
            Assert.All(testParcelOrder.Parcels, x =>
            {
                Assert.Equal(SizeCost.GetCost(result), x.Cost);
            });
            Assert.Null(testParcelOrder.SpeedyShippingCost);
        }
Ejemplo n.º 9
0
        public void CalculateCost_WhenAnOrderIsApplicableForMediumParcelMania_Every3rdMediumParcelIsFreeAndCostIsReturned()
        {
            //Arrange
            var parcels = new List <Parcel>()
            {
                new Parcel(25, 3), //$8
                new Parcel(25, 4), //$10
                new Parcel(25, 3)  //$8
            };

            var parcelOrder = new ParcelOrder(parcels);

            //Act
            var parcelCost = parcelOrder.CalculateCost();

            //Assert
            Assert.Equal(26, parcelCost.Cost);
            Assert.Equal(-8, parcelCost.Discount);
        }
Ejemplo n.º 10
0
        public void ShouldCreateAParcelOrderAndSetTheTotalCostWithExtraWeight()
        {
            var length     = 1;
            var width      = 1;
            var heigth     = 1;
            var weight     = 6;
            var testParcel = new Parcel(length, width, heigth, weight);

            var testParcelOrder = new ParcelOrder(testParcel);

            var expectedTotalCost = SizeCost.GetCost(ParcelSize.Small) + WeightLimit.GetCost(ParcelSize.Small, weight);

            Assert.Single(testParcelOrder.Parcels);
            Assert.Equal(expectedTotalCost, testParcelOrder.TotalCost);
            Assert.All(testParcelOrder.Parcels, x =>
            {
                Assert.Equal(expectedTotalCost, x.Cost);
            });
            Assert.Null(testParcelOrder.SpeedyShippingCost);
        }
Ejemplo n.º 11
0
        public void ShouldAddOneDiscountTypeEach()
        {
            var testParcels = new List <Parcel>
            {
                new Parcel(1, 1, 1, 0),
                new Parcel(1, 1, 1, 0),
                new Parcel(1, 1, 1, 0),
                new Parcel(1, 1, 1, 2),
                new Parcel(45, 45, 45, 3),
                new Parcel(45, 45, 45, 3),
                new Parcel(45, 45, 45, 4),
                new Parcel(75, 75, 75, 0),
            };

            var newParcelOrder = new ParcelOrder(testParcels);

            Assert.Equal(testParcels.Count(), newParcelOrder.Parcels.Count());
            Assert.Equal(3, newParcelOrder.Discounts.Count());
            Assert.Equal(14, newParcelOrder.TotalDiscount);
        }
Ejemplo n.º 12
0
        public void ShouldCreateAParcelOrderAndSetTheTotalForAHeavyParcel()
        {
            var length     = 1;
            var width      = 1;
            var heigth     = 1;
            var weight     = 100d;
            var testParcel = new Parcel(length, width, heigth, weight);

            var testParcelOrder = new ParcelOrder(testParcel);

            var expectedTotalCost = WeightLimit.GetHeavyParcelCost(weight);

            Assert.Single(testParcelOrder.Parcels);
            Assert.Equal(expectedTotalCost, testParcelOrder.TotalCost);
            Assert.All(testParcelOrder.Parcels, x =>
            {
                Assert.Equal(expectedTotalCost, x.Cost);
            });
            Assert.Null(testParcelOrder.SpeedyShippingCost);
        }
Ejemplo n.º 13
0
        public void CalculateCost_WhenAnOrderIsApplicableForSmallParcelMania_Every4thSmallParcelIsFreeAndCostIsReturned()
        {
            //Arrange
            var parcels = new List <Parcel>()
            {
                new Parcel(5, 1), //$3
                new Parcel(5, 2), //$5
                new Parcel(5, 1), //$3
                new Parcel(5, 2), //$3
            };

            var parcelOrder = new ParcelOrder(parcels);

            //Act
            var parcelCost = parcelOrder.CalculateCost();

            //Assert
            Assert.Equal(14, parcelCost.Cost);
            Assert.Equal(-3, parcelCost.Discount);
        }
Ejemplo n.º 14
0
    public override void OnCreate()
    {
        base.OnCreate();

        m_Radios = GetComponentsInChildren <Toggle>(true);
        var index = 0;

        foreach (var radio in m_Radios)
        {
            var id = index;
            index++;

            radio.onValueChanged.AddListener((bool enabled) =>
                                             OnRadioValueChanged(id, enabled));
            radio.isOn = id == DEFAULT_ORDER;
        }

        Data = new ParcelOrder();

        IsExpanded = true;
    }
Ejemplo n.º 15
0
        public void CalculateCost_WhenAnOrderIsApplicableForMixedParcelMania_Every5thParcelIsFreeAndCostIsReturned()
        {
            //Arrange
            var parcels = new List <Parcel>()
            {
                new Parcel(5, 1),  //$3
                new Parcel(25, 3), //$8
                new Parcel(75, 6), //$15
                new Parcel(5, 1),  //$3
                new Parcel(25, 3)  //$8
            };

            var parcelOrder = new ParcelOrder(parcels);

            //Act
            var parcelCost = parcelOrder.CalculateCost();

            //Assert
            Assert.Equal(37, parcelCost.Cost);
            Assert.Equal(-3, parcelCost.Discount);
        }
Ejemplo n.º 16
0
        public void ShouldCreateAParcelOrderWithSeveralParcelsAndSetTheTotalCost()
        {
            var testParcels = new List <Parcel>
            {
                new Parcel(1, 1, 1, 0),
                new Parcel(75, 75, 75, 0),
                new Parcel(150, 150, 150, 0)
            };

            var testParcelOrder = new ParcelOrder(testParcels);

            var expectedTotalCost = SizeCost.GetCost(ParcelSize.Small) + SizeCost.GetCost(ParcelSize.Large) + SizeCost.GetCost(ParcelSize.ExtraLarge);

            Assert.Equal(testParcels.Count(), testParcelOrder.Parcels.Count());
            Assert.Equal(expectedTotalCost, testParcelOrder.TotalCost);
            Assert.All(testParcelOrder.Parcels, x =>
            {
                Assert.Equal(SizeCost.GetCost(x.Size), x.Cost);
            });
            Assert.Null(testParcelOrder.SpeedyShippingCost);
        }
Ejemplo n.º 17
0
        public void ProperlyComputeWeightAddOn()
        {
            // arrange
            var smallParcelType = new MockSomethingSmallSizeParcel();

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

            var parcelOrder = new ParcelOrder
            {
                ParcelOrderItems = new List <ParcelOrderItem>
                {
                    new ParcelOrderItem(5, 2, CalculationType.BySize),
                    new ParcelOrderItem(5, 1, CalculationType.BySize)
                }
            };

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

            // assert
            order.TotalCost.Should().Be(24);
        }
Ejemplo n.º 18
0
        public void ShouldCreateAParcelOrderWithSpeedyShippingValueSet()
        {
            var length         = 1;
            var width          = 1;
            var heigth         = 1;
            var weight         = 0;
            var testParcel     = new Parcel(length, width, heigth, weight);
            var speedyShipping = true;

            var testParcelOrder = new ParcelOrder(testParcel, speedyShipping);

            var expectedTotalCost  = SizeCost.GetCost(ParcelSize.Small) * 2;
            var speedyShippingCost = expectedTotalCost / 2;

            Assert.Single(testParcelOrder.Parcels);
            Assert.Equal(expectedTotalCost, testParcelOrder.TotalCost);
            Assert.All(testParcelOrder.Parcels, x =>
            {
                Assert.Equal(SizeCost.GetCost(x.Size), x.Cost);
            });
            Assert.NotNull(testParcelOrder.SpeedyShippingCost);
            Assert.Equal(speedyShippingCost, testParcelOrder.SpeedyShippingCost);
        }
Ejemplo n.º 19
0
        public void CalculateCost_WhenAnOrderIsApplicableForMultipleDiscounts_BestPriceDiscountsAreSelectedAndCostIsReturned()
        {
            //Arrange
            var parcels = new List <Parcel>()
            {
                new Parcel(5, 1),  //$3
                new Parcel(5, 1),  //$3
                new Parcel(5, 1),  //$3
                new Parcel(5, 1),  //$3
                new Parcel(25, 3), //$8
                new Parcel(25, 3), //$8
                new Parcel(25, 3)  //$8
            };

            var parcelOrder = new ParcelOrder(parcels);

            //Act
            var parcelCost = parcelOrder.CalculateCost();

            //Assert
            Assert.Equal(36, parcelCost.Cost);
            Assert.Equal(-11, parcelCost.Discount);
        }
Ejemplo n.º 20
0
        [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);
        }
Ejemplo n.º 21
0
        static void Main(string[] args)
        {
            var serviceCollection = new ServiceCollection();

            ConfigureServices(serviceCollection);

            var serviceProvider = serviceCollection.BuildServiceProvider();

            var worker = serviceProvider.GetService <IParcelWorker>();

            var order = new ParcelOrder
            {
                Speedy          = true,
                DiscountToApply = new List <DiscountTypes>
                {
                    DiscountTypes.Small,
                    DiscountTypes.Medium
                },
                ParcelOrderItems = new List <ParcelOrderItem>
                {
                    new ParcelOrderItem(9, 1, CalculationType.BySize),
                    new ParcelOrderItem(9, 5, CalculationType.BySize),
                    new ParcelOrderItem(9, 1, CalculationType.BySize),
                    new ParcelOrderItem(9, 1, CalculationType.BySize),
                    new ParcelOrderItem(49, 50, CalculationType.BySize),
                    new ParcelOrderItem(49, 4, CalculationType.BySize),
                    new ParcelOrderItem(51, 100, CalculationType.BySize),
                    new ParcelOrderItem(101, 1000, CalculationType.BySize),
                    new ParcelOrderItem(101, 50, CalculationType.ByWeight),
                    new ParcelOrderItem(101, 51, CalculationType.ByWeight),
                }
            };

            worker.ExecuteOrder(order);

            serviceProvider.Dispose();
        }