module Main
( main,
)
where
import Control.Lens ((^.))
import qualified Data.Text as T
import qualified Ide.Plugin.Stan as Stan
import Ide.Types
import qualified Language.LSP.Protocol.Lens as L
import System.FilePath
import Test.Hls
main :: IO ()
main = defaultTestRunner tests
tests :: TestTree
tests =
testGroup
"stan suggestions"
[ testCase "provides diagnostics" $
runStanSession "" $ do
doc <- openDoc "test.hs" "haskell"
diags@(reduceDiag : _) <- waitForDiagnosticsFromSource doc "stan"
liftIO $ do
length diags @?= 1
reduceDiag ^. L.range @?= Range (Position 0 0) (Position 3 19)
reduceDiag ^. L.severity @?= Just DiagnosticSeverity_Hint
let expectedPrefix = " ✲ Name: "
assertBool "" $ T.isPrefixOf expectedPrefix (reduceDiag ^. L.message)
reduceDiag ^. L.source @?= Just "stan"
return ()
, testCase "ignores diagnostics from .stan.toml" $
runStanSession "" $ do
doc <- openDoc ("dir" </> "configTest.hs") "haskell"
diags <- waitForDiagnosticsFromSource doc "stan"
liftIO $ length diags @?= 0
return ()
, testCase "respects LANGUAGE pragmas in the source file" $
runStanSession "" $ do
doc <- openDoc ("extensions-language-pragma" </> "LanguagePragmaTest.hs") "haskell"
diags <- waitForDiagnosticsFromSource doc "stan"
-- We must include at least one valid diagnostic in our test file to avoid
-- the false-positive case where Stan finds no analyses to perform due to a
-- bad mapping, which would also lead to zero diagnostics being returned.
liftIO $ length diags @?= 1
return ()
, testCase "respects language extensions defined in the .cabal file" $
runStanSession "" $ do
doc <- openDoc ("extensions-cabal-file" </> "CabalFileTest.hs") "haskell"
diags <- waitForDiagnosticsFromSource doc "stan"
-- We need at least one valid diagnostic here too, for the same reason as above.
liftIO $ length diags @?= 1
return ()
]
testDir :: FilePath
testDir = "plugins" </> "hls-stan-plugin" </> "test" </> "testdata"
stanPlugin :: PluginTestDescriptor Stan.Log
stanPlugin = mkPluginTestDescriptor enabledStanDescriptor "stan"
where
-- We have to explicitly enable the plugin as it is disabled by default as
-- per request: https://github.com/haskell/haskell-language-server/issues/3916
--
enabledStanDescriptor recorder plId =
let stanPluginDescriptor = Stan.descriptor recorder plId
in stanPluginDescriptor
{ pluginConfigDescriptor = (pluginConfigDescriptor stanPluginDescriptor)
{ configInitialGenericConfig = (configInitialGenericConfig (pluginConfigDescriptor stanPluginDescriptor))
{ plcGlobalOn = True
}
}
}
runStanSession :: FilePath -> Session a -> IO a
runStanSession subdir =
failIfSessionTimeout . runSessionWithServer def stanPlugin (testDir </> subdir)