@@ -17,124 +17,122 @@ module Main (main) where
17
17
18
18
import Control.Applicative.Combinators
19
19
import Control.Concurrent
20
- import Control.Exception (bracket_ , catch ,
21
- finally )
22
- import qualified Control.Lens as Lens
20
+ import Control.Exception (bracket_ , catch , finally )
21
+ import qualified Control.Lens as Lens
23
22
import Control.Monad
24
- import Control.Monad.IO.Class (MonadIO , liftIO )
25
- import Data.Aeson (toJSON )
26
- import qualified Data.Aeson as A
23
+ import Control.Monad.IO.Class (MonadIO , liftIO )
24
+ import Data.Aeson (toJSON )
25
+ import qualified Data.Aeson as A
27
26
import Data.Default
28
27
import Data.Foldable
29
28
import Data.List.Extra
30
29
import Data.Maybe
31
- import qualified Data.Set as Set
32
- import qualified Data.Text as T
33
- import Data.Text.Utf16.Rope (Rope )
34
- import qualified Data.Text.Utf16.Rope as Rope
35
- import Development.IDE.Core.PositionMapping (PositionResult (.. ),
36
- fromCurrent ,
37
- positionResultToMaybe ,
38
- toCurrent )
39
- import Development.IDE.GHC.Compat (GhcVersion (.. ),
40
- ghcVersion )
30
+ import qualified Data.Set as Set
31
+ import qualified Data.Text as T
32
+ import Data.Text.Utf16.Rope (Rope )
33
+ import qualified Data.Text.Utf16.Rope as Rope
34
+ import Development.IDE.Core.PositionMapping (PositionResult (.. ),
35
+ fromCurrent ,
36
+ positionResultToMaybe ,
37
+ toCurrent )
38
+ import Development.IDE.GHC.Compat (GhcVersion (.. ),
39
+ ghcVersion )
41
40
import Development.IDE.GHC.Util
42
- import qualified Development.IDE.Main as IDE
43
- import Development.IDE.Plugin.TypeLenses (typeLensCommandId )
41
+ import qualified Development.IDE.Main as IDE
42
+ import Development.IDE.Plugin.TypeLenses (typeLensCommandId )
44
43
import Development.IDE.Spans.Common
45
- import Development.IDE.Test (Cursor ,
46
- canonicalizeUri ,
47
- configureCheckProject ,
48
- diagnostic ,
49
- expectCurrentDiagnostics ,
50
- expectDiagnostics ,
51
- expectDiagnosticsWithTags ,
52
- expectNoMoreDiagnostics ,
53
- flushMessages ,
54
- getInterfaceFilesDir ,
55
- getStoredKeys ,
56
- isReferenceReady ,
57
- referenceReady ,
58
- standardizeQuotes ,
59
- waitForAction ,
60
- waitForGC ,
61
- waitForTypecheck )
44
+ import Development.IDE.Test (Cursor , canonicalizeUri ,
45
+ configureCheckProject ,
46
+ diagnostic ,
47
+ expectCurrentDiagnostics ,
48
+ expectDiagnostics ,
49
+ expectDiagnosticsWithTags ,
50
+ expectNoMoreDiagnostics ,
51
+ flushMessages ,
52
+ getInterfaceFilesDir ,
53
+ getStoredKeys ,
54
+ isReferenceReady ,
55
+ referenceReady ,
56
+ standardizeQuotes ,
57
+ waitForAction , waitForGC ,
58
+ waitForTypecheck )
62
59
import Development.IDE.Test.Runfiles
63
- import qualified Development.IDE.Types.Diagnostics as Diagnostics
60
+ import qualified Development.IDE.Types.Diagnostics as Diagnostics
64
61
import Development.IDE.Types.Location
65
- import Development.Shake (getDirectoryFilesIO )
62
+ import Development.Shake (getDirectoryFilesIO )
66
63
import Ide.Plugin.Config
67
64
import Language.LSP.Test
68
- import Language.LSP.Types hiding
69
- (SemanticTokenAbsolute (length , line ),
70
- SemanticTokenRelative (length ),
71
- SemanticTokensEdit (_start ),
72
- mkRange )
65
+ import Language.LSP.Types hiding
66
+ (SemanticTokenAbsolute (length , line ),
67
+ SemanticTokenRelative (length ),
68
+ SemanticTokensEdit (_start ),
69
+ mkRange )
73
70
import Language.LSP.Types.Capabilities
74
- import qualified Language.LSP.Types.Lens as Lens (label )
75
- import qualified Language.LSP.Types.Lens as Lsp (diagnostics ,
76
- message ,
77
- params )
78
- import Language.LSP.VFS (VfsLog , applyChange )
71
+ import qualified Language.LSP.Types.Lens as Lens (label )
72
+ import qualified Language.LSP.Types.Lens as Lsp (diagnostics ,
73
+ message , params )
74
+ import Language.LSP.VFS (VfsLog , applyChange )
79
75
import Network.URI
80
76
import System.Directory
81
- import System.Environment.Blank (getEnv , setEnv ,
82
- unsetEnv )
83
- import System.Exit (ExitCode (ExitSuccess ))
77
+ import System.Environment.Blank (getEnv , setEnv , unsetEnv )
78
+ import System.Exit (ExitCode (ExitSuccess ))
84
79
import System.FilePath
85
- import System.Info.Extra (isMac , isWindows )
80
+ import System.Info.Extra (isMac , isWindows )
86
81
import qualified System.IO.Extra
87
- import System.IO.Extra hiding (withTempDir )
88
- import System.Mem (performGC )
89
- import System.Process.Extra (CreateProcess (cwd ),
90
- createPipe , proc ,
91
- readCreateProcessWithExitCode )
82
+ import System.IO.Extra hiding (withTempDir )
83
+ import System.Mem (performGC )
84
+ import System.Process.Extra (CreateProcess (cwd ),
85
+ createPipe , proc ,
86
+ readCreateProcessWithExitCode )
92
87
import Test.QuickCheck
93
88
-- import Test.QuickCheck.Instances ()
94
89
import Control.Concurrent.Async
95
- import Control.Lens (to , (.~) , (^.) )
96
- import Control.Monad.Extra (whenJust )
97
- import Data.Function ((&) )
98
- import Data.Functor.Identity (runIdentity )
90
+ import Control.Lens (to , (.~) , (^.) )
91
+ import Control.Monad.Extra (whenJust )
92
+ import Data.Function ((&) )
93
+ import Data.Functor.Identity (runIdentity )
99
94
import Data.IORef
100
- import Data.IORef.Extra (atomicModifyIORef_ )
101
- import Data.String (IsString (fromString ))
95
+ import Data.IORef.Extra (atomicModifyIORef_ )
96
+ import Data.String (IsString (fromString ))
102
97
import Data.Tuple.Extra
103
- import Development.IDE.Core.FileStore (getModTime )
104
- import qualified Development.IDE.Plugin.HLS.GhcIde as Ghcide
105
- import Development.IDE.Plugin.Test (TestRequest (BlockSeconds ),
106
- WaitForIdeRuleResult (.. ),
107
- blockCommandId )
108
- import Development.IDE.Types.Logger (Logger (Logger ),
109
- LoggingColumn (DataColumn , PriorityColumn ),
110
- Pretty (pretty ),
111
- Priority (Debug ),
112
- Recorder (Recorder , logger_ ),
113
- WithPriority (WithPriority , priority ),
114
- cfilter ,
115
- cmapWithPrio ,
116
- makeDefaultStderrRecorder ,
117
- toCologActionWithPrio )
98
+ import Development.IDE.Core.FileStore (getModTime )
99
+ import qualified Development.IDE.Plugin.HLS.GhcIde as Ghcide
100
+ import Development.IDE.Plugin.Test (TestRequest (BlockSeconds ),
101
+ WaitForIdeRuleResult (.. ),
102
+ blockCommandId )
103
+ import Development.IDE.Types.Logger (Logger (Logger ),
104
+ LoggingColumn (DataColumn , PriorityColumn ),
105
+ Pretty (pretty ),
106
+ Priority (Debug ),
107
+ Recorder (Recorder , logger_ ),
108
+ WithPriority (WithPriority , priority ),
109
+ cfilter , cmapWithPrio ,
110
+ makeDefaultStderrRecorder ,
111
+ toCologActionWithPrio )
118
112
import qualified FuzzySearch
119
- import GHC.Stack (emptyCallStack )
113
+ import GHC.Stack (emptyCallStack )
120
114
import qualified HieDbRetry
121
- import Ide.PluginUtils (pluginDescToIdePlugins )
115
+ import Ide.PluginUtils (pluginDescToIdePlugins )
122
116
import Ide.Types
123
- import qualified Language.LSP.Types as LSP
124
- import Language.LSP.Types.Lens (didChangeWatchedFiles ,
125
- workspace )
126
- import qualified Language.LSP.Types.Lens as L
117
+ import qualified Language.LSP.Types as LSP
118
+ import Language.LSP.Types.Lens (didChangeWatchedFiles ,
119
+ workspace )
120
+ import qualified Language.LSP.Types.Lens as L
127
121
import qualified Progress
128
122
import System.Time.Extra
129
- import qualified Test.QuickCheck.Monadic as MonadicQuickCheck
130
- import Test.QuickCheck.Monadic (forAllM , monadicIO )
123
+ import qualified Test.Hls.Util as Util
124
+ import Test.Hls.Util (EnvSpec (.. ),
125
+ IssueSolution (.. ),
126
+ OS (.. ))
127
+ import qualified Test.QuickCheck.Monadic as MonadicQuickCheck
128
+ import Test.QuickCheck.Monadic (forAllM , monadicIO )
131
129
import Test.Tasty
132
130
import Test.Tasty.ExpectedFailure
133
131
import Test.Tasty.HUnit
134
132
import Test.Tasty.Ingredients.Rerun
135
133
import Test.Tasty.QuickCheck
136
- import Text.Printf (printf )
137
- import Text.Regex.TDFA ((=~) )
134
+ import Text.Printf (printf )
135
+ import Text.Regex.TDFA ((=~) )
138
136
139
137
data Log
140
138
= LogGhcIde Ghcide. Log
@@ -2001,10 +1999,10 @@ completionDocTests =
2001
1999
test doc (Position 1 7 ) " id" (Just $ T. length expected) [expected]
2002
2000
]
2003
2001
where
2004
- brokenForGhc9 = knownBrokenFor (BrokenForGHC [GHC90 , GHC92 , GHC94 ]) " Completion doc doesn't support ghc9"
2005
- brokenForWinGhc9 = knownBrokenFor (BrokenSpecific Windows [GHC90 , GHC92 ]) " Extern doc doesn't support Windows for ghc9.2"
2002
+ brokenForGhc9 = knownBrokenFor (Util. forGhcVersions [GHC90 , GHC92 , GHC94 ]) " Completion doc doesn't support ghc9"
2003
+ brokenForWinGhc9 = knownBrokenFor (Util. brokenSpecific Windows [GHC90 , GHC92 ]) " Extern doc doesn't support Windows for ghc9.2"
2006
2004
-- https://gitlab.haskell.org/ghc/ghc/-/issues/20903
2007
- brokenForMacGhc9 = knownBrokenFor (BrokenSpecific MacOS [GHC90 , GHC92 , GHC94 ]) " Extern doc doesn't support MacOS for ghc9"
2005
+ brokenForMacGhc9 = knownBrokenFor (Util. brokenSpecific MacOS [GHC90 , GHC92 , GHC94 ]) " Extern doc doesn't support MacOS for ghc9"
2008
2006
test doc pos label mn expected = do
2009
2007
_ <- waitForDiagnostics
2010
2008
compls <- getCompletions doc pos
@@ -2271,58 +2269,25 @@ xfail :: TestTree -> String -> TestTree
2271
2269
xfail = flip expectFailBecause
2272
2270
2273
2271
ignoreInWindowsBecause :: String -> TestTree -> TestTree
2274
- ignoreInWindowsBecause = ignoreFor ( BrokenForOS Windows )
2272
+ ignoreInWindowsBecause = ignoreFor [ HostOS Windows ]
2275
2273
2276
2274
ignoreInWindowsForGHC810 :: TestTree -> TestTree
2277
2275
ignoreInWindowsForGHC810 =
2278
- ignoreFor ( BrokenSpecific Windows [ GHC810 ]) " tests are unreliable in windows for ghc 8.10"
2276
+ ignoreFor [ Specific Windows GHC810 ] " tests are unreliable in windows for ghc 8.10"
2279
2277
2280
2278
ignoreForGHC92Plus :: String -> TestTree -> TestTree
2281
- ignoreForGHC92Plus = ignoreFor (BrokenForGHC [GHC92 , GHC94 ])
2279
+ ignoreForGHC92Plus = ignoreFor (Util. forGhcVersions [GHC92 , GHC94 ])
2282
2280
2283
2281
knownBrokenForGhcVersions :: [GhcVersion ] -> String -> TestTree -> TestTree
2284
- knownBrokenForGhcVersions ghcVers = knownBrokenFor (BrokenForGHC ghcVers)
2285
-
2286
- data BrokenOS = Linux | MacOS | Windows deriving (Show )
2287
-
2288
- data IssueSolution = Broken | Ignore deriving (Show )
2289
-
2290
- data BrokenTarget =
2291
- BrokenSpecific BrokenOS [GhcVersion ]
2292
- -- ^ Broken for `BrokenOS` with `GhcVersion`
2293
- | BrokenForOS BrokenOS
2294
- -- ^ Broken for `BrokenOS`
2295
- | BrokenForGHC [GhcVersion ]
2296
- -- ^ Broken for `GhcVersion`
2297
- deriving (Show )
2282
+ knownBrokenForGhcVersions ghcVers = knownBrokenFor (Util. forGhcVersions ghcVers)
2298
2283
2299
2284
-- | Ignore test for specific os and ghc with reason.
2300
- ignoreFor :: BrokenTarget -> String -> TestTree -> TestTree
2301
- ignoreFor = knownIssueFor Ignore
2285
+ ignoreFor :: [ EnvSpec ] -> String -> TestTree -> TestTree
2286
+ ignoreFor = Util. knownIssueInEnv Ignore
2302
2287
2303
2288
-- | Known broken for specific os and ghc with reason.
2304
- knownBrokenFor :: BrokenTarget -> String -> TestTree -> TestTree
2305
- knownBrokenFor = knownIssueFor Broken
2306
-
2307
- -- | Deal with `IssueSolution` for specific OS and GHC.
2308
- knownIssueFor :: IssueSolution -> BrokenTarget -> String -> TestTree -> TestTree
2309
- knownIssueFor solution = go . \ case
2310
- BrokenSpecific bos vers -> isTargetOS bos && isTargetGhc vers
2311
- BrokenForOS bos -> isTargetOS bos
2312
- BrokenForGHC vers -> isTargetGhc vers
2313
- where
2314
- isTargetOS = \ case
2315
- Windows -> isWindows
2316
- MacOS -> isMac
2317
- Linux -> not isWindows && not isMac
2318
-
2319
- isTargetGhc = elem ghcVersion
2320
-
2321
- go True = case solution of
2322
- Broken -> expectFailBecause
2323
- Ignore -> ignoreTestBecause
2324
- go False = \ _ -> id
2325
-
2289
+ knownBrokenFor :: [EnvSpec ] -> String -> TestTree -> TestTree
2290
+ knownBrokenFor = Util. knownIssueInEnv Broken
2326
2291
data Expect
2327
2292
= ExpectRange Range -- Both gotoDef and hover should report this range
2328
2293
| ExpectLocation Location
@@ -3107,10 +3072,10 @@ runWithExtraFiles prefix s = withTempDir $ \dir -> do
3107
3072
copyTestDataFiles :: FilePath -> FilePath -> IO ()
3108
3073
copyTestDataFiles dir prefix = do
3109
3074
-- Copy all the test data files to the temporary workspace
3110
- testDataFiles <- getDirectoryFilesIO (" test/ data" </> prefix) [" //*" ]
3075
+ testDataFiles <- getDirectoryFilesIO (" data" </> prefix) [" //*" ]
3111
3076
for_ testDataFiles $ \ f -> do
3112
3077
createDirectoryIfMissing True $ dir </> takeDirectory f
3113
- copyFile (" test/ data" </> prefix </> f) (dir </> f)
3078
+ copyFile (" data" </> prefix </> f) (dir </> f)
3114
3079
3115
3080
run' :: (FilePath -> Session a ) -> IO a
3116
3081
run' s = withTempDir $ \ dir -> runInDir dir (s dir)
@@ -3181,7 +3146,7 @@ lspTestCapsNoFileWatches = lspTestCaps & workspace . Lens._Just . didChangeWatch
3181
3146
3182
3147
openTestDataDoc :: FilePath -> Session TextDocumentIdentifier
3183
3148
openTestDataDoc path = do
3184
- source <- liftIO $ readFileUtf8 $ " test/ data" </> path
3149
+ source <- liftIO $ readFileUtf8 $ " data" </> path
3185
3150
createDoc path " haskell" source
3186
3151
3187
3152
unitTests :: Recorder (WithPriority Log ) -> Logger -> TestTree
0 commit comments