protected virtual AmountBasedReward GetBestAmountReward(decimal currentAmount, int quantity, IEnumerable <AmountBasedReward> reward)
        {
            AmountBasedReward retVal = null;
            var maxAbsoluteReward    = reward
                                       .Where(y => y.AmountType == RewardAmountType.Absolute)
                                       .OrderByDescending(y => y.GetRewardAmount(currentAmount, quantity)).FirstOrDefault();

            var maxRelativeReward = reward
                                    .Where(y => y.AmountType == RewardAmountType.Relative)
                                    .OrderByDescending(y => y.GetRewardAmount(currentAmount, quantity)).FirstOrDefault();

            var absDiscountAmount = maxAbsoluteReward != null?maxAbsoluteReward.GetRewardAmount(currentAmount, quantity) : 0;

            var relDiscountAmount = maxRelativeReward != null?currentAmount *maxRelativeReward.GetRewardAmount(currentAmount, quantity) : 0;

            if (maxAbsoluteReward != null && maxRelativeReward != null)
            {
                retVal = absDiscountAmount > relDiscountAmount ? maxAbsoluteReward : maxRelativeReward;
            }
            else if (maxAbsoluteReward != null)
            {
                retVal = maxAbsoluteReward;
            }
            else if (maxRelativeReward != null)
            {
                retVal = maxRelativeReward;
            }

            return(retVal);
        }
        private static AmountBasedReward EvaluateBestAmountReward(decimal currentAmount, AmountBasedReward[] promoRewards)
        {
            AmountBasedReward retVal = null;
            var maxAbsoluteReward    = promoRewards
                                       .Where(y => y.AmountType == RewardAmountType.Absolute)
                                       .OrderByDescending(y => y.Amount).FirstOrDefault();

            var maxRelativeReward = promoRewards
                                    .Where(y => y.AmountType == RewardAmountType.Relative)
                                    .OrderByDescending(y => y.Amount).FirstOrDefault();


            var absDiscountAmount = maxAbsoluteReward != null ? maxAbsoluteReward.Amount : 0;
            var relDiscountAmount = maxRelativeReward != null ? currentAmount * maxRelativeReward.Amount : 0;

            if (maxAbsoluteReward != null && maxRelativeReward != null)
            {
                if (absDiscountAmount > relDiscountAmount)
                {
                    retVal = maxAbsoluteReward;
                }
                else
                {
                    retVal = maxRelativeReward;
                }
            }
            else if (maxAbsoluteReward != null)
            {
                retVal = maxAbsoluteReward;
            }
            else if (maxRelativeReward != null)
            {
                retVal = maxRelativeReward;
            }

            return(retVal);
        }
 public virtual void TestGetRewardAmounts(AmountBasedReward reward, decimal price, int qty, decimal expectedResult)
 {
     Assert.Equal(reward.GetRewardAmount(price, qty), expectedResult);
 }