public Deal(List<Player> players, Player dealer)
 {
     Players = players;
     Players.Select(p => p.Role = null);
     Dealer = Players.Single(p => p.Name == dealer.Name);
     Dealer.Role = CreateRole(players);
 }
        public void DealTest_PokerDeck()
        {
            // arrange
            Deck deck = DeckFactory.CreatePokerDeck();
            Player player = new Player();

            // arrange/act
            Assert.AreEqual(deck.Size, 54);

            ICard card = deck.GetNextCard();
            Assert.IsInstanceOfType(card, typeof(Card));
            player.Hand.AddCard(card);
            Assert.AreEqual(player.Hand.Size, 1);
            Assert.AreEqual(deck.Size, 53);

            card = deck.GetNextCard();
            Assert.IsInstanceOfType(card, typeof(Card));
            player.Hand.AddCard(card);
            Assert.AreEqual(player.Hand.Size, 2);
            Assert.AreEqual(deck.Size, 52);

            card = deck.GetNextCard();
            Assert.IsInstanceOfType(card, typeof(Card));
            player.Hand.AddCard(card);
            Assert.AreEqual(player.Hand.Size, 3);
            Assert.AreEqual(deck.Size, 51);
        }
        public Bet(Player player, decimal amount, object betTarget)
        {
            _player = player;
            Bettor.BetAmount = amount;
            BetTarget = betTarget;

            // we don't need to use the factory method pattern here to create a Bettor, since the Bet class delegates all
            // betting behavior to its Player member, which has its own member Bettor.

            // Bettor = CreateBettor();
        }
 public BlackjackBet(Player player, decimal amount, object betTarget) :
     base(player, amount, betTarget)
 {
 }
 public void AddPlayer(Player player)
 {
     _allPlayers.Add(player);
 }
 public Shuffle(Player shuffler)
 {
     Shuffler = shuffler;
     Shuffler.Role = new ShufflerRole();
 }
        private void BlackjackDealTransactionTest()
        {
            // arrange
            int numOfRoundsDealt = 0;
            List<Player> players = new List<Player>();
            Player alex = new Player { Name = "Alex" };
            Player bill = new Player { Name = "Bill" };
            Player charlie = new Player { Name = "Charlie" };
            players.Add(alex);
            players.Add(bill);
            players.Add(charlie);
            BlackjackDeal blackjackDeal = new BlackjackDeal(players, bill);

            // act
            blackjackDeal.Execute();

            // assert
            numOfRoundsDealt++;
            foreach (Player player in players)
            {
                Assert.AreEqual(player.Hand.Size, numOfRoundsDealt);
            }
            Assert.AreEqual(Deck.Instance.Size, Deck.Instance.FullDeckSize - (players.Count * numOfRoundsDealt));

            // act
            blackjackDeal.Execute();

            // assert
            numOfRoundsDealt++;
            foreach (Player player in players)
            {
                Assert.AreEqual(player.Hand.Size, numOfRoundsDealt);
            }
            Assert.AreEqual(Deck.Instance.Size, Deck.Instance.FullDeckSize - (players.Count * numOfRoundsDealt));

            // act
            blackjackDeal.Execute();

            // assert
            numOfRoundsDealt++;
            foreach (Player player in players)
            {
                Assert.AreEqual(player.Hand.Size, numOfRoundsDealt);
            }
            Assert.AreEqual(Deck.Instance.Size, Deck.Instance.FullDeckSize - (players.Count * numOfRoundsDealt));
        }
        public void BlackjackBetTransactionTest()
        {
            // arrange
            decimal startingChips = 100;
            decimal alexBetAmount = 5;
            decimal billBetAmount = 6;
            decimal charlieBetAmount = 7;
            List<Player> players = new List<Player>();
            Player alex = new Player(startingChips) { Name = "Alex" };
            Player bill = new Player(startingChips) { Name = "Bill" };
            Player charlie = new Player(startingChips) { Name = "Charlie" };

            players.Add(alex);
            players.Add(bill);
            players.Add(charlie);
            var bet1 = new BlackjackBet(alex, alexBetAmount, Pot.Instance);
            var bet2 = new BlackjackBet(bill, billBetAmount, Pot.Instance);
            var bet3 = new BlackjackBet(charlie, charlieBetAmount, Pot.Instance);

            // act
            bet1.Execute();
            bet2.Execute();
            bet3.Execute();

            // assert
            Assert.AreEqual<decimal>(Pot.Instance.Chips, alexBetAmount + billBetAmount + charlieBetAmount);
            Assert.AreEqual<decimal>(alex.Bettor.Chips, startingChips - alexBetAmount);
            Assert.AreEqual<decimal>(alex.Bettor.Chips, bet1.Bettor.Chips);
            Assert.AreEqual<decimal>(bill.Bettor.Chips, startingChips - billBetAmount);
            Assert.AreEqual<decimal>(bill.Bettor.Chips, bet2.Bettor.Chips);
            Assert.AreEqual<decimal>(charlie.Bettor.Chips, startingChips - charlieBetAmount);
            Assert.AreEqual<decimal>(charlie.Bettor.Chips, bet3.Bettor.Chips);

            // simulate three winner splitting the pot

            // act
            Pot.Instance.TakePot(players.Select(p => p.Bettor).ToList());

            // assert
            decimal potAmount = alexBetAmount + billBetAmount + charlieBetAmount;
            Assert.AreEqual<decimal>(alex.Bettor.Chips, startingChips - alexBetAmount + (potAmount / 3.0M));
            Assert.AreEqual<decimal>(bill.Bettor.Chips, startingChips - billBetAmount + (potAmount / 3.0M));
            Assert.AreEqual<decimal>(charlie.Bettor.Chips, startingChips - charlieBetAmount + (potAmount / 3.0M));
            Assert.AreEqual<decimal>(Pot.Instance.Chips, 0);
        }
        public void BlackjackIdentifyWinnerTransactionTest_BasicDeck()
        {
            // arrange
            List<Player> players = new List<Player>();
            Player alex = new Player { Name = "Alex" };
            Player bill = new Player { Name = "Bill" };
            Player charlie = new Player { Name = "Charlie" };
            players.Add(alex);
            players.Add(bill);
            players.Add(charlie);

            Shuffle shuffle = new Shuffle(bill);
            shuffle.Execute();

            BlackjackDeal blackjackDeal = new BlackjackDeal(players, bill);
            Random rand = new Random(DateTime.Now.Millisecond);
            int upperBound = rand.Next(2,6);
            // deal anywhere from 2 to 5 cards to each player
            for (int i = 1; i <= upperBound; i++)
            {
                blackjackDeal.Execute();
            }            

            IdentifyWinnerBlackjack identWinner = new IdentifyWinnerBlackjack(players);

            // act
            identWinner.Execute();

            // assert
                // verify that the winner(s) has/have the highest score
            Assert.AreEqual(players.Where(p => p.HandStatus == HandStatus.Winner).Select(p => p.Hand.Score).Max(), players.Select(p => p.Hand.Score).Max());
        }
        public void BlackjackShuffleTransactionTest_PokerDeck()
        {
            // arrange
            Deck.Instance = DeckFactory.CreatePokerDeck();
            List<Player> players = new List<Player>();
            Player alex = new Player { Name = "Alex" };
            Player bill = new Player { Name = "Bill" };
            Player charlie = new Player { Name = "Charlie" };
            players.Add(alex);
            players.Add(bill);
            players.Add(charlie);
            Shuffle shuffle = new Shuffle(bill);

            // act
            shuffle.Execute();

            // assert
            Assert.IsTrue(IsDeckShuffled(Deck.Instance));
        }
        public void BlackjackShuffleTransactionTest_BasicDeck()
        {
            // NOTE: A game transaction using the basic (52-card) deck requires no explicit instantiation of the deck
            // by the client code; a basic deck is the default Instance.

            // arrange
            List<Player> players = new List<Player>();
            Player alex = new Player { Name = "Alex" };
            Player bill = new Player { Name = "Bill" };
            Player charlie = new Player { Name = "Charlie" };
            players.Add(alex);
            players.Add(bill);
            players.Add(charlie);
            Shuffle shuffle = new Shuffle(bill);

            // act
            shuffle.Execute();

            // assert
            Assert.IsTrue(IsDeckShuffled(Deck.Instance));            
        }
        public void BlackjackBetTest_MultipleWinners()
        {
            // arrange
            decimal startingChips = 100.0M;
            decimal betAmount = 5.00M;
            Pot.Instance.Chips = 0;
            List<Player> players = new List<Player>();
            Player alex = new Player { Name = "Alex", Bettor = new BlackjackBettor(startingChips) };
            Player bill = new Player { Name = "Bill", Bettor = new BlackjackBettor(startingChips) };
            Player charlie = new Player { Name = "Charlie", Bettor = new BlackjackBettor(startingChips) };
            players.Add(alex);
            players.Add(bill);
            players.Add(charlie);

            // act
            foreach (var player in players)
            {
                player.Bettor.BetAmount = betAmount;
                player.Bettor.Bet();
            }

            // assert
            Assert.AreEqual<decimal>(Pot.Instance.Chips, betAmount * players.Count);
            foreach (var player in players)
            {
                Assert.AreEqual<decimal>(player.Bettor.Chips, startingChips - betAmount);
            }

            // simulate three winner splitting the pot

            // act
            Pot.Instance.TakePot(players.Select(p => p.Bettor).ToList());

            // assert
            Assert.AreEqual<decimal>(alex.Bettor.Chips, startingChips);
            Assert.AreEqual<decimal>(bill.Bettor.Chips, startingChips);
            Assert.AreEqual<decimal>(charlie.Bettor.Chips, startingChips);
            Assert.AreEqual<decimal>(Pot.Instance.Chips, 0);
        }
        public void ScoreHandTest_Blackjack_Aces_BasicDeck()
        {
            // arrange
            IdentifyWinnerBlackjack identWinnerBlackjack = new IdentifyWinnerBlackjack(null);
            Player player = new Player();
            long expectedScore = 0;
            player.Hand.AddCard(new Card() { Name = CardName.Ace, Suit = CardSuit.Clubs});
            expectedScore = 11;

            // act
            identWinnerBlackjack.ScoreHand(player.Hand);

            // assert
            Assert.AreEqual(expectedScore, player.Hand.Score);

            // arrange
            player.Hand.AddCard(new Card() { Name = CardName.Ace, Suit = CardSuit.Diamonds });
            expectedScore = 12;  // value the Ace as 1, not 11, or we would bust

            // act
            identWinnerBlackjack.ScoreHand(player.Hand);

            // assert
            Assert.AreEqual(expectedScore, player.Hand.Score);

            // arrange
            player.Hand.AddCard(new Card() { Name = CardName.Two, Suit = CardSuit.Diamonds });
            expectedScore = 14;

            // act
            identWinnerBlackjack.ScoreHand(player.Hand);

            // assert
            Assert.AreEqual(expectedScore, player.Hand.Score);

            // arrange
            player.Hand.AddCard(new Card() { Name = CardName.King, Suit = CardSuit.Diamonds });
            expectedScore = 14;  // both Aces should now be valued as 1 to avoid a bust

            // act
            identWinnerBlackjack.ScoreHand(player.Hand);

            // assert
            Assert.AreEqual(expectedScore, player.Hand.Score);

            // arrange
            player.Hand.AddCard(new Card() { Name = CardName.Nine, Suit = CardSuit.Diamonds });
            expectedScore = -1;  // even with both Aces valued as 1, we will still bust

            // act
            identWinnerBlackjack.ScoreHand(player.Hand);

            // assert
            Assert.AreEqual(expectedScore, player.Hand.Score);
        }
 public void SetDealer(Player player)
 {
     Players.Select(p => p.Role = null).ToArray();  // clear all players' roles
     Players.Single(p => p.Name == player.Name).Role = new BlackjackDealerRole(Players);
     Dealer = player;
 }
 public void RemovePlayer(Player player)
 {
     Players.Remove(player);
 }