44
55module Main (main ) where
66
7- import Control.Lens ((^.) )
8- import Data.Aeson
9- import Data.Functor (void )
10- import qualified Data.Map as M
11- import Data.Text (Text , isInfixOf , pack , unpack )
7+ import Control.Lens ((^.) )
8+ import Data.Aeson ( KeyValue ( (.=) ))
9+ import Data.Functor (void )
10+ import qualified Data.Map as M
11+ import Data.Text (Text , isInfixOf , pack , unpack )
1212import Ide.Plugin.Config
13- import qualified Ide.Plugin.Rename as Rename
14- import qualified Language.LSP.Protocol.Lens as L
13+ import qualified Ide.Plugin.Rename as Rename
14+ import qualified Language.LSP.Protocol.Lens as L
15+ import Language.LSP.Protocol.Types (Null (Null ))
1516import System.FilePath
1617import Test.Hls
1718
@@ -23,10 +24,54 @@ renamePlugin = mkPluginTestDescriptor Rename.descriptor "rename"
2324
2425tests :: TestTree
2526tests = testGroup " Rename"
26- [ renameTests
27+ [ prepareRenameTests
28+ , renameTests
2729 , moduleNameTests
2830 ]
2931
32+ prepareRenameTests :: TestTree
33+ prepareRenameTests = testGroup " PrepareRename"
34+ [ testCase " Module name (not yet renameable)" $ runRenameSession " " $ do
35+ doc <- openDoc " PrepareRename.hs" " haskell"
36+ void waitForBuildQueue
37+ result <- prepareRename doc (Position 0 9 )
38+ liftIO $ result @?= InR Null
39+
40+ , testCase " Function name" $ runRenameSession " " $ do
41+ doc <- openDoc " PrepareRename.hs" " haskell"
42+ void waitForBuildQueue
43+ result <- prepareRename doc (Position 8 1 )
44+ liftIO $ result @?=
45+ InL (PrepareRenameResult (InL (Range (Position 8 0 ) (Position 8 3 ))))
46+
47+ , testCase " Imported function name" $ runRenameSession " " $ do
48+ doc <- openDoc " PrepareRename.hs" " haskell"
49+ void waitForBuildQueue
50+ result <- prepareRename doc (Position 10 16 )
51+ liftIO $ result @?=
52+ InL (PrepareRenameResult (InL (Range (Position 10 14 ) (Position 10 19 ))))
53+
54+ , testCase " Non-renameable position" $ runRenameSession " " $ do
55+ doc <- openDoc " PrepareRename.hs" " haskell"
56+ void waitForBuildQueue
57+ result <- prepareRename doc (Position 6 23 )
58+ liftIO $ result @?= InR Null
59+
60+ , testCase " Operator" $ runRenameSession " " $ do
61+ doc <- openDoc " PrepareRename.hs" " haskell"
62+ void waitForBuildQueue
63+ result <- prepareRename doc (Position 10 7 )
64+ liftIO $ result @?=
65+ InL (PrepareRenameResult (InL (Range (Position 10 6 ) (Position 10 9 ))))
66+
67+ , testCase " Built-in operator" $ runRenameSession " " $ do
68+ doc <- openDoc " PrepareRename.hs" " haskell"
69+ void waitForBuildQueue
70+ result <- prepareRename doc (Position 13 7 )
71+ liftIO $ result @?=
72+ InL (PrepareRenameResult (InL (Range (Position 13 7 ) (Position 13 8 ))))
73+ ]
74+
3075renameTests :: TestTree
3176renameTests = testGroup " Identifier"
3277 [ goldenWithRename " Data constructor" " DataConstructor" $ \ doc ->
@@ -195,6 +240,16 @@ goldenWithRename title path act =
195240 goldenWithHaskellDoc (def { plugins = M. fromList [(" rename" , def { plcConfig = " crossModule" .= True })] })
196241 renamePlugin title testDataDir path " expected" " hs" act
197242
243+ -- NOTE: This should eventually be moved upstream to lsp-test (see
244+ -- https://github.com/haskell/lsp/issues/636).
245+ prepareRename :: TextDocumentIdentifier -> Position -> Session (PrepareRenameResult |? Null )
246+ prepareRename doc pos = do
247+ let params = PrepareRenameParams doc pos Nothing
248+ rsp <- request SMethod_TextDocumentPrepareRename params
249+ case rsp ^. L. result of
250+ Left rspError -> liftIO $ assertFailure $ " prepareRename failed: " <> show rspError
251+ Right rspResult -> pure rspResult
252+
198253renameExpectError :: TResponseError Method_TextDocumentRename -> TextDocumentIdentifier -> Position -> Text -> Session ()
199254renameExpectError expectedError doc pos newName = do
200255 let params = RenameParams Nothing doc pos newName
0 commit comments