dhall-1.10.0: tests/TypeCheck.hs
{-# LANGUAGE OverloadedStrings #-}
module TypeCheck where
import Data.Monoid (mempty, (<>))
import Data.Text.Lazy (Text)
import Dhall.Core (Expr)
import Dhall.TypeCheck (X)
import Test.Tasty (TestTree)
import qualified Control.Exception
import qualified Data.Text.Lazy
import qualified Dhall.Core
import qualified Dhall.Import
import qualified Dhall.Parser
import qualified Dhall.TypeCheck
import qualified Test.Tasty
import qualified Test.Tasty.HUnit
typecheckTests :: TestTree
typecheckTests =
Test.Tasty.testGroup "typecheck tests"
[ should
"allow type-valued fields in a record"
"fieldsAreTypes"
, should
"allow type-valued alternatives in a union"
"alternativesAreTypes"
]
should :: Text -> Text -> TestTree
should name basename =
Test.Tasty.HUnit.testCase (Data.Text.Lazy.unpack name) $ do
let actualCode = "./tests/typecheck/" <> basename <> "A.dhall"
let expectedCode = "./tests/typecheck/" <> basename <> "B.dhall"
actualExpr <- case Dhall.Parser.exprFromText mempty actualCode of
Left err -> Control.Exception.throwIO err
Right expr -> return expr
actualResolved <- Dhall.Import.load actualExpr
actualType <- case Dhall.TypeCheck.typeOf actualResolved of
Left err -> Control.Exception.throwIO err
Right expr -> return expr
let actualNormalized = Dhall.Core.normalize actualType :: Expr X X
expectedExpr <- case Dhall.Parser.exprFromText mempty expectedCode of
Left err -> Control.Exception.throwIO err
Right expr -> return expr
expectedResolved <- Dhall.Import.load expectedExpr
let expectedNormalized = Dhall.Core.normalize expectedResolved
let message = "The expression's type did not match the expected type"
Test.Tasty.HUnit.assertEqual message expectedNormalized actualNormalized