public void BlackJackGameBothBlackJackPushNoOneWins()
        {
            var deckOfCards = new CardGameLibrary.DeckOfCards(CardGameLibrary.Constants.BLACKJACK);

            deckOfCards.Shuffle(CardGameLibrary.Constants.NCARDS);
            var blackJackGame = new CardGames.BlackJackGame(deckOfCards);

            var playerOfCard = new CardGameLibrary.PlayerOfCard();

            playerOfCard.PlayerNumber = 1;
            var blackJackCard = new CardGameLibrary.BlackJackCard(CardGameLibrary.Suit.Spades, 1);

            playerOfCard.PlayerCards.Add(blackJackCard);
            blackJackCard = new CardGameLibrary.BlackJackCard(CardGameLibrary.Suit.Hearts, 10);
            playerOfCard.PlayerCards.Add(blackJackCard);
            blackJackGame.PlayerOfCardsInGame.Add(playerOfCard);

            playerOfCard = new CardGameLibrary.PlayerOfCard();
            playerOfCard.PlayerNumber = 2;
            playerOfCard.IsDealer     = true;
            blackJackCard             = new CardGameLibrary.BlackJackCard(CardGameLibrary.Suit.Clubs, 1);
            playerOfCard.PlayerCards.Add(blackJackCard);
            blackJackCard = new CardGameLibrary.BlackJackCard(CardGameLibrary.Suit.Diamonds, 10);
            playerOfCard.PlayerCards.Add(blackJackCard);
            blackJackGame.PlayerOfCardsInGame.Add(playerOfCard);

            var evaluatedWinners = blackJackGame.EvaluateWinners();

            Assert.AreEqual(evaluatedWinners.Count, 1);
            Assert.AreEqual(evaluatedWinners[0].playerNumber, 1);
            Assert.AreEqual(evaluatedWinners[0].whoWon, CardGameLibrary.DealerOrPlayerOrNone.None);
        }
 //i.Multiple players are dealt a single card from a shuffled set of card
 public void Play(int numPlayers)
 {
     _deckOfCards.Shuffle(CardGameLibrary.Constants.NCARDS);
     for (int i = 0; i < numPlayers; i++)
     {
         CardGameLibrary.PlayerOfCard playerOfCards = new CardGameLibrary.PlayerOfCard();
         playerOfCards.PlayerNumber = i + 1;
         playerOfCards.PlayerCards.Add(GetCard());
         PlayerOfCardsInGame.Add(playerOfCards);
     }
 }
        public void HighCardGameTwoPlayersWinner()
        {
            var deckOfCards = new CardGameLibrary.DeckOfCards(CardGameLibrary.Constants.HIGHCARD);

            deckOfCards.Shuffle(CardGameLibrary.Constants.NCARDS);
            var highCardGame = new CardGames.HighCardGame(deckOfCards);

            var playerOfCard1 = new CardGameLibrary.PlayerOfCard();

            playerOfCard1.PlayerNumber = 1;
            playerOfCard1.PlayerCards.Add(highCardGame.GetCard());
            highCardGame.PlayerOfCardsInGame.Add(playerOfCard1);

            var playerOfCard2 = new CardGameLibrary.PlayerOfCard();

            playerOfCard2.PlayerNumber = 2;
            playerOfCard2.PlayerCards.Add(highCardGame.GetCard());
            highCardGame.PlayerOfCardsInGame.Add(playerOfCard2);

            var evaluatedWinners = highCardGame.EvaluateWinners();

            Assert.IsTrue(evaluatedWinners.Count <= 2);

            for (int i = 0; i < highCardGame.PlayerOfCardsInGame.Count; i++)
            {
                var player = highCardGame.PlayerOfCardsInGame[i];
                Assert.AreEqual(player.PlayerCards.Count, 1);
                if (i > 0)
                {
                    var previousPlayer = highCardGame.PlayerOfCardsInGame[i - 1];
                    if (previousPlayer.PlayerCards[0].GetRank() > player.PlayerCards[0].GetRank())
                    {
                        Assert.AreEqual(evaluatedWinners.Count, 1);
                        Assert.AreEqual(evaluatedWinners[0], 1);
                    }
                    else if (previousPlayer.PlayerCards[0].GetRank() < player.PlayerCards[0].GetRank())
                    {
                        Assert.AreEqual(evaluatedWinners.Count, 1);
                        Assert.AreEqual(evaluatedWinners[0], 2);
                    }
                    else
                    {
                        Assert.AreEqual(evaluatedWinners.Count, 2);
                        Assert.IsTrue(evaluatedWinners.Exists(e => e == 1));
                        Assert.IsTrue(evaluatedWinners.Exists(e => e == 2));
                    }
                }
            }
        }
        //ii.Highest Card wins
        public Generic.List <int> EvaluateWinners()
        {
            Generic.List <int> winningPlayerNumbers = new Generic.List <int>();
            Generic.List <CardGameLibrary.PlayerOfCard> highestPlayersOfCards = new Generic.List <CardGameLibrary.PlayerOfCard>();
            CardGameLibrary.PlayerOfCard highestPlayerOfCards = null;

            //Initially, assign first player as highest card winner
            if (PlayerOfCardsInGame.Count > 0)
            {
                highestPlayerOfCards = PlayerOfCardsInGame[0];
                highestPlayersOfCards.Add(highestPlayerOfCards);
            }

            for (int i = 1; i < PlayerOfCardsInGame.Count; i++)
            {
                //If previous player(s) temporarily assigned
                //as highest card winner is outranked, remove
                //and add new player as currently
                //assigned highest card winner
                if (PlayerOfCardsInGame[i].PlayerScore >
                    highestPlayerOfCards.PlayerScore)
                {
                    highestPlayersOfCards.RemoveAll
                        (match => match.PlayerScore
                        == highestPlayerOfCards.PlayerScore);
                    highestPlayerOfCards = PlayerOfCardsInGame[i];
                    highestPlayersOfCards.Add(highestPlayerOfCards);
                }
                //Multiple players having cards of same rank can be co-winners
                else if (PlayerOfCardsInGame[i].PlayerScore ==
                         highestPlayerOfCards.PlayerScore)
                {
                    highestPlayerOfCards = PlayerOfCardsInGame[i];
                    highestPlayersOfCards.Add(highestPlayerOfCards);
                }
            }

            //This should be a list of at most Count == 4 for co-winner use-cases
            foreach (CardGameLibrary.PlayerOfCard playerOfCards in highestPlayersOfCards)
            {
                winningPlayerNumbers.Add(playerOfCards.PlayerNumber);
            }

            return(winningPlayerNumbers);
        }
        public void BlackJackGamePlayerWithThreeAcesInHandNotBustWinner()
        {
            var deckOfCards = new CardGameLibrary.DeckOfCards(CardGameLibrary.Constants.BLACKJACK);

            deckOfCards.Shuffle(CardGameLibrary.Constants.NCARDS);
            var blackJackGame = new CardGames.BlackJackGame(deckOfCards);

            var playerOfCard = new CardGameLibrary.PlayerOfCard();

            playerOfCard.PlayerNumber = 1;
            var blackJackCard = new CardGameLibrary.BlackJackCard(CardGameLibrary.Suit.Spades, 1);

            playerOfCard.PlayerCards.Add(blackJackCard);
            blackJackCard = new CardGameLibrary.BlackJackCard(CardGameLibrary.Suit.Hearts, 1);
            playerOfCard.PlayerCards.Add(blackJackCard);
            blackJackCard = new CardGameLibrary.BlackJackCard(CardGameLibrary.Suit.Clubs, 1);
            playerOfCard.PlayerCards.Add(blackJackCard);
            playerOfCard.HasSoftScore = true;
            blackJackGame.PlayerOfCardsInGame.Add(playerOfCard);

            playerOfCard = new CardGameLibrary.PlayerOfCard();
            playerOfCard.PlayerNumber = 2;
            playerOfCard.IsDealer     = true;
            blackJackCard             = new CardGameLibrary.BlackJackCard(CardGameLibrary.Suit.Diamonds, 2);
            playerOfCard.PlayerCards.Add(blackJackCard);
            blackJackCard = new CardGameLibrary.BlackJackCard(CardGameLibrary.Suit.Clubs, 8);
            playerOfCard.PlayerCards.Add(blackJackCard);
            blackJackCard = new CardGameLibrary.BlackJackCard(CardGameLibrary.Suit.Hearts, 2);
            playerOfCard.PlayerCards.Add(blackJackCard);
            blackJackGame.PlayerOfCardsInGame.Add(playerOfCard);

            var evaluatedWinners = blackJackGame.EvaluateWinners();

            Assert.AreEqual(evaluatedWinners.Count, 1);
            Assert.AreEqual(evaluatedWinners[0].playerNumber, 1);
            Assert.AreEqual(evaluatedWinners[0].whoWon, CardGameLibrary.DealerOrPlayerOrNone.Player);
        }
        public void HighCardGameMultiplePlayersWinner()
        {
            var deckOfCards = new CardGameLibrary.DeckOfCards(CardGameLibrary.Constants.HIGHCARD);

            deckOfCards.Shuffle(CardGameLibrary.Constants.NCARDS);
            var highCardGame = new CardGames.HighCardGame(deckOfCards);

            for (int i = 1; i <= CardGameLibrary.Constants.NCARDS / 2; i++)
            {
                var playerOfCard = new CardGameLibrary.PlayerOfCard();
                playerOfCard.PlayerNumber = i;
                playerOfCard.PlayerCards.Add(highCardGame.GetCard());
                highCardGame.PlayerOfCardsInGame.Add(playerOfCard);
            }

            var evaluatedWinners = highCardGame.EvaluateWinners();

            Assert.IsTrue(evaluatedWinners.Count <= 4);

            var winners     = new System.Collections.Generic.List <int>();
            int winningRank = 0;

            for (int i = 0; i < highCardGame.PlayerOfCardsInGame.Count; i++)
            {
                var player = highCardGame.PlayerOfCardsInGame[i];
                Assert.AreEqual(player.PlayerCards.Count, 1);
                if (i > 0)
                {
                    var previousPlayer = highCardGame.PlayerOfCardsInGame[i - 1];
                    if (previousPlayer.PlayerCards[0].GetRank() > player.PlayerCards[0].GetRank() &&
                        winningRank < previousPlayer.PlayerCards[0].GetRank())
                    {
                        winningRank = previousPlayer.PlayerCards[0].GetRank();
                    }
                    else if (previousPlayer.PlayerCards[0].GetRank() < player.PlayerCards[0].GetRank() &&
                             winningRank < player.PlayerCards[0].GetRank())
                    {
                        winningRank = player.PlayerCards[0].GetRank();
                    }
                    else if (winningRank < player.PlayerCards[0].GetRank())
                    {
                        winningRank = player.PlayerCards[0].GetRank();
                    }
                }
            }

            foreach (var player in highCardGame.PlayerOfCardsInGame)
            {
                if (player.PlayerCards[0].GetRank() == winningRank)
                {
                    winners.Add(player.PlayerNumber);
                }
            }

            //CollectionAssert.AreEqual
            Assert.AreEqual(evaluatedWinners.Count, winners.Count);

            foreach (var winner in winners)
            {
                Assert.IsTrue(evaluatedWinners.Exists(e => e == winner));
            }
        }