{-| Module : Game.Werewolf.Test.Command.Heal Copyright : (c) Henry J. Wylde, 2016 License : BSD3 Maintainer : public@hjwylde.com -} module Game.Werewolf.Test.Command.Heal ( -- * Tests allHealCommandTests, ) where import Control.Lens hiding (isn't) import Game.Werewolf import Game.Werewolf.Command.Witch import Game.Werewolf.Test.Arbitrary import Game.Werewolf.Test.Util import Test.Tasty import Test.Tasty.QuickCheck allHealCommandTests :: [TestTree] allHealCommandTests = [ testProperty "heal command errors when game is over" prop_healCommandErrorsWhenGameIsOver , testProperty "heal command errors when caller does not exist" prop_healCommandErrorsWhenCallerDoesNotExist , testProperty "heal command errors when caller is dead" prop_healCommandErrorsWhenCallerIsDead , testProperty "heal command errors when no target is devoured" prop_healCommandErrorsWhenNoTargetIsDevoured , testProperty "heal command errors when not witch's turn" prop_healCommandErrorsWhenNotWitchsTurn , testProperty "heal command errors when caller has healed" prop_healCommandErrorsWhenCallerHasHealed , testProperty "heal command errors when caller not witch" prop_healCommandErrorsWhenCallerNotWitch ] prop_healCommandErrorsWhenGameIsOver :: GameAtGameOver -> Property prop_healCommandErrorsWhenGameIsOver (GameAtGameOver game) = verbose_runHealCommandErrors game prop_healCommandErrorsWhenCallerDoesNotExist :: GameWithDevourEvent -> Player -> Property prop_healCommandErrorsWhenCallerDoesNotExist (GameWithDevourEvent game) caller = not (doesPlayerExist (caller ^. name) game) ==> verbose_runCommandErrors game (healCommand (caller ^. name)) prop_healCommandErrorsWhenCallerIsDead :: GameWithDevourEvent -> Property prop_healCommandErrorsWhenCallerIsDead (GameWithDevourEvent game) = forAll (arbitraryPlayer game) $ \caller -> do let game' = killPlayer (caller ^. name) game let command = healCommand (caller ^. name) verbose_runCommandErrors game' command prop_healCommandErrorsWhenNoTargetIsDevoured :: GameAtWitchsTurn -> Property prop_healCommandErrorsWhenNoTargetIsDevoured (GameAtWitchsTurn game) = verbose_runHealCommandErrors game prop_healCommandErrorsWhenNotWitchsTurn :: Game -> Property prop_healCommandErrorsWhenNotWitchsTurn game = hasn't (stage . _WitchsTurn) game ==> verbose_runHealCommandErrors game prop_healCommandErrorsWhenCallerHasHealed :: GameWithHeal -> Property prop_healCommandErrorsWhenCallerHasHealed (GameWithHeal game) = verbose_runHealCommandErrors game prop_healCommandErrorsWhenCallerNotWitch :: GameWithDevourEvent -> Property prop_healCommandErrorsWhenCallerNotWitch (GameWithDevourEvent game) = forAll (suchThat (arbitraryPlayer game) (isn't witch)) $ \caller -> do let command = healCommand (caller ^. name) verbose_runCommandErrors game command verbose_runHealCommandErrors :: Game -> Property verbose_runHealCommandErrors game = do let witch = game ^?! players . witches let command = healCommand $ witch ^. name verbose_runCommandErrors game command