nirum-0.3.0: test/Nirum/CodeGenSpec.hs
{-# LANGUAGE FlexibleInstances, ScopedTypeVariables, RankNTypes,
MultiParamTypeClasses #-}
module Nirum.CodeGenSpec where
import Control.Monad.Except (throwError)
import Control.Monad.State (modify)
import Data.Text as T (Text, pack)
import Test.Hspec.Meta
import Nirum.CodeGen (CodeGen, Failure, fromString, runCodeGen)
newtype SampleError = SampleError Text deriving (Eq, Ord, Show)
instance forall s . Failure s SampleError where
fromString = return . SampleError . T.pack
spec :: Spec
spec = parallel $ do
specify "fail" $ do
let codeGen' :: CodeGen Integer SampleError () = do
modify (+ 1)
modify (+ 1)
fail "test"
runCodeGen codeGen' 0 `shouldBe` (Left (SampleError "test"), 2)
let codeGen'' :: CodeGen Integer SampleError Integer = do
modify (+ 1)
_ <- fail "test"
modify (+ 1)
return 42
runCodeGen codeGen'' 0 `shouldBe` (Left (SampleError "test"), 1)
specify "throwError" $ do
let codeGen' :: CodeGen Integer SampleError () = do
modify (+ 1)
_ <- throwError $ SampleError "test"
modify (+ 2)
runCodeGen codeGen' 0 `shouldBe` (Left (SampleError "test"), 1)