public void TestEvaluateWinningHand()
        {
            //Arrange
            PokerBL     pokerBl     = new PokerBL();
            PokerHandBL pokerHandBl = new PokerHandBL();
            DeckBL      deckBl      = new DeckBL();
            Deck        deck        = new Deck();

            deckBl.Initialize(deck);

            PokerHand player1 = new PokerHand(deck, "Player1");
            PokerHand player2 = new PokerHand(deck, "Player2");
            PokerHand player3 = new PokerHand(deck, "Player3");

            player1.Hand = pokerHandBl.PullCards(player1);
            player2.Hand = pokerHandBl.PullCards(player2);
            player3.Hand = pokerHandBl.PullCards(player3);

            var playerList = new List <PokerHand>()
            {
                player1,
                player2,
                player3
            };


            foreach (var player in playerList)
            {
                player.PokerScore = pokerBl.EvaluatePokerHand(player);
            }

            var winningHand = playerList.OrderByDescending(x => x.PokerScore).First();

            //This test does not determine which player won the game in case of a tie, only the hand with highest score (first or default)

            //Act
            var result = pokerBl.EvaluateWinningHand(playerList);

            //Assert
            Assert.AreEqual(winningHand.PokerScore, result.PokerScore, "Poker Hand with highest score did not win the game.");
        }
        public void TestIsOnePair_NoPair()
        {
            PokerBL   pokerBl   = new PokerBL();
            PokerHand pokerHand = new PokerHand(new Deck(), "Player");

            //Arrange
            var cardList = new List <Card>()
            {
                new Card(CardRank.Two, CardSuit.Spades),
                new Card(CardRank.Jack, CardSuit.Diamonds),
                new Card(CardRank.Four, CardSuit.Spades),
                new Card(CardRank.Five, CardSuit.Club),
                new Card(CardRank.King, CardSuit.Spades)
            };

            pokerHand.Hand = cardList;

            //Act
            var result = pokerBl.isOnePair(pokerHand);

            //Assert
            Assert.AreEqual(false, result, "Current Hand should not contain a Pair.");
        }
        public void TestIsFlush()
        {
            PokerBL   pokerBl   = new PokerBL();
            PokerHand pokerHand = new PokerHand(new Deck(), "Player");

            //Arrange
            var cardList = new List <Card>()
            {
                new Card(CardRank.Two, CardSuit.Spades),
                new Card(CardRank.Three, CardSuit.Spades),
                new Card(CardRank.Four, CardSuit.Spades),
                new Card(CardRank.Five, CardSuit.Spades),
                new Card(CardRank.Six, CardSuit.Spades)
            };

            pokerHand.Hand = cardList;

            //Act
            var result = pokerBl.isFlush(pokerHand);

            //Assert
            Assert.AreEqual(true, result, "Current Hand is not a Flush.");
        }
        public void TestGetHighCard()
        {
            PokerBL   pokerBl   = new PokerBL();
            PokerHand pokerHand = new PokerHand(new Deck(), "Player");

            //Arrange
            var cardList = new List <Card>()
            {
                new Card(CardRank.Two, CardSuit.Spades),
                new Card(CardRank.Six, CardSuit.Diamonds),
                new Card(CardRank.Jack, CardSuit.Spades),
                new Card(CardRank.King, CardSuit.Club),
                new Card(CardRank.Ace, CardSuit.Spades)
            };

            pokerHand.Hand = cardList;

            //Act Test
            var result = pokerBl.GetHighCard(pokerHand);

            //Assert
            Assert.AreEqual(14, result, "Could not retrieve High Card.");
        }
        public void TestThreeOfAKind()
        {
            PokerBL   pokerBl   = new PokerBL();
            PokerHand pokerHand = new PokerHand(new Deck(), "Player");

            //Arrange
            var cardList = new List <Card>()
            {
                new Card(CardRank.Two, CardSuit.Spades),
                new Card(CardRank.Two, CardSuit.Diamonds),
                new Card(CardRank.King, CardSuit.Spades),
                new Card(CardRank.King, CardSuit.Club),
                new Card(CardRank.King, CardSuit.Spades)
            };

            pokerHand.Hand = cardList;

            //Act
            var result = pokerBl.isThreeOfAKind(pokerHand);

            //Assert
            Assert.AreEqual(true, result, "Current Hand is a not a Three Of A Kind.");
        }
        public void TestThreeOfAKindTieBreaker()
        {
            //Arrange
            PokerBL     pokerBl     = new PokerBL();
            PokerHandBL pokerHandBl = new PokerHandBL();
            DeckBL      deckBl      = new DeckBL();
            Deck        deck        = new Deck();

            deckBl.Initialize(deck);

            PokerHand player1 = new PokerHand(deck, "Player1");
            PokerHand player2 = new PokerHand(deck, "Player2");
            PokerHand player3 = new PokerHand(deck, "Player3");

            //Assign cards to players manually to simulate One Pair Tie Breaker
            var player1CardList = new List <Card>()
            {
                new Card(CardRank.Jack, CardSuit.Hearts),
                new Card(CardRank.Six, CardSuit.Diamonds),
                new Card(CardRank.Jack, CardSuit.Spades),
                new Card(CardRank.Jack, CardSuit.Club),
                new Card(CardRank.Jack, CardSuit.Diamonds)
            };

            var player2CardList = new List <Card>()
            {
                new Card(CardRank.Two, CardSuit.Spades),
                new Card(CardRank.Two, CardSuit.Diamonds),
                new Card(CardRank.Jack, CardSuit.Spades),
                new Card(CardRank.King, CardSuit.Club),
                new Card(CardRank.Two, CardSuit.Hearts)
            };

            var player3CardList = new List <Card>()
            {
                new Card(CardRank.King, CardSuit.Spades),
                new Card(CardRank.King, CardSuit.Diamonds),
                new Card(CardRank.Jack, CardSuit.Spades),
                new Card(CardRank.King, CardSuit.Club),
                new Card(CardRank.Ace, CardSuit.Spades)
            };

            player1.Hand = player1CardList;
            player2.Hand = player2CardList;
            player3.Hand = player3CardList;

            var playerList = new List <PokerHand>()
            {
                player1,
                player2,
                player3
            };

            var winningHand = player3;

            //Act
            var result = pokerBl.EvaluateWinningHand(playerList);

            //Assert
            Assert.AreEqual(winningHand.PlayerName, result.PlayerName, "Player with winning three of a kind hand did not win the game.");
        }