ide-backend-0.9.0: TestSuite/TestSuite/Tests/BuildDoc.hs
module TestSuite.Tests.BuildDoc (testGroupBuildDoc) where
import Control.Monad
import System.Directory
import System.Exit
import System.FilePath
import Test.Tasty
import Test.HUnit
import IdeSession
import TestSuite.State
import TestSuite.Session
import TestSuite.Assertions
testGroupBuildDoc :: TestSuiteEnv -> TestTree
testGroupBuildDoc env = testGroup "Build haddocks" [
stdTest env "From some .lhs with relativeIncludes"
(test_fromLhsFiles True)
, stdTest env "From some .lhs files" (test_fromLhsFiles False)
, stdTest env "Fail" test_fail
, stdTest env "From ParFib with relativeIncludes"
(test_ParFib True)
, stdTest env "From ParFib files" (test_ParFib False)
]
test_fromLhsFiles :: Bool -> TestSuiteEnv -> Assertion
test_fromLhsFiles relativeIncludes env = withAvailableSession env
$ \session -> do
when relativeIncludes $
updateSessionD session (updateRelativeIncludes ["", "Subdir"]) 0
status0 <- getBuildDocStatus session
when relativeIncludes $ assertEqual "before module loading" Nothing status0
withCurrentDirectory "TestSuite/inputs/compiler/utils" $ loadModulesFrom session "."
assertNoErrors session
let upd = buildDoc
updateSessionD session upd 1
distDir <- getDistDir session
docStderr <- readFile $ distDir </> "doc/ide-backend-doc.stderr"
assertEqual "doc stderr empty" "" docStderr
status1 <- getBuildDocStatus session
assertEqual "after doc build" (Just ExitSuccess) status1
indexExists <- doesFileExist $ distDir </> "doc/html/main/index.html"
assertBool ".lhs haddock files" indexExists
hoogleExists <- doesFileExist $ distDir </> "doc/html/main/main-1.0.txt"
assertBool ".lhs hoogle files" hoogleExists
mainExists <- doesFileExist $ distDir </> "doc/html/main/Main.html"
when relativeIncludes $ assertBool ".lhs Main haddock file" mainExists
test_fail :: TestSuiteEnv -> Assertion
test_fail env = withAvailableSession env $ \session -> do
withCurrentDirectory "TestSuite/inputs/ABerror" $ loadModulesFrom session "."
assertOneError session
let upd = buildDoc
-- Note that the stderr log file here is empty, but exit code is 1:
updateSessionD session upd 1
status1 <- getBuildDocStatus session
assertEqual "failure after doc build" (Just $ ExitFailure 1) status1
test_ParFib :: Bool -> TestSuiteEnv -> Assertion
test_ParFib relativeIncludes env = withAvailableSession env $ \session -> do
-- Warning: this also results in @compiler/@ written to the top-level
-- session directory. Unless it breaks other tests, let's keep it,
-- so that we see what happens with strange @updateRelativeIncludes@
-- arguments and notice if other changes to code cause any larger breakage.
when relativeIncludes $
updateSessionD session
(updateRelativeIncludes ["", "../compiler/utils/Subdir"])
0
withCurrentDirectory "TestSuite/inputs/MainModule" $ loadModulesFrom session "."
when relativeIncludes $
withCurrentDirectory "TestSuite/inputs/MainModule" $
loadModulesFrom session "../compiler/utils/Subdir"
assertNoErrors session
let upd = buildDoc
updateSessionD session upd 1
distDir <- getDistDir session
docStderr <- readFile $ distDir </> "doc/ide-backend-doc.stderr"
assertEqual "doc stderr empty" "" docStderr
status1 <- getBuildDocStatus session
assertEqual "after doc build" (Just ExitSuccess) status1
indexExists <- doesFileExist $ distDir </> "doc/html/main/index.html"
assertBool "ParFib haddock files" indexExists
hoogleExists <- doesFileExist $ distDir </> "doc/html/main/main-1.0.txt"
assertBool "ParFib hoogle files" hoogleExists
mainExists <- doesFileExist $ distDir </> "doc/html/main/Main.html"
when relativeIncludes $ assertBool ".lhs Main haddock file" mainExists