crem-0.1.0.0: spec/Crem/DeciderSpec.hs
{-# OPTIONS_GHC -Wno-orphans #-}
module Crem.DeciderSpec where
import Crem.StateMachine (StateMachineT (..), run)
import "base" Data.Functor.Identity (Identity)
import "crem" Crem.BaseMachine (InitialState (..))
import "crem" Crem.Decider
import "crem" Crem.Example.Uno
import "hspec" Test.Hspec (Spec, describe, it, shouldBe)
spec :: Spec
spec =
describe "Decider" $ do
describe "unoDecider" $ do
it "is able to rebuild from a list of events" $ do
let
unoInitialDecider :: Decider UnoTopology Command (Either GameError Event)
unoInitialDecider = unoDecider (InitialState UnoInitialState)
rebuiltDecider :: Decider UnoTopology Command (Either GameError Event)
rebuiltDecider =
rebuildDecider
[ Right $
GameStarted
(InitialData (PlayerCount 3) (DigitCard Three Yellow))
(PlayerId 0)
, Right $
CardPlayed
(PlayData (PlayerId 0) (DigitCard Six Yellow))
]
unoInitialDecider
inProgressDecider :: Decider UnoTopology Command (Either GameError Event)
inProgressDecider =
unoDecider
( InitialState $
UnoStartedState $
StateData
{ topCard = DigitCard Six Yellow
, currentPlayer = Player (PlayerId 0) (PlayerCount 3) Clockwise
}
)
command :: Command
command =
PlayCard $
PlayData
{ playerId = PlayerId 1
, card = DigitCard Six Blue
}
in
(fst <$> run @Identity (Basic $ deciderMachine rebuiltDecider) command)
`shouldBe` (fst <$> run (Basic $ deciderMachine inProgressDecider) command)