implemented edit functions in Mtlstats.Actions.EditState module

This commit is contained in:
Jonathan Lamothe 2020-01-16 19:47:12 -05:00
parent 75a47ca852
commit d5de834510
5 changed files with 131 additions and 38 deletions

View File

@ -40,28 +40,31 @@ editStandings = progMode .~ EditStandings ESMMenu
-- | Edits the home standings -- | Edits the home standings
editHomeStandings :: ProgState -> ProgState editHomeStandings :: ProgState -> ProgState
editHomeStandings = progMode .~ EditStandings ESMHome editHomeStandings = progMode .~ EditStandings (ESMHome ESMSubMenu)
-- | Edits the road standings -- | Edits the road standings
editAwayStandings :: ProgState -> ProgState editAwayStandings :: ProgState -> ProgState
editAwayStandings = progMode .~ EditStandings ESMAway editAwayStandings = progMode .~ EditStandings (ESMAway ESMSubMenu)
-- | Changes to edit wins mode -- | Changes to edit wins mode
editWins :: ProgState -> ProgState editWins :: ProgState -> ProgState
editWins = undefined editWins = doEdit ESMEditWins
-- | Changes to edit losses mode -- | Changes to edit losses mode
editLosses :: ProgState -> ProgState editLosses :: ProgState -> ProgState
editLosses = undefined editLosses = doEdit ESMEditLosses
-- | Changes to edit overtime mode -- | Changes to edit overtime mode
editOvertime :: ProgState -> ProgState editOvertime :: ProgState -> ProgState
editOvertime = undefined editOvertime = doEdit ESMEditOvertime
-- | Changes to edit goals for mode -- | Changes to edit goals for mode
editGoalsFor :: ProgState -> ProgState editGoalsFor :: ProgState -> ProgState
editGoalsFor = undefined editGoalsFor = doEdit ESMEditGoalsFor
-- | Changes to edit goals against mode -- | Changes to edit goals against mode
editGoalsAgainst :: ProgState -> ProgState editGoalsAgainst :: ProgState -> ProgState
editGoalsAgainst = undefined editGoalsAgainst = doEdit ESMEditGoalsAgainst
doEdit :: ESMSubMode -> ProgState -> ProgState
doEdit = (progMode.editStandingsModeL.esmSubModeL .~)

View File

@ -35,14 +35,18 @@ import Mtlstats.Types
editStandingsC :: EditStandingsMode -> Controller editStandingsC :: EditStandingsMode -> Controller
editStandingsC = \case editStandingsC = \case
ESMMenu -> menuControllerWith header editStandingsMenu ESMMenu -> menuControllerWith header editStandingsMenu
ESMHome -> editHomeStandingsC ESMHome m -> editHomeStandingsC m
ESMAway -> editAwayStandingsC ESMAway m -> editAwayStandingsC m
editHomeStandingsC :: Controller editHomeStandingsC :: ESMSubMode -> Controller
editHomeStandingsC = menuControllerWith header editHomeStandingsMenu editHomeStandingsC = \case
ESMSubMenu -> menuControllerWith header editHomeStandingsMenu
_ -> undefined
editAwayStandingsC :: Controller editAwayStandingsC :: ESMSubMode -> Controller
editAwayStandingsC = menuControllerWith header editAwayStandingsMenu editAwayStandingsC = \case
ESMSubMenu -> menuControllerWith header editAwayStandingsMenu
_ -> undefined
header :: ProgState -> C.Update () header :: ProgState -> C.Update ()
header = do header = do

View File

@ -36,6 +36,7 @@ module Mtlstats.Types (
EditGoalieState (..), EditGoalieState (..),
EditGoalieMode (..), EditGoalieMode (..),
EditStandingsMode (..), EditStandingsMode (..),
ESMSubMode (..),
Database (..), Database (..),
Player (..), Player (..),
PlayerStats (..), PlayerStats (..),
@ -58,6 +59,8 @@ module Mtlstats.Types (
editPlayerStateL, editPlayerStateL,
editGoalieStateL, editGoalieStateL,
editStandingsModeL, editStandingsModeL,
-- ** EditStandingsMode Lenses
esmSubModeL,
-- ** GameState Lenses -- ** GameState Lenses
gameYear, gameYear,
gameMonth, gameMonth,
@ -396,8 +399,18 @@ data EditGoalieMode
-- | Represents the standings edit mode -- | Represents the standings edit mode
data EditStandingsMode data EditStandingsMode
= ESMMenu = ESMMenu
| ESMHome | ESMHome ESMSubMode
| ESMAway | ESMAway ESMSubMode
deriving (Eq, Show)
-- | Represents the standings edit sub-mode
data ESMSubMode
= ESMSubMenu
| ESMEditWins
| ESMEditLosses
| ESMEditOvertime
| ESMEditGoalsFor
| ESMEditGoalsAgainst
deriving (Eq, Show) deriving (Eq, Show)
-- | Represents the database -- | Represents the database
@ -732,6 +745,17 @@ editStandingsModeL = lens
_ -> ESMMenu) _ -> ESMMenu)
(\_ esm -> EditStandings esm) (\_ 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' -- | Constructor for a 'ProgState'
newProgState :: ProgState newProgState :: ProgState
newProgState = ProgState newProgState = ProgState

View File

@ -23,14 +23,22 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
module Actions.EditStandingsSpec (spec) where module Actions.EditStandingsSpec (spec) where
import Lens.Micro ((^.)) import Lens.Micro ((^.), (&), (.~))
import Test.Hspec (Spec, describe, it, shouldBe, shouldSatisfy) import Test.Hspec
( Spec
, context
, describe
, it
, shouldBe
, shouldSatisfy
)
import Mtlstats.Actions.EditStandings import Mtlstats.Actions.EditStandings
import Mtlstats.Types import Mtlstats.Types
spec :: Spec spec :: Spec
spec = describe "EditStandings" $ mapM_ spec = describe "EditStandings" $ do
mapM_
(\(label, f, expected) -> describe label $ do (\(label, f, expected) -> describe label $ do
let let
ps = newProgState ps = newProgState
@ -46,6 +54,30 @@ spec = describe "EditStandings" $ mapM_
-- label, function, expected mode -- label, function, expected mode
[ ( "editStandings", editStandings, ESMMenu ) [ ( "editStandings", editStandings, ESMMenu )
, ( "editHomeStandings", editHomeStandings, ESMHome ) , ( "editHomeStandings", editHomeStandings, ESMHome ESMSubMenu )
, ( "editAwayStandings", editAwayStandings, ESMAway ) , ( "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 )
] ]

View File

@ -59,6 +59,7 @@ spec = describe "Mtlstats.Types" $ do
editPlayerStateLSpec editPlayerStateLSpec
editGoalieStateLSpec editGoalieStateLSpec
editStandingsModeLSpec editStandingsModeLSpec
esmSubModeLSpec
teamScoreSpec teamScoreSpec
otherScoreSpec otherScoreSpec
homeTeamSpec homeTeamSpec
@ -196,12 +197,41 @@ editStandingsModeLSpec :: Spec
editStandingsModeLSpec = describe "editStandingsModeL" $ editStandingsModeLSpec = describe "editStandingsModeL" $
lensSpec editStandingsModeL lensSpec editStandingsModeL
-- getters -- getters
[ ( "missing mode", MainMenu, ESMMenu ) [ ( "missing mode", MainMenu, menu )
, ( "with mode", EditStandings ESMHome, ESMHome ) , ( "with mode", EditStandings home, home )
] ]
-- setters -- setters
[ ( "set mode", MainMenu, ESMHome ) [ ( "set mode", MainMenu, home )
, ( "change mode", EditStandings ESMMenu, ESMHome ) , ( "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 :: Spec