Exemplo n.º 1
0
        public async Task <IActionResult> UpdateScores(string winnerId, string loserId)
        {
            var winnerImage = await repository.RetrieveAsync(winnerId);

            var loserImage = await repository.RetrieveAsync(loserId);

            if (winnerImage is null || loserImage is null)
            {
                return(NotFound());
            }

            var expectedScoreWinner = eloRatingCalculator.ComputeExpectation(
                winnerImage.Score, loserImage.Score);
            var expectedScoreLoser = eloRatingCalculator.ComputeExpectation(
                loserImage.Score, winnerImage.Score);

            winnerImage.Score = eloRatingCalculator.ComputeRating(
                winnerImage.Score, expectedScoreWinner, constants.ScoreWhenWin, constants.KFactor);
            loserImage.Score = eloRatingCalculator.ComputeRating(
                loserImage.Score, expectedScoreLoser, constants.ScoreWhenLose, constants.KFactor);

            winnerImage.Votes++;

            bool?success = await repository.SaveChangesAsync();

            if (success is null)
            {
                return(StatusCode(StatusCodes.Status500InternalServerError));
            }
            else
            {
                return(Ok());
            }
        }
Exemplo n.º 2
0
        public void ComputeExpectation_ratingsGiven_ShouldReturnExpectation()
        {
            // Arrange
            decimal             ratingA          = 123.4M;
            decimal             ratingB          = 865.23M;
            decimal             expectation      = (decimal)(1 / (1 + Math.Pow(10, (double)((ratingB - ratingA) / 400))));
            EloRatingCalculator ratingCalculator = new EloRatingCalculator();

            // Act
            decimal computedExpectation = ratingCalculator.ComputeExpectation(ratingA, ratingB);

            // Assert
            Assert.Equal(expectation, computedExpectation);
        }