public void DealerCanDeal([Values(0, 1, 2)] int playerIndex)
        {
            // Arrange
            string[] hands = new string[]
            {
                "♣2♦3♥4♠5♣7", "♣5♦7♥10♠Q♣A", "♥6♠9♣10♦J♣K"
            };

            MockDeck mockDeck = new MockDeck(3, hands);

            Dealer dealer = new Dealer(mockDeck);

            Player[] players = new Player[]
            {
                new Player("Jonas", 0, new ConsolePlayer()),
                new Player("Karl", 0, new ConsolePlayer()),
                new Player("Anna", 0, new ConsolePlayer())
            };

            // Act
            dealer.Deal(players);

            // Assert
            Assert.AreEqual(players[playerIndex].Hand.Count(), 5);

            Assert.IsTrue(mockDeck.DealerShuffledTheDeckBeforeDrawingCards);

            CollectionAssert.AreEqual(
                HandTest.StringToCards(hands[playerIndex]), players[playerIndex].Hand);
        }
 public MockDeck(int numberOfPlayers,
                 params string[] hands)
 {
     Card[][] handCards = hands.Select(h => HandTest.StringToCards(h)).ToArray();
     for (int i = 0; i < 5; ++i)
     {
         for (int j = 0; j < numberOfPlayers; ++j)
         {
             cards.Add(handCards[j][i]);
         }
     }
 }
        public void PlayerCanGiveBackHand()
        {
            // Arrange
            Player player = new Player("Jonas", 0, new ConsolePlayer());

            Card[] initialCards = HandTest.StringToCards("♣2♦3♥4♠5♣7");
            foreach (Card card in initialCards)
            {
                player.RecieveCard(card);
            }

            // Act

            Card[] cardsGivenBack = player.GiveBackHand().ToArray();

            // Assert

            Assert.AreEqual(0, player.Hand.Count());

            CollectionAssert.AreEqual(initialCards, cardsGivenBack);
        }
        public void PlayerCanThrowCards(
            [Values(true, false)] bool exchangeFirstCard,
            [Values(true, false)] bool exchangeSecondCard,
            [Values(true, false)] bool exchangeThirdCard,
            [Values(true, false)] bool exchangeFourthCard,
            [Values(true, false)] bool exchangeFifthCard
            )
        {
            // Arrange
            bool[] exchangeCard = new bool[] {
                exchangeFirstCard,
                exchangeSecondCard,
                exchangeThirdCard,
                exchangeFourthCard,
                exchangeFifthCard
            };

            List <int> indicesOfCardsForExchange =
                Enumerable.Range(0, 5).Zip(exchangeCard).Where(pair =>
                                                               pair.Second).Select(pair => pair.First).ToList();

            MockPlayerLogic playerLogic = new MockPlayerLogic(indicesOfCardsForExchange);
            Player          player      = new Player("Jonas", 0, playerLogic);

            Card[] initialCards = HandTest.StringToCards("♣2♦3♥4♠5♣7");
            foreach (Card card in initialCards)
            {
                player.RecieveCard(card);
            }
            List <Card> graveyard = new List <Card>();

            // Act
            player.ThrowCards(graveyard);

            // Assert
            int noOfExchangedCards = indicesOfCardsForExchange.Count;

            Assert.AreEqual(5 - noOfExchangedCards, player.Hand.Count());

            Card[] replacementCards =
                HandTest.StringToCards("♣5♦7♥10♠Q♣A")
                .Take(noOfExchangedCards)
                .ToArray();

            foreach (Card card in replacementCards)
            {
                player.RecieveCard(card);
            }

            Card[] playerShouldNowHowTheseCards =
                initialCards
                .Zip(exchangeCard)
                .Where(pair => !pair.Second)
                .Select(pair => pair.First)
                .Concat(replacementCards)
                .OrderBy(c => c.Rank)
                .ThenBy(c => c.Suite)
                .ToArray();

            CollectionAssert.AreEqual(playerShouldNowHowTheseCards, player.Hand);
        }