Skip to content

Commit d77f688

Browse files
committed
Make Tactics tests run with a full feature set
1 parent 2853549 commit d77f688

File tree

6 files changed

+56
-27
lines changed

6 files changed

+56
-27
lines changed

haskell-language-server.cabal

+1
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,7 @@ test-suite func-test
462462
Splice
463463
HaddockComments
464464
Ide.Plugin.Splice.Types
465+
Ide.Plugin.Tactic.FeatureSet
465466
Ide.Plugin.Tactic.TestTypes
466467
Ide.Plugin.Eval.Types
467468

plugins/hls-tactics-plugin/src/Ide/Plugin/Tactic/FeatureSet.hs

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ module Ide.Plugin.Tactic.FeatureSet
77
, FeatureSet
88
, hasFeature
99
, defaultFeatures
10+
, allFeatures
1011
, parseFeatureSet
1112
, prettyFeatureSet
1213
) where

plugins/hls-tactics-plugin/src/Ide/Plugin/Tactic/LanguageServer.hs

+6-6
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ module Ide.Plugin.Tactic.LanguageServer where
99
import Control.Arrow
1010
import Control.Monad
1111
import Control.Monad.Trans.Maybe
12+
import Data.Aeson (Value(Object), fromJSON)
13+
import Data.Aeson.Types (Result(Success, Error))
1214
import Data.Coerce
1315
import Data.Functor ((<&>))
1416
import Data.Generics.Aliases (mkQ)
@@ -30,24 +32,22 @@ import Development.IDE.Spans.LocalBindings (Bindings, getDefiningBindi
3032
import Development.Shake (RuleResult, Action)
3133
import Development.Shake.Classes
3234
import qualified FastString
35+
import Ide.Plugin.Config (PluginConfig(plcConfig))
36+
import qualified Ide.Plugin.Config as Plugin
3337
import Ide.Plugin.Tactic.Context
3438
import Ide.Plugin.Tactic.FeatureSet
3539
import Ide.Plugin.Tactic.GHC
3640
import Ide.Plugin.Tactic.Judgements
3741
import Ide.Plugin.Tactic.Range
38-
import Ide.Plugin.Tactic.TestTypes (TacticCommand)
42+
import Ide.Plugin.Tactic.TestTypes (cfg_feature_set, TacticCommand)
3943
import Ide.Plugin.Tactic.Types
4044
import Ide.PluginUtils (getPluginConfig)
45+
import Language.LSP.Server (MonadLsp)
4146
import Language.LSP.Types
4247
import OccName
4348
import Prelude hiding (span)
4449
import SrcLoc (containsSpan)
4550
import TcRnTypes (tcg_binds)
46-
import Ide.Plugin.Config (PluginConfig(plcConfig))
47-
import qualified Ide.Plugin.Config as Plugin
48-
import Data.Aeson (Value(Object), fromJSON)
49-
import Data.Aeson.Types (Result(Success, Error))
50-
import Language.LSP.Server (MonadLsp)
5151

5252

5353
tacticDesc :: T.Text -> T.Text

plugins/hls-tactics-plugin/src/Ide/Plugin/Tactic/TestTypes.hs

+23
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
module Ide.Plugin.Tactic.TestTypes where
44

55
import qualified Data.Text as T
6+
import Data.Aeson
7+
import Ide.Plugin.Tactic.FeatureSet
68

79
------------------------------------------------------------------------------
810
-- | The list of tactics exposed to the outside world. These are attached to
@@ -25,3 +27,24 @@ tacticTitle Destruct var = "Case split on " <> var
2527
tacticTitle Homomorphism var = "Homomorphic case split on " <> var
2628
tacticTitle DestructLambdaCase _ = "Lambda case split"
2729
tacticTitle HomomorphismLambdaCase _ = "Homomorphic lambda case split"
30+
31+
32+
------------------------------------------------------------------------------
33+
-- | Plugin configuration for tactics
34+
newtype Config = Config
35+
{ cfg_feature_set :: FeatureSet
36+
}
37+
38+
emptyConfig :: Config
39+
emptyConfig = Config defaultFeatures
40+
41+
instance ToJSON Config where
42+
toJSON (Config features) = object
43+
[ "features" .= prettyFeatureSet features
44+
]
45+
46+
instance FromJSON Config where
47+
parseJSON = withObject "Config" $ \obj -> do
48+
features <- parseFeatureSet <$> obj .: "features"
49+
pure $ Config features
50+

plugins/hls-tactics-plugin/src/Ide/Plugin/Tactic/Types.hs

-20
Original file line numberDiff line numberDiff line change
@@ -388,23 +388,3 @@ data AgdaMatch = AgdaMatch
388388
}
389389
deriving (Show)
390390

391-
392-
------------------------------------------------------------------------------
393-
-- | Plugin configuration for tactics
394-
newtype Config = Config
395-
{ cfg_feature_set :: FeatureSet
396-
}
397-
398-
emptyConfig :: Config
399-
emptyConfig = Config defaultFeatures
400-
401-
instance ToJSON Config where
402-
toJSON (Config features) = object
403-
[ "features" .= prettyFeatureSet features
404-
]
405-
406-
instance FromJSON Config where
407-
parseJSON = withObject "Config" $ \obj -> do
408-
features <- parseFeatureSet <$> obj .: "features"
409-
pure $ Config features
410-

test/functional/Tactic.hs

+25-1
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,16 @@ import Control.Lens hiding ((<.>))
1515
import Control.Monad (unless)
1616
import Control.Monad.IO.Class
1717
import Data.Aeson
18+
import Data.Default (Default(def))
1819
import Data.Either (isLeft)
1920
import Data.Foldable
21+
import qualified Data.Map as M
2022
import Data.Maybe
2123
import Data.Text (Text)
2224
import qualified Data.Text as T
2325
import qualified Data.Text.IO as T
26+
import qualified Ide.Plugin.Config as Plugin
27+
import Ide.Plugin.Tactic.FeatureSet (FeatureSet, allFeatures)
2428
import Ide.Plugin.Tactic.TestTypes
2529
import Language.LSP.Test
2630
import Language.LSP.Types
@@ -154,10 +158,30 @@ mkTest name fp line col ts =
154158
@? ("Expected a code action with title " <> T.unpack title)
155159

156160

161+
setFeatureSet :: FeatureSet -> Session ()
162+
setFeatureSet features = do
163+
let unObject (Object obj) = obj
164+
unObject _ = undefined
165+
def_config = def :: Plugin.Config
166+
config =
167+
def_config
168+
{ Plugin.plugins = M.fromList [("tactics",
169+
def { Plugin.plcConfig = unObject $ toJSON $
170+
emptyConfig { cfg_feature_set = features }}
171+
)] <> Plugin.plugins def_config }
172+
173+
sendNotification SWorkspaceDidChangeConfiguration $
174+
DidChangeConfigurationParams $
175+
toJSON config
176+
157177
goldenTest :: FilePath -> Int -> Int -> TacticCommand -> Text -> TestTree
158-
goldenTest input line col tc occ =
178+
goldenTest = goldenTest' allFeatures
179+
180+
goldenTest' :: FeatureSet -> FilePath -> Int -> Int -> TacticCommand -> Text -> TestTree
181+
goldenTest' features input line col tc occ =
159182
testCase (input <> " (golden)") $ do
160183
runSession hlsCommand fullCaps tacticPath $ do
184+
setFeatureSet features
161185
doc <- openDoc input "haskell"
162186
_ <- waitForDiagnostics
163187
actions <- getCodeActions doc $ pointRange line col

0 commit comments

Comments
 (0)