public void GetPivotStandings_HasGameResults_LastStandingsUpdateTimeIsReturned()
        {
            // Arrange
            var LAST_UPDATE_TIME = new DateTime(2017, 4, 7, 23, 7, 45);

            var gameResultsTestData = new GameResultsTestFixture().WithAllPossibleScores().Build();
            var teamsTestData       = TeamsInSingleDivisionSingleGroup();
            var testTour            = CreateSingleDivisionTournament(TOURNAMENT_ID, LAST_UPDATE_TIME);

            MockTournamentGameResultsQuery(TOURNAMENT_ID, gameResultsTestData);
            MockTournamentTeamsQuery(TOURNAMENT_ID, teamsTestData);
            MockTournamentByIdQuery(TOURNAMENT_ID, testTour);

            var expected = new PivotStandingsTestFixture()
                           .WithStandingsForAllPossibleScores()
                           .WithLastUpdateTime(LAST_UPDATE_TIME)
                           .Build();

            var sut = BuildSUT();

            // Act
            var actual = sut.GetPivotStandings(TOURNAMENT_ID);

            // Assert
            AssertPivotStandingsAreEqual(expected, actual, "Points, games, sets and balls should be calculated properly.");
        }
        public void GetMultipleDivisionPivotStandings_GameResultsAllPossibleScores_CorrectStats()
        {
            // Arrange
            var gameResultsTestData = new GameResultsTestFixture()
                                      .WithMultipleDivisionsAllPosibleScores()
                                      .Build();

            var teamsTestData = TeamsInTwoDivisionTwoGroups();
            var testTour      = CreateTwoDivisionsTournament(TOURNAMENT_ID);

            var expected = new PivotStandingsTestFixture()
                           .WithMultipleDivisionsAllPossibleScores()
                           .Build();

            MockTournamentGameResultsQuery(TOURNAMENT_ID, gameResultsTestData);
            MockTournamentTeamsQuery(TOURNAMENT_ID, teamsTestData);
            MockTournamentByIdQuery(TOURNAMENT_ID, testTour);

            var sut = BuildSUT();

            // Act
            var actual = sut.GetPivotStandings(TOURNAMENT_ID);

            // Assert
            AssertPivotStandingsAreEqual(
                expected,
                actual,
                "Standings should be properly calclulated for case of several divisions");
        }
        public void GetPivotStandings_OneTeamNoLostSetsNoLostBalls_GetsToTheTopWhenOrderedByBallsRatio()
        {
            // Arrange
            var gameResultsTestData = new GameResultsTestFixture().WithNoLostSetsNoLostBallsForOneTeam().Build();
            var teamsTestData       = TeamsInSingleDivisionSingleGroup();
            var expected            = new PivotStandingsTestFixture().WithMaxBallsRatioForOneTeam().Build();

            MockTournamentGameResultsQuery(TOURNAMENT_ID, gameResultsTestData);
            MockTournamentTeamsQuery(TOURNAMENT_ID, teamsTestData);

            var sut = BuildSUT();

            // Act
            var actual = sut.GetPivotStandings(TOURNAMENT_ID);

            // Assert
            AssertPivotStandingsAreEqual(expected, actual, "Team with no lost balls should be considered higher comparing to other teams when ordering by balls ratio");
        }
        public void GetPivotStandings_GameResultsAllPossibleScores_CorrectBallStats()
        {
            // Arrange
            var gameResultsTestData = new GameResultsTestFixture().WithAllPossibleScores().Build();
            var teamsTestData       = TeamsInSingleDivisionSingleGroup();

            MockTournamentGameResultsQuery(TOURNAMENT_ID, gameResultsTestData);
            MockTournamentTeamsQuery(TOURNAMENT_ID, teamsTestData);

            var expected = new PivotStandingsTestFixture().WithStandingsForAllPossibleScores().Build();

            var sut = BuildSUT();

            // Act
            var actual = sut.GetPivotStandings(TOURNAMENT_ID);

            // Assert
            AssertBallsAreEqual(expected, actual, "Balls should be calculated properly.");
        }
        public void GetPivotStandings_ScheduledGamesButNoResults_StandingEntriesAreEmpty()
        {
            // Arrange
            var gameResultsData = new GameResultsTestFixture().WithNoGameResults().Build();
            var teamsTestData   = TeamsInSingleDivisionSingleGroup();

            MockTournamentGameResultsQuery(TOURNAMENT_ID, gameResultsData);
            MockTournamentTeamsQuery(TOURNAMENT_ID, teamsTestData);

            var expected = new PivotStandingsTestFixture().WithEmptyResults().Build();

            var sut = BuildSUT();

            // Act
            var actual = sut.GetPivotStandings(TOURNAMENT_ID);

            // Assert
            AssertPivotStandingsAreEqual(expected, actual, "When there are games scheduled but no results standing entries should be empty");
        }
        public void GetPivotStandings_OneTeamHasTechnicalDefeatInSet_BallDoesntCount()
        {
            // Arrange
            var gameResultsTestData = new GameResultsTestFixture().WithTechnicalDefeatInSet().Build();
            var teamsTestData       = TeamsInSingleDivisionSingleGroup();

            var expected = new PivotStandingsTestFixture().WithTechnicalDefeatInSet().Build();

            MockTournamentGameResultsQuery(TOURNAMENT_ID, gameResultsTestData);
            MockTournamentTeamsQuery(TOURNAMENT_ID, teamsTestData);

            var sut = BuildSUT();

            // Act
            var actual = sut.GetPivotStandings(TOURNAMENT_ID);

            // Assert
            AssertPivotStandingsAreEqual(expected, actual, "When team has got technical defeat in set balls from this set should not be accounted in the statistics");
        }
        public void GetPivotStandings_HomeTeamHasPenalty_PenaltyDeductedFromTotalPoints()
        {
            // Arrange
            var gameResultsTestData = new GameResultsTestFixture().WithHomeTeamPenalty().Build();
            var teamsTestData       = TeamsInSingleDivisionSingleGroup();

            var expected = new PivotStandingsTestFixture().WithTeamAPenalty().Build();

            MockTournamentGameResultsQuery(TOURNAMENT_ID, gameResultsTestData);
            MockTournamentTeamsQuery(TOURNAMENT_ID, teamsTestData);

            var sut = BuildSUT();

            // Act
            var actual = sut.GetPivotStandings(TOURNAMENT_ID);

            // Assert
            AssertPivotStandingsAreEqual(expected, actual, "Total points should be reduced by penalty amount for penalized team");
        }
        public void GetPivotStandings_SeveralTeamsWithSamePointsAndWonGames_TeamsOrderedBySetsRatio()
        {
            // Arrange
            var gameResultsTestData = new GameResultsTestFixture().WithResultsForSamePointsAndWonGames().Build();
            var teamsTestData       = TeamsInSingleDivisionSingleGroup();

            var expected = new PivotStandingsTestFixture().WithSamePointsAndWonGames().Build();

            MockTournamentGameResultsQuery(TOURNAMENT_ID, gameResultsTestData);
            MockTournamentTeamsQuery(TOURNAMENT_ID, teamsTestData);

            var sut = BuildSUT();

            // Act
            var actual = sut.GetPivotStandings(TOURNAMENT_ID);

            // Assert
            AssertPivotStandingsAreEqual(expected, actual, "Teams should be ordered by set ratios.");
        }
        public void GetPivotStandings_NoGamesScheduled_EmptyEntryForEachTeamCreated()
        {
            // Arrange
            var gameResultsData = new GameResultsTestFixture().WithNoGamesScheduled().Build();
            var teamsTestData   = TeamsInSingleDivisionSingleGroup();

            var expected = new PivotStandingsTestFixture().WithNoResults().Build();

            MockTournamentGameResultsQuery(TOURNAMENT_ID, gameResultsData);
            MockTournamentTeamsQuery(TOURNAMENT_ID, teamsTestData);

            var sut = BuildSUT();

            // Act
            var actual = sut.GetPivotStandings(TOURNAMENT_ID);

            // Assert
            AssertPivotStandingsAreEqual(expected, actual, "For each team in tournament empty standings entry should be created");
        }
        public void GetPivotStandings_GameResultsAllPossibleScores_TeamsOrderedByPoints()
        {
            // Arrange
            var gameResultsTestData = new GameResultsTestFixture().WithResultsForUniquePoints().Build();
            var teamsTestData       = TeamsInSingleDivisionSingleGroup();

            var expected = new PivotStandingsTestFixture().WithUniquePoints().Build();

            MockTournamentGameResultsQuery(TOURNAMENT_ID, gameResultsTestData);
            MockTournamentTeamsQuery(TOURNAMENT_ID, teamsTestData);

            var sut = BuildSUT();

            // Act
            var actual = sut.GetPivotStandings(TOURNAMENT_ID);

            // Assert
            AssertPivotStandingsAreEqual(expected, actual, "Teams should be ordered by points.");
        }
        public void GetPivotStandings_PlannedGamesWithoutResults_StandingsContainPlannedGames()
        {
            // Arrange
            var gameResultsTestData = new GameResultsTestFixture()
                                      .WithNotAllGamesPlayed()
                                      .Build();

            var teamsTestData = TeamsInSingleDivisionSingleGroup();

            MockTournamentGameResultsQuery(TOURNAMENT_ID, gameResultsTestData);
            MockTournamentTeamsQuery(TOURNAMENT_ID, teamsTestData);

            var expected = new PivotStandingsTestFixture()
                           .WithNotAllGamesPlayed()
                           .Build();

            var sut = BuildSUT();

            // Act
            var actual = sut.GetPivotStandings(TOURNAMENT_ID);

            // Assert
            AssertPivotStandingsAreEqual(expected, actual, "Points, games, sets and balls should be calculated properly.");
        }