private static void TestBadStudentDetentionScenario() { calculateRequest = kernel.Get <ICalculateDetentionRequest>(); calculateRequest.RequestingFaculty = facultyService.Get().InternalList.First(); calculateRequest.RuleCalculationMode = kernel.Get <IRuleCalculationMode>(); calculateRequest.RuleCalculationMode.CalculationType = RuleCalculationModeType.Consecutive; calculateRequest.Student = studentService.Get().InternalList.Where(x => x.RollNumber == "003").First(); // Has 2 offences (1 hour and 2 hours detention) registered calculateRequest.DetentionStartTime = DateTime.Now; var response = detentionCalculatorService.CalculateDetention(calculateRequest); if (response == null || response.DetentionPeriodInHours != 1.1 * 3.0) { throw new Exception("TestGoodStudentDetentionScenario (Consecutive) failed"); } else { Console.WriteLine("TestGoodStudentDetentionScenario (Consecutive) Success."); } calculateRequest.RuleCalculationMode.CalculationType = RuleCalculationModeType.Concurrent; response = detentionCalculatorService.CalculateDetention(calculateRequest); if (response == null || response.DetentionPeriodInHours != 1.1 * 2.0) { throw new Exception("TestGoodStudentDetentionScenario (Concurrent) failed"); } else { Console.WriteLine("TestGoodStudentDetentionScenario (Concurrent) Success."); } }
public void SetUp() { kernel = new StandardKernel(); kernel.Load(Assembly.GetExecutingAssembly()); studentService = kernel.Get <IStudentCRUDService>(); facultyService = kernel.Get <IFacultyCRUDService>(); calculateRequest = kernel.Get <ICalculateDetentionRequest>(); calculateRequest.RuleCalculationMode = kernel.Get <IRuleCalculationMode>(); calculateRequest.RequestingFaculty = facultyService.Get().InternalList.First(); detentionCalculatorService = kernel.Get <IDetentionCalculatorService>(); }
private static void TestGoodStudentDetentionScenario(RuleCalculationModeType calculationType) { calculateRequest = kernel.Get <ICalculateDetentionRequest>(); calculateRequest.RequestingFaculty = facultyService.Get().InternalList.First(); calculateRequest.RuleCalculationMode = kernel.Get <IRuleCalculationMode>(); calculateRequest.RuleCalculationMode.CalculationType = calculationType; calculateRequest.Student = studentService.Get().InternalList.Where(x => x.RollNumber == "002").First(); // Has 1 offence (1.5 hours detention) registered calculateRequest.DetentionStartTime = DateTime.Now; var response = detentionCalculatorService.CalculateDetention(calculateRequest); if (response == null || response.DetentionPeriodInHours != 0.9 * 1.5) { throw new Exception("TestGoodStudentDetentionScenario failed"); } else { Console.WriteLine("TestGoodStudentDetentionScenario Success."); } }
private static void TestNoDetentionScenario(RuleCalculationModeType calculationType) { calculateRequest = kernel.Get <ICalculateDetentionRequest>(); calculateRequest.RequestingFaculty = facultyService.Get().InternalList.First(); calculateRequest.RuleCalculationMode = kernel.Get <IRuleCalculationMode>(); calculateRequest.RuleCalculationMode.CalculationType = calculationType; calculateRequest.Student = studentService.Get().InternalList.Where(x => x.RollNumber == "001").First(); // Has no offence registered calculateRequest.DetentionStartTime = DateTime.Now; var response = detentionCalculatorService.CalculateDetention(calculateRequest); if (response != null) { throw new Exception("TestNoDetentionScenario failed. Student should not get detention since has no offence registered against him/her."); } else { Console.WriteLine("TestNoDetentionScenario Success."); } }
private static void TestDetentionLimitExceedingScenario() { try { calculateRequest = kernel.Get <ICalculateDetentionRequest>(); calculateRequest.RequestingFaculty = facultyService.Get().InternalList.First(); calculateRequest.RuleCalculationMode = kernel.Get <IRuleCalculationMode>(); calculateRequest.RuleCalculationMode.CalculationType = RuleCalculationModeType.Consecutive; calculateRequest.Student = studentService.Get().InternalList.Where(x => x.RollNumber == "004").First(); // Has 5 offences (2 hour each detention) registered calculateRequest.DetentionStartTime = DateTime.Now; var response = detentionCalculatorService.CalculateDetention(calculateRequest); if (response == null || response.DetentionPeriodInHours > 8.0) { throw new Exception("TestDetentionLimitExceedingScenario (Consecutive) failed"); } } catch (DetentionExceedsDayLimitException ex) { Console.WriteLine("TestGoodStudentDetentionScenario (Consecutive) Success."); Console.WriteLine("Actual detention hours received: " + ex.CalculateDetentionResponse.DetentionPeriodInHours); } }
public ICalculateDetentionResponse Calculate(ICalculateDetentionRequest request) { List <DetentionForOffence> initialDetentionList = new List <DetentionForOffence>(); if (request != null) { var detentionRules = GetDetentionRules(); var standardDetentions = this.StandardDetentionForOffenceService.Get(); var studentOffences = this.StudentOffenceCRUDService.Get(request.Student); if (detentionRules != null && detentionRules.Count() > 0 && studentOffences != null && studentOffences.InternalList.Count > 0) { var offenceList = studentOffences.InternalList.Select(so => so.Offence); detentionRules.ToList().ForEach(dr => { var intermediateList = dr.GetDetention(offenceList, standardDetentions); if (intermediateList != null) { initialDetentionList.AddRange(intermediateList); } } ); } var orchestrationStrategies = GetOrchestrationStrategies(request.RuleCalculationMode); if (orchestrationStrategies != null && orchestrationStrategies.Count() > 0) { orchestrationStrategies.ToList().ForEach(os => initialDetentionList = os.FinalizeDetention(initialDetentionList)); } } var response = this.DetentionForOffenceToCalculateDetentionResponseConverter.Convert(initialDetentionList, request); if (response != null && response.DetentionPeriodInHours > Constants.DetentionPeriodLimitForADay) { throw new DetentionExceedsDayLimitException(response); } return(response); }
public ICalculateDetentionResponse CalculateDetention(ICalculateDetentionRequest request) { return(this.DetentionCalculator.Calculate(request)); }
public ICalculateDetentionResponse Convert(IEnumerable <DetentionForOffence> detentionForOffenceList, ICalculateDetentionRequest request) { if (request != null && detentionForOffenceList != null && detentionForOffenceList.Count() > 0) { CalculateDetentionResponse response = new CalculateDetentionResponse { CalculateDetentionRequest = request, StudentDetentionList = new StudentDetentionList() }; DateTime detentionStartTime = request.DetentionStartTime; detentionForOffenceList.ToList().ForEach(d => { response.StudentDetentionList.InternalList.Add(new StudentDetention { DetentionInHours = d.DetentionInHours, DetentionStartTime = detentionStartTime, DetentionEndTime = detentionStartTime.AddHours(d.DetentionInHours) }); detentionStartTime = detentionStartTime.AddHours(d.DetentionInHours); } ); return(response); } return(null); }