diff --git a/src/Mtlstats/Types/Menu.hs b/src/Mtlstats/Types/Menu.hs new file mode 100644 index 0000000..fb08f97 --- /dev/null +++ b/src/Mtlstats/Types/Menu.hs @@ -0,0 +1,66 @@ +{- | + +mtlstats +Copyright (C) 2019 Rhéal Lamothe + + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or (at +your option) any later version. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +-} + +{-# LANGUAGE TemplateHaskell #-} + +module Mtlstats.Types.Menu ( + -- * Types + Menu (..), + MenuItem (..), + -- * Lenses + -- ** Menu Lenses + menuTitle, + menuItems, + -- ** MenuItem Lenses + miKey, + miDescription, + miAction, +) where + +import Control.Monad.Trans.State (StateT) +import Lens.Micro ((^.)) +import Lens.Micro.TH (makeLenses) +import qualified UI.NCurses as C + +import Mtlstats.Types + +-- | Defines a menu +data Menu a = Menu + { _menuTitle :: String + , _menuItems :: [MenuItem a] + } + +-- | Defines a menu item +data MenuItem a = MenuItem + { _miKey :: Char + , _miDescription :: String + , _miAction :: StateT ProgState C.Curses a + } + +makeLenses ''Menu +makeLenses ''MenuItem + +instance Show (Menu a) where + show m = m ^. menuTitle ++ "\n" ++ items + where items = unlines $ map show $ m ^. menuItems + +instance Show (MenuItem a) where + show i = [i ^. miKey] ++ ") " ++ i ^. miDescription diff --git a/test/Types/MenuSpec.hs b/test/Types/MenuSpec.hs new file mode 100644 index 0000000..f2e0778 --- /dev/null +++ b/test/Types/MenuSpec.hs @@ -0,0 +1,47 @@ +{- + +mtlstats +Copyright (C) 2019 Rhéal Lamothe + + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or (at +your option) any later version. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +-} + +module Types.MenuSpec (spec) where + +import Test.Hspec (Spec, describe, it, shouldBe) + +import Mtlstats.Types.Menu + +spec :: Spec +spec = describe "Mtlstats.Types.Menu" + menuSpec + +menuSpec :: Spec +menuSpec = describe "Menu" + showSpec + +showSpec :: Spec +showSpec = describe "show" $ + it "should display correctly" $ let + menu = Menu "Foo" + [ MenuItem '1' "Item 1" $ return () + , MenuItem '2' "Item 2" $ return () + ] + expected = + "Foo\n\ + \1) Item 1\n\ + \2) Item 2\n" + in show menu `shouldBe` expected diff --git a/test/TypesSpec.hs b/test/TypesSpec.hs index 0bbcb58..085dac4 100644 --- a/test/TypesSpec.hs +++ b/test/TypesSpec.hs @@ -30,12 +30,15 @@ import Test.Hspec (Spec, context, describe, it, shouldBe) import Text.RawString.QQ (r) import Mtlstats.Types +import qualified Types.MenuSpec as Menu + spec :: Spec spec = describe "Mtlstats.Types" $ do pPointsSpec playerSpec goalieSpec databaseSpec + Menu.spec pPointsSpec :: Spec pPointsSpec = describe "pPoints" $ mapM_