From 4941e0e64ffe3db698b9cc0890afd355b961ecf6 Mon Sep 17 00:00:00 2001 From: Jonathan Lamothe Date: Thu, 28 Nov 2019 01:42:22 -0500 Subject: [PATCH] award shutouts --- src/Mtlstats/Actions/NewGame.hs | 18 ++++++++++++++ src/Mtlstats/Control/NewGame.hs | 7 +++--- test/Actions/NewGameSpec.hs | 43 +++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 3 deletions(-) diff --git a/src/Mtlstats/Actions/NewGame.hs b/src/Mtlstats/Actions/NewGame.hs index f8a8648..68841eb 100644 --- a/src/Mtlstats/Actions/NewGame.hs +++ b/src/Mtlstats/Actions/NewGame.hs @@ -28,6 +28,7 @@ module Mtlstats.Actions.NewGame , awardAssist , resetGoalData , assignPMins + , awardShutouts ) where import qualified Data.Map as M @@ -171,3 +172,20 @@ assignPMins mins s = fromMaybe s $ do (psPMin +~ mins) ) . (gameSelectedPlayer .~ Nothing) + +-- | Awards a shutout to any 'Goalie' who played and didn't allow any +-- goals +awardShutouts :: ProgState -> ProgState +awardShutouts s = foldl + (\gs (gid, stats) -> if stats^.gsGoalsAllowed == 0 + then gs + & database.dbGoalies %~ modifyNth gid + ( ( gYtd.gsShutouts %~ succ ) + . ( gLifetime.gsShutouts %~ succ ) + ) + & progMode.gameStateL.gameGoalieStats %~ M.adjust + (gsShutouts %~ succ) + gid + else gs) + s + (M.toList $ s^.progMode.gameStateL.gameGoalieStats) diff --git a/src/Mtlstats/Control/NewGame.hs b/src/Mtlstats/Control/NewGame.hs index 79f43c2..f534f2b 100644 --- a/src/Mtlstats/Control/NewGame.hs +++ b/src/Mtlstats/Control/NewGame.hs @@ -106,9 +106,10 @@ verifyDataC = Controller return C.CursorInvisible , handleController = \e -> do case ynHandler e of - Just True -> do - modify $ progMode.gameStateL.dataVerified .~ True - modify updateGameStats + Just True -> modify + $ (progMode.gameStateL.dataVerified .~ True) + . updateGameStats + . awardShutouts Just False -> modify $ progMode.gameStateL .~ newGameState Nothing -> return () return True diff --git a/test/Actions/NewGameSpec.hs b/test/Actions/NewGameSpec.hs index eb1acb5..8bdb95d 100644 --- a/test/Actions/NewGameSpec.hs +++ b/test/Actions/NewGameSpec.hs @@ -44,6 +44,7 @@ spec = describe "NewGame" $ do awardAssistSpec resetGoalDataSpec assignPMinsSpec + awardShutoutsSpec GoalieInput.spec overtimeCheckSpec :: Spec @@ -481,3 +482,45 @@ assignPMinsSpec = describe "assignPMins" $ let , ( Just 2, 4, 3, 2, 6, 5, 0 ) , ( Nothing, 4, 3, 2, 6, 5, 0 ) ] + +awardShutoutsSpec :: Spec +awardShutoutsSpec = describe "awardShutouts" $ let + joe = newGoalie 2 "Joe" + & gYtd.gsShutouts .~ 1 + & gLifetime.gsShutouts .~ 2 + + bob = newGoalie 3 "Bob" + & gYtd.gsShutouts .~ 3 + & gLifetime.gsShutouts .~ 4 + + steve = newGoalie 5 "Steve" + & gYtd.gsShutouts .~ 5 + & gLifetime.gsShutouts .~ 6 + + ps = newProgState + & database.dbGoalies .~ [joe, bob, steve] + & progMode.gameStateL.gameGoalieStats .~ M.fromList + [ ( 0, newGoalieStats & gsGoalsAllowed .~ 1 ) + , ( 1, newGoalieStats ) + ] + & awardShutouts + + in mapM_ + (\(name, gid, expectedGame, expectedYtd, expectedLt) -> context name $ let + game = M.findWithDefault newGoalieStats gid $ + ps^.progMode.gameStateL.gameGoalieStats + goalie = (ps^.database.dbGoalies) !! gid + in mapM_ + (\(label, actual, expected) -> context label $ + it ("should be " ++ show actual) $ + actual `shouldBe` expected) + -- label, actual, expected + [ ( "Game", game^.gsShutouts, expectedGame ) + , ( "YTD", goalie^.gYtd.gsShutouts, expectedYtd ) + , ( "lifetime", goalie^.gLifetime.gsShutouts, expectedLt ) + ]) + -- goalie, goalie ID, Game, YTD, lifetime + [ ( "Joe", 0, 0, 1, 2 ) + , ( "Bob", 1, 1, 4, 5 ) + , ( "Steve", 2, 0, 5, 6 ) + ]