/// <summary>
        /// Verifies that cards given by player are not duplicate and that player has those cards
        /// </summary>
        /// <param name="hand">Player's cards</param>
        /// <param name="initialMove">Players attempted move</param>
        /// <returns>True, if move is legal</returns>
        public static bool IsLegal(Hand hand, InitialMove initialMove)
        {
            //Check that cards are different
            var givenCards = new[] { initialMove.ToBottle, initialMove.ToLeft, initialMove.ToRight };

            if (givenCards.Distinct().Count() != givenCards.Length)
            {
                return(false);
            }

            //Check that player actually has those cards
            return(givenCards.All(hand.HasCard));
        }
        public void IsLegal_ReturnsTrueIfPlayeHasCards()
        {
            var cards = new Card[]
            {
                new Card(CardType.Blue, 12, DefaultScore),
                new Card(CardType.Blue, 13, DefaultScore),
                new Card(CardType.Blue, 14, DefaultScore)
            };

            var initialMove = new InitialMove(new Card(CardType.Blue, 12, DefaultScore), new Card(CardType.Blue, 13, DefaultScore), new Card(CardType.Blue, 14, DefaultScore));

            Assert.IsTrue(InitialMoveRule.IsLegal(new Hand(cards), initialMove));
        }
        public void IsLegal_ReturnsFalseIfCardGivenIsNotInPlayersCards()
        {
            var cards = new Card[]
            {
                new Card(CardType.Blue, 12, DefaultScore),
                new Card(CardType.Blue, 13, DefaultScore),
                new Card(CardType.Blue, 14, DefaultScore)
            };

            var initialMove = new InitialMove(new Card(CardType.Red, 12, DefaultScore), new Card(CardType.Red, 13, DefaultScore), new Card(CardType.Red, 14, DefaultScore));

            Assert.False(InitialMoveRule.IsLegal(new Hand(cards), initialMove));
        }
        public void IsLegal_ReturnsFalseIfCardIsGivenMultipleTimes()
        {
            var cards = new Card[]
            {
                new Card(CardType.Blue, 12, DefaultScore),
                new Card(CardType.Blue, 13, DefaultScore),
                new Card(CardType.Blue, 14, DefaultScore)
            };

            var initialMove = new InitialMove(
                new Card(CardType.Blue, 12, DefaultScore),
                new Card(CardType.Blue, 12, DefaultScore),
                new Card(CardType.Blue, 13, DefaultScore));

            Assert.False(InitialMoveRule.IsLegal(new Hand(cards), initialMove));
        }