8 Commits

Author SHA1 Message Date
Jonathan Lamothe
e3922ed059 fix ProgMode comparison failure 2021-05-08 12:21:41 -04:00
Jonathan Lamothe
174b636499 better comparisons in tests 2021-05-08 12:21:41 -04:00
f869209ec6 version 0.16.1
also updated copyright notice
2021-05-08 12:19:34 -04:00
Jonathan Lamothe
c6393830e2 Merge pull request #86 from mtlstats/no-game-new-season
Don't automatically start a new game on new season
2021-05-08 12:01:17 -04:00
b054ba66f2 Don't automatically start a new game on new season 2021-05-08 11:44:38 -04:00
Jonathan Lamothe
1e0b72fc40 version 0.16.0 2020-04-15 22:26:33 -04:00
Jonathan Lamothe
2c5b4a0791 Merge pull request #85 from mtlstats/month-numbers
enter months by number
2020-04-15 22:24:14 -04:00
Jonathan Lamothe
bce31d059b enter months by number 2020-04-15 22:07:56 -04:00
51 changed files with 370 additions and 300 deletions

View File

@@ -1,5 +1,11 @@
# Changelog for mtlstats # Changelog for mtlstats
## 0.16.1
- Don't automatically start a new game on new season
## 0.16.0
- enter months by number
## 0.15.2 ## 0.15.2
- allow ties - allow ties

View File

@@ -1,5 +1,5 @@
name: mtlstats name: mtlstats
version: 0.15.2 version: 0.16.1
github: "mtlstats/mtlstats" github: "mtlstats/mtlstats"
license: GPL-3 license: GPL-3
author: "Jonathan Lamothe" author: "Jonathan Lamothe"

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
@@ -62,7 +62,7 @@ gameYearC :: Controller
gameYearC = promptControllerWith header gameYearPrompt gameYearC = promptControllerWith header gameYearPrompt
gameMonthC :: Controller gameMonthC :: Controller
gameMonthC = menuControllerWith header gameMonthMenu gameMonthC = promptControllerWith monthHeader gameMonthPrompt
gameDayC :: Controller gameDayC :: Controller
gameDayC = promptControllerWith header gameDayPrompt gameDayC = promptControllerWith header gameDayPrompt
@@ -226,6 +226,31 @@ header :: ProgState -> C.Update ()
header s = C.drawString $ header s = C.drawString $
"*** GAME " ++ padNum 2 (s^.database.dbGames) ++ " ***\n" "*** GAME " ++ padNum 2 (s^.database.dbGames) ++ " ***\n"
monthHeader :: ProgState -> C.Update ()
monthHeader s = do
(_, cols) <- C.windowSize
header s
let
table = labelTable $ zip (map show ([1..] :: [Int]))
[ "JANUARY"
, "FEBRUARY"
, "MARCH"
, "APRIL"
, "MAY"
, "JUNE"
, "JULY"
, "AUGUST"
, "SEPTEMBER"
, "OCTOBER"
, "NOVEMBER"
, "DECEMBER"
]
C.drawString $ unlines $
map (centre $ fromIntegral $ pred cols) $
["MONTH:", ""] ++ table ++ [""]
gameGoal :: ProgState -> (Int, Int) gameGoal :: ProgState -> (Int, Int)
gameGoal s = gameGoal s =
( s^.database.dbGames ( s^.database.dbGames

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
@@ -41,7 +41,7 @@ titleScreenC = Controller
] ]
++ titleText ++ titleText
++ [ "" ++ [ ""
, "Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe" , "Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe"
, "<rheal.lamothe@gmail.com>" , "<rheal.lamothe@gmail.com>"
, "" , ""
, "Press any key to continue..." , "Press any key to continue..."

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
@@ -129,9 +129,14 @@ month _ = ""
labelTable :: [(String, String)] -> [String] labelTable :: [(String, String)] -> [String]
labelTable xs = let labelTable xs = let
labelWidth = maximum $ map (length . fst) xs labelWidth = maximum $ map (length . fst) xs
valWidth = maximum $ map (length . snd) xs
in map in map
(\(label, val) -> right labelWidth label ++ ": " ++ val) ( \(label, val)
xs -> right labelWidth label
++ ": "
++ left valWidth val
) xs
-- | Creates a variable column table of numbers with two axes -- | Creates a variable column table of numbers with two axes
numTable numTable

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
@@ -29,7 +29,6 @@ module Mtlstats.Menu (
-- * Menus -- * Menus
mainMenu, mainMenu,
newSeasonMenu, newSeasonMenu,
gameMonthMenu,
gameTypeMenu, gameTypeMenu,
gameGoalieMenu, gameGoalieMenu,
editMenu editMenu
@@ -124,30 +123,10 @@ newSeasonMenu = Menu "SEASON TYPE" ()
$ resetYtd $ resetYtd
. clearRookies . clearRookies
. resetStandings . resetStandings
. startNewGame . backHome
, MenuItem 'P' "PLAYOFFS" $ modify , MenuItem 'P' "PLAYOFFS" $ modify
$ resetStandings $ resetStandings
. startNewGame . backHome
]
-- | Requests the month in which the game took place
gameMonthMenu :: Menu ()
gameMonthMenu = Menu "MONTH:" () $ map
(\(ch, name, val) ->
MenuItem ch name $
modify $ progMode.gameStateL.gameMonth ?~ val)
[ ( 'A', "JANUARY", 1 )
, ( 'B', "FEBRUARY", 2 )
, ( 'C', "MARCH", 3 )
, ( 'D', "APRIL", 4 )
, ( 'E', "MAY", 5 )
, ( 'F', "JUNE", 6 )
, ( 'G', "JULY", 7 )
, ( 'H', "AUGUST", 8 )
, ( 'I', "SEPTEMBER", 9 )
, ( 'J', "OCTOBER", 10 )
, ( 'K', "NOVEMBER", 11 )
, ( 'L', "DECEMBER", 12 )
] ]
-- | The game type menu (home/away) -- | The game type menu (home/away)

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
@@ -31,6 +31,7 @@ module Mtlstats.Prompt (
ucStrPrompt, ucStrPrompt,
namePrompt, namePrompt,
numPrompt, numPrompt,
numPromptRange,
numPromptWithFallback, numPromptWithFallback,
dbNamePrompt, dbNamePrompt,
selectPrompt, selectPrompt,
@@ -154,6 +155,20 @@ numPrompt
-> Prompt -> Prompt
numPrompt pStr = numPromptWithFallback pStr $ return () numPrompt pStr = numPromptWithFallback pStr $ return ()
-- | Builds a numberic prompt with a range
numPromptRange
:: Int
-- ^ The minimum value
-> Int
-- ^ The maximum value
-> String
-- ^ The prompt string
-> (Int -> Action ())
-- ^ The callback function for the result
-> Prompt
numPromptRange nMin nMax pStr callback = numPrompt pStr $ \n ->
when (n >= nMin && n <= nMax) $ callback n
-- | Builds a numeric prompt with a fallback action -- | Builds a numeric prompt with a fallback action
numPromptWithFallback numPromptWithFallback
:: String :: String

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
@@ -23,6 +23,7 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
module Mtlstats.Prompt.NewGame module Mtlstats.Prompt.NewGame
( gameYearPrompt ( gameYearPrompt
, gameMonthPrompt
, gameDayPrompt , gameDayPrompt
, otherTeamPrompt , otherTeamPrompt
, homeScorePrompt , homeScorePrompt
@@ -48,6 +49,11 @@ gameYearPrompt :: Prompt
gameYearPrompt = numPrompt "Game year: " $ gameYearPrompt = numPrompt "Game year: " $
modify . (progMode.gameStateL.gameYear ?~) modify . (progMode.gameStateL.gameYear ?~)
-- | Prompts for the game month
gameMonthPrompt :: Prompt
gameMonthPrompt = numPromptRange 1 12 "Game month: " $
modify . (progMode.gameStateL.gameMonth ?~)
-- | Prompts for the day of the month the game took place -- | Prompts for the day of the month the game took place
gameDayPrompt :: Prompt gameDayPrompt :: Prompt
gameDayPrompt = numPrompt "Day of month: " $ gameDayPrompt = numPrompt "Day of month: " $

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- | {- |
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- {-
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- {-
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
@@ -22,13 +22,11 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
module Actions.NewGame.GoalieInputSpec (spec) where module Actions.NewGame.GoalieInputSpec (spec) where
import qualified Data.Map as M import qualified Data.Map as M
import Data.Maybe (fromJust)
import Lens.Micro ((^.), (&), (.~), (?~), (%~)) import Lens.Micro ((^.), (&), (.~), (?~), (%~))
import Test.Hspec (Spec, context, describe, it, shouldBe) import Test.Hspec (Spec, context, describe, it, shouldBe)
import Mtlstats.Actions.NewGame.GoalieInput import Mtlstats.Actions.NewGame.GoalieInput
import Mtlstats.Types import Mtlstats.Types
import Mtlstats.Util
import qualified TypesSpec as TS import qualified TypesSpec as TS
@@ -79,133 +77,58 @@ finishGoalieEntrySpec = describe "finishGoalieEntry" $ mapM_
bobStats = (1, newGoalieStats) bobStats = (1, newGoalieStats)
recordGoalieStatsSpec :: Spec recordGoalieStatsSpec :: Spec
recordGoalieStatsSpec = describe "recordGoalieStats" $ let recordGoalieStatsSpec = describe "recordGoalieStats" $ mapM_
goalieStats games mins goals = newGoalieStats ( \(label, input, expected) ->
& gsGames .~ games context label $ do
& gsMinsPlayed .~ mins let ps = recordGoalieStats input
& gsGoalsAllowed .~ goals ps `TS.compareTest` expected
)
joe = newGoalie 2 "Joe" [ ( "No goalie"
& gYtd .~ goalieStats 10 11 12 , noGoalie
& gLifetime .~ goalieStats 20 21 22 , noGoalie
)
bob = newGoalie 3 "Bob" , ( "Missing goalie"
& gYtd .~ goalieStats 30 31 32 , missingGoalie
& gLifetime .~ goalieStats 40 41 42 , missingGoalie
)
]
gameState n mins goals = newGameState where
& gameGoalieStats .~ M.fromList [(1, goalieStats 1 2 3)] noGoalie = defProgState
& gameSelectedGoalie .~ n
& gameGoalieMinsPlayed .~ mins
& gameGoalsAllowed .~ goals
progState n mins goals = newProgState missingGoalie = defProgState
& database.dbGoalies .~ [joe, bob] & progMode.gameStateL.gameSelectedGoalie ?~ 99
& progMode.gameStateL .~ gameState n mins goals
in mapM_ defProgState = newProgState
(\(setName, setGid, mins, goals, joeData, bobData, reset) -> let & progMode.gameStateL
s = recordGoalieStats $ progState setGid mins goals %~ ( gameType ?~ HomeGame )
in context setName $ do . ( homeScore ?~ 2 )
. ( awayScore ?~ 1 )
& database.dbGoalies .~ [jim, bob, steve]
mapM_ jim = mkGoalie 2 "Jim" 1
(\( chkName bob = mkGoalie 3 "Bob" 2
, chkGid steve = mkGoalie 5 "Steve" 3
, ( gGames
, gMins
, gGoals
, ytdGames
, ytdMins
, ytdGoals
, ltGames
, ltMins
, ltGoals
)
) -> context chkName $ do
let
gs = s^.progMode.gameStateL.gameGoalieStats
game = M.findWithDefault newGoalieStats chkGid gs
goalie = fromJust $ nth chkGid $ s^.database.dbGoalies
ytd = goalie^.gYtd
lt = goalie^.gLifetime
context "game" $ mkGoalie num name n = newGoalie num name
game `TS.compareTest` goalieStats gGames gMins gGoals & gYtd
%~ ( gsGames .~ n )
context "year-to-date" $ . ( gsMinsPlayed .~ n + 1 )
ytd `TS.compareTest` goalieStats ytdGames ytdMins ytdGoals . ( gsGoalsAllowed .~ n + 2 )
. ( gsShutouts .~ n + 3 )
context "lifetime" $ . ( gsWins .~ n + 4 )
lt `TS.compareTest` goalieStats ltGames ltMins ltGoals) . ( gsLosses .~ n + 5 )
. ( gsTies .~ n + 6 )
[ ( "checking Joe", 0, joeData ) & gLifetime
, ( "checking Bob", 1, bobData ) %~ ( gsGames .~ n + 7 )
] . ( gsMinsPlayed .~ n + 8 )
. ( gsGoalsAllowed .~ n + 9 )
context "selected goalie" $ let . ( gsShutouts .~ n + 10 )
expected = if reset then Nothing else setGid . ( gsWins .~ n + 11 )
in it ("should be " ++ show expected) $ . ( gsLosses .~ n + 12 )
(s^.progMode.gameStateL.gameSelectedGoalie) `shouldBe` expected . ( gsTies .~ n + 13 )
context "minutes played" $ let
expected = if reset then Nothing else mins
in it ("should be " ++ show expected) $
(s^.progMode.gameStateL.gameGoalieMinsPlayed) `shouldBe` expected
context "goals allowed" $ let
expected = if reset then Nothing else goals
in it ("should be " ++ show expected) $
(s^.progMode.gameStateL.gameGoalsAllowed) `shouldBe` expected)
[ ( "updating Joe"
, Just 0
, Just 1
, Just 2
, (1, 1, 2, 11, 12, 14, 21, 22, 24)
, (1, 2, 3, 30, 31, 32, 40, 41, 42)
, True
)
, ( "updating Bob"
, Just 1
, Just 1
, Just 2
, (0, 0, 0, 10, 11, 12, 20, 21, 22)
, (1, 3, 5, 30, 32, 34, 40, 42, 44)
, True
)
, ( "goalie out of bounds"
, Just 2
, Just 1
, Just 2
, (0, 0, 0, 10, 11, 12, 20, 21, 22)
, (1, 2, 3, 30, 31, 32, 40, 41, 42)
, False
)
, ( "missing goalie"
, Nothing
, Just 1
, Just 2
, (0, 0, 0, 10, 11, 12, 20, 21, 22)
, (1, 2, 3, 30, 31, 32, 40, 41, 42)
, False
)
, ( "missing minutes"
, Just 0
, Nothing
, Just 1
, (0, 0, 0, 10, 11, 12, 20, 21, 22)
, (1, 2, 3, 30, 31, 32, 40, 41, 42)
, False
)
, ( "missing goals"
, Just 0
, Just 1
, Nothing
, (0, 0, 0, 10, 11, 12, 20, 21, 22)
, (1, 2, 3, 30, 31, 32, 40, 41, 42)
, False
)
]
setGameGoalieSpec :: Spec setGameGoalieSpec :: Spec
setGameGoalieSpec = describe "setGameGoalie" $ mapM_ setGameGoalieSpec = describe "setGameGoalie" $ mapM_

View File

@@ -1,7 +1,7 @@
{- {-
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- {-
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- {-
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
@@ -141,9 +141,9 @@ labelTableSpec = describe "labelTable" $
] ]
expected = expected =
[ " foo: bar" [ " foo: bar "
, " baz: quux" , " baz: quux"
, "longer: x" , "longer: x "
] ]
in labelTable input `shouldBe` expected in labelTable input `shouldBe` expected

View File

@@ -1,7 +1,7 @@
{- {-
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- {-
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
@@ -54,7 +54,7 @@ goalieDetailsSpec = describe "goalieDetails" $ let
. ( gsTies .~ 15 ) . ( gsTies .~ 15 )
expected = unlines expected = unlines
[ "Number: 1" [ "Number: 1 "
, " Name: Joe*" , " Name: Joe*"
, "" , ""
, " YTD Lifetime" , " YTD Lifetime"

View File

@@ -1,7 +1,7 @@
{- {-
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
@@ -50,8 +50,8 @@ playerDetailsSpec = describe "playerDetails" $
} }
expected = unlines expected = unlines
[ " Number: 1" [ " Number: 1 "
, " Name: Joe*" , " Name: Joe* "
, "Position: centre" , "Position: centre"
, "" , ""
, " YTD Lifetime" , " YTD Lifetime"

View File

@@ -1,7 +1,7 @@
{- {-
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- {-
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- {-
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- {-
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- {-
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify

View File

@@ -1,7 +1,7 @@
{- {-
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
@@ -38,7 +38,14 @@ import qualified Data.HashMap.Strict as HM
import Data.Ratio ((%)) import Data.Ratio ((%))
import Lens.Micro (Lens', (&), (^.), (.~), (?~)) import Lens.Micro (Lens', (&), (^.), (.~), (?~))
import System.Random (randomIO, randomRIO) import System.Random (randomIO, randomRIO)
import Test.Hspec (Spec, context, describe, it, shouldBe) import Test.Hspec
( Spec
, context
, describe
, expectationFailure
, it
, shouldBe
)
import Mtlstats.Config import Mtlstats.Config
import Mtlstats.Types import Mtlstats.Types
@@ -972,119 +979,223 @@ makeBool = randomIO
makeName :: IO String makeName :: IO String
makeName = replicateM 10 $ randomRIO ('A', 'Z') makeName = replicateM 10 $ randomRIO ('A', 'Z')
instance Comparable GoalieStats where instance Comparable ProgState where
compareTest actual expected = mapM_ compareTest act expect = do
(\(name, lens) -> describe name $ compareLenses "database" database act expect
it ("should be " ++ show (expected^.lens)) $ compareLenses "progMode" progMode act expect
actual^.lens `shouldBe` expected^.lens) compareLenses "dbName" dbName act expect
-- name, lens compareLenses "inputBuffer" inputBuffer act expect
[ ( "gsGames", gsGames ) compareLenses "scrollOffset" scrollOffset act expect
, ( "gsMinsPlayed", gsMinsPlayed )
, ( "gsGoalsAllowed", gsGoalsAllowed ) instance Comparable ProgMode where
, ( "gsWins", gsWins ) compareTest TitleScreen TitleScreen = return ()
, ( "gsLosses", gsLosses ) compareTest MainMenu MainMenu = return ()
, ( "gsTies", gsTies )
] compareTest (NewSeason act) (NewSeason expect) =
context "NewSeason flag" $
act `compareTest` expect
compareTest (NewGame act) (NewGame expect) =
context "NewGame GameState" $
act `compareTest` expect
compareTest EditMenu EditMenu = return ()
compareTest (CreatePlayer act) (CreatePlayer expect) =
context "CreatePlayer CreatePlayerState" $
act `compareTest` expect
compareTest (CreateGoalie act) (CreateGoalie expect) =
context "CreateGoalie CreateGoalieState" $
act `compareTest` expect
compareTest (EditPlayer act) (EditPlayer expect) =
context "EditPlayer EditPlayerState" $
act `compareTest` expect
compareTest (EditGoalie act) (EditGoalie expect) =
context "EditGoalie EditGoalieState" $
act `compareTest` expect
compareTest (EditStandings act) (EditStandings expect) =
context "EditStandings EditStandingsMode" $
act `compareTest` expect
compareTest _ _ = it "should be the expected mode" $
expectationFailure "ProgMode mismatch"
instance Comparable GameState where instance Comparable GameState where
compareTest actual expected = compareTest act expect = do
it ("should be " ++ show expected) $ compareLenses "gameYear" gameYear act expect
actual `shouldBe` expected compareLenses "gameMonth" gameMonth act expect
compareLenses "gameDay" gameDay act expect
compareLenses "gameType" gameType act expect
compareLenses "otherTeam" otherTeam act expect
compareLenses "homeScore" homeScore act expect
compareLenses "awayScore" awayScore act expect
compareLenses "overtimeFlag" overtimeFlag act expect
compareLenses "dataVerified" dataVerified act expect
compareLenses "pointsAccounted" pointsAccounted act expect
compareLenses "goalBy" goalBy act expect
compareLenses "assistsBy" assistsBy act expect
compareLenses "gamePlayerStats" gamePlayerStats act expect
compareLenses "confirmGoalDataGlag" confirmGoalDataFlag act expect
compareLenses "gameSelectedPlayer" gameSelectedPlayer act expect
compareLenses "gamePMinsRecorded" gamePMinsRecorded act expect
compareLenses "gameGoalieStats" gameGoalieStats act expect
compareLenses "gameSelectedGoalie" gameSelectedGoalie act expect
compareLenses "gameGoalieMinsPlayed" gameGoalieMinsPlayed act expect
compareLenses "gameGoalsAllowed" gameGoalsAllowed act expect
compareLenses "gameGoaliesRecorded" gameGoaliesRecorded act expect
compareLenses "gameGoalieAssigned" gameGoalieAssigned act expect
instance Comparable CreatePlayerState where instance Comparable Database where
compareTest actual expected = do compareTest act expect = do
compareLenses "dbPlayers" dbPlayers act expect
compareLenses "dbGoalies" dbGoalies act expect
compareLenses "dbGames" dbGames act expect
compareLenses "dbHomeGameStats" dbHomeGameStats act expect
compareLenses "dbAwayGameStats" dbAwayGameStats act expect
describe "cpsNumber" $ instance Comparable Player where
it ("should be " ++ show (expected^.cpsNumber)) $ compareTest act expect = do
actual^.cpsNumber `shouldBe` expected^.cpsNumber compareLenses "pNumber" pNumber act expect
compareLenses "pName" pName act expect
compareLenses "pPosition" pPosition act expect
compareLenses "pRookie" pRookie act expect
compareLenses "pActive" pActive act expect
compareLenses "pYtd" pYtd act expect
compareLenses "pLifetime" pLifetime act expect
describe "cpsName" $ instance Comparable [Player] where
it ("should be " ++ expected^.cpsName) $ compareTest = compareLists
actual^.cpsName `shouldBe` expected^.cpsName
describe "cpsPosition" $ instance Comparable PlayerStats where
it ("should be " ++ expected^.cpsPosition) $ compareTest act expect = do
actual^.cpsPosition `shouldBe` expected^.cpsPosition compareLenses "psGoals" psGoals act expect
compareLenses "psAssists" psAssists act expect
instance Comparable EditPlayerState where compareLenses "psPMin" psPMin act expect
compareTest actual expected = do
describe "epsSelectedPlayer" $
it ("should be " ++ show (expected^.epsSelectedPlayer)) $
actual^.epsSelectedPlayer `shouldBe` expected^.epsSelectedPlayer
describe "epsMode" $
it ("should be " ++ show (expected^.epsMode)) $
actual^.epsMode `shouldBe` expected^.epsMode
instance Comparable EditGoalieState where
compareTest actual expected = do
describe "egsSelectedGoalie" $
it ("should be " ++ show (expected^.egsSelectedGoalie)) $
actual^.egsSelectedGoalie `shouldBe` expected^.egsSelectedGoalie
describe "egsMode" $
it ("should be " ++ show (expected^.egsMode)) $
actual^.egsMode `shouldBe` expected^.egsMode
instance Comparable CreateGoalieState where
compareTest actual expected = do
describe "cgsNuber" $
it("should be " ++ show (expected^.cgsNumber)) $
actual^.cgsNumber `shouldBe` expected^.cgsNumber
describe "cgsName" $
it ("should be " ++ expected^.cgsName) $
actual^.cgsName `shouldBe` expected^.cgsName
instance Comparable EditStandingsMode where
compareTest actual expected =
it ("should be " ++ show expected) $
actual `shouldBe` expected
instance Comparable Goalie where instance Comparable Goalie where
compareTest actual expected = do compareTest act expect = do
compareLenses "gNumber" gNumber act expect
compareLenses "gName" gName act expect
compareLenses "gRookie" gRookie act expect
compareLenses "gActive" gActive act expect
compareLenses "gYtd" gYtd act expect
compareLenses "gLifetime" gLifetime act expect
describe "gNumber" $ instance Comparable [Goalie] where
it ("should be " ++ show (expected^.gNumber)) $ compareTest = compareLists
actual^.gNumber `shouldBe` expected^.gNumber
describe "gName" $ instance Comparable GoalieStats where
it ("should be " ++ show (expected^.gName)) $ compareTest act expect = do
actual^.gName `shouldBe` expected^.gName compareLenses "gsGames" gsGames act expect
compareLenses "gsMisPlayed" gsMinsPlayed act expect
compareLenses "gsGoalsAllowed" gsGoalsAllowed act expect
compareLenses "gsWins" gsWins act expect
compareLenses "gsLosses" gsLosses act expect
compareLenses "gsTies" gsTies act expect
describe "gRookie" $ instance Comparable GameStats where
it ("should be " ++ show (expected^.gRookie)) $ compareTest act expect = do
actual^.gRookie `shouldBe` expected^.gRookie compareLenses "gmsWins" gmsWins act expect
compareLenses "gmsLosses" gmsLosses act expect
compareLenses "gmsOvertime" gmsOvertime act expect
compareLenses "gmsGoalsFor" gmsGoalsFor act expect
compareLenses "gmsGoalsAgainst" gmsGoalsAgainst act expect
describe "gActive" $ instance Comparable GameType where
it ("should be " ++ show (expected^.gActive)) $ compareTest = compareVals
actual^.gActive `shouldBe` expected^.gActive
describe "gYtd" $ instance Comparable CreatePlayerState where
(actual^.gYtd) `compareTest` (expected^.gYtd) compareTest act expect = do
compareLenses "cpsNumber" cpsNumber act expect
compareLenses "cpsName" cpsName act expect
compareLenses "cpsPosition" cpsPosition act expect
describe "gLifetime" $ instance Comparable EditPlayerState where
(actual^.gLifetime) `compareTest` (expected^.gLifetime) compareTest act expect = do
compareLenses "epsSelectedPlayer" epsSelectedPlayer act expect
compareLenses "epsMode" epsMode act expect
instance Comparable (M.Map Int GoalieStats) where instance Comparable EditPlayerMode where
compareTest actual expected = do compareTest = compareVals
instance Comparable EditGoalieState where
compareTest act expect = do
compareLenses "egsSelectedGoalie" egsSelectedGoalie act expect
compareLenses "egsMode" egsMode act expect
instance Comparable EditGoalieMode where
compareTest = compareVals
instance Comparable CreateGoalieState where
compareTest act expect = do
compareLenses "cgsNumber" cgsNumber act expect
compareLenses "cgsName" cgsName act expect
instance Comparable EditStandingsMode where
compareTest = compareVals
instance Comparable Int where
compareTest = compareVals
instance Comparable Bool where
compareTest = compareVals
instance Comparable String where
compareTest = compareVals
instance Comparable [Int] where
compareTest = compareLists
instance Comparable a => Comparable (Maybe a) where
compareTest Nothing Nothing = return ()
compareTest (Just a) (Just e) = a `compareTest` e
compareTest Nothing (Just _) = error "Unexpectedly received a value"
compareTest (Just _) Nothing = error "Received Nothing"
instance (Ord k, Show k, Comparable v) => Comparable (M.Map k v) where
compareTest actM expectM = do
context "number of elements" $
length actM `compareVals` length expectM
context "check values" $
mapM_
( \k -> context (show k) $
M.lookup k actM `compareTest` M.lookup k expectM
) $ M.keys actM
compareLists :: (Comparable a) => [a] -> [a] -> Spec
compareLists acts expects = do
let let
aList = M.toList actual aLen = length acts
eList = M.toList expected eLen = length expects
it "should have the correct number of elements" $ context "count elements" $
length aList `shouldBe` length eList it ("should be " ++ show eLen) $
aLen `shouldBe` eLen
mapM_ context "compare elements" $
(\(n, (ka, va), (ke, ve)) -> context ("element " ++ show n) $ do mapM_
( \(n, act, expect) ->
context ("element " ++ show n) $
expect `compareTest` act
) $ zip3 ([0..] :: [Int]) acts expects
context "key" $ compareVals :: (Eq a, Show a) => a -> a -> Spec
it ("should be " ++ show ke) $ compareVals expect act =
ka `shouldBe` ke it ("should be " ++ show expect) $
act `shouldBe` expect
context "value" $ va `compareTest` ve) compareLenses
(zip3 ([0..] :: [Int]) aList eList) :: Comparable b
=> String
-> Lens' a b
-> a
-> a
-> Spec
compareLenses label lens act expect =
describe label $
(act^.lens) `compareTest` (expect^.lens)

View File

@@ -1,7 +1,7 @@
{- {-
mtlstats mtlstats
Copyright (C) 1984, 1985, 2019, 2020 Rhéal Lamothe Copyright (C) 1984, 1985, 2019, 2020, 2021 Rhéal Lamothe
<rheal.lamothe@gmail.com> <rheal.lamothe@gmail.com>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify