packages feed

purescript-0.8.5.0: tests/Language/PureScript/Ide/RebuildSpec.hs

module Language.PureScript.Ide.RebuildSpec where

import           Control.Monad
import qualified Language.PureScript.Ide.Integration as Integration
import           Test.Hspec

import           System.FilePath

compile :: IO ()
compile = do
  Integration.deleteOutputFolder
  s <- Integration.compileTestProject
  unless s $ fail "Failed to compile .purs sources"

teardown :: IO ()
teardown = Integration.quitServer

restart :: IO ()
restart = Integration.quitServer *> (void Integration.startServer)

shouldBeSuccess :: String -> IO ()
shouldBeSuccess = shouldBe True . Integration.resultIsSuccess

shouldBeFailure :: String -> IO ()
shouldBeFailure = shouldBe False . Integration.resultIsSuccess

spec :: Spec
spec = beforeAll_ compile $ afterAll_ teardown $ before_ restart $ do
  describe "Rebuilding single modules" $ do
    it "rebuilds a correct module without dependencies successfully" $ do
      _ <- Integration.loadModuleWithDeps "RebuildSpecSingleModule"
      pdir <- Integration.projectDirectory
      let file = pdir </> "src" </> "RebuildSpecSingleModule.purs"
      Integration.rebuildModule file >>= shouldBeSuccess
    it "fails to rebuild an incorrect module without dependencies and returns the errors" $ do
      pdir <- Integration.projectDirectory
      let file = pdir </> "src" </> "RebuildSpecSingleModule.fail"
      Integration.rebuildModule file >>= shouldBeFailure
    it "rebuilds a correct module with its dependencies successfully" $ do
      _ <- Integration.loadModuleWithDeps "RebuildSpecWithDeps"
      pdir <- Integration.projectDirectory
      let file = pdir </> "src" </> "RebuildSpecWithDeps.purs"
      Integration.rebuildModule file >>= shouldBeSuccess
    it "rebuilds a correct module that has reverse dependencies" $ do
      _ <- Integration.loadModuleWithDeps "RebuildSpecWithDeps"
      pdir <- Integration.projectDirectory
      let file = pdir </> "src" </> "RebuildSpecDep.purs"
      Integration.rebuildModule file >>= shouldBeSuccess
    it "fails to rebuild a module if its dependencies are not loaded" $ do
      _ <- Integration.loadModule "RebuildSpecWithDeps"
      pdir <- Integration.projectDirectory
      let file = pdir </> "src" </> "RebuildSpecWithDeps.purs"
      Integration.rebuildModule file >>= shouldBeFailure
    it "rebuilds a correct module with a foreign file" $ do
      _ <- Integration.loadModuleWithDeps "RebuildSpecWithForeign"
      pdir <- Integration.projectDirectory
      let file = pdir </> "src" </> "RebuildSpecWithForeign.purs"
      Integration.rebuildModule file >>= shouldBeSuccess
    it "fails to rebuild a module with a foreign import but no file" $ do
      pdir <- Integration.projectDirectory
      let file = pdir </> "src" </> "RebuildSpecWithMissingForeign.fail"
      Integration.rebuildModule file >>= shouldBeFailure