예제 #1
0
 public CarParkingResponse GetCarParkingDetails(CarParkingRequest request)
 {
     return(new CarParkingResponse
     {
         Description = "Night Rate",
         TotalPrice = 6.5m
     });
 }
예제 #2
0
 public CarParkingResponse GetCarParkingDetails(CarParkingRequest request)
 {
     return(new CarParkingResponse
     {
         Description = "Early Bird",
         TotalPrice = 13
     });
 }
예제 #3
0
 public CarParkingResponse GetCarParkingDetails(CarParkingRequest request)
 {
     return(new CarParkingResponse
     {
         Description = "Weekend Rate",
         TotalPrice = 10
     });
 }
예제 #4
0
 public bool CheckApplicableRate(CarParkingRequest request)
 {
     return(request.Entry.DayOfWeek != DayOfWeek.Saturday &&
            request.Entry.DayOfWeek != DayOfWeek.Sunday &&
            request.Entry.IsBetween(18, 24) &&
            request.Exit.IsBetween(18, 6) &&
            (
                request.Exit.Day == request.Entry.Day ||
                request.Exit.Day == request.Entry.Day + 1
            ));
 }
예제 #5
0
        public void TestCheckApplicableRate(string description, string entry, string exit, bool expectedIsApplicable)
        {
            var request = new CarParkingRequest
            {
                Entry = DateTime.Parse(entry),
                Exit  = DateTime.Parse(exit)
            };

            var isApplicable = _rate.CheckApplicableRate(request);

            isApplicable.Should().Be(expectedIsApplicable);
        }
예제 #6
0
        public void TestCheckApplicableRate(string description, string entry, string exit, decimal expectedTotalCost)
        {
            var request = new CarParkingRequest
            {
                Entry = DateTime.Parse(entry),
                Exit  = DateTime.Parse(exit)
            };

            var pricingResponse = _rate.GetCarParkingDetails(request);

            pricingResponse.TotalPrice.Should().Be(expectedTotalCost);
        }
예제 #7
0
        public CarParkingResponse GetCarParkingDetails(CarParkingRequest request)
        {
            var hourlyCost = CalculateRate(request, x => x.TotalHours, HourlyRate);

            var dailyCost = CalculateRate(request, x => x.TotalDays, DailyRate);

            return(new CarParkingResponse
            {
                Description = "Standard Rate",
                TotalPrice = Math.Min(hourlyCost, dailyCost)
            });
        }
예제 #8
0
        public CarParkingResponse GetCarParkingDetails(CarParkingRequest request)
        {
            if (request.Exit < request.Entry)
            {
                throw new Exception("Entry must be earlier than Exit");
            }

            return(_rates
                   .Where(x => x.CheckApplicableRate(request))
                   .Select(x => x.GetCarParkingDetails(request))
                   .OrderBy(x => x.TotalPrice)
                   .First());
        }
예제 #9
0
        public IActionResult GetCarParkingDetails(DateTime startDate, DateTime endDate)
        {
            try
            {
                CarParkingRequest request = new CarParkingRequest
                {
                    Entry = startDate,
                    Exit  = endDate
                };

                var carParkingResponse = _service.GetCarParkingDetails(request);
                return(Ok(carParkingResponse));
            }
            catch (Exception ex)
            {
                return(StatusCode(500));
            }
        }
예제 #10
0
 public bool CheckApplicableRate(CarParkingRequest request)
 {
     return(request.Entry.Day == request.Exit.Day &&
            request.Entry.IsBetween(6, 9) &&
            request.Exit.IsBetween(15.5, 23.5));
 }
예제 #11
0
 public bool CheckApplicableRate(CarParkingRequest request)
 {
     return(request.Entry.IsWeekend() &&
            request.Exit.IsWeekend() &&
            request.Exit - request.Entry < TimeSpan.FromDays(2));
 }
예제 #12
0
        private decimal CalculateRate(CarParkingRequest request, Func <TimeSpan, double> selectFunc, decimal rate)
        {
            var duration = Math.Truncate(selectFunc(request.Exit - request.Entry));

            return((Convert.ToDecimal(duration) + 1) * rate);
        }
예제 #13
0
 public bool CheckApplicableRate(CarParkingRequest request)
 {
     return(true);
 }