void Awake()
    {
        // Register the singleton
        if (Instance != null)
        {
            Debug.LogError("Multiple instances of PlayerScoreHelper!");
        }

        Instance = this;
        score    = 0;
    }
        public void PlayerWithProbabilities_NotEqualHundred_Exception()
        {
            PlayerDetails player = new PlayerDetails
            {
                Name = "Pravin",
                ScoreProbabilities = new int[8] {
                    5, 30, 25, 10, 15, 1, 9, 6
                }
            };

            PlayerScoreHelper playerScoreHelper = new PlayerScoreHelper();

            Assert.Throws <Exception>(() => playerScoreHelper.BuildCumulativeDistribution(player));
        }
        public void InidvidualPlayerStrikeProbalility_Verify()
        {
            PlayerDetails player = new PlayerDetails
            {
                Name = "Pravin",
                ScoreProbabilities = new int[8] {
                    5, 30, 25, 10, 15, 1, 9, 5
                }
            };

            PlayerScoreHelper playerScoreHelper = new PlayerScoreHelper();

            playerScoreHelper.BuildCumulativeDistribution(player);

            double scoreZero = 0, scoreOne = 0, scoreTwo = 0, scoreThree = 0, scoreFour = 0, scoreFive = 0, scoreSix = 0, scoreOut = 0;

            List <int> playerScores = new List <int>();

            for (int i = 0; i < 10000; i++)
            {
                playerScores.Add(player.Strike());
            }

            scoreZero  = ((playerScores.Where(t => t == 0).Count()) / 100);
            scoreOne   = ((playerScores.Where(t => t == 1).Count()) / 100);
            scoreTwo   = ((playerScores.Where(t => t == 2).Count()) / 100);
            scoreThree = ((playerScores.Where(t => t == 3).Count()) / 100);
            scoreFour  = ((playerScores.Where(t => t == 4).Count()) / 100);
            scoreFive  = ((playerScores.Where(t => t == 5).Count()) / 100);
            scoreSix   = ((playerScores.Where(t => t == 6).Count()) / 100);
            scoreOut   = ((playerScores.Where(t => t == 7).Count()) / 100);

            //probability +/- 1
            Assert.Contains(scoreZero, new double[] { 5, 4, 6 });
            Assert.Contains(scoreOne, new double[] { 29, 30, 31 });
            Assert.Contains(scoreTwo, new double[] { 24, 25, 26 });
            Assert.Contains(scoreThree, new double[] { 9, 10, 11 });
            Assert.Contains(scoreFour, new double[] { 14, 15, 16 });
            Assert.Contains(scoreFive, new double[] { 0, 1, 2 });
            Assert.Contains(scoreSix, new double[] { 8, 9, 10 });
            Assert.Contains(scoreOut, new double[] { 4, 5, 6 });
        }
        public void PlayerPobability_Zero_NerverScores()
        {
            //Score 2 has zero probability
            PlayerDetails player = new PlayerDetails
            {
                Name = "Pravin",
                ScoreProbabilities = new int[8] {
                    5, 30, 0, 10, 15, 1, 9, 5
                }
            };

            PlayerScoreHelper playerScoreHelper = new PlayerScoreHelper();

            List <int> playerScores = new List <int>();

            for (int i = 0; i < 10000; i++)
            {
                playerScores.Add(player.Strike());
            }
            Assert.Empty(playerScores.Where(t => t == 2).ToList());
        }
        public void MultiPlayersStrikeProbalility_Verify()
        {
            MatchInitialize initialize   = new MatchInitialize();
            var             currentMatch = initialize.GetCurrentMatchDetails();

            PlayerScoreHelper playerScoreHelper = new PlayerScoreHelper();

            foreach (var player in currentMatch.Players)
            {
                playerScoreHelper.BuildCumulativeDistribution(player);
            }
            Dictionary <string, List <int> > playerScores = new Dictionary <string, List <int> >();

            for (int i = 0; i < 10000; i++)
            {
                foreach (var player in currentMatch.Players)
                {
                    var score = player.Strike();
                    if (playerScores.ContainsKey(player.Name))
                    {
                        var scores = playerScores[player.Name];
                        scores.Add(score);
                        playerScores[player.Name] = scores;
                    }
                    else
                    {
                        playerScores.Add(player.Name, new List <int> {
                            score
                        });
                    }
                }
            }

            Assert.Contains(playerScores["Pravin"].Where(t => t == 0).Count() / 100, new double[] { 5, 4, 6 });
            Assert.Contains(playerScores["Irfan"].Where(t => t == 0).Count() / 100, new double[] { 9, 10, 11 });
            Assert.Contains(playerScores["Jalindar"].Where(t => t == 0).Count() / 100, new double[] { 19, 20, 21 });
            Assert.Contains(playerScores["Vaishali"].Where(t => t == 0).Count() / 100, new double[] { 29, 30, 31 });
        }