public async Task Read_bowling_figures_supports_filter_by_season_id() { var filter = new StatisticsFilter { Paging = new Paging { PageSize = int.MaxValue }, Season = _databaseFixture.TestData.Competitions.First().Seasons.First() }; var queryBuilder = new Mock<IStatisticsQueryBuilder>(); queryBuilder.Setup(x => x.BuildWhereClause(filter)).Returns(("AND SeasonId = @SeasonId", new Dictionary<string, object> { { "SeasonId", _databaseFixture.TestData.Competitions.First().Seasons.First().SeasonId } })); var dataSource = new SqlServerBestPerformanceInAMatchStatisticsDataSource(_databaseFixture.ConnectionFactory, queryBuilder.Object); var results = await dataSource.ReadBowlingFigures(filter, StatisticsSortOrder.BestFirst).ConfigureAwait(false); var expected = _databaseFixture.TestData.Matches.Where(x => x.Season?.SeasonId == _databaseFixture.TestData.Competitions.First().Seasons.First().SeasonId) .SelectMany(x => x.MatchInnings) .SelectMany(x => x.BowlingFigures) .ToList(); Assert.Equal(expected.Count, results.Count()); foreach (var expectedFigures in expected) { Assert.NotNull(results.SingleOrDefault(x => x.Result.BowlingFiguresId == expectedFigures.BowlingFiguresId)); } }
public async Task Read_bowling_figures_supports_filter_by_date() { var dateRangeGenerator = new DateRangeGenerator(); var (fromDate, untilDate) = dateRangeGenerator.SelectDateRangeToTest(_databaseFixture.TestData.Matches); var filter = new StatisticsFilter { Paging = new Paging { PageSize = int.MaxValue }, FromDate = fromDate, UntilDate = untilDate }; var queryBuilder = new Mock<IStatisticsQueryBuilder>(); queryBuilder.Setup(x => x.BuildWhereClause(filter)).Returns((" AND MatchStartTime >= @FromDate AND MatchStartTime <= @UntilDate", new Dictionary<string, object> { { "FromDate", filter.FromDate }, { "UntilDate", filter.UntilDate } })); var dataSource = new SqlServerBestPerformanceInAMatchStatisticsDataSource(_databaseFixture.ConnectionFactory, queryBuilder.Object); var results = await dataSource.ReadBowlingFigures(filter, StatisticsSortOrder.BestFirst).ConfigureAwait(false); var expected = _databaseFixture.TestData.Matches.Where(x => x.StartTime >= filter.FromDate && x.StartTime <= filter.UntilDate) .SelectMany(x => x.MatchInnings) .SelectMany(x => x.BowlingFigures) .ToList(); Assert.Equal(expected.Count, results.Count()); foreach (var expectedFigures in expected) { Assert.NotNull(results.SingleOrDefault(x => x.Result.BowlingFiguresId == expectedFigures.BowlingFiguresId)); } }
public async Task Read_bowling_figures_returns_match() { var filter = new StatisticsFilter { Paging = new Paging { PageSize = int.MaxValue } }; var queryBuilder = new Mock<IStatisticsQueryBuilder>(); queryBuilder.Setup(x => x.BuildWhereClause(filter)).Returns((string.Empty, new Dictionary<string, object>())); var dataSource = new SqlServerBestPerformanceInAMatchStatisticsDataSource(_databaseFixture.ConnectionFactory, queryBuilder.Object); var results = await dataSource.ReadBowlingFigures(filter, StatisticsSortOrder.BestFirst).ConfigureAwait(false); foreach (var match in _databaseFixture.TestData.Matches) { foreach (var innings in match.MatchInnings) { foreach (var expectedBowler in innings.BowlingFigures) { var result = results.SingleOrDefault(x => x.Result.BowlingFiguresId == expectedBowler.BowlingFiguresId); Assert.NotNull(result); Assert.Equal(match.MatchRoute, result.Match.MatchRoute); Assert.Equal(match.StartTime, result.Match.StartTime); Assert.Equal(match.MatchName, result.Match.MatchName); } } } }
public async Task Read_total_player_innings_supports_filter_by_date() { var dateRangeGenerator = new DateRangeGenerator(); var(fromDate, untilDate) = dateRangeGenerator.SelectDateRangeToTest(_databaseFixture.TestData.Matches); var filter = new StatisticsFilter { FromDate = fromDate, UntilDate = untilDate }; var queryBuilder = new Mock <IStatisticsQueryBuilder>(); queryBuilder.Setup(x => x.BuildWhereClause(filter)).Returns((" AND MatchStartTime >= @FromDate AND MatchStartTime <= @UntilDate", new Dictionary <string, object> { { "FromDate", filter.FromDate }, { "UntilDate", filter.UntilDate } })); var dataSource = new SqlServerBestPerformanceInAMatchStatisticsDataSource(_databaseFixture.ConnectionFactory, queryBuilder.Object); var result = await dataSource.ReadTotalPlayerInnings(filter).ConfigureAwait(false); var expected = _databaseFixture.TestData.Matches.Where(x => x.StartTime >= filter.FromDate && x.StartTime <= filter.UntilDate) .SelectMany(x => x.MatchInnings) .SelectMany(x => x.PlayerInnings) .Count(x => x.RunsScored.HasValue); Assert.Equal(expected, result); }
public async Task Read_best_player_innings_sorts_by_highest_score_with_not_out_first() { var filter = new StatisticsFilter { Paging = new Paging { PageSize = int.MaxValue } }; var queryBuilder = new Mock <IStatisticsQueryBuilder>(); queryBuilder.Setup(x => x.BuildWhereClause(filter)).Returns((string.Empty, new Dictionary <string, object>())); var dataSource = new SqlServerBestPerformanceInAMatchStatisticsDataSource(_databaseFixture.ConnectionFactory, queryBuilder.Object); var results = await dataSource.ReadPlayerInnings(filter, StatisticsSortOrder.BestFirst).ConfigureAwait(false); var previousScore = int.MaxValue; var previousScoreWasOut = false; foreach (var result in results) { Assert.True(result.Result.RunsScored.Value <= previousScore); if (result.Result.RunsScored.Value == previousScore && previousScoreWasOut) { Assert.Contains(result.Result.DismissalType, StatisticsConstants.DISMISSALS_THAT_ARE_OUT); } previousScore = result.Result.RunsScored.Value; previousScoreWasOut = StatisticsConstants.DISMISSALS_THAT_ARE_OUT.Contains(result.Result.DismissalType); } }
public async Task Read_player_innings_pages_results() { const int pageSize = 10; var pageNumber = 1; var remaining = _databaseFixture.TestData.Matches.SelectMany(x => x.MatchInnings).SelectMany(x => x.PlayerInnings).Count(x => x.RunsScored.HasValue); while (remaining > 0) { var filter = new StatisticsFilter { Paging = new Paging { PageNumber = pageNumber, PageSize = pageSize } }; var queryBuilder = new Mock <IStatisticsQueryBuilder>(); queryBuilder.Setup(x => x.BuildWhereClause(filter)).Returns((string.Empty, new Dictionary <string, object>())); var dataSource = new SqlServerBestPerformanceInAMatchStatisticsDataSource(_databaseFixture.ConnectionFactory, queryBuilder.Object); var results = await dataSource.ReadPlayerInnings(filter, StatisticsSortOrder.LatestFirst).ConfigureAwait(false); var expected = pageSize > remaining ? remaining : pageSize; Assert.Equal(expected, results.Count()); pageNumber++; remaining -= pageSize; } }
public async Task Read_player_innings_supports_filter_by_team_id() { var filter = new StatisticsFilter { Paging = new Paging { PageSize = int.MaxValue }, Team = _databaseFixture.TestData.TeamWithFullDetails }; var queryBuilder = new Mock <IStatisticsQueryBuilder>(); queryBuilder.Setup(x => x.BuildWhereClause(filter)).Returns((" AND TeamId = @TeamId", new Dictionary <string, object> { { "TeamId", _databaseFixture.TestData.TeamWithFullDetails.TeamId } })); var dataSource = new SqlServerBestPerformanceInAMatchStatisticsDataSource(_databaseFixture.ConnectionFactory, queryBuilder.Object); var results = await dataSource.ReadPlayerInnings(filter, StatisticsSortOrder.BestFirst).ConfigureAwait(false); var expected = _databaseFixture.TestData.Matches.Where(x => x.Teams.Select(t => t.Team.TeamId).Contains(_databaseFixture.TestData.TeamWithFullDetails.TeamId.Value)) .SelectMany(x => x.MatchInnings.Where(i => i.BattingTeam.Team.TeamId == _databaseFixture.TestData.TeamWithFullDetails.TeamId.Value)) .SelectMany(x => x.PlayerInnings) .Where(x => x.RunsScored.HasValue).ToList(); Assert.Equal(expected.Count, results.Count()); foreach (var expectedInnings in expected) { Assert.NotNull(results.SingleOrDefault(x => x.Result.PlayerInningsId == expectedInnings.PlayerInningsId)); } }
public async Task Read_player_innings_returns_opposition_team() { var filter = new StatisticsFilter { Paging = new Paging { PageSize = int.MaxValue } }; var queryBuilder = new Mock <IStatisticsQueryBuilder>(); queryBuilder.Setup(x => x.BuildWhereClause(filter)).Returns((string.Empty, new Dictionary <string, object>())); var dataSource = new SqlServerBestPerformanceInAMatchStatisticsDataSource(_databaseFixture.ConnectionFactory, queryBuilder.Object); var results = await dataSource.ReadPlayerInnings(filter, StatisticsSortOrder.BestFirst).ConfigureAwait(false); var matchInnings = _databaseFixture.TestData.Matches.SelectMany(x => x.MatchInnings); foreach (var innings in matchInnings) { foreach (var playerInnings in innings.PlayerInnings.Where(x => x.RunsScored.HasValue)) { var result = results.SingleOrDefault(x => x.Result.PlayerInningsId == playerInnings.PlayerInningsId); Assert.NotNull(result); Assert.Equal(innings.BowlingTeam.Team.TeamId, result.OppositionTeam.TeamId); Assert.Equal(innings.BowlingTeam.Team.TeamName, result.OppositionTeam.TeamName); } } }
public async Task Read_player_innings_returns_innings() { var filter = new StatisticsFilter { Paging = new Paging { PageSize = int.MaxValue } }; var queryBuilder = new Mock <IStatisticsQueryBuilder>(); queryBuilder.Setup(x => x.BuildWhereClause(filter)).Returns((string.Empty, new Dictionary <string, object>())); var dataSource = new SqlServerBestPerformanceInAMatchStatisticsDataSource(_databaseFixture.ConnectionFactory, queryBuilder.Object); var results = await dataSource.ReadPlayerInnings(filter, StatisticsSortOrder.BestFirst).ConfigureAwait(false); var expected = _databaseFixture.TestData.Matches.SelectMany(x => x.MatchInnings).SelectMany(x => x.PlayerInnings).Where(x => x.RunsScored.HasValue).ToList(); foreach (var expectedInnings in expected) { var result = results.SingleOrDefault(x => x.Result.PlayerInningsId == expectedInnings.PlayerInningsId); Assert.NotNull(result); Assert.Equal(expectedInnings.DismissalType, result.Result.DismissalType); Assert.Equal(expectedInnings.RunsScored, result.Result.RunsScored); Assert.Equal(expectedInnings.BallsFaced, result.Result.BallsFaced); } }
public async Task Read_total_bowling_figures_supports_no_filter() { var queryBuilder = new Mock<IStatisticsQueryBuilder>(); queryBuilder.Setup(x => x.BuildWhereClause(It.IsAny<StatisticsFilter>())).Returns((string.Empty, new Dictionary<string, object>())); var dataSource = new SqlServerBestPerformanceInAMatchStatisticsDataSource(_databaseFixture.ConnectionFactory, queryBuilder.Object); var result = await dataSource.ReadTotalBowlingFigures(null).ConfigureAwait(false); var expected = _databaseFixture.TestData.Matches.SelectMany(x => x.MatchInnings).SelectMany(x => x.BowlingFigures).Count(); Assert.Equal(expected, result); }
public async Task Read_total_bowling_figures_supports_filter_by_player_id() { var filter = new StatisticsFilter { Player = _databaseFixture.TestData.BowlerWithMultipleIdentities }; var queryBuilder = new Mock<IStatisticsQueryBuilder>(); queryBuilder.Setup(x => x.BuildWhereClause(filter)).Returns(("AND PlayerId = @PlayerId", new Dictionary<string, object> { { "PlayerId", _databaseFixture.TestData.BowlerWithMultipleIdentities.PlayerId } })); var dataSource = new SqlServerBestPerformanceInAMatchStatisticsDataSource(_databaseFixture.ConnectionFactory, queryBuilder.Object); var result = await dataSource.ReadTotalBowlingFigures(filter).ConfigureAwait(false); var expected = _databaseFixture.TestData.Matches.SelectMany(x => x.MatchInnings) .SelectMany(x => x.BowlingFigures) .Count(x => x.Bowler.Player.PlayerId == _databaseFixture.TestData.BowlerWithMultipleIdentities.PlayerId); Assert.Equal(expected, result); }
public async Task Read_player_innings_with_MaxResultsAllowingExtraResultsIfValuesAreEqual_returns_results_equal_to_the_max() { var filter = new StatisticsFilter { MaxResultsAllowingExtraResultsIfValuesAreEqual = 5, Player = _databaseFixture.PlayerWithFifthAndSixthInningsTheSame }; var queryBuilder = new Mock <IStatisticsQueryBuilder>(); queryBuilder.Setup(x => x.BuildWhereClause(filter)).Returns(("AND PlayerId = @PlayerId", new Dictionary <string, object> { { "PlayerId", _databaseFixture.PlayerWithFifthAndSixthInningsTheSame.PlayerId } })); var dataSource = new SqlServerBestPerformanceInAMatchStatisticsDataSource(_databaseFixture.ConnectionFactory, queryBuilder.Object); var results = (await dataSource.ReadPlayerInnings(filter, StatisticsSortOrder.BestFirst).ConfigureAwait(false)).ToList(); var allExpectedResults = _databaseFixture.TestData.Matches.SelectMany(x => x.MatchInnings) .SelectMany(x => x.PlayerInnings) .Where(x => x.Batter.Player.PlayerId == _databaseFixture.PlayerWithFifthAndSixthInningsTheSame.PlayerId && x.RunsScored.HasValue) .OrderByDescending(x => x.RunsScored).ThenBy(x => StatisticsConstants.DISMISSALS_THAT_ARE_OUT.Contains(x.DismissalType)); var expected = new List <PlayerInnings>(); foreach (var result in allExpectedResults) { if (expected.Count < 5 || (expected[expected.Count - 1].RunsScored == result.RunsScored && StatisticsConstants.DISMISSALS_THAT_ARE_OUT.Contains(expected[expected.Count - 1].DismissalType) == StatisticsConstants.DISMISSALS_THAT_ARE_OUT.Contains(result.DismissalType))) { expected.Add(result); continue; } else { break; } } Assert.Equal(expected.Count, results.Count); foreach (var expectedInnings in expected) { var result = results.SingleOrDefault(x => x.Result.PlayerInningsId == expectedInnings.PlayerInningsId); Assert.NotNull(result); Assert.Equal(expectedInnings.DismissalType, result.Result.DismissalType); Assert.Equal(expectedInnings.RunsScored, result.Result.RunsScored); Assert.Equal(expectedInnings.BallsFaced, result.Result.BallsFaced); } Assert.Equal(results[4].Result.RunsScored, results[5].Result.RunsScored); }
public async Task Read_total_bowling_figures_supports_filter_by_team_id() { var filter = new StatisticsFilter { Team = _databaseFixture.TestData.TeamWithFullDetails }; var queryBuilder = new Mock<IStatisticsQueryBuilder>(); queryBuilder.Setup(x => x.BuildWhereClause(filter)).Returns(("AND TeamId = @TeamId", new Dictionary<string, object> { { "TeamId", _databaseFixture.TestData.TeamWithFullDetails.TeamId } })); var dataSource = new SqlServerBestPerformanceInAMatchStatisticsDataSource(_databaseFixture.ConnectionFactory, queryBuilder.Object); var result = await dataSource.ReadTotalBowlingFigures(filter).ConfigureAwait(false); var expected = _databaseFixture.TestData.Matches.Where(x => x.Teams.Select(t => t.Team.TeamId).Contains(_databaseFixture.TestData.TeamWithFullDetails.TeamId.Value)) .SelectMany(x => x.MatchInnings.Where(i => i.BowlingTeam.Team.TeamId == _databaseFixture.TestData.TeamWithFullDetails.TeamId.Value)) .SelectMany(x => x.BowlingFigures) .Count(); Assert.Equal(expected, result); }
public async Task Read_latest_bowling_figures_sorts_by_most_recent_first() { var filter = new StatisticsFilter { Paging = new Paging { PageSize = int.MaxValue } }; var queryBuilder = new Mock<IStatisticsQueryBuilder>(); queryBuilder.Setup(x => x.BuildWhereClause(filter)).Returns((string.Empty, new Dictionary<string, object>())); var dataSource = new SqlServerBestPerformanceInAMatchStatisticsDataSource(_databaseFixture.ConnectionFactory, queryBuilder.Object); var results = await dataSource.ReadBowlingFigures(filter, StatisticsSortOrder.LatestFirst).ConfigureAwait(false); var previousStartTime = DateTimeOffset.MaxValue; foreach (var result in results) { Assert.True(result.Match.StartTime <= previousStartTime); previousStartTime = result.Match.StartTime; } }
public async Task Read_bowling_figures_with_MaxResultsAllowingExtraResultsIfValuesAreEqual_returns_results_equal_to_the_max() { var dataSource = new SqlServerBestPerformanceInAMatchStatisticsDataSource(_databaseFixture.ConnectionFactory, new StatisticsQueryBuilder()); var results = (await dataSource.ReadBowlingFigures(new StatisticsFilter { MaxResultsAllowingExtraResultsIfValuesAreEqual = 5, Player = _databaseFixture.PlayerWithFifthAndSixthBowlingFiguresTheSame }, StatisticsSortOrder.BestFirst).ConfigureAwait(false)).ToList(); var allExpectedResults = _databaseFixture.TestData.Matches.SelectMany(x => x.MatchInnings) .SelectMany(x => x.BowlingFigures) .Where(x => x.Bowler.Player.PlayerId == _databaseFixture.PlayerWithFifthAndSixthBowlingFiguresTheSame.PlayerId) .OrderByDescending(x => x.Wickets).ThenByDescending(x => x.RunsConceded.HasValue).ThenBy(x => x.RunsConceded); var expected = new List <BowlingFigures>(); foreach (var result in allExpectedResults) { if (expected.Count < 5 || (expected[expected.Count - 1].Wickets == result.Wickets && expected[expected.Count - 1].RunsConceded == result.RunsConceded)) { expected.Add(result); continue; } else { break; } } Assert.Equal(expected.Count, results.Count); foreach (var expectedFigures in expected) { var result = results.SingleOrDefault(x => x.Result.BowlingFiguresId == expectedFigures.BowlingFiguresId); Assert.NotNull(result); Assert.Equal(expectedFigures.Overs, result.Result.Overs); Assert.Equal(expectedFigures.Maidens, result.Result.Maidens); Assert.Equal(expectedFigures.RunsConceded, result.Result.RunsConceded); Assert.Equal(expectedFigures.Wickets, result.Result.Wickets); } Assert.Equal(results[4].Result.Wickets, results[5].Result.Wickets); Assert.Equal(results[4].Result.RunsConceded, results[5].Result.RunsConceded); }
public async Task Read_bowling_figures_returns_figures() { var filter = new StatisticsFilter { Paging = new Paging { PageSize = int.MaxValue } }; var queryBuilder = new Mock<IStatisticsQueryBuilder>(); queryBuilder.Setup(x => x.BuildWhereClause(filter)).Returns((string.Empty, new Dictionary<string, object>())); var dataSource = new SqlServerBestPerformanceInAMatchStatisticsDataSource(_databaseFixture.ConnectionFactory, queryBuilder.Object); var results = await dataSource.ReadBowlingFigures(filter, StatisticsSortOrder.BestFirst).ConfigureAwait(false); var expected = _databaseFixture.TestData.Matches.SelectMany(x => x.MatchInnings).SelectMany(x => x.BowlingFigures).ToList(); foreach (var expectedBowler in expected) { var result = results.SingleOrDefault(x => x.Result.BowlingFiguresId == expectedBowler.BowlingFiguresId); Assert.NotNull(result); Assert.Equal(expectedBowler.Overs, result.Result.Overs); Assert.Equal(expectedBowler.Maidens, result.Result.Maidens); Assert.Equal(expectedBowler.RunsConceded, result.Result.RunsConceded); Assert.Equal(expectedBowler.Wickets, result.Result.Wickets); } }
public async Task Read_total_player_innings_supports_filter_by_season_id() { var filter = new StatisticsFilter { Season = _databaseFixture.TestData.Competitions.First().Seasons.First() }; var queryBuilder = new Mock <IStatisticsQueryBuilder>(); queryBuilder.Setup(x => x.BuildWhereClause(filter)).Returns((" AND SeasonId = @SeasonId", new Dictionary <string, object> { { "SeasonId", _databaseFixture.TestData.Competitions.First().Seasons.First().SeasonId } })); var dataSource = new SqlServerBestPerformanceInAMatchStatisticsDataSource(_databaseFixture.ConnectionFactory, queryBuilder.Object); var result = await dataSource.ReadTotalPlayerInnings(filter).ConfigureAwait(false); var expected = _databaseFixture.TestData.Matches.Where(x => x.Season?.SeasonId == _databaseFixture.TestData.Competitions.First().Seasons.First().SeasonId) .SelectMany(x => x.MatchInnings) .SelectMany(x => x.PlayerInnings) .Count(x => x.RunsScored.HasValue); Assert.Equal(expected, result); }
public async Task Read_best_bowling_figures_sorts_by_most_wickets_for_fewest_runs_with_null_runs_last() { var filter = new StatisticsFilter { Paging = new Paging { PageSize = int.MaxValue } }; var queryBuilder = new Mock<IStatisticsQueryBuilder>(); queryBuilder.Setup(x => x.BuildWhereClause(filter)).Returns((string.Empty, new Dictionary<string, object>())); var dataSource = new SqlServerBestPerformanceInAMatchStatisticsDataSource(_databaseFixture.ConnectionFactory, queryBuilder.Object); var results = await dataSource.ReadBowlingFigures(filter, StatisticsSortOrder.BestFirst).ConfigureAwait(false); var previousWickets = int.MaxValue; int? previousRunsConceded = int.MinValue; foreach (var result in results) { Assert.True(result.Result.Wickets <= previousWickets); if (result.Result.Wickets == previousWickets) { Assert.True((result.Result.RunsConceded.HasValue && previousRunsConceded.HasValue && result.Result.RunsConceded >= previousRunsConceded) || !result.Result.RunsConceded.HasValue); } previousWickets = result.Result.Wickets; previousRunsConceded = result.Result.RunsConceded; } }