packages feed

grisette-0.13.0.1: test/Grisette/Unified/GetDataTest.hs

{-# LANGUAGE CPP #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}

{- HLINT ignore "Unused LANGUAGE pragma" -}

module Grisette.Unified.GetDataTest (getDataTest) where

import Data.Functor.Identity (Identity (Identity))
import Grisette
  ( DeriveConfig (evalModeConfig),
    EvalModeConfig (EvalModeConstraints),
    Union,
    basicClasses0,
    deriveWith,
  )
import Grisette.TestUtil.SymbolicAssertion ((.@?=))
import Grisette.Unified (EvalModeBase, EvalModeInteger, EvalModeTag (S), GetBool, GetData, GetInteger, mrgIf, mrgIte)
import Grisette.Unified.Lib.Control.Monad (mrgReturn)
import Test.Framework (Test, testGroup)
import Test.Framework.Providers.HUnit (testCase)
import Test.HUnit ((@?=))

#if MIN_VERSION_base(4,16,0)
data A mode = A (GetData mode Integer) (GetInteger mode)

deriveWith
  mempty
    { evalModeConfig =
        [(0, EvalModeConstraints [''EvalModeBase, ''EvalModeInteger])]
    }
  [''A]
  basicClasses0

mrgIfFunc ::
  (EvalModeBase mode, EvalModeInteger mode) =>
  GetBool mode ->
  GetData mode (A mode) ->
  GetData mode (A mode) ->
  GetData mode (A mode)
mrgIfFunc = mrgIf

getDataTest :: Test
getDataTest =
  testGroup
    "GetData"
    [ testCase "mrgIf C" $ do
        let a = Identity (A (Identity 1) 2)
        let b = Identity (A (Identity 2) 3)
        mrgIfFunc True a b @?= a,
      testCase "mrgIf S" $ do
        let a = mrgReturn (A (mrgReturn 1) "a") :: Union (A 'S)
        let b = mrgReturn (A (mrgReturn 2) "b") :: Union (A 'S)
        mrgIfFunc @'S "x" a b
          .@?= mrgReturn
            ( A
                (mrgIf @'S "x" 1 2)
                (mrgIte @'S "x" "a" "b")
            )
    ]
#else
getDataTest = testGroup "GetData" []
#endif