forked from haskell/haskell-language-server
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathAddArgument.hs
77 lines (69 loc) · 3.13 KB
/
AddArgument.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PolyKinds #-}
module Test.AddArgument (tests) where
import Data.List.Extra
import qualified Data.Text as T
import Development.IDE.Types.Location
import Language.LSP.Protocol.Types hiding
(SemanticTokenAbsolute (length, line),
SemanticTokenRelative (length),
SemanticTokensEdit (_start),
mkRange)
import Language.LSP.Test
import Test.Tasty
import Test.Tasty.HUnit
import Test.Hls
import qualified Test.Hls.FileSystem as FS
import qualified Development.IDE.Plugin.CodeAction as Refactor
import System.FilePath ((<.>))
tests :: TestTree
tests =
testGroup
"add argument"
#if !MIN_VERSION_ghc(9,2,1)
[]
#else
[ mkGoldenAddArgTest' "Hole" (r 0 0 0 50) "_new_def",
mkGoldenAddArgTest "NoTypeSuggestion" (r 0 0 0 50),
mkGoldenAddArgTest "MultipleDeclAlts" (r 0 0 0 50),
mkGoldenAddArgTest "AddArgWithSig" (r 1 0 1 50),
mkGoldenAddArgTest "AddArgWithSigAndDocs" (r 8 0 8 50),
mkGoldenAddArgTest "AddArgFromLet" (r 2 0 2 50),
mkGoldenAddArgTest "AddArgFromWhere" (r 3 0 3 50),
mkGoldenAddArgTest "AddArgFromWhereComments" (r 3 0 3 50),
mkGoldenAddArgTest "AddArgWithTypeSynSig" (r 2 0 2 50),
mkGoldenAddArgTest "AddArgWithTypeSynSigContravariant" (r 2 0 2 50),
mkGoldenAddArgTest "AddArgWithLambda" (r 1 0 1 50),
mkGoldenAddArgTest "MultiSigFirst" (r 2 0 2 50),
mkGoldenAddArgTest "MultiSigLast" (r 2 0 2 50),
mkGoldenAddArgTest "MultiSigMiddle" (r 2 0 2 50)
]
where
r x y x' y' = Range (Position x y) (Position x' y')
mkGoldenAddArgTest :: FilePath -> Range -> TestTree
mkGoldenAddArgTest testFileName range = mkGoldenAddArgTest' testFileName range "new_def"
-- Make a golden test for the add argument action. Given varName is the name of the variable not yet defined.
mkGoldenAddArgTest' :: FilePath -> Range -> T.Text -> TestTree
mkGoldenAddArgTest' testFileName range varName = do
let action docB = do
_ <- waitForDiagnostics
InR action@CodeAction {_title = actionTitle} : _ <-
filter (\(InR CodeAction {_title = x}) -> "Add" `isPrefixOf` T.unpack x)
<$> getCodeActions docB range
liftIO $ actionTitle @?= ("Add argument ‘" <> varName <> "’ to function")
executeCodeAction action
goldenWithHaskellDocInTmpDir
def
(mkPluginTestDescriptor Refactor.bindingsPluginDescriptor "ghcide-code-actions-bindings")
(testFileName <> " (golden)")
(FS.mkVirtualFileTree "test/data/golden/add-arg" (FS.directProject $ testFileName <.> "hs"))
testFileName
"expected"
"hs"
action
#endif