packages feed

record-dot-preprocessor-0.2.16: test/Test.hs

module Test(main) where

import qualified Preprocessor
import qualified PluginExample -- To test the plugin
import GHC.Records.Extra() -- To ensure the runtime dependency is present

import System.Directory.Extra
import System.Environment
import System.FilePath
import Control.Monad
import System.IO.Extra
import System.Info
import System.Process.Extra
import Data.List
import Data.Version


main :: IO ()
main = do
    -- TODO: If you pass `--installed` should create temp files with the magic string in front
    args <- getArgs
    files <- listFiles "examples"
    header <- readFile "examples/Header_in.hs"
    let installed = "--installed" `elem` args
    unless installed $ do
        putStrLn "# PluginExample.hs"
        PluginExample.main
    forM_ (reverse files) $ \file ->
        when (takeExtension file == ".hs" && not ("_out.hs" `isSuffixOf` file) && not ("_in.hs" `isSuffixOf` file)) $ do
            src <- readFile' file
            if installed then do
                forM_ [("Preprocessor", "{-# OPTIONS_GHC -F -pgmF=record-dot-preprocessor #-}")
                      ,("Plugin", "{-# OPTIONS_GHC -fplugin=RecordDotPreprocessor #-}")
                      ] $
                    \(name,prefix) -> withTempDir $ \dir ->
                        when (compilerVersion >= makeVersion [8,6] && not (blacklist name (takeBaseName file))) $ do
                            let inp = dir </> takeFileName file
                            putStrLn $ "# " ++ name ++ " " ++ takeFileName file
                            writeFile inp $ prefix ++ "\n" ++ header ++ "\nmodule Main where\n" ++ src
                            system_ $ "runhaskell -package=record-dot-preprocessor " ++ inp
            else withTempDir $ \dir -> do
                let inp = dir </> takeFileName file
                let out = dropExtension file ++ "_out.hs"
                writeFile inp $ header ++ "\n" ++ "module Main where\n" ++ src
                putStrLn $ "# Preprocessor " ++ takeFileName file
                withArgs [file,inp,out] Preprocessor.main
                system_ $ "runhaskell " ++ out
    putStrLn "Success"

-- Blacklist tests we know aren't compatible
blacklist "Plugin" "Preprocessor" = True
blacklist "Plugin" "Both2"        = True
blacklist _ _ = False