private void SetFreeTextAnswer(StudentTestSessionQuestion question, QuestionFreeTextAnswer answer)
        {
            Assert.NotNull(answer, nameof(answer));

            question.Answer.IsAnswered            = true;
            question.Answer.FreeTextAnswer.Answer = answer.Answer;
        }
        private void SetChoiceQuestionAnswer(StudentTestSessionQuestion question, ChoiceQuestionAnswer answer)
        {
            Assert.NotNull(answer, nameof(answer));

            question.Answer.IsAnswered            = true;
            question.Answer.ChoiceQuestionAnswers = answer.Answers.LeftJoin(
                question.Answer.ChoiceQuestionAnswers,
                source => source,
                destination => destination.OptionId,
                source => new StudentChoiceQuestionAnswer
            {
                OptionId = source,
            }, (source, destination) => destination)
                                                    .ToList();
        }
        private void SetAnswer(StudentTestSessionQuestion question, QuestionGenericAnswer answer)
        {
            switch (question.Question.Type)
            {
            case QuestionType.FreeText:
                SetFreeTextAnswer(question, answer.FreeTextAnswer);
                return;

            case QuestionType.QuestionWithChoice:
                SetChoiceQuestionAnswer(question, answer.ChoiceQuestionAnswer);
                return;

            default:
                throw new InvalidEnumArgumentException(
                          nameof(question.Question.Type),
                          (int)question.Question.Type,
                          typeof(QuestionType));
            }
        }
        public async Task Answer(Guid questionId, QuestionGenericAnswer answer)
        {
            // TODO: add includes to optimize query
            var queryParameters = new StudentTestSessionQuestionQueryParameters
            {
                StudentId  = _executionContextService.GetCurrentUserId(),
                IsReadOnly = false,
                Id         = questionId,
            };
            StudentTestSessionQuestion question = await _unitOfWork.GetSingle(queryParameters);

            await _studentQuestionValidationService.ThrowIfCannotAnswer(question.StudentTestSessionId);

            SetAnswer(question, answer);

            await _unitOfWork.Update(question);

            await _unitOfWork.Commit();
        }