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);
        }
Esempio n. 2
0
        /// <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);
        }