packages feed

grisette-0.8.0.0: test/Grisette/SymPrim/SymGeneralFunTests.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeOperators #-}

module Grisette.SymPrim.SymGeneralFunTests (symGeneralFunTests) where

import Grisette.Internal.Core.Data.Class.ExtractSym (ExtractSym (extractSymMaybe))
import Grisette.Internal.Core.Data.Class.Function (Function ((#)))
import Grisette.Internal.Core.Data.Class.ModelOps
  ( SymbolSetRep (buildSymbolSet),
  )
import Grisette.Internal.SymPrim.GeneralFun (type (-->))
import Grisette.Internal.SymPrim.Prim.Internal.Term (TypedAnySymbol)
import Grisette.Internal.SymPrim.Prim.Model (AnySymbolSet, ConstantSymbolSet)
import Grisette.Internal.SymPrim.SymGeneralFun (type (-~>))
import Grisette.Internal.SymPrim.SymInteger (SymInteger)
import Test.Framework (Test, testGroup)
import Test.Framework.Providers.HUnit (testCase)
import Test.HUnit ((@?=))

symGeneralFunTests :: Test
symGeneralFunTests =
  testGroup
    "SymGeneralFun"
    [ testCase "ExtractSym" $ do
        let f :: SymInteger -~> SymInteger = "f"
        let a :: SymInteger = "a"
        let fa = f # a
        let anySymbolSet =
              buildSymbolSet
                ( "a" :: TypedAnySymbol Integer,
                  "f" :: TypedAnySymbol (Integer --> Integer)
                ) ::
                AnySymbolSet
        extractSymMaybe fa @?= Just anySymbolSet
        extractSymMaybe fa @?= (Nothing :: Maybe ConstantSymbolSet)
    ]