Example #1
0
        public IActionResult GetQuestionData(int id)
        {
            var questionSpecification = new QuizQuestionSpecification(id);
            var question = _questionRepository.Query(questionSpecification).First();

            var answerSpecification = new QuizAnswerSpecification(questionId: id);
            var answers             = _answerRepository.Query(answerSpecification);

            question.Answers = answers;

            return(Ok(question));
        }
Example #2
0
        public QuizResult EndGame(User user, bool won = true, bool timeOver = false)
        {
            var gameIndex = _runningGames.FindIndex(g => g.UserId == user.UserId);

            // TODO: Throw error if no game has been found (gameIndex = -1)

            var runningGame = _runningGames[gameIndex];

            _runningGames.RemoveAt(gameIndex);

            var game = new Game
            {
                Start  = runningGame.TimeStarted,
                UserId = user.UserId
            };
            var gameId = _gameRepository.Create(game);

            if (runningGame.CurrentQuestion != null)
            {
                runningGame.CurrentQuestion.TimeAnswered = DateTime.Now;
                runningGame.AskedQuestions.Add(runningGame.CurrentQuestion);
            }
            foreach (var question in runningGame.AskedQuestions)
            {
                var round = new Round
                {
                    Duration   = (int)(question.TimeAnswered - question.TimeAsked).TotalSeconds,
                    AnswerId   = question.AnsweredAnswer?.AnswerId,
                    GameId     = gameId,
                    QuestionId = question.QuestionId,
                    UsedJoker  = question.JokerUsed
                };
                _roundRepository.Create(round);
            }

            foreach (var category in runningGame.Categories)
            {
                var categoryGame = new CategoryGame(category, gameId);
                _categoryGameRepository.Create(categoryGame);
            }

            var result = runningGame.End(won, timeOver);

            var questionId = runningGame.CurrentQuestion?.QuestionId ??
                             runningGame.AskedQuestions.Last().QuestionId;
            var answerSpecification =
                new QuizAnswerSpecification(questionId: questionId, correct: true);
            var answer = _answerRepository.Query(answerSpecification).First();

            result.CorrectAnswer = answer.Answer;

            return(result);
        }
Example #3
0
        public List <QuizQuestion> GetQuestions(int categoryId)
        {
            var quizQuestionSpecification = new QuizQuestionSpecification(categoryId: categoryId);
            var quizQuestions             = _questionRepository.Query(quizQuestionSpecification);

            foreach (var question in quizQuestions)
            {
                var quizAnswerSpecification = new QuizAnswerSpecification(questionId: question.QuestionId);
                var quizAnswers             = _answerRepository.Query(quizAnswerSpecification);
                question.Answers = quizAnswers;
            }

            return(quizQuestions);
        }
Example #4
0
        public void DeleteQuestion(int id)
        {
            var quizAnswerSpecification = new QuizAnswerSpecification(questionId: id);
            var quizAnswers             = _answerRepository.Query(quizAnswerSpecification);

            foreach (var answer in quizAnswers)
            {
                _answerRepository.Delete(answer);
            }

            var quizQuestionSpecification = new QuizQuestionSpecification(id);
            var quizQuestion = _questionRepository.Query(quizQuestionSpecification).First();

            _questionRepository.Delete(quizQuestion);
        }
Example #5
0
        public void TestAskQuestion()
        {
            var quizQuestion = _questionRepository.List.First();

            var answerSpecification = new QuizAnswerSpecification(questionId: quizQuestion.QuestionId);
            var quizAnswers         = _answerRepository.Query(answerSpecification);

            quizQuestion.Answers = quizAnswers;

            var question = new GameQuestion(quizQuestion, 0, 0);

            var game = new RunningGame(0, new[] { 0 });

            game.AskQuestion(question);

            Assert.Equal(question, game.CurrentQuestion);
        }
Example #6
0
        public void TestUseJoker()
        {
            var quizQuestion = _questionRepository.List.First();

            var answerSpecification = new QuizAnswerSpecification(questionId: quizQuestion.QuestionId);
            var quizAnswers         = _answerRepository.Query(answerSpecification);

            quizQuestion.Answers = quizAnswers;

            var question = new GameQuestion(quizQuestion, 0, 0);

            var game = new RunningGame(0, new[] { 0 });

            game.AskQuestion(question);

            game.UseJoker();

            Assert.True(game.JokerUsed);
        }
Example #7
0
        public IQuestion <GameAnswer> GetQuestion(User user)
        {
            var gameIndex = _runningGames.FindIndex(g => g.UserId == user.UserId);
            var game      = _runningGames[gameIndex];

            // TODO: Throw error if no game has been found
            // TODO: Check if current question is unanswered

            var quizQuestionSpecification =
                new QuizQuestionSpecification(categories: game.Categories, excludeQuestions: game.QuestionIds);
            var quizQuestions = _questionRepository.Query(quizQuestionSpecification);

            var          random = new Random();
            QuizQuestion quizQuestion;

            if (quizQuestions.Count != 0)
            {
                var index = random.Next(quizQuestions.Count);
                quizQuestion = quizQuestions[index];
            }
            else
            {
                throw new NoMoreQuestionsException(
                          "There are no more questions available in the selected categories for this quiz!");
            }

            var quizAnswerSpecification = new QuizAnswerSpecification(questionId: quizQuestion.QuestionId);
            var quizAnswers             = _answerRepository.Query(quizAnswerSpecification);

            quizQuestion.Answers = quizAnswers;

            var correctAnswer = quizAnswers.First(a => a.Correct);

            var roundSpecification = new RoundSpecification(questionId: quizQuestion.QuestionId);
            var rounds             = _roundRepository.Query(roundSpecification);
            var correctlyAnswered  = rounds.Count(r => r.AnswerId == correctAnswer.AnswerId);

            var question = new GameQuestion(quizQuestion, rounds.Count, correctlyAnswered);

            _runningGames[gameIndex].AskQuestion(question);

            return(question);
        }
Example #8
0
        public void TestAnswerQuestionIncorrect()
        {
            var quizQuestion = _questionRepository.List.First();

            var answerSpecification = new QuizAnswerSpecification(questionId: quizQuestion.QuestionId);
            var quizAnswers         = _answerRepository.Query(answerSpecification);

            quizQuestion.Answers = quizAnswers;

            var question = new GameQuestion(quizQuestion, 0, 0);

            var game = new RunningGame(0, new[] { 0 });

            game.AskQuestion(question);

            var answer = quizAnswers.First(a => !a.Correct);

            var result = game.AnswerQuestion(answer);

            Assert.True(!result.Correct);
        }
Example #9
0
        public void TestEndGame()
        {
            var quizQuestion = _questionRepository.List.First();

            var answerSpecification = new QuizAnswerSpecification(questionId: quizQuestion.QuestionId);
            var quizAnswers         = _answerRepository.Query(answerSpecification);

            quizQuestion.Answers = quizAnswers;

            var question = new GameQuestion(quizQuestion, 0, 0);

            var game = new RunningGame(0, new[] { 0 });

            game.AskQuestion(question);

            var answer       = quizAnswers.First(a => a.Correct);
            var answerResult = game.AnswerQuestion(answer);

            var result = game.End(answerResult.Correct && !answerResult.TimeOver, answerResult.TimeOver);

            Assert.Equal(30, result.Points);
        }
Example #10
0
        public void TestUseJoker()
        {
            var quizQuestion = _questionRepository.List.First();

            var answerSpecification = new QuizAnswerSpecification(questionId: quizQuestion.QuestionId);
            var quizAnswers         = _answerRepository.Query(answerSpecification);

            quizQuestion.Answers = quizAnswers;

            // Would be much better:

            /*
             * var question = new GameQuestion(quizQuestion, quizAnswers, 0, 0);
             */

            var question = new GameQuestion(quizQuestion, 0, 0);

            question.UseJoker();

            var hiddenAnswers = question.Answers.Where(a => a.HiddenAnswer);

            Assert.Equal(2, hiddenAnswers.Count());
        }
Example #11
0
        public dynamic AnswerQuestion(User user, int questionId, int answerId)
        {
            var gameIndex = _runningGames.FindIndex(g => g.UserId == user.UserId);

            // TODO: Throw error if no game has been found (gameIndex = -1)

            var quizQuestionSpecification = new QuizQuestionSpecification(questionId);
            var quizQuestion = _questionRepository.Query(quizQuestionSpecification).FirstOrDefault();

            // TODO: Check if question doesn't exist
            // TODO: Check if question is the currently asked question

            var quizAnswerSpecification = new QuizAnswerSpecification(answerId, questionId);
            var quizAnswer = _answerRepository.Query(quizAnswerSpecification).FirstOrDefault();

            // TODO: Check if answerId is valid

            var result = _runningGames[gameIndex].AnswerQuestion(quizAnswer);

            return(result.Correct && !result.TimeOver
                ? (dynamic)result
                : EndGame(user, result.Correct && !result.TimeOver, result.TimeOver));
        }
Example #12
0
        public List <Game> GetGames(User user = null)
        {
            var games = _gameRepository.List.ToList(); // Grab all the games to calculate the rank

            foreach (var game in games)
            {
                var roundSpecification = new RoundSpecification(game.GameId);
                var rounds             = _roundRepository.Query(roundSpecification);
                game.Rounds = rounds;

                var lastAnswerSpecification = new QuizAnswerSpecification(rounds.Last().AnswerId);
                var lastAnswer = _answerRepository.Query(lastAnswerSpecification).First();

                var gameWon = lastAnswer.Correct && rounds.Last().Duration <= 120;

                int duration = 0;
                int points   = 0;

                foreach (var round in rounds)
                {
                    duration += round.Duration;

                    if (!gameWon)
                    {
                        continue;
                    }

                    var answerSpecification = new QuizAnswerSpecification(round.AnswerId);
                    var answer = _answerRepository.Query(answerSpecification).First();
                    if (answer.Correct)
                    {
                        points += 30;
                    }
                }

                game.Duration = duration;
                game.Points   = points;

                game.WeightedPoints = game.Points / Math.Max(game.Duration, 1);

                var categoryGameSpecification = new CategoryGameSpecification(gameId: game.GameId);
                var categoryGames             = _categoryGameRepository.Query(categoryGameSpecification);
                foreach (var categoryGame in categoryGames)
                {
                    game.Categories.Add(categoryGame.CategoryId);
                }

                if (user != null && game.UserId != user.UserId)
                {
                    continue; // Saves time by not grabbing information for unneeded games
                }
            }

            var weightedPointsComparer = new GameWeightedPointsComparer();

            games.Sort(weightedPointsComparer);

            if (user != null)
            {
                games = games.Where(g => g.UserId == user.UserId || g.Points > 0 && !g.Hidden).ToList();

                var currRank = 1;
                foreach (var game in games)
                {
                    if (game.Points <= 0 || game.Hidden)
                    {
                        continue;
                    }
                    game.Rank = currRank;
                    currRank++;
                }

                games = games.Where(g => g.UserId == user.UserId).ToList();
                var dateComparer = new GameDateComparer();
                games.Sort(dateComparer);
            }
            else
            {
                games = games.Where(g => g.Points > 0 && !g.Hidden).ToList();

                for (int i = 0; i < games.Count; i++)
                {
                    games[i].Rank = i + 1;
                }
            }

            return(games);
        }