5
5
6
6
module Main ( main ) where
7
7
8
+ import Control.Lens (_Just , set , (^.) )
8
9
import Data.Either (rights )
10
+ import Data.Functor (void )
9
11
import qualified Data.Text as T
12
+ import qualified Data.Text.Lazy as TL
13
+ import qualified Data.Text.Lazy.Encoding as TL
14
+ import Development.IDE.Types.Logger (Doc , Logger (Logger ),
15
+ Pretty (pretty ),
16
+ Priority (Debug ),
17
+ Recorder (Recorder , logger_ ),
18
+ WithPriority (WithPriority , priority ),
19
+ cfilter , cmapWithPrio ,
20
+ makeDefaultStderrRecorder )
10
21
import qualified Ide.Plugin.OverloadedRecordDot as OverloadedRecordDot
11
- import System.FilePath ((</>) )
22
+ import Language.LSP.Protocol.Lens as L
23
+ import System.FilePath ((<.>) , (</>) )
12
24
import Test.Hls
13
25
14
-
15
26
main :: IO ()
16
- main = defaultTestRunner test
27
+ main =
28
+ defaultTestRunner test
17
29
18
30
plugin :: PluginTestDescriptor OverloadedRecordDot. Log
19
31
plugin = mkPluginTestDescriptor OverloadedRecordDot. descriptor " overloaded-record-dot"
20
32
21
33
test :: TestTree
22
- test = testGroup " overloaded-record-dot"
23
- [ mkTest " Simple" " Simple" " name" 10 7 10 15 ,
34
+ test = testGroup " overloaded-record-dot" $
35
+ [testGroup " without resolve " [ mkTest " Simple" " Simple" " name" 10 7 10 15 ,
24
36
mkTest " NoPragmaNeeded" " NoPragmaNeeded" " name" 11 7 11 15 ,
25
37
mkTest " NestedParens" " NestedParens" " name" 15 7 15 24 ,
26
38
mkTest " NestedDot" " NestedDot" " name" 17 7 17 22 ,
27
39
mkTest " NestedDollar" " NestedDollar" " name" 15 7 15 24 ,
28
40
mkTest " MultilineCase" " MultilineCase" " name" 10 7 12 15 ,
29
41
mkTest " Multiline" " Multiline" " name" 10 7 11 15 ,
30
42
mkTest " MultilineExpanded" " MultilineExpanded" " owner" 28 8 28 19
31
- ]
43
+ ],
44
+ testGroup " with Resolve" [ mkResolveTest " Simple" " Simple" " name" 10 7 10 15 ,
45
+ mkResolveTest " NoPragmaNeeded" " NoPragmaNeeded" " name" 11 7 11 15 ,
46
+ mkResolveTest " NestedParens" " NestedParens" " name" 15 7 15 24 ,
47
+ mkResolveTest " NestedDot" " NestedDot" " name" 17 7 17 22 ,
48
+ mkResolveTest " NestedDollar" " NestedDollar" " name" 15 7 15 24 ,
49
+ mkResolveTest " MultilineCase" " MultilineCase" " name" 10 7 12 15 ,
50
+ mkResolveTest " Multiline" " Multiline" " name" 10 7 11 15 ,
51
+ mkResolveTest " MultilineExpanded" " MultilineExpanded" " owner" 28 8 28 19
52
+ ]]
32
53
33
54
mkTest :: TestName -> FilePath -> T. Text -> UInt -> UInt -> UInt -> UInt -> TestTree
34
55
mkTest title fp selectorName x1 y1 x2 y2 =
35
- goldenWithHaskellDoc plugin title testDataDir fp " expected" " hs" $ \ doc -> do
56
+ goldenWithHaskellAndCaps noResolveCaps plugin title testDataDir fp " expected" " hs" $ \ doc -> do
36
57
(act: _) <- getExplicitFieldsActions doc selectorName x1 y1 x2 y2
37
58
executeCodeAction act
59
+ where noResolveCaps = set (L. textDocument . _Just . L. codeAction . _Just . L. dataSupport . _Just) False fullCaps
60
+
61
+ mkResolveTest :: TestName -> FilePath -> T. Text -> UInt -> UInt -> UInt -> UInt -> TestTree
62
+ mkResolveTest title fp selectorName x1 y1 x2 y2 =
63
+ goldenWithHaskellDoc plugin title testDataDir fp " expected" " hs" $ \ doc -> do
64
+ ((Right act): _) <- getAndResolveExplicitFieldsActions doc selectorName x1 y1 x2 y2
65
+ executeCodeAction act
38
66
39
67
getExplicitFieldsActions
40
68
:: TextDocumentIdentifier
@@ -46,6 +74,19 @@ getExplicitFieldsActions doc selectorName x1 y1 x2 y2 =
46
74
where
47
75
range = Range (Position x1 y1) (Position x2 y2)
48
76
77
+ getAndResolveExplicitFieldsActions
78
+ :: TextDocumentIdentifier
79
+ -> T. Text
80
+ -> UInt -> UInt -> UInt -> UInt
81
+ -> Session [Either ResponseError CodeAction ]
82
+ getAndResolveExplicitFieldsActions doc selectorName x1 y1 x2 y2 = do
83
+ actions <- findExplicitFieldsAction selectorName <$> getCodeActions doc range
84
+ rsp <- mapM (request SMethod_CodeActionResolve ) actions
85
+ pure $ (^. L. result) <$> rsp
86
+
87
+ where
88
+ range = Range (Position x1 y1) (Position x2 y2)
89
+
49
90
findExplicitFieldsAction :: T. Text -> [a |? CodeAction ] -> [CodeAction ]
50
91
findExplicitFieldsAction selectorName = filter (isExplicitFieldsCodeAction selectorName) . rights . map toEither
51
92
@@ -55,3 +96,24 @@ isExplicitFieldsCodeAction selectorName CodeAction {_title} =
55
96
56
97
testDataDir :: FilePath
57
98
testDataDir = " test" </> " testdata"
99
+
100
+ goldenWithHaskellAndCaps
101
+ :: Pretty b
102
+ => ClientCapabilities
103
+ -> PluginTestDescriptor b
104
+ -> TestName
105
+ -> FilePath
106
+ -> FilePath
107
+ -> FilePath
108
+ -> FilePath
109
+ -> (TextDocumentIdentifier -> Session () )
110
+ -> TestTree
111
+ goldenWithHaskellAndCaps clientCaps plugin title testDataDir path desc ext act =
112
+ goldenGitDiff title (testDataDir </> path <.> desc <.> ext)
113
+ $ runSessionWithServerAndCaps plugin clientCaps testDataDir
114
+ $ TL. encodeUtf8 . TL. fromStrict
115
+ <$> do
116
+ doc <- openDoc (path <.> ext) " haskell"
117
+ void waitForBuildQueue
118
+ act doc
119
+ documentContents doc
0 commit comments