From 3c8302174b9e8eb955b7d3d251c943e2ea3f134b Mon Sep 17 00:00:00 2001 From: Jonathan Lamothe Date: Thu, 29 Aug 2019 00:12:30 -0400 Subject: [PATCH] implemented overtimeCheck --- src/Mtlstats/Actions.hs | 14 +++++++++- src/Mtlstats/Events.hs | 1 + src/Mtlstats/Types.hs | 20 ++++++++------ test/ActionsSpec.hs | 59 ++++++++++++++++++++++++++++++++++++++++- 4 files changed, 84 insertions(+), 10 deletions(-) diff --git a/src/Mtlstats/Actions.hs b/src/Mtlstats/Actions.hs index 106791f..8b895d3 100644 --- a/src/Mtlstats/Actions.hs +++ b/src/Mtlstats/Actions.hs @@ -27,9 +27,10 @@ module Mtlstats.Actions , startNewGame , addChar , removeChar + , overtimeCheck ) where -import Lens.Micro (over, (&), (.~), (?~), (%~)) +import Lens.Micro (over, (^.), (&), (.~), (?~), (%~)) import Mtlstats.Types @@ -58,3 +59,14 @@ removeChar :: ProgState -> ProgState removeChar = inputBuffer %~ \case "" -> "" str -> init str + +-- | Determines whether or not to perform a check for overtime +overtimeCheck :: ProgState -> ProgState +overtimeCheck s + | gameTied (s^.progMode.gameStateL) = + s & progMode.gameStateL + %~ (homeScore .~ Nothing) + . (awayScore .~ Nothing) + | gameWon (s^.progMode.gameStateL) = + s & progMode.gameStateL.overtimeFlag ?~ False + | otherwise = s diff --git a/src/Mtlstats/Events.hs b/src/Mtlstats/Events.hs index feeff2a..3c591e9 100644 --- a/src/Mtlstats/Events.hs +++ b/src/Mtlstats/Events.hs @@ -53,5 +53,6 @@ handleEvent e = gets (view progMode) >>= \case return True | null $ gs ^. awayScore -> do promptHandler awayScorePrompt e + modify overtimeCheck return True | otherwise -> undefined diff --git a/src/Mtlstats/Types.hs b/src/Mtlstats/Types.hs index 6a1f97e..5b504d4 100644 --- a/src/Mtlstats/Types.hs +++ b/src/Mtlstats/Types.hs @@ -47,6 +47,7 @@ module Mtlstats.Types ( otherTeam, homeScore, awayScore, + overtimeFlag, -- ** Database Lenses dbPlayers, dbGoalies, @@ -131,14 +132,16 @@ data ProgState = ProgState -- | The game state data GameState = GameState - { _gameType :: Maybe GameType + { _gameType :: Maybe GameType -- ^ The type of game (home/away) - , _otherTeam :: String + , _otherTeam :: String -- ^ The name of the other team - , _homeScore :: Maybe Int + , _homeScore :: Maybe Int -- ^ The home team's score - , _awayScore :: Maybe Int + , _awayScore :: Maybe Int -- ^ The away team's score + , _overtimeFlag :: Maybe Bool + -- ^ Indicates whether or not the game went into overtime } deriving (Eq, Show) -- | The program mode @@ -400,10 +403,11 @@ newProgState = ProgState -- | Constructor for a 'GameState' newGameState :: GameState newGameState = GameState - { _gameType = Nothing - , _otherTeam = "" - , _homeScore = Nothing - , _awayScore = Nothing + { _gameType = Nothing + , _otherTeam = "" + , _homeScore = Nothing + , _awayScore = Nothing + , _overtimeFlag = Nothing } -- | Constructor for a 'Database' diff --git a/test/ActionsSpec.hs b/test/ActionsSpec.hs index f1d513e..50595e3 100644 --- a/test/ActionsSpec.hs +++ b/test/ActionsSpec.hs @@ -22,7 +22,7 @@ along with this program. If not, see . module ActionsSpec (spec) where import Control.Monad (replicateM) -import Lens.Micro ((&), (.~), (?~), (^.)) +import Lens.Micro ((^.), (&), (.~), (?~), (%~)) import System.Random (randomRIO) import Test.Hspec (Spec, context, describe, it, shouldBe, shouldNotBe) @@ -36,6 +36,7 @@ spec = describe "Mtlstats.Actions" $ do resetYtdSpec addCharSpec removeCharSpec + overtimeCheckSpec startNewSeasonSpec :: Spec startNewSeasonSpec = describe "startNewSeason" $ do @@ -126,6 +127,62 @@ removeCharSpec = describe "removeChar" $ do & removeChar in s ^. inputBuffer `shouldBe` "fo" +overtimeCheckSpec = describe "overtimeCheck" $ do + + context "tie game" $ do + let + s = newProgState + & progMode.gameStateL + %~ (gameType ?~ HomeGame) + . (homeScore ?~ 1) + . (awayScore ?~ 1) + & overtimeCheck + + it "should clear the home score" $ + s^.progMode.gameStateL.homeScore `shouldBe` Nothing + + it "should clear the away score" $ + s^.progMode.gameStateL.awayScore `shouldBe` Nothing + + it "should leave the overtimeFlag blank" $ + s^.progMode.gameStateL.overtimeFlag `shouldBe` Nothing + + context "game won" $ do + let + s = newProgState + & progMode.gameStateL + %~ (gameType ?~ HomeGame) + . (homeScore ?~ 2) + . (awayScore ?~ 1) + & overtimeCheck + + it "should not change the home score" $ + s^.progMode.gameStateL.homeScore `shouldBe` Just 2 + + it "should not change the away score" $ + s^.progMode.gameStateL.awayScore `shouldBe` Just 1 + + it "should set the overtimeCheck flag to False" $ + s^.progMode.gameStateL.overtimeFlag `shouldBe` Just False + + context "game lost" $ do + let + s = newProgState + & progMode.gameStateL + %~ (gameType ?~ HomeGame) + . (homeScore ?~ 1) + . (awayScore ?~ 2) + & overtimeCheck + + it "should not change the home score" $ + s^.progMode.gameStateL.homeScore `shouldBe` Just 1 + + it "should not change the away score" $ + s^.progMode.gameStateL.awayScore `shouldBe` Just 2 + + it "should leave the overtimeCheck flag blank" $ + s^.progMode.gameStateL.overtimeFlag `shouldBe` Nothing + makePlayer :: IO Player makePlayer = Player <$> makeNum