private async Task TestTotalMaidens(StatisticsFilter filter, string whereClause, Dictionary <string, object> parameters, IEnumerable <Stoolball.Matches.Match> matches)
        {
            foreach (var player in _databaseFixture.TestData.Players)
            {
                filter.Player = player;
                parameters.Remove("PlayerId");
                parameters.Add("PlayerId", player.PlayerId);
                var queryBuilder = new Mock <IStatisticsQueryBuilder>();
                queryBuilder.Setup(x => x.BuildWhereClause(filter)).Returns((" AND PlayerId = @PlayerId" + whereClause, parameters));
                var dataSource = new SqlServerPlayerSummaryStatisticsDataSource(_databaseFixture.ConnectionFactory, queryBuilder.Object);

                var result = await dataSource.ReadBowlingStatistics(filter).ConfigureAwait(false);

                var maidens = matches.SelectMany(x => x.MatchInnings)
                              .SelectMany(x => x.BowlingFigures.Where(o => o.Bowler.Player.PlayerId == player.PlayerId && o.Maidens.HasValue))
                              .Sum(x => x.Maidens);

                Assert.NotNull(result);
                Assert.Equal(maidens, result.TotalMaidens);
            }
        }
        private async Task TestMostRunOuts(StatisticsFilter filter, string whereClause, Dictionary <string, object> parameters, IEnumerable <Stoolball.Matches.Match> matches)
        {
            foreach (var player in _databaseFixture.TestData.Players)
            {
                filter.Player = player;
                parameters.Remove("PlayerId");
                parameters.Add("PlayerId", player.PlayerId);
                var queryBuilder = new Mock <IStatisticsQueryBuilder>();
                queryBuilder.Setup(x => x.BuildWhereClause(filter)).Returns((" AND PlayerId = @PlayerId" + whereClause, parameters));
                var dataSource = new SqlServerPlayerSummaryStatisticsDataSource(_databaseFixture.ConnectionFactory, queryBuilder.Object);

                var result = await dataSource.ReadFieldingStatistics(filter).ConfigureAwait(false);

                var best = matches.SelectMany(x => x.MatchInnings)
                           .Where(i => i.PlayerInnings.Any(x => x.DismissalType == DismissalType.RunOut && x.DismissedBy != null && x.DismissedBy.Player.PlayerId == player.PlayerId))
                           .Select(i => i.PlayerInnings.Count(x => x.DismissalType == DismissalType.RunOut && x.DismissedBy != null && x.DismissedBy.Player.PlayerId == player.PlayerId))
                           .OrderByDescending(x => x)
                           .FirstOrDefault();

                Assert.Equal(best, result.MostRunOuts);
            }
        }