private void GetMultiChoiceResult(Question _question, MultiChoiceAnswer multiChoiceAnswer, ref uint count) { var question = _question as MultiChoiceQuestion; _context.Entry(question).Collection(x => x.Options).Load(); _context.Entry(multiChoiceAnswer).Collection(x => x.AnswerOptions).Load(); // count Score int countChecked = 0, countWrong = 0; float countOptions = multiChoiceAnswer.AnswerOptions.Count; if (multiChoiceAnswer.AnswerOptions == null || multiChoiceAnswer.AnswerOptions.Count == 0) { multiChoiceAnswer.Score = 0; multiChoiceAnswer.Result = null; } else { foreach (var answerOption in multiChoiceAnswer.AnswerOptions) { var rightAnswer = question.Options.Single(o => o.Id == answerOption.OptionId).IsRight; if (rightAnswer) { countChecked++; } if (answerOption.Checked != rightAnswer) { countWrong++; } } var score = question.Score * (countChecked - countWrong) / (float)countChecked; multiChoiceAnswer.Score = score; if (Math.Abs(multiChoiceAnswer.Score - question.Score) < EPSILON) { count++; multiChoiceAnswer.Result = AnswerResult.Right; } else { if (Math.Abs(multiChoiceAnswer.Score) < EPSILON) { multiChoiceAnswer.Result = AnswerResult.Wrong; } else { multiChoiceAnswer.Result = AnswerResult.PartiallyRight; } } } _context.MultiChoiceAnswers.Update(multiChoiceAnswer); }
public async Task <IActionResult> Start(int testResultId, ErrorViewModel model) { var user = await _userManager.GetUserAsync(HttpContext.User); var testResult = await _context.TestResults .Include(tr => tr.Test) .ThenInclude(t => t.Questions) .SingleAsync(t => t.Id == testResultId); if (testResult == null) { return(NotFound()); } if (!testResult.Test.IsEnabled) { return(Forbid()); } var questions = testResult.Test.Questions.Where(q => !q.IsDeleted).ToList(); if (questions.Count() == 0) { return(NotFound()); } if (_context.Answers.Any(a => a.TestResult == testResult)) { return(RedirectToAction("Answer", "Answer", new { testResultId = testResult.Id, answerId = _context.Answers.Where(a => a.TestResult == testResult) .SingleOrDefault(a => a.Order == 1).Id })); } var answers = new List <Answer>(); Answer answer = null; if (testResult.Test.Count != 0 && testResult.Test.Count < questions.Count && testResult.Test.Shuffled) { var order = new ushort[testResult.Test.Count]; for (var i = 0; i < order.Length; i++) { order[i] = (ushort)(i + 1); } if (testResult.Test.Shuffled) { Shuffle(order); } var j = 0; Shuffle(questions); for (var k = 0; k < order.Length; k++) { var question = questions[k]; switch (question.QuestionType) { case "SingleChoiceQuestion": answer = new SingleChoiceAnswer(); break; case "MultiChoiceQuestion": answer = new MultiChoiceAnswer(); break; case "TextQuestion": answer = new TextAnswer(); break; case "DragAndDropQuestion": answer = new DragAndDropAnswer(); break; case "CodeQuestion": answer = new CodeAnswer(); break; } if (answer == null) { throw new NullReferenceException(); } answer.Result = null; answer.Question = question; answer.Score = 0; answer.TestResult = testResult; answer.Order = order[j++]; await _context.Answers.AddAsync(answer); answers.Add(answer); await _context.SaveChangesAsync(); } } else { var order = new ushort[questions.Count()]; for (var i = 0; i < order.Length; i++) { order[i] = (ushort)(i + 1); } if (testResult.Test.Shuffled) { Shuffle(order); } var j = 0; foreach (var question in questions) { switch (question.QuestionType) { case "SingleChoiceQuestion": answer = new SingleChoiceAnswer(); break; case "MultiChoiceQuestion": answer = new MultiChoiceAnswer(); break; case "TextQuestion": answer = new TextAnswer(); break; case "DragAndDropQuestion": answer = new DragAndDropAnswer(); break; case "CodeQuestion": answer = new CodeAnswer(); break; } if (answer == null) { throw new NullReferenceException(); } answer.Question = question; answer.Score = 0; answer.TestResult = testResult; answer.Order = order[j++]; await _context.Answers.AddAsync(answer); answers.Add(answer); await _context.SaveChangesAsync(); } } testResult.StartedOn = DateTime.UtcNow; _context.TestResults.Update(testResult); await _context.SaveChangesAsync(); // TODO: redirect to first answer (question) //throw new NotImplementedException(); return(RedirectToAction("Answer", "Answer", new { testResultId = testResult.Id, answerId = answers.SingleOrDefault(a => a.Order == 1).Id })); }
private void StartTest(User user, TestResult testResult, Test test) { var answers = new List <Answer>(); Answer answer = null; var questions = testResult.Test.Questions.Where(q => !q.IsDeleted).ToList(); testResult.TotalQuestions = (uint)questions.Count; if (test.Count != 0 && test.Count < test.Questions.Count && testResult.Test.Shuffled) { var order = new ushort[testResult.Test.Count]; for (var i = 0; i < order.Length; i++) { order[i] = (ushort)(i + 1); } var j = 0; for (var k = 0; k < order.Length; k++) { var question = questions[k]; switch (question.QuestionType) { case "SingleChoiceQuestion": answer = new SingleChoiceAnswer(); break; case "MultiChoiceQuestion": answer = new MultiChoiceAnswer(); break; case "TextQuestion": answer = new TextAnswer(); break; case "DragAndDropQuestion": answer = new DragAndDropAnswer(); break; case "CodeQuestion": answer = new CodeAnswer(); break; } if (answer == null) { throw new NullReferenceException(); } answer.Result = null; answer.Question = question; answer.Score = 0; answer.TestResult = testResult; answer.Order = order[j++]; _context.Answers.Add(answer); answers.Add(answer); _context.SaveChanges(); } } else { var order = new ushort[questions.Count()]; for (var i = 0; i < order.Length; i++) { order[i] = (ushort)(i + 1); } var j = 0; foreach (var question in questions) { switch (question.QuestionType) { case "SingleChoiceQuestion": answer = new SingleChoiceAnswer(); break; case "MultiChoiceQuestion": answer = new MultiChoiceAnswer(); break; case "TextQuestion": answer = new TextAnswer(); break; case "DragAndDropQuestion": answer = new DragAndDropAnswer(); break; case "CodeQuestion": answer = new CodeAnswer(); break; } if (answer == null) { throw new NullReferenceException(); } answer.Question = question; answer.Score = 0; answer.TestResult = testResult; answer.Order = order[j++]; _context.Answers.Add(answer); answers.Add(answer); _context.SaveChanges(); } } testResult.StartedOn = DateTime.UtcNow; _context.TestResults.Update(testResult); _context.SaveChanges(); }