public void MapJugementMajoritaireResultatModelToResultat() { var scrutinModel = new VotingProcessModel { Id = 52 }; var choice1 = new ChoiceModel { Id = 1, Value = 1 }; var choice2 = new ChoiceModel { Id = 2, Value = 2 }; var optionVainqueur = new OptionsModel { Id = 28, Name = "Winner" }; var optionPerdant = new OptionsModel { Id = 32, Name = "Loser" }; var resultatGagnant = new ResultatIndividualMajorityJudgmentModel { Option = optionVainqueur, Median = choice1, PercentageScoreInfMedian = 38m, PercentageScoreSupMedian = 42m }; var resultatPerdant = new ResultatIndividualMajorityJudgmentModel { Option = optionPerdant, Median = choice2, PercentageScoreInfMedian = 40m, PercentageScoreSupMedian = 36m }; var resultatModel = new ResultatMajoritaryJudgmentModel { Id = 96, IsValidResult = true, Voters = 4, Winner = optionVainqueur, IndividualResults = { resultatGagnant, resultatPerdant } }; var resultat = _mapper.MapResultatModelToResultat(scrutinModel, resultatModel); Check.That(resultat.IdVotingProcess).IsEqualTo(scrutinModel.Id); Check.That(resultat.IsValid).IsEqualTo(resultatModel.IsValidResult); Check.That(resultat.NbVoters).IsEqualTo(resultatModel.Voters); Check.That(resultat.IdWinningOption).IsEqualTo(resultatModel.Winner.Id); var scoreDetails = JsonConvert.DeserializeObject <List <ResultatIndividualMajorityJudgmentModel> >(resultat.ScoreDetail); Check.That(scoreDetails[0].PercentageScoreInfMedian).IsEqualTo(resultatGagnant.PercentageScoreInfMedian); Check.That(scoreDetails[0].PercentageScoreSupMedian).IsEqualTo(resultatGagnant.PercentageScoreSupMedian); Check.That(scoreDetails[0].Median.Id).IsEqualTo(resultatGagnant.Median.Id); Check.That(scoreDetails[0].Option.Id).IsEqualTo(resultatGagnant.Option.Id); Check.That(scoreDetails[1].PercentageScoreInfMedian).IsEqualTo(resultatPerdant.PercentageScoreInfMedian); Check.That(scoreDetails[1].PercentageScoreSupMedian).IsEqualTo(resultatPerdant.PercentageScoreSupMedian); Check.That(scoreDetails[1].Median.Id).IsEqualTo(resultatPerdant.Median.Id); Check.That(scoreDetails[1].Option.Id).IsEqualTo(resultatPerdant.Option.Id); }
/// <summary> /// Calculates the result. /// </summary> /// <param name="votingProcess">The voting process.</param> /// <returns></returns> /// <exception cref="VoteInException">Impossible to calculate the results : The voting process is null</exception> public IResultatModel CalculateResult(VotingProcessModel votingProcess) { if (votingProcess == null) { throw new VoteInException("Impossible to calculate the results : The voting process is null"); } var resultat = new ResultatMajoritaryJudgmentModel(); var nbSuffrage = 0m; foreach (var option in votingProcess.Options) { var individualResults = new ResultatIndividualMajorityJudgmentModel { Option = option }; var suffrageOrderedByAscending = option.Suffrages.OrderBy(s => s.Value).ToList(); nbSuffrage = option.Suffrages.Count; var medianValue = GetMediane(suffrageOrderedByAscending, nbSuffrage); individualResults.Median = votingProcess.PossibleChoices.First(c => c.Value == medianValue); var pourcentageScoreInfMediane = (suffrageOrderedByAscending.Count(s => s.Value < medianValue) / nbSuffrage) * 100; individualResults.PercentageScoreInfMedian = Math.Round(pourcentageScoreInfMediane, 2); var pourcentageScoreSupMediane = (suffrageOrderedByAscending.Count(s => s.Value > medianValue) / nbSuffrage) * 100; individualResults.PercentageScoreSupMedian = Math.Round(pourcentageScoreSupMediane, 2); foreach (var choice in votingProcess.PossibleChoices) { decimal votes = suffrageOrderedByAscending.Count(s => s.Value == choice.Value); var percentage = (votes / nbSuffrage) * 100; var score = new ScoreModel { Votes = suffrageOrderedByAscending.Count(s => s.Value == choice.Value), Choices = choice, Percentage = Math.Round(percentage, 2) }; individualResults.Scores.Add(score); } resultat.IndividualResults.Add(individualResults); } resultat.IndividualResults = resultat.IndividualResults.OrderByDescending(r => r.Median.Value) .ThenBy(r => r.PercentageScoreInfMedian) .ThenByDescending(r => r.PercentageScoreSupMedian).ToList(); var winner = resultat.IndividualResults.First(); var perfectEquality = resultat.IndividualResults.Any(r => r.Median.Value == winner.Median.Value && r.PercentageScoreInfMedian == winner.PercentageScoreInfMedian && r.PercentageScoreSupMedian == winner.PercentageScoreSupMedian && r != winner); resultat.Voters = (int)nbSuffrage; if (!perfectEquality) { resultat.Winner = winner.Option; resultat.IsValidResult = true; } return(resultat); }