werewolf-0.5.4.0: test/src/Game/Werewolf/Test/Command/See.hs
{-|
Module : Game.Werewolf.Test.Command.See
Copyright : (c) Henry J. Wylde, 2016
License : BSD3
Maintainer : public@hjwylde.com
-}
module Game.Werewolf.Test.Command.See (
-- * Tests
allSeeCommandTests,
) where
import Control.Lens hiding (isn't)
import Game.Werewolf
import Game.Werewolf.Command.Seer
import Game.Werewolf.Test.Arbitrary
import Game.Werewolf.Test.Util
import Test.Tasty
import Test.Tasty.QuickCheck
allSeeCommandTests :: [TestTree]
allSeeCommandTests =
[ testProperty "see command errors when game is over" prop_seeCommandErrorsWhenGameIsOver
, testProperty "see command errors when caller does not exist" prop_seeCommandErrorsWhenCallerDoesNotExist
, testProperty "see command errors when target does not exist" prop_seeCommandErrorsWhenTargetDoesNotExist
, testProperty "see command errors when caller is dead" prop_seeCommandErrorsWhenCallerIsDead
, testProperty "see command errors when target is dead" prop_seeCommandErrorsWhenTargetIsDead
, testProperty "see command errors when not seer's turn" prop_seeCommandErrorsWhenNotSeersTurn
, testProperty "see command errors when caller not seer" prop_seeCommandErrorsWhenCallerNotSeer
]
prop_seeCommandErrorsWhenGameIsOver :: GameAtGameOver -> Property
prop_seeCommandErrorsWhenGameIsOver (GameAtGameOver game) =
forAll (arbitrarySeeCommand game) $ verbose_runCommandErrors game . getBlind
prop_seeCommandErrorsWhenCallerDoesNotExist :: GameAtSeersTurn -> Player -> Property
prop_seeCommandErrorsWhenCallerDoesNotExist (GameAtSeersTurn game) caller =
not (doesPlayerExist (caller ^. name) game)
==> forAll (arbitraryPlayer game) $ \target -> do
let command = seeCommand (caller ^. name) (target ^. name)
verbose_runCommandErrors game command
prop_seeCommandErrorsWhenTargetDoesNotExist :: GameAtSeersTurn -> Player -> Property
prop_seeCommandErrorsWhenTargetDoesNotExist (GameAtSeersTurn game) target = do
let seer = game ^?! players . seers
let command = seeCommand (seer ^. name) (target ^. name)
not (doesPlayerExist (target ^. name) game)
==> verbose_runCommandErrors game command
prop_seeCommandErrorsWhenCallerIsDead :: GameAtSeersTurn -> Property
prop_seeCommandErrorsWhenCallerIsDead (GameAtSeersTurn game) = do
let seer = game ^?! players . seers
let game' = killPlayer (seer ^. name) game
forAll (arbitraryPlayer game') $ \target -> do
let command = seeCommand (seer ^. name) (target ^. name)
verbose_runCommandErrors game' command
prop_seeCommandErrorsWhenTargetIsDead :: GameAtSeersTurn -> Property
prop_seeCommandErrorsWhenTargetIsDead (GameAtSeersTurn game) = do
let seer = game ^?! players . seers
forAll (arbitraryPlayer game) $ \target -> do
let game' = killPlayer (target ^. name) game
let command = seeCommand (seer ^. name) (target ^. name)
verbose_runCommandErrors game' command
prop_seeCommandErrorsWhenNotSeersTurn :: Game -> Property
prop_seeCommandErrorsWhenNotSeersTurn game =
hasn't (stage . _SeersTurn) game
==> forAll (arbitrarySeeCommand game) $ verbose_runCommandErrors game . getBlind
prop_seeCommandErrorsWhenCallerNotSeer :: GameAtSeersTurn -> Property
prop_seeCommandErrorsWhenCallerNotSeer (GameAtSeersTurn game) =
forAll (suchThat (arbitraryPlayer game) (isn't seer)) $ \caller ->
forAll (arbitraryPlayer game) $ \target -> do
let command = seeCommand (caller ^. name) (target ^. name)
verbose_runCommandErrors game command