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()); } }
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); }