hnix/tests/TestCommon.hs
2019-03-17 19:04:38 -07:00

83 lines
2.7 KiB
Haskell

{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
module TestCommon where
import Control.Monad.Catch
import Control.Monad.IO.Class
import Data.Text ( Text
, unpack
)
import Data.Time
import Nix
import Nix.Exec ()
import Nix.Cited ()
import Nix.Cited.Basic ()
import Nix.Fresh
import Nix.Fresh.Basic
import Nix.Thunk.Standard
import Nix.Var
import System.Environment
import System.IO
import System.Posix.Files
import System.Posix.Temp
import System.Process
import Test.Tasty.HUnit
hnixEvalFile :: Options -> FilePath -> IO (StdValueNF StdIdT IO)
hnixEvalFile opts file = do
parseResult <- parseNixFileLoc file
case parseResult of
Failure err ->
error $ "Parsing failed for file `" ++ file ++ "`.\n" ++ show err
Success expr -> do
setEnv "TEST_VAR" "foo"
i <- newVar (1 :: Int)
runStdLazyM opts (runFreshIdT i)
$ catch (evaluateExpression (Just file) nixEvalExprLoc normalForm expr)
$ \case
NixException frames ->
errorWithoutStackTrace
. show
=<< renderFrames @(StdValue StdIdT IO) @(StdThunk StdIdT IO) frames
hnixEvalText :: Options -> Text -> IO (StdValueNF StdIdT IO)
hnixEvalText opts src = case parseNixText src of
Failure err ->
error
$ "Parsing failed for expressien `"
++ unpack src
++ "`.\n"
++ show err
Success expr -> do
i <- newVar (1 :: Int)
runStdLazyM opts (runFreshIdT i) $ normalForm =<< nixEvalExpr Nothing expr
nixEvalString :: String -> IO String
nixEvalString expr = do
(fp, h) <- mkstemp "nix-test-eval"
hPutStr h expr
hClose h
res <- nixEvalFile fp
removeLink fp
return res
nixEvalFile :: FilePath -> IO String
nixEvalFile fp = readProcess "nix-instantiate" ["--eval", "--strict", fp] ""
assertEvalFileMatchesNix :: FilePath -> Assertion
assertEvalFileMatchesNix fp = do
time <- liftIO getCurrentTime
hnixVal <- (++ "\n") . printNix <$> hnixEvalFile (defaultOptions time) fp
nixVal <- nixEvalFile fp
assertEqual fp nixVal hnixVal
assertEvalMatchesNix :: Text -> Assertion
assertEvalMatchesNix expr = do
time <- liftIO getCurrentTime
hnixVal <- (++ "\n") . printNix <$> hnixEvalText (defaultOptions time) expr
nixVal <- nixEvalString expr'
assertEqual expr' nixVal hnixVal
where expr' = unpack expr