public void Should_Evaluate_Predictions_Result_Correctly()
        {
            var matchesJson = File.ReadAllText("Fixtures/Json/matches.json");

            var matches     = JsonConvert.DeserializeObject <IEnumerable <Match> >(matchesJson, _settings).ToList();
            var predictions = matches.SelectMany(m => m.Predictions).ToList();
            var experts     = predictions.GroupBy(p => p.Expert).Select(g => g.Key).ToList();

            predictions.Count.ShouldBe(4);
            experts.Count.ShouldBe(2);

            var expert1 = experts[0];
            var expert2 = experts[1];

            var expertResults = new ExpertsResultAccumulator(matches);

            var expertResultsTable = expertResults.ExpertsTable;


            expertResultsTable.Count.ShouldBe(2);

            expert1.Nickname.ShouldBe("Mike");
            expertResultsTable[expert1].Scores.ShouldBe(1);
            expertResultsTable[expert1].Differences.ShouldBe(1);
            expertResultsTable[expert1].Outcomes.ShouldBe(0);

            expert2.Nickname.ShouldBe("John");
            expertResultsTable[expert2].Scores.ShouldBe(0);
            expertResultsTable[expert2].Differences.ShouldBe(0);
            expertResultsTable[expert2].Outcomes.ShouldBe(1);
        }
        public async Task <IEnumerable <ExpertStatsReadDto> > Handle(GetExpertStats request,
                                                                     CancellationToken cancellationToken = default(CancellationToken))
        {
            var tourId = request.TourId;
            var tour   = await _context
                         .Tours
                         .FetchWithBasePredictionsInfo(FetchMode.ForRead)
                         .WithIdAsync(tourId, cancellationToken);

            var matches          = tour.Matches;
            var threePointSystem = new DefaultPredictionPointSystem();

            var expertResults             = new ExpertsResultAccumulator(matches);
            var predictionResultsByExpert = expertResults.ExpertsTable;
            var expertStats = _statService.DenormalizePredictionResultsToDto(predictionResultsByExpert, threePointSystem);

            return(expertStats.OrderBy(s => s.Sum));
        }