module NonLspCommandLine (tests) where import Control.Monad ((>=>)) import Data.Foldable (for_) import Development.Shake (getDirectoryFilesIO) import System.Directory (copyFile, createDirectoryIfMissing) import System.Directory.Extra (canonicalizePath) import System.Environment.Blank (setEnv) import System.Exit (ExitCode (ExitSuccess)) import System.FilePath (takeDirectory, (</>)) import qualified System.IO.Extra import System.Process.Extra (CreateProcess (cwd), proc, readCreateProcessWithExitCode) import Test.Tasty import Test.Tasty.HUnit -- A test to ensure that the command line ghcide workflow stays working tests :: TestTree tests = testGroup "ghcide command line" [ testCase "works" $ withTempDir $ \dir -> do ghcide <- locateGhcideExecutable copyTestDataFiles dir "multi" let cmd = (proc ghcide ["a/A.hs"]){cwd = Just dir} setEnv "HOME" "/homeless-shelter" False (ec, _, _) <- readCreateProcessWithExitCode cmd "" ec @?= ExitSuccess ] locateGhcideExecutable :: IO FilePath locateGhcideExecutable = pure "ghcide" -- | Version of 'System.IO.Extra.withTempDir' that canonicalizes the path -- Which we need to do on macOS since the $TMPDIR can be in @/private/var@ or -- @/var@ withTempDir :: (FilePath -> IO a) -> IO a withTempDir f = System.IO.Extra.withTempDir $ canonicalizePath >=> f copyTestDataFiles :: FilePath -> FilePath -> IO () copyTestDataFiles dir prefix = do -- Copy all the test data files to the temporary workspace testDataFiles <- getDirectoryFilesIO ("ghcide/test/data" </> prefix) ["//*"] for_ testDataFiles $ \f -> do createDirectoryIfMissing True $ dir </> takeDirectory f copyFile ("ghcide/test/data" </> prefix </> f) (dir </> f)