hnix/tests/Main.hs

113 lines
4.0 KiB
Haskell
Raw Normal View History

{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE OverloadedStrings #-}
2014-08-03 14:17:43 +02:00
module Main where
import Control.DeepSeq
import qualified Control.Exception as Exc
import Control.Applicative ((<|>))
2018-04-05 00:32:21 +02:00
import Control.Monad
import Data.Fix
2018-11-25 11:08:17 +01:00
import Data.List (isSuffixOf)
import Data.Maybe
import Data.Text (unpack)
2018-05-03 06:32:00 +02:00
import Data.Time
2015-12-21 06:55:53 +01:00
import qualified EvalTests
import NeatInterpolation (text)
import qualified Nix
import Nix.Expr.Types
import Nix.String
import Nix.Options
import Nix.Parser
2019-03-22 23:16:01 +01:00
import Nix.Standard
2019-03-18 03:04:38 +01:00
import Nix.Value
2018-02-09 15:32:53 +01:00
import qualified NixLanguageTests
import qualified ParserTests
import qualified PrettyTests
2018-06-25 12:55:05 +02:00
import qualified ReduceExprTests
import qualified PrettyParseTests
import System.Directory
import System.Environment
import System.FilePath.Glob
import System.Posix.Files
import Test.Tasty
import Test.Tasty.HUnit
2016-01-23 22:46:30 +01:00
ensureLangTestsPresent :: Assertion
ensureLangTestsPresent = do
exist <- fileExist "data/nix/tests/local.mk"
unless exist $
errorWithoutStackTrace $ unlines
[ "Directory data/nix does not have any files."
, "Did you forget to run"
++ " \"git submodule update --init --recursive\"?" ]
ensureNixpkgsCanParse :: Assertion
ensureNixpkgsCanParse =
consider "default.nix" (parseNixFile "default.nix") $ \case
Fix (NAbs (ParamSet params _ _) _) -> do
let rev = getString "rev" params
sha256 = getString "sha256" params
consider "fetchTarball expression" (pure $ parseNixTextLoc [text|
builtins.fetchTarball {
url = "https://github.com/NixOS/nixpkgs/archive/${rev}.tar.gz";
sha256 = "${sha256}";
}|]) $ \expr -> do
NVStr ns <- do
time <- getCurrentTime
2019-03-22 23:16:01 +01:00
runWithBasicEffectsIO (defaultOptions time) $
2019-03-18 03:04:38 +01:00
Nix.nixEvalExprLoc Nothing expr
let dir = hackyStringIgnoreContext ns
exists <- fileExist (unpack dir)
unless exists $
errorWithoutStackTrace $
"Directory " ++ show dir ++ " does not exist"
files <- globDir1 (compile "**/*.nix") (unpack dir)
when (null files) $
errorWithoutStackTrace $
"Directory " ++ show dir ++ " does not have any files"
forM_ files $ \file -> do
unless ("azure-cli/default.nix" `isSuffixOf` file ||
"os-specific/linux/udisks/2-default.nix" `isSuffixOf` file) $ do
-- Parse and deepseq the resulting expression tree, to ensure the
-- parser is fully executed.
_ <- consider file (parseNixFileLoc file) $ Exc.evaluate . force
pure ()
v -> error $ "Unexpected parse from default.nix: " ++ show v
where
getExpr k m = let Just (Just r) = lookup k m in r
getString k m =
let Fix (NStr (DoubleQuoted [Plain str])) = getExpr k m in str
consider path action k = action >>= \case
Failure err -> errorWithoutStackTrace $
"Parsing " ++ path ++ " failed: " ++ show err
Success expr -> k expr
main :: IO ()
main = do
nixLanguageTests <- NixLanguageTests.genTests
2018-04-08 09:26:48 +02:00
evalComparisonTests <- EvalTests.genEvalCompareTests
let allOrLookup var = lookupEnv "ALL_TESTS" <|> lookupEnv var
nixpkgsTestsEnv <- allOrLookup "NIXPKGS_TESTS"
prettyTestsEnv <- lookupEnv "PRETTY_TESTS"
pwd <- getCurrentDirectory
setEnv "NIX_REMOTE" ("local?root=" ++ pwd ++ "/")
setEnv "NIX_DATA_DIR" (pwd ++ "/data")
defaultMain $ testGroup "hnix" $
2018-02-09 15:32:53 +01:00
[ ParserTests.tests
, EvalTests.tests
2018-06-25 12:55:05 +02:00
, PrettyTests.tests
, ReduceExprTests.tests] ++
[ PrettyParseTests.tests
(fromIntegral (read (fromMaybe "0" prettyTestsEnv) :: Int)) ] ++
[ evalComparisonTests ] ++
[ testCase "Nix language tests present" ensureLangTestsPresent
2018-05-07 21:45:51 +02:00
, nixLanguageTests ] ++
[ testCase "Nixpkgs parses without errors" ensureNixpkgsCanParse
| isJust nixpkgsTestsEnv ]