{-# LANGUAGE DuplicateRecordFields #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TypeOperators #-} module Main ( main ) where import Data.Either (rights) import qualified Data.Text as T import qualified Ide.Plugin.ExplicitFields as ExplicitFields import System.FilePath ((<.>), ()) import Test.Hls main :: IO () main = defaultTestRunner test plugin :: PluginTestDescriptor ExplicitFields.Log plugin = mkPluginTestDescriptor ExplicitFields.descriptor "explicit-fields" test :: TestTree test = testGroup "explicit-fields" [ mkTest "WildcardOnly" "WildcardOnly" 12 10 12 20 , mkTest "Unused" "Unused" 12 10 12 20 , mkTest "Unused2" "Unused2" 12 10 12 20 , mkTest "WithPun" "WithPun" 13 10 13 25 , mkTest "WithExplicitBind" "WithExplicitBind" 12 10 12 32 , mkTest "Mixed" "Mixed" 14 10 14 37 , mkTest "Construction" "Construction" 16 5 16 15 , mkTestNoAction "ExplicitBinds" "ExplicitBinds" 11 10 11 52 , mkTestNoAction "Puns" "Puns" 12 10 12 31 , mkTestNoAction "Infix" "Infix" 11 11 11 31 , mkTestNoAction "Prefix" "Prefix" 10 11 10 28 ] mkTestNoAction :: TestName -> FilePath -> UInt -> UInt -> UInt -> UInt -> TestTree mkTestNoAction title fp x1 y1 x2 y2 = testCase title $ runSessionWithServer plugin (testDataDir "noop") $ do doc <- openDoc (fp <.> "hs") "haskell" actions <- getExplicitFieldsActions doc x1 y1 x2 y2 liftIO $ actions @?= [] mkTest :: TestName -> FilePath -> UInt -> UInt -> UInt -> UInt -> TestTree mkTest title fp x1 y1 x2 y2 = goldenWithHaskellDoc plugin title testDataDir fp "expected" "hs" $ \doc -> do (act:_) <- getExplicitFieldsActions doc x1 y1 x2 y2 executeCodeAction act getExplicitFieldsActions :: TextDocumentIdentifier -> UInt -> UInt -> UInt -> UInt -> Session [CodeAction] getExplicitFieldsActions doc x1 y1 x2 y2 = findExplicitFieldsAction <$> getCodeActions doc range where range = Range (Position x1 y1) (Position x2 y2) findExplicitFieldsAction :: [a |? CodeAction] -> [CodeAction] findExplicitFieldsAction = filter isExplicitFieldsCodeAction . rights . map toEither isExplicitFieldsCodeAction :: CodeAction -> Bool isExplicitFieldsCodeAction CodeAction {_title} = "Expand record wildcard" `T.isPrefixOf` _title testDataDir :: FilePath testDataDir = "test" "testdata"