diff --git a/src/Mtlstats/Actions.hs b/src/Mtlstats/Actions.hs index c20e2da..951e236 100644 --- a/src/Mtlstats/Actions.hs +++ b/src/Mtlstats/Actions.hs @@ -31,6 +31,7 @@ module Mtlstats.Actions , updateGameStats , validateGameDate , createPlayer + , addPlayer ) where import Data.Maybe (fromMaybe) @@ -116,3 +117,15 @@ validateGameDate s = fromMaybe s $ do -- | Starts player creation mode createPlayer :: ProgState -> ProgState createPlayer = progMode .~ CreatePlayer newCreatePlayerState + +-- | Adds the entered player to the roster +addPlayer :: ProgState -> ProgState +addPlayer s = fromMaybe s $ do + let cps = s^.progMode.createPlayerStateL + num <- cps^.cpsNumber + let + name = cps^.cpsName + pos = cps^.cpsPosition + player = newPlayer num name pos + Just $ s & database.dbPlayers + %~ (player:) diff --git a/src/Mtlstats/Control.hs b/src/Mtlstats/Control.hs index 87587c7..7fe276b 100644 --- a/src/Mtlstats/Control.hs +++ b/src/Mtlstats/Control.hs @@ -57,6 +57,7 @@ dispatch s = case s^.progMode of | null $ cps^.cpsNumber -> getPlayerNumC | null $ cps^.cpsName -> getPlayerNameC | null $ cps^.cpsPosition -> getPlayerPosC + | not $ cps^.cpsConfirmed -> confirmCreatePlayerC | otherwise -> undefined mainMenuC :: Controller @@ -223,3 +224,22 @@ getPlayerPosC = Controller promptHandler playerPosPrompt e return True } + +confirmCreatePlayerC :: Controller +confirmCreatePlayerC = Controller + { drawController = \s -> do + let cps = s^.progMode.createPlayerStateL + C.drawString $ " Player number: " ++ show (fromJust $ cps^.cpsNumber) ++ "\n" + C.drawString $ " Player name: " ++ cps^.cpsName ++ "\n" + C.drawString $ "Player position: " ++ cps^.cpsPosition ++ "\n\n" + C.drawString "Create player: are you sure? (Y/N)" + return C.CursorInvisible + , handleController = \e -> do + case ynHandler e of + Just True -> do + modify addPlayer + modify $ progMode .~ MainMenu + Just False -> modify $ progMode .~ MainMenu + Nothing -> return () + return True + } diff --git a/test/ActionsSpec.hs b/test/ActionsSpec.hs index 3af72f5..470492f 100644 --- a/test/ActionsSpec.hs +++ b/test/ActionsSpec.hs @@ -40,6 +40,7 @@ spec = describe "Mtlstats.Actions" $ do updateGameStatsSpec validateGameDateSpec createPlayerSpec + addPlayerSpec startNewSeasonSpec :: Spec startNewSeasonSpec = describe "startNewSeason" $ do @@ -322,6 +323,30 @@ createPlayerSpec = describe "createPlayer" $ s = createPlayer newProgState in s^.progMode `shouldBe` CreatePlayer newCreatePlayerState +addPlayerSpec :: Spec +addPlayerSpec = describe "addPlayer" $ do + let + p1 = newPlayer 1 "Joe" "centre" + p2 = newPlayer 2 "Bob" "defense" + db = newDatabase + & dbPlayers .~ [p2] + s pm = newProgState + & progMode .~ pm + & database .~ db + + context "data available" $ + it "should create the player" $ let + s' = addPlayer $ s $ CreatePlayer $ newCreatePlayerState + & cpsNumber ?~ 1 + & cpsName .~ "Joe" + & cpsPosition .~ "centre" + in s'^.database.dbPlayers `shouldBe` [p1, p2] + + context "data unavailable" $ + it "should not create the player" $ let + s' = addPlayer $ s MainMenu + in s'^.database.dbPlayers `shouldBe` [p2] + makePlayer :: IO Player makePlayer = Player <$> makeNum