packages feed

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)