dhall-haskell/dhall/tests/Dhall/Test/Import.hs

93 lines
3.8 KiB
Haskell

{-# LANGUAGE OverloadedStrings #-}
module Dhall.Test.Import where
import Data.Text (Text)
import Test.Tasty (TestTree)
import Dhall.Import (MissingImports(..))
import Control.Exception (catch, throwIO)
import Data.Monoid ((<>))
import qualified Control.Monad.Trans.State.Strict as State
import qualified Data.Text
import qualified Data.Text.IO
import qualified Dhall.Parser
import qualified Dhall.Import
import qualified Test.Tasty
import qualified Test.Tasty.HUnit
tests :: TestTree
tests =
Test.Tasty.testGroup "import tests"
[ Test.Tasty.testGroup "import alternatives"
[ shouldFail
3
"alternative of several unset env variables"
"./dhall-lang/tests/import/failure/alternativeEnv.dhall"
, shouldFail
1
"alternative of env variable and missing"
"./dhall-lang/tests/import/failure/alternativeEnvMissing.dhall"
, shouldFail
0
"just missing"
"./dhall-lang/tests/import/failure/missing.dhall"
, shouldNotFail
"alternative of env variable, missing, and a Natural"
"./dhall-lang/tests/import/success/alternativeEnvNaturalA.dhall"
, shouldNotFail
"alternative of env variable and a Natural"
"./dhall-lang/tests/import/success/alternativeEnvSimpleA.dhall"
, shouldNotFail
"alternative of a Natural and missing"
"./dhall-lang/tests/import/success/alternativeNaturalA.dhall"
]
, Test.Tasty.testGroup "import relative to argument"
[ shouldNotFailRelative
"a semantic integrity check if fields are reordered"
"./dhall-lang/tests/import/success/"
"./dhall-lang/tests/import/success/fieldOrderA.dhall"
, shouldNotFailRelative
"a semantic integrity check when importing an expression using `constructors`"
"./dhall-lang/tests/import/success/"
"./dhall-lang/tests/import/success/issue553B.dhall"
]
]
shouldNotFail :: Text -> FilePath -> TestTree
shouldNotFail name path = Test.Tasty.HUnit.testCase (Data.Text.unpack name) (do
text <- Data.Text.IO.readFile path
actualExpr <- case Dhall.Parser.exprFromText mempty text of
Left err -> throwIO err
Right expr -> return expr
_ <- Dhall.Import.load actualExpr
return ())
shouldNotFailRelative :: Text -> FilePath -> FilePath -> TestTree
shouldNotFailRelative name dir path = Test.Tasty.HUnit.testCase (Data.Text.unpack name) (do
text <- Data.Text.IO.readFile path
expr <- case Dhall.Parser.exprFromText mempty text of
Left err -> throwIO err
Right expr -> return expr
_ <- State.evalStateT (Dhall.Import.loadWith expr) (Dhall.Import.emptyStatus dir)
return ())
shouldFail :: Int -> Text -> FilePath -> TestTree
shouldFail failures name path = Test.Tasty.HUnit.testCase (Data.Text.unpack name) (do
text <- Data.Text.IO.readFile path
actualExpr <- case Dhall.Parser.exprFromText mempty text of
Left err -> throwIO err
Right expr -> return expr
catch
(do
_ <- Dhall.Import.load actualExpr
fail "Import should have failed, but it succeeds")
(\(MissingImports es) -> case length es == failures of
True -> pure ()
False -> fail ("Should have failed "
<> show failures
<> " times, but failed with: \n"
<> show es)) )