public ShippingDetailInfo Execute(ShippingDetailInfo input)
        {
            IZoneDifferenceStrategy zoneDiffDecor = ZoneDifferenceStrategyFactory.GetInstance().GetZoneDifferenceDecoratorInstance(input.DeliveryMethod);
            int zoneDifference = zoneDiffDecor.Difference(input.OriginAddress.PostalCode, input.DestinationAddress.PostalCode);

            switch (input.DeliveryMethod)
            {
            case DeliveryMethodEnum.Air:
                input.Cost = zoneDifference * OunceToPound(Convert.ToDouble(input.PackageInfo.Weight)) * GetPackageVolume(input.PackageInfo);
                break;

            case DeliveryMethodEnum.Rail:
            case DeliveryMethodEnum.Ground:
                input.Cost = zoneDifference * OunceToPound(Convert.ToDouble(input.PackageInfo.Weight));
                break;

            default:
                throw new InvalidOperationException();
            }

            // Insurance Calculation
            if (input.IsInsured)
            {
                input.Cost *= 1.02;
            }

            return(input);
        }
Example #2
0
        public IZoneDifferenceStrategy GetZoneDifferenceDecoratorInstance(DeliveryMethodEnum input)
        {
            IZoneDifferenceStrategy result = null;

            switch (input)
            {
            case DeliveryMethodEnum.Air:
            case DeliveryMethodEnum.Ground:
                if (timeZoneDifferenceDecorator == null)
                {
                    timeZoneDifferenceDecorator = new TimeZoneDifferenceStrategy();
                }
                result = timeZoneDifferenceDecorator;
                break;

            case DeliveryMethodEnum.Rail:
                if (orientationZoneDifferenceDecorator == null)
                {
                    orientationZoneDifferenceDecorator = new OrientationZoneDifferenceStrategy();
                }
                result = orientationZoneDifferenceDecorator;
                break;

            default:
                break;
            }

            return(result);
        }
Example #3
0
        public void GetZoneDifferenceDecoratorInstanceTest()
        {
            ZoneDifferenceStrategyFactory target   = ZoneDifferenceStrategyFactory.GetInstance();
            DeliveryMethodEnum            input    = DeliveryMethodEnum.Rail;
            IZoneDifferenceStrategy       expected = ZoneDifferenceStrategyFactory.GetInstance().GetZoneDifferenceDecoratorInstance(DeliveryMethodEnum.Rail);
            IZoneDifferenceStrategy       actual;

            actual = target.GetZoneDifferenceDecoratorInstance(input);
            Assert.AreEqual(expected, actual);
        }