public void Removed_innings_is_identified_by_batting_position()
        {
            var playerOne = new PlayerIdentity {
                PlayerIdentityName = "Player one"
            };
            var playerTwo = new PlayerIdentity {
                PlayerIdentityName = "Player two"
            };
            var firstInningsBefore = new PlayerInnings {
                BattingPosition = 1, Batter = playerOne, DismissalType = DismissalType.NotOut, RunsScored = 0, BallsFaced = 10
            };
            var firstInningsAfter = new PlayerInnings {
                BattingPosition = 1, Batter = playerOne, DismissalType = DismissalType.NotOut, RunsScored = 0, BallsFaced = 10
            };
            var secondInningsBefore = new PlayerInnings {
                BattingPosition = 2, Batter = playerTwo, DismissalType = DismissalType.NotOut, RunsScored = 0, BallsFaced = 10
            };
            var comparer = new BattingScorecardComparer();

            var result = comparer.CompareScorecards(new List <PlayerInnings> {
                firstInningsBefore, secondInningsBefore
            }, new List <PlayerInnings> {
                firstInningsAfter
            });

            Assert.Single(result.PlayerInningsRemoved);
            Assert.Contains(secondInningsBefore, result.PlayerInningsRemoved);
        }
        public void Affected_bowler_PlayerIdentity_is_identified()
        {
            var playerOne = new PlayerIdentity {
                PlayerIdentityName = "Player one"
            };
            var playerTwo = new PlayerIdentity {
                PlayerIdentityName = "Player two"
            };
            var playerThree = new PlayerIdentity {
                PlayerIdentityName = "Player three"
            };
            var firstInningsBefore = new PlayerInnings {
                BattingPosition = 1, Batter = playerOne, Bowler = playerThree, DismissalType = DismissalType.Bowled, RunsScored = 0, BallsFaced = 10
            };
            var firstInningsAfter = new PlayerInnings {
                BattingPosition = 1, Batter = playerOne, Bowler = playerThree, DismissalType = DismissalType.Bowled, RunsScored = 0, BallsFaced = 12
            };
            var secondInningsBefore = new PlayerInnings {
                BattingPosition = 2, Batter = playerTwo, Bowler = playerThree, DismissalType = DismissalType.Bowled, RunsScored = 0, BallsFaced = 10
            };
            var secondInningsAfter = new PlayerInnings {
                BattingPosition = 2, Batter = playerTwo, Bowler = playerThree, DismissalType = DismissalType.Bowled, RunsScored = 0, BallsFaced = 10
            };
            var comparer = new BattingScorecardComparer();

            var result = comparer.CompareScorecards(new List <PlayerInnings> {
                firstInningsBefore, secondInningsBefore
            }, new List <PlayerInnings> {
                firstInningsAfter, secondInningsAfter
            });

            Assert.Single(result.BowlingPlayerIdentitiesAffected);
            Assert.Contains(playerThree.PlayerIdentityName, result.BowlingPlayerIdentitiesAffected);
        }
        public void Changed_innings_is_identified_from_changed_BowlerU002EPlayerIdentityName_for_batting_position()
        {
            var playerOne = new PlayerIdentity {
                PlayerIdentityName = "Player one"
            };
            var playerTwo = new PlayerIdentity {
                PlayerIdentityName = "Player two"
            };
            var firstInningsBefore = new PlayerInnings {
                BattingPosition = 1, Batter = playerOne, Bowler = playerTwo, DismissalType = DismissalType.Bowled, RunsScored = 0, BallsFaced = 10
            };
            var firstInningsAfter = new PlayerInnings {
                BattingPosition = 1, Batter = playerOne, Bowler = playerTwo, DismissalType = DismissalType.Bowled, RunsScored = 0, BallsFaced = 10
            };
            var secondInningsBefore = new PlayerInnings {
                BattingPosition = 2, Batter = playerTwo, Bowler = new PlayerIdentity {
                    PlayerIdentityName = "Before"
                }, DismissalType = DismissalType.NotOut, RunsScored = 0, BallsFaced = 10
            };
            var secondInningsAfter = new PlayerInnings {
                BattingPosition = 2, Batter = playerTwo, Bowler = new PlayerIdentity {
                    PlayerIdentityName = "Changed"
                }, DismissalType = DismissalType.NotOut, RunsScored = 0, BallsFaced = 10
            };
            var comparer = new BattingScorecardComparer();

            var result = comparer.CompareScorecards(new List <PlayerInnings> {
                firstInningsBefore, secondInningsBefore
            }, new List <PlayerInnings> {
                firstInningsAfter, secondInningsAfter
            });

            Assert.Single(result.PlayerInningsChanged);
            Assert.Contains((secondInningsBefore, secondInningsAfter), result.PlayerInningsChanged);
        }
        private static void AddPlayerInningsDataToRecord(PlayerInnings playerInnings, PlayerInMatchStatisticsRecord record)
        {
            record.PlayerInningsId = playerInnings?.PlayerInningsId;
            record.BattingPosition = playerInnings?.BattingPosition == 2 ? 1 : playerInnings?.BattingPosition;
            record.RunsScored      = playerInnings?.RunsScored;
            record.BallsFaced      = playerInnings?.BallsFaced;

            if (playerInnings != null && StatisticsConstants.DISMISSALS_CREDITED_TO_BOWLER.Contains(playerInnings.DismissalType))
            {
                record.BowledByPlayerIdentityId   = playerInnings.Bowler?.PlayerIdentityId;
                record.BowledByPlayerIdentityName = playerInnings.Bowler?.PlayerIdentityName;
                record.BowledByPlayerRoute        = playerInnings.Bowler?.Player?.PlayerRoute;
            }

            if (playerInnings != null && playerInnings.DismissalType == DismissalType.Caught)
            {
                record.CaughtByPlayerIdentityId   = playerInnings.DismissedBy?.PlayerIdentityId;
                record.CaughtByPlayerIdentityName = playerInnings.DismissedBy?.PlayerIdentityName;
                record.CaughtByPlayerRoute        = playerInnings.DismissedBy?.Player?.PlayerRoute;
            }

            if (playerInnings != null && playerInnings.DismissalType == DismissalType.CaughtAndBowled)
            {
                record.CaughtByPlayerIdentityId   = playerInnings.Bowler?.PlayerIdentityId;
                record.CaughtByPlayerIdentityName = playerInnings.Bowler?.PlayerIdentityName;
                record.CaughtByPlayerRoute        = playerInnings.Bowler?.Player?.PlayerRoute;
            }

            if (playerInnings != null && playerInnings.DismissalType == DismissalType.RunOut)
            {
                record.RunOutByPlayerIdentityId   = playerInnings.DismissedBy?.PlayerIdentityId;
                record.RunOutByPlayerIdentityName = playerInnings.DismissedBy?.PlayerIdentityName;
                record.RunOutByPlayerRoute        = playerInnings.DismissedBy?.Player?.PlayerRoute;
            }
        }
        public void Batting_position_zero_in_after_innings_throws_ArgumentException()
        {
            var comparer     = new BattingScorecardComparer();
            var firstInnings = new PlayerInnings {
                BattingPosition = 0, Batter = new PlayerIdentity {
                    PlayerIdentityName = "Player one"
                }, DismissalType = DismissalType.NotOut, RunsScored = 10, BallsFaced = 10
            };

            Assert.Throws <ArgumentException>(() => comparer.CompareScorecards(new List <PlayerInnings>(), new List <PlayerInnings> {
                firstInnings
            }));
        }
        public void Unchanged_innings_is_identified_by_batting_position_and_all_fields()
        {
            var firstInningsBefore = new PlayerInnings {
                BattingPosition = 1, Batter = new PlayerIdentity {
                    PlayerIdentityName = "Player one"
                }, DismissedBy = new PlayerIdentity {
                    PlayerIdentityName = "Player three"
                }, Bowler = new PlayerIdentity {
                    PlayerIdentityName = "Player four"
                }, DismissalType = DismissalType.Caught, RunsScored = 0, BallsFaced = 10
            };
            var firstInningsAfter = new PlayerInnings {
                BattingPosition = 1, Batter = new PlayerIdentity {
                    PlayerIdentityName = "Player one"
                }, DismissedBy = new PlayerIdentity {
                    PlayerIdentityName = "Player three"
                }, Bowler = new PlayerIdentity {
                    PlayerIdentityName = "Player four"
                }, DismissalType = DismissalType.Caught, RunsScored = 0, BallsFaced = 10
            };
            var secondInningsBefore = new PlayerInnings {
                BattingPosition = 2, Batter = new PlayerIdentity {
                    PlayerIdentityName = "Player two"
                }, DismissedBy = new PlayerIdentity {
                    PlayerIdentityName = "Player three"
                }, Bowler = new PlayerIdentity {
                    PlayerIdentityName = "Player four"
                }, DismissalType = DismissalType.Caught, RunsScored = 0, BallsFaced = 10
            };
            var secondInningsAfter = new PlayerInnings {
                BattingPosition = 2, Batter = new PlayerIdentity {
                    PlayerIdentityName = "Player two"
                }, DismissedBy = new PlayerIdentity {
                    PlayerIdentityName = "Player three"
                }, Bowler = new PlayerIdentity {
                    PlayerIdentityName = "Player four"
                }, DismissalType = DismissalType.Caught, RunsScored = 0, BallsFaced = 10
            };
            var comparer = new BattingScorecardComparer();

            var result = comparer.CompareScorecards(new List <PlayerInnings> {
                firstInningsBefore, secondInningsBefore
            }, new List <PlayerInnings> {
                firstInningsAfter, secondInningsAfter
            });

            Assert.Equal(2, result.PlayerInningsUnchanged.Count);
        }
        public void Duplicate_batting_position_in_before_innings_throws_ArgumentException()
        {
            var comparer     = new BattingScorecardComparer();
            var firstInnings = new PlayerInnings {
                BattingPosition = 1, Batter = new PlayerIdentity {
                    PlayerIdentityName = "Player one"
                }, DismissalType = DismissalType.NotOut, RunsScored = 0, BallsFaced = 10
            };
            var firstInningsDuplicate = new PlayerInnings {
                BattingPosition = 1, Batter = new PlayerIdentity {
                    PlayerIdentityName = "Player two"
                }, DismissalType = DismissalType.NotOut, RunsScored = 2, BallsFaced = 12
            };

            Assert.Throws <ArgumentException>(() => comparer.CompareScorecards(new List <PlayerInnings> {
                firstInnings, firstInningsDuplicate
            }, new List <PlayerInnings>()));
        }
        public void Added_innings_is_identified_by_batting_position()
        {
            var firstInnings = new PlayerInnings {
                BattingPosition = 1, Batter = new PlayerIdentity {
                    PlayerIdentityName = "Player one"
                }, DismissalType = DismissalType.NotOut, RunsScored = 0, BallsFaced = 10
            };
            var secondInnings = new PlayerInnings {
                BattingPosition = 2, Batter = new PlayerIdentity {
                    PlayerIdentityName = "Player one"
                }, DismissalType = DismissalType.NotOut, RunsScored = 0, BallsFaced = 10
            };
            var comparer = new BattingScorecardComparer();

            var result = comparer.CompareScorecards(new List <PlayerInnings> {
                firstInnings
            }, new List <PlayerInnings> {
                firstInnings, secondInnings
            });

            Assert.Single(result.PlayerInningsAdded);
            Assert.Contains(secondInnings, result.PlayerInningsAdded);
        }