packages feed

general-games-0.2.0: test/Spec.hs

import Test.Hspec
import Game.Game.Poker
import Game.Implement.Card
import Game.Implement.Card.Standard


allHandsCount :: Int
allHandsCount = length allPossibleHands
allHandsCountExpected :: Int
allHandsCountExpected = 2598960
allRoyalFlushCountExpected :: Int
allRoyalFlushCountExpected = 4
allStraightFlushCountExpected :: Int
allStraightFlushCountExpected = 36
allFourOfAKindCountExpected :: Int
allFourOfAKindCountExpected = 624
allFullHouseCountExpected :: Int
allFullHouseCountExpected = 3744
allFlushCountExpected :: Int
allFlushCountExpected = 5108
allStraightCountExpected :: Int
allStraightCountExpected = 10200
allThreeOfAKindCountExpected :: Int
allThreeOfAKindCountExpected = 54912
allTwoPairCountExpected :: Int
allTwoPairCountExpected = 123552
allPairCountExpected :: Int
allPairCountExpected = 1098240
allHighCardCountExpected :: Int
allHighCardCountExpected = 1302540

royalFlush :: [PlayingCard]
royalFlush =
  [PlayingCard Ace Hearts,
   PlayingCard Queen Hearts,
   PlayingCard King Hearts,
   PlayingCard Jack Hearts,
   PlayingCard Ten Hearts]

royalFlushNot :: [PlayingCard]
royalFlushNot =
  [PlayingCard Ace Hearts,
   PlayingCard Queen Hearts,
   PlayingCard Eight Hearts,
   PlayingCard Jack Hearts,
   PlayingCard Ten Hearts]

drawDeck :: [PlayingCard]
drawDeck =
  [PlayingCard Five Diamonds,
   PlayingCard Seven Clubs,
   PlayingCard Two Spades,
   PlayingCard King Spades,
   PlayingCard King Hearts,
   PlayingCard Ace Diamonds,
   PlayingCard Seven Diamonds,
   PlayingCard Three Clubs,
   PlayingCard Four Clubs]


drawDeckSizes :: [Int]
drawDeckSizes = [1,4,2]

drawDeckSizesFail :: [Int]
drawDeckSizesFail = [5,9]

drawDeckSizesFailNeg :: [Int]
drawDeckSizesFailNeg = [-3,4]


drawDeckExpectedOutput :: Maybe ([[PlayingCard]],[PlayingCard])
drawDeckExpectedOutput = Just
  ([[PlayingCard Five Diamonds],
   [PlayingCard Seven Clubs,
   PlayingCard Two Spades,
   PlayingCard King Spades,
   PlayingCard King Hearts],
   [PlayingCard Ace Diamonds,
   PlayingCard Seven Diamonds]],
   [PlayingCard Three Clubs,
   PlayingCard Four Clubs])

main :: IO ()
main = hspec $ do
  describe "Game.Implement.Card instance" $ do
    it "returns drawn hands from a deck, plus the remaining deck" $ do
      (draw drawDeckSizes drawDeck) `shouldBe` drawDeckExpectedOutput
    it "returns Nothing when trying to return more cards than in deck" $ do
      (draw drawDeckSizesFail drawDeck) `shouldBe` Nothing
    it "returns Nothing when trying to return negative cards" $ do
      (draw drawDeckSizesFailNeg drawDeck) `shouldBe` Nothing

  describe "Game.Implement.Card.Standard.Poker.isRoyalFlush" $ do
    it "confirms that [AH, QH, KH, JH, TH] is a Royal Flush" $ do
      (isRoyalFlush royalFlush) `shouldBe` True
    it "confirms that [AH, QH, 8H, JH, TH] is not a Royal Flush" $ do
      (isRoyalFlush royalFlushNot) `shouldBe` False
  describe "Game.Implement.Card.Standard.Poker allPossibleHands / isHand functions" $ do
    it "confirms the total number of poker hands" $ do
      allHandsCount `shouldBe` allHandsCountExpected
    it "confirms the total number of royal flushes" $ do
      (length allRoyalFlush) `shouldBe` allRoyalFlushCountExpected
    it "confirms the total number of straight flushes" $ do
      (length allStraightFlush) `shouldBe` allStraightFlushCountExpected
    it "confirms the total number of four-of-a-kinds" $ do
      (length allFourOfAKind) `shouldBe` allFourOfAKindCountExpected
    it "confirms the total number of full houses" $ do
      (length allFullHouse) `shouldBe` allFullHouseCountExpected
    it "confirms the total number of flushes" $ do
      (length allFlush) `shouldBe` allFlushCountExpected
    it "confirms the total number of straights" $ do
      (length allStraight) `shouldBe` allStraightCountExpected
    it "confirms the total number of three-of-a-kinds" $ do
      (length allThreeOfAKind) `shouldBe` allThreeOfAKindCountExpected
    it "confirms the total number of two-pairs" $ do
      (length allTwoPair) `shouldBe` allTwoPairCountExpected
    it "confirms the total number of pairs" $ do
      (length allPair) `shouldBe` allPairCountExpected
    it "confirms the total number of high card hands" $ do
      (length allHighCard) `shouldBe` allHighCardCountExpected