diff --git a/src/Mtlstats/Actions/EditStandings.hs b/src/Mtlstats/Actions/EditStandings.hs index 6c81837..c46f57d 100644 --- a/src/Mtlstats/Actions/EditStandings.hs +++ b/src/Mtlstats/Actions/EditStandings.hs @@ -40,28 +40,31 @@ editStandings = progMode .~ EditStandings ESMMenu -- | Edits the home standings editHomeStandings :: ProgState -> ProgState -editHomeStandings = progMode .~ EditStandings ESMHome +editHomeStandings = progMode .~ EditStandings (ESMHome ESMSubMenu) -- | Edits the road standings editAwayStandings :: ProgState -> ProgState -editAwayStandings = progMode .~ EditStandings ESMAway +editAwayStandings = progMode .~ EditStandings (ESMAway ESMSubMenu) -- | Changes to edit wins mode editWins :: ProgState -> ProgState -editWins = undefined +editWins = doEdit ESMEditWins -- | Changes to edit losses mode editLosses :: ProgState -> ProgState -editLosses = undefined +editLosses = doEdit ESMEditLosses -- | Changes to edit overtime mode editOvertime :: ProgState -> ProgState -editOvertime = undefined +editOvertime = doEdit ESMEditOvertime -- | Changes to edit goals for mode editGoalsFor :: ProgState -> ProgState -editGoalsFor = undefined +editGoalsFor = doEdit ESMEditGoalsFor -- | Changes to edit goals against mode editGoalsAgainst :: ProgState -> ProgState -editGoalsAgainst = undefined +editGoalsAgainst = doEdit ESMEditGoalsAgainst + +doEdit :: ESMSubMode -> ProgState -> ProgState +doEdit = (progMode.editStandingsModeL.esmSubModeL .~) diff --git a/src/Mtlstats/Control/EditStandings.hs b/src/Mtlstats/Control/EditStandings.hs index 12448df..b5bf348 100644 --- a/src/Mtlstats/Control/EditStandings.hs +++ b/src/Mtlstats/Control/EditStandings.hs @@ -34,15 +34,19 @@ import Mtlstats.Types -- | Controller for the edit standings menu editStandingsC :: EditStandingsMode -> Controller editStandingsC = \case - ESMMenu -> menuControllerWith header editStandingsMenu - ESMHome -> editHomeStandingsC - ESMAway -> editAwayStandingsC + ESMMenu -> menuControllerWith header editStandingsMenu + ESMHome m -> editHomeStandingsC m + ESMAway m -> editAwayStandingsC m -editHomeStandingsC :: Controller -editHomeStandingsC = menuControllerWith header editHomeStandingsMenu +editHomeStandingsC :: ESMSubMode -> Controller +editHomeStandingsC = \case + ESMSubMenu -> menuControllerWith header editHomeStandingsMenu + _ -> undefined -editAwayStandingsC :: Controller -editAwayStandingsC = menuControllerWith header editAwayStandingsMenu +editAwayStandingsC :: ESMSubMode -> Controller +editAwayStandingsC = \case + ESMSubMenu -> menuControllerWith header editAwayStandingsMenu + _ -> undefined header :: ProgState -> C.Update () header = do diff --git a/src/Mtlstats/Types.hs b/src/Mtlstats/Types.hs index e77b0ab..454d267 100644 --- a/src/Mtlstats/Types.hs +++ b/src/Mtlstats/Types.hs @@ -36,6 +36,7 @@ module Mtlstats.Types ( EditGoalieState (..), EditGoalieMode (..), EditStandingsMode (..), + ESMSubMode (..), Database (..), Player (..), PlayerStats (..), @@ -58,6 +59,8 @@ module Mtlstats.Types ( editPlayerStateL, editGoalieStateL, editStandingsModeL, + -- ** EditStandingsMode Lenses + esmSubModeL, -- ** GameState Lenses gameYear, gameMonth, @@ -396,8 +399,18 @@ data EditGoalieMode -- | Represents the standings edit mode data EditStandingsMode = ESMMenu - | ESMHome - | ESMAway + | ESMHome ESMSubMode + | ESMAway ESMSubMode + deriving (Eq, Show) + +-- | Represents the standings edit sub-mode +data ESMSubMode + = ESMSubMenu + | ESMEditWins + | ESMEditLosses + | ESMEditOvertime + | ESMEditGoalsFor + | ESMEditGoalsAgainst deriving (Eq, Show) -- | Represents the database @@ -732,6 +745,17 @@ editStandingsModeL = lens _ -> ESMMenu) (\_ esm -> EditStandings esm) +esmSubModeL :: Lens' EditStandingsMode ESMSubMode +esmSubModeL = lens + (\case + ESMMenu -> ESMSubMenu + ESMHome m -> m + ESMAway m -> m) + (\mode subMode -> case mode of + ESMMenu -> ESMMenu + ESMHome _ -> ESMHome subMode + ESMAway _ -> ESMAway subMode) + -- | Constructor for a 'ProgState' newProgState :: ProgState newProgState = ProgState diff --git a/test/Actions/EditStandingsSpec.hs b/test/Actions/EditStandingsSpec.hs index 7b80f8e..4f968e2 100644 --- a/test/Actions/EditStandingsSpec.hs +++ b/test/Actions/EditStandingsSpec.hs @@ -23,29 +23,61 @@ along with this program. If not, see . module Actions.EditStandingsSpec (spec) where -import Lens.Micro ((^.)) -import Test.Hspec (Spec, describe, it, shouldBe, shouldSatisfy) +import Lens.Micro ((^.), (&), (.~)) +import Test.Hspec + ( Spec + , context + , describe + , it + , shouldBe + , shouldSatisfy + ) import Mtlstats.Actions.EditStandings import Mtlstats.Types spec :: Spec -spec = describe "EditStandings" $ mapM_ - (\(label, f, expected) -> describe label $ do - let - ps = newProgState - ps' = f ps +spec = describe "EditStandings" $ do + mapM_ + (\(label, f, expected) -> describe label $ do + let + ps = newProgState + ps' = f ps - it "should set progMode to EditStandings" $ - ps'^.progMode `shouldSatisfy` \case - (EditStandings _) -> True - _ -> False + it "should set progMode to EditStandings" $ + ps'^.progMode `shouldSatisfy` \case + (EditStandings _) -> True + _ -> False - it ("should set editStandingsMode to " ++ show expected) $ - ps'^.progMode.editStandingsModeL `shouldBe` expected) + it ("should set editStandingsMode to " ++ show expected) $ + ps'^.progMode.editStandingsModeL `shouldBe` expected) - -- label, function, expected mode - [ ( "editStandings", editStandings, ESMMenu ) - , ( "editHomeStandings", editHomeStandings, ESMHome ) - , ( "editAwayStandings", editAwayStandings, ESMAway ) - ] + -- label, function, expected mode + [ ( "editStandings", editStandings, ESMMenu ) + , ( "editHomeStandings", editHomeStandings, ESMHome ESMSubMenu ) + , ( "editAwayStandings", editAwayStandings, ESMAway ESMSubMenu ) + ] + + mapM_ + (\(label, f, expected) -> describe label $ do + mapM_ + (\prefix -> context ("mode: " ++ show (prefix ESMSubMenu)) $ let + ps = newProgState & progMode.editStandingsModeL .~ prefix ESMSubMenu + ps' = f ps + in it ("should set the mode to " ++ show expected) $ + ps'^.progMode.editStandingsModeL `shouldBe` prefix expected) + [ESMHome, ESMAway] + + context "mode: ESMMenu" $ let + ps = newProgState & progMode.editStandingsModeL .~ ESMMenu + ps' = f ps + in it "should not change the mode" $ + ps'^.progMode.editStandingsModeL `shouldBe` ESMMenu) + + -- label, function, expected + [ ( "editWins", editWins, ESMEditWins ) + , ( "editLosses", editLosses, ESMEditLosses ) + , ( "editOvertime", editOvertime, ESMEditOvertime ) + , ( "editGoalsFor", editGoalsFor, ESMEditGoalsFor ) + , ( "editGoalsAgainst", editGoalsAgainst, ESMEditGoalsAgainst ) + ] diff --git a/test/TypesSpec.hs b/test/TypesSpec.hs index c9353b6..c678f76 100644 --- a/test/TypesSpec.hs +++ b/test/TypesSpec.hs @@ -59,6 +59,7 @@ spec = describe "Mtlstats.Types" $ do editPlayerStateLSpec editGoalieStateLSpec editStandingsModeLSpec + esmSubModeLSpec teamScoreSpec otherScoreSpec homeTeamSpec @@ -196,13 +197,42 @@ editStandingsModeLSpec :: Spec editStandingsModeLSpec = describe "editStandingsModeL" $ lensSpec editStandingsModeL -- getters - [ ( "missing mode", MainMenu, ESMMenu ) - , ( "with mode", EditStandings ESMHome, ESMHome ) + [ ( "missing mode", MainMenu, menu ) + , ( "with mode", EditStandings home, home ) ] -- setters - [ ( "set mode", MainMenu, ESMHome ) - , ( "change mode", EditStandings ESMMenu, ESMHome ) + [ ( "set mode", MainMenu, home ) + , ( "change mode", EditStandings home, away ) ] + where + menu = ESMMenu + home = ESMHome ESMSubMenu + away = ESMAway ESMSubMenu + +esmSubModeLSpec :: Spec +esmSubModeLSpec = describe "esmSubModeL" $ do + + context "getters" $ mapM_ + (\(label, mode, expected) -> context label $ + it ("should be " ++ show expected) $ + mode^.esmSubModeL `shouldBe` expected) + + -- label, mode, expected + [ ( "no state", ESMMenu, ESMSubMenu ) + , ( "with state", ESMHome ESMEditWins, ESMEditWins ) + ] + + context "setters" $ mapM_ + (\(label, mode, expected) -> context label $ + it ("should be " ++ show expected) $ let + mode' = mode & esmSubModeL .~ ESMEditWins + in mode' `shouldBe` expected) + + -- label, mode, expected + [ ( "no state", ESMMenu, ESMMenu ) + , ( "home mode", ESMHome ESMSubMenu, ESMHome ESMEditWins ) + , ( "away mode", ESMAway ESMSubMenu, ESMAway ESMEditWins ) + ] teamScoreSpec :: Spec teamScoreSpec = describe "teamScore" $ do